From c2a7afc5ba8b078533ef6075f96129be18c7d4b0 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 1 Feb 2025 00:54:04 -0800 Subject: [PATCH 001/171] [Test] Add eslint rule enforcing proper `await` usage in tests --- eslint.config.js | 18 ++++++++++++++++++ src/test/evolution.test.ts | 12 ++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 1cea5563a78..b4cd536917c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,6 +5,7 @@ import importX from 'eslint-plugin-import-x'; export default [ { + name: "eslint-config", files: ["src/**/*.{ts,tsx,js,jsx}"], ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], languageOptions: { @@ -48,5 +49,22 @@ export default [ "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines "@typescript-eslint/consistent-type-imports": "error", // Enforces type-only imports wherever possible } + }, + { + name: "eslint-tests", + files: ["src/test/**.test.ts"], + languageOptions: { + parser: parser, + parserOptions: { + "project": ["./tsconfig.json"] + } + }, + plugins: { + "@typescript-eslint": tseslint + }, + rules: { + "@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/ + "@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/ + } } ] diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 10748899d59..29412e9e425 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -40,10 +40,10 @@ describe("Evolution", () => { eevee.abilityIndex = 2; trapinch.abilityIndex = 2; - eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); + await eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); expect(eevee.abilityIndex).toBe(2); - trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); + await trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); expect(trapinch.abilityIndex).toBe(1); }); @@ -55,10 +55,10 @@ describe("Evolution", () => { bulbasaur.abilityIndex = 0; charmander.abilityIndex = 1; - bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); + await bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); expect(bulbasaur.abilityIndex).toBe(0); - charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); + await charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); expect(charmander.abilityIndex).toBe(1); }); @@ -68,7 +68,7 @@ describe("Evolution", () => { const squirtle = game.scene.getPlayerPokemon()!; squirtle.abilityIndex = 5; - squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); + await squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); expect(squirtle.abilityIndex).toBe(0); }); @@ -80,7 +80,7 @@ describe("Evolution", () => { nincada.metBiome = -1; nincada.gender = 1; - nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); + await nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); const ninjask = game.scene.getPlayerParty()[0]; const shedinja = game.scene.getPlayerParty()[1]; expect(ninjask.abilityIndex).toBe(2); From 7d6036df98b16e690c78a19dc39e798922dba31b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 1 Feb 2025 01:29:25 -0800 Subject: [PATCH 002/171] Fix files glob --- eslint.config.js | 2 +- src/test/abilities/shield_dust.test.ts | 6 +-- src/test/abilities/unseen_fist.test.ts | 8 ++-- src/test/data/status_effect.test.ts | 4 +- src/test/items/light_ball.test.ts | 14 +++---- src/test/items/metal_powder.test.ts | 10 ++--- src/test/items/quick_powder.test.ts | 26 ++++++------- src/test/items/thick_club.test.ts | 38 +++++++++---------- src/test/moves/dragon_rage.test.ts | 6 +-- src/test/moves/fissure.test.ts | 6 +-- src/test/moves/toxic_spikes.test.ts | 2 +- .../mystery-encounter-utils.test.ts | 24 ++++++------ src/test/ui/transfer-item.test.ts | 13 +++---- 13 files changed, 74 insertions(+), 85 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index b4cd536917c..0da9cc604bf 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -52,7 +52,7 @@ export default [ }, { name: "eslint-tests", - files: ["src/test/**.test.ts"], + files: ["src/test/**/**.test.ts"], languageOptions: { parser: parser, parserOptions: { diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 9f1e6aeb11d..329f52cc4c6 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -53,11 +53,11 @@ describe("Abilities - Shield Dust", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new NumberHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); + await applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + await applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); expect(chance.value).toBe(0); - }, 20000); + }); //TODO King's Rock Interaction Unit Test }); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index f8fa8a723fe..584f997aa55 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -45,9 +45,9 @@ describe("Abilities - Unseen Fist", () => { it( "should not apply if the source has Long Reach", - () => { + async () => { game.override.passiveAbility(Abilities.LONG_REACH); - testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); + await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); } ); @@ -67,7 +67,7 @@ describe("Abilities - Unseen Fist", () => { game.override.enemyLevel(1); game.override.moveset([ Moves.TACKLE ]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); @@ -86,7 +86,7 @@ async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, pro game.override.moveset([ attackMove ]); game.override.enemyMoveset([ protectMove, protectMove, protectMove, protectMove ]); - await game.startBattle(); + await game.classicMode.startBattle(); const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); diff --git a/src/test/data/status_effect.test.ts b/src/test/data/status_effect.test.ts index 7948549b8e8..071dea989a9 100644 --- a/src/test/data/status_effect.test.ts +++ b/src/test/data/status_effect.test.ts @@ -20,8 +20,8 @@ const pokemonName = "PKM"; const sourceText = "SOURCE"; describe("Status Effect Messages", () => { - beforeAll(() => { - i18next.init(); + beforeAll(async () => { + await i18next.init(); }); describe("NONE", () => { diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index 987a5ab8b0c..aae1d806a28 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -31,7 +31,7 @@ describe("Items - Light Ball", () => { it("LIGHT_BALL activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -64,7 +64,7 @@ describe("Items - Light Ball", () => { }); it("LIGHT_BALL held by PIKACHU", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -83,7 +83,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -92,7 +92,7 @@ describe("Items - Light Ball", () => { }, 20000); it("LIGHT_BALL held by fused PIKACHU (base)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU, Species.MAROWAK ]); @@ -122,7 +122,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -161,7 +161,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -189,7 +189,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 42ef9c1bb16..68c3107af08 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -31,7 +31,7 @@ describe("Items - Metal Powder", () => { it("METAL_POWDER activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -79,7 +79,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -112,7 +112,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -145,7 +145,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -167,7 +167,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index d30111cbd6a..ae16daf17ff 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -31,7 +31,7 @@ describe("Items - Quick Powder", () => { it("QUICK_POWDER activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -64,7 +64,7 @@ describe("Items - Quick Powder", () => { }); it("QUICK_POWDER held by DITTO", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -79,14 +79,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER held by fused DITTO (base)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO, Species.MAROWAK ]); @@ -112,14 +112,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER held by fused DITTO (part)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK, Species.DITTO ]); @@ -145,14 +145,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER not held by DITTO", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK ]); @@ -167,9 +167,9 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); - }, 20000); + }); }); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 08b19250ea7..d32c213e506 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -31,7 +31,7 @@ describe("Items - Thick Club", () => { it("THICK_CLUB activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.CUBONE ]); @@ -64,7 +64,7 @@ describe("Items - Thick Club", () => { }); it("THICK_CLUB held by CUBONE", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.CUBONE ]); @@ -79,14 +79,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by MAROWAK", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK ]); @@ -101,14 +101,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by ALOLA_MAROWAK", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.ALOLA_MAROWAK ]); @@ -123,18 +123,18 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by fused CUBONE line (base)", async() => { // Randomly choose from the Cubone line const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; const randSpecies = Utils.randInt(species.length); - await game.startBattle([ + await game.classicMode.startBattle([ species[randSpecies], Species.PIKACHU ]); @@ -160,18 +160,18 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by fused CUBONE line (part)", async() => { // Randomly choose from the Cubone line const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; const randSpecies = Utils.randInt(species.length); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU, species[randSpecies] ]); @@ -197,14 +197,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB not held by CUBONE", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -219,9 +219,9 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(1); - }, 20000); + }); }); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index a2350960546..61630ede326 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -45,14 +45,10 @@ describe("Moves - Dragon Rage", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores weaknesses", async () => { diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 0975a87b2b1..65719df0205 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -41,14 +41,10 @@ describe("Moves - Fissure", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores damage modification from abilities, for example FUR_COAT", async () => { diff --git a/src/test/moves/toxic_spikes.test.ts b/src/test/moves/toxic_spikes.test.ts index c2d1c5aaee8..8969289c2f2 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/src/test/moves/toxic_spikes.test.ts @@ -132,7 +132,7 @@ describe("Moves - Toxic Spikes", () => { const sessionData : SessionSaveData = gameData["getSessionSaveData"](); localStorage.setItem("sessionTestData", encrypt(JSON.stringify(sessionData), true)); const recoveredData : SessionSaveData = gameData.parseSessionData(decrypt(localStorage.getItem("sessionTestData")!, true)); - gameData.loadSession(0, recoveredData); + await gameData.loadSession(0, recoveredData); expect(sessionData.arena.tags).toEqual(recoveredData.arena.tags); localStorage.removeItem("sessionTestData"); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index f0057fea7f0..7c924b86e0d 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -48,12 +48,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets a fainted pokemon from player party if isAllowedInBattle is false", () => { + it("gets a fainted pokemon from player party if isAllowedInBattle is false", async () => { // Both pokemon fainted scene.getPlayerParty().forEach(p => { p.hp = 0; p.trySetStatus(StatusEffect.FAINT); - p.updateInfo(); + void p.updateInfo(); }); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) @@ -68,12 +68,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", () => { + it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -87,12 +87,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", () => { + it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -106,12 +106,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", () => { + it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -152,12 +152,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns highest level unfainted if unfainted is true", () => { + it("returns highest level unfainted if unfainted is true", async () => { const party = scene.getPlayerParty(); party[0].level = 100; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 10; const result = getHighestLevelPlayerPokemon(true); @@ -191,12 +191,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns lowest level unfainted if unfainted is true", () => { + it("returns lowest level unfainted if unfainted is true", async () => { const party = scene.getPlayerParty(); party[0].level = 10; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 100; const result = getLowestLevelPlayerPokemon(true); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 762db7fc7ce..b08b056f60e 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -2,8 +2,6 @@ import { BerryType } from "#app/enums/berry-type"; import { Button } from "#app/enums/buttons"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import { BattleEndPhase } from "#app/phases/battle-end-phase"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; @@ -12,7 +10,6 @@ import Phaser from "phaser"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("UI - Transfer Items", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -41,7 +38,7 @@ describe("UI - Transfer Items", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([ Moves.SPLASH ]); - await game.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); + await game.classicMode.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); game.move.select(Moves.DRAGON_CLAW); @@ -52,10 +49,10 @@ describe("UI - Transfer Items", () => { handler.setCursor(1); handler.processInput(Button.ACTION); - game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); + void game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); }); - await game.phaseInterceptor.to(BattleEndPhase); + await game.phaseInterceptor.to("BattleEndPhase"); }); it("check red tint for held item limit in transfer menu", async () => { @@ -72,7 +69,7 @@ describe("UI - Transfer Items", () => { game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); it("check transfer option for pokemon to transfer to", async () => { @@ -91,6 +88,6 @@ describe("UI - Transfer Items", () => { game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); }); From f77bfc8367b87f28dd336b538156c91e9e94e547 Mon Sep 17 00:00:00 2001 From: damocleas Date: Mon, 10 Feb 2025 00:40:26 -0500 Subject: [PATCH 003/171] Reapply [UI/UX] Show IVs on stats page of summary (#5172) #5291 This reverts commit 612e6a25c124876e1029c6e4160cbbc6866067ce. --- src/ui/summary-ui-handler.ts | 50 +++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 3305b3f7aa2..cf5d40bc006 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -96,6 +96,9 @@ export default class SummaryUiHandler extends UiHandler { private friendshipText: Phaser.GameObjects.Text; private friendshipIcon: Phaser.GameObjects.Sprite; private friendshipOverlay: Phaser.GameObjects.Sprite; + private permStatsContainer: Phaser.GameObjects.Container; + private ivContainer: Phaser.GameObjects.Container; + private statsContainer: Phaser.GameObjects.Container; private descriptionScrollTween: Phaser.Tweens.Tween | null; private moveCursorBlinkTimer: Phaser.Time.TimerEvent | null; @@ -534,6 +537,10 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer.nameText?.setVisible(!this.passiveContainer.descriptionText?.visible); this.passiveContainer.descriptionText?.setVisible(!this.passiveContainer.descriptionText.visible); this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible); + } else if (this.cursor === Page.STATS) { + //Show IVs + this.permStatsContainer.setVisible(!this.permStatsContainer.visible); + this.ivContainer.setVisible(!this.ivContainer.visible); } } else if (button === Button.CANCEL) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { @@ -877,8 +884,13 @@ export default class SummaryUiHandler extends UiHandler { profileContainer.add(memoText); break; case Page.STATS: - const statsContainer = globalScene.add.container(0, -pageBg.height); - pageContainer.add(statsContainer); + this.statsContainer = globalScene.add.container(0, -pageBg.height); + pageContainer.add(this.statsContainer); + this.permStatsContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.permStatsContainer); + this.ivContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.ivContainer); + this.statsContainer.setVisible(true); PERMANENT_STATS.forEach((stat, s) => { const statName = i18next.t(getStatKey(stat)); @@ -887,18 +899,27 @@ export default class SummaryUiHandler extends UiHandler { const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? - const statLabel = addTextObject(27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const statLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const ivLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, this.pokemon?.ivs[stat] === 31 ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY); + statLabel.setOrigin(0.5, 0); - statsContainer.add(statLabel); + ivLabel.setOrigin(0.5, 0); + this.permStatsContainer.add(statLabel); + this.ivContainer.add(ivLabel); const statValueText = stat !== Stat.HP ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const ivText = `${this.pokemon?.ivs[stat]}/31`; - const statValue = addTextObject(120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); + const statValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); statValue.setOrigin(1, 0); - statsContainer.add(statValue); + this.permStatsContainer.add(statValue); + const ivValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, ivText, TextStyle.WINDOW_ALT); + ivValue.setOrigin(1, 0); + this.ivContainer.add(ivValue); }); + this.ivContainer.setVisible(false); const itemModifiers = (globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) @@ -908,7 +929,7 @@ export default class SummaryUiHandler extends UiHandler { const icon = item.getIcon(true); icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); - statsContainer.add(icon); + this.statsContainer.add(icon); icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); icon.on("pointerover", () => globalScene.ui.showTooltip(item.type.name, item.type.getDescription(), true)); @@ -924,26 +945,26 @@ export default class SummaryUiHandler extends UiHandler { const expLabel = addTextObject(6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); expLabel.setOrigin(0, 0); - statsContainer.add(expLabel); + this.statsContainer.add(expLabel); const nextLvExpLabel = addTextObject(6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); nextLvExpLabel.setOrigin(0, 0); - statsContainer.add(nextLvExpLabel); + this.statsContainer.add(nextLvExpLabel); const expText = addTextObject(208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); expText.setOrigin(1, 0); - statsContainer.add(expText); + this.statsContainer.add(expText); const nextLvExp = pkmLvl < globalScene.getMaxExpLevel() ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp : 0; const nextLvExpText = addTextObject(208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); nextLvExpText.setOrigin(1, 0); - statsContainer.add(nextLvExpText); + this.statsContainer.add(nextLvExpText); const expOverlay = globalScene.add.image(140, 145, "summary_stats_overlay_exp"); expOverlay.setOrigin(0, 0); - statsContainer.add(expOverlay); + this.statsContainer.add(expOverlay); const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); @@ -954,6 +975,11 @@ export default class SummaryUiHandler extends UiHandler { const expMask = expMaskRect.createGeometryMask(); expOverlay.setMask(expMask); + this.abilityPrompt = globalScene.add.image(0, 0, !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt.setPosition(8, 47); + this.abilityPrompt.setVisible(true); + this.abilityPrompt.setOrigin(0, 0); + this.statsContainer.add(this.abilityPrompt); break; case Page.MOVES: this.movesContainer = globalScene.add.container(5, -pageBg.height + 26); From 3daa9054f39f26e49c6cc9a3813d9649045a208b Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 10 Feb 2025 01:30:39 -0500 Subject: [PATCH 004/171] [Misc] Add data for theoretical Valentine's event (#5244) * Add Valentines event data * Event ends Feb 21 not March 21 * Event starts Feb 11 12:00 UTC for testing on beta * Oops I meant February 10 * Add Luvdisc +3 Luck Boost * Added Applin to round out the total pokemon and because I know people are going to be confused why it isn't here if they've actually read in gen 8 (any readers in chat?) --------- Co-authored-by: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Co-authored-by: damocleas --- .../images/events/valentines2025event-de.png | Bin 0 -> 3267 bytes .../images/events/valentines2025event-en.png | Bin 0 -> 3267 bytes .../events/valentines2025event-es-ES.png | Bin 0 -> 3267 bytes .../images/events/valentines2025event-fr.png | Bin 0 -> 3267 bytes .../images/events/valentines2025event-it.png | Bin 0 -> 3267 bytes .../images/events/valentines2025event-ja.png | Bin 0 -> 3267 bytes .../images/events/valentines2025event-ko.png | Bin 0 -> 3267 bytes .../events/valentines2025event-pt-BR.png | Bin 0 -> 3267 bytes .../events/valentines2025event-zh-CN.png | Bin 0 -> 3267 bytes .../utils/encounter-phase-utils.ts | 5 +++ src/field/pokemon.ts | 8 +++- src/loading-scene.ts | 4 +- src/modifier/modifier-type.ts | 15 +++++-- src/timed-event-manager.ts | 40 ++++++++++++++++++ 14 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 public/images/events/valentines2025event-de.png create mode 100644 public/images/events/valentines2025event-en.png create mode 100644 public/images/events/valentines2025event-es-ES.png create mode 100644 public/images/events/valentines2025event-fr.png create mode 100644 public/images/events/valentines2025event-it.png create mode 100644 public/images/events/valentines2025event-ja.png create mode 100644 public/images/events/valentines2025event-ko.png create mode 100644 public/images/events/valentines2025event-pt-BR.png create mode 100644 public/images/events/valentines2025event-zh-CN.png diff --git a/public/images/events/valentines2025event-de.png b/public/images/events/valentines2025event-de.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-en.png b/public/images/events/valentines2025event-en.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-es-ES.png b/public/images/events/valentines2025event-es-ES.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-fr.png b/public/images/events/valentines2025event-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-it.png b/public/images/events/valentines2025event-it.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-ja.png b/public/images/events/valentines2025event-ja.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-ko.png b/public/images/events/valentines2025event-ko.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-pt-BR.png b/public/images/events/valentines2025event-pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/public/images/events/valentines2025event-zh-CN.png b/public/images/events/valentines2025event-zh-CN.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069 GIT binary patch literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ead0443908b..351b969b1a8 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -887,16 +887,21 @@ export function getRandomEncounterSpecies(level: number, isBoss: boolean = false let bossSpecies: PokemonSpecies; let isEventEncounter = false; const eventEncounters = globalScene.eventManager.getEventEncounters(); + let formIndex; if (eventEncounters.length > 0 && randSeedInt(2) === 1) { const eventEncounter = randSeedItem(eventEncounters); const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, !eventEncounter.blockEvolution, isBoss, globalScene.gameMode); isEventEncounter = true; bossSpecies = getPokemonSpecies(levelSpecies); + formIndex = eventEncounter.formIndex; } else { bossSpecies = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, level, 0, getPartyLuckValue(globalScene.getPlayerParty()), isBoss); } const ret = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, isBoss); + if (formIndex) { + ret.formIndex = formIndex; + } //Reroll shiny for event encounters if (isEventEncounter && !ret.shiny) { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 16af8364502..daab808918c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4356,8 +4356,12 @@ export class PlayerPokemon extends Pokemon { ].filter(d => !!d); const amount = new Utils.NumberHolder(friendship); globalScene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); - const candyFriendshipMultiplier = globalScene.eventManager.getClassicFriendshipMultiplier(); - const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * (globalScene.gameMode.isClassic ? candyFriendshipMultiplier : 1) / (fusionStarterSpeciesId ? 2 : 1))); + const candyFriendshipMultiplier = globalScene.gameMode.isClassic ? globalScene.eventManager.getClassicFriendshipMultiplier() : 1; + const fusionReduction = fusionStarterSpeciesId + ? globalScene.eventManager.areFusionsBoosted() ? 1.5 // Divide candy gain for fusions by 1.5 during events + : 2 // 2 for fusions outside events + : 1; // 1 for non-fused mons + const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * candyFriendshipMultiplier / fusionReduction)); // Add friendship to this PlayerPokemon this.friendship = Math.min(this.friendship + amount.value, 255); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 60a0513f608..e8f817c1c39 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -249,9 +249,9 @@ export class LoadingScene extends SceneBase { } const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; if (lang && availableLangs.includes(lang)) { - this.loadImage("yearofthesnakeevent-" + lang, "events"); + this.loadImage("valentines2025event-" + lang, "events"); } else { - this.loadImage("yearofthesnakeevent-en", "events"); + this.loadImage("valentines2025event-en", "events"); } this.loadAtlas("statuses", ""); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b65f1b53441..b1e8b69df36 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1720,7 +1720,16 @@ const modifierPool: ModifierPool = { }, 4), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), + new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => { + if (party.filter(p => !p.fusionSpecies).length > 1) { + if (globalScene.gameMode.isSplicedOnly) { + return 4; + } else if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { + return 1; + } + } + return 0; + }, 4), new WeightedModifierType(modifierTypes.VOUCHER, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.GREAT); return m; @@ -1879,7 +1888,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MULTI_LENS, 18), new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily && !globalScene.gameMode.isEndless && !globalScene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), + new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !(globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) && !globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, () => (globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE))) ? 1 : 0, 1), ].map(m => { m.setTier(ModifierTier.MASTER); return m; @@ -2538,7 +2547,7 @@ export function getPartyLuckValue(party: Pokemon[]): number { return DailyLuck.value; } const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0) + const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 3 : 0) : 0) .reduce((total: number, value: number) => total += value, 0), 0, 14); return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 7a9f0e59993..bebacf87ebc 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -27,6 +27,7 @@ interface EventBanner { interface EventEncounter { species: Species; blockEvolution?: boolean; + formIndex?: number; } interface EventMysteryEncounterTier { @@ -49,6 +50,7 @@ interface TimedEvent extends EventBanner { weather?: WeatherPoolEntry[]; mysteryEncounterTierChanges?: EventMysteryEncounterTier[]; luckBoostedSpecies?: Species[]; + boostFusions?: boolean; //MODIFIER REWORK PLEASE } const timedEvents: TimedEvent[] = [ @@ -144,6 +146,40 @@ const timedEvents: TimedEvent[] = [ Species.ROARING_MOON, Species.BLOODMOON_URSALUNA ] + }, + { + name: "Valentine", + eventType: EventType.SHINY, + startDate: new Date(Date.UTC(2025, 1, 10)), + endDate: new Date(Date.UTC(2025, 1, 21)), + boostFusions: true, + shinyMultiplier: 2, + bannerKey: "valentines2025event-", + scale: 0.21, + availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + eventEncounters: [ + { species: Species.NIDORAN_F }, + { species: Species.NIDORAN_M }, + { species: Species.IGGLYBUFF }, + { species: Species.SMOOCHUM }, + { species: Species.VOLBEAT }, + { species: Species.ILLUMISE }, + { species: Species.ROSELIA }, + { species: Species.LUVDISC }, + { species: Species.WOOBAT }, + { species: Species.FRILLISH }, + { species: Species.ALOMOMOLA }, + { species: Species.FURFROU, formIndex: 1 }, // Heart trim + { species: Species.ESPURR }, + { species: Species.SPRITZEE }, + { species: Species.SWIRLIX }, + { species: Species.APPLIN }, + { species: Species.MILCERY }, + { species: Species.INDEEDEE }, + { species: Species.TANDEMAUS }, + { species: Species.ENAMORUS } + ], + luckBoostedSpecies: [ Species.LUVDISC ] } ]; @@ -297,6 +333,10 @@ export class TimedEventManager { }); return ret; } + + areFusionsBoosted(): boolean { + return timedEvents.some((te) => this.isActive(te) && te.boostFusions); + } } export class TimedEventDisplay extends Phaser.GameObjects.Container { From 8012a1b55949233b376a28f7e6399c2c476c194e Mon Sep 17 00:00:00 2001 From: Chris <75648912+ChrisLolz@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:48:50 -0500 Subject: [PATCH 005/171] [Bug] Fix Fun and Games playing move animations even if off (#5187) --- .../mystery-encounters/encounters/fun-and-games-encounter.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts index 53f89069491..287376f8bd0 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -41,8 +41,6 @@ export const FunAndGamesEncounter: MysteryEncounter = .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play .withAutoHideIntroVisuals(false) - // Allows using move without a visible enemy pokemon - .withBattleAnimationsWithoutTargets(true) // The Wobbuffet won't use moves .withSkipEnemyBattleTurns(true) // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu From e75ddfa9750db7831d948dd1143ca5d000626cdc Mon Sep 17 00:00:00 2001 From: geeilhan <107366005+geeilhan@users.noreply.github.com> Date: Tue, 11 Feb 2025 01:56:56 +0100 Subject: [PATCH 006/171] [Ability] Ignore Held Items for Stat Calculation (#5254) * added the ability to ignore held items at stat calculation * integer -> number in src/field/pokemon.ts * added tests from @SirzBenjie * Update test * Fix test filename * added turnorder to tests * added tera_blast changes and tests --------- Co-authored-by: damocleas Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/battler-tags.ts | 12 +--- src/data/move.ts | 6 +- src/field/pokemon.ts | 16 +++-- src/test/abilities/protosynthesis.test.ts | 66 ++++++++++++++++++ src/test/moves/tera_blast.test.ts | 82 +++++++++++++++++++++-- 5 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 src/test/abilities/protosynthesis.test.ts diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index c399a9bb595..43168ea5c0c 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1752,7 +1752,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { super.onAdd(pokemon); let highestStat: EffectiveStat; - EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => { + EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true)).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = EFFECTIVE_STATS[i]; return value; @@ -1763,15 +1763,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { highestStat = highestStat!; // tell TS compiler it's defined! this.stat = highestStat; - switch (this.stat) { - case Stat.SPD: - this.multiplier = 1.5; - break; - default: - this.multiplier = 1.3; - break; - } - + this.multiplier = this.stat === Stat.SPD ? 1.5 : 1.3; globalScene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true); } diff --git a/src/data/move.ts b/src/data/move.ts index 48f90297115..967d2ee0cc2 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4559,7 +4559,8 @@ export class TeraMoveCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move) > user.getEffectiveStat(Stat.SPATK, target, move)) { + if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > + user.getEffectiveStat(Stat.SPATK, target, move, true, true, false, false, true)) { category.value = MoveCategory.PHYSICAL; return true; } @@ -10905,8 +10906,7 @@ export function initMoves() { .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }) - .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }), new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index daab808918c..80a2980c92b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -947,11 +947,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility during an attack, determines whether the opposing Pokemon's abilities should be ignored during the stat calculation. * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated if `true`, nullifies any effects that produce any changes to game state from triggering + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @returns the final in-battle value of a stat */ - getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { const statValue = new Utils.NumberHolder(this.getStat(stat, false)); - globalScene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + if (!ignoreHeldItems) { + globalScene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + } // The Ruin abilities here are never ignored, but they reveal themselves on summon anyway const fieldApplied = new Utils.BooleanHolder(false); @@ -965,7 +968,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue, simulated); } - let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated); + let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated, ignoreHeldItems); switch (stat) { case Stat.ATK: @@ -2487,9 +2490,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility determines whether the effects of the opponent's abilities (i.e. Unaware) should be ignored (`false` by default) * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated determines whether effects are applied without altering game state (`true` by default) + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @return the stat stage multiplier to be used for effective stat calculation */ - getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); @@ -2516,7 +2520,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!ignoreStatStage.value) { const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value)); - globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + if (!ignoreHeldItems) { + globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + } return Math.min(statStageMultiplier.value, 4); } return 1; diff --git a/src/test/abilities/protosynthesis.test.ts b/src/test/abilities/protosynthesis.test.ts new file mode 100644 index 00000000000..67786c3ae9e --- /dev/null +++ b/src/test/abilities/protosynthesis.test.ts @@ -0,0 +1,66 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Nature } from "#enums/nature"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { BattlerIndex } from "#app/battle"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Protosynthesis", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.TACKLE ]) + .ability(Abilities.PROTOSYNTHESIS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should not consider temporary items when determining which stat to boost", async() => { + // Mew has uniform base stats + game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.DEF }]) + .enemyMoveset(Moves.SUNNY_DAY) + .startingLevel(100) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.MEW ]); + const mew = game.scene.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 def_before_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_before_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + const initialHp = enemy.hp; + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + const unboosted_dmg = initialHp - enemy.hp; + enemy.hp = initialHp; + const def_after_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_after_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + const boosted_dmg = initialHp - enemy.hp; + expect(boosted_dmg).toBeGreaterThan(unboosted_dmg); + expect(def_after_boost).toEqual(def_before_boost); + expect(atk_after_boost).toBeGreaterThan(atk_before_boost); + }); +}); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index 44dc29f68b5..21cbf4c1463 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; +import { allMoves, TeraMoveCategoryAttr } from "#app/data/move"; import { Type } from "#enums/type"; import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; @@ -14,6 +14,7 @@ describe("Moves - Tera Blast", () => { let phaserGame: Phaser.Game; let game: GameManager; const moveToCheck = allMoves[Moves.TERA_BLAST]; + const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -86,19 +87,86 @@ describe("Moves - Tera Blast", () => { expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); }); - // Currently abilities are bugged and can't see when a move's category is changed - it.todo("uses the higher stat of the user's Atk and SpAtk for damage calculation", async () => { - game.override.enemyAbility(Abilities.TOXIC_DEBRIS); + it("uses the higher ATK for damage calculation", async () => { await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.stats[Stat.ATK] = 100; playerPokemon.stats[Stat.SPATK] = 1; + vi.spyOn(teraBlastAttr, "apply"); + game.move.select(Moves.TERA_BLAST); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); - }, 20000); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(true); + }); + + it("uses the higher SPATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 1; + playerPokemon.stats[Stat.SPATK] = 100; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("should stay as a special move if ATK turns lower than SPATK mid-turn", async () => { + game.override.enemyMoveset([ Moves.CHARM ]); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 51; + playerPokemon.stats[Stat.SPATK] = 50; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to held items", async () => { + game.override + .startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]) + .starterSpecies(Species.CUBONE); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to abilities", async () => { + game.override.ability(Abilities.HUGE_POWER); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + it("causes stat drops if user is Stellar tera type", async () => { game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); From 20ed4db88b942677a104ae89966ceff57d3098aa Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:15:59 -0500 Subject: [PATCH 007/171] Index Zangoose sprites (#5042) --- public/images/pokemon/335.json | 2455 ++++++-------------------- public/images/pokemon/335.png | Bin 66403 -> 10468 bytes public/images/pokemon/shiny/335.json | 2431 ++++++------------------- public/images/pokemon/shiny/335.png | Bin 24209 -> 10990 bytes 4 files changed, 1068 insertions(+), 3818 deletions(-) diff --git a/public/images/pokemon/335.json b/public/images/pokemon/335.json index 0279e0fba5a..a9313fcec5d 100644 --- a/public/images/pokemon/335.json +++ b/public/images/pokemon/335.json @@ -1,1910 +1,547 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9c4e9647cd30b406386dcfa45795951c:b817a280fcd689ce74ea32e378a31e74:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0065.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0066.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0067.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/335.png b/public/images/pokemon/335.png index e5d051dd8501f388456944fb48a9a00d0ec313a6..65b565823398d2fc5c1c107d23b78575de0e55e6 100644 GIT binary patch literal 10468 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 literal 66403 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
  • @6EJBXu3S z2~0f43jlr!_^P_5CQ}<5B!I)zd~s9Kk_etQdm-W@A`;WmwpE%NA8BF1s|zTt*l)go zp^|ResWkxTG9+=9^3U6B)bj&}vZmlK>&|PFN)LdNPZ6+^4(7X1@cWP0LZj@RR(QEQ zxS&o*88L9z)-INtIoyhQ7DEf25W_ZK+sDuFv01Q60#k;*V?G9>jLWJbk4>GUYqbcW)j9h5wtD*i($ja6?eh2) zFJOO+XkN~LgUf2>BmEl79IaulIba;2rc^+S>3e*c2D!{<$@z+%H^B+3fW(3=~SIsvl{&rjqFl$@ycU@|GJ zG<5!)kV{46vfNibf|M*?@Z*uF=upU%HP;u!r?;dn-6eoQ*gYZ{_~$|uo2p*6y?-&gEDU5H)XgNTkTacmPzKZLc z7wh~*mHk^loMJzN_mma95F;wTN5MENX9or+IKHo`w}F}1@OnHj&}H3f#pr@WANSa6 znX**MInw-(k-PhDRy_&L;--AZjD>NNGmem!6N+=OtnvBlRGGEimX6mg~G8v`MPUzugaGSZvb!q3jK^^ZXMY7WRUH zM8wB0I(`5V2ee!$X)^}E7T?Pu1Qun`$|DqJ_NtiT5 z^&&t}<2(biwu#j%BW(QDYmJQ5*X(5`MX%Y<-34=0NU!ZstfWiik})w!z$k7VP!>pX zdg)mfs8f?#0U8R@sp5{X+pRLT zed7z1yVm;E5Yu>Wqf`Y991lt+2Lc-Dg5k*qW=9*O+8)RzY_erl!N-p2f{sS4&;JD= zen`B@w>?AV?>^&(L_M24!iv=Mj)}r~lvx;*!Rih3h@nsabkOb0O-c%0OFa%IdYVrn zM?!WoT>It0MaHv%;W_AEQ3U%~(h&+=AnK7DPS5{zgnjzV?b17iYABePBpYMI(Ba%3zaxlY|5vh;FpAnzbT0o(wnjt2 zm%HHJ;~V-3YFyfNl2Mi29wh{Z#BNEYTX!557($unba3(qmUqizq${f zqn>HDbE)Ba+PpZpNrE7PbkC)~i)f zg2FNS{n61aV{0h7M!|=38`)gpy4qTH6tK@XW5~bmM1gx7FaV7uB z=uWv5GN{XcpS}ajA)$XVp$O#hhgCH)pmP6p%MlL4x5cdCr{m<9u1Oozi5s-R@2F9! z^#g2afDX>yV=Mw#cxGBA!Ds1EK3Hevw9BVR(c0057plICITp~Ly`vXSU=E^*Oe{xr zp_2CGXX>HT)2bM-f90z&Q$qiE-o&{C=J(LONgyr*M4`NyW65;y#}Bzo+I!D6_f0}L z6hW}qHy&$6nQ#h2rZ-CdX7oJ2&u)K_dx&xkw{O?co@sh`TaV53G2Q}{w}LHuFwavo zw4|BJ#z-xwW8@*3yI1iC5OQ0SEWc&bZ#WCe&VuR$3IT@fYtX$z((%J)rG+d1$7iqA z2YR%Ai4w{+no`Agl9H0PAORm$Ek-Mx+Z##8MuvYII78W*=37e54JIJKWcQh-m@;qp zXwdotl(zE7qoN%Zu5oweOR=U>Ce7}8u7fm z8pECd*q4ro?`Xf#U$f8Ozuf*I`^){bCgc<91f32S;Uxl!V0PcjagW#}Ho&5IBOst2 zIbcvwvn8!;g>(oVh$;XB7EUKmiPHC6J?kgL$b_8~PCMnOrj-#gPQ0r13YuI2&eg)~{E9r@ZizoLQ^% zMEw0nDwpfm$8^e%M<*RYt<(uRDiMERV=3m2s6HQ?)lJ)SIyd~$l0^(~9fU73qXnaY z62-3&O?`6EF||H?L57NM{-|g!*IHS_YMUYZx=c_IKNIzF2WFStw}6|ZIO_FjR+ii zcV;LvCpowIC%eGq9l*rQ6!K&hR56hP_5bao>8kZz`hO6oFK&!UI2kn3;~bvHD^Yf^ z`>s&x;a;!_6NqVTUEr~ZHDpH;@x4?wzPggInm5yH>)k8wfPxeRObsL$Q(caFm2F$t zpl)XurEIzUi<}_NKahvt3j@b*|GXxYQDp38ha@+Lu$E2GN+QbZy=D-U3gW&S`1nWv z%Hx?SYuPt{(s~FM42kcgkuuXe!*Gz>ME5Pac2pz%oES+spMHKodK2>y&5%l|Lst0G zblObSrNl|^1lFgIvnk}IgB1;Jv!>&Hp{xN80VZL4e(^|DGG)=9>iT*Pa;2t1k(H1S z9G##-z6KWQyo}B0+$RFOmk(6Av!Y#ES5EA^f1oax(^!UsJhLwA4Z2cvv1yWnDSm?4 zXI>G7Z7Mf_p%1t!t-GD+SbH=XLTWGNrWkqtvdr(0_g05-pMga}-ekzq!e4(o?%3DD6NvvyBf zWcug9n-kiU`p>I6`culv90DYMa|jZwPZJ&t&;oOiRH**Ua-QzwTKAEL%9Qk?e#?^p zJt&|R81-AOIcOZqw0yNej#FqO`0LhLSepsAa2`oNDtVSh120Ii5?vbSix~F1JR{~P zT!6;3bg=xjn6r_)HF#-NjGbYZ40ueP|3dP{?RWaWrdOa8%IA@>3-lDo@&cvT-jQQ} z!GD_2YKKn?K~M1s@(auC{fizmAZuW)#f$kw3cg!Yt?1d$}U%pghXr?p!neA-Ej%vKI_S{0iTnr*?k5z;sCv|S&* z>(~8K_a$HFqV6M)d5v`QUA)e8TW4%|fmIf?#})TSVC5F@$6q)T?~sy`$^^^T(o4N< z5qd*1e?o9R?NJQG8eGt9GO@c`-WLRv6A>Ri5e^tx{M)n*YMO(Fh zt^8*Fx;ZX_z=cf+1#oQ93*SR2xES@8fRg&OdU z0bO8DY7gD<|9@EkqG9K5FouKnnmjU~UN7vD0s9?H3hCB8pU5pWuq+_B%xBnGj=nD% zl*m%Y@qTkrqvB;NurZHoyrFlS=GgCdh6k;Vv7-Zie!cMx{6Zo${w>ZKAeWsmpYuU` z2fXw)vf$i>^aWB-SVf>e)G5+ z#a@wKp0=PyEcSur;PlFG*t{vc6xk`~><+;6N>l7BWq0<~IM$={C`!ZrQJ?vZoxdkP z_y)wlth6*5qB%g4I(Lb_m1%cJfuLr=7QNDbq&K6Sd-0TC#J;QS7eC-gRul#TO39F4 z%1wYh?)7SVEu&I<6U=B%qtNl;;J+Xn4*-vi?*yV&mg`9V;m1JB)>(QHRmDq=LAQ;3 z7WXUk&_5o6IeT|KPxj#r(R3=g&6{cm4AlLc^H+w=u_ShH2dj)3{+3+x@f7?tf3>Jw z6fwgN3-sJWrwcqs8%cmZ7aLoxS-NJqO=<}$DDp-F3>2)9Qi;z7_0Zlnw89;<>hdBG zz`@G>tlN^5P4g-^bem=KjjF3}f-sxEhwuDQ=0xLv_=-Jd3f`baEjEfl;ai45RIp$fWF)22GTJu?6)Lar%$PO8 z|DIndxHU3hkUM|r9iwO8gZ-^*A$tT3_e16&H4kXSP;{Q1yK6KFp=VN594~e(92@|# zSsmc?J@;3Jdwc_0@_m?YkLfHm3t3<00Id72h67>iOe+?bF+tWB#{eJX4i$=ppz|b? z1sC*xr0B+3SzGr5FlMe+^T;ZNH~B^11+nMcZWIh6H1{Jvx&a)Q>C1{88%xIFZOi>v zKA)SaGs$m|_^#UL!wlh$npz9<>t=fWRo26R(~ZEQd=5$sm861fkHB zeQR*b{R2JQ^`nwi=l!7vz|)JwSN!Ck?K=MWo6ld0io%dj2ica0jods6{OBDn@m6C@ zY&RcuetFX8suF3lX>1GMaxGHH-e1NJhcZW!Wba!`2Nh94YNOwv% zNH<6$4U!@a(jXE7((!Me_xl~=%7AgdI(`P z2n*k{Jqc*4T+74CQ@36iWnf}c|0p(aA5p4`O-VhBT9Jnh5&iA_KeFrJL`q6ZIbC$N z@J5Qcn+`9x4W||utchaJg&*?hGf;olA=@)-tKY-Ww;?l?`6!OI(_~Ub^F#>(NFLS> z+udcmTIOz0&J8PQFJl3P=rsv}89J1L3GWsEVS!43k=aV95RFf`qN3IQr+ny2k}&G& z(S2|~6n7~??Dw%NEQ3At*99*i}ck}dseplGea6`?AoWwwa@!>mhv&>;NcN`?*1a}nAmOwWpN?!_=l^io7x2E~oGrdSl<;mA z71E8KL7bKMoHh&v^5*kvG5rHfB&8R-gcio8_g6FACz=^?wTNZloQX>ghF8RZMtxT~ zSa|53{C6rx5Z~#e-Wv`*U3@lYE%}Yg?m#U)${OPicu^waU*ra`Lz$A;)p!cMT}6Zo z6^-dYZ+C_rH*VOj%iTL85fR-pe(M zl4Bzk>M)vd3u=17g>xb(ZO?-!tQb59oPRB50HNCXU;hy%XxVYog4a5D3w`y# zO{5Z}y~emM6pN&snhLU5J<^6zN2V%&FNSMzIgCDX{bA958s&&9^Af+dCr&&1Tv1xa z84c)#^+rq8@|b}z3-~8u;PC(~2F(oGM0oLEEIgvxI0MA37u(=_(|KJQfoQrh4(+fY&s8aV{2Q07A{q@VU1w0?R2)!gf_vmHc(mIIPPnvM8aW|LgBOtY4y}}!7@yX(}%u()hpj_;4j-@hF^pmM3Xzu@|5(VH$ zUJ5GlB+k8gn%y8AWt?p8k_n)Y&CS5om}(WFV36f?Q^o&vb-C6v9El zc#KlAbp;0mouls<4k3m?@YT9_z(%9SX1t1VW=vx}O)Pqoa6tVi+*4&VvJ!!CzQ3sy z*^2(z?nO3RmY$?;1B1!n2(J2=p$6&9@c8IwJ_j?3PK}|MkG{U*x(ov#+s%^l(p-KX z0=Pw{9z?xhyX$`VK(TZUJm?RSECKMv@2dEv^Y9tTnmy}>`^-T<8Wu@f$NX=7BDqM% z4s+9E+cq3ua>%bYYTMwecGU7cNb64gWNSm3q9WH@MXu#94j!QX}hvlQvC9~s`?<|0N2K&xhm#JeR)?%E{t zFOX!pnMg6QEG|-UOeRWV7jR_09ty$f-6n1-W8>-1c`JGa(kZE*-cd9}IW)1Z2#;QT$#ON{m2iLf_R-hgi`D zlc5(fGGg|YrM#gKr~T;$YDO^mjytpjJ_JyOJ6F1+~1pS!$G78Uv-B9EfWyo%+i)YA+Rx-Woyn@Few1S4t=9#pP3INZNAT2*M0jd8W}SIVmtp zYIho&n4F4Xgr~V?CCv(tuGHx>m+9$2#l*s0%i44jWI`ohkp~yGNfTmes13guOALuT z0TqC_rJaXa-BL0vJygWsLO+&b9xahr4H#e5l72*SY3$nz4wuI}B@?yIUJI90rzNV^ zj^+Ei1m0IwEUbf`e=*63N#I1rk|#Yx*ehaHt4;dgi(-jB$D$`~;zLUIl}w=3yxHG6 z$8@G#$`d2b46}v}*j(BH;_*rpw*pG*2{}TTdwPwqp)%-J{T-o%klguwFSknX$D{z4 zt-jN$nxVwJ2UwPIPS7GjJc#1h^u`ma;Bv0#ks~MOZ`hRA?>`cGIAAabTd3PKzap@V z$n6vzh7Asqu?kEpR+LIGgqIAbEd1pW=0C%NJy#PuD`S8x9fec;>avV4$XL!)LjmdW zV6{id`vMOaR8#AhG6*Ork#h@;2-$ii5P}Kv6sQ~C6v1|hm%!6Z`FCw9`}+;LUGI-3 z#6D{GMyv6VNPiirzVvJeUXTIChiOA*$7%r{Jhi@2U{7LRTpaQGVcsE5yidXPier*; z$m91POVCz9=PyyaXB|lZU6*D z*>{dC9zA`1RnY2z?B-m=rqpOhoCIk(WVO;~I`?k%23MtK6c&7-j0@-VS5Z`i4HFIK z{l8;uIh3dZm{G5y>Jp@jF%jhGrxE+|JKldE`hqc*mHISuJ!_j@l=|67-8P6J`*i;; ze8*fc7<;e4?`(|c2ZKOvt|Xy6W0 zzbAPS{$o*l<6iXh&qX%b#Cfxo*NhMNMPCxkse3A;?I}}up`|iJwIbk0AEsMVub!n)jbLeWp7f(sO?xq+55;KpKoL z52ZdQrmfn+E18NHWjR;KHahb2`)5)Q^JkD=miDwWOX+7|sZ1XeSVL%Ms z)_aE(x(?XaLOXP|ql6y1>OO}tVD&2x1*vUvKtQRb>D&R5e$JEBRq>6f`8d?SqUYDf zg>|e$@8QcYwyEB+=qA+1-k}*VNF{zDQh+tDoFkT$P}C+oSQWd|)9lD1++#14R zD;O&W!rDNR1Sp@e!`4>T=p55t1^Q5E4nvJMKyCg?%tj>{9S!oI4u88pzmqH+9~8aA zu=qNQHY`Uy#Yk6XP{w!+yxDk`-g+6nDvk$^yzgcbZOw3=SHF=loALFsUG2Lk{GNG3&lTPSoKX|_Qn^Z`;;sjCM zls-X&x?WO?CHl3yk1BU506h|P!?BxqxIbMK=~`#3Eoe$|zJ3@@dS+s0A4czaeysD8 zRHlR;hi5qTDmY8L$H83E%1tL_hZ?)fOre&$gD!c6Vc-uyNB?^v*??7n%s}qP|Z40xSNpI>4cL~y6U%sKXN+?FzPn72*RcsSZKl(5jZwW zuFBGgu3>Q2U$W6?e0J?WYgng3xkSK=2fPfv^>7fNRQAFPq4<^G4j;z62ii9z3b;J_ z{C?4{75Ar^bGB16N>}L6{ho(s5&u{u1N;n89|%;XNly1}i_nn7=4b~(X#&v=JIi0U zBnJJE94WU&rbZIo@gJjD`$1Cu=0omV$w(QW_{o}^6C>r&v@TGv3ia@{1_~qc5GqYQmwryC3U5q2UunumMNyS@schstqD`Z{ zed*2_m*?tsX)`+VYeQcjI6Dr6_W!&W@qNAuxUz!k?0GOyucI?6mO%IFG^QYednAk+ zW)6w!pW{H4@KUvmO*1_Af{kA7D(BS43>Mwjov>Q8=h2LEMp$m(TVFH6L4}VVFw?(e z<~}ghREYk=DnKALNsl5KIYnEBlF?6m55Mb-p+Jn$8H*P@tf+XwJS07i$=%}2&`7=h z=XmJvnZK1!LNqq8TH83yhf z?@5wjT<Z9#!FX@g&5f zKK2Iw`=U+>g%N7zcis&bU%ezWy6sLney}_%HTWBD7SEdVXw^>8YAHgF^P63lz1W&Ld7dQt>K6ew5oV9jm;kF&^y^VXN&!2!kDOD(>rKu@ui5 zTrV0dv642^_^7G)?Y2T41O1&JNAs1Jh8Z(LtrJ^xHP@90=>4Y`qgA|SsX|?r3SMSr zA&JgkS9taZ?qqR-sGoJtGUP5&gXN5QbHpWV)$TFl%ZjT@Xr&7ekoxxWhN+Rwr>Tpr zXWdzf1ywaaavv@1hfgsxMJ1BDL~V!3tZQHNDr08M7(lDF3g=;s#e5Awg$U^@%vkoict1;FzuZe*YnM!hc^0V9` z8ga@&-6~mlKND8YIo?a?^TLJ~H9Q0}7vCcf7k7~1OFpcq;x~?%L3?RqKBKT%YI)zB zn_7cD^YbW#fPwXoh*ageT|v4_w1hZB>h1`G&SlLC$2%1@jMtfp2%%&>s?KQQlwWkv zNiYIZ-+kEnx1bO){}xvkicw82#;fad3k*VUn7G{Odtv-KS(*?HVcxZ~5` zV!RZw&=ZEF@eXKE{0u!L_`0?4{jb*N_G^Fne!7+m zcD<7#il86d38&E_I+Liy$9QWMw=LiBcLEvHnWQyozoa~*Evpdcm!UrSqcE@IogasW z5S?1&$6+CAkG2m@ynW~IO{O2p8yl^6^Ze@>ye_QNsB$?`Xda)khU09y@5gd=VKM)# zdlJYjU(?=uP4+dgV8qTk2WKnV#%)L8bOyu_lPcL=$aF)ig_4Q9iZd=dtnwmro&Bw> zt7GVHZ{uZod-X*ZapliGVXS)9;j59T2(iHoO5{$nT|e-#8rWc~rLY?~c+2b4W;Rbc zXItghsvwt(dreBo3%JpVm$otH>cCKx<|7ve3%6Lkfge0s8w)b5`7nJdQ8B|%X;#*v zPgc+SZd2!kHKRMFBkPzd{`#RwcSEwS0uCQ+E7H>wHt3*3c}hXBvAJ@B8AJ)*XC)0! z1h*Cp3=Djn-MLP+r9?9tm4R7azjX7P>7Sz_4i;OTjs6JIes>1un{9#B z;t)k=4WUzu<#-~kUg%vrp8fB46f>K-BC#|p$M440`cA_J96rAmn|XP^svc7>+iCK1Er7$QVdWz$xgQu z(bbmwWCDsMer@E&%>KBm{Ht@rABtf zvHh#1zi;n_-+eNR`$LvyDaZbH$vJu{Cip2JJ7C|_%W>S~-DoJfG9yur0*E2w)y?rv zmMPbwUt-VkXXBKDwydB`W!9F@OlnM~{x}L}Uy>oGOzX^l>t5rosjFm7Yx`P!k! zhF;8kd*Uz7)7PH-H>$aD-~KCFwB>5^h3HImSS(g#9I^{BOiv~ixEc2UvM-vmtr2Bu4#^RS84|E#|szJ3MVf!~TNCo0g) zIK6iCFfXZ6Jv8=Lf`hxeb(cny6*&lg9Q?ccK!f#;AuQ+6eV8gycH)TGd}64*q2W7O zZTdmPL5`{rlaU4YG;cg9GZY2VYs_^+J@QCCBhd^|Gt7dONxS()`v-IZf!+pj*L9>vi~u-CW)>&;IoG9~E^D<%s`Ms<9Tk{^9fY%Y zYGlsZ7a&De>`E%ubav_fJ-OOkiT|-@#r3nEwGYGXlGbng=%~-7PzO?9OjCIvUo)j* z^b;DoUjiDF_GCP?D7XzUa#B;qZQ;S)!U9IOHDWEyDSx0Cs^h_AegGTFm0o4+tCu7d zrrTAnlz?~@rX8{1au!CU`I5r=n+PkBz&08@d!+;spP zO7|D)U&x!^QNfqvb!U2jJ1VHELgjT@XJKS!j()rx7Ln#)z@;B!_+;4h)m-5unwM|m zararg2_h6D>E$z?b_S+_pjkAfkm}u+`$QKgW>(fN*5fjs`30F|Z)~~F-VD)CkGiZm z{G`PuCVP_z{_JKy%=mo+XZyg-S#M-2bngG&|57_UJ6k;8+NAGr+3zH*aOF?dn=QG) zZmKBPo^;=TA@r;$0i$vT{tMjv{eGt#hven&4-XIDvIpLdKiu5#y}ZFhUteBiSn&i! zLtmeWl$?A&mGAuV^g>`Wd+uw*TL1@c$c@-?4K=bm18&C;N0`Cen38>=<@ZoLoO1_J zhvy7hK9aJfD;_kceU;yR%RB%X7*!goowvP3>A8*34uSJlY0_tH-{UVSDN(C$(<((a z@aX=ClJP;Lw3>xpFJ+`(Y}#|^TY6dmKQ(n|nm28^^LN?BoJp{p*;0o{-;} zR8O)nFRP8ZKcd$I<^%T$%~;uVBQ=B?J=#7{S>U3+81|NaC$0pM|LIW?we(e}SSwD<3{Z=Bd=a-O)Qw~0EpuEXp?4^i_*i%U=2HYc@8 zcw_6Ce45RoI9KV6%(U3#H)I3FG_Z^!6NM{>M=O}X-zrDPMU5ig7h2iYL6$se<( zU5j>US>Z18UTqhJk3~l&>S%EYZLCBI7X8(-OEy)=@iHQs;UPp;DV@=lj)bNz<|)Rt zdCn*aM1PduU*3j?kK)B86Zg!LEmX+lMX=q^=5apXeqvTkorx+rSMnq(w$zY^G^tyO+^@jO z#%7gL!o!*QjV(FTir z^Y0n@!odev*WGL3syF(7ub(Pg?~|+&X|K3S?P)luU(a*GO6uK<3uiRLTQ}=Jc^Djj zq$?Osd!@C-rB^ukE0d{6OJHyJ!MhSSPa`_3jj(F3MPt7ejp~{HQG|H&Y3Xf#292kJZRivZ%Vh)tMMnqWQ1O?6fW+g>lBzd z6gTvd6duTrSLj%Fg8L(x;V(;&n|Iq0W^Ip&xDAgTh5gQKiA3~6Gnq$ESe7Bjarj^( zgHVdjGK8k0^{oUTHjCI#R*`C*6dPm_rn+89QY~)$437^FFEra#)uP=8cK}hfG^8b^ z=6r=CozT+OrpptEfbg}XKGFP=z$iLBtnws~=0pg+V`I#2us{3rQ1OT=1x66)QnSt& zJY=6xQNr4;pMv4VFTyzFuCx9v6BTTft~rLJtu3>mBjRtrej#2hPVoJhDJTvm2!B^7 z^7~Ipm16qn#3{jFJbtCL1L!rF7(M3G5J`(p3;{l{M*>vLi?}?&H5~qxL(X}ZVNHV- zJbxVgdG^XBV0G-G^E-c;SXFezuOCG!lC{s9Oiz=6sf4UST6`N6;$4!IKbpUVW~P10 zk%9_hfDjpP==QnUe@3>pEN$WVNAfmGmZl#D11D=H3d|b!S)1%gOWQGWR`>!h{KiPc zH2s^t{uS3tAe?yi@;g;y-YdD4>@zPr$VFJQjL($%KtK(eg5XD z`qNgNH@`@bedV=Pcs7IMr*Yi%W``{O6Z7Spm*rAo!jd(2>S~@d;`_ZRh@>5z>siKt zwzxvl+1Z%@LdG8$sh8dhIBgc|Y@f@>gTSXv zMe~^ca3VjS8$n2AaG-`mZmnWmwneHU_{Yd_sNc!bsfm|xl#>Y64vbiP=l?Qp&i2iw zS{xd#N8kDsRYrS*R|Tj3_G}oq$Ij@x{WZCf`I;pVSe~pbsa0AO*)A6!RK30QNLs*6Rp?oCS?T=jy&Ud>n?->YVVzPi7Tiv%%Z33Y zv#9znK)QBednlIJnUIrIL8oxcI&AYJ>H5*@s;(Qn0GB6ZU7WsWd(wxLe@5l)+|RGM zaORHw#pv^ThXmviBmDD$^kxQjKtnQC*6F%LjMQRQtmbK>I5mFm#b~Z(cIek4KCfx# zO^tsZ>C4usbG*?d?FT-mb58&H8Ec_}k5oUD5Wzphhpag}`e;`L@8<+oyeNs8Yz8s4U}K z2&AN_K^%}OzGq>`uSmFf=q;hwc4+EV))gK2Z==VYeB}>bK+o&+Xu?|y5(nZn-BxL~ zZJ#c(Q=QY{hHjl1dyXw|p|R4M%gA<@qQTb@5B=qJeE-nBEM4`$e602OK#ePRM=@=? zJcL?%&1}C}6f9V3@X)Vu9g8wxrD#1`dJodZdJYJLWn8{J{wStWvwdxaHD6;8fjj`Q z%Q!xzCe1n()d$wrqUKTSH?|N*D7buNutVT`i^sm^r|?Si@*pA5(`^aU6TSW{?-I!qztOU$_Q^eIryZ}}$(HaVJdjUTGEm*edKqz1^`3FUIc|W~%UEsd%KYQPu zh{m?f#{(AmiP~S}EwOtM}u%P!Dc9VsAZ;}@|FTy|wyqffVob+s`L*a0^Y_@@8}%bpmNYlKJWv7T!tVUV`1NLG zb}%w@)++{a*TPRuUjF9gYhQ6MPsB|*84Ens+KZba)i1*QI3DT{(A@1%Y!z(@NJtVN z1B*)y-LuW_cczx`&--rXYoRfCD5ApcenwX}Jk;u9>1va5(MM$|f09F1tMCWm3M}KG z>%jQEt$h?|6{jVv?pu@R!H0EAnXEp7)&%$KS6e>@^Gw^m!d0?$hmo13Mx22U{jAtv z?kO*m*a7?crdFbMf!;0s-rtb|tFP>nN#8g8jik8yyy{S1uh=UgCxa_l=z*U##t=wd z#`m+kpw9f+#YU5uru2;Um1_s~#)N~o3RYDjmfq!P>O5Ob|LI#5}!-RPn z+((IhR;OJV8!k?nl9m?Utnbj25ccFa^a7Uw1TO-4r+GlYV_}B7GyjPz!hmU7cNHow z^ZqvdewZew4;e&VK(B8Crdpf$t?wq0>)ivcW>q$OYSZGH{ih;-^hgCLNKEM`3*-qf zF>N=L5Ou~F@w5#Bd{kSIXvxrE^@S>=^&Syp4=>RW({r@T-iiwoko(A9t)pyFxo;1l zg-`4%-f64<>w%*+GMr%Xv&Q7dgK^1klM`i2Oa<|9`njIC#OLi8D?DYZ24-8E2FFb; zvd+=yu%=P0GM>3}US#@79- z9@ATy8}C37*IS<$z4|kiI)?*j@d8ytp8n?Q4KbXAE#l6$P`m^UOB^Y6j;M~3>R3wW zFMwEci56RgLdEmVLJ!rFtU`?ag>nmPXAo?UhGB{C9VI-11didt0#*8IP`19IFPOZb!xN+U=phC78iaBV zP1YS@I^+@3v-@d#4tf4KPg~KG`Sb;OLsLK@EH*n3lN<}4<(~G;c{C#)OVR~`$+on# z)N6KY6wH}XWf+L4o}&pq2)Hn@vdJJ3AB}w_q|Z9)`F=_-l8U(HXW`)Kw@j3UUmKdt z-iF-?wZHa)%SUd&LgXM0Q`{AcCl4hHoIP){pycHHN^6%Dejp`1dOO#S2TQKPbVKlqj8e#(p1ShUt^USCj)X!rJ(|!63t=|FSm7oXPyUeWnGUuhH6KB$x3n4VHr z>E6(DmNh04cJKs-BpjAt(-D4b3TT4hd#Y6om{;p)Lb463Sa^Rj`+ z!9fDD0~|C|N^0sReGf*oLcYi%zah^C#Iq6#94M#{Hpbu2cWJ-i~*+P#M zy3N?3OCpCa4goP}>Gr|2B0>UB1Z1lh`CkBGmDfQLS6zcQRwYRD}7$H9Cq zv~lq!)xBwSGKj5x%fSU2nj#Oa=lg&Ww50eXW}>~}hihl7ml{i3<35W7{yM)|yb7f}!X%kf z|21?lq&)u>4Cpn~gQI3cQqQ{?mTr;;yA{zThxJiU5slTsVU~uuwyD5u_n|niY@5h- z2{8;7(8&bS*f0$`7CTa*1AX?*yI+W1K;o`h9hy+&kD$N2Tzr&&7+R4(WVP*U;;XcW z>*sabzy;qdu%d3N2m5yDEzcX2;RY+bhNe zrvIZ+FaLzu#SF5*?&Pk#A5OgT2ZvGmfnYb-)sT7*6QQ;y->dNh1v-Xu+xuRkQA@gNCpaxiF zA7P9~L$2?JOn(xYVhnHpiyg&j3DjU^daec;_^6OWl0FimPhsb5_}kdz>*$|^aaW{^ zO5To|0oOk+DdpJ60b!;9Xq^|X>)P-!`{mX1!TsFn&VA2L<*&b!Nrd1!ptqiHj!}fB zF8nq!QH1#EktgmvSdH=aymMcEpZ9;PoHs3? z=xh+8Z+H$-k9Erkcoy2#0TyESJqa5=_?g6>;!jW|v1s@KE-u+Tw=(a7mzmg-(|t&v z*7q;6w|nQFTB?c5qGk$lDG_xUZW2 z$qyG_V~KjNjcv%%VqX%>4`p&|QI+<7M}mc(fI$}u0>v)VV^GqxP354t{+8R8BTe)B z;Rk%MZTS~NuuQxtDpxI2k5K2H%XsoFnkd>pZ$QAK#I6VC!9c1WVb>3SN1?DyGbREs zHxbCCvd1akK}(H!!#m&amv?6wp`?RttP&*u7M9MaX1Utn@5sV4T^uvaM;xiae|XvS z8V9Nhq*=&G7KX)_;fyG#*x1(qPC-n^rJsyUF>}@}C*r7F~ zV|^4*P2L5Yq9qMasKu($-he-GcbJKnz8D=x){ae3DXkpPKXRCiP2~8$haq(aTTfy#2#uh;#4_FwDh-~KUAf1H76;@bY@V5b#0>M!-8WfnPX>&6vX=`kC?CvV<+%b625m>URtGiiyozbc`P!VUlgc$!dAG6_J})hus5hhBSz^ zEmHI3Trx(VrAqLrhd21I1-gCz(Esvwx19hhT&NeL)pqSMe&QXawg>jisq44#+rdw4 z*)kw0|5>-sGN8azXVKlc7&tSy#dz~<8e*9 z>;*j{IKvLoj7uN?Rc|=?fhgruE zj$kiMVfa2b(+zWPU_kq7ai*L4__EE7MV07F3SzK&Vpnxi&#OLP#gD2CDcTMgL@CXr z2>S1I2&=LyVIAPNclZarQ54sw5R=&TaY_hzO&Zl# zvwj~H)p~kNdfR?OmP43flz4i7w1vCS=-$9t+5|aWwwDGOgmb8=9v(4OdFJCe>1pMda_4?(YDUL|K~6_D|Iz^P+f|T9Q^Cc5N$>;2b>V z_t6}Z^X(M>osn`{nQ}`5Mkjyr`}FOEyic*?y$7H{KC_Uj(VF6aa${8$C$3{59!8i` z)v`c}NfL`U$q^XAifntw9fpQD<~^d1!oEKYc=+&2gW~Pfd9yO&u=ir|GKYFJ8p{?Z z`crN7Bdo=;U%VN<{nVeo)vtHywr`9j;@lE=IoO~?Gh6+BXLDXV=O)~bG>D&2myA44 z{VX_77n$67Z;9c1FQ++D5Epj<>H|amaV)Sea|R`1wh^{}HMoFQF!LJ!1MyJZfN3ys zkh7$2q+H^?f@XTMegSHk6#x}CFVvWw2&G0pQ0tkn;ZmoG0Ngd*nma-Xh0eQ zyc>byr@DGowKWMznUG+-fPFbdO2WM|@eAlKCKtLEoB55GqIR+Rr+B#rELr$FzW(~_ z<2=E?bQQzJy~sM|4#YUl+@jfZ3OEqi4{;2Qp#kJS39C&9d*TmcOrbO#tMKGo$pQ?n z?w!x8yx1|Vy}Pe&UQOV~;);_Jq_GbtG~=PyX6I@5#+{RFPxEcfyFt{7CL_{?uivc@ znEpUYJGFFvm8>jfMrfq;A61MklPF2W!D7NTap2Dx3$y)=AtM@V&>bcJubCGvO9TvpW zh>ojm!3_-!XVHPzo?iCft>p6OSqR?i;InmJ=kD}dHQWwZ)Jr-Tw8*Z9E^PO0`1M7Y zM~|rq3Pk|A69EP9@x++q@_vg)u-w@ki@X}kW(t3A%`;EYTc^r6=-2nGMjW~D4*=Dy zr^QZ?pQk}?PJzC7}MJDp%lbZi@xz}qnJI~3XMAgg*ITl?(NA58-zy?#UYcFTSn(fe{Zi;4@zG%@54bs&tHBkg z8$1oTH%OVt#LkmT9BI}WEtYLwL4;g1M+r#BBFm+GQ$)D|5MPs~EM$yV2jHP=- zp14St$@2+SC$(dfqRVQs{QanZB)K1a_LZjk_?^FFTQwedvMeZcgVLU;EUi4%L1V6Y6(N4*fzk2IG#2^#bq9o3H=)<|30P6>@Q8oMCP<`p3|*oI zClWvP?Ta}TtpTf~Vxbp`)6h9$hUCxS6ye`bb$O|S&VrR51 z>-F>k0^fXx2{ZEvCe7GA7qQ-<^s85H=GVe~so1Vm+YB(tgIL^I-;=qW--<`2tT0tA zLsSK^K;dMQ){@LidM-?rmEc2k z>S$q*alyHA_c7y%|E{<*&PSiKcH$bBm7hEF)c?5oV+k6_vH%Q7(Q~`?>7?AVc1lV` z#e?x^*f)Y5;Mij2)Qc*#iVma1vt}QYS{D7~bHCO_L(KvYDT=yf(^w=CoCfU^igNTuT>oj&hajS8AD>a&7Q5wjW}CRf zV78xV%5r%c?60L?t^z5Sz#eog1n3J(;kvB_TzLuxl~6vcN=4axc%cCSM3l>st2gu3 z52YW|OKVkZ=di_-FYHt~uPu7}XvQ@#8}RR!7$oSWdzy*h67ic?>1B)6!a4KHU8~|K zq}_*}-|R72>++jl z4mK*Yn&`Ph?a9gV?Hl_;N_i^MM_h48LR*&cGUo(ViA0inaxH@ulAJx&#x-t9qn%V4 zsVquti9*Q@@P{rvW~!XV!cuyrmSMX2LA{>Q8JZ{FoRYd}N_J&{n~rdmQ%A%uEN3X? z>P4K)5hB!)HwA}_W@e)K!xzTGY|Ryt6gF$~qpT-6{z~9{f$BjovPltuFbpbrb-7=Q zaPA{*Glf?PBUEHt-kpMC(JCVB#}rDqdKHO^VvWC2)tV5P!-kt6*{2N1SLF(tiDL8?7@Pz@h;sI_SiKqj8DX#p z9;8?7Yku=C{TuoNqJpd9Zh<<%B+_GGkox#C+|Hy?Eq8-LsY; z5jU=uvOOLr9&IE{Q!bG}c@Y~qDCOR3E3aOYus2`bnvE98ltGMnPV?}?Q>D&!m2H|O zT%Yp!TeNQ+1N)qAq{*@D3+Tp?K#Yg%z?z<1GVuSk0MIge;Gvm#J?IDndz-!VGG2zkq|oJRBi$kZ!^Fg-LOyZ&XOl~)7E>nu82{ur4qCdxcu(r=Z@jm1 zT6Vr>W@fL{a2ya`jZ79LfG0la<=Y3KVje{XO0PL>B$D2j2CD0IRO7MK>wYkG2~`|w zIQr`oY>g9vZuVtz^ISe_`b&%@+-{D!eDtrNjZfal=HsSZOkLYeLk6f2L1CYsowDx0 zct+|e2)lGHLJ8Mruoz(56H43K_~6T3HIoXpRB3G1Ff1nV2`W60hA0Q$^Y{Hu z@L-Jf5~6irWvzD$*sdS@evXibpc%nm6IAEI%=^b+!m6pMSxnH0Y_rK6jNXL{t0%OF z-(|ok6zT!Qvz60INxn^LKjV3=RhGSN7A*4bi7 zo+z4|Qhwh~hp?jat9mv)71qC-M1{+i4o)+`R3Sp7g~(!c%YjuReJp{@FZcDq-)}xcu~hY0Xv5A@zMg*=sQNjgFYC<*44ST8 z$*nU_ab2%QrI|}68mS!022y5sCfn*Sw+tY3bJjNOu8aD_Itw8we6sHw;Vpxi5?7(6 zes`B^Koz_qE9Tp?FxZ}hvJ9FTo>hPHe{5$ZkmfkRJZJ@gHVsooi1J14s_l8#CkIZO zwTIR~=4heh)nTVb@ssU7xpTwE0k<9g$Y@z}rXOM#o%fn+vPoq|^)A9Jfmd)!U*>s` zX63`_UmoVr#9Q)Y`U>cMeSoM}S-^%rj+yY_C`$=W5t6(#v4V5k-JO7*IzR6vH+KE+ zUCQU1F{4V(upDZ0sY6R>@whjmO%(0|vx#;+Q|S}XN)d+~lKKzOTD??^?g={JFS5Bb zp-j0sHKOdC`t{AQ5g5ozMC+~{il=GyH`x2_WWK|IQssS6Hss>7L0;8#A)iAuO>q0H zE$>YZm~3KYP#nX^iVKkkn$ptS6J}qtVy3MVD?y;N{Lu7%!IhJgZ`spyQ>Pn?mj`#8 ziMn>PMgngM&sjy&rm8qt(nTfD;QJTyhM!opRbST(&{i#esd=#EoaPG6r=Cn%pe9xS zyx2C8TOyY$5A6(@?uOKL+;YS%W}TY_@h@l9oiSg_PbpI>Ts|nurCLM&eWzz?kKcKx zAj0ty$@8ias4!!=Pi3^=6Zb9Zx*wSV`iKX+lQs;$hwMwsmCvGpFeU^j^XvZNO|vHymVq|#%0?(9>hQ$ZJnZ$+LzVvk*AGS{`U(9 z3MmBQPnr&T$zW`J#n_&sKm5^QQQD63ngB-w@jR#+$Z6SNPk1zsqDER6zbhXx^=ia7 zuHV|wbyb**!QHYfZTxl;)E9wwb8~oBY<)+ufJ}msV$MOpVryr!X#g1CZ4e;{U5Rkf zU7>vH3&o!D?4LZYUs?U=3=!pOvIrhg+^bdOGkNQUv3gKG#1R;D&VwzT3i}HWcac#@n z34a=5CB$c8pU1l<1P=B8sO4JTCl$KPEnLi^CtO=`*idnZnwVFGn=IpEm`$m8`zDhS z!y8tY)Y@9b&52|xNnxQ; z4$I-VGAY{N>azCvlO`*>t*a!}!2hJR!6|Q)^M(Nz2Ix?WA4t}C6$OhQ!Z2%f<~)9h z&i0yQ*C&}LXx0Nyfi&(eYN#!V(jVlA!(AwO>`(k^a)H^p0I_)sadX54xf zjo)TWgL$0t!{2cLOYj;t5H`uycoK;S5l>tmOIQf%<_&*<7Et zL7XWEK`SN&E>&X0j@g341{>+MSJ(gJ=`6#diq^M3bc&R8OG&phNJ)2hcSxr+C?VYq z64H&*A>G{}A>ByVyEx~6-Vb_l>9A*J?X{l#-Os+c4WUQZ`8Be^_11up(|f=8i}X*1GsT})*spnrtB(Av39kF zRxAvfQl2~P?v3am)A&+T!v-7F83)qoc?G`*ldqmrT4&M0Y@ms8qhw(b1_%vr(&zWU zQdPN`ZMezR_6vdIflG|x?0r$Mv9OD zLQ*S^Vr}{Z7pScU$rpiVw~O;;G8qlb$qJ)Zg8FuW2>`wunw)Fq%~$?r!Yi#dr_;Rg z=&cvSe(8leJUi7`bzyj8ft854=f>|CUmnd206L1W+l|dm!zxNWuXjks;D_Lh_|0Dw zHL+ibh6X~$DCn_qaa9P*soz^~EozbzmT^Z-)z#N^n-V&+EgK~xy|BaHQ6wP*u8P%8 zP2HfV}#?u2ZcxXV@VQ--#qP4t19= zww|z1d^L2qFydZJXBo#`!{g3eHWSW~>Ziu3Y4rwH94CLs{gmQWH}>=Pz7HfuoiSWX zmh@}Jj>&iU0Jc_6KieiEP`U>XOc@6q?+_8tza?5NCmUYrqx zKDi2w+iUDm+?NaNcxL$(<_6G^U9-$VH8&$^sZil>G0|hh(?(&FP@8$uYV-z7Xi?GTx~H{Y55MY0_9(97a6W_`|Vkqy8CDno|TIl+XZ#$uPO+ z0=mR66(Af9!HDjDX~&{rJ^fZPBO`Zcvtu^J6sSm9&=GS=auC46g#f5?rQU9dsA2aw zJ$_8+xyAZ4Ws_S@R8M?1B%<(bHjjbgd4DiXHqvG_pczE|Y&ZwXU0zNAfEqNBR@a@R zjuk))$w2$g3;@*}cDVAO`N{kskt35p<|5U!Lk9~uZQ8Mm2i2AN7vvbU5mW@nTz-RJ zWFr@B=0kodk$$#dqAIwK`<$(au;A;5GxbFzd9zGI05D^O@9kwd{d0>od4vcMVK)+{ z{s_Nca1wg^g1`3k^h|OCu$^P-{(q$J=Kb$Cs`%yetQ(n*=JW%Sh_KLLA3S7kpv7xb zsU;3Uy64EH*yUc%?WqeS-XleSZ9bu<$~=~DK2v^Ru+1bZ4DdMNrQ;cslghl3afxP< zW%igIWU~+KuU7GUD`_Sk#2DtSSLD1Ia{-RHv-9OZFnm%?TQrLG)yHAGH&+hh1_l36i zdmqU|Kd$7I*AF^|7T9XSmY7~5<{RcOJT16-R*STSVYdKo_jU3W;<9K&Z8!a z0MK(i3@Hn0Cgi*QO=h5?W~%@8b!~vnSA;ijx;oX)S;OOQ`j*gfENCRGCJ17T)7uJ2Q z!EW-owT-pLJAHamAuPLm6;J<890t_W00j<8=IIv}UOL#6NL%&9+z@*gmtM`8;tq37 z)=_ZpdYM<454>tXUHuR0IY&bO^rTzrFh4|f<+*>0hg)btLZ9}UjFj&%zwzTy6}_aH zrmpUA6+=YdtnH{~*t-v9iY0{}9|8_Z3Sy=FC&Be(+BM;YS%kZ9GcFwEn>VOEM*&+O zpBB6-C8^;E?y6;?W8y%)VC3w&)rAg1dMb!-v(AJ7=Owk1jqn@oiT-^-T56s50Bvbr{pJk zlu^udc>qcs8+{;SI)DAARe2Qv;{Y`ExfAD>Gv9o;NgK`H4sH_+&( zJS@GI^7He$d9&Pna&qCTcl&>sw_+bpXWlZvyfu?ToF<@Q3-sPUM2P&j;zmL4hAv<{ za^W_3=k|edT;vd1IDpO$AXG(G{$fzZ{$=6b@od89T%%U$l+wuu^1%Q@>FmTftWJ&h z8}}oIoE8s}`zZK~gMx9&#In7b*|}pa1IqKPsAC@uoPeYAz7{r`GTeG5waoMnZ(&Y1 zB};sE>3kc1NXKsP%_94hnZInr29AoYsWcy9McFtj_xLN`L|P0%fd^zd2KbB+7yy$F zCo-g@mi_`5H4C8%gC>Lww%~Mc{RC15|0GxM*;b<^3+Fi9`TuF*I5({D`dcW(4^5!D z)J3b-oDy$Pg^k3*Gh2rmb2R#E6B&lGG6kncPTAJdj1dfY*+ocw7b#&QVv}zY3#TSQ zk7}X&5(`-Lc)f8xs)UC4kgsv@A3u<%R!x~a|CcrXpsrijJ*K$Y%YY2qEh8^XEIH@{ zsv~S}9|~MCu?@Y7=zvZwweD4n4Jk~@zckRac_$P*SB=v>I$$f@5O)q&N9DVcMkTd& za@`1?!!XW!BAB29``*cR%@^XYWD#7t!?2y0v|Yw<=&~O4S}0h)NahZo?F#fz_c7Uj zwtla zmED;kolBID2!%Ffo*K&lJm;U$bL}vNDtuwve+*!9+Pvc4z0OrU@6}&!tTmM}F_EpD zD{Wijc7a0p2xsq|>DcI!p}7pH8aEZ0Kvh|Ue7fsKLRCBYm{(1DibBW)%CUQRE1HId z-h}RK@CZ%Sedh9ug5S)vB9EN{#Ylt%9*80F(;vhM?e?azep+AYlb9*i~IZbf>{J;Hi+yLxKJNRjCkD(Bu z*X6)A#=jY_IY))Bheqf0oPT@{x4G^KE`f?g7)XCVMy!3A^}G&<7VD_7&46OlTOgSd zNko0Jo}9@u5cn8vtn#^)j`Pn;e_r?+GG$d0JO_*?kyD2BpE1va!VF>TKPo$0$Yp^4 zD`I+r{XN4NH+khylBml7J_Kawg`?4Rjh?Wsukk(rvZF>O!n=P-jO*#omj=T{U)qDX zf>@&tjzL1~`=54W6)@E#iEu-fY=8Hi%wtXR3(EHBO z5?w+3S?nD@c!72?pod>@;V4Er1eAU@Dby%?e=|4*QM`kM90oXsBD z6BeuJM^clwV?2sASJQpOxl)~3Nep(%|6pgqA6~LaQld}lbXGy4RSif0^#b2pyk47; znQqOp@G`sDn5V|O@ih0#bUOQiY8#xa6gbf@=cWw(J}CQ>+MfELzFGV}NNo6ZC% zBvRy%9Nm-`d{~4&kryi_@(yOB7=}#HjXdv9_k?o3(NPY9Fw10817yrIe9Y|X?!KiNxc zcX~YayeFoiRS=-!X)~LOso|G@6=CTzo$lPa$i(0n;5&Jczj}_PnR$gCha>^mX2Xa5 ze5gRnD~eJM7O*yz4d`2Pj`6ZETp#$GfDp&%z?qUFe_r<{F1v|H#2yS*`Qefm zh$L1L08m4cCFF0QfR!+x8-;dgCy1JZ7j;D)H$>NI$p*zhf3^hMZB6dusP-3`|Fi=J z-G+=NWZFzGcPk8zBuvc7+SLZM^Mr#zBu)x3WKDOx^+IjFCJy~B;A_LDRW`kw3*dOL zTBhAS;ehBut?p6@u+>oKW3$H=raUCHDX? z5?NeZ%_<7zJZwkC>-B#%jPS)-EEo+%`};3FewN17@)CfK1JYmz78(k4U|-PsQqkJx z+fU2xUu(GL`ONx?YBWK1_NgS#tQKl~_{B^32pi*y;&#-OF_>RWhrY3FaUp4U@bzVL zJG0f(t!gbOXFT8@;dt8%7nBA>(cKiWh$Ol-FRZ}}EQ#UWG9g}OZ_tmhDbi>gc9ypL zjqp8Q>~>^fJht$DmS|h!yDK3Qwpf$Nvkdy<|4YJr$2TqH_1Y0hzRF<0_y=vwT71^R z2Son6st+`^C@DOI?4Yi6Yw5w=&|d%Mh3f?hOqmm^bN(3kM@OJ%$`r8JR5ykOkr2QF zpFmn*CjKXSKD`RO+QG$@6$py}pd77cug)i~4hkL@6Q`esL5CSIZ?(7;xy!~eIOSp{ zTrCSS2u={wcCa2yz99Top2g700H~r?XO5OBszkWnSGG5}wHQ{gAo@bs7c&VC*ORqE zqkjim?dUlA%ak<~`^88t&Y)1j1j9vu0&L$vjj8|FPS*u*=#hbC=P?0r1c!n}auY_T z_h$V}pJI3(BLe2a`e@%hgS7yL0O%Nk7PxVN$O0WTi; z5~Zd{tBzwMy#ks1|FE^(sWL32^&Q3!`oCH@O!4*NEWgPu4 zoZOw&D-q)a^O{L3&I4)yTDv?+XxoW(>*q*sqotM2&@ZeQf;)ssowEL${LLf2mlXse zLFz}L9I8sBH@@JEvyc@Zs$Tl)#K8uPB>)1< zzNPjD&gm9&DpaAvu#2q?fsgEfh?>N#>{g+Era5Prm4`w=W_pX79793k{a0a{Zf6loaCMEwl+BeU8__V}$Sl|I>DW z>j)rR-L|Z!wC}2m5RQY{l`zSqS`GxPF-a~k=c3V2ntnnYop@ISzs+keAnK;fWWb^fKh4m5}o z-w28UO;1ORg1Fg`GQy)*b_|N1Oq$97LwtdTFuYt|JDm%nzLksIIYL)AS1ISKx_$^{ z$l$#-r+1uZl=U|{aLPbMXK24$u|FMS$g;j*;)TSe0Rn5~Qg7%NL>46bPj)tMPHsmm z9#Sg>dg4d>K}q5iXtmj?W9op_LiXoz+<&CSUwbJ7fHZyVg5U3j-33hSkiKbI)|wBF zyF&sks0vB(=A83yHKQd*RDx;|iiS}9=VYHyei)}UXV&8v>Wa@<=_+GyO?F58)7HnV z;LSPfdj9IF8R6avBA{`gejK&sH8dwXmpFcgQ<9Hw?O#?SIpNz}zaK>$OMXZ{zR1bu zxkcmI21Iikd)B)lcKjmcLSPdL__1QDOO*ty&mUw(gJeesG73#opw3Mk`y>}XAI%;? zD0X?gurHh4q}0i@#JzA5QM9O3%@~2PInY4ii%~VHJ&dXtG@)K)t7*h zY|9*IHUaF)@^!Xu?mabOrJs%f-B@evzZVuALRkjq1oFMViCl+P8Flk}iHj4f!7C$I zk$tJCpjxT0iwGU9@zpHln=|X_Wswo+79W0&ySDbI)wm<-tQhHPEd>&@!3!XOf`}j! zSZUgDjrIWV1jadm0U!+D!~5qMw>e5$Mkvt0X>+i$`3;WXt_v?1J5sX&<}_r{zvA2% zE}ANs$&zPOkwp4Fkf6kFzzO_u{?y(L(D&@|3g|Nr(zEkLPnsN)o=We$CHDrV4n~o2 zz98Wdmc#_LADB$*`gI`reK9|$T|>;@jYVOY45G;~p<3qpItr`)B^En|z`v9)dgt_k z&Ts-GAs84oIO9ypqIz%@dhKXQW{xLl)$?BWj$nuvV1s{MM{k>5E&*y%7{r^S;XQVU zl4RnH=`yH)+3f8%R(trf2{0g`zN#If%Zzbacrm@xfXX$V0E$a=hmlrYYqY_53- zw10VnuB&}K@tk$%6+$vYEW-@2&eh)cr#7qqV*%Fkm4~iwF{4wHI5Fv=a*lbzy<|q5 zRecSRDB7i?9Yf9(^2f$6$G}t7e&U(xOUpAJC$~S^y?B|f*J_K3)m~8Y&l__{Z-)P? zT7Wm`*HBDq0F|mwn;%csRA9Rkhy@-Lj)6ckiTMj)ZcAJqahV5S&nrm!O-e7Hxcx@= zR3>=NwP)skUd8x`j~*i>UN+`JuDyg$ZwIh3g&f-1PkY24tdF+VgoUxZF1J~MFn?2o&~4^=gHfOmwH?`?3gV}g)zL(Gs#kwAskC53!p&CWE7qM zPW@gB0P0krv)^;@yVo%~Q?6!1LZwfFDIe=k+a_2QB>MS@s+K?CUzq~Ig60yK*pNI} z9e02Z7w_^6auWmPF)@G^UoeBa6u;0M_9sYIjBZTD4MkgsE4x+yM*ev;6ZL7}qAHGragiYAzSr*ib zZRRRXjx%_)yrW_zVS%+P)?NYlYr(oBIC?t?|F%ccYgpxZqIE!#`ub=6i}pbFB_+JS zX)m~*bo?8lE7>>+w2A^Aj!r_UPXf7Twv~L@}}1zg4*K=AipwypRh9w1=eTB zm?Ece;BAklV(suuJ`d(lT;$gU6U4QC%vnCg0%Z)vNXNk!xx$OcE+kV=Pqxr=$eK)P z*VTp^=?Uy+OvR!7tvy@!Re&x-zA}vqbU@BW5BNQbkvcxKzm~`xALs!R{{2t{C`4$n zGO>agDbYp|08;N!U?WS}{l?VFRTX9{zyHYnnQhxQTZiEJT{hu$?3v1CcK~dlTuzQS zrq)tj^X}Sw@a@JUd6M_!nxgOk$|waZqH9k6&PLE^Xa+*2)tFBSwg|OtgY# z@u*j5E}PAL@)${JR;W)Fi+rmrDz~dhrO6%`U`laHukb3vct#<+5!HlcAq*hEK~-OXklP zmHmotJ#*$i^;g=*TUU*FROu;pUQLkJD32`0L?P8qsLS5mFdOPh2Yfz0e#iO(GXR)3cut_4sFtry%XBU5!4}g9`kwET=TTCw%-p4Y{3SLnyG@U5z^AF1yhmuU{81`wVq!92$?~Jbr`tziAxQ}WG!l}gvzo;LLFw1H<()-OL1Y@5E(8?ialCa;2G+c!L5&_ydpa51?S$l-DV{@(1w7>sB-!1Q&wEjD{MeoT~pNZ z>Q4TPFmV~Q|1WH{G+xOc!{@@p`N-T;yyChUY65h?&%r?ONtMPC9tH9LF1%ItbrrRs zQPFbVi6j*jnw^&DFPE>0PNF2{s*k|&OKKvmMTGroF4m6UAUOO)boWB*D7d3As*Abn?5HBb!H zzk|(W&0ztJuGIhtCx*No2HF$CE?u?B&tU4OHiv;k_{$Irmls7OSdU*KkC4-Kvs{@_ z&{Jt>4DEQf%{=5TuY2vR4AR4P=86O0$KfJWEsX&PYAHNJz9-uoQ+c9i9d8WigbkZpaC(2EmaCk|mr_GXU8O#LeaEU>@G)~F z)Pdz;>rF}-eYzBfr&4exErZD0c)d?=eP2g0!Fzq9<}PKx(5u!G(Ty30%5iaLJ ze2o!&5vvR0>ZOS}^2Gw`;UZqu4KEM1A9jYqj&npEeR&0UL?Y`=igR*UZhso7rynog z4LqMTq>FDPDj)}zXm0hidY{FK1PCq!P%;zeaqlM< z33`5Y6m`h1WAlU!#~UOas4x)(LOFGol%nx~32Z`M%@Yh!g!NC{d#ll=tCmRUJ^7XS zgQ!tx_piQ7klC$Hk({B%S7S3WGJb=f{V9``nZjbhoiTgCP%Yj$f%*IMu~Gh{%=_X# zIrF`vljk7{utIA0lBdaXgr}Jfe(7^NyB?{edm?#VK6ebm?X_ZQpXFgV53&+X(=vgB zDz1N{Q0C3$+gcPTjPkAH@}PwqbB5+P_6_}~^VRDUgSrXqzm1l5zO7PVBDzz?HrUdYW};;KO1%5_=lKq&3Na`Eh=%Om$4{9 zjdZSu{?A2p=p3S}3xr2ai`rbQ_)|HrarWynLpL`rx2__MDEwfandALs8;%~12+82! z?jx{GcHd2HrWMIX+Z=PaT%?l)%hsIi$!&zGtE&FN6?*0w#9`bRNE;RG(;1~V%|^(S z=QvSa{Ukzw71K_Phu491kkykj6~_7cvEm1>7u-?@3keHjtRvEJNE55_3%3Kxr5XNe%d7Kfr+jvEO@yN)8| z5<>;b62|p;7kbl^N_!k)w10FF_VPSe|7+7jWnUAo=o3Jp@+5XMKyKcblac?9qDaO9 zv3N>SoFj~qsB$%&Zq{3n*)|OBW`Vb}qLcPA#D6V%^vaFVdq-Y6YYEGB%-AQ=!NioG zH3MrUadBT-^P>Pu7GAG($;X}eKwN3z_*8AhQnU&4hy_`iM@lt;x?~F6^?@r>ah8p1 z!>|F$ES-*%9U8Vu4cS5*a&aVdyX=37F209-$VOCLx&^rLqZ+mXh8>b32#{`xRoFdD zx32pvG8aV?)~<=UsCdzj(y&nP)YO!vjf8IJQ;Zfc8+YvaSs5xMYZ{&E+Ah%u%&>am zp`!7QFEkl7jjD5K$mD;NWJKX@xCyk-s&YbC6cEOr;oD?Bx*B^1ZxOveMtFtI|%LDev@YCfC0S`g0{aAjD}7An)rus zA^ngG5xU{%)bY_?YztE zwxG)sbtCXgibqS>tJFl8%zndY2n$aRYx5VwaT;N-+0t@FBYx7%zDv^@rg(?g63<`C zOv&t^!&glNQqZ{yaTHDz3Xu0Q5ZK*9!Ot?&ud`0krOI`L_J^S-sa zcI6@r1|tKO)1lF+^xZL>6|r~?ci3H6_N54TS!6^J-UYcBD@Ua9@{w)_JK<*A=6>8Z z9nk12&cXfzm-N*6yh%%L8`q7etN->ejS#niH==pF4w6@&{{G@)Y=|VKPL>%t=H}j0 z{v8o3?;E`qbyqrQQGYQ%Fa3#yqpqL#&3|?y7Kko=u=R8vgMeiVoShUgdW1Q8L2 zA?v>7V_N_G>SLEq|6JRVC+ncJGRhclb%vp&{N{f?(+c+EwKM&uZcbq^B_61p~8GL z;3K&kwiwh*ngK^e?61#M)+%P3~gxRc)YTVy7%sq`|rEQzmomP!?8+y zrA1g>(}cOhw9=jX#1z@6urfxH7@jRvqGMgM>1I4p_udZiv*#4`NCj$%(e8zzR>NUe zDtn!KX8eJpljVt5aGt_S2kSVT}tK+d^5sh-7AwA5>yNRZ4`MUfCz)<=B=os7bf6+ohOfu4C66? zwC>K-ciy6;yg2BO;iO6o>9X4M?GxoDN~$EdtxoOo#UR)i@%ET086RZ!F_Je^;0cS( zz&1!V0F$RBux2$hFwctaxh#Kjy#M%QdtqQ5hh9kmwUV0pj?lSTw7Ch*nr+AKDW!`N zeIMw_($X>~_nXGFjD)b; z1LMb7Ucx0@W*gDCO{z>!o@6%EyKG-in7JcDRZCPv9w-Z6DRL3)R}}P_S4GYW(0QsU%zM8Q zyMN(_cG}!uUnJsDQ7M5*+|@tVs9_Y9UV9H9X_szj&0Mxf4TZ`-L*#_~G|u~d#AykU z-}0G>EIY~&I}?WtMch!M)x0F6j%5tVyoW~8E|2b znMkXB5A4-|CMiP~c~96%QpR#FG`C>8t3=p4Kn`G-PoSH{QQxp}q*Bzuf|^OD=Bgh! zN1T?H7Out9;=TTACQ#`DZj!tJgqtSz@4MEkHYWKoz=6bx8$p2r-JS`Su8n!>qb~4K z$%wW^5yF}hXkfIyWnxn%z=^dAW{28VV2U8{6bHs_rk3l7HryqdI;fz|A!gO4u~?}8 z7Rc)(2FC~!GxeX>ke9bt-eD%+V7arUQNdia%vY`@Gf|6>8gk6R*a(yrg$%yW1n@yn zKONR)K};yNCfGwG3HLd~Tk^)YyJ1iRI%CRqgEgo|9h;mFHY_n2RG3>x! zxyhbZOS0G0!!+r*nDVG-NyPgH;Yh^%Yn-^eWNM;TA!yr8NirM9HLS!1gL=*c=ibxC zTB-)uKb-m<P*&QB^G!0V1xCpXnuzzK@h^NCyDayYB%D+GP z(rCBR>|G@)6qS?$R_yF7t?fcO4TWV?7?m%t2DtUk_U4D!1i8da^J+sQn_FO7)Ww;? zXTi1)dvv#7KO)tG`R$|Zley@ae|hV()g_3Y&*-l&5jWX}V9Xf{i7Q|)cz(=T%G8*j zTqe>ot7f>n)0pdiMNGM{EFpsMRf9Zn0Byt8c=$*{TpZ4Rt*x9B50#8usFPiuX1KV~ zE8;o1a8_L^<>Dc_LPnd#JiIPUhoWpcGrfi!y1dHHccoD7rtps|*09CG_~&jB%E}PS zi_bmmIzL0(*jaLvDq^%Hn6KZ^57SbX$4D2%x`Hqv4}=)_Tb7i4rR5co1gP*n*ZmlF z;^N}}9=d{zk6rfccPL+edkW+bGtC7~ z1p-VtHzZCN+jiu*>AixYwsOr^BRo*%K3r}imMbp@t(&U%vxer|Tr1;b?=+Jbi_0ri z|1GZl{W-PcqVi2zQoW)7!6z@UPhZ5h0(_VnU^3p&FZ;dN65XaJgN*CDzPL(wZU zAhI{ezEr*_A|W~18G@6ToQ%bXOFm+uRWv2uGAFdn9kuzCR}k{nvTCVO=K0BB8M=64 z4C%FL+TkSl2xu7P$OJ~g0W8cue(RBSE(%9i6N~jjEY9~0EjZeuVKlJ?a`K!!)5529 zxJULjLHd<`IVHLqxodloV1A=DZ93`v)*f_qBFV=EJQV_wQFeCr#q;y?evpnUnXtxv zMtl8$H}HmSWWKL;7Zq>1LX9C{Vp?4zG>S;5(sTDBTfxW0ES9{$bmepVZEbCBTC&?= zM?k=`r0DirFczGX@25i_I5)6CAHbAh*_vktxd7f+#wCs*QVtrFE1aDz(E^W=w z8w{->{zFvVc=?P)K%o4e;YY2cnFfv-3HEXO(WOph6^oB7c$7Nzq&J_CezWkDZjQZY zK@Fmr6-YmG9Q8db{#rUX{8!Y&p)FSSPYI%H|JPsH3r(DLMvo1@!ad-F$d$5xzZ@f8 z<|FO!es3SYqwVo^I+?8x@=j6O2aUA`K6K|p&n<<;@3l^@_m-Kr%BSkdPKRg9bK4yo zyMu$2l`-gAkbqUl#Y*{iHchhW`yH&{_|Axp9bx^f^Y>Y=Q8lw| z`?>nRW*cMRZg0$&+^t4}cUf|^^Rz3{{>PW;sf1b;6Pwic`0@@n;T}UCuD>`iUpr2( zBiny8ZE9jzGic@!-+)>9~NH@7SBQL*%1&kXY%uxU-cwKLvU`oe|3ZCk!fAZlhAm&KNgp5$%`j z*PXYkF%X=2S527qY&ugW%>}*HOV?8~mzOvHxo~UuKABFreg=FKh~cIMX*wS~VgG_e zy)O9P316zub8);sP%v%?y5Di27Ab&Olr5<9R0olmD8@X1N9l{s1$q!L38=i8hIsI# z`mNy?CkB0?`)08SjV}FKW?^Ly4sQtjX{r;mjE1*Zt*-epV}Vt}q)>TFB=!~c&k!HLw9m=)YOg zQd3iFekx?%9f9r339Ll#^0BAGLpt(Z=4d|(BO?JEri|BUaR0tsbVTJX+aaxs5R32n ztAGElx(+TJA(cBm#-9}H*1&h(pxR9G4n2b&N*dYvWum~vD##U_wW|MckVsGN|GEJ2 z)i-hP_h}^2QVY!2sHI*^=fwHpk|1B!2KSlAZ#+87zuoY+#5LC5=z~_}b-qb@SJty+ zo6r_uEWQhjouN2D)>+6|9S@p)6z7;rqn;=|5K4VduBrOGr!S}*YS}&Ii~$5(*IX_q zy3}&fxI;-;0$e}5Fd}4D_aV&GIFB4X)y*Jl5&87$c)3l_m^tQ;k-P zi;u6g(Tg7Wd5d!YApdHz`!X{C3Mk*hukPj{1T?)Ui?x*U$N^)1@68h1m23olp10$( zZd~WAno?o8ck0LAhh^AzXd&W}5_XMRXi)l$o&Em8>T`&>Wp>SK%8e6*c^ zf?~@@_Vf@tME<1vRZQI=d0s!%2z`DTO;?Hr zOx5a5QEmAk%Ce^uofSVG;hSzkgdQ)EkLT9qufWF?pS;F06{mF=+4V}}Bw z(VkpCEE2p1woFM_Tk9?VHBw()?I5P3x)ueY*?=X~Ya-HNTqpTu5x6dj!mZ8>-FQ!9 z3QJ6^ufE4n+y2nxc90*HI#|~ZFhh(!zsQJsKQbYJodlIH?|U08cI{zkcA3$NV31jR zjVpw^Hl=DyAO|X+JN{NC)C>@OIXv^o}HGH#9UDw2BUgMgJXS4OE2J z0-)S{g^&6bf_HuH#&mq}=2>6TC@$Ogh8z_hrm(1Jv(2LWr1L2p8IsWYSUECuJAw-v ztwS`FUlXc|3Dq%>OMaHsTS`e6Dp?bhK?89|X{IkKECdnBnefc#sK%9F#!ErSK~O4= z{pr-z7s>X}F=*E0vdS!TTg!V>Hv@$NjsrSBFoi28D4z~NgkF~6YvkXcVHLPadis_K z&7^W7*kSw%IgAgSpTLzRCbB{=Yg6yHKe~ZUmHg~{&~T*L z3N{N;0!SO$B9U?Y>IAob0`4k5vzTLp*{13Srl|2i2u{1yFS zK=UmKL@v6kV(^#CK@2q2B6&xQBO|eUdsZWrx@i9hhC|J@p%QV1U}uz1LieT&#dkS0v?*JGpcoSUml56B?;sHI1P zRFUQPq!}zaxnq&-THy9KY&js6`ne0)DZr>LQtpI7z|!@+WvGx(;;lloSJ`i zxDp|v4g-6$|4!|f6wP|Q^m;5pmuK@@{{ipui{tHrN;|1sA#zenZKU#~q~dvEo}>#K zD9T1J72iJ?-tZ^U*MEy<$@b&%gHU88DQ;R7j{42+ihF^Z!n6?7T6yCXP5i%=3W2!m z+aO=O`)CNn%gY-jv>*GZfC%IKqVXQ(PXZV_E*Amk(64f9-3)ZeAX(dq2aBJCk09|Gs}12SkRRM+J*N#{6&v zpY=HGZF)w5xkUJ<7XoE>CuGJR*eyE13HIq=xI~|~c4_8N^&_}-{Q=SzW^)|eZ@=;kuAQ{{| z3Kwf7?I^t}CX!KHprhhBvFDy6 zUnxVZTKn}q@UTrjYQv?~co=A3j94o>W^|Oe?|4t!p68_C>k>MU%iA6k9eiNwqd(*P z2avv0#|A}=t_j@cnRHq0GZD&8Lv#?*zBQ1H_1Wq^`P5jm>Jw;YF$he|cgSf!@{^#u zTXW8|TXY%Q!v`VR?D$0)b$k^Sm59Nip|^XB41Ui(!C9ajp}YEz;-6RR#+r997(mXC zq~Occ5$w|TwzQkkB`~a|&g6?2qr*cNp@-v%{wG~ygrUpRk{DnC1kMvt z--GRG_fP z5br{$TisJ+Qivxkcij=vF@EZ?%zGmSNJ=7dU&T2)OOK3y_rrM5jiH5wg&dqX-}Bc@ zEqEraC3r41V-^+!`^}M*s^g=&zqr#)|Vqt0?o_mh1wvIDuVWwtf&6;k64YZDd zeUUeHP`mMY--Xv+!Qmv&kmX15k01VEZ|*R!U~3RTj3pyGJd8Ejv@jGRRr9CkQk9gH zV%7U7sZ57pz+mlI5X{IbDA*)1=?yAO`kjB23Q63$f|lm04A8ICsP~SUR-~7+1;rd9 zwD_?hB&(?z73oAV(chbRXQ(E?1pUogPm#_Ok&(nju4$6Tb(dypFfLjlVow+lZLcq9 zL_Wn#0nus?d3LmZ14wNS7n(ILG?-ib!^4qZDps2&lR;jlho7hC$^$wLCBypr|KRis zqmV70xJV>1>Xcepm5d<2vj-WLkI`T0Z!G~LB{@q|82L8LkO_03XCS9|rjCDe)te^k zzH3Erc=ff%wild6$4m8u?2M@&(8@Kb6vw|5mA63lC^m9;IiXV7K3d8V^(wb;Gzui% zWpch8F1*C=k6%gJ;@#)HausrtS>3r{ zya+iVM;{nFK}EF$!3p(|&qWOqunG4+!@_n!iX$s0XXe9CrNE%js$f6{bpC<$V2V1Gb0v^MgA+DefOT5(1KFqziNq z$ji$wLjLU9^hH#*P)Ki+?4QI0J2-`$IcmYFiGJG`^NFIf5mWU11{YF>^>fi{jE^rf z{LQWD7qvFeC5TW;J3C7ZCv<5gdmn><$_%$U!JqsnUl2%rjLN2AU8_r;1T}0tzvt`k ze$Q9;8#ej|hw>AutZdt&pEL1Mf9Hr1TRAr`E#kzkAsKPZAF-BCv%wA3XaiI&mbG}K z_$ng7d#T%;YQ5yew;UHeWO3Cu7~jmZKFpvn`y1iiJh-3rhrh8ZhbTiCXsN(7#aX)R z=sXM(AfFj8?O~QPRFVg#!Q!IUNG}ULp8gKL%)&$*h>AvQ8yw1DlU?;%1W#YL20F1k zm%#1cr5d%f53Z)e$(R#ytI=UGuTE-#mkkYNwrqP+(|>c?(E$mKCYIU5GoRYP!~DLv z92V0LbF_E#W~^soE{k)_9yAY4Ej@?`=SCLzcU^kF{iP3>KkzX*_RO`T`un-N4Od&6 z!-?=UDr%175*I4(jvM9OgZuif4Q}fZK?G~jJruad3!of|{f9mb_(Wr~Z$x2qVUlLw zL^zcsXnV)m{lWfzn0%tssF-rRK3>^O_;dF_aO|c>*axzF&q}}H#}A%7?t5#`5f}Q; zz$gm^0 z@QYJ>F1kT0Oj+?@Y%wScsDGBFdbu|{cesp<8)M)79$ZK1mqpLTj|<{PqD)qQ%?WcW zgndIxmN{!ZzsNhHnxi20hI$el$~JP+CEVA43jwfZPdl&Uys zHbY_#9DFa*Q!XN}IjzfgmcOs2%&mOaKjWcUn^~o~;~{$%)dzrlhWB)HjtKR_$^fOu zgf#cvt~LmFrN>yhLXALb{`2Yf8Rj<&CTG2m9bHvHBag_U3P#MQfQ33d69X^!-tR$i zY*ii3a>CrGn+JVRa`N!vycI$I!@Jv_0Zl% zR9rknQ%Wq~W;1~QghNvB%Wi9oHATsShc4o0p`JA<7zAzWS=GxgE+$`EHllRN=(}6N z>aguPSy3062kgHG=MY9q9mZz{f`2IXbiUkU^XoFgz|hg4lJ<5W-mMC?qt!M;gX=%V ziOIM)@s~wFHRsjM3-2%u^8C3H*=x5%MuP-y0;r>~;-SWZ?#F1W&xnLTjexEZO6a8nLc5V@_O)a^kF-Fx(_vnfS|!=%(T{u z6%7@&HApq*3PnYT( z@2p_HlG_RM5K;3ZAoY2*=qJB&^WFl*jUPyi%-5LPs9M!mAg9Q~8w0VcfrjF@w@%rY z)CU<4R0T34^nd?q(BOfl@wxlQCndXAaEmZ##V+I$+H+ zl^&!KKo|Q==G~dZMz+(W;PhGm&Hl}e1)Z631s(g&OW#=-`7_P!G1F%ns8hB=K*;~8 z3^^r$!19v}xFh|z#z4nZ5n;hgnEryrXS08ZC+LQ1Bil~DC{+>mz4GnRd;?f*9uScI z2QhJK3m75BOz%O?dzx~NukM2h{*CB!8bFs`8?w`USKxSs9lua4TwFtqFe4UzO9Wiq zzB@1IZ;bqSed%rp;((2Cn>IR|^H*BwgBLc_)q~4Ej1AYvLH&5;dkho7o(ZsB)ikos;B`_&ZaBV|F5XG zj*9a8-oJ;C5RgVna%iMeQUs(+T3SL{knV<|8zd#Ak?uxPx;rIA8l>fS=KcAu=W*#j zE@kGvPwl<0*R{`LI4Gu(;d4Q*%NL5F6A+*H5`G<3`)Zo+O@WVie@=L(BeI@-=`^v) z|HIwxta8yzP$?Bom9H?6meot{eK;@W`So5h$>|2``a^vAoxeqLA7=3Sd-p&Ona z9~2nQiQgA_QhuoE7J2cxA3FzB1n(EJ?^P#17am(5E}E6tDx!i@=`@M=bLp^C32aki z7HlFi0<3Gea%i3t@Nf>quX6TFv*CQscWBZ&wY8l zjFIRq$_L5&R90MEOl+U-r-zz1Q!>;C5~8qoUqEv&V-Dg^N1Ju|8(E`vDci1f&Bqts zME_LpuNQx^FWM1+6<0E z$ozSpf62{g&wA8JuZGmSgZsD)<=MOn`}M{DWfYzeVGk1W3Rb*fR36)phA2-Y&Ri+e zc=_ku>xzw08G9ShI(H#TiFEW|e+f%&SKVZLe?%E=aHGBR^j<2rw}cy~x-;0~Ej^S_*-2sV)SPwQ zFRg|9$_u0##$lOTF)40=eYB{kDAwaNT}U!l{UCTyWK43EnEFp;8pYgndf7=80-&ut z5Phm>GA|;KuXoz{k;f85`31M3FJfvf$NRY}3|@xh!v!Wjb*;jq;68+=eloGUc^Y0m ze*GH;hX5s>92|R{dlA@(S0L8UU(cGeP&&ort%^hCWXwfi%FRN9=dU=EcmYSImd>s@ z3l_eOWzfykq;c!HPJ5b+j~Ea>r>6-(>`(8$;(ozMahD+0|9?CcF)4MvcadS*+`#N- zHO7IV$xV3L212#^X0_b49B8AY+#^W9%Iw>aXfHoaKSk02;=#Q8yx@LWwWM5^W!RMz znul*Ec5coj{>cZGG3@$6mR(Ld_2*FXpN@zTZ@>kO@;h=H-a(y_nk*G%|4218wKg+U z9KNE!B%q)M8&t$TNtOl5d7Q?!K`~e-VoM(D=@(xeOvs)2(l?*>2>ix_&3#O&P~Q%c z4#aFX$b(Vt1(fgEL1sPGXgCpvmZA|l;y2&Ct{qWK{O>oY!o7Mg@<`7dt@wxL%7B7K z^+U~Nx$AcT4rpomMqy`fSc2|F6X>bm`Apn1;#)`~a4~ygJ=2{VDGUg$BJkVe)n{X^ zatT@+?+NdwL&6DK6j&RGbabg%S<>$A z?lO%3lr3B8?;jqNEF>)h5ve&A?-1P(J;!c&^~{j8_euIZ)Bm32i*QB*a^`W&5iu`p zq0yZ8fzu&nq;uJbsEs2Ya%cx3re}eP2)ZbF)IF|0I!yPYoSgOhz%;oOjUc`+_YiUj zXgDi~{v-usOn1Ke-Q@`4qEz|43H(koYg#aa=tY#O{aZdvzL)N%8sdAzIkw$=;}(U# zm1-Pl22@>Dad!>6ti1J?76F}8Ra~9;v(mByyL3&c4S(~Bi;&p=_Yq(?Gy1(i;AF?h!oi3Fzso`>xp&cp@{gVF>qWW6;! zDE{ zZiY76ECniaU`{A8$qJ;R`?tlT__tj?)ATthOzhMgQ-o+CBfdNLQ_~=HK)o83t%T!^ zn%b-<+AoPKCO^2jV}YsUu+WD;A2#k2PIcmx;#5tuO{c(R6~|ab$H0jq?A}i{4(b}P zOZp3OdB2Z$`IVA(=U{&_i-;caG0*U5ZDb_HmogB#tl7zdeP;Hsn>l02qs$ zxw-j3Z=(Jr5wkTYb}w7*NgH|J>G4iXrT2c;(omEXWCD|An;4e0r7o+TI_{{clTay> z-U#%je@jU$6G%u%mgpP9uU$0bqJ%D;cM^Yz?q>$`Y+921$+)l*I$jM+Gee#g=8PV$ zXX98$Yojf`n`$z!Km0bOjTT_>Tf!DtxL$lN@~S-DjYU2ur*qz zX21+e9Mm^_C#KBq@bA*@e4xkg;omu{id-+Y-k&LHCOz#asLGlilGatW9jp)A^2Qr` z_Y#IXuHzmvL-TK0fRo~UwUp$kpIOQBoHdWE@VL{5G&#Od1fax_ov$iLjcqQp&VBrk ztwaU9?%f(-Nt1jPpBHP+;^eFA;9IapdLn@mZSh58VqSbWQYvHR=~r6Xm?a|)nS9aX z6t%3c6RnIBipu#^$zh$_v)dT{!9B)4{a>fg6~dV#=uG(1=@OC_xGc_7m&)B*=_)Bh zkNI8KKOkK@q~B&*omETGdE)866NEi{T0r@s=m5)iQ4Y3BERw+j?rp*5V*%`7sUmXy0NTN009?Q?Zo#& zxH@3&(#`hKXYc^gvL6#AVuAHENFlpa?qh^nrn|8Ang=SJcHw&MBSlrk;fIZkx0FH+ ziyPD#G~Xb>Pg#Ozkh)EdW(x0CZ5CMj!DId;!T`%{Qv}8DRr*W!YiYVY?Y|n#Bx^jU zZ}f1Ptu;MXdkL5H;{VF0^PN7HsVGAKu~yQ*dSN&psnmy59WO(z&&G3B`WDpVi@z5qe94KDFU@QAEZ^`EgAzMuFT0j^-l2SYqbdFxcu-9h zsB}et3efe4>*Ww9%ugiQ6h=Auta(YX9NK<`$LIj2D{L*$4=}^5#?WY_ZxMfe?_@KE zNS|p1K_i4{H_-1B|%N1d`1csab0TF79&|Q znS}pD<%_;J+KAr=6i+%m2h@s{^J)bQ3qjw)O(a2p@QY0X0X zp!o<;sz1=!NYsUMe0CCLyrk;ZzJPHW*^tDrJ2?CUM`rBF1!+zl-=|qgHOUz;v1i1q zQA~W)47ZL;JJQl;i-wZ@@<1`Q{_}N;X@b2lsVC^=I$rhpt(Q17ckv%QG^6`YzG3qW zo%Pd0v#DbmfQEtwS#lWOzq5GG;_C>$_)3#A3ky_wK@XAY)&6-B7(>6d&kV+qJac?8 z*COi>%oY()S9?u--%EaShkJ5P;gC6!T(@nSJCvrR(9OT!CF;%_N4`=$L`paSB{2l_ z9ze`6_>x~>m%x@lHZ#8VLad&w>~T{V@39_%V~0T_J2~icfk$$W`5) z>nJWyM_zQ;LDRo?)^;&p(&V>=E<)nSg>^~tlEvsw-;M)&HUW8?)4Q`*U&;U`HyAvp z=!-(7*vGHfigEK}M8hnKlmqgY?S?0L`Rzllmz3J33(yU74LE!J1h11NHwnImp9AhU z;Lk5`P~*#G*lD*YsOH^(J;i}H4S)ZF87I}sne%Eud=&l9bur~vFnd-p?tW`+;m)^; z{%mQ!b1150IjGMD#Pi+pvKl>SIo~&EVGw>`pxK&-vn#>+Wo5?-WlIZZIuH|pC?5|1 zQD_1~)7nDkf18rVY-H0)ezi0gN+d%_!Ju1`$~(pUdZ;6%A>Nm>pa&{iY6sAmiqK=| zqEUL9#b7PEQ|LI%h!myhP^LbuN&;TV~d)>Q^Yu^P;wSzw{8!Co> zQMswVH~2bXVV=u!M!vyKbrD6!geX13N&?_At~4>5oE;n+L#SpNu@*(M`SK zlT~=qyBmZM2(n*LbPEM6Zke)f=&jHv$B&G=bpuXZqDs8DI{uOfqTkMg$u(zV<7M2r z3=HtTSn^H;hBx*ef&drqxFp_ASy4NKeab0JDgxPH5Az1VvySkWhe z41QTg;C%%YZj^u}6K|8ull*@MN{dc-N#NbuXr&IYSof{^2<_7+XF#_IOJFjx+X?Ej z+bIQfaZ+eu=veS*H7)ZOkFqM>w~J>i30X01vlaUEef9Wq-a|64CXTv+Olq<}Sx_Z$ z{_Sq+@BHV5gczCPSGU(?*Qs}j^ZXp|aFqY}1W8T@0H?N|5?9GBen91jeuL$^$g3Ob zBw->Mo7HBwY+`cO^vuktKe@GH0eo@Vem?Uj%r(HGi`OHUlMYvYEcAD_uTx2V3ATnP{Jms!s3EgmP7l-+a^qjPAs zo1!->9s?P2faLyw0bb6HjcmqFH3KC=T;GRjG56u?#oqEoOx;@N)Bm61lG(*3~cXeIk+dptIO^DPypteRC;8=F*2 z_B^}W&kK5-s+LAT$(7bDnD9<&c$rt&VCr>51CPxnF9EZ4V^9lrv8mT9{5ain? zuXixuTWI}ly{V9Yo}3s)g0;aiS%3nw^$smbWiFH}F#(@ZB@wYzZgokPC(T{o3PlnB z*d)ZPF1Oc`CTfT0A{_X5zRGR#kf`n3WxYH>c7dAb8tG`JBl!CRB=Aml8p}nf!Tggo zP%)_>vXZaW0l*Zr>LR>Nqm*tf4D3XE7%W;=Ko$)b@|r>OsA7FjAM?O6D74KYqlCKt z#<;1djN}TX*Hl=9uPAW91%J_!;PrJK4_(B$(=Xl6+`FZ9VJ=Hd{IkDOx zi*Iw-9>@jAjsOP-#7|5M;2&0{DFu_ZQjTLE-;WgjAihGWuDDH+|EV!+TA3DRw4ScN zIVz(gYkJ|suyszj>GvOG4cZrcqaH-ap2IlMHv%rXN7RnaIr>1!O&%Ye7cU)3xN=el zD@xuLyMfpq>G^2mesxD#e5MLT@NKh3_-=WjAUhZ^;J%4IGEhQsDty2F*&nX31C0jg z5TLvZmuQWF!UCYpmw-nN?SYP_Pu3+T%r`~MeFwy)3S0VG;ZwEWi_?qD^!o2a#EiQ) zWro>FzsOLnVV}TsL{*0q_yakwm}byF(!~mQ4d&#uHtq%^$2D3ADj}T=6G*H&wwZKw z5VD_X@O^Czejz?8wL@}pdU83FbX`3{l(0NRUk_)+|L&NWvk;=7C`p%`iB(_ zM1aeS0$byUOOu*-WI}-oo?zwRwS*s$O8Er&`3ak#19|&yn*S$a*OsfVqEBE`l2mx# zPU(YjJ5Z4#`~h)U@^|DN<_zE{Kp{P9sUC)HT@t7(qbUt4Ntmi_09Fn<|F|!_UIJicg)r3n-Q(@k(%ICA3K&y}?E7C2nAJXtvMZ#*)id zjOWLLO}USM^ieCE$gs`1aT5Ui0;o8HM6edr`{gQR>CxXfzWC_y5|GK~&nt6UTZP$c zN%lgXa&vFG>?z17ynnBc4&*HmY0!b38VI-Gn4DL68IpE}5I#e*A0Wr}!Q8yi2B^;y zUZt37-Eef(=F)a>t;kP^o7-%E$7xe9y|qp03JLg8+V1}Pw|%xy%KNgWLCCFLM;ax= zEI9Eod4nZD`ZF6;X~vI!UjaRxyt2mdpC=?#4lxFd2*z*Ekg~&~}32r(Jbp z6Y!BoEFK9qb%(xK3d|K{_03#qSe5nTvBw6x5|Uu)Vo?gA6bzA;bXX20#Hg7mwwJMC zVCjlimxh1jvG%MqjDeOB8~LRff={#f&5cR0P9{#fWN3MCy8UGt`G2`<52212rv zhj(8-HxRJG+;phL|Jdus>r4z^&DlL`D*5RyzbLLi%)SL>9 zR-&d4jtIC(w+PBIsW%!B*ycE{COnG9i(`M0W#xF(FX?V9CS4w8T-8YKdh? z2c3)76}kW1P%|)A8yua>7(fp}H{d;>bnry-9b+J!J+tVzR)-p_O?dSIe}cK|d$J7B zuF}ei`EZLMZAB*puvv0;t5=-*VW5Pu{|UYGxP)d!;#G^jfbTv%;7)S-On?=lAT>%; zey3LY+%@KBT)o03kF+3r${tV_AVdgWA3_yO4*ri?O(sx@OyRK><>2r$;z+HY?PGsD zPrF`~c$$DCTy>qJpDNXsyr?=&o^9<% zoW#8tszpEa%C+8AvbD5iYN)AuSuTPO&@9rQXJXIeSERPttBIK7^2*B<4OXRj(uQ@@ ztn&8zdXB$Ib0h4#eqnp+Ja|7D{le_=d?0Qwe5|nEKY%Bru@)y&{z|W6{HUIf zgDINm|BQvHnM>d42WXxrI7pcW)wXHSIFKsmxf>Z#LCFn|U{bK%*3yHo^jNUnyO4@Z zp*jc+`{8`f>CN#b@Da>^cllx!GX;>=ad~rU!IbA!p1h1qOfbh~Jp-kvt9_s!(LYQE zWR^ih`!at&0-txB*=+&oqTPnil>X;%Mw*xTzZ~oV=x`!&UK(%7!;l~lMKtN69iIyA z_%``|60oQ;l*(T@QhrKAikaahB)Cv7J}c6yfnKH6r&l*o(eKlokul*ne4Qv$B}%JQ zXgQCJm#$Gs&E|)-I0>`+UA1oy3NWjyj3eDFXD|{$d|G&lJn0+Koz$5VIbe8w{UPI1 zOA+AE%mIIJP0ryvo1Vr_K#4MYE=Qb8QIJf=5Kr2>B!L)*Sd7D^0^F(%{t1i?FF zyT%p-q=3nouW@DncR55ju_eqYz?j8yY$?WelZ|SN12!F8ya)v9?=gDMyh_^Md3pb@ z%-AH6-fEg(9@bfpv^nP362VCGUgk^V{#lF7z&l{^Tmj?9I4QQ{5*jvszw}KBgkj1w z%ChOCoutf~l!$))YzDJ7>QuJWl4|2Eu4w*IF<8dCe-BUBKJp+)G;IOg67fAL0)eI! zI$&I%ZyhU`SR@FZlEDDu`Rh?RwFqNk2Rx$tYpM%m4q)CaFRxH2Q*fgMJ;)nDFyPR} z7GHF~l=qfb+=liSYS+{eSd;J~0R#}a3VZH|II@_K`-Fsnwc5{)v9ioMuWo5mkl?`A zmc}ykr}T&c!|k$YA^dG?SO)y#w-RJo3=x-}h2=lQ4aaeppWR5$jb<(`EG+C@&*Qi( zZFy#yPTmgu>U1J45y?Hf~(P>)US58B!ZTH&fvk=a+ygrlOMt(?$v1Ix~SND>s zhNKTIJ50zhF7mr%uMQi(2vria5Lp8s@U6r*3qp+i#FBXD%1WDdt})kHIUA>~$-Ej8 z-ujz&qG#OLLs%#PbIh$ps#?hBpWxe7Oj5@Uj-YY)21&4VUha6|?Nq+!?Co??dAf&c zPlG8c>BkDQB}81T(Chvu)PRF9Zq1WZ-;7sS!VK%r9PT4)0(Y^xB=XkPgN=gG>abSP zO)7m~ty7}DDePW4uJIip5Yrlcf%${@<_l^__|s{1Uz9b#8<{uhsj!)oI~^_;x49ge zs8`Ohbof7I0Q(Q8b-`GtorKEnYU3!SX z`Oq#uPJ$t-q-wk5x3Q~q2t*`Hq zs`UQthfQBwT_4O?PEeh!rVCx`|5yc?+J>A{m03C(5YbZ@}QrqbER{9s1R|Iuxp6Xwf(S+|~rGtbH`He)##Rs%ttl z85`|NWYpbM?mHaO0FXf(rNu|L*7=|-gtu{xGl9yCC~lSVS!K7g>w*&px<@2^Uu~Lf zoG=kEd)QM_SedTtEdX~3Uet;6#;Zv02^4XvDwY&T$m?IQ4PqMFRfgBf_Ur=D;D(S0 zfT*#9t0Bm50-kO<0AjB#0e`)16f7LTi_<`pCocc>$KghSnQuO2vdRZZz~VhwNgL)& z$o>UYJQ9NMMc~p18bB~&pae3qv&ZC{ut$MlJ4&q};?py!NgqE|s9h3VafPFG_d}Qb zd%S1*yZ!AKk<$mwj_8!m4KU8p&cEiTkAr>{#Wl23?ZH=MWLZ9>knBX-e4YiBJjN&D z_&UPJ=ai%FZvb932SjUt^wJVzmf)Sx)Lp`2Usig0d8wVoS%s8KN?02{;eZQI z_oP{r+9NSRS&aI!IS9e4!4vy2fWv5O=9I|F_4e~OWfr_IKn)RnTmdf>D!sYHqd?CB z{5U+&)4R*c3c%cnbA3S)v`iSY0U;&4Y`xDT92UAbl5Wg}=&PdYf93lZOkYje^{#-BPldd#N&!|d%!GM%cKx$@V`lJ?|bx9in|QGYurZ|@xw3D#>gf?g58gq}n` zMu=;6uTvS!-TgC^9~e@@gZDwmO9p*KAoOrwC*{9i$Y#>^3ko^g0 z#fiIez!|rXvM%HiJPX~@Gz3-|TsmdY%p@AHHJBi74KW5(+*sqrlg|EzN03xSwN;@A z8G4`tf>raLjCyd??s=lqev%FS-$D%k+UId=gP*T13kzeNx`!eZC#1H~g4@iq8Q|6} z8|@Conml);QFJpOpd326P$EMB8~eSq#gNPGAt6C~c@D#O9Q)w?aj%>H#wTLK$KRxp zk!>+i2R}h-BP0Jz>sh7}KcyoAslK~A@&?EM@D>hHzC^Z<-h~4&x^#aFWKU8yuCaVoN z4aFBFpLb@gfPXasT7E_?{{yxf;cAm$H~lo-_f@44zHC!fEnzeijGxH+fp-kUQj=1K57Tlq$!<`5)n4B+siO zDR{yP;7HfwRgq}D6w^70e+9_5&C4yWF)UyS;b6Z<2QC)4we5Ue;J?qZ{@xIlO{+I2 zB^#Bu4%&!>0^E2zcTild9S-`r$tXkZc(}zwkQnHrRD_O>Dkp z4+Fy)s_}t1u2ep%gnH#uB&M0y={ArQ@HF36n3jA#v|uS{&N()uE(mGq_MDt+w)_0J2q zDa%3cn4{m}9@+Ev%Tja zF(y>32=JEzSrND*tZzr zcA^4368Hq_)IumIJW#&!xdVV=V1*ce0*fEW$V|@Ns%iw}B+!D|N7 zlGLbH_vY#%v-ex|I5d@>8?QmLdJsG&U}Ua6qka_0A^lh5?;8{4d#)5WcuM-DDxg3< zg$CF|JUmFjl@@^Dy84@m+)QR9Di}}b`RgkK3zt8$qUQD@n#*nyt0V4$R8@&2O0}L{ z(>!N_`WEY^}Gnd)5u7i_4PZm$DUFN@R-~1HaQ*%gaGA2E3<#Qp6TlMiMah6 zfA}%5#a{my^Np^Sif}ul`RgexF7VSgCD4O1>h(AL5h2$SQDwUE{Bo4u*{E!98(bvN zOvJU_;(r7Z$eh%*N;R?Y9cDO5JI-;oWPuHDzj}nY)gl{f`1b6 z+eZXJEc!qZ;#bJ>i2Og(bI4E8Ob*Tt8Y{k%6B1+gum)=J20@I*)(j~$^=!i3(z`c@G1YidMp*+>! zTl-a@FjRdhnS`NR|+!u>kO?<&yGMQy_cWx4UGt&5UnWtv;c{xx4 zJ;niKI^JlTex3Pu72WdgKcM=0kQwBwj-GG+n}4JUtH_jOI5G#JfL!{Mw-^n&?RYiX7-uk3!>wcEiW$ACQBa6TqG zH#HcOjV5L9+4WUsc|B#6c8<-;%LYQO-f>x z1^HtY^|RM;k~1e&A2wYj7B7_gIJ%39Yw|Q>Q<6UH=4;(y&#i{WV10cjZ3IlOYx)K~ z4KKLUI9gj#M)0?;JGs^BSGm>jo`vT1E+t>h=2KrKZpHB-^l*UMu9re)td46S)PO=( zLJ6!TbGxyyX$4&ad zVvht3Obi|+xZr@RwE)rd2svFX6v-W9?xQX4CGZzGne9D}&qGeT#*3pu$Sk6fRc;au zYi0d&=X*86WsI6>s&f4QV zJ(2+}WxP9ZiQ0Jxd+ixb)8Q==TGNWotir(Zki&N)qJ1%^Bx9gq&TY{!c6fH--gbie z0D9((!(^}NMdm3_`pM-j@%So;j;>g$9PZR{V}EJ*37#pbGczk_ZVr77L#4#vqmY*C zB$oM**`G4E&P*mg1$v$@{q;i#EQC1>KGN$AwdacRh$jzidTLclukW)FYgP9BnlbFj zn@QRvx^wIQy0N!~?`Jy9-PP`WM*#b?p;0O^CUTY0cd*r2aA86;$xWf!Tq+EK0l1g+$uy4#jGY4XN8$gDwUH%-Y{6T<6TXj;(K`UQ-dU+LVnM&Yp^+}txNQk9s3sO7iud%#7R5n5&db_J zseK-5}o#mPIoUUP&Z6&)Az_e=>G%c8}ODi|s)mtW5PR4na7sV0^~FHp;zq zuzKzzV*gT6cx@?ba@Ydb+ey*N=NHFdV=-{C%HQwxeI8~B?{)g35aq0>zt72AY@+5*zKtw;{r-jAT zb+KvMECyXOzR%`0Ito5`h`?AZy&y+R{gFm!CHpfC*{SD=sUO3+xAZ$XAQ4GkF8+In zp94*e8gqy|G?JffE;PgG9h=2bz)*t{XwP5{?V?Hf-|oHu`XfAJKT+$Hl12A2B8Osy z0haIW`lMqc)uBu=_FU^*P5U-RpcO*UugBXUO{NOPEztB10s#U$r!Os(XzW};##D#u z5H!rGpufh9nL(`i5s>9qJ?qW|XnwnT`ueeG#eMuF5HiyO*9BmG zh66O4NfC46REI$~*uYcp1FxIX-dFR|f}WNO@nE0w>;CSf_BrUp;zdW*CJop=S!l`V zTx=s>kSypN6eMUC`T&O{ShOk>V@3E4(cO&dPfQh;bU`aU1^`cO zYW}79-U(|NGJy^BJV6FydpdB0(4@mW4DNAnY`wLf&p>p?ApMDs?+hJfam!p}t`Rh8 zSejUx3IrO%qGS>YJn}cxZc=-LucQf!6qo)8+TVdjZAQUA0vM1eWM8y?GEs21Q0zTD zHViF5!C~tM=!QtN^}!2+Yipv*NkJtz%a2kTKl@!(>ImBP&6;IsZWxW<6QyMygQX6` zNO#a)>Z99RJ@7Q(u42bu#zXwqv7f|=y}S}wQ?8zFW1YNkCHH;-umiGoSSFAE8&AW1{x6Tj-APhX3w#B=pciT3UoXK%oxsT<$H8bl5;hTn~|JNuGzRu&-ZyxV~_QusQ+1G#o|JjCPJ|L3- zUF+AMa{?-NHe!zX8E=)^Oq-BF&0p9Zxunc?B}_EbM8XcV=*Cl$Nrwez;8ANDL?NhD z>sNW8O`S31fX`N<^Ed@sFk5jgR>u$;z0>2DtXHY8j|!L;`DMFoMNl5;1Y%fR%8e9m zTu3$GG3iy`|3rfenYE#cPDU=yFC;ClUIUTy`fnE-=W7Mu;xB)!S)~D6DKNc8O>J9Z z!@0{xqzd+YT{lFxxL;!uaCQu!VpmX&8`*ETIG?Xb!yA0jdaOPAdRkyE z@(~1WaJwu=@^54D(cx6PR3)>1X+;j8ww35ALJ15Gr_!HHt{7a5RYP>y-<)JJ)miJ= zg+LJ7;4A=VZ7`8sj??8P=8H+zqxl(A^kn3@F7Kfl)Auf$x=)+1c?Q!S-Y364BxtZbs$H5S~`5P(a$bZu=DkMGp4eu>&CBDiZXi}xAzkd&euf~SP@xw zX=idB0?|nJ1|5De{r#(@x&`*#_Xz9g8v{)=G$V3l5lM1a8?y-)-yK4up5v|@my3Bj zvt5ovZ~g5vB}TVc{_t6+CoyJ7t+CzPs&nJtXy*=EU!HK}P-Fhr0=3Tw8)7AM_+fiH zJTGrI>m>$xR#2}fQAJaHnDkss(9sqeNj?(S;Js?v`1rZ4p}VKU>Z7e0rxPoTiOgNet%NxUZk!$Qs+V(5?A&YNJl>vVXn2yGYpM!*Tv9+f zMSn8$GHsCDqMSqr!+@K>6gfF(KeoBq4%dI2JG#A)uq$Z4ii?P&b=aI@n`bR zbO0Z=&+e{xZNrWE`9;1;F-eMJf+A~S*j}GbQMU@WZ#HFx)fk4U*)R;*|klg|AU@9%G)TJ`RN%Pt@gSt%vS3JIft F{|7T1mU;jH diff --git a/public/images/pokemon/shiny/335.json b/public/images/pokemon/shiny/335.json index ca797f1d7a4..80c43b41c12 100644 --- a/public/images/pokemon/shiny/335.json +++ b/public/images/pokemon/shiny/335.json @@ -1,1910 +1,523 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0df67af080306e793f3e63687a642a63:bd66cef8682173381b002070c3411214:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/335.png b/public/images/pokemon/shiny/335.png index 765344af6fd1936a10affb0e3e67229d7927dccf..fc7c325a46927c5b82aa214f1446a66b73e69d54 100644 GIT binary patch literal 10990 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 b3S)~T@p8Y3ar5ciDd3%wmSVNMRmlGZJ}mxb literal 24209 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 Date: Mon, 10 Feb 2025 21:17:01 -0500 Subject: [PATCH 008/171] Fix Greninja floating static backsprite (#5292) --- public/images/pokemon/back/658.json | 10 +++++----- public/images/pokemon/back/658.png | Bin 899 -> 890 bytes public/images/pokemon/back/shiny/658.json | 8 ++++---- public/images/pokemon/back/shiny/658.png | Bin 899 -> 890 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/images/pokemon/back/658.json b/public/images/pokemon/back/658.json index 050b63e3592..1d8893e2d5d 100644 --- a/public/images/pokemon/back/658.json +++ b/public/images/pokemon/back/658.json @@ -1,19 +1,19 @@ { "frames": [ { "filename": "0001.png", - "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "frame": { "x": 0, "y": 0, "w": 77, "h": 65 }, "rotated": false, "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, - "sourceSize": { "w": 77, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "sourceSize": { "w": 77, "h": 65 }, "duration": 100 } ], "meta": { "app": "https://www.aseprite.org/", - "version": "1.3.7-x64", + "version": "1.3.9.2-x64", "format": "I8", - "size": { "w": 77, "h": 77 }, + "size": { "w": 77, "h": 65 }, "scale": "1" } } diff --git a/public/images/pokemon/back/658.png b/public/images/pokemon/back/658.png index ea24d9a63360e565b83f9eb6b08385d1d4f04df2..be286b886663611d6eb953682e17ed48ffc393fd 100644 GIT binary patch delta 796 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 ji~A|;8{hcGKgTc0Js Date: Mon, 10 Feb 2025 21:33:13 -0600 Subject: [PATCH 009/171] [Bug] Fix Fused Pokemon not having stats Flipped correctly (#5295) Co-authored-by: Scooom --- src/field/pokemon.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 80a2980c92b..79d7192b4db 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1066,6 +1066,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats); if (this.isFusion()) { const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats; + applyChallenges(globalScene.gameMode, ChallengeType.FLIP_STAT, this, fusionBaseStats); + for (const s of PERMANENT_STATS) { baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); } From 42c4ca27e6cf171c3ebc7900e58aca5062132e14 Mon Sep 17 00:00:00 2001 From: geeilhan <107366005+geeilhan@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:53:37 +0100 Subject: [PATCH 010/171] [Ability][Move] Last Respects Refactor and Full Implementation (#5200) * full implementation of supreme overlord + test * removed unused import * changed documentation since Battle.playerFaints is not used in supreme overlord * Update faint-phase.ts * changed supreme overlords power calculation function and adjusted tests * added changes to Last Respects too * added playerFaints to SessionSaveData to make the counter saveable * Apply Kev's suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Reset enemy faint counter per battle * Re-mark supreme overlord as partial * added automated test case * moved playerFaints reset to resetArenaEffects * removed resetEnemyFaintCount() function since it is unused --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/battle-scene.ts | 4 +- src/battle.ts | 12 +- src/data/ability.ts | 4 +- src/data/move.ts | 3 +- src/field/arena.ts | 13 +- src/phases/faint-phase.ts | 5 +- src/phases/game-over-phase.ts | 3 +- src/system/game-data.ts | 9 +- src/test/abilities/supreme_overlord.test.ts | 178 ++++++++++++++++ src/test/moves/last_respects.test.ts | 219 ++++++++++++++++++++ 10 files changed, 432 insertions(+), 18 deletions(-) create mode 100644 src/test/abilities/supreme_overlord.test.ts create mode 100644 src/test/moves/last_respects.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 9bfa153ef60..7aa0369877b 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1401,8 +1401,8 @@ export default class BattleScene extends SceneBase { return this.currentBattle; } - newArena(biome: Biome): Arena { - this.arena = new Arena(biome, Biome[biome].toLowerCase()); + newArena(biome: Biome, playerFaints?: number): Arena { + this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints); this.eventTarget.dispatchEvent(new NewArenaEvent()); this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; diff --git a/src/battle.ts b/src/battle.ts index 3f36865c74b..7ede7b2982e 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -105,9 +105,11 @@ export default class Battle { public lastEnemyInvolved: number; public lastPlayerInvolved: number; public lastUsedPokeball: PokeballType | null = null; - /** The number of times a Pokemon on the player's side has fainted this battle */ - public playerFaints: number = 0; - /** The number of times a Pokemon on the enemy's side has fainted this battle */ + /** + * Saves the number of times a Pokemon on the enemy's side has fainted during this battle. + * This is saved here since we encounter a new enemy every wave. + * {@linkcode globalScene.arena.playerFaints} is the corresponding faint counter for the player and needs to be save across waves (reset every arena encounter). + */ public enemyFaints: number = 0; public playerFaintsHistory: FaintLogEntry[] = []; public enemyFaintsHistory: FaintLogEntry[] = []; @@ -118,7 +120,7 @@ export default class Battle { private rngCounter: number = 0; - constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) { + constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double: boolean = false) { this.gameMode = gameMode; this.waveIndex = waveIndex; this.battleType = battleType; @@ -127,7 +129,7 @@ export default class Battle { this.enemyLevels = battleType !== BattleType.TRAINER ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) : trainer?.getPartyLevels(this.waveIndex); - this.double = double ?? false; + this.double = double; } private initBattleSpec(): void { diff --git a/src/data/ability.ts b/src/data/ability.ts index 21ec5667426..cd31c62f7f6 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6313,8 +6313,8 @@ export function initAbilities() { new Ability(Abilities.SHARPNESS, 9) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5), new Ability(Abilities.SUPREME_OVERLORD, 9) - .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 5)) - .partial(), // Counter resets every wave instead of on arena reset + .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 5)) + .partial(), // Should only boost once, on summon new Ability(Abilities.COSTAR, 9) .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) diff --git a/src/data/move.ts b/src/data/move.ts index 967d2ee0cc2..6c41f0b764d 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -10916,8 +10916,7 @@ export function initMoves() { .attr(ConfuseAttr) .recklessMove(), new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) - .partial() // Counter resets every wave instead of on arena reset - .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 100)) + .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 100)) .makesContact(false), new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), diff --git a/src/field/arena.ts b/src/field/arena.ts index 67b83e9518f..5ee065d71dc 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -44,6 +44,11 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + /** + * Saves the number of times a party pokemon faints during a arena encounter. + * {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave). + */ + public playerFaints: number; private lastTimeOfDay: TimeOfDay; @@ -52,12 +57,13 @@ export class Arena { public readonly eventTarget: EventTarget = new EventTarget(); - constructor(biome: Biome, bgm: string) { + constructor(biome: Biome, bgm: string, playerFaints: number = 0) { this.biomeType = biome; this.tags = []; this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerFaints = playerFaints; } init() { @@ -688,6 +694,7 @@ export class Arena { this.trySetWeather(WeatherType.NONE, false); } this.trySetTerrain(TerrainType.NONE, false, true); + this.resetPlayerFaintCount(); this.removeAllTags(); } @@ -773,6 +780,10 @@ export class Arena { return 0; } } + + resetPlayerFaintCount(): void { + this.playerFaints = 0; + } } export function getBiomeKey(biome: Biome): string { diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 414aa84ce6c..340c5362087 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -96,10 +96,9 @@ export class FaintPhase extends PokemonPhase { doFaint(): void { const pokemon = this.getPokemon(); - - // Track total times pokemon have been KO'd for supreme overlord/last respects + // Track total times pokemon have been KO'd for Last Respects/Supreme Overlord if (pokemon.isPlayer()) { - globalScene.currentBattle.playerFaints += 1; + globalScene.arena.playerFaints += 1; globalScene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: globalScene.currentBattle.turn }); } else { globalScene.currentBattle.enemyFaints += 1; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index 5e4e8e1cdf7..d4b529fe00e 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -249,7 +249,8 @@ export class GameOverPhase extends BattlePhase { timestamp: new Date().getTime(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, - mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints } as SessionSaveData; } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 7282d2730a4..c16fab9db04 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -141,6 +141,10 @@ export interface SessionSaveData { challenges: ChallengeData[]; mysteryEncounterType: MysteryEncounterType | -1; // Only defined when current wave is ME, mysteryEncounterSaveData: MysteryEncounterSaveData; + /** + * Counts the amount of pokemon fainted in your party during the current arena encounter. + */ + playerFaints: number; } interface Unlocks { @@ -964,7 +968,8 @@ export class GameData { timestamp: new Date().getTime(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, - mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints } as SessionSaveData; } @@ -1056,7 +1061,7 @@ export class GameData { globalScene.mysteryEncounterSaveData = new MysteryEncounterSaveData(sessionData.mysteryEncounterSaveData); - globalScene.newArena(sessionData.arena.biome); + globalScene.newArena(sessionData.arena.biome, sessionData.playerFaints); const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; diff --git a/src/test/abilities/supreme_overlord.test.ts b/src/test/abilities/supreme_overlord.test.ts new file mode 100644 index 00000000000..ecd595cb6bb --- /dev/null +++ b/src/test/abilities/supreme_overlord.test.ts @@ -0,0 +1,178 @@ +import { Moves } from "#app/enums/moves"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves } from "#app/data/move"; + +describe("Abilities - Supreme Overlord", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.TACKLE]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemySpecies(Species.MAGIKARP) + .enemyLevel(100) + .startingLevel(1) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.SUPREME_OVERLORD) + .enemyMoveset([ Moves.SPLASH ]) + .moveset([ Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE ]); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should increase Power by 20% if 2 Pokemon are fainted in the party", async() => { + await game.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.2); + }); + + it("should increase Power by 30% if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.3); + }); + + it("should maintain its power during next battle if it is within the same arena encounter", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower * 1.1); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(4) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(10) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); diff --git a/src/test/moves/last_respects.test.ts b/src/test/moves/last_respects.test.ts new file mode 100644 index 00000000000..71a76e3fa1a --- /dev/null +++ b/src/test/moves/last_respects.test.ts @@ -0,0 +1,219 @@ +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import { allMoves } from "#app/data/move"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Last Respects", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.LAST_RESPECTS]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .disableCrits() + .moveset([ Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE ]) + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .startingLevel(1) + .enemyLevel(100); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should have 150 power if 2 allies faint before using move", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (2 * 50)); + }); + + it("should have 200 power if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (3 * 50)); + }); + + it("should maintain its power for the player during the next battle if it is within the same arena encounter", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + expect(game.scene.arena.playerFaints).toBe(1); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + (1 * 50)); + }); + + it("should reset enemyFaints count on progressing to the next wave.", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.LAST_RESPECTS) + .moveset([ Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH ]); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + expect(game.scene.currentBattle.enemyFaints).toBe(0); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(4) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(10) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); From f5ef4a5da91ab5139c0036b6731d34613ab373fd Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 10 Feb 2025 23:14:54 -0800 Subject: [PATCH 011/171] [Test] Fix Tera Blast test (#5297) --- src/test/moves/tera_blast.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index 21cbf4c1463..34d171b47bb 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -38,8 +38,8 @@ describe("Moves - Tera Blast", () => { .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.BALL_FETCH) - .enemyLevel(20); + .enemyAbility(Abilities.STURDY) + .enemyLevel(50); vi.spyOn(moveToCheck, "calculateBattlePower"); }); From 60b27f4f62789a056eca644ecb6ee9d61e7b6eb1 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 11 Feb 2025 08:32:32 +0100 Subject: [PATCH 012/171] [UI/UX] Pokedex updates batch (#5282) * Introducing tray to display form icons in the pokedex; displaying correct information for uncaught and seen forms in pokedex page; dexForDevs now unlocks everything in the main page * Filtering correctly passive abilities and form abilities. Passive candy symbol is now colored * Pikachu does not break the dex due to having no passive * Fixed position of pokemonFormText * Added button instructions to show forms * Allowing candy upgrades for evolutions; too expensive options shown in shadow text * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fixed game crashing after save and quit * Updating import of BBCodeText * Restoring name on dex page * getStarterSpecies now looks at speciesStarterCosts to determine what is a starter instead of looking at game data (exception for Pikachu) * Selecting pokedex option in starter select menu does not play error sound * Mons having no TM moves don't freeze the game in the dex * Menu in pokedex page is not pushed to the left when localized options are long * Removed spurious globalScene.clearPhaseQueue() call * Showing error message when clicking tm option if no tm moves are available * Egg move icon and passive icon are darkened when filtering if the respective move or passive has not been unlocked * Hiding form button when switching to filters * Hiding "Show forms" button while forms are being shown --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/ui/abstact-option-select-ui-handler.ts | 2 +- src/ui/pokedex-mon-container.ts | 48 +- src/ui/pokedex-page-ui-handler.ts | 525 +++++++++++---------- src/ui/pokedex-ui-handler.ts | 343 ++++++++++++-- src/ui/starter-select-ui-handler.ts | 2 +- 5 files changed, 626 insertions(+), 294 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 1840792e667..10dbedd7b2f 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -6,7 +6,7 @@ import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; import { argbFromRgba } from "@material/material-color-utilities"; import { Button } from "#enums/buttons"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; export interface OptionSelectConfig { xOffset?: number; diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts index f3932aa90c8..31a98c30d1c 100644 --- a/src/ui/pokedex-mon-container.ts +++ b/src/ui/pokedex-mon-container.ts @@ -1,7 +1,17 @@ +import type { Variant } from "#app/data/variant"; import { globalScene } from "#app/global-scene"; +import { isNullOrUndefined } from "#app/utils"; import type PokemonSpecies from "../data/pokemon-species"; import { addTextObject, TextStyle } from "./text"; + +interface SpeciesDetails { + shiny?: boolean, + formIndex?: number + female?: boolean, + variant?: Variant +} + export class PokedexMonContainer extends Phaser.GameObjects.Container { public species: PokemonSpecies; public icon: Phaser.GameObjects.Sprite; @@ -19,16 +29,34 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { public tmMove2Icon: Phaser.GameObjects.Image; public passive1Icon: Phaser.GameObjects.Image; public passive2Icon: Phaser.GameObjects.Image; + public passive1OverlayIcon: Phaser.GameObjects.Image; + public passive2OverlayIcon: Phaser.GameObjects.Image; public cost: number = 0; - constructor(species: PokemonSpecies) { + constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { super(globalScene, 0, 0); this.species = species; + const { shiny, formIndex, female, variant } = options; + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + if (!isNullOrUndefined(formIndex)) { + defaultProps.formIndex = formIndex; + } + if (!isNullOrUndefined(shiny)) { + defaultProps.shiny = shiny; + } + if (!isNullOrUndefined(variant)) { + defaultProps.variant = variant; + } + if (!isNullOrUndefined(female)) { + defaultProps.female = female; + } + + // starter passive bg const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); starterPassiveBg.setOrigin(0, 0); @@ -137,7 +165,7 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.tmMove2Icon = tmMove2Icon; - // move icons + // passive icons const passive1Icon = globalScene.add.image(3, 3, "candy"); passive1Icon.setOrigin(0, 0); passive1Icon.setScale(0.25); @@ -145,13 +173,27 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.add(passive1Icon); this.passive1Icon = passive1Icon; - // move icons + const passive1OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive1OverlayIcon.setOrigin(0, 0); + passive1OverlayIcon.setScale(0.25); + passive1OverlayIcon.setVisible(false); + this.add(passive1OverlayIcon); + this.passive1OverlayIcon = passive1OverlayIcon; + + // passive icons const passive2Icon = globalScene.add.image(12, 3, "candy"); passive2Icon.setOrigin(0, 0); passive2Icon.setScale(0.25); passive2Icon.setVisible(false); this.add(passive2Icon); this.passive2Icon = passive2Icon; + + const passive2OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive2OverlayIcon.setOrigin(0, 0); + passive2OverlayIcon.setScale(0.25); + passive2OverlayIcon.setVisible(false); + this.add(passive2OverlayIcon); + this.passive2OverlayIcon = passive2OverlayIcon; } checkIconId(female, formIndex, shiny, variant) { diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 7ab054ea71b..2047095d067 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -43,7 +43,6 @@ import type { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { EggSourceType } from "#enums/egg-source-types"; -import { StarterContainer } from "#app/ui/starter-container"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; import { BooleanHolder, capitalizeString, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; @@ -128,7 +127,6 @@ interface SpeciesDetails { formIndex?: number female?: boolean, variant?: number, - forSeen?: boolean, // default = false } enum MenuOptions { @@ -147,8 +145,6 @@ enum MenuOptions { export default class PokedexPageUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; private shinyOverlay: Phaser.GameObjects.Image; - private starterContainers: StarterContainer[] = []; - private filteredStarterContainers: StarterContainer[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -199,6 +195,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private allSpecies: PokemonSpecies[] = []; private species: PokemonSpecies; + private starterId: number; private formIndex: number; private speciesLoaded: Map = new Map(); private levelMoves: LevelMoves; @@ -312,10 +309,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.speciesLoaded.set(species.speciesId, false); this.allSpecies.push(species); - - const starterContainer = new StarterContainer(species).setVisible(false); - this.starterContainers.push(starterContainer); - starterBoxContainer.add(starterContainer); } this.starterSelectContainer.add(starterBoxContainer); @@ -513,7 +506,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.menuBg = addWindow( - (globalScene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), + (globalScene.game.canvas.width / 6 - 83), 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, (globalScene.game.canvas.height / 6) - 2 @@ -555,8 +548,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Filter bar sits above everything, except the message box this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); - - this.updateInstructions(); } show(args: any[]): boolean { @@ -603,6 +594,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const species = this.species; const formIndex = this.formIndex ?? 0; + this.starterId = this.getStarterSpeciesId(this.species.speciesId); + const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) ? pokemonEvolutions[species.speciesId] : []; if (species.forms.length > 0) { @@ -629,17 +622,19 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.baseTotal = species.baseTotal; } - this.eggMoves = speciesEggMoves[this.getStarterSpeciesId(species.speciesId)] ?? []; - this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)].eggMoves & (1 << em)) !== 0); + this.eggMoves = speciesEggMoves[this.starterId] ?? []; + this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0); const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; - const passives = starterPassiveAbilities[this.getStarterSpeciesId(species.speciesId)]; + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : + starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; + const passives = starterPassiveAbilities[passiveId]; this.passive = (this.formIndex in passives) ? passives[formIndex] : passives[0]; - const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)]; + const starterData = globalScene.gameData.starterData[this.starterId]; const abilityAttr = starterData.abilityAttr; this.hasPassive = starterData.passiveAttr > 0; @@ -655,9 +650,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const allBiomes = catchableSpecies[species.speciesId] ?? []; this.preBiomes = this.sanitizeBiomes( - (catchableSpecies[this.getStarterSpeciesId(species.speciesId)] ?? []) + (catchableSpecies[this.starterId] ?? []) .filter(b => !allBiomes.some(bm => (b.biome === bm.biome && b.tier === bm.tier)) && !(b.biome === Biome.TOWN)), - this.getStarterSpeciesId(species.speciesId)); + this.starterId); this.biomes = this.sanitizeBiomes(allBiomes, species.speciesId); const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; @@ -799,39 +794,43 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const hasShiny = caughtAttr & DexAttr.SHINY; const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; - if (starterAttributes.shiny && !hasShiny) { + if (!hasShiny || (starterAttributes.shiny === undefined && hasNonShiny)) { // shiny form wasn't unlocked, purging shiny and variant setting starterAttributes.shiny = false; starterAttributes.variant = 0; - } else if (starterAttributes.shiny === false && !hasNonShiny) { - // non shiny form wasn't unlocked, purging shiny setting - starterAttributes.shiny = false; + } else if (!hasNonShiny || (starterAttributes.shiny === undefined && hasShiny)) { + starterAttributes.shiny = true; + starterAttributes.variant = 0; } - if (starterAttributes.variant !== undefined) { - const unlockedVariants = [ - hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, - hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 - ]; - if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { - starterAttributes.variant = 0; - } else if (!unlockedVariants[starterAttributes.variant]) { - let highestValidIndex = -1; - for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { - if (unlockedVariants[i] !== 0n) { - highestValidIndex = i; - } + const unlockedVariants = [ + hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, + hasShiny && caughtAttr & DexAttr.VARIANT_2, + hasShiny && caughtAttr & DexAttr.VARIANT_3 + ]; + if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { + starterAttributes.variant = 0; + } else if (!unlockedVariants[starterAttributes.variant]) { + let highestValidIndex = -1; + for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { + if (unlockedVariants[i] !== 0n) { + highestValidIndex = i; } - // Set to the highest valid index found or default to 0 - starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0; } + // Set to the highest valid index found or default to 0 + starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0; } if (starterAttributes.female !== undefined) { if ((starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || (!starterAttributes.female && !(caughtAttr & DexAttr.MALE))) { starterAttributes.female = !starterAttributes.female; } + } else { + if (caughtAttr & DexAttr.FEMALE) { + starterAttributes.female = true; + } else if (caughtAttr & DexAttr.MALE) { + starterAttributes.female = false; + } } return starterAttributes; @@ -878,7 +877,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { * @returns the id of the corresponding starter */ getStarterSpeciesId(speciesId): number { - if (globalScene.gameData.starterData.hasOwnProperty(speciesId)) { + if (speciesId === Species.PIKACHU) { + if ([ 0, 1, 8 ].includes(this.formIndex)) { + return Species.PICHU; + } else { + return Species.PIKACHU; + } + } + if (speciesStarterCosts.hasOwnProperty(speciesId)) { return speciesId; } else { return pokemonStarters[speciesId]; @@ -886,7 +892,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } getStarterSpecies(species): PokemonSpecies { - if (globalScene.gameData.starterData.hasOwnProperty(species.speciesId)) { + if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { return species; } else { return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species; @@ -970,7 +976,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } } else { - const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(this.species.speciesId)]; + const starterData = globalScene.gameData.starterData[this.starterId]; // prepare persistent starter data to store changes const starterAttributes = this.starterAttributes; @@ -1126,6 +1132,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (!isCaught || !isFormCaught) { error = true; + } else if (this.tmMoves.length < 1) { + ui.showText(i18next.t("pokedexUiHandler:noTmMoves")); + error = true; } else { this.blockInput = true; @@ -1633,90 +1642,55 @@ export default class PokedexPageUiHandler extends MessageUiHandler { error = true; } else { const ui = this.getUi(); + ui.showText(""); const options: any[] = []; // TODO: add proper type const passiveAttr = starterData.passiveAttr; const candyCount = starterData.candyCount; - if (!pokemonPrevolutions.hasOwnProperty(this.species.speciesId)) { - if (!(passiveAttr & PassiveAttr.UNLOCKED)) { - const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]); - options.push({ - label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, - handler: () => { - if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { - starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; - if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { - starterData.candyCount -= passiveCost; - } - this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - globalScene.gameData.saveSystem().then(success => { - if (!success) { - return globalScene.reset(true); - } - }); - ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - this.setSpeciesDetails(this.species); - globalScene.playSound("se/buy"); - - return true; - } - return false; - }, - item: "candy", - itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)] - }); - } - - // Reduce cost option - const valueReduction = starterData.valueReduction; - if (valueReduction < valueReductionMax) { - const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)])[valueReduction]; - options.push({ - label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`, - handler: () => { - if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { - starterData.valueReduction++; - if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { - starterData.candyCount -= reductionCost; - } - this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - globalScene.gameData.saveSystem().then(success => { - if (!success) { - return globalScene.reset(true); - } - }); - ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - globalScene.playSound("se/buy"); - - return true; - } - return false; - }, - item: "candy", - itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)] - }); - } - - // Same species egg menu option. - const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]); + if (!(passiveAttr & PassiveAttr.UNLOCKED)) { + const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]); options.push({ - label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`, + label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, handler: () => { - if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { - if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { - // Egg list full, show error message at the top of the screen and abort - this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); - return false; - } + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { + starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { - starterData.candyCount -= sameSpeciesEggCost; + starterData.candyCount -= passiveCost; } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + this.setSpeciesDetails(this.species); + globalScene.playSound("se/buy"); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - const egg = new Egg({ scene: globalScene, species: this.species.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); - egg.addEggToGameData(); + return true; + } + return false; + }, + style: this.isPassiveAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + }); + } + // Reduce cost option + const valueReduction = starterData.valueReduction; + if (valueReduction < valueReductionMax) { + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[valueReduction]; + options.push({ + label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { + starterData.valueReduction++; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); globalScene.gameData.saveSystem().then(success => { if (!success) { return globalScene.reset(true); @@ -1729,24 +1703,59 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } return false; }, + style: this.isValueReductionAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, item: "candy", - itemArgs: starterColors[this.getStarterSpeciesId(this.species.speciesId)] + itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] }); - options.push({ - label: i18next.t("menu:cancel"), - handler: () => { + } + + // Same species egg menu option. + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { + if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + // Egg list full, show error message at the top of the screen and abort + this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); + return false; + } + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({ scene: globalScene, species: this.species.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + egg.addEggToGameData(); + + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + globalScene.playSound("se/buy"); + return true; } - }); - ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: options, - yOffset: 47 - }); - success = true; - } else { - error = true; - } + return false; + }, + style: this.isSameSpeciesEggAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + }); + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + } + }); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + yOffset: 47 + }); + success = true; } break; case Button.CYCLE_ABILITY: @@ -1877,9 +1886,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.isCaught()) { if (isFormCaught) { - if (!pokemonPrevolutions.hasOwnProperty(this.species.speciesId)) { - this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); - } + this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); if (this.canCycleShiny) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); } @@ -1936,16 +1943,51 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } getFriendship(speciesId: number) { - let currentFriendship = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].friendship; + let currentFriendship = globalScene.gameData.starterData[this.starterId].friendship; if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; } - const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]); + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.starterId]); return { currentFriendship, friendshipCap }; } + /** + * Determines if a passive upgrade is available for the current species + * @returns true if the user has enough candies and a passive has not been unlocked already + */ + isPassiveAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId]) + && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + } + + /** + * Determines if a value reduction upgrade is available for the current species + * @returns true if the user has enough candies and all value reductions have not been unlocked already + */ + isValueReductionAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction] + && starterData.valueReduction < valueReductionMax; + } + + /** + * Determines if an same species egg can be bought for the current species + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + } + setSpecies() { const species = this.species; const starterAttributes : StarterAttributes | null = species ? { ...this.starterAttributes } : null; @@ -1967,88 +2009,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (species && (this.speciesStarterDexEntry?.seenAttr || this.isCaught())) { this.pokemonNumberText.setText(padInt(species.speciesId, 4)); - if (starterAttributes?.nickname) { - const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); - this.pokemonNameText.setText(name); - } else { - this.pokemonNameText.setText(species.name); - } if (this.isCaught()) { - const colorScheme = starterColors[species.speciesId]; - - const luck = globalScene.gameData.getDexAttrLuck(this.isCaught()); - this.pokemonLuckText.setVisible(!!luck); - this.pokemonLuckText.setText(luck.toString()); - this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); - this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); - - //Growth translate - let growthReadable = toReadableString(GrowthRate[species.growthRate]); - const growthAux = growthReadable.replace(" ", "_"); - 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.pokemonGrowthRateLabelText.setVisible(true); - this.pokemonUncaughtText.setVisible(false); - this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`); - if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) { - this.pokemonHatchedIcon.setFrame("manaphy"); - } else { - this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); - } - this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`); const defaultDexAttr = this.getCurrentDexProps(species.speciesId); - 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.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.pokemonCandyContainer, - this.pokemonHatchedIcon, - this.pokemonHatchedCountText - ].map(c => c.setVisible(false)); - this.pokemonFormText.setY(25); - } else { - this.pokemonCaughtHatchedContainer.setY(25); - this.pokemonShinyIcon.setY(117); - this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); - this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); - this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)].candyCount}`); - this.pokemonCandyContainer.setVisible(true); - this.pokemonFormText.setY(42); - this.pokemonHatchedIcon.setVisible(true); - this.pokemonHatchedCountText.setVisible(true); - - const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); - 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; - }); - - } - // Set default attributes if for some reason starterAttributes does not exist or attributes missing const props: StarterAttributes = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { @@ -2065,12 +2029,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { female: props.female, variant: props.variant ?? 0, }); - - if (this.isFormCaught(this.species, props.form)) { - const speciesForm = getPokemonSpeciesForm(species.speciesId, props.form ?? 0); - this.setTypeIcons(speciesForm.type1, speciesForm.type2); - this.pokemonSprite.clearTint(); - } } else { this.pokemonGrowthRateText.setText(""); this.pokemonGrowthRateLabelText.setVisible(false); @@ -2092,7 +2050,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { formIndex: props.formIndex, female: props.female, variant: props.variant, - forSeen: true }); this.pokemonSprite.setTint(0x808080); } @@ -2123,7 +2080,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}, forceUpdate?: boolean): void { let { shiny, formIndex, female, variant } = options; - const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? this.starterAttributes : null; // We will only update the sprite if there is a change to form, shiny/variant @@ -2194,12 +2150,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } const isFormCaught = this.isFormCaught(); + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); - const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; @@ -2221,13 +2177,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonSprite.setVisible(!this.statsMode); } - const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId); - if (currentFilteredContainer) { - const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; - starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); - currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); - } - const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); @@ -2250,27 +2199,129 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonGenderText.setText(""); } - if (caughtAttr) { - if (isFormCaught) { - this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => { - const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species; - crier.cry(); - }); - - this.pokemonSprite.clearTint(); - } else { - this.pokemonSprite.setTint(0x000000); - } + // Setting the name + if (isFormCaught || isFormSeen) { + this.pokemonNameText.setText(species.name); + } else { + this.pokemonNameText.setText(species ? "???" : ""); } - if (caughtAttr || forSeen) { + // Setting tint of the sprite + if (isFormCaught) { + this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => { + const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species; + crier.cry(); + }); + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + + // Setting luck text and sparks + if (isFormCaught) { + const luck = globalScene.gameData.getDexAttrLuck(this.isCaught()); + this.pokemonLuckText.setVisible(!!luck); + this.pokemonLuckText.setText(luck.toString()); + this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); + this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); + } else { + this.pokemonLuckText.setVisible(false); + this.pokemonLuckLabelText.setVisible(false); + } + + // Setting growth rate text + if (isFormCaught) { + let growthReadable = toReadableString(GrowthRate[species.growthRate]); + const growthAux = growthReadable.replace(" ", "_"); + 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.pokemonGrowthRateLabelText.setVisible(true); + } else { + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + } + + // Caught and hatched + if (isFormCaught) { + const colorScheme = starterColors[this.starterId]; + + this.pokemonUncaughtText.setVisible(false); + this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`); + if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) { + this.pokemonHatchedIcon.setFrame("manaphy"); + } else { + this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); + } + this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`); + + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + 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.pokemonCaughtHatchedContainer.setVisible(true); + + this.pokemonCaughtHatchedContainer.setY(25); + this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); + this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); + this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.starterId].candyCount}`); + this.pokemonCandyContainer.setVisible(true); + + if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { + this.pokemonShinyIcon.setY(135); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonHatchedIcon.setVisible(false); + this.pokemonHatchedCountText.setVisible(false); + this.pokemonFormText.setY(36); + } else { + this.pokemonShinyIcon.setY(117); + this.pokemonHatchedIcon.setVisible(true); + this.pokemonHatchedCountText.setVisible(true); + this.pokemonFormText.setY(42); + + const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); + 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; + }); + + } + } else { + this.pokemonUncaughtText.setVisible(true); + this.pokemonCaughtHatchedContainer.setVisible(false); + this.pokemonCandyContainer.setVisible(false); + this.pokemonShinyIcon.setVisible(false); + } + + // Setting type icons and form text + if (isFormCaught || isFormSeen) { const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.pokemonFormText.setText(this.getFormString((speciesForm as PokemonForm).formKey, species)); - + this.pokemonFormText.setVisible(true); + if (!isFormCaught) { + this.pokemonFormText.setY(18); + } } else { this.setTypeIcons(null, null); this.pokemonFormText.setText(""); + this.pokemonFormText.setVisible(false); } } else { this.shinyOverlay.setVisible(false); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 410bb53906a..4c920a094c6 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -11,7 +11,7 @@ import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { catchableSpecies } from "#app/data/balance/biomes"; import { Type } from "#enums/type"; -import type { DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences } from "#app/system/game-data"; +import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; import MessageUiHandler from "#app/ui/message-ui-handler"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; @@ -19,7 +19,6 @@ import { TextStyle, addTextObject } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { Passive as PassiveAttr } from "#enums/passive"; -import type { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#app/ui/dropdown"; @@ -42,7 +41,6 @@ import { pokemonStarters } from "#app/data/balance/pokemon-evolutions"; import { Biome } from "#enums/biome"; import { globalScene } from "#app/global-scene"; - interface LanguageSetting { starterInfoTextSize: string, instructionTextSize: string, @@ -139,7 +137,6 @@ interface SpeciesDetails { variant?: Variant, abilityIndex?: number, natureIndex?: number, - forSeen?: boolean, // default = false } export default class PokedexUiHandler extends MessageUiHandler { @@ -161,7 +158,6 @@ export default class PokedexUiHandler extends MessageUiHandler { private filterMode: boolean; private filterBarCursor: number = 0; - private starterMoveset: StarterMoveset | null; private scrollCursor: number; private allSpecies: PokemonSpecies[] = []; @@ -169,7 +165,6 @@ export default class PokedexUiHandler extends MessageUiHandler { private speciesLoaded: Map = new Map(); private pokerusSpecies: PokemonSpecies[] = []; private speciesStarterDexEntry: DexEntry | null; - private speciesStarterMoves: Moves[]; private assetLoadCancelled: BooleanHolder | null; public cursorObj: Phaser.GameObjects.Image; @@ -206,6 +201,20 @@ export default class PokedexUiHandler extends MessageUiHandler { private toggleDecorationsIconElement: Phaser.GameObjects.Sprite; private toggleDecorationsLabel: Phaser.GameObjects.Text; + private formTrayContainer: Phaser.GameObjects.Container; + private trayBg: Phaser.GameObjects.NineSlice; + private trayForms: PokemonForm[]; + private trayContainers: PokedexMonContainer[] = []; + private trayNumIcons: number; + private trayRows: number; + private trayColumns: number; + private trayCursorObj: Phaser.GameObjects.Image; + private trayCursor: number = 0; + private showingTray: boolean = false; + private showFormTrayIconElement: Phaser.GameObjects.Sprite; + private showFormTrayLabel: Phaser.GameObjects.Text; + private canShowFormTray: boolean; + constructor() { super(Mode.POKEDEX); } @@ -425,7 +434,6 @@ export default class PokedexUiHandler extends MessageUiHandler { this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); - starterBoxContainer.add(this.cursorObj); for (const species of allSpecies) { @@ -438,6 +446,20 @@ export default class PokedexUiHandler extends MessageUiHandler { starterBoxContainer.add(pokemonContainer); } + // Tray to display forms + this.formTrayContainer = globalScene.add.container(0, 0); + + this.trayBg = addWindow(0, 0, 0, 0); + this.trayBg.setOrigin(0, 0); + this.formTrayContainer.add(this.trayBg); + + this.trayCursorObj = globalScene.add.image(0, 0, "select_cursor"); + this.trayCursorObj.setOrigin(0, 0); + this.formTrayContainer.add(this.trayCursorObj); + starterBoxContainer.add(this.formTrayContainer); + starterBoxContainer.bringToTop(this.formTrayContainer); + this.formTrayContainer.setVisible(false); + this.starterSelectContainer.add(starterBoxContainer); this.pokemonSprite = globalScene.add.sprite(96, 143, "pkmn__sub"); @@ -449,7 +471,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = globalScene.add.sprite(10, 166, getLocalizedSpriteKey("types")); + this.type2Icon = globalScene.add.sprite(28, 158, getLocalizedSpriteKey("types")); this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); @@ -488,6 +510,17 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.toggleDecorationsIconElement); this.starterSelectContainer.add(this.toggleDecorationsLabel); + this.showFormTrayIconElement = new Phaser.GameObjects.Sprite(globalScene, 6, 168, "keyboard", "F.png"); + this.showFormTrayIconElement.setName("sprite-showFormTray-icon-element"); + this.showFormTrayIconElement.setScale(0.675); + this.showFormTrayIconElement.setOrigin(0.0, 0.0); + this.showFormTrayLabel = addTextObject(16, 168, i18next.t("pokedexUiHandler:showForms"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.showFormTrayLabel.setName("text-showFormTray-label"); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.starterSelectContainer.add(this.showFormTrayIconElement); + this.starterSelectContainer.add(this.showFormTrayLabel); + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); @@ -527,7 +560,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); - if (dexEntry.caughtAttr) { + if (dexEntry.caughtAttr || globalScene.dexForDevs) { icon.clearTint(); } else if (dexEntry.seenAttr) { icon.setTint(0x808080); @@ -860,32 +893,42 @@ export default class PokedexUiHandler extends MessageUiHandler { } else if (this.filterTextMode && !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText)) { this.filterText.resetSelection(this.filterTextCursor); success = true; + } else if (this.showingTray) { + success = this.closeFormTray(); } else { this.tryExit(); success = true; } } else if (button === Button.STATS) { - if (!this.filterMode) { + if (!this.filterMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); this.filterText.cursorObj.setVisible(false); this.filterTextMode = false; this.filterBarCursor = 0; this.setFilterMode(true); + } else { + error = true; } } else if (button === Button.V) { - if (!this.filterTextMode) { + if (!this.filterTextMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); this.filterBar.cursorObj.setVisible(false); this.filterMode = false; this.filterTextCursor = 0; this.setFilterTextMode(true); + } else { + error = true; } } else if (button === Button.CYCLE_SHINY) { - this.showDecorations = !this.showDecorations; - this.updateScroll(); - success = true; + if (!this.showingTray) { + this.showDecorations = !this.showDecorations; + this.updateScroll(); + success = true; + } else { + error = true; + } } else if (this.filterMode) { switch (button) { case Button.LEFT: @@ -982,8 +1025,55 @@ export default class PokedexUiHandler extends MessageUiHandler { success = true; break; } + } else if (this.showingTray) { + if (button === Button.ACTION) { + const formIndex = this.trayForms[this.trayCursor].formIndex; + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }); + success = true; + } else { + const numberOfForms = this.trayContainers.length; + const numOfRows = Math.ceil(numberOfForms / maxColumns); + const currentRow = Math.floor(this.trayCursor / maxColumns); + switch (button) { + case Button.UP: + if (currentRow > 0) { + success = this.setTrayCursor(this.trayCursor - 9); + } else { + const targetCol = this.trayCursor; + if (numberOfForms % 9 > targetCol) { + success = this.setTrayCursor(numberOfForms - (numberOfForms) % 9 + targetCol); + } else { + success = this.setTrayCursor(Math.max(numberOfForms - (numberOfForms) % 9 + targetCol - 9, 0)); + } + } + break; + case Button.DOWN: + if (currentRow < numOfRows - 1) { + success = this.setTrayCursor(this.trayCursor + 9); + } else { + success = this.setTrayCursor(this.trayCursor % 9); + } + break; + case Button.LEFT: + if (this.trayCursor % 9 !== 0) { + success = this.setTrayCursor(this.trayCursor - 1); + } else { + success = this.setTrayCursor(currentRow < numOfRows - 1 ? (currentRow + 1) * maxColumns - 1 : numberOfForms - 1); + } + break; + case Button.RIGHT: + if (this.trayCursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { + success = this.setTrayCursor(this.trayCursor + 1); + } else { + success = this.setTrayCursor(currentRow * 9); + } + break; + case Button.CYCLE_FORM: + success = this.closeFormTray(); + break; + } + } } else { - if (button === Button.ACTION) { ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0); success = true; @@ -1042,6 +1132,12 @@ export default class PokedexUiHandler extends MessageUiHandler { success = true; } break; + case Button.CYCLE_FORM: + const species = this.filteredPokemonContainers[this.cursor].species; + if (this.canShowFormTray) { + success = this.openFormTray(species); + } + break; } } } @@ -1068,6 +1164,9 @@ export default class PokedexUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Variant: iconPath = "V.png"; break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; case SettingKeyboard.Button_Stats: iconPath = "C.png"; break; @@ -1145,13 +1244,15 @@ export default class PokedexUiHandler extends MessageUiHandler { this.validPokemonContainers.forEach(container => { container.setVisible(false); - container.cost = globalScene.gameData.getSpeciesStarterValue(this.getStarterSpeciesId(container.species.speciesId)); + const starterId = this.getStarterSpeciesId(container.species.speciesId); + + container.cost = globalScene.gameData.getSpeciesStarterValue(starterId); // First, ensure you have the caught attributes for the species else default to bigint 0 // TODO: This might be removed depending on how accessible we want the pokedex function to be const caughtAttr = globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); - const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(container.species.speciesId)]; - const isStarterProgressable = speciesEggMoves.hasOwnProperty(this.getStarterSpeciesId(container.species.speciesId)); + const starterData = globalScene.gameData.starterData[starterId]; + const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); // Name filter const selectedName = this.filterText.getValue(FilterTextRow.NAME); @@ -1162,8 +1263,8 @@ export default class PokedexUiHandler extends MessageUiHandler { // On the other hand, in some cases it is possible to switch between different forms and combine (Deoxys) const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); // This always gets egg moves from the starter - const eggMoves = speciesEggMoves[this.getStarterSpeciesId(container.species.speciesId)]?.map(m => allMoves[m].name) ?? []; - const tmMoves = speciesTmMoves[this.getStarterSpeciesId(container.species.speciesId)]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; + const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; + const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); @@ -1185,27 +1286,40 @@ export default class PokedexUiHandler extends MessageUiHandler { container.tmMove2Icon.setVisible(false); if (fitsEggMove1 && !fitsLevelMove1) { container.eggMove1Icon.setVisible(true); + const em1 = eggMoves.findIndex(name => name === selectedMove1); + if ((starterData[starterId].eggMoves & (1 << em1)) === 0) { + container.eggMove1Icon.setTint(0x808080); + } else { + container.eggMove1Icon.clearTint(); + } } else if (fitsTmMove1 && !fitsLevelMove1) { container.tmMove1Icon.setVisible(true); } if (fitsEggMove2 && !fitsLevelMove2) { container.eggMove2Icon.setVisible(true); + const em2 = eggMoves.findIndex(name => name === selectedMove2); + if ((starterData[starterId].eggMoves & (1 << em2)) === 0) { + container.eggMove2Icon.setTint(0x808080); + } else { + container.eggMove2Icon.clearTint(); + } } else if (fitsTmMove2 && !fitsLevelMove2) { container.tmMove2Icon.setVisible(true); } // Ability filter const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); - const passives = starterPassiveAbilities[this.getStarterSpeciesId(container.species.speciesId)] ?? {} as PassiveAbilities; + const passives = starterPassiveAbilities[starterId] ?? {} as PassiveAbilities; const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); - const fitsFormAbility = container.species.forms.some(form => allAbilities[form.ability1].name === selectedAbility1); - const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility || selectedAbility1 === this.filterText.defaultText; - const fitsPassive1 = Object.values(passives).some(p => p.name === selectedAbility1); + const fitsFormAbility1 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); + const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; + const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); - const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility || selectedAbility2 === this.filterText.defaultText; - const fitsPassive2 = Object.values(passives).some(p => p.name === selectedAbility2); + const fitsFormAbility2 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); + const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; + const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); // If both fields have been set to the same ability, show both ability and passive const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || @@ -1213,11 +1327,26 @@ export default class PokedexUiHandler extends MessageUiHandler { container.passive1Icon.setVisible(false); container.passive2Icon.setVisible(false); - if (fitsPassive1) { - container.passive1Icon.setVisible(true); - } - if (fitsPassive2) { - container.passive2Icon.setVisible(true); + if (fitsPassive1 || fitsPassive2) { + if (fitsPassive1) { + if (starterData.passiveAttr > 0) { + container.passive1Icon.clearTint(); + container.passive1OverlayIcon.clearTint(); + } else { + container.passive1Icon.setTint(0x808080); + container.passive1OverlayIcon.setTint(0x808080); + } + container.passive1Icon.setVisible(true); + } else { + if (starterData.passiveAttr > 0) { + container.passive2Icon.clearTint(); + container.passive2OverlayIcon.clearTint(); + } else { + container.passive2Icon.setTint(0x808080); + container.passive2OverlayIcon.setTint(0x808080); + } + container.passive2Icon.setVisible(true); + } } // Gen filter @@ -1236,7 +1365,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // We get biomes for both the mon and its starters to ensure that evolutions get the correct filters. // TODO: We might also need to do it the other way around. - const biomes = catchableSpecies[container.species.speciesId].concat(catchableSpecies[this.getStarterSpeciesId(container.species.speciesId)]).map(b => Biome[b.biome]); + const biomes = catchableSpecies[container.species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); if (biomes.length === 0) { biomes.push("Uncatchable"); } @@ -1530,6 +1659,8 @@ export default class PokedexUiHandler extends MessageUiHandler { this.cursorObj.setVisible(!filterMode); this.filterBar.cursorObj.setVisible(filterMode); this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); if (filterMode !== this.filterMode) { this.filterMode = filterMode; @@ -1546,6 +1677,8 @@ export default class PokedexUiHandler extends MessageUiHandler { this.cursorObj.setVisible(!filterTextMode); this.filterText.cursorObj.setVisible(filterTextMode); this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); if (filterTextMode !== this.filterTextMode) { this.filterTextMode = filterTextMode; @@ -1558,6 +1691,101 @@ export default class PokedexUiHandler extends MessageUiHandler { return false; } + openFormTray(species: PokemonSpecies): boolean { + + this.trayForms = species.forms; + + this.trayNumIcons = this.trayForms.length; + this.trayRows = Math.floor(this.trayNumIcons / 9) + (this.trayNumIcons % 9 === 0 ? 0 : 1); + this.trayColumns = Math.min(this.trayNumIcons, 9); + + const maxColumns = 9; + const onScreenFirstIndex = this.scrollCursor * maxColumns; + const boxCursor = this.cursor - onScreenFirstIndex; + const boxCursorY = Math.floor(boxCursor / maxColumns); + const boxCursorX = boxCursor - boxCursorY * 9; + const spaceBelow = 9 - 1 - boxCursorY; + const spaceRight = 9 - boxCursorX; + const boxPos = calcStarterPosition(this.cursor, this.scrollCursor); + const goUp = this.trayRows <= spaceBelow - 1 ? 0 : 1; + const goLeft = this.trayColumns <= spaceRight ? 0 : 1; + + this.trayBg.setSize(13 + this.trayColumns * 17, 8 + this.trayRows * 18); + this.formTrayContainer.setX( + (goLeft ? boxPos.x - 18 * (this.trayColumns - spaceRight) : boxPos.x) - 3 + ); + this.formTrayContainer.setY( + goUp ? boxPos.y - this.trayBg.height : boxPos.y + 17 + ); + + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const dexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); + + this.trayContainers = []; + this.trayForms.map((f, index) => { + const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, shiny: props.shiny, variant: props.variant }); + this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); + // Setting tint, for all saves some caught forms may only show up as seen + if (isFormCaught || globalScene.dexForDevs) { + formContainer.icon.clearTint(); + } else if (isFormSeen) { + formContainer.icon.setTint(0x808080); + } + formContainer.setPosition(5 + (index % 9) * 18, 4 + Math.floor(index / 9) * 17); + this.formTrayContainer.add(formContainer); + this.trayContainers.push(formContainer); + }); + + this.showingTray = true; + + this.setTrayCursor(0); + + this.formTrayContainer.setVisible(true); + + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + return true; + } + + closeFormTray(): boolean { + + this.trayContainers.forEach(obj => { + this.formTrayContainer.remove(obj, true); // Removes from container and destroys it + }); + + this.trayContainers = []; + this.formTrayContainer.setVisible(false); + this.showingTray = false; + + this.setSpeciesDetails(this.lastSpecies); + return true; + } + + setTrayCursor(cursor: number): boolean { + if (!this.showingTray) { + return false; + } + + cursor = Phaser.Math.Clamp(this.trayContainers.length - 1, cursor, 0); + const changed = this.trayCursor !== cursor; + if (changed) { + this.trayCursor = cursor; + } + + this.trayCursorObj.setPosition(5 + (cursor % 9) * 18, 4 + Math.floor(cursor / 9) * 17); + + const species = this.lastSpecies; + const formIndex = this.trayForms[cursor].formIndex; + + this.setSpeciesDetails(species, { formIndex: formIndex }); + + return changed; + } + getFriendship(speciesId: number) { let currentFriendship = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].friendship; if (!currentFriendship || currentFriendship === undefined) { @@ -1592,13 +1820,13 @@ export default class PokedexUiHandler extends MessageUiHandler { this.lastSpecies = species!; // TODO: is this bang correct? - if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr)) { + if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs)) { this.pokemonNumberText.setText(i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4)); this.pokemonNameText.setText(species.name); - if (this.speciesStarterDexEntry?.caughtAttr) { + if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { // Pause the animation when the species is selected const speciesIndex = this.allSpecies.indexOf(species); @@ -1627,9 +1855,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.type1Icon.setVisible(true); this.type2Icon.setVisible(true); - this.setSpeciesDetails(species, { - forSeen: true - }); + this.setSpeciesDetails(species); this.pokemonSprite.setTint(0x808080); } } else { @@ -1646,7 +1872,6 @@ export default class PokedexUiHandler extends MessageUiHandler { setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { let { shiny, formIndex, female, variant } = options; - const forSeen: boolean = options.forSeen ?? false; // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences @@ -1667,34 +1892,33 @@ export default class PokedexUiHandler extends MessageUiHandler { this.assetLoadCancelled = null; } - this.starterMoveset = null; - this.speciesStarterMoves = []; - if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; if (!dexEntry.caughtAttr) { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); - if (shiny === undefined || shiny !== props.shiny) { + if (shiny === undefined) { shiny = props.shiny; } - if (formIndex === undefined || formIndex !== props.formIndex) { + if (formIndex === undefined) { formIndex = props.formIndex; } - if (female === undefined || female !== props.female) { + if (female === undefined) { female = props.female; } - if (variant === undefined || variant !== props.variant) { + if (variant === undefined) { variant = props.variant; } } + const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; if (shouldUpdateSprite) { - species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? if (assetLoadCancelled.value) { return; @@ -1711,21 +1935,37 @@ export default class PokedexUiHandler extends MessageUiHandler { this.pokemonSprite.setVisible(!(this.filterMode || this.filterTextMode)); } - if (dexEntry.caughtAttr || forSeen) { + if (isFormCaught || globalScene.dexForDevs) { + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); // TODO: always selecting the first form - this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { this.setTypeIcons(null, null); } + + if (species?.forms?.length > 1) { + if (!this.showingTray) { + this.showFormTrayIconElement.setVisible(true); + this.showFormTrayLabel.setVisible(true); + } + this.canShowFormTray = true; + } else { + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.canShowFormTray = false; + } + } else { this.setTypeIcons(null, null); } - if (!this.starterMoveset) { - this.starterMoveset = this.speciesStarterMoves.slice(0, 4) as StarterMoveset; - } } setTypeIcons(type1: Type | null, type2: Type | null): void { @@ -1784,7 +2024,6 @@ export default class PokedexUiHandler extends MessageUiHandler { ui.showText(i18next.t("pokedexUiHandler:confirmExit"), null, () => { ui.setModeWithoutClear(Mode.CONFIRM, () => { ui.setMode(Mode.POKEDEX, "refresh"); - globalScene.clearPhaseQueue(); this.clearText(); this.clear(); ui.revertMode(); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 20ca2cc88da..5476f38cc6a 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1981,8 +1981,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { female: starterAttributes.female }; ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, starterAttributes.form, attributes); - return true; }); + return true; } }); options.push({ From 702a6ba482b5b996c601afb2829d86823f79a986 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 11 Feb 2025 03:24:48 -0800 Subject: [PATCH 013/171] [i18n] Update locales submodule (#5298) --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 5f6fa82c17d..bfcd7f91c39 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 5f6fa82c17d5981eaec15f105880ac2b4c99cc8d +Subproject commit bfcd7f91c39630f155839872c8f66fd0a89e12ac From 5296966f70002f65b550fbe355a456fadd04006b Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 11 Feb 2025 05:25:36 -0600 Subject: [PATCH 014/171] [Ability] [Move] Implement Magic Bounce and Magic Coat (#5225) * Add unit tests for magic bounce * Add reflectable tag and apply to moves * Add BattlerTagType for Magic Coat * Add more magic bounce tests * Add magic bounce test for sticky web source * Mostly working magic bounce and magic coat * Fix missing negation on mayBounce check * Move onto the next target after bouncing * Fix magic bounce accuracy check test * Finish magic bounce impl * Make spikes use leftmost magic bounce target * Add magic coat tests * Add MagicCoatTag to battler-tags.ts * Add final set of tests for Magic Coat / Bounce * Fix semi invulnerbale check in hitCheck * Fix magic bounce semi-invulnerable interaction This was based on smogon's incorrect handling of this situation * Magic bounce should not bounce anything during semi-invulnerable state * Activate mirror armor interaction test Also update i18 locales key to `magicCoatActivated` --- src/battle-scene.ts | 32 ++- src/data/ability.ts | 12 +- src/data/battler-tags.ts | 20 ++ src/data/move.ts | 279 +++++++++++++------ src/enums/battler-tag-type.ts | 1 + src/phases/move-effect-phase.ts | 141 ++++++++-- src/phases/move-phase.ts | 14 +- src/test/abilities/magic_bounce.test.ts | 351 ++++++++++++++++++++++++ src/test/moves/magic_coat.test.ts | 286 +++++++++++++++++++ 9 files changed, 1005 insertions(+), 131 deletions(-) create mode 100644 src/test/abilities/magic_bounce.test.ts create mode 100644 src/test/moves/magic_coat.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 7aa0369877b..3f285c274af 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2353,14 +2353,14 @@ export default class BattleScene extends SceneBase { } /** - * Adds Phase to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex - * @param phase {@linkcode Phase} the phase to add + * Adds Phase(s) to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex + * @param phases {@linkcode Phase} the phase(s) to add */ - unshiftPhase(phase: Phase): void { + unshiftPhase(...phases: Phase[]): void { if (this.phaseQueuePrependSpliceIndex === -1) { - this.phaseQueuePrepend.push(phase); + this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase); + this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); } } @@ -2498,32 +2498,38 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase, targetPhase: Constructor): boolean { + prependToPhase(phase: Phase | Phase [], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [ phase ]; + } const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1) { - this.phaseQueue.splice(targetIndex, 0, phase); + this.phaseQueue.splice(targetIndex, 0, ...phase); return true; } else { - this.unshiftPhase(phase); + this.unshiftPhase(...phase); return false; } } /** - * Tries to add the input phase to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} - * @param phase {@linkcode Phase} the phase to be added + * Tries to add the input phase(s) to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} + * @param phase {@linkcode Phase} the phase(s) to be added * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase(phase: Phase, targetPhase: Constructor): boolean { + appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [ phase ]; + } const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { - this.phaseQueue.splice(targetIndex + 1, 0, phase); + this.phaseQueue.splice(targetIndex + 1, 0, ...phase); return true; } else { - this.unshiftPhase(phase); + this.unshiftPhase(...phase); return false; } } diff --git a/src/data/ability.ts b/src/data/ability.ts index cd31c62f7f6..a6d00b29fbc 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -4484,6 +4484,13 @@ export class InfiltratorAbAttr extends AbAttr { } } +/** + * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Magic Bounce}. + * Allows the source to bounce back {@linkcode MoveFlags.REFLECTABLE | Reflectable} + * moves as if the user had used {@linkcode Moves.MAGIC_COAT | Magic Coat}. + */ +export class ReflectStatusMoveAbAttr extends AbAttr { } + export class UncopiableAbilityAbAttr extends AbAttr { constructor() { super(false); @@ -5805,8 +5812,11 @@ export function initAbilities() { }, Stat.SPD, 1) .attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1), new Ability(Abilities.MAGIC_BOUNCE, 5) + .attr(ReflectStatusMoveAbAttr) .ignorable() - .unimplemented(), + // Interactions with stomping tantrum, instruct, encore, and probably other moves that + // rely on move history + .edgeCase(), new Ability(Abilities.SAP_SIPPER, 5) .attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1) .ignorable(), diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 43168ea5c0c..91ab10aecfa 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2975,6 +2975,24 @@ export class PsychoShiftTag extends BattlerTag { } } +/** + * Tag associated with the move Magic Coat. + */ +export class MagicCoatTag extends BattlerTag { + constructor() { + super(BattlerTagType.MAGIC_COAT, BattlerTagLapseType.TURN_END, 1, Moves.MAGIC_COAT); + } + + /** + * Queues the "[PokemonName] shrouded itself with Magic Coat" message when the tag is added. + * @param pokemon - The target {@linkcode Pokemon} + */ + override onAdd(pokemon: Pokemon) { + // "{pokemonNameWithAffix} shrouded itself with Magic Coat!" + globalScene.queueMessage(i18next.t("battlerTags:magicCoatOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } +} + /** * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID. * @param sourceId - The ID of the pokemon adding the tag @@ -3164,6 +3182,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new GrudgeTag(); case BattlerTagType.PSYCHO_SHIFT: return new PsychoShiftTag(); + case BattlerTagType.MAGIC_COAT: + return new MagicCoatTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/move.ts b/src/data/move.ts index 6c41f0b764d..75908f86a14 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -125,7 +125,9 @@ export enum MoveFlags { /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ IGNORE_SUBSTITUTE = 1 << 17, /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ - REDIRECT_COUNTER = 1 << 18, + REDIRECT_COUNTER = 1 << 18, + /** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */ + REFLECTABLE = 1 << 19, } type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; @@ -610,6 +612,16 @@ export default class Move implements Localizable { return this; } + /** + * Sets the {@linkcode MoveFlags.REFLECTABLE} flag for the calling Move + * @see {@linkcode Moves.ATTRACT} + * @returns The {@linkcode Move} that called this function + */ + reflectable(): this { + this.setFlag(MoveFlags.REFLECTABLE, true); + return this; + } + /** * Checks if the move flag applies to the pokemon(s) using/receiving the move * @param flag {@linkcode MoveFlags} MoveFlag to check on user and/or target @@ -5332,6 +5344,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: + case BattlerTagType.MAGIC_COAT: return 3; case BattlerTagType.PROTECTED: case BattlerTagType.FLYING: @@ -8334,7 +8347,8 @@ export function initMoves() { .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .ignoresSubstitute() .hidesTarget() - .windMove(), + .windMove() + .reflectable(), new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) @@ -8358,7 +8372,8 @@ export function initMoves() { new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) .attr(FlinchAttr), new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) .attr(FlinchAttr), new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), @@ -8387,7 +8402,8 @@ export function initMoves() { .recklessMove(), new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), @@ -8400,30 +8416,36 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) .attr(FlinchAttr) .bitingMove(), new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .soundBased() - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .soundBased() - .hidesTarget(), + .hidesTarget() + .reflectable(), new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.SUPERSONIC, Type.NORMAL, 55, 20, -1, 0, 1) .attr(ConfuseAttr) - .soundBased(), + .soundBased() + .reflectable(), new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) .attr(FixedDamageAttr, 20), new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -8476,7 +8498,8 @@ export function initMoves() { .triageMove(), new StatusMove(Moves.LEECH_SEED, Type.GRASS, 90, 10, -1, 0, 1) .attr(LeechSeedAttr) - .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)), + .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)) + .reflectable(), new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1) .attr(GrowthStatStageChangeAttr), new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) @@ -8490,13 +8513,16 @@ export function initMoves() { .attr(AntiSunlightPowerDecreaseAttr), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.STUN_SPORE, Type.GRASS, 75, 30, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.SLEEP_POWDER, Type.GRASS, 75, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), + .powderMove() + .reflectable(), new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) @@ -8506,7 +8532,8 @@ export function initMoves() { .target(MoveTarget.RANDOM_NEAR_ENEMY), new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) .attr(FixedDamageAttr, 40), new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) @@ -8517,7 +8544,8 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(RespectAttackTypeImmunityAttr), + .attr(RespectAttackTypeImmunityAttr) + .reflectable(), new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) @@ -8539,13 +8567,15 @@ export function initMoves() { .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) - .attr(ToxicAccuracyAttr), + .attr(ToxicAccuracyAttr) + .reflectable(), new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) .attr(ConfuseAttr), new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1) @@ -8563,7 +8593,8 @@ export function initMoves() { .ignoresSubstitute(), new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -2) - .soundBased(), + .soundBased() + .reflectable(), new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.EVA ], 1, true), new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1) @@ -8575,9 +8606,11 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false) .attr(StatStageChangeAttr, [ Stat.EVA ], 2, true), new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1) @@ -8638,7 +8671,8 @@ export function initMoves() { new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true), new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), @@ -8648,14 +8682,16 @@ export function initMoves() { .condition(failOnGravityCondition) .recklessMove(), new StatusMove(Moves.GLARE, Type.NORMAL, 100, 30, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.PARALYSIS), + .attr(StatusEffectAttr, StatusEffect.PARALYSIS) + .reflectable(), new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) .attr(HitHealAttr) .condition(targetSleptOrComatoseCondition) .triageMove(), new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.BARRAGE, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false) @@ -8664,7 +8700,8 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .attr(HighCritAttr) @@ -8683,9 +8720,11 @@ export function initMoves() { .punchingMove(), new StatusMove(Moves.SPORE, Type.GRASS, 100, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) @@ -8744,7 +8783,8 @@ export function initMoves() { .attr(StealHeldItemChanceAttr, 0.3), new StatusMove(Moves.SPIDER_WEB, Type.BUG, -1, 10, -1, 0, 2) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2) @@ -8775,12 +8815,14 @@ export function initMoves() { new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .powderMove() - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2) .ignoresSubstitute() - .attr(ReducePpMoveAttr, 4), + .attr(ReducePpMoveAttr, 4) + .reflectable(), new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -8790,10 +8832,12 @@ export function initMoves() { new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) .punchingMove(), new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.SPD ], -2), + .attr(StatStageChangeAttr, [ Stat.SPD ], -2) + .reflectable(), new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2) .attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => { globalScene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })); @@ -8808,13 +8852,15 @@ export function initMoves() { .ballBombMove(), new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2) .attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.ZAP_CANNON, Type.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .ballBombMove(), new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() .attr(DestinyBondAttr) @@ -8860,7 +8906,8 @@ export function initMoves() { .attr(ProtectAttr, BattlerTagType.ENDURING) .condition(failIfLastCondition), new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.ATK ], -2), + .attr(StatStageChangeAttr, [ Stat.ATK ], -2) + .reflectable(), new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) .partial() // Does not lock the user, also does not increase damage properly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), @@ -8868,7 +8915,8 @@ export function initMoves() { .attr(SurviveDamageAttr), new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2) .attr(HealAttr, 0.5) .triageMove(), @@ -8881,11 +8929,13 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.INFATUATED) .ignoresSubstitute() - .condition((user, target, move) => user.isOppositeGender(target)), + .condition((user, target, move) => user.isOppositeGender(target)) + .reflectable(), new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2) .attr(BypassSleepAttr) .attr(RandomMovesetMoveAttr, invalidSleepTalkMoves, false) @@ -8932,7 +8982,8 @@ export function initMoves() { new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) .ignoresSubstitute() - .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)), + .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)) + .reflectable(), new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) .partial(), // No effect implemented new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) @@ -8953,7 +9004,8 @@ export function initMoves() { .attr(RemoveArenaTrapAttr), new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.EVA ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) @@ -9041,12 +9093,15 @@ export function initMoves() { new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3) .ignoresSubstitute() .edgeCase() // Incomplete implementation because of Uproar's partial implementation - .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1) + .reflectable(), new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) - .attr(StatusEffectAttr, StatusEffect.BURN), + .attr(StatusEffectAttr, StatusEffect.BURN) + .reflectable(), new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) .attr(SacrificialAttrOnHit) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2), @@ -9070,7 +9125,8 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false), new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3) .ignoresSubstitute() - .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4), + .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4) + .reflectable(), new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3) .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() @@ -9093,7 +9149,12 @@ export function initMoves() { new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true), new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3) - .unimplemented(), + .attr(AddBattlerTagAttr, BattlerTagType.MAGIC_COAT, true, true, 0) + .condition(failIfLastCondition) + // Interactions with stomping tantrum, instruct, and other moves that + // rely on move history + // Also will not reflect roar / whirlwind if the target has ForceSwitchOutImmunityAbAttr + .edgeCase(), new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3) .unimplemented(), new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) @@ -9102,7 +9163,8 @@ export function initMoves() { .attr(RemoveScreensAttr), new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) - .condition((user, target, move) => !target.status && !target.isSafeguarded(user)), + .condition((user, target, move) => !target.status && !target.isSafeguarded(user)) + .reflectable(), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), @@ -9146,7 +9208,8 @@ export function initMoves() { .ballBombMove(), new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], -2) - .danceMove(), + .danceMove() + .reflectable(), new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3) .attr(ConfuseAttr) .danceMove() @@ -9192,7 +9255,8 @@ export function initMoves() { .attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER) .target(MoveTarget.PARTY), new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), + .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) + .reflectable(), new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) .attr(HighCritAttr) .slicingMove() @@ -9203,7 +9267,8 @@ export function initMoves() { .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE), new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), @@ -9212,12 +9277,15 @@ export function initMoves() { .windMove(), new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1) + .reflectable(), new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) @@ -9255,7 +9323,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1) .soundBased() @@ -9318,7 +9387,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), @@ -9364,6 +9434,7 @@ export function initMoves() { new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) + .reflectable() .unimplemented(), new AttackMove(Moves.FLING, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .makesContact(false) @@ -9383,14 +9454,16 @@ export function initMoves() { .attr(LessPPMorePowerAttr), new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120) .makesContact(), new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.POWER_TRICK, true), new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) - .attr(SuppressAbilitiesAttr), + .attr(SuppressAbilitiesAttr) + .reflectable(), new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true) .target(MoveTarget.USER_SIDE), @@ -9412,12 +9485,14 @@ export function initMoves() { new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) .attr(LastResortAttr), new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) - .attr(AbilityChangeAttr, Abilities.INSOMNIA), + .attr(AbilityChangeAttr, Abilities.INSOMNIA) + .reflectable(), new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SwapStatStagesAttr, BATTLE_STATS) .ignoresSubstitute(), @@ -9529,7 +9604,8 @@ export function initMoves() { .attr(ClearTerrainAttr) .attr(RemoveScreensAttr, false) .attr(RemoveArenaTrapAttr, true) - .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false), + .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false) + .reflectable(), new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4) .attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5) .ignoresProtect() @@ -9567,10 +9643,12 @@ export function initMoves() { new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) .condition((user, target, move) => target.isOppositeGender(user)) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) .attr(WeightPowerAttr) .makesContact(), @@ -9614,7 +9692,8 @@ export function initMoves() { .attr(TrapAttr, BattlerTagType.MAGMA_STORM), new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 .attr(StatusEffectAttr, StatusEffect.SLEEP) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) @@ -9654,7 +9733,8 @@ export function initMoves() { .condition((_user, target, _move) => !(target.species.speciesId === Species.GENGAR && target.getFormKey() === "mega")) .condition((_user, target, _move) => Utils.isNullOrUndefined(target.getTag(BattlerTagType.INGRAIN)) && Utils.isNullOrUndefined(target.getTag(BattlerTagType.IGNORE_FLYING))) .attr(AddBattlerTagAttr, BattlerTagType.TELEKINESIS, false, true, 3) - .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3), + .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3) + .reflectable(), new StatusMove(Moves.MAGIC_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) @@ -9687,7 +9767,8 @@ export function initMoves() { .attr(ElectroBallPowerAttr) .ballBombMove(), new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5) - .attr(ChangeTypeAttr, Type.WATER), + .attr(ChangeTypeAttr, Type.WATER) + .reflectable(), new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5) @@ -9700,9 +9781,11 @@ export function initMoves() { new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) .attr(TargetAtkUserAtkAttr), new StatusMove(Moves.SIMPLE_BEAM, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityChangeAttr, Abilities.SIMPLE), + .attr(AbilityChangeAttr, Abilities.SIMPLE) + .reflectable(), new StatusMove(Moves.ENTRAINMENT, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityGiveAttr), + .attr(AbilityGiveAttr) + .reflectable(), new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() @@ -9740,7 +9823,8 @@ export function initMoves() { new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5) .attr(HealAttr, 0.5, false, false) .pulseMove() - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr( MovePowerMultiplierAttr, @@ -9943,7 +10027,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded() }), new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6) .attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ), new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) @@ -9951,10 +10036,12 @@ export function initMoves() { .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GHOST), + .attr(AddTypeAttr, Type.GHOST) + .reflectable(), new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE) .target(MoveTarget.BOTH_SIDES), @@ -9963,7 +10050,8 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_OTHERS) .triageMove(), new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GRASS), + .attr(AddTypeAttr, Type.GRASS) + .reflectable(), new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) .windMove() .makesContact(false) @@ -9977,9 +10065,11 @@ export function initMoves() { new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY }) .attr(ForceSwitchOutAttr, true) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) - .attr(InvertStatsAttr), + .attr(InvertStatsAttr) + .reflectable(), new AttackMove(Moves.DRAINING_KISS, Type.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .makesContact() @@ -10018,10 +10108,12 @@ export function initMoves() { .condition(failIfLastCondition), new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) - .soundBased(), + .soundBased() + .reflectable(), new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true }) .makesContact(false) @@ -10048,14 +10140,17 @@ export function initMoves() { .condition(failIfSingleBattle) .target(MoveTarget.NEAR_ALLY), new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.SPATK ], -2), + .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) + .reflectable(), new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC }) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) .attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true) .ignoresSubstitute() - .powderMove(), + .powderMove() + .reflectable(), new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), @@ -10077,7 +10172,8 @@ export function initMoves() { .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6) - .attr(StatStageChangeAttr, [ Stat.ATK ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK ], -1) + .reflectable(), new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) @@ -10221,13 +10317,15 @@ export function initMoves() { .punchingMove(), new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) .attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => globalScene.arena.terrain?.terrainType === TerrainType.GRASSY) - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7) .attr(HitHealAttr, null, Stat.ATK) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .condition((user, target, move) => target.getStatStage(Stat.ATK) > -6) - .triageMove(), + .triageMove() + .reflectable(), new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) @@ -10237,10 +10335,12 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7) .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false) - .condition(failIfSingleBattle), + .condition(failIfSingleBattle) + .reflectable(), new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7) .attr(StatusEffectAttr, StatusEffect.POISON) - .attr(StatStageChangeAttr, [ Stat.SPD ], -1), + .attr(StatStageChangeAttr, [ Stat.SPD ], -1) + .reflectable(), new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false), new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7) @@ -10284,7 +10384,8 @@ export function initMoves() { (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? .attr(HealAttr, 0.5) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() .attr(MatchUserTypeAttr), @@ -10373,7 +10474,8 @@ export function initMoves() { new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) + .reflectable(), new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) .attr(FlinchAttr), new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) @@ -10492,10 +10594,12 @@ export function initMoves() { .condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false), + .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false) + .reflectable(), new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) .attr(ChangeTypeAttr, Type.PSYCHIC) - .powderMove(), + .powderMove() + .reflectable(), new AttackMove(Moves.DRAGON_DARTS, Type.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false) @@ -10672,6 +10776,7 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8) .target(MoveTarget.ALL_NEAR_OTHERS) + .reflectable() .unimplemented(), new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1) diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index f28ac37ae27..719b08c5b81 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -94,4 +94,5 @@ export enum BattlerTagType { PSYCHO_SHIFT = "PSYCHO_SHIFT", ENDURE_TOKEN = "ENDURE_TOKEN", POWDER = "POWDER", + MAGIC_COAT = "MAGIC_COAT", } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index be9a36940ea..35fe446fc43 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -12,6 +12,7 @@ import { PostAttackAbAttr, PostDamageAbAttr, PostDefendAbAttr, + ReflectStatusMoveAbAttr, TypeImmunityAbAttr, } from "#app/data/ability"; import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; @@ -31,6 +32,7 @@ import { AttackMove, DelayedAttackAttr, FlinchAttr, + getMoveTargets, HitsTagAttr, MissEffectAttr, MoveCategory, @@ -47,7 +49,7 @@ import { } from "#app/data/move"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; import { Type } from "#enums/type"; -import type { PokemonMove } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -60,17 +62,27 @@ import { } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; +import { type nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; import i18next from "i18next"; +import type { Phase } from "#app/phase"; +import { ShowAbilityPhase } from "./show-ability-phase"; +import { MovePhase } from "./move-phase"; +import { MoveEndPhase } from "./move-end-phase"; export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; protected targets: BattlerIndex[]; + protected reflected: boolean = false; - constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { + /** + * @param reflected Indicates that the move was reflected by the user due to magic coat or magic bounce + */ + constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected: boolean = false) { super(battlerIndex); this.move = move; + this.reflected = reflected; /** * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies * with no party members available to switch in, then the right Pokemon takes the index @@ -184,12 +196,14 @@ export class MoveEffectPhase extends PokemonPhase { && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) && !targets[0]?.getTag(SemiInvulnerableTag); + const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + /** - * If no targets are left for the move to hit (FAIL), or the invoked move is single-target + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target * (and not random target) and failed the hit check against its target (MISS), log the move * as FAILed or MISSed (depending on the conditions above) and end this phase. */ - if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { this.stopMultiHit(); if (hasActiveTargets) { globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); @@ -211,12 +225,21 @@ export class MoveEffectPhase extends PokemonPhase { new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; - for (const target of targets) { - // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles - if (move.moveTarget === MoveTarget.ENEMY_SIDE && target !== targets[targets.length - 1]) { - continue; - } + // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles + // and check which target will magic bounce. + const trueTargets: Pokemon[] = move.moveTarget !== MoveTarget.ENEMY_SIDE ? targets : (() => { + const magicCoatTargets = targets.filter(t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr)); + + // only magic coat effect cares about order + if (!mayBounce || magicCoatTargets.length === 0) { + return [ targets[0] ]; + } + return [ magicCoatTargets[0] ]; + })(); + + const queuedPhases: Phase[] = []; + for (const target of trueTargets) { /** The {@linkcode ArenaTagSide} to which the target belongs */ const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; /** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */ @@ -229,7 +252,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ - const isProtected = ( + const isProtected = !([ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES ].includes(this.move.getMove().moveTarget)) && ( bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) && (hasConditionalProtectApplied.value @@ -238,13 +261,39 @@ export class MoveEffectPhase extends PokemonPhase { || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + /** Is the target hidden by the effects of its Commander ability? */ + const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; + + /** Is the target reflecting status moves from the magic coat move? */ + const isReflecting = !!target.getTag(BattlerTagType.MAGIC_COAT); + + /** Is the target's magic bounce ability not ignored and able to reflect this move? */ + const canMagicBounce = !isReflecting && !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && target.hasAbilityWithAttr(ReflectStatusMoveAbAttr); + + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + + /** Is the target reflecting the effect, not protected, and not in an semi-invulnerable state?*/ + const willBounce = (!isProtected && !this.reflected && !isCommanding + && move.hasFlag(MoveFlags.REFLECTABLE) + && (isReflecting || canMagicBounce) + && !semiInvulnerableTag); + + // If the move will bounce, then queue the bounce and move on to the next target + if (!target.switchOutStatus && willBounce) { + const newTargets = move.isMultiTarget() ? getMoveTargets(target, move.id).targets : [ user.getBattlerIndex() ]; + if (!isReflecting) { + queuedPhases.push(new ShowAbilityPhase(target.getBattlerIndex(), target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr))); + } + + queuedPhases.push(new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true)); + continue; + } + /** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */ const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !target.getTag(SemiInvulnerableTag); + && !semiInvulnerableTag; - /** Is the target hidden by the effects of its Commander ability? */ - const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; /** * If the move missed a target, stop all future hits against that target @@ -371,6 +420,10 @@ export class MoveEffectPhase extends PokemonPhase { applyAttrs.push(k); } + // Apply queued phases + if (queuedPhases.length) { + globalScene.appendToPhase(queuedPhases, MoveEndPhase); + } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : @@ -586,12 +639,7 @@ export class MoveEffectPhase extends PokemonPhase { } } - if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { - return true; - } - - // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if (this.checkBypassAccAndInvuln(target)) { return true; } @@ -599,15 +647,12 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - if (target.getTag(BattlerTagType.TELEKINESIS) && !target.getTag(SemiInvulnerableTag) && !this.move.getMove().hasAttr(OneHitKOAttr)) { + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + if (target.getTag(BattlerTagType.TELEKINESIS) && !semiInvulnerableTag && !this.move.getMove().hasAttr(OneHitKOAttr)) { return true; } - const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); - if (semiInvulnerableTag - && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType) - && !(this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON)) - ) { + if (semiInvulnerableTag && !this.checkBypassSemiInvuln(semiInvulnerableTag)) { return false; } @@ -623,6 +668,52 @@ export class MoveEffectPhase extends PokemonPhase { return rand < (moveAccuracy * accuracyMultiplier); } + /** + * Check whether the move should bypass *both* the accuracy *and* semi-invulnerable states. + * @param target - The {@linkcode Pokemon} targeted by the invoked move + * @returns `true` if the move should bypass accuracy and semi-invulnerability + * + * Accuracy and semi-invulnerability can be bypassed by: + * - An ability like {@linkcode Abilities.NO_GUARD | No Guard} + * - A poison type using {@linkcode Moves.TOXIC | Toxic} + * - A move like {@linkcode Moves.LOCK_ON | Lock-On} or {@linkcode Moves.MIND_READER | Mind Reader}. + * + * Does *not* check against effects {@linkcode Moves.GLAIVE_RUSH | Glaive Rush} status (which + * should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig, + * (which should not bypass the accuracy check). + * + * @see {@linkcode hitCheck} + */ + public checkBypassAccAndInvuln(target: Pokemon) { + const user = this.getUserPokemon(); + if (!user) { + return false; + } + if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { + return true; + } + if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON))) { + return true; + } + // TODO: Fix lock on / mind reader check. + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + return true; + } + } + + /** + * Check whether the move is able to ignore the given `semiInvulnerableTag` + * @param semiInvulnerableTag - The semiInvulnerbale tag to check against + * @returns `true` if the move can ignore the semi-invulnerable state + */ + public checkBypassSemiInvuln(semiInvulnerableTag: SemiInvulnerableTag | nil): boolean { + if (!semiInvulnerableTag) { + return false; + } + const move = this.move.getMove(); + return move.getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType); + } + /** @returns The {@linkcode Pokemon} using this phase's invoked move */ public getUserPokemon(): Pokemon | null { if (this.battlerIndex > BattlerIndex.ENEMY_2) { diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 5330540c8b2..9d32189edb5 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -58,6 +58,7 @@ export class MovePhase extends BattlePhase { protected ignorePp: boolean; protected failed: boolean = false; protected cancelled: boolean = false; + protected reflected: boolean = false; public get pokemon(): Pokemon { return this._pokemon; @@ -84,10 +85,12 @@ export class MovePhase extends BattlePhase { } /** - * @param followUp Indicates that the move being uses is a "follow-up" - for example, a move being used by Metronome or Dancer. + * @param followUp Indicates that the move being used is a "follow-up" - for example, a move being used by Metronome or Dancer. * Follow-ups bypass a few failure conditions, including flinches, sleep/paralysis/freeze and volatile status checks, etc. + * @param reflected Indicates that the move was reflected by Magic Coat or Magic Bounce. + * Reflected moves cannot be reflected again and will not trigger Dancer. */ - constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false) { + constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false) { super(); this.pokemon = pokemon; @@ -95,6 +98,7 @@ export class MovePhase extends BattlePhase { this.move = move; this.followUp = followUp; this.ignorePp = ignorePp; + this.reflected = reflected; } /** @@ -140,7 +144,7 @@ export class MovePhase extends BattlePhase { } // Check move to see if arena.ignoreAbilities should be true. - if (!this.followUp) { + if (!this.followUp || this.reflected) { if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { globalScene.arena.setIgnoreAbilities(true, this.pokemon.getBattlerIndex()); } @@ -335,7 +339,7 @@ export class MovePhase extends BattlePhase { */ if (success) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); - globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move)); + globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected)); } else { if ([ Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE ].includes(this.move.moveId)) { @@ -543,7 +547,7 @@ export class MovePhase extends BattlePhase { return; } - globalScene.queueMessage(i18next.t("battle:useMove", { + globalScene.queueMessage(i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), moveName: this.move.getName() }), 500); diff --git a/src/test/abilities/magic_bounce.test.ts b/src/test/abilities/magic_bounce.test.ts new file mode 100644 index 00000000000..2fc460662ca --- /dev/null +++ b/src/test/abilities/magic_bounce.test.ts @@ -0,0 +1,351 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Magic Bounce", () => { + 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(Abilities.BALL_FETCH) + .battleType("single") + .moveset( [ Moves.GROWL, Moves.SPLASH ]) + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.MAGIC_BOUNCE) + .enemyMoveset(Moves.SPLASH); + }); + + it("should reflect basic status moves", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce moves while the target is in the semi-invulnerable state", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.GROWL ]); + game.override.enemyMoveset( [ Moves.FLY ]); + + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.FLY); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should individually bounce back multi-target moves", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([ Moves.GROWL ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.ability(Abilities.MAGIC_BOUNCE); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -2)).toBeTruthy(); + }); + + it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.SPIKES ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should bounce spikes even when the target is protected", async () => { + game.override.moveset([ Moves.SPIKES ]); + game.override.enemyMoveset([ Moves.PROTECT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + }); + + it("should not bounce spikes when the target is in the semi-invulnerable state", async () => { + game.override.moveset([ Moves.SPIKES ]); + game.override.enemyMoveset([ Moves.FLY ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPIKES); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1); + }); + + it("should not bounce back curse", async() => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([ Species.GASTLY ]); + game.override.moveset([ Moves.CURSE ]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + it("should not cause encore to be interrupted after bouncing", async () => { + game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.TACKLE, Moves.GROWL ]); + // game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 1 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + + // turn 2 + vi.spyOn(playerPokemon, "getAbility").mockRestore(); + game.move.select(Moves.GROWL); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.GROWL, Moves.TACKLE ]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { + game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([ Species.PHANPY ]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); + + it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM ]); + + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + const [ enemy_1, enemy_2 ] = game.scene.getEnemyField(); + // set speed just incase logic erroneously checks for speed order + enemy_1.setStat(Stat.SPD, enemy_2.getStat(Stat.SPD) + 1); + + // turn 1 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true); + + // turn 2 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + }); + + it("should not bounce back status moves that hit through semi-invulnerable states", async () => { + game.override.moveset([ Moves.TOXIC, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + game.move.select(Moves.TOXIC); + await game.forceEnemyMove(Moves.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(); + + game.override.ability(Abilities.NO_GUARD); + game.move.select(Moves.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); + }); +}); + diff --git a/src/test/moves/magic_coat.test.ts b/src/test/moves/magic_coat.test.ts new file mode 100644 index 00000000000..7371c89d4ac --- /dev/null +++ b/src/test/moves/magic_coat.test.ts @@ -0,0 +1,286 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Magic Coat", () => { + 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(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.MAGIC_COAT); + }); + + it("should fail if the user goes last in the turn", async () => { + game.override.moveset([ Moves.PROTECT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.PROTECT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if called again in the same turn due to moves like instruct", async () => { + game.override.moveset([ Moves.INSTRUCT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.INSTRUCT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should not reflect moves used on the next turn", async () => { + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + // turn 1 + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should reflect basic status moves", async () => { + game.override.moveset([ Moves.GROWL ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should individually bounce back multi-target moves when used by both targets in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -1)).toBeTruthy(); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([ Moves.GROWL ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MAGIC_BOUNCE); + game.override.moveset([ Moves.GROWL, Moves.MAGIC_COAT ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.MAGIC_COAT, 0); + game.move.select(Moves.GROWL, 1); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyField()[0].getStatStage(Stat.ATK)).toBe(0); + }); + + // todo while Mirror Armor is not implemented + it.todo("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should still bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + game.override.moveset([ Moves.GROWL ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only bounce spikes back once when both targets use magic coat in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.SPIKES ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should not bounce back curse", async() => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([ Species.GASTLY ]); + game.override.moveset([ Moves.CURSE ]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([ Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.TACKLE ]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { + game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([ Species.PHANPY ]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); +}); From b31d5fd23e2f8b5263d797ad560eb8506c57dd4a Mon Sep 17 00:00:00 2001 From: geeilhan <107366005+geeilhan@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:26:01 +0100 Subject: [PATCH 015/171] [Move] Spectral Thief Full Implementation (#4891) * fully implemented spectral thief * Update to structure of implementation * line commented target.scene.queueMessage since message does not exist yet * changed documentation * added move-trigger.json key * removed line comment since key was added to english locales * removed console.log messages used for debugging * refactored move-trigger key to race with @muscode13 * added more automated tests * github tests failed * removed line comment since key was added to english locales * refactored move-trigger key to race with @muscode13 * added more automated tests * github tests failed * solved conflicts * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * removed .partial() * corrected spectral thief name * changed target.scene to globalScene * changed comments --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/data/move.ts | 67 +++++++- src/field/pokemon.ts | 41 ++++- src/test/moves/spectral_thief.test.ts | 224 ++++++++++++++++++++++++++ 3 files changed, 329 insertions(+), 3 deletions(-) create mode 100644 src/test/moves/spectral_thief.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 75908f86a14..1c768f20bb0 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -4380,6 +4380,69 @@ export class CueNextRoundAttr extends MoveEffectAttr { } } +/** + * Attribute that changes stat stages before the damage is calculated + */ +export class StatChangeBeforeDmgCalcAttr extends MoveAttr { + /** + * Applies Stat Changes before damage is calculated + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly applied + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return false; + } +} + +/** + * Steals the postitive Stat stages of the target before damage calculation so stat changes + * apply to damage calculation (e.g. {@linkcode Moves.SPECTRAL_THIEF}) + * {@link https://bulbapedia.bulbagarden.net/wiki/Spectral_Thief_(move) | Spectral Thief} + */ +export class SpectralThiefAttr extends StatChangeBeforeDmgCalcAttr { + /** + * steals max amount of positive stats of the target while not exceeding the limit of max 6 stat stages + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly stolen + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * Copy all positive stat stages to user and reduce copied stat stages on target. + */ + for (const s of BATTLE_STATS) { + const statStageValueTarget = target.getStatStage(s); + const statStageValueUser = user.getStatStage(s); + + if (statStageValueTarget > 0) { + /** + * Only value of up to 6 can be stolen (stat stages don't exceed 6) + */ + const availableToSteal = Math.min(statStageValueTarget, 6 - statStageValueUser); + + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), this.selfTarget, [ s ], availableToSteal)); + target.setStatStage(s, statStageValueTarget - availableToSteal); + } + } + + target.updateInfo(); + user.updateInfo(); + globalScene.queueMessage(i18next.t("moveTriggers:stealPositiveStats", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + + return true; + } + +} + export class VariableAtkAttr extends MoveAttr { constructor() { super(); @@ -10467,8 +10530,8 @@ export function initMoves() { new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) .attr(RechargeAttr), new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) - .ignoresSubstitute() - .partial(), // Does not steal stats + .attr(SpectralThiefAttr) + .ignoresSubstitute(), new AttackMove(Moves.SUNSTEEL_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 79d7192b4db..82674fb8b46 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -7,7 +7,40 @@ import { variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; import type Move from "#app/data/move"; -import { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr, VariableMoveTypeChartAttr, HpSplitAttr } from "#app/data/move"; +import { + HighCritAttr, + StatChangeBeforeDmgCalcAttr, + HitsTagAttr, + applyMoveAttrs, + FixedDamageAttr, + VariableAtkAttr, + allMoves, + MoveCategory, + TypelessAttr, + CritOnlyAttr, + getMoveTargets, + OneHitKOAttr, + VariableMoveTypeAttr, + VariableDefAttr, + AttackMove, + ModifiedDamageAttr, + VariableMoveTypeMultiplierAttr, + IgnoreOpponentStatStagesAttr, + SacrificialAttr, + VariableMoveCategoryAttr, + CounterDamageAttr, + StatStageChangeAttr, + RechargeAttr, + IgnoreWeatherTypeDebuffAttr, + BypassBurnDamageReductionAttr, + SacrificialAttrOnHit, + OneHitKOAccuracyAttr, + RespectAttackTypeImmunityAttr, + MoveTarget, + CombinedPledgeStabBoostAttr, + VariableMoveTypeChartAttr, + HpSplitAttr +} from "#app/data/move"; import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; import { default as PokemonSpecies, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; @@ -2903,6 +2936,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isCritical = false; } + /** + * Applies stat changes from {@linkcode move} and gives it to {@linkcode source} + * before damage calculation + */ + applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move); + const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false); const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag; diff --git a/src/test/moves/spectral_thief.test.ts b/src/test/moves/spectral_thief.test.ts new file mode 100644 index 00000000000..8913b7f3683 --- /dev/null +++ b/src/test/moves/spectral_thief.test.ts @@ -0,0 +1,224 @@ +import { Abilities } from "#enums/abilities"; +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves } from "#app/data/move"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Spectral Thief", () => { + 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(Species.SHUCKLE) + .enemyLevel(100) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([ Moves.SPECTRAL_THIEF, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .disableCrits; + }); + + 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()!; + + enemy.setStatStage(Stat.ATK, 6); + enemy.setStatStage(Stat.DEF, -6); + enemy.setStatStage(Stat.SPATK, 6); + enemy.setStatStage(Stat.SPDEF, -6); + enemy.setStatStage(Stat.SPD, 3); + + player.setStatStage(Stat.ATK, 4); + player.setStatStage(Stat.DEF, 1); + player.setStatStage(Stat.SPATK, 0); + player.setStatStage(Stat.SPDEF, 0); + player.setStatStage(Stat.SPD, -2); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * enemy has +6 ATK and player +4 => player only steals +2 + * enemy has -6 DEF and player 1 => player should not steal + * enemy has +6 SPATK and player 0 => player only steals +6 + * enemy has -6 SPDEF and player 0 => player should not steal + * enemy has +3 SPD and player -2 => player only steals +3 + */ + expect(player.getStatStages()).toEqual([ 6, 1, 6, 0, 1, 0, 0 ]); + expect(enemy.getStatStages()).toEqual([ 4, -6, 0, -6, 0, 0, 0 ]); + }); + + it("should steal stat stages before dmg calculation", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .enemyLevel(50); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + const moveToCheck = allMoves[Moves.SPECTRAL_THIEF]; + const dmgBefore = enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(dmgBefore).toBeLessThan(enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage); + }); + + it("should steal stat stages as a negative value with Contrary.", async () => { + game.override + .ability(Abilities.CONTRARY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(-6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal double the stat stages with Simple.", async () => { + game.override + .ability(Abilities.SIMPLE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Clear Body.", async () => { + game.override + .enemyAbility(Abilities.CLEAR_BODY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through White Smoke.", async () => { + game.override + .enemyAbility(Abilities.WHITE_SMOKE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Hyper Cutter.", async () => { + game.override + .enemyAbility(Abilities.HYPER_CUTTER); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should bypass Substitute.", async () => { + game.override + .enemyMoveset(Moves.SUBSTITUTE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp() - 1); + }); + + it("should get blocked by protect.", async () => { + game.override + .enemyMoveset(Moves.PROTECT); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.hp).toBe(enemy.getMaxHp()); + }); +}); From 7fea8603f3f34ad639debfda6a45191af42d33bf Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:41:22 -0500 Subject: [PATCH 016/171] [Refactor] Add support for showing separate species form names (#5294) * Support for localization of regional form names * Show names of regional and other forms where appropriate * Add form name to evolution screen * Remove formKey parameter * Update docstrings * More SpeciesFormKey Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> * Clean up * Fix inconsistent key name --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/data/pokemon-species.ts | 50 +++++++++++++++++++++++++ src/phases/egg-hatch-phase.ts | 3 +- src/phases/evolution-phase.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 57 +++++------------------------ src/ui/pokemon-info-container.ts | 19 +--------- src/ui/starter-select-ui-handler.ts | 13 ++----- 6 files changed, 66 insertions(+), 78 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 55da6a7e76c..041632b183d 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -690,6 +690,56 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return this.name; } + /** + * Find the name of species with proper attachments for regionals and separate starter forms (Floette, Ursaluna) + * @returns a string with the region name or other form name attached + */ + getExpandedSpeciesName(): string { + if (this.speciesId < 2000) { + return this.name; // Other special cases could be put here too + } else { // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES + return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); + } + } + + /** + * Find the form name for species with just one form (regional variants, Floette, Ursaluna) + * @param formIndex The form index to check (defaults to 0) + * @param append Whether to append the species name to the end (defaults to false) + * @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc) + */ + getFormNameToDisplay(formIndex: number = 0, append: boolean = false): string { + const formKey = this.forms?.[formIndex!]?.formKey; + const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; + const speciesName = Utils.capitalizeString(Species[this.speciesId], "_", true, false); + let ret: string = ""; + + const region = this.getRegion(); + if (this.speciesId === Species.ARCEUS) { + ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); + } else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) { + return i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: (append ? this.name : "") }); + } else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here + const i18key = `pokemonForm:${speciesName}${formText}`; + if (i18next.exists(i18key)) { + ret = i18next.t(i18key); + } else { + const rootSpeciesName = Utils.capitalizeString(Species[this.getRootSpeciesId()], "_", true, false); + const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; + ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; + } + } else if (append) { // Everything beyond this has an expanded name + return this.getExpandedSpeciesName(); + } else if (this.speciesId === Species.ETERNAL_FLOETTE) { // Not a real form, so the key is made up + return i18next.t("pokemonForm:floetteEternalFlower"); + } else if (this.speciesId === Species.BLOODMOON_URSALUNA) { // Not a real form, so the key is made up + return i18next.t("pokemonForm:ursalunaBloodmoon"); + } else { // Only regional forms should be left at this point + return i18next.t(`pokemonForm:regionalForm.${Region[region]}`); + } + return append ? i18next.t("pokemonForm:appendForm.GENERIC", { pokemonName: this.name, formName: ret }) : ret; + } + localize(): void { this.name = i18next.t(`pokemon:${Species[this.speciesId].toLowerCase()}`); } diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index 2d0aa24dd1f..b2844591e33 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -3,7 +3,6 @@ import { globalScene } from "#app/global-scene"; import type { Egg } from "#app/data/egg"; import { EggCountChangedEvent } from "#app/events/egg"; import type { PlayerPokemon } from "#app/field/pokemon"; -import { getPokemonNameWithAffix } from "#app/messages"; import { Phase } from "#app/phase"; import { achvs } from "#app/system/achv"; import EggCounterContainer from "#app/ui/egg-counter-container"; @@ -356,7 +355,7 @@ export class EggHatchPhase extends Phase { globalScene.playSoundWithoutBgm("evolution_fanfare"); - globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: getPokemonNameWithAffix(this.pokemon) }), null, () => { + globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => { globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => { diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 533edd320e3..12d2923ec36 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -270,7 +270,7 @@ export class EvolutionPhase extends Phase { globalScene.playSoundWithoutBgm("evolution_fanfare"); evolvedPokemon.destroy(); - globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); + globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => this.end(), null, true, Utils.fixedInt(4000)); globalScene.time.delayedCall(Utils.fixedInt(4250), () => globalScene.playBgm()); }); }); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 2047095d067..683045d7814 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -15,7 +15,6 @@ import type { SpeciesFormChange } from "#app/data/pokemon-forms"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; -import type { PokemonForm } from "#app/data/pokemon-species"; import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; @@ -44,7 +43,7 @@ import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { EggSourceType } from "#enums/egg-source-types"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; -import { BooleanHolder, capitalizeString, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; +import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; import BgmBar from "./bgm-bar"; import * as Utils from "../utils"; @@ -899,43 +898,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } } - /** - * Assign a form string to a given species and form - * @param formKey the form to format - * @param species the species to format - * @param speciesId whether the name of the species should be shown at the end - * @returns the formatted string - */ - getFormString(formKey: string, species: PokemonSpecies, append: boolean = false): string { - let label: string; - const formText = capitalizeString(formKey, "-", false, false) ?? ""; - const speciesName = capitalizeString(this.getStarterSpecies(species).name, "_", true, false) ?? ""; - if (species.speciesId === Species.ARCEUS) { - label = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); - return label; - } - label = formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : ""; - if (label === `${speciesName}${formText}`) { - label = i18next.t(`battlePokemonForm:${formKey}`, { pokemonName:species.name }); - } else { - // If the label is only the form, we can append the name of the pokemon - label += append ? ` ${species.name}` : ""; - } - return label; - } - - /** - * Find the name of the region for regional species - * @param species the species to check - * @returns a string with the region name - */ - getRegionName(species: PokemonSpecies): string { - const name = species.name; - const label = Species[species.speciesId]; - const suffix = label.includes("_") ? " (" + label.split("_")[0].toLowerCase() + ")" : ""; - return name + suffix; - } - processInput(button: Button): boolean { if (this.blockInput) { return false; @@ -1375,13 +1337,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.prevolutions.map(pre => { const preSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[this.species.speciesId]); + const preFormIndex: number = preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0; const conditionText: string = pre.description; options.push({ label: pre.preFormKey ? - this.getFormString(pre.preFormKey, preSpecies ?? this.species, true) : - this.getRegionName(preSpecies ?? this.species), + (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) : + (preSpecies ?? this.species).getExpandedSpeciesName(), handler: () => { const newSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[pre.speciesId]); // Attempts to find the formIndex of the prevolved species @@ -1421,8 +1384,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { options.push({ label: evo.evoFormKey ? - this.getFormString(evo.evoFormKey, evoSpecies ?? this.species, true) : - this.getRegionName(evoSpecies ?? this.species), + (evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) : + (evoSpecies ?? this.species).getExpandedSpeciesName(), style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, handler: () => { this.starterAttributes.form = newFormIndex; @@ -1445,6 +1408,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { handler: () => false }); this.battleForms.map(bf => { + const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; let conditionText:string = ""; if (bf.trigger) { @@ -1452,12 +1417,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } else { conditionText = ""; } - let label: string = this.getFormString(bf.formKey, this.species); + let label: string = this.species.getFormNameToDisplay(newFormIndex); if (label === "") { label = this.species.name; } - const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey); - const newFormIndex = matchingForm ? matchingForm.formIndex : 0; const isFormCaught = this.isFormCaught(this.species, newFormIndex); if (conditionText) { @@ -2313,7 +2276,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (isFormCaught || isFormSeen) { const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? this.setTypeIcons(speciesForm.type1, speciesForm.type2); - this.pokemonFormText.setText(this.getFormString((speciesForm as PokemonForm).formKey, species)); + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); this.pokemonFormText.setVisible(true); if (!isFormCaught) { this.pokemonFormText.setY(18); diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 554cea39731..eda5ac3f580 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -13,7 +13,6 @@ import ConfirmUiHandler from "./confirm-ui-handler"; import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { addWindow } from "./ui-theme"; -import { Species } from "#enums/species"; interface LanguageSetting { infoContainerTextSize: string; @@ -218,23 +217,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonGenderText.setVisible(false); } - const formKey = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey); - const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; - const speciesName = Utils.capitalizeString(Species[pokemon.species.speciesId], "_", true, false); - - let formName = ""; - if (pokemon.species.speciesId === Species.ARCEUS) { - formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); - } else { - const i18key = `pokemonForm:${speciesName}${formText}`; - if (i18next.exists(i18key)) { - formName = i18next.t(i18key); - } else { - const rootSpeciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false); - const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; - formName = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; - } - } + const formName = pokemon.species.getFormNameToDisplay(pokemon.formIndex); if (formName) { this.pokemonFormLabelText.setVisible(true); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5476f38cc6a..65c159c62a8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -53,7 +53,7 @@ import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { Abilities } from "#enums/abilities"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; -import { BooleanHolder, capitalizeString, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; +import { BooleanHolder, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; @@ -3408,15 +3408,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? - const formText = capitalizeString(species?.forms[formIndex!]?.formKey, "-", false, false); // TODO: is the bang correct? - - const speciesName = capitalizeString(Species[species.speciesId], "_", true, false); - - if (species.speciesId === Species.ARCEUS) { - this.pokemonFormText.setText(i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`)); - } else { - this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : ""); - } + const formText = species.getFormNameToDisplay(formIndex); + this.pokemonFormText.setText(formText); this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { From 5045b637ff14a3c0d6fe97db7c80faca1ed5dfa1 Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 11 Feb 2025 17:10:25 -0500 Subject: [PATCH 017/171] [Balance] Item Table Removals and increased Wide Lens Frequency (#5296) * Update modifier-type.ts * Up weight of event DNA Splicers * fix attempt 1 * Removed 100 pokemon minimum requirement for Catching Charm commit fontbane suggestion Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> * Removed unused items from item table * removed selfStatLowerMoves --------- Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> --- src/modifier/modifier-type.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b1e8b69df36..da2ab49e9fc 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2,7 +2,7 @@ import { globalScene } from "#app/global-scene"; import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms"; import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; -import { allMoves, AttackMove, selfStatLowerMoves } from "#app/data/move"; +import { allMoves, AttackMove } from "#app/data/move"; import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; @@ -1725,7 +1725,7 @@ const modifierPool: ModifierPool = { if (globalScene.gameMode.isSplicedOnly) { return 4; } else if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { - return 1; + return 2; } } return 0; @@ -1833,14 +1833,6 @@ const modifierPool: ModifierPool = { return false; }) ? 10 : 0; }, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { - const checkedAbilities = [ Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT ]; - const weightMultiplier = party.filter( - p => !p.getHeldItems().some(i => i instanceof ResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && - (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && selfStatLowerMoves.includes(m.moveId)))).length; - // If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently - return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0); - }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1850,10 +1842,9 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.EXP_BALANCE, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.TERA_ORB, () => Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), - new WeightedModifierType(modifierTypes.WIDE_LENS, 4), + new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1867,8 +1858,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), - //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), - new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.getSpeciesCount(d => !!d.caughtAttr) > 100) ? 4 : 0, 4), + new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => !globalScene.gameMode.isClassic ? 4 : 0, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), From 195a3936b32a5be9964c203c8d8d40ab032f317e Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:34:40 -0500 Subject: [PATCH 018/171] [Sprite] Update Litleo/Pyroar exp sprites, enable female exp sprites (#5260) * Enable female experimental sprites * Update Litleo/Pyroar exp sprites Co-authored-by: Unicornpowerstar * Update sprite test to check exp female variants * Fix shading on shiny Pyroar, remove unused 668-female files --------- Co-authored-by: Unicornpowerstar --- public/exp-sprites.json | 24 +- public/images/pokemon/back/668-female.json | 41 - public/images/pokemon/back/668-female.png | Bin 791 -> 0 bytes .../images/pokemon/back/shiny/668-female.json | 41 - .../images/pokemon/back/shiny/668-female.png | Bin 792 -> 0 bytes public/images/pokemon/exp/667.json | 929 +++++-- public/images/pokemon/exp/667.png | Bin 1284 -> 2189 bytes public/images/pokemon/exp/668.json | 1091 ++++++-- public/images/pokemon/exp/668.png | Bin 2068 -> 29671 bytes public/images/pokemon/exp/back/667.json | 784 +++++- public/images/pokemon/exp/back/667.png | Bin 914 -> 1872 bytes public/images/pokemon/exp/back/668.json | 967 ++++++-- public/images/pokemon/exp/back/668.png | Bin 1340 -> 22449 bytes .../images/pokemon/exp/back/female/6215.json | 1028 ++++++++ .../images/pokemon/exp/back/female/6215.png | Bin 0 -> 2470 bytes .../images/pokemon/exp/back/female/668.json | 821 +++++++ public/images/pokemon/exp/back/female/668.png | Bin 0 -> 24896 bytes public/images/pokemon/exp/back/shiny/667.json | 2189 +++++------------ public/images/pokemon/exp/back/shiny/667.png | Bin 1780 -> 1872 bytes public/images/pokemon/exp/back/shiny/668.json | 967 ++++++-- public/images/pokemon/exp/back/shiny/668.png | Bin 1340 -> 22449 bytes .../pokemon/exp/back/shiny/female/6215.json | 1028 ++++++++ .../pokemon/exp/back/shiny/female/6215.png | Bin 0 -> 2470 bytes .../pokemon/exp/back/shiny/female/668.json | 820 ++++++ .../pokemon/exp/back/shiny/female/668.png | Bin 0 -> 24896 bytes public/images/pokemon/exp/female/6215.json | 2078 ++++++++++++++++ public/images/pokemon/exp/female/6215.png | Bin 0 -> 5197 bytes public/images/pokemon/exp/female/668.json | 820 ++++++ public/images/pokemon/exp/female/668.png | Bin 0 -> 23683 bytes public/images/pokemon/exp/shiny/667.json | 929 +++++-- public/images/pokemon/exp/shiny/667.png | Bin 1285 -> 2189 bytes public/images/pokemon/exp/shiny/668.json | 1091 ++++++-- public/images/pokemon/exp/shiny/668.png | Bin 2068 -> 29671 bytes .../images/pokemon/exp/shiny/female/6215.json | 2078 ++++++++++++++++ .../images/pokemon/exp/shiny/female/6215.png | Bin 0 -> 5197 bytes .../images/pokemon/exp/shiny/female/668.json | 820 ++++++ .../images/pokemon/exp/shiny/female/668.png | Bin 0 -> 23683 bytes public/images/pokemon/shiny/668-female.json | 41 - public/images/pokemon/shiny/668-female.png | Bin 899 -> 0 bytes public/images/pokemon/shiny/668.png | Bin 1043 -> 1076 bytes public/images/pokemon/shiny/female/668.png | Bin 899 -> 940 bytes .../images/pokemon/variant/_masterlist.json | 9 +- .../pokemon/variant/exp/back/female/6215.json | 32 + .../pokemon/variant/exp/female/6215.json | 38 + src/test/sprites/pokemonSprite.test.ts | 28 +- 45 files changed, 15527 insertions(+), 3167 deletions(-) delete mode 100644 public/images/pokemon/back/668-female.json delete mode 100644 public/images/pokemon/back/668-female.png delete mode 100644 public/images/pokemon/back/shiny/668-female.json delete mode 100644 public/images/pokemon/back/shiny/668-female.png create mode 100644 public/images/pokemon/exp/back/female/6215.json create mode 100644 public/images/pokemon/exp/back/female/6215.png create mode 100644 public/images/pokemon/exp/back/female/668.json create mode 100644 public/images/pokemon/exp/back/female/668.png create mode 100644 public/images/pokemon/exp/back/shiny/female/6215.json create mode 100644 public/images/pokemon/exp/back/shiny/female/6215.png create mode 100644 public/images/pokemon/exp/back/shiny/female/668.json create mode 100644 public/images/pokemon/exp/back/shiny/female/668.png create mode 100644 public/images/pokemon/exp/female/6215.json create mode 100644 public/images/pokemon/exp/female/6215.png create mode 100644 public/images/pokemon/exp/female/668.json create mode 100644 public/images/pokemon/exp/female/668.png create mode 100644 public/images/pokemon/exp/shiny/female/6215.json create mode 100644 public/images/pokemon/exp/shiny/female/6215.png create mode 100644 public/images/pokemon/exp/shiny/female/668.json create mode 100644 public/images/pokemon/exp/shiny/female/668.png delete mode 100644 public/images/pokemon/shiny/668-female.json delete mode 100644 public/images/pokemon/shiny/668-female.png create mode 100644 public/images/pokemon/variant/exp/back/female/6215.json create mode 100644 public/images/pokemon/variant/exp/female/6215.json diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 947bffd399d..6ee812d67be 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -201,6 +201,8 @@ "6211", "6215", "6215", + "6215f", + "6215f", "65-mega", "65-mega", "650", @@ -291,8 +293,8 @@ "666-tundra", "667", "667", - "668-female", - "668-female", + "668f", + "668f", "668", "668", "669-blue", @@ -1333,6 +1335,8 @@ "6211b", "6215b", "6215b", + "6215bf", + "6215bf", "65b-mega", "65b-mega", "650b", @@ -1423,8 +1427,8 @@ "666b-tundra", "667b", "667b", - "668b-female", - "668b-female", + "668bf", + "668bf", "668b", "668b", "669b-blue", @@ -2467,6 +2471,8 @@ "6211sb", "6215sb", "6215sb", + "6215sbf", + "6215sbf", "65sb-mega", "65sb-mega", "650sb", @@ -2559,6 +2565,8 @@ "667sb", "668sb", "668sb", + "668sbf", + "668sbf", "669sb-blue", "669sb-blue", "669sb-orange", @@ -3604,6 +3612,8 @@ "6211s", "6215s", "6215s", + "6215sf", + "6215sf", "65s-mega", "65s-mega", "650s", @@ -3694,8 +3704,8 @@ "666s-tundra", "667s", "667s", - "668s-female", - "668s-female", + "668sf", + "668sf", "668s", "668s", "669s-blue", @@ -4587,6 +4597,7 @@ "475-mega_3", "475-mega_3", "6215", + "6215f", "653", "654", "6549", @@ -4856,6 +4867,7 @@ "475b-mega_3", "475b-mega_3", "6215b", + "6215bf", "653b", "654b", "6549b", diff --git a/public/images/pokemon/back/668-female.json b/public/images/pokemon/back/668-female.json deleted file mode 100644 index dc3fc99ba58..00000000000 --- a/public/images/pokemon/back/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 74, - "h": 74 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 74, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3b22b1fc8fabd22888048f909287acba:10bec1e42fb1d39868a624d00345818d:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/back/668-female.png b/public/images/pokemon/back/668-female.png deleted file mode 100644 index 6f28278630a2b13f8a44ff4c3dcd8e0efbf25647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmV+y1L*vTP)yFhk5xp2mlbRG=a91Vp|9nw9EAdo3g0vV;{KwFlewL=Hf zDVHH|drQFoT;F?VU90GH&C+i$67R=%&l0vsrfC}Subel>;}KaJ-5e=bX@!XLGrf~X z>9TVIhr=OVc0-7QDp~dG?w;9Is_GRH<;S8rCxl_Pc;xl*^^p|TrPMGmV)lLMz+nhg zL8YolC960y^&wO-3T2S}t=5;J%8P+I58s@fsK?9Ch??twh#fXlB_Hp;UVdrDrUw9G z_Z!zu6ph2;x0z7u0pQlX6k>8DgMfr;L2Gbks^l<1LK=^UsbY87%OjMm&S%b7^Le}**p~R{NTa~NYXCGA#=X+OSPf7unpt7U-7&{X96la6F zh$zXE(pk41RWVn*v!19fQnd$-*|;hwJ5zbB+T1Iv~$iDTvZBE;0pz-Liq+n&UJ;5SjDQ4gy{N@lJo$L=^)1{A=F6~g4IhQSt;Yw z=`v&05$$QFTGXuM1O?@S608W|8UTo*O0Wko#*?6=SJJ4HqWR>nbgCw=dZzkO*`(sB z!UgrB5-OAB@EN@xNyYTO_mF?Zm%wzB?X|$kOQgNV!ZaM3kTD zojgjHof9}54(YOMLKIZVs$aKv%q~+^uZSo=7S%Z+470@}ua2*eq_8ffhJg{Y?@I>` zL#PTWRYfXU#hIxOp^8x`gY0j$z6e!b4Agn}=Ilg0UVKEfy9$WdVKY_o@%Hn@r`_1} z06^?+P-U`o)jg>a;=}BOR`deXpq&*X|X|@R^Rt?y?Ts1!XsB$>pyBd2^3a|u~9o3iEk-(=o z8`OP7NuHF>y6vcnx#FGmM0Js>J!s6v)j`>r${W?@UfE@}+E;{N1u5`_f>oh>L*+1CAtY9@DkLGg{-Y#4Kw~<{u}TPaQiWjkQb<*?yxu66q0=NbMqNoz=0gUk^DCw0n>ZE8s`752O$*Z2JepEK8 zc&czgy{Lo=s&_?H8I8)YlFFDRWeQY&2*{Gk`da`IR~;(eClP)LiW`#&jUlPV|C8TK W^^Bzs9{pqh0000q zifQ|WVyw-bVVqpTvWdCRw%?rB@9*<{y`Ja&{d}L#^L(Gz^VgH(>*H}qK}|tQO6m~U z)74MHYRS02Uq&*|ii`6kkVg4=I7_`@Xe>xXgs*pin}jG$O;j+5Wo4zLq_onKMJ_`HT1Nhk{k4(=L+vh`<9s6pd&8}zrAsEys&KX z<}#PAPQ39vjNs!>Ni)3lbza?2o16XE4>L!ID~%KGv2UF07aY*j?w@9zczpKrdm&+o z&|??P_GnudeAh%Kb$0N7Lf);Kp|Hi_ZC4=lXX`<{zT!#Y)UZ>0{={*3aDPK%8q zMQYo>yTLG1MRi4vCzcBPXSu zZB02+N%TBZWCdK`h2fxzZ1j8wB4YT^P(3*R=|Qzldw??!s6Mlg@qK9gTI?78Xs7&h zT0nHTo~IW9my3xD1#pE&G9X+;~WD*B{go4m#{c^kvsjmU}`J@I_z zKzj2G0<&s>=e$1|CFmp8RR!|MPe^Me_UE+JtdW>mRa*Q1Ux57M2NI&a_5gWWEJX!6lYFIPi zGN8w0ApH?=2Z8%&Wnypw1^=r`J*-ylz}Rcxah@pn=9>b0=40Hd?p#aBglpjZRaP8@Uq!S9zxqdWi1U}-ZpwlX7A?T zx6mWher==q!)etRCbi9AdB|H*X*2jb6o4M5X8xmF|Icx1<*we4UtfZQD=d4ltwP%~ zN+ZP!4j)CDr@(Iwo8yeWO%~z)JLI|{zp=FG7>}s1y~gRqx6f%cvzabVOe#U&MrpYz zJ8h%?N8*kknc8EPY_eup9U%I}os1S@@b$sUGX=(JoKbeniRdwraJ7qzhcUFCXrC@- zKL&q7GO38Fs!!*k-I>0XWG`Yvs5p&-hL;;wcfCq|g)u7(5!nw*8V54=18vzq`4jTz z9S^;kA77xT$Co}=5trq2aSTzSk7|ewH&4i%Kui3>8y_Mak~8@{Y!_rq1R1&4A5Oxp z(9}!d)bH!z5vG4=sn?XWe5PgOlf;((=_s8d@{XGV8!|whCLDo3NSoa$YEnMhAePNh z)JHZvtr5aJ<8|^M-DnLe)#=5#zFAI9(*ej%)d9vu7Be2mjCI0RiIkO+!{&r$y?9_w zwjB4P8lH_7q>uAE&Gh&?D7GZoZk;J~!9aGk#`^q>tx9#+nbf74_4i{E5^{3^i>7>$@QTn{G4kTrf?2`zcidiRdr^j=C(vBxIp$atsm z$uod1CzSXw(pf_t^_D2S%pg&M%BrUln@U`;b>|*L>n=!=Q?mqGi5@nl1Qvserb`^! zYxv~$lmtn-J~M7-PwZ~jSVR~TyJsXo`=Eg~bMWvB$)SexbE(|w77leDA(kd+SiWde Sbd}rv2!P#uT;DiHWc&}=-ERZ{ literal 1284 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8K8Aw(>tdav#>H$6>u0R?H^fXnSZOmenW#hbb z_qHvzGuqnc_SQ-B^O@!!KYm1Sew_(a$5;~N7tG-B>_!>`153B3i(^Pd+}oKO zv!A%hw7Ro>4VtDsZTF)`%-@p^9h#^e6!X+elO?jGckjsw7NNhkcuqX06V0)_#3^9= z1k;>lyB^JYV6SD|cVff$FE#uu)6?Qp?e@)2y;IwBak}{?jg5Q0@_q~miFmzt{n^(X zv!ra)il+VEaQF4?jz8U4-BPYP`dg@jqul?0zIblod|BL@CeZQlul>Bb@ z=YKT`){hpRxH)(8^S}DrKeE4Dcp~E6`#0&eH-g{a`F_QD;>I)U>ezspoA`{sPcS;`Ncxci2dEM)4PoI8fXWRZ!T7j)Y zr!#f?wsWz4)tgW79lcz{cAWiD=hnuZ&l?}E)jjijk#+Bf39=pO*Yucn^YG-i=c^dL z3r-01$w`e(D(GIc+al$|L?hW(v$QbYf=#|H7cM%$dr$vl7OsN{FP zqvF@X!>lVAt0NinGf*8K11tjyiv1tKx*s6<2<} zmFV6DWU0@7edl-56y52aj45k$y8k>&n=>_)frHb#n{UGt29|Gy)6GTv^g~)MbBjK_ z;^b5=v$UOq(>Y#EpL-x9To@LPCv(fFdY@)!-q~2%y)OeJFS6@_R`e%YGXDI~1EF z&>z)%>~U@GrgQ(Ve)qks#x_y&+KQ9cVg)0_XYhLi4PFyy{JY=uo;usd71vhGG;Evb zx!{a}jo_*tcQvQEi784)oOCS?pKv*$EiCD#<`g&cgn^NuS8G@1xBu5y#I2A?6F=u@ z!=(JtBTHnFfJCQz)MA1D13)Fqu63{RiFJ>hC^2pMz4{Xsy-BZM^6YO~yWIE>SFh9D zhv6H(mbAssH2A?)GS|+Q>+8$F6@L9rr9~pEE-wz4E7SVwiAIRJ`$8*AuB#`3Qhi{l z;Kc!Qw#WWWZa?1kWxjhD3aoqrJm zCk=oCmVd=x1+L)lhp72B->&BK6R;XXuCG8%&t}=wd|vW#1<(}3>mX+wi2=IeC4VbW lCs6m#kL7m?kIRCHzsyacg-ZL^3b2C;Gf!7Pmvv4FO#poCc%uLS diff --git a/public/images/pokemon/exp/668.json b/public/images/pokemon/exp/668.json index 083fdcfb598..63671a548a2 100644 --- a/public/images/pokemon/exp/668.json +++ b/public/images/pokemon/exp/668.json @@ -1,272 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 205, - "h": 205 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 136, - "y": 69, - "w": 69, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a0374d38386b4719d8b0a8fcc11d003d:7a4ba7ff9050ba3dee8c8340200f12c2:947bf84d1af493c62e2cef45bb6c19ad$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 351, "y": 151, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 142, "y": 221, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 421, "y": 225, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 205, "y": 296, "w": 69, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 69, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 212, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 137, "y": 294, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 274, "y": 299, "w": 64, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 368, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 61, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 442, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 55, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 441, "w": 55, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 261, "y": 372, "w": 59, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 134, "y": 367, "w": 62, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 62, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 68, "y": 295, "w": 66, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 66, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 365, "y": 75, "w": 69, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 69, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 75, "w": 71, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 71, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 442, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 221, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 369, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 296, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 74, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 148, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 148, "y": 74, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 222, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 442, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 293, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 71, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 71, "y": 149, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 143, "y": 148, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 515, "h": 516 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/668.png b/public/images/pokemon/exp/668.png index 36acb70a20f098f8c6c6ca556dceced199f43a4e..85be1a5503227c9a68c8b2acb976b6a35ead19b7 100644 GIT binary patch literal 29671 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

    Xigi?e{^!pwWrxoL2lPkz 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 K6X}7iFZ&-#ti{0q diff --git a/public/images/pokemon/exp/back/667.json b/public/images/pokemon/exp/back/667.json index cfe6b109d70..db9918ea230 100644 --- a/public/images/pokemon/exp/back/667.json +++ b/public/images/pokemon/exp/back/667.json @@ -1,125 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 115, - "h": 115 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 39, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 39, - "h": 41 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 39, - "y": 41, - "w": 38, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 77, - "y": 41, - "w": 38, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0515d906bdf1ec3ad533ac13c4e701ec:195a93073ecc7446c747c2e79ae07d54:02171d511e760c8a3e1b623ad6bf93f5$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 138 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/667.png b/public/images/pokemon/exp/back/667.png index ef7ea9647375d90b44d89720335046032a8b0728..f1209cf8e20925381d59be9ed0e088af8740d281 100644 GIT binary patch literal 1872 zcmV-W2e0^vP)z0{{R3`1-0g00001b5ch_0Itp) z=>Px#Fi=cXMF0Q*5D*YEE-ObsJ9Ak-aAjS;lxgz3h1oVXa~&N30093YA^-pYg%%e7 zDG{F`6T)5$w*UYD5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV87vB8~*5l;& z@Qn@nHGJuV&hs39pr79#wfzeD{(ft7X7Kg(Qs@ zp&l|!*(4blrff$hbbL_keoT~3#(gqQ*&-Pjr))+Z=(ry7pK$}HjM9Dbt&$9U>5)51 z8?oYHOOI};y(@`FMs_2ogUo9ZmeiTVBQrXk(T|b&{RWTR*b{lM721g;_8h?@SGGa} zyOaFQRwavfWsT%>TIJ=S6*>{^WD%;7bb85YlC(UFwJYVbIp+$4a~`BU=T5G3K9~7I zq=+sl(^z~aXKO_VxeZD-xXo#;{dk0Iq06j=E(<$K1Z19`CwgR&DX>S*Y4L6H460=D ze8$UbbYZ9-x-{C2%uD4p%TCLN0%Xh_uuP&60qe{&%hs@6CqN{@ok=dL)^m#D|8&|_v-BkLS#UBePl&4+`j(v*f%vY z9vhC94qm&vh3qMVQIPM#O;opY2? zn3Vb@GQWJ8-OV*&?QODrvyPwB#KSozc5HB-Ob=Q0AGgV;osJKi)Zlm~8JT|4?x$n# z{)0W|y2o6Tm$dt-#KJW@u?zWYYjTo6|91VGxcy@YNna|t*5n|;ep>Rr@Mzy}tiDZj zt;t71{X1BsZ2y_%Ik7c4R*&}c$PCt3^S(8?NxOf)?clWyUz20?j(#QOYNodx>-TPW z<|o?o25ap{l}LEA+HtK7M>;sT9oO1uq-Wu9JFd0SNPOX*_AFfut&K)He7>hW zsvTezt>-}(Y*z!)#p^T zy)d@ISAoftb5Irf4AgyomD+BP##Wm%X>AM4LZ5+JH3Da&U%Z-0Bv-pCcnJLktcGCO zt_q~AcH5CC=WDn9yLUl&wWt03v9%&urDH(^RogHx1hw`F)D~1cQ?$c*hL!fPv$$hP zHbE^?TTuOLV31S~`!G|EdioQnRqOEi>j`S;cfs31o_-jzQP(*Q7QO~+==UnI1=b6n z#u4%P8Z4j_sNZ1_4)noUp>*=}aG(!{^*ahWe7*;U^*ahWe7>t)T9BZ%Q4kLF!T;+y zCH;>&>G z`8QC*_QkHu8O(;MVf$hi$6QPe+ZVerr=el{Vt3}$HEdt(#+-(R?TcNX)6%egvCDIs z8rH;SPnv5(HSCOFhggK9u4}83r*krK4z#+6)V(&RscX{&ZH)O(&mUywF<9!l=Y$L}fts56PfO}L2gNijX%lcqKS9`)K`{+W$^=vdAlRijTgm00 zRb$w;YySz5y52#hWI@-07%X+&b0P*9$0k_ndgp|a3B!^S0Hm&O1CtN8p<}YJ>vcSV zWEgWuUFV!oGKRTisdG#yxi9u_&e@W>_vfsWuVK2>y)!4MYa5s(Rr|~dCS#aO>bl1S zl0{5j4d1Lx6F3a%|=AuA_Cmb&Kzl9Slv z=eo9#E?MfE6HErhrc0Lk1_hHr3+exJRd`TeGI(%4CoBI#gZ>8}!=nsxK18el0000< KMNUMnLSTZZtDuws literal 914 zcmV;D18w|?P)K0004WQchCuIu^jYh>1qt9C|Sq3dD4&O^o?;Ld8mkg?-w>)|uWwJ_XO4bF6-HgZ4g3HZox zQo?F@&PUkhRhOgTaQewiD(g36J(Y`x6Le~YU4AT%fL)ig$35o zO!s+v-yigdRI+ODi5eaK3aR*ApoG=%P@S|?Ayp|Qt_Fw3nakqB>=1QS>j_=%{?t`X z8oDg;C8NG-c&1+LD5c_CL-kb?g!(HL!8X-d4GvX6CRh!ANKntvEeFG@b!TQ_U^QuG zm6og48yZE{G6}4PMh0B;K2Wt~-`=?7Hv?{Ez}SanVAnGD%0FHzknmwz45Lq-`x^Mu z?F>a=fnfCDJ$=ERhD%P>D2<21}%YG*lvuq@faN zBn_2FBWb8a8c9PX(oh;Gkp|KHyBU>8uzRb~fef_JiP6FQR+A<&SD@eenr3RN@_wr~^CNK*i-h^DO1Fv!iz|cgeLJ@ST}&CG1s&J-TWD( zuq+LeNU(cDXsAR2-5X?wK)(fc!)T~PlF}+C3i>Uu8>GQNzXf)~XrSN1X^{pi(Llci z(ozjpq7me`9<)-ohXyN|D~9|Q=)o{^CGlIpI?PPx#Bv4FLMF0Q*5D*aLIU{x<7DqBIWJ^DQVkZB%JGzQnzaI+nyoLY7Om`Ret^fc4 z40KXXQvm<}|NsC0|NsC0{|UrUCIA2+07*naRCt{2or{{|Dz1f1z}-&j{onVPyCftK zHmS~@6Mr+iyDs^ANlOCkIA+@}AJ*FIFa8DIwwAX--s%WffS0GeaG!U5jm~3G>oUZGSTEE->+`zI(iYOS}c@q9|g< zWfIVKGgSL{AkvMI2>Q7qVW+fg=^9>&^-mIbyMCh!N!|0Nx`M1`+?f_q?(Vl%B;}ml zNm@$S&niEIv>4@cDQ{u@dfuwxV*_T~9xwyx?}AWMlz&ne+zB(H{{H;IsC%{Rf$!zr zz&%geUqZWvwN>EXY{oq=o*rcvxcYpCoUNGRV|*lIj~j+QgSfzZEau&>w}^TCeL{Km zaS8P($h!rcbwq79NEVV3=x%{LE9+4+HV=i;p2>%ddEDludds|NoaN-*h_=4Uf{MH7 zDkKqYb4%VnX;RhJpt7NUOqq@pNy7zlpLe_7*vzHxT~X&_vJ`lA_~>Yxs$Ki+)W_^7 z`9K9y>cgfvXWjsquflr--g6o6V!hdXp~9|F=dH-EX6kneXSq;oeN1S}k#ISi9wjZ4 z{}6NtdEQS>Tjasa-Qy)s=6SZhl!^9IebihvR?N+RQJZbFh3L6XaPbhMu04-*GGs_!mZ-v?@ZSRXXkZww5_TY8<;R|X%jl@^?Ds99KJ*tQ5@(|#Z9PM?I)w{ zZM+Nh(K{B^$MedBHKA?a&+>4_gfD!B;2}gJUFoT}_^FF>1@9l@H(*h<4%37Y^iH+S@n1q3Qp!-QRi_358~m=!HR$l~R#D_=zO@HTWvy8hMs?;A+a`>ws6sa0M=o;Bf%&=1nlP4OVD# zE0dKOO;xhY$fjrow<1^C!WV+J@pwtxE zQ5MHW+DqOuN|Pq$SRHM7Fhuo?pl$fVvocLNO6CP+y9^Ax0z(71*q~cV8?y?;!x8Gy z-uXtY4~gcQ3)oWqc1~_B5(URPcXvbpW6(3&?mL{~G3rLmEA#MNSxrL_mgt0}Wg%JOfy z-044?oy-{umo6pRAtx!f002jl$rOKjzZ;T_L%>U zq5VCmQNBhVCR`jyjO55x#HH;-0xaXouqwsp7UCPMWRgATF!J1rmpkSReE) zbjQ%BI17}O`d}iROR?24!GbdZw}-)T-w6(RkZ|n?4kuEG zYk6F-^r8S7#Cz(n4Y59sS6d+Gz+VFQx#V#*)H=Pia}}^cE3I?U;?y$}W9d-3EP`i{ z(1E>=6YB#s{E6}Z+s%#-W-68I0~Uxg9bSub`>S(RAfQz0Y*~JUw@Hs30rNQC6ITkP z)Cb!M8JrR~jU#)PZwlKGG}Fn8UqL zfv6o28a}7YP3W?rL)#N%glLh-uZ*z$j%;Ay=ZGD7tn^0Fg zNCnd5FXXE_0cmaOz`1g>*!5PJsYrYE@rqN6(WR`stZjJTQr=IEt|H8a&k3>}S~F&f zy2Fz^)uE$0>OUi$mw>OMIV1H`3Zz^%89Iq_9A!cnJJ4zPt-efe=$0L5R}8^WXMno%uL;WGPN1o2V-z}vgYDw- zMW`|y9duD12HzphR2r~VtPh2_YNoK5nSq6oO+LY$0mV;S=aypMGbdB>&`<-zY$nnm z532M1ug9@z!?>QhJQ}4lQs(_{RvqEh+|?W6cW(Wr7uVE>CQ>nRk2_ zF)s3G%6vyz=x1s8Hqd}8FXV9{Wl#UUU4C`1t+F^kYt-dxL*>Q{m@wF$I!KE|raTyN zM^kL2KJe+XP#*v$OB>wur36_NWLX!rqev6wi&_wMF@8F>sgCmEkgp@waBBd3v9t!< zfH;V2f(`F>;_BsaBXzMAEUpe;9(;X(VmnIl0&%fC{F|iY1J&0OS5B6@ANA2X5DXnQ ze2WYEUnpgQpG?{u7(NQ_FhC!NOL=PtaS_*)8|?N@lMd7|G!JCUBh$=49KOwS7gxJd zq%d)|71t$+AmV`B@aO66FlDVOu|-X$nS_hg_5xRujAiO0Ae+nL1!oLUXI^c&VLzn; zQK)0J@rG1!rYkNl0)aZ_Y7~u>m&V>yh(U=o0Pzhkr>w<2O^)7(4z!nL>)dDJ^cP1h zlkav3_v0JJ18$N(X$9v1?kG6NR-1TDYpjkd5B`wEnN}Q8*Q*a%no?Pn)qtv_t)at) z50?fGfxi1Iu0;?$_+nCS^UjbTw{SB+v@PYQ;$2jy5~rJ} zbTD1vLehN7XiphfZ4RXD(4`EIlu27!J$u@5yux>kvv_*Z91JdMJ8|XK?w&Zd6?k=a zR-Gu$pPtnd1^r65fn7>mQ)rVQVkoLMKYZkr9lrP#IP_Vtql6jOv@U-guCL5HU_{(W zb5{-J)m_H*#i=H$g^8nuRzX@rUy`9d7%WUxA6%FrE2pCR^>M=i31`;g=F}|}w@w-& zVbGCPbxC}~uQ9an!ru$rzXP7s9hY$%z-?=B*VLg{4@TS!PD1n8*W#2-(imKR@gj8}gj-5m29rVN-=}P#?s&!js;^RhG;S$v z8SITI+ZN++ZPf+Mi@#NR3TGhhilg_{b)1-|EtA%+WNxV9X3_hGzS321GWM8^J1*hO zTHJkgNZfIgwoF=5!mBd>IAvS@^%pO%T>8<`7#z^C0(VE9R@}sC#{y|fRjGANUgzO) zO5hRO+#P5*Mh#mHdFV zQrt4w;*@PmQ--I)|8*Rkr|-j7Nn5IFxdU@c<^MQtZXK_nt>S!c%D%_<&>jA1-GAWM zcWL*lpHHsLF09&06f{ z{rUjGE&wivJ(3N#X%Xhj%`SwEpK3XyY;Bkeq(S5w;Bwg64r^i!%KrYWsa*REur(g6 zRF+{Yq@@>o(&O*no4^Wt+=nGvQub$wv;cejwfA7Q!cJ)m!@RAmFxNP69uE-f^Db~H z%%;azE-76IE8BQogjp2kT}M|cL+#!;a0P19leZEn{P%GgNHTYemX-0aPf&(f8MZcO z(+3C3v`d?3_hOv|+Vs-g1SnSf=)QIiHhY{fyGmIQ24FXHwzNZgcG~V^Hw9jLISlnW z(59`m1lkH%w)9HnE>aeAX34hK*_eNtv+&Q`ZKE5mW@*y}V$&XpPbOA-Emlg)%{C8X zq}?hu0XC~Ft|TAJa<($eRBe>@2>T^psE-uvlN=X;?}yzhHbz-(;3;8JnBBd_I$^SL z+WC&RT(<*6XgLn zJ`A?B*skTRALW|*$jYwN$2x7Rfpf6I^T~d(azC*?K7qCxI018Ym*)>tb{F=oj|DJa z9RB91P$9n&>MwfwPhm@GRi40|zd)u^=f{rxp$&7fKt9&eH{~oHqlbp}X^ph7HR@1a z_&-O!605&QgH?&kqrApQQ_LG&_>DGrXMLnex#Q`aw7_#xgH~Yu&%Ic?)s|t-p-+UO zouCQJ3Z-^USr*raja$mY!ddo;mg>iemBnE<%*vMvq&Y#TTPb(tNd zCQxgb?;W5Ot9n|+GoQL9W*Y^pdzb%eilCgpB@G-Hv8&(-bKTg}{%H-4VC2IiW5 zhU5VRzRlEeL7}S*APf$jR)PJeyD-TITx+gB8;s(_(!gM z<|X&Ys>Y%SW2F^X`#2kU0FhkaI$kj;usDm$W4vxoVY1R}E39{pHj0ys9^fTn&WfMy z0RE85t&fXw4HH-9zVY(82ix`aA&y1ZgA`PNoPxV`hU&+98co#D^8oy;_#83E| z{s6)rXkSfQZk-+#7jD%CSF5d?x7efI!L6+i|FG+>v_alt%bVVqyOlQR%~d#Oy+G4) zjhPTw2NcqTIDrFX(Ka4HxcY$S2qROxR-}bpkaXimTut(hvVG8X zLF#xg>^3dR?pWPZ1|7h~)*FmEw0cQ^F52X?Qh96x>gYyg{rX4+VkwVJoSe7LRR&Za zqA^vf`-Sw#+yvCGQ{dilN-MHIk9MKWO4ODVjI+lG0mE{ z(&${(E!{w4VV;(@*+T^))EjVAt!#K%z*^4INTV&j3*0y8pfPaA5X;1JIsRxC9PgK;)9!cdu&!gS5Hge1fqMglva4$A`tPadf=!ak6Fv$#7)4$@ZtB=g6V?NO!+=ELC6~! zK3W%cRBeMWIScrlDPS~bO|k8ISn`uj2oSiVdP}nbQ@r9y0%=lk9v9EjyNRRE^(12v zfIS5os*kXNuUH?I^>n5yj1J=M)Q4$R7^93I!X3xTIooAen=^8fCMlEaqqk}U7Hk%1 z>(*O?BLxzP@bUo+7PP{vd6*-VhF}iC7;SmuZ1xH}VYwZ+z}83Wf~?F9lzCkpny;2@ z0?8TEqFl}@Y&OnRA3FuYFNPL?l{m8qguxo;XPXo0YSx-=sOp$n1BvUx+QhLNtLNU* zvr6S|gmhgQbK+fd=HI69mqOz_uuC*h9}G)pK&x!qxK$evr|~lqVSOAF2YJr(c6=Zp za&!>u5C&*FTOV<>?X%jvamtKR8CxIpoS+W6T^OPXJw+RItPGsTmz|>VvOdjGItv03 z)<;`!QDEBG@SLi-P@N^}n6*(%T!d{}7}Q3el4Zg^dJ;=AL2_YAS*Ec)RXiQ#tj1ZC z@zQ$A#5mKk-WhUXAhwm#Pk&_G5zi9v9An~g?$nsK2R0nfS*(s*8%3C#heclVz<9rP zyx){FFXOu`Tpz6qS(%y!CcdVpB5V`FbQJc4IipGQ4ew#vIG-?Q+^`$kN^3zak8+kk z9%pC5KDsA0^Ij2XaID2sw3wkIub=TwamO5NYxfAx1>(}))PU7Dfu9m$))dM(OX-1LLj%~pRoVX%R z2LsxehcLQVxdfmwp|i}&${bJ@8!JF%OOMo3FM7(HDt9Jlc|my`I|r)aFSYCW8~#m)mvQ*8%wW_^G6uhD0PB}WSn$_k^MOXz-lBjq!G$V~(1gEM-LZ?dFTzfW915W&rHLi@~VMGWnFr$C**Z1OnSRX$oa+ zO9@SdqzO5T`KK=)<*bP_DdVIm(k5ynGfSU$zU0XIUimmYqZcZdxh^b=GaOA2Mo=lv z%95ltP0uQGL>U9yIiWxr3ezAK7Zj5;oiaAgLD~chOk97=)JNe}T#eQ7y2Sdp0%L`p zsJ7HzkR^1Kx6l*YEue_GYTDbg-$kl@lw>s)P7a zW!I#+3_FY~x1DSE1;j81lsOQmKG1I3CfgnJOyb4E_!cme^|20yP#b1hz?!2SNm!xz zxf;?`Fau!z{dp8-eqUWfqRKX`48$p1>5zF$+NQN3eIeAN$}>kQ=;;|DvJmW;hIMq! z3tLN*!vs0|C(71ZfPee^I<(q+ut@1)whJ(*i?Z@ad?9ZOlwla6nb^1gPML%Q z+U9U&IfHm6$tz_t52J-V4KsqS44D$PRGFN!?CC#KHt=&gZLAFj{KOgXonM6wSY}Gt z+rlKY3(}SE$_xf-|S-+vV#c%{D>eH`^uK%@*)QC z$V+3@Oz~7x3VU;y6Dz*=DqF0LpjYx%!qx`*v0<(@^iB0K zcZL2pU`vI4ZkUVXT#dt%*GIvY3R@he`OuuL$4xD~e;2k?*m~MZ))*w&VJrCT;n# zU;*^F%d-{sxC?{Ap0`qmQr12yb`ti0w3{)a?En3HQ(8mJ&(m2|A9r~xVKzOIie*hP zyQ-$uakR_B$8)ipqhRNwU1!6#(o=zzVKX_*AXb%qbY98Q^4_~kdLTuVtL$d!0wUT& zyCh&PkP>#Kp?dkUV!m8D=8$aKZb*ETuvfw6#0jjzgsiw{W8O4LOL{P* zlzk4NOUVb@wCa&;+HOd^##;%aD~}G$`A0j42P_%Gq;0;^HpOj8J2Tpk7g#)OUTs{m%%!-=$KVt;qm;C zGFu>MAOai3oBIQ}-*L1T;&k#IdY(I5Apaxv;p(2^mtbOf+^7%d;3v)a_MD-07YdX4 z3P&62C)I}=w!=j3(k$A`UVL9vn(rekZhb~RQh2dG9N9)jC=e~J%vI7%HH1+!n|;iu z2au*b`a^i((d#`N&kYuCLm16n3{e=yBP-%$RNk@{y>4y*LF<@7q0NK{rz*KXY})Kd z<7PWlP7fe-hR==)>Jm?GRNV37cF@5BtAxnAkRp|6s6LpDoAoIxm&84ZfTRgVEZY(z zjIduI=xx59nR_#Q2nww{>LOwu#77m9JY_V3@~G_~tec0hCtDt>0+Cp0_@G-5w>-H( zN{HI*Z(Htnxoks-3KE1dF%E|hX@pCol59cJm_N7MpA(9wGLE)GcZM0l$ev0aoB%7E z&!wl^kL$wQ~%_2cc zxG;`)d`P?Bj_YHSnzW>B=dv$fA`>jAA(B`2LgZO=CAlky${MX4Y*eHh!#ggNUEc8U zF=z)7mVU!Ei!8ZMg>fE7w4C}IpMAxh`O++9HQ%l$gdW-*@Y_XE|Az* z;rbbqb_N6`c6w`b)3)MlNXHa3_C*{>r%5ry#>7Nf# zUP(@b2+CW)w*UYj07*naR9^Jz_QH+|B$OO0P^=GXDbVOly7x+sm-Zy0Q5X|%fpJ%~ zP@jS;tMLskIeA=pY*NbNG$p1iPB7v!d?v(vE`)|6K1TC=x*DQwSun6(eE@y=9+rlQ z>x1qX3|3nv@KS2Q8>x&9rMH?3GnsY;=C{zpF!=ZEIlNT|MVeXM!%)U4YfO#xameXs zLu^1NTccp5}JwU%BhRXhYQAa`a3g z!wd@}w6?b(s<2ckd%~18OWjyvx_sgK5Z5w#STlSyJN=}_^3$Tfz0x=)ZN$;Y+S?Tp zk?6d{9Up>5ZoCYFuEWUYk;T+L3>JuZAH!+tOv>O}eQo~Z=4~c!Z9fPRPgU({x7#Q3 z#SI_qXlaH_R3P;N4R^UX(p_$|M&}T0+)1}h zo1;t^EPI|1X?YvobA~h;9N!PIx%9B|M(N(3D2OnFVTIPooqL(Q`S4WA*!~PKSN1J_ zu`oVFVKf?rn44W$AFo()9J6MvO&j0xrK_CL;c$I4p60ZvVCY7Rb}x()VuBr>6PT`r z^-^~(edCtJ${5E6p$L~A|G z9j}35aZIlgWwCKz#<`Z(Pn|Ci=&6u0MX5!YziHXbhsbOz8q93-#f7MTU_^}8Xwuf! z2UEj7-lO!^6mAhrs*eN%ftpM8kv&zVEWkRSx=*Tdt*r@B0n?Vplm{`^&Kf#iI3w{U zC_I`9<|kC=G%y-3pS#A1^RF$;XmY1ZSzR>PN9REbmqPS!f64WMV8^8p0n=&I7Gup1 zjSyNse!|8T+)KvM({FabM6ixFR3H2!potR$W!)9(Ov)aQUU}$4M1uGh(1)n6kCth~ zU}3B~cfq)g_rx8N3l=^_RvIvsFffcuPY7>e;XjCFO3M$HsM?f;&qDWE2cwG37kHHr zqdH&V0W=*|m(oUJ-T8sspV#Eq9R+7v9C`~toD?`1XX(gOuM9XLC@Z>#_0gp4#iq>j zx=*zC^`Q$f^iw}V0oH^VCjw=GfM6r^APP@?mW!43G)Xjs#z;gi@RPztn4G=(GEWN^ zN`S9mnC!Bgqoqc5c}sK7`WqfJqBlsBAiLrT-wr|Ch&!l;8=ip0 zU*4U8jpFs2mqZw#8E8iCgNK>zQ@+ydbGRQy7S)DGJXKlB<;$RamHJRGL2BBZn6_9O zG*teIamkzsv{$A*%UOPIt$yZU@-#3Ft-!*x@Cxtq`c}{9A}P!f${3QeqN`km(+nM0 z6b;cBS3-=Ysyl#&c)$>~=^CW%z-i+`-KFw4a=eI^?;_K>uo%YD&I7U3d+FwsHM$bY z>dK=RqM5c7z)*-siE$!bJ%zr8Yphaz@U#=w(f}^la0>>?V+zJ6&!GC4MG2%WBu(1^ z;}EqSP+%vmmIn-RqB4344-~ArKGF_$xwj5TtMTd`t+2vc0ppd~sq*NjY||ypR8b!l z;z%K4Dq|%IA?*mugcR?UTDuR!ac0^jn3OUDQx=joT*wF^rWIdOb)h_bh$vr)HC-RL zM{(LRbK8{r(&haxQvtiMSL!Qld3Z((rmKlsTLh!MRbgk!Y=)`kWo62?ZJQ~N7~(6b z3ZIjhoAq$M49VB*Sd^Gj+Rn54vO3k%%J!(~{)qhbIWJmUmRq|08I9?{o|7<`Jd=`F zX>KY~+NL07b}nT|6bjLKRBeID`Up>21R(}mX#t%!M&Z4*0a|>>)=|SX>0h{#JQg;s z4bcpuO)Bf9%-K~Th6rm5Ov7M^7n09H4R!SL0D{nmNh`WAg3epI6lM_Y{4!iJn1L-! z85BiBbc^y8L!5>&3h$*2;{2`RWqL4$ovHJ%?Jcm>wv(`K%EHaE`jnX}stwVt3h@ez zQAh`L*;a;VreHdSa~`k~QGIN#{`|9G6Rd?P z`_vF8nR=+9xRR*&12d!Xmtf(f&FNuneOyjin|=d-G8du@OJz2dFRX)s&ZdpxpxkS? z4~4Bv*@uRxVVaxuL25tXUg3MMneO@>*f9ZX>%)PcT&|A~%a@8dlQte#a~J33fNMY6 zJqtUo!PriiRkku^>qA@xL$6$swu(4&;~HG##qZ6;yA*b?ux$>uGG(8eFUXYAW~Q0> z*ZuDsI?(#djmJU$5iN|q><+A1_D#W7rtCvQd>b?UI**IU<2aP>0lXPTXlmHXlznK3 zZ)4`%90k`tMdnjrje$zo%9MR*i0@;@8Q6e#6ebtUpATD_vd;_=GR;~hxQ7A_#Q#IE zr78Q&5D649Cs()~@JifA!QPXyj|%Y@m}nsWABDZ4K0YnP_c7so_&*9;@9D>d_(ta3 z2QB`Su(h6kWQcEO{*NEul&v@>o;NWfoyQ;a^>xw$Id3|wMe6QIJxM=*;8#n+rZ(J! z{rn(L@4y~ECoI$aZev$PJ+P=-$I^6dNgNFFddfU1M;bT!SfGz6yjymU2cX^XG`_r4 z$h~kQr%-PNXi3%HZc_VL6lFl=?9V-VOrbD_e7o#y(zt?EHes1{vF5_4 zyRPh(c^YSfFdD(lGrHl%&rr9ZuBh2#VZTQV5{IKyKXWiklM`n352zCq=4U3Oh;8p# zuL8^FC9cNP9xKA|<~w5McE9;X+pGx{qdOYse`Cs2HeuP^d-d_K zWJl<$72Nl93Kmxj4;-x&?w5l@xo|BCcTbxH9pTvs#*i^2gtY}od`KQ8QAS8+m+48N%;`9 zIXCJEUZCw#7ew1rr4M&MNO^<;0bj`h+9tqI9R5ApeedmH&cGfm>_)~4m=^E6lLD(E z_ijVTo?;tTN9)SIuQy?NZyLx!1BgCAFDc(?YWMLg#em+Hf%b}&-B z*Q!oB)GU{*=tQf8h!!^L z&D7=HrOD>2AXsgH{xSUU-XFsWoAbbx{uKK_o3WBG*-3S+6?r>+4*sEjd!-^O>_P@&qBe5 z)#UZer46*j{o2){+CAj&)`xTZzQ$Cy<4@>aagv$(H1TSwV1SbcOMF>TjMk~@*28Rb zX^{$xTiKb*^?^8d>w}aBov*|duMlHxD7qWlyp`?n(SDjrq>gPsQrJNmc1?a`I_?Fb%=ary3h(ri1|FRv*9#%{-r1_B^Xo zAT6%v0Px^EOFn=yVT{xjExVrShbf7hKxLL3XwerZR2XkB;Jyt^%L|suXKOjwqwR*? zm4Sk?EsH<=**69C#t&E@=rmavK04U~nkMEe$e>Yz`cMpQF#Gfl6rw8!}`E`YjoduXlo|EH ztuAIPmxrQ0{L@<{>WmG;1yTd^hhw8n6Q8VWM=WEUN3ksa;F{oBMsO)@e8N&(V>myRb_2`}0z(cD*QX#NUTZO!*aHhw?(v<mwgB{$8m5PiB z7f=rhO?&xvY!EGV&780o=8UJzN-zs^Tk^nhtP1O&-^N`o*`nnNB#Gj##QNkq>xS52EKk@%>eAh z`Mo)n3en=eQ5Ls?ESr43jFQ!Gf}KX~K=-4w4r)?os|4BZI~KE_E6$mbskX!FWz31F zdbEam=*zfD9oc~I;bVJ#!c(wzV|HwVWm{MV1q)!JtL~K>OXooM@hNAvfCqC$E4C*H zbQETFnBk5%zsZAV@ z$&=NsLc5Wz7$lqjvSY5xVeT4eH7H~5O2%5~1sisLh>K_VlM4B@U=Vhc z#tP${c^T&zSa(hcE9o*N^c@&IeQ7RRP?q!<%$TxNAj&WW)~bxnLzzcp2t(Wzg>vQy zD-j#ku;*QPhOI(WWXVsL(`Ab(kD)pkrl4-bb1zNCV4O;U6nY5RgD(>&g(aS5R&9I# z_m*XJa{~2Lav<8;`&6|)TiQn$I;^e}rjN5r)n_clsna)xy4D79Qdr_?WF3&@?@8|@ zt_xB-Fu0U*Ia^(IsN!B7b&r9kMBJINLqrYYgivaO1VyzgEVrgS?YEd`mDe1ZWf;_4 z&-WaN4?kFwt$x~(x;AAvOr!Hu$e3wS;S=&Yg$f&rrN9Ph%`o<~HbcLFHPNc_rgtFF zy3bSRMX|MJm5;@S>W)-#NS@l$B+eAnK{ICRy($moW8=qAI3^7uZqg^g6yuvoC}R>U zyn*o|;U-uY)j05?1!C$u{r$9^0XkK-ye9e%SQlC4r8ogFdpfXG%$Pyi;vEUvT?N!O zXlAS#PY2_h-#H_{B(Q?1@dP?w%qY+MQkmLwAa?w7v>8JYrOK9Sg3m|;kp>o>NuH|3 zH5q%BYnHLhCia}@+Tb8nF(mb1hIl%X7)tHPtcVIT#S=$shSBOAQ1oZ5|6bAB(f}hG zLB_Ma6sIxezLFfKio|Ek-@#N-DqUkJut7N_^6mq*2+NyMgLOtXOe!3(y7E|? zEg6~Oob*)47(iXB57`DFP&Xv4^EB_=m00r-c+kA5Rx&MNkHF-B}P{O8qAuSucy)o7!o@khfW>Bv+>&fTadr5}rk;V; z1&zj2ko@q-*OIZr-&zk)GY5e}CbYrm=7e>g)@?(>?;aI(E^w@yiB{{tRD2}B17~ZZ zKoAm{8spTfLm4wDV@E3I>-E7vu?;ij!FW0wY=t4Pe;jhGKVQqr`dH?GI$IaUZw@(U zY9<+kJt8&@cbDs3By$`w)CbRsP{(bd;9Mj-GiY-_v z>Z%2UFfY~zDb&e~P3W70u7vfY^{1x+**u|iR@A>KT8_wtIYVq4!NH&CGd7`b4!RPS z6XUkl3zJ#LTz%YiU~RU*>$s9jCmed>vW&eAx)PRu*Z(qMZQ;|_$3ef_11)jj4HhH{ zM-0dbBFtE`5}L`F1ifX$YFPSRKHA7T4)#&FENF=XYqQl5Z<^X>j6Q-}nXx|fq7AEI zIWb3JwGTs|xQ}E_TP@9&K)h^fo3SRQnYV5w=tUde1It?m#UxIyy^*LTZM8H&fq322 zRT+C9bSI)0#(+yN{;;C$5if>GsOwN~g06(2F<}1H zZ*kxa7Obz2iy8Y3=z7@v>Piyz0Y&?6;;M|j54sk%2K13d`yS$=jJ*;17KJyDPb}KE z692y){-L&aUjP5kftv}FsjIL{1=`2Y&!0cTN9~BpN zZo0!-SzJEMm8?~sS`RCeXJPRim+&E zuTA~OZPMd(1x1zhcfcAR`C)c8By34XZH*7l8`PziB3OQK(Cx9v+we0O*y5*jRl>Xt z9hmcb$@`5)LWwY_Ct=;m{z@kybe#_?Ew%Z1<}9p%jx5bkpSXVEg6)!cmbwe}^lASs zT!-QI#lu04E$v3>i%rhh)gw#HrHiO@E2T+GQ=dvUq{q;4yZLPNQHWqqCzkb4cUG7W z!UJD+ao1HQN(Pp8Vyw3$wmkdflHVEE`i1LZc8QaO`mh_jt5V}b(%DDpEZyq9J#4%- zJ`)hJ1X!Hoqou+YqP@aJqV`w5d5G`$CQ1pGHqC)|ueIBH$B-;85259AkkVY0gsC#t zvOA+vz&<&urH|x`{VwgDJz;5$R%+CkyT_9gX3?_(!vn#3qxis5pvxOtugCM7{PI!K z?5AC8(d!#=Y>dKFGHc~_GWK9-ypxrime9TZ&>I^f)?yzvwE3EdVl8b@wNHgcwNz4q z#SQ_m7us1uVlkanPA&7V?bK0GSQ{i6#>#ErLGEtEK(kG^?@F}u8mTc{&M8S z)+Tx?`+&syjt6g)izBbf(sn;?wGR~hSE1Nwl|B$yoaL#f4XQg=;Y}FnCm6K40;`PTX%kmwesNO&kpF4u>89QQO!Pf8I> zcM_@7CDq5pAYXLs-h@S#eM%wXei}_xS=oqI52dGm^=1b?97;#WmI~n-$A%j~EUtQb zP-)Yig8Fa<>5^7#15?9hpUmdSY~cn|hY6!g-D?ShhqmXtSU6hl;{w(w|NVrmXl5nEAo7#C2YLVPYy z!ew(;Mqe40JcV|MsKFQ+Sj5-qbmceLxkH@xWY&C?gN6bJH_gk`t`9=T(*<>ocvK$; z6Rv#at~c^dcslN^{nhO7J1eVqw*@=9JXNSXvW=q@r#<2Aw}FDO$bcsic$6x29DD6s$qQK!=bF;F=`mD zL9o1fLvG})B7>)G&od#)b(>A)my|`8F$6X8v}NV-wxT-Ii^b*9)b1!@gv#u#nR{NK zQtUI{qHig+4j@Y`-9`hs*>U>(Za3CCR@bDbtfk#eN$VV1t1e-<-tX>jS^}deV{JRf zK+<4jqX}bp?B1))s;2A1X@ui_7}Up%rNe<7!^(!F0*pC0PkYOvetiUlfwGdRAx1;H zv{xVLzBE(cQI90UMhHlJ7u0e?(gfVi`WX4J>sx+=lCBNJ+XF+m=@;rJM+j|DAFZdU zZf&n_*(2@X<~%FkmHK=-F~)9vI2vHs(TXDtHwe$cQQlO-_NF{a@;D!M8OxAz-L9~7 z%iZO-9Nyg-dcG&Je9&N~K3vgNYSDH)l~G~)%Sf!M#@XUoAvl8CJJ}l52a_-d@->#m z&hzey4?8m>thDsZUKAEL@HX*oNN^C^RZnN@WAi(*hpp#0RdXS}oQVaZK#iIyC(QH` zrm2tCRj+a02kr?g>n!!K;zVsL0t2*lo{pN{!}7?(s#3e^USaQg6-rYdNts?+TOLf) z$0Bwsd{}5Hb;29l!Z2-(r^9jWWvZ*3s)_mtBS;5TS&I4~%KAJ$VeE62lB)}RSZHZX zpQ$+WGA#=wuqSK6)A6_l+McN5TA;7176^+fEM0vhTqj}b?Bnd!f$5G93oV85ItVj} z1>@D|Qh2JVk0Z^Or@H!}rV1gBM@Sd;j!ppv5|7f9hn%o^Bbn?i@L{2)ZTjLU_cG3LFqJG_ z*$z#85mily%K8W&5NQMClBJprrV^%q$iq4xR-)MSnS;U-ZCq+vPx~`fV$~s%S5;h{ zMhV%{3?FR5u4liCz39VARFl5*@2TV(m`0Y;Q^mA*P*$VLu14ur3;KjjJt9Vh)wld2 zRFl4Qm2@;Pqb%E{p4NX|P-Ru9&7(#ErUp>?*(U5p_Iuc?KCDDxD*`7FIhd#Q9tJn# z>4d1nYE|h>)uATrJb{(hP1tmOXnhzwTy-I;glh`yh&|D={Pf(t(4aL!RUa;^su6M_ zs+x%jut90hG+N%P(Pq@yZ$ei2Fg#^jh6)eTPchYS54_+qDwf{Up{qqyxb9p%Fb!&) zeFIPu%loPIk>#-oQ(bRsLZ(8cHqvwMmK0F`Kt0=}&jjr7IDcrFB^>>sMR=PQ-w5H!}*)zlaIwm|-jF7FU8exqw zT+tF98`eR+TGV4yvP_sK@Ku30VJagVtj>ppsG-2Jt8suGFnyWjVTwT2o~mZ5q6&!0 z5zou`qi^3ZvznW=DujzpO5Y=~z<4>Md| z$*3Hl3sZq=hEegXGW!(E_+VyzSZFC>d03$Noxy^U#ndru;3+U-IIJ0<%8xro`V?}C zFqelliUE=Y*h6XZrAwH*R~{5=XM9*_X<;1!wfXd=!}tO#x)e06r>asbs>0*_JS&Qd z5oXqOfCdH#QB$h~DPd=1li62b&+nZ5RD3XF?m9~WEIbhPTtCz=4`*G`rP%jc@{|}c zQy%H@=}?vR9?Y032N*shak)O2gjtXC<{T zS0DbX1E~rTM%Yw+7!+ScU9As3VWuYR+W2wXhoz_jZ~-$H%;<<^ax$ICe@x1fJv9W# z#()3-7Yj*5K~zu01%W(Ov8wW@=~N4bF3SHU`l=uy;DUs`4ZBn!12gppCjX%Y4L#-W z&3&7yrKq>?)?=3{Y+(le#BHwp{1;^nRHXrGO@Mloj;Bu8yRb_Y0$BPxftl;|aoN*x zh-y_UQIvNxVei7ORcI)zywI1Ke*)c_`k0c{hFD&A%&F?3CIiILEaR=mE>$SQ{FnaD zfxsN&7J8~wr4Y3irRQl9_BQNNh0rzAz|KJ+z?#Q(UX?YkieVL18k#adwV~@0_AcyF zg}IpA)>>gQ?6_Yab4E0(z|(c+R4okfJ-qeUr3&*e``;!okIR?M6%)fkPZz3MiFylf zJ$9+W^vlsUZix`RRbN6~BWs>}dn`HpXVU(_um716dQ5!aSq1w*6l5Y7?toTc0Pyki^YbTbyXMJKC+iWE z!GGlj%ZK@Ai31+BKH62WhB%ifs>Gr#ZVC7aq7oLE>bLb;2)k2kXSj<>4KVGRSnYao zenb1<@BD+300LIXs`e_%E?4ebV3sudl0ze}J^+vY->71hD@84BH@m{I7$u57-X3V}<&jomlt0y|lk|g4t;AQN^vANz)(x zGpT?7UaJq9vO7)!s?Ey0r?xN6^(;MWSI^q>F2p;t(_yh7c@TBpoc8qkYIVGhqZOE+ zNRV496LnIQxWF&JJt4 zP{m4paPaU~6o@{XpU4=S{b##3=C;bxr|rvw4*+;S4mh%Pg454YuG{n$1Y5UzV>!D! z_W1GbUD!=p$tnf}NMiuBAbOCu7gI#*%k7niCXzv-PheJc`F=vYnJcP~IdRf~k-0v~ zFjdHCU^{SpI5_nbHRyR>8HaUX10Eyn`ko$zJ7Dc3|1Hkuhc2UF717p(LmruAs-!O? zz>dhUKy0=yiPDRc4~vmcQXg3(S`}>ur7a@{#gC6TBlLRSrpKeR%D~9Bmv)Z_S0FY$ zD|x^wC=9bb})ddnTjg*g)Ks+<_olO(JOD9-x zQy=Y=Aoe^L@1usDFIC`I>gyxU6u3TUf6mm0WCgo&7l8m&;lg-s^gPDzZC6gQV6Eki(9MPMBLyj1A*~$X6fMdd zZ8K5UG5z{z8E3O#1x=W{wmyXC zspiWbP36@Uh^7~$V*sfWee+5>m0qonEj>QT%+!Zi{MtD|qik=M%~x3_SI0)5X=60w zM_v>)=`AZuuJT3`3~_-!Dn!&4S26U3%_5LX+yZ5j1nr!lu8(uv9=5@lB|bb8D-!@| zp5oHwSCskLN>b38u~ItlDz_!Y;%&9H<-yiRU)#ItgZ8|+Qy*kWFLeRE$fJwW&?}wc z4KINsfW*qvjUOWuD#XfBQf=)yWT!qvXkS_P1V%!zX9bqXU6eS%DL;! z@04a^i(Wj>CG2`8a5_L3 z)X{~eZ(`+iS-}e{jvk#DMPH>D#p@{I)i!;3wD%2&v!5`!wf6=+rBwo_EuJMf@{UPw zdSRGCfzW|%Zfw*yz1*znstk8t&_l85=OPqP*@N4w)Ap8zjt4B4p77;dY0oscE4sbb z;)0f>;eicK%9`vm<afQEQ7=vE`*bwjrchnNXnmM8$5WPs%I7Zi z4bGBn#(=4%DSs_6NmH0mf@8GNp~wn1Vz-wDkPk?j-yh{XoT@&!QI{XOwcC9rPXisB zdbUX$ad+=HzZqUY`XyklMVq#?QpT9I81ToIJuo3zhQvE}W=jeW=1>`HjB;zVyI(=G0or52W7W#V=?akJpv6SjH_-3%&O zP)inVoknb&s*jXHJXYrITXh0c#&CU1Y2%iG#arM*zKy&gOXEk%8jLLtYj(y*D$KIom&T{x!I4s#fKeckNUtYPaPR`;{Y_(O-SQfw-DuyvIpd4)QO4xG%ndm4_x)Ob+_?=bHNwL8DrVR zo6WVg0az40meK=US!vScnKD?<8nQ8=GiuySEC{3xICR7i)bvEmP{{W&iShglG zr_Mga5M#$idueFPecC3^)x(O)e9q*qVvN*EOQzKUgKv^{_;=bo-@(Jm%3|g6UDbv*H?k2^ov3SY zDce<2LYd=bcv7d-$T)PEedp`!iU(-03`r#9PLp!l9Iq`(o2`%52Zs+UDswM!^w!2E z3M0BqqpMT57|y6 zwQoy0{Qxv|#i(ie*!hgE5jNFFyasY)5<7m32clugDh4!;jB@zuG-((Cxcbm(yCAI^ zA!H9IW6DoI09~n%+VzK2A0zIO12hJZ*bs;HQD4w0+4;x6ksNaF8t4Ldo&dBRqP8p2 zI3G~2Ya>05Zm^)+z8%d1w!b}#1eL(1ZYXd6`m98`Z8I6&wtPpa377AH%8Bn%^`p7d( zA=UI7#Of#%N|s2vQXRSUkh_>1#-&ss-1}&fjZoVaX>51J?3sMQrbuHy6v)L!YQH=F zbYvaKRF`F8PX|l#SRSN4TpWuis;|(nCHq=YABJ%k)^Hi$p2CNMMQy-`>-E89FWeVZ zrHP+bW@8Hj5KyKuawzLnWEEZMnsIL(&m+M-F4{eqcZ?a8QGCl0ygxfxgpVj`tYwy&-6VG zbbDq*O%xg^*-R?+!QWmn3YROrfX*hEL4C+JB5iX8Lb~hVxXyHaFr5LY*2mmlQc%`u zAu)9;rjDUy)9!SOVcr%m4ryj9Ar4X9l6@9Q(-tt{vQ4`Ae@Re@096~d(LSb6t%$H> zL`t8{?ryR$v8@gRYhPg`!wjol6Y2xFYIA+`R8dlV8p~132?b>thn{Z9YUreW>?FS{RNYxPCj+UWI^(JuI zLKobv4}<=d;KLComgvJ+Su+5g1qNc99CbxggD_*_)gTqpR1yw1ZNQrUP)g!cRZbzV z)CUa^b*Xa`^}%U7QqA4bMzWW?){TAWRIW0%p{_fo@+bp;vTd%WV2BY)_LwSJ0ZpdB zYOfo*%cN_{#u@OO4}5H9)5oUNg-mr@`A6@gjH*6XmMlvSXplmK$kX+)MjJDJ81NG} zY%VUgQn{+wM!Ig9%7$287QS$o>*I3C4$0VrvAb{6)+TS#hx@T9brlU^39L00M8cr_ zm;UXdP$u(|E|=_(jB_}i0N~C%r1eKeoP#%FRG04-mMll+-Q9HVzD?V0AMVH2(*@3)ubEm{ z>9>=d%Tw{1l4Z#+o~&~BZQ5@8a6h&V_r9q`1}FD|qD3Xkl0gnhx`yt)S=$XC?#Cv9 zmzdg>d*!u@N|qA^FEh@%`!;QNeRyBxHvh)L`nY&8;4LM)Ephj4+NjJ~AKq8FRM*9; zPYmmJ#jY&bfLrPAVr>n0(uZHD+(o8F))LOjl4Z&F>*HP8ZshNMmAj}o)*UNLwgumF z_iftl`tZKWU3<*m=HDJ~E7=9^eqKAJV|C>&@R7wnetzBpUUGb_y9iFEl?2L`V=rPmghTIeXon8K$2Ui~}PF>6%A38z6 z4Ef?U`|t59NA$7SSVjtFj+v{E@L+FK?gI%dV_aJx^ZRankKa4u4n%u-h)A%k?hAK) z{7Cfyz|QQh1z*^g?R)&*VcPmATce`-m~_#^t%UYH-Gg*8^Jz3Df9vC;596qfuDD2T zoE<>?r(e!NBbM8qk8geamkty5)f(D3@1hAiYB~?z@o|^@J$~m%+cL(j?glnax#;5a zHq)-wyJNtZ{4I}9JZ5a1>vB(aegnd^#Tf(6^@X?d~=ja>+8(1Bg{H>17UJ6ZW5VB4 z`GF%`%l}r#Cm$LcoxRZIuGXDLzKl88`uLW|M;~vq(Sr-XGb0^={qXUQpuWelgSU~^ z$Au+A0-FLpLVXy-{f-}>ew;SCp^cY5ahvMSm<0BZvNC7{F>zV*eL(K#9{!2`tc|$M zFMMR~DC3d|V1JlUdi8Sc{AIWA@wH@ChisPD1r(AhZOX!Ej9Vi7dF=9!HCmBXa#r1FZZpF|HSb&8{rEv#DC@QA_)9%g?#oQ*T+p8JM|G4H39s3eGBBHkA9oq zurU{w+uF)A8GL-}02KkeZ0-a^ukzK+$tuP-}e&8XCH5~ zv0QE|;ARZ^-um(R$NOxIt55?j-G9$k{)5N+Yy>xrz*+2j{I`zZuo2B--{Ze}yv;^5 zi+zv(>hV4s;Vkw&{AAz1{Pv-4R?oA`|L0rLT$3O0>Q zOX;U#Gr7%9j50KvSs*s0t%c0;EVEK(&PvNQxZ5AwZr{7l`}Mi^_kEwwegF9i7$Gz} z8#fym3}#0MsZ1k9rdkCz>V=l*TSmAu4u%C9X*?v{29SVdgOp@9H!0q;@7tpj{XF+Z zvoDQzX6ek3!!YuT$8j*2#R#2B3Cn&mTmMXP(Q9oW+G2j?au2bPQcNf&CFaT&+Aif~ zWTaLe(8ycqB+ZSWaEB*k-Vzo%}(&`sk^Zk)4H^fF}N z+!cM5FHkW#y;=zuY$X4(Tme|W0C_kUg=xu&=WP%LzT!jrU1xkthaRgy#CJKh z3g9dG&L;Kus7Il*_XOtJ%Ij$Xj;ua6#&iX?Qj55+K#Z13%54JF)~rek_)hw`h9mK} zwoJ-WVO4UUd6%<`2M30 zU~lV`tZC5G-jI_3gJuVnNx$QmAI`{e_rPM~L-UA@7mWbHPSi4l58v~x$X%q%=eMU@k z$=RsHOJ2fH3R-n7@g^|Id*Lp}?Z;Iz@Y USkdf*G}9+Y4-BDp?vLXC1)RuZzW@LL diff --git a/public/images/pokemon/exp/back/female/6215.json b/public/images/pokemon/exp/back/female/6215.json new file mode 100644 index 00000000000..4f58734d55e --- /dev/null +++ b/public/images/pokemon/exp/back/female/6215.json @@ -0,0 +1,1028 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 155, + "h": 155 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:29aeff74e785c73ae2261d8bb0459111:5709d3d72351f1424de632ebf8347c01:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/back/female/6215.png b/public/images/pokemon/exp/back/female/6215.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbdab7eb85e4ce4052dcb553ad83d541c4fd493 GIT binary patch literal 2470 zcmV;X30d}uP)~7oS0jyZ5 zzj)|42DR6}HfB<6q&GjbCZbjo8&+Ai?)$vpbPR9XxXqmjF^!ca9rk@+CkB_|(~Txx zrBl&uI>#_(VsM~%&BfrJO_J!8=`*{pP66;PT_#=zURpHXNw zVWN`i>uXAEIG-JK{MTc`LxKx13nZ!Bt#@ z=pqAVJ$Q}Qy9qXpE>a|)+S4LCS45{zDnZeO+^C6;v3z~~IwZ@&BfH3k3di2+SiFmS zdYp^7^{7#{FwRuV5t|(kvi{)CxBA7!8|`7(OAJgEYqD_7gRFaDehwR4?qZiB=h!y0 z+n=%E$Zr-%D4t}!u?3Sg&wdF@rR}<-P#_9>Enx9MnMYZ7;ev@_F7PX%)vkgK-%+F` z-{!UpgkP>~J5*8j>1xE9DCxr1k9OlCD}cBz_cO~?b=l~iAzVJf#T%W!LH>jwuOxq= zm1XqFy&z2rE{gQ&0=`ZP#kNu+Q&8oy{uP`w@t1NQ8!2cpWl?CQc28rjv02&Zje0Th z!J+WW^7hOtD=PKTYb-NCEw-XEUJy<;@pW1^dKAFkd;{rDnjDcG=tgl>dZl^xx;#DsN_n8a)#rbw@11^X+4)*o+ zvh}%e)qBAWxVW1%>R*ek-^DM}u&Q?pXCEC_}H?pw`gmX)T&7t2c zObzc^0n=K6bcX3S-$!h}zrSZ5m(Qp`conm7XCM8JR{(E>^#?03>lNEAn@5aBhsUSa zlbDH=aM4N}^3D+*V1a}D?_<2^`8?%D}_x2XmkpS}qxALr+4Bk<{q zkkXwjQZ=?x4Fo=Y4^q0>soE4vAn|EQH3d@o*`eB;7E2)Usaq4g04cNCx!ROUkm1up z;iiO^&(4(u7JPDis`Ae_FbVDEb<4jJDU~3@rZj+{rdqi&+2oM&Gk|)To~unLLAFY=~MI<7^Qi@u7g)y@QB=O$F%}!b|9lGiqxn4luyrH30wuT zj|n^yPK?q#V%P4K(#E%fW!`8jpf7lrq-LFbT9>9rlwd6^k9Z9j+Vm*UyupmZ^oSZ1 zZ1@8rqRq%C@fyzx^F!X{$tIx9#3)~aZDD>0X{WljqyvvMUyCiy55`D=}`Lt%^&_}IPu|h$arWu?%jm@W-0$aRL>r|{z&|%G) zPX`9(Sf;g$a#*9w{kK&PjPw>Q+za(C${|hpGN^)J7_9@9Y3!oBm2eHi5l*A2BO6CP z0+lJ;b$F1}HAKXZ)lZGh=Qf)XGO8Fs_7t^9qUMNx_g|nvNbV~j7j}m%zBwv@Hr7B$ zR3SL0v2BXyQ_R8=OP>sU5^iRA0N?>gghtQ}G| zQ3@ML%#5L+x*$#dNtgeW$Vtw+ISp%Z6@_+Wic^BrsmSqU)($B<6#+x!R6G@X9XJFC z00sbowDyvHRZg?;Du@bP`XN)NqHLn%?T~rPA+S4D%Ba+rL^}1toof!K;mxYP0&A*s z-VYhh?h8$nDwaTWDjrr|MWG+I6dNTd1EPHg@qS2q$FV{iEo>k<6-%v}f*7fSs;-eE za?sdxiR-DeAalG^vD&Js@>azR0@~Ofg7ff)b%d5GAY3@ki(QmuAD{%8oRfKs&5Ke# zk1k4dD#k9##|cWJl+fd`8O*AU9Cd&I=FcYza@JxQTlnyntYNkd-)%pM?`3&`uj`Twcth>H8 zJE?3P7_>j1AxMqhPDPb>UN&il`bbAQ6}vkxxuh|h3qNj<6*@1UG@0a3n8%AW^5ev4 zt!!=4@OvuC{CI#l|C5;d kXZ(zx@iTtL&-h2i|79A#Nl`5(RsaA107*qoM6N<$f-fbdzyJUM literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/female/668.json b/public/images/pokemon/exp/back/female/668.json new file mode 100644 index 00000000000..4c493f84959 --- /dev/null +++ b/public/images/pokemon/exp/back/female/668.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668-female.png", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/female/668.png b/public/images/pokemon/exp/back/female/668.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b5ed2494e0f2f35b6841902a729f6cf233aa37 GIT binary patch literal 24896 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 KMNUMnLSTXrNTd<~ literal 1780 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 a{K@QHG<(CBr9U2n3PDd-KbLh*2~7a`r)muV diff --git a/public/images/pokemon/exp/back/shiny/female/6215.json b/public/images/pokemon/exp/back/shiny/female/6215.json new file mode 100644 index 00000000000..07510ceaa55 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/female/6215.json @@ -0,0 +1,1028 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 155, + "h": 155 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:7decf4c336c92bdacc5d43bc8590718f:30606c7130f3577df61a85f98b567a88:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/back/shiny/female/6215.png b/public/images/pokemon/exp/back/shiny/female/6215.png new file mode 100644 index 0000000000000000000000000000000000000000..3af5e81148c08c0977651464061a4c247c4b3d49 GIT binary patch literal 2470 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/shiny/female/668.json b/public/images/pokemon/exp/back/shiny/female/668.json new file mode 100644 index 00000000000..8e55af5a4de --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/female/668.png b/public/images/pokemon/exp/back/shiny/female/668.png new file mode 100644 index 0000000000000000000000000000000000000000..cec15d8fcb7e14f57c60c30649a75d1f0dddf623 GIT binary patch literal 24896 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 Hu0mjf`6~na literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/female/668.json b/public/images/pokemon/exp/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/female/668.png b/public/images/pokemon/exp/female/668.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0582a61f10a151f5755264a4a32ef3c7ebc2a2 GIT binary patch literal 23683 zcmV)zK#{+RP)Px#El^BUMF0Q*5D*Y{Ar?n6En_J?WJ^D)FCXMNBYAMeNGu?iKjKA&Z*!0U7KT1MJP>+Qg9b!}i3EL@D`8w7Bb69#;J zKA+bTW`ug#abs-(^Ko2*`p&!-!7!^OQVD4dD#y=RT+v zECjVAdMMM^XBsNR?*)vTri6&S;Fz_u6qg5k&S907F378fngyd+Es^?Or&K$ANAmg< zVVqN1zt~6K}@h8q4yshEDt6VMU&T{ zyezK|M{7v-T~=@DXIKwF>Q(WPYvR#2?j430vV|CNKcYBl&dP%1NAM9(A4@7PErJpX zwe2lW$wGAlfLIYQQcXY{ts9(Vv@D=QeDR3#IBIPmJ09#FT}^Z?mD4f?n#f^^geqY5 ziXnJ4{eSx^vC<{00ZAa7>uPWc#JY|*z+V=z6~|unxWQfki=mgWdc=0|64UDXOMCyn z+WyZmxOKrJwMj`UnGN6#^zk@n%Q`v&hadWs+s?;l L&cNuhLvbCDwVN%X=*M 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 Ti?XZ2_D2BX=HpuH9G>w%1I2Qg literal 1285 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

    Xigi?e{^!pwWrxoL2lPkz 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 Hu0mjf$1(uh literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/shiny/female/668.json b/public/images/pokemon/exp/shiny/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/female/668.png b/public/images/pokemon/exp/shiny/female/668.png new file mode 100644 index 0000000000000000000000000000000000000000..ad84dc5046025738033bc509fb10e19a905e47d9 GIT binary patch literal 23683 zcmV)zK#{+RP)Px#El^BUMF0Q*5D*Y*A}euWI%6q4rjAmXFg?sWOrU@;(WXKF&{(sgZs!;j{pX(e z`1o9N0V@Ci01tFhPE!E?|NsC0|NsC0|NsC0|K*LIrT_pS07*naRCt{2eG7Z+sIH|c z;(CO5|NozR&07Kq#3Q@+%y*c%r@ND|yd*6o;c}Vdfa7h)@jiA83-$fkhqVPLnE2TQ zw~f^<3xjnVkRsr>AMeNGu?iKjKA&Z*!0U7KT1MJP>+Qg9b!}i3EL@D`8w7Bb69#;J zKA+bTW`ug#abs-(^Ko2*`p&!-!7!^OQVD4dD#y=RT+v zECjVAdMMM^XBsNR?*)vTri6&S;Fz_u6qg5k&S907F378fngyd+Es^?Or&K$ANAmg< zVVqN1zt~6K}@h8q4yshEDt6VMU&T{ zyezK|M{7v-T~=@DXIKwF>Q(WPYvR#2?j430vV|CNKcYBl&dP%1NAM9(A4@7PErJpX zwe2lW$wGAlfLIYQQcXY{ts9(Vv@D=QeDR3#IBIPmJ09#FT}^Z?mD4f?n#f^^geqY5 ziXnJ4{eSx^vC<{00ZAa7>uPWc#JY|*z+V=z6~|unxWQfki=mgWdc=0|64UDXOMCyn z+WyZmxOKrJwMj`UnGN6#^zk@n%Q`v&hadWs+s?;l L&cNuhLvbCDwVN%X=*M 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 Z@E<(Z|IU(I&1wJu002ovPDHLkV1jZln!5l1 diff --git a/public/images/pokemon/shiny/668.png b/public/images/pokemon/shiny/668.png index c8ec7c9caf9e3d04568419a02f7f425267a9323a..73c11b9a7c7dfe79ba2541da5fb4633c1085e47c 100644 GIT binary patch delta 1067 zcmV+`1l0SJ2($>07=H)@0000+t^4i(0004VQb$4nuFf3k0000gP)t-s0000G5D;o2 zD{)~unJ_(|fH1S7Zl;b>%sWicra|Wz6!gnu`1tt!=bry|MBD%X01k9gPE!E?|NsC0 z|NsC0|NsC0S4!Iy000A?Nkltd@Q3;dLne zAmFz3W{lbNNA>wZGe_F@`eEPWaeObu6!+q!^gYBur9>1uKSWf5A}T|_OX+v0N*Ve; z5Tm{$pdO#1OzJbQr0(D&A<2{}%Ji?hoD*D08WNHY2_=6crNhSzo+l^>@h&N- z1~o|bbR;1(Nbd(%B$aZOFepdidJE}+G||{?95YI=z|( z2>Jt4a$;W$!RrtIa}w%p{E+sLBR-7<)9usIGR*%oonS_`1WP?G(`O{RLnFlj|Q>TdU6O;iJ^nj$14_` zkdC$nfPV~-dAdru2Y7ES&z^!Rl?_;ckYdY@5brtwTuBxv0SgjE6rv{vaCo$9T$@2(P2pToJgHQ=9a?z1e>X_B+=OJ!onTN zrzPeIx8{PBlT;4$cn6&r(p1V+O!?5Pm8n`zN`F`?rV`hXlU z`jDm@skAC#r9AUlINN#juCm9ds3 zN8PE&Q~MB9;cTP8m}ZwiDzzeQASB33iJ{yZ9!f|VJS$-nQay#&r4p3kQ}-%u@KnmT z8LHmldkMSNV-4{2hOV5V?*oabP$n8nB!9jKhOZ@W>yoi}B|C#0+(Rh{iT3^otxN68 zmMYTsl5JnMdFzX=d{3KKsJYaje4qVLSKdqgri_;hw$`K!*$#=n;k4q>vNk$fYLEy? z{uxUYu8}3EzPdw6?l=;zGYb$(HotB_ah9`tBYFOXGE3h=6g?*bUlr{6V4B`o03>ae lev(vhtE>5wwKz?!{R1s3L=bPpXaoQN002ovPDHLkV1kK%E001gbOjJbx000mW5NaYTd1yYFFg>7vFteg= zwwqeaJ5150LFX70^vh%T`1t+jo-@lM>;M1&0d!JMQvg8b*k%9#1D8oeK~#8NjnqMl z+eQ=z@R3dK5^`ih5Nyl>4!uN7u%KYTMZktqNB{#%PDUV8sDB{BV4W6l5M@kGDGqqh zsi$6gX=%XXeF~EzpXR&t&5T?vT3N{-gfaf{e@{YVqS71b&(Vl5Lr++jRmHJMqty+r(Bhq_*R@7e$QNF9x{)&uI9Z+S#Xq+ERjZ#EnsZ|dS z??>!|TuUVft@>$VS&k4V#d>NKDrL4gRLV~f8!j?65P-{uLLmUHuu542hrZJa_F8EK zd!-VhqRO-?GTbH`v%FS*rJP#9uQ}|0I_fH5N+H!FYkxKU5q6?d#fIEhdas^RKmQYp z@M)_m&9j>P8;f$K)nRsDxnhAxkMv7X{zA3dRgbHxI%@tL)%USj{OLbY0|TY{TDcV> zy&Q_kUHSVT>p_laHzP`|6m})jWqfDHWx0$7jPsqWsu#2BV|E=lq74FpTOl%%UI0i~FSvE9{RYPHc6Hdh|GsVF;@ z>X?>7bSjHTg{)0YqUZ&go*SI$m$r#C7Li#iV-hY}=Ed?n(E3HTEVD(0B93fPD@>b; zCZSv6@}w(PG_l;Nh`SXoB5zD}b;oc*yw9&QENstzno&Y(V2u1+00000NkvXXt^-0~ Eg6J38@c;k- diff --git a/public/images/pokemon/shiny/female/668.png b/public/images/pokemon/shiny/female/668.png index 1f56d13bc4c59af30283ad820e0ddc66a0bc175a..ec0d2338fac39bba3c75bce13c621f0b57f50d8d 100644 GIT binary patch delta 930 zcmV;T16}-s2doE>7=H)@0001DGedO%0004VQb$4nuFf3k0000gP)t-s0000G5D;o2 zD{)~unJ_(|fH1S7Zl;b>%sWicra|Wz6!gnu`1tt!=bry|MBD%X01k9gPE!E?|NsC0 z|NsC0|NsC0S4!Iy0009PNklP!cwW!>#*?%4!F^}028*B-*8lp9uJE4mqP_dte62=r=$o77{0k98kPFJ$sA?2#v;e(XM z5V~UfmXH358PXH8eF^;t9i9d!LN+ts+mwcy9L1vG`fIc9&+g%q7s7g zQGW%|G*l+kLMBZ>;xr>WEH*TM*#Zj)+k}qYWY?WSJ~AWggxYSS_of=!=Q@?7(f9YA z3QCS&3FEmvg^G7;d3$hb5~`f?0ocVdJ2Xt?s{?6iD`x&GomBaI<$0O?Ct^uA+kU$} zdHqKl)^E$x3onlT{_+S?3e)mDgq)gQo*OG_dU+1GY2y8r+H delta 888 zcmV-;1Bd*q2ZINY7=Hu<0001|!>)7y001gbOjJbx000mW5NaYTd1yYFFg>7vFteg= zwwqeaJ5150LFX70^vh%T`1t+jo-@lM>;M1&0d!JMQvg8b*k%9#0|!Y&K~#8Nh14-? z+dvct@Dsvhy+feTAyB$yi?|{|;f6wnW+-&g5HbnDxkC?X1b^0~p{)mHEVN+LsZ*DJ zfCPUE<8qnacj>*86`dtp{^LRBe)_+MWK4ER(+}iCCh2)UqX^Biu2*Af zVvWh-<#BXtM%6Z7N2g&C=4jRA7Z#nUnsi0D)hHUDcZ<`yc_V08mG;mBZgYKo{m!YH zeBVQt>m?eSu7B!wZ#!-gf8D6IDqT{?`0{dH*WX~fTK#AyrueH^esPOpd2jX>g?iDd z`!v0Ktlth%%qxRhwOZB-IzWp!sTf1G+kSyX?oRg)^?O}rgrHhA``=Kq7jd&(fR+Xk z){a~;(nB8?3UZ5xXW8m!-;ns90$s=%B4j3%^pj}NpMN-_k-Slm{Y|FPD2gln`_DWZ zM}g9MDuZzpf`+F&?~pg#+uQI9c#3o099VmFQBXua=WbspnUvC?f*E5}0OHEW?~d}A-=H!oF$o6|B{Rm$ zf;d5BJAX=>IaJAv62eRBAR#4e%jXEFB72<7Tm;}ErJ>ozcaRU5q%{R--8A_nJ&cM{ z0O*V6H0e+b(9J6fWvq_7G<1>UeBJ>=(zwAdoz3HIt^2p>1+{9Isf)<0p>7lM25pK&Qcp@brFI(5?NAiUT+inl)0mOas1|8wo|lEWu2h3O2h9<+N@f8l zmHCKB*rBIAB=NC-_U*AZis%4sh?DRTBGmvXi!$P%`9T!#qcb%`8^1wegX|S`P;3#$ zQ*jr0VGr5=mS%56J9PlXh`4L9)X;P8w*oH|4~ { expect(errors).toEqual([]); }); - it("check exp back variant files", () => { + it("check exp back female variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; + const errors = getMissingFiles(expVariant.back.female, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + it("check exp back male variant files", () => { const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingFiles(expVariant.back, dirPath); + const backMaleVariant = deepCopy(expVariant.back); + delete backMaleVariant.female; + const errors = getMissingFiles(backMaleVariant, dirPath); if (errors.length) { console.log("errors", errors); } @@ -239,8 +250,8 @@ describe("check if every variant's sprite are correctly set", () => { expect(errors).toEqual([]); }); - it("look over every file in variant exp back and check if present in masterlist", () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + it("look over every file in variant exp back female and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; const errors = getMissingMasterlist(expVariant.back, dirPath); if (errors.length) { console.log("errors for ", dirPath, errors); @@ -248,6 +259,15 @@ describe("check if every variant's sprite are correctly set", () => { expect(errors).toEqual([]); }); + it("look over every file in variant exp back male and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const errors = getMissingMasterlist(expVariant.back, dirPath, [ "female" ]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + it("look over every file in variant exp female and check if present in masterlist", () => { const dirPath = `${rootDir}exp${path.sep}female${path.sep}`; const errors = getMissingMasterlist(expVariant.female, dirPath); From 03011c4601c5fb84c5aa6048fc18079469411c03 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:35:24 -0500 Subject: [PATCH 019/171] [Balance] Change IV Scanner to single stack (#5299) * Make IV Scanner max stack 1 * Apply suggestions from code review Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: damocleas --- .../encounters/safari-zone-encounter.ts | 2 +- src/modifier/modifier.ts | 12 +++++------ src/phases/encounter-phase.ts | 2 +- src/phases/mystery-encounter-phases.ts | 2 +- src/phases/scan-ivs-phase.ts | 19 ++++------------- src/ui/battle-message-ui-handler.ts | 21 ++----------------- 6 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index fd078e1ffaa..aa497e3c8fc 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -315,7 +315,7 @@ async function summonSafariPokemon() { const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); + globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex())); } } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 37f88deea7f..d955385ecee 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -165,9 +165,9 @@ export abstract class PersistentModifier extends Modifier { public stackCount: number; public virtualStackCount: number; - constructor(type: ModifierType, stackCount?: number) { + constructor(type: ModifierType, stackCount: number = 1) { super(type); - this.stackCount = stackCount === undefined ? 1 : stackCount; + this.stackCount = stackCount; this.virtualStackCount = 0; } @@ -3295,7 +3295,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif export class IvScannerModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); + super(type); } match(modifier: Modifier): boolean { @@ -3303,7 +3303,7 @@ export class IvScannerModifier extends PersistentModifier { } clone(): IvScannerModifier { - return new IvScannerModifier(this.type, this.stackCount); + return new IvScannerModifier(this.type); } /** @@ -3311,11 +3311,11 @@ export class IvScannerModifier extends PersistentModifier { * @returns always `true` */ override apply(): boolean { - return true; + return true; //Dude are you kidding me } getMaxStackCount(): number { - return 3; + return 1; } } diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 7e62ca17f7c..1dd275ab130 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -478,7 +478,7 @@ export class EncounterPhase extends BattlePhase { })); const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index be07dbfc196..da78f59535f 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -396,7 +396,7 @@ export class MysteryEncounterBattlePhase extends Phase { if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE) { const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index 519d7913b79..9230844ff9b 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; -import { Stat } from "#app/enums/stat"; +import { PERMANENT_STATS, Stat } from "#app/enums/stat"; import { getPokemonNameWithAffix } from "#app/messages"; import { getTextColor, TextStyle } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; @@ -9,21 +8,14 @@ import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; export class ScanIvsPhase extends PokemonPhase { - private shownIvs: number; - constructor(battlerIndex: BattlerIndex, shownIvs: number) { + constructor(battlerIndex: BattlerIndex) { super(battlerIndex); - - this.shownIvs = shownIvs; } start() { super.start(); - if (!this.shownIvs) { - return this.end(); - } - const pokemon = this.getPokemon(); let enemyIvs: number[] = []; @@ -34,12 +26,11 @@ export class ScanIvsPhase extends PokemonPhase { for (let e = 0; e < enemyField.length; e++) { enemyIvs = enemyField[e].ivs; const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists - const ivsToShow = globalScene.ui.getMessageHandler().getTopIvs(enemyIvs, this.shownIvs); statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[]; statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0); for (let s = 0; s < statsContainerLabels.length; s++) { const ivStat = Stat[statsContainerLabels[s].frame.name]; - if (enemyIvs[ivStat] > currentIvs[ivStat] && ivsToShow.indexOf(Number(ivStat)) >= 0) { + if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) { const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; statsContainerLabels[s].setTint(hexTextColour); @@ -53,9 +44,7 @@ export class ScanIvsPhase extends PokemonPhase { globalScene.ui.setMode(Mode.CONFIRM, () => { globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.clearText(); - new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(false, () => { - globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end()); - }); + globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs).then(() => this.end()); }, () => { globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.clearText(); diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 93de69240c3..c87ac18c65d 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -6,7 +6,6 @@ import { addWindow } from "./ui-theme"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Button } from "#enums/buttons"; import i18next from "i18next"; -import type { Stat } from "#app/enums/stat"; import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; export default class BattleMessageUiHandler extends MessageUiHandler { @@ -191,13 +190,12 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - promptIvs(pokemonId: number, ivs: number[], shownIvsCount: number): Promise { + promptIvs(pokemonId: number, ivs: number[]): Promise { return new Promise(resolve => { globalScene.executeWithSeedOffset(() => { let levelUpStatsValuesText = ""; - const shownStats = this.getTopIvs(ivs, shownIvsCount); for (const s of PERMANENT_STATS) { - levelUpStatsValuesText += `${shownStats.includes(s) ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`; + levelUpStatsValuesText += `${this.getIvDescriptor(ivs[s], s, pokemonId)}\n`; } this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(false); @@ -211,21 +209,6 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - getTopIvs(ivs: number[], shownIvsCount: number): Stat[] { - let shownStats: Stat[] = []; - if (shownIvsCount < 6) { - const statsPool = PERMANENT_STATS.slice(); - // Sort the stats from highest to lowest iv - statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]); - for (let i = 0; i < shownIvsCount; i++) { - shownStats.push(statsPool[i]); - } - } else { - shownStats = PERMANENT_STATS.slice(); - } - return shownStats; - } - getIvDescriptor(value: number, typeIv: number, pokemonId: number): string { const starterSpecies = globalScene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists const starterIvs: number[] = globalScene.gameData.dexData[starterSpecies].ivs; From ce8b5752c47d6141449db8ee66e85fa52811d500 Mon Sep 17 00:00:00 2001 From: Esca Date: Tue, 11 Feb 2025 23:36:49 +0100 Subject: [PATCH 020/171] Fix Lunar Dance and Healing Wish not failing when no valid teammates are present (#5195) Co-authored-by: damocleas --- src/data/move.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 1c768f20bb0..cc22f582790 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -9463,7 +9463,8 @@ export function initMoves() { .ballBombMove(), new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore") - .triageMove(), + .triageMove() + .condition(failIfLastInPartyCondition), new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1), new AttackMove(Moves.NATURAL_GIFT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) @@ -9748,7 +9749,8 @@ export function initMoves() { new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore") .danceMove() - .triageMove(), + .triageMove() + .condition(failIfLastInPartyCondition), new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120), new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) From b483aa04651f1eaec52f7d11f95caa3a230ce210 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:39:04 -0500 Subject: [PATCH 021/171] [Sprite] Fix Stunfisk variant backs to use shader (#5293) --- .../images/pokemon/variant/_masterlist.json | 2 +- public/images/pokemon/variant/back/618.json | 40 + public/images/pokemon/variant/back/618_2.json | 2750 ----------------- public/images/pokemon/variant/back/618_2.png | Bin 3582 -> 0 bytes public/images/pokemon/variant/back/618_3.json | 2750 ----------------- public/images/pokemon/variant/back/618_3.png | Bin 3593 -> 0 bytes 6 files changed, 41 insertions(+), 5501 deletions(-) create mode 100644 public/images/pokemon/variant/back/618.json delete mode 100644 public/images/pokemon/variant/back/618_2.json delete mode 100644 public/images/pokemon/variant/back/618_2.png delete mode 100644 public/images/pokemon/variant/back/618_3.json delete mode 100644 public/images/pokemon/variant/back/618_3.png diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index f52b61d1289..14b3198c22d 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1397,7 +1397,7 @@ "612": [0, 1, 1], "616": [0, 1, 1], "617": [0, 1, 1], - "618": [0, 2, 2], + "618": [0, 1, 1], "619": [0, 1, 1], "620": [0, 1, 1], "621": [0, 1, 1], diff --git a/public/images/pokemon/variant/back/618.json b/public/images/pokemon/variant/back/618.json new file mode 100644 index 00000000000..d4db4967946 --- /dev/null +++ b/public/images/pokemon/variant/back/618.json @@ -0,0 +1,40 @@ +{ + "1": { + "cebd00": "bdac99", + "ffff00": "f3e6dd", + "6b6319": "987b6d", + "081019": "081019", + "52423a": "312118", + "6b524a": "4a342a", + "bd846b": "8c3841", + "846b63": "6b3838", + "d69c84": "ad4c4c", + "efce42": "eac2bd", + "d6cec5": "d6cec5", + "ffffff": "ffffff", + "081018": "081018", + "735a52": "564038", + "735a53": "564038", + "9c8473": "a08773", + "bda59c": "e6dbd6" + }, + "2": { + "cebd00": "58536b", + "ffff00": "707488", + "6b6319": "39314a", + "081019": "081019", + "52423a": "5a2e2e", + "6b524a": "804e48", + "bd846b": "cec9b1", + "846b63": "9c7765", + "d69c84": "f0ead6", + "efce42": "9fadb9", + "d6cec5": "4c8c4c", + "ffffff": "79a962", + "081018": "204a29", + "735a52": "885011", + "735a53": "735555", + "9c8473": "c18a2c", + "bda59c": "efc44b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.json b/public/images/pokemon/variant/back/618_2.json deleted file mode 100644 index d82c52e26e2..00000000000 --- a/public/images/pokemon/variant/back/618_2.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_2.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.png b/public/images/pokemon/variant/back/618_2.png deleted file mode 100644 index a0077a1f0232355d371b605e244154aa9177503c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3582 zcmVPx#El^BUMF0Q*2oM=DAs9+DDr-16RzNt6I6p>hn+qvj7|Hq@9ICV z>(`^nIiZ>|q?+8d75R3I+N1qya)0gn%QR7MYWJJ6_0qQ92{H6&m*=1L@Pv#^owgc# zilZeSwZc0lfRv!E*pv{TpX^AW=FnJ=+z<4uqBs}KC}nH=`WD~chq=Fh zwrv{;Fj#W1Ps*Y1??w6JI|O;;+mccoZBb2n_{65reXGISl)b0=Mt!x7!xzE>JW}wq zLthG&ap?JcZlFiPc8SKe1kKn}PlxR?a5RlnLmh?Bd(6cy$qQW2p2i;tpIX8S#Ss!L zX_MO49vVAl>9?}>F$SJ6{_LPj5=JKuhX9X+33if^yUZzc2|UwP!{F(F33W;CBJS_! zm+5X0o|y^=IyFDnRqrj%;`5rO&rx$z=3Gi0atjCYNa53ubOheAtm4=^x1_Dg*n0e8 zhF5S2b?ER2H0OFs&x+9667|*DW9zys+q!P-@M4!@j}V8HNBDFS=fpNk+Bc>UKpl1d zR1e?!7&1)-?9sXk$RXv?Qn2N1$UeLT--r6y$1xeyZ?zp~x~&tQ^C;in+M}EkdM*SH zQxxC220tm-?SU6~B=P<>9%aVPScBm$9v<_h9y$Hkd#dk;#%2QTZ@V^JE5O67UH1I; zVg48%Sc^=5hi%)I(jI4dh%{i(y>nUCi+dRkE%qqdJx_<+bkYM!F(-lXGfgc94NBvh zc6#>#CJr6&KHM548Z;RF#|?7Yn9@9lmcXIo*{JY6^&T!Np1&e$<9zRR$n7)bx%u;& z8$aUQ{Bcc9OEZG;B$KxzqnnzUu6}r7eqtX2w_u~Yn!g-lc2pXw_DAEhO~mBralSWX z`+K)Yw^Uj?+K{6uyxkC^?}BH;38UM*4xIH?0z4tQh-;t5v?sCrIg_f_irY#+GWvD0 z_A{CGRJXZgo9fBrN8cD5Es4Z7S4%~bW(^2564CZVVw_ zLi^}tTq+pTz9#rio^}+vgG%&ODW0WL!L$>2?OucnyjD7via>~Mkl9{}#CAVCc&Vh= zs7r;$w4cQGNOZ9(Ra`2x$>i=dg2c9P#5RGp?*#}h6+{E7FpDwmde6Ry?cu|RYCzCZ z+3J=`%xgQA@a#Fw9S%Sgd*L*jvIfNSiP!LPSSx=TT?1lr=$!e}L#01Y!+WJla zi#hU#;u;X=*qxs>HfSL?GknMRan7cD=z6+|Yy9rv4tG1J(mf{AkY*$^4;0| zmEs;IcgZDTZ1>A0xuU>sA8wdS61voZP*miSOlpTmp+B!ifW%yq$2|2;fDXNy0J`Bv z;LTR=MC`)#O@ok6%O#nq-obL|nHmw|qb4~e=7L<3nd%+V-=2_v{9m-$6kc}#HHp_u z_0H%BC3xhlE1OG_XcCvbkXsw9-aU>Emnl3?d#%a3x^hW?1Fu=j3A&N$optB}?7t1T2O~kA#Uz6aGB)TC&lSyQ=t_sHN9_+#EkR({p zg|lfzv##ep-AE;g$^T|9+E@#1y;&tmnf7Kb`hF@2 z%(ORg(G@DmBpm@{+F>r5Y%H&myhBF-6L-SdRPJxkR;ZFpt+!QBHoWd8G3_~9=j5DN zZ>z+#*QJv98;VsC78$A}GwW@Yn0CWO6Lp(QCBf=#9V*GpdRrmW?)SGFJW1AVPL%}9 z0!mbp(e<_-mT5<`u4;4}(^Xi#tyboj10T}gb-Im7aYD0z8kygId{}>{c|dvH=1@uQ zQ*Y~X3hVEesMKwQXY3aBwhpJT{x;oRr`z1F-WHy9wZwyGJG@X%%spV^I zshrsD>TNM+UEQtT7I)Uw-Rf;|XI+V#)!P!>Sy$p_^|l6NU3ogf+v{x!Ax30fWtrc} zO`!cfIqPa%i@W+a5ZQ~Q36ep8!D*ZUjPyEQk`P3^PCGFDYDg5*IH%_@Z{qALr=$f-2=J ziqi@UUihGU{}Q@~j?(p5Juz>VKgbdnGd|>H8!>&Hq3eZ&Fol)w$PyPnLIB?K67-AO z{{HJpioT#&S1oM>y5@`8SLzP_3ZJ=!1p#`hBrJlDRi#;qPD;*?@5_tCQV393h|}z>Mv>+Brb5K&)GXUE^6bFB9fV;H>v6T zaq~s(T1ioFQseVmEWX~0+EtRGk+`Nt*%w3Jcu|`!DP9uS{4+$Bt}oH}w<;_+pjAkU zKM@{PQana-P+Hkg9?Qx<*d}G3FMPG&;^t4EAv~7IN?cwwxWO{QK9I*MNnHGCW%uB* zj>pS@p}Px@bqRQ^_{cogXcEilKg`2N;jw1ji$4Xf0UA&Q&*!mbl2`{oMsx%oD{LcHwx%(5>?GQ@PS~S$G;F9a>q+CH*=`MEfMSo9K z*-*QJTdJ=URG4lpeE>e4~o89`S($IrP(d`%V6 zjxPcd4vGvSiLbmmht4>s<~3CWJJHlE9Td4l5>$D$yF+JjNf+7MU5ao}94(S?y{5`W z_S->okY1m+JHwrfi-;tm zs%*UW$`5~9eTjpoy*v2r6-h3y`gOM<$+(>&336?zp~EX)n^a@9OC;gf??PLV-14Xo z?K?#hpv#-|yK*vaV`$$ck^u3zolwDN6yL&CO2%yt?K?ygARf0pZbpw-8#Ei*?|t{5 zT167!#osZ!8u<QHw$Q#_BoQL)@~}9lsFB^? z8`>ix$)48qv_8@0yYmy0bph2q9Uj^TE&-{N_DQ?}eV%y@SBmab%H9*&8+@=+4YC^; z+V7|YG(`bIWjCbH@lJuye8R=`;AbX=;F-DhIhKLzY&TH9)o=MKtlT@ zvafj~6c4<_r^a`>@xKwOA095>0iBM^cQHP;H$rvegWw_ZU1>WQ^hPKyd?ne9@P4?N zZ-gS^gO5|7d`BvMI`NHAgjONn5jO)gw2%IB1RB(#vV8ZWYiH(VH?tYM)4wszKkNU4 z@E#iBIf6eX!Kki@OIQ3i;psMWr~7Tc?YI55-!`iK2akBF)Cr_f=>Px#07*qoM6N<$ Ef<4{sCIA2c diff --git a/public/images/pokemon/variant/back/618_3.json b/public/images/pokemon/variant/back/618_3.json deleted file mode 100644 index 17c49c5e59b..00000000000 --- a/public/images/pokemon/variant/back/618_3.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_3.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_3.png b/public/images/pokemon/variant/back/618_3.png deleted file mode 100644 index aaba24cfc58ffa65672345b8618cda273267f236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3593 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 Date: Tue, 11 Feb 2025 23:40:20 +0100 Subject: [PATCH 022/171] Adding for text on main dex page (#5300) --- src/ui/pokedex-ui-handler.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 4c920a094c6..791b80d8da2 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -150,6 +150,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; private type1Icon: Phaser.GameObjects.Sprite; private type2Icon: Phaser.GameObjects.Sprite; @@ -418,6 +419,10 @@ export default class PokedexUiHandler extends MessageUiHandler { this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); + this.pokemonFormText = addTextObject(6, 122, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 this.starterSelectScrollBar = new ScrollBar(161, 12, 5, pokemonContainerWindow.height - 6, 9); @@ -1943,6 +1948,12 @@ export default class PokedexUiHandler extends MessageUiHandler { this.pokemonSprite.setTint(0); } + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { + this.pokemonFormText.setText("Form Text"); + } else { + this.pokemonFormText.setText(""); + } + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); // TODO: always selecting the first form this.setTypeIcons(speciesForm.type1, speciesForm.type2); From 5743751e5ca93c455f5b9a0da26c1dd9f21b4fcc Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 12 Feb 2025 00:01:54 +0100 Subject: [PATCH 023/171] [Bug][Test] Adding bypass faint to abilities that need it + fixing Perish Body (#5226) * Added tests for snad spit, seed sower and perish body; for all three, the test checking if the ability triggers after the user faints is failing. * Adding .bypassFaint() to the three abilities, tests passing * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Removed incorrect test for perish song * Added tests for perish body when one mon already has the perish song tag, both ways * Changed ability behavior to pass tests * Removing superfluous conditional --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 11 ++- src/test/abilities/perish_body.test.ts | 116 +++++++++++++++++++++++++ src/test/abilities/sand_spit.test.ts | 17 +++- src/test/abilities/seed_sower.test.ts | 69 +++++++++++++++ 4 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 src/test/abilities/perish_body.test.ts create mode 100644 src/test/abilities/seed_sower.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index a6d00b29fbc..347054d2447 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1003,7 +1003,7 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) { - if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) { + if (attacker.getTag(BattlerTagType.PERISH_SONG)) { return false; } else { if (!simulated) { @@ -6141,7 +6141,8 @@ export function initAbilities() { .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.SOUND_BASED), 0.5) .ignorable(), new Ability(Abilities.SAND_SPIT, 8) - .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS), + .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS) + .bypassFaint(), new Ability(Abilities.ICE_SCALES, 8) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5) .ignorable(), @@ -6174,7 +6175,8 @@ export function initAbilities() { new Ability(Abilities.STEELY_SPIRIT, 8) .attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL), new Ability(Abilities.PERISH_BODY, 8) - .attr(PostDefendPerishSongAbAttr, 4), + .attr(PostDefendPerishSongAbAttr, 4) + .bypassFaint(), new Ability(Abilities.WANDERING_SPIRIT, 8) .attr(PostDefendAbilitySwapAbAttr) .bypassFaint() @@ -6232,7 +6234,8 @@ export function initAbilities() { .attr(PostDefendAbilityGiveAbAttr, Abilities.LINGERING_AROMA) .bypassFaint(), new Ability(Abilities.SEED_SOWER, 9) - .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY), + .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY) + .bypassFaint(), new Ability(Abilities.THERMAL_EXCHANGE, 9) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) diff --git a/src/test/abilities/perish_body.test.ts b/src/test/abilities/perish_body.test.ts new file mode 100644 index 00000000000..70ba6d8d684 --- /dev/null +++ b/src/test/abilities/perish_body.test.ts @@ -0,0 +1,116 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Abilities - Perish Song", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.CURSOLA); + game.override.ability(Abilities.PERISH_BODY); + game.override.moveset([ Moves.SPLASH ]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([ Moves.AQUA_JET ]); + await game.classicMode.startBattle(); + const cursola = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + 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.enemyMoveset([ Moves.AQUA_JET ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.CURSOLA, Species.FEEBAS ]); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); + + it("should not activate if attacker already has perish song", async () => { + game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.CURSOLA ]); + const feebas = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.PERISH_SONG); + await game.toNextTurn(); + + expect(feebas?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const cursola = game.scene.getPlayerPokemon(); + expect(cursola?.summonData.tags.length).toBe(0); + expect(magikarp?.summonData.tags[0].turnCount).toBe(2); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.AQUA_JET); + await game.toNextTurn(); + + 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 () => { + game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); + game.override.moveset([ Moves.WHIRLWIND, Moves.SPLASH ]); + game.override.startingWave(5); + await game.classicMode.startBattle([ Species.CURSOLA ]); + const cursola = game.scene.getPlayerPokemon(); + + game.move.select(Moves.WHIRLWIND); + await game.forceEnemyMove(Moves.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); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.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); + }); +}); diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts index 1c21cff3c14..092c3e66105 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/src/test/abilities/sand_spit.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Sand Spit", () => { it("should trigger when hit with damaging move", async () => { game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle(); + await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); await game.toNextTurn(); @@ -44,9 +44,22 @@ describe("Abilities - Sand Spit", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); }, 20000); + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.SILICOBRA, Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); + }); + it("should not trigger when targetted with status moves", async () => { game.override.enemyMoveset([ Moves.GROWL ]); - await game.startBattle(); + await game.classicMode.startBattle(); game.move.select(Moves.COIL); await game.toNextTurn(); diff --git a/src/test/abilities/seed_sower.test.ts b/src/test/abilities/seed_sower.test.ts new file mode 100644 index 00000000000..71b76e24d2e --- /dev/null +++ b/src/test/abilities/seed_sower.test.ts @@ -0,0 +1,69 @@ +import { TerrainType } from "#app/data/terrain"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Abilities - Seed Sower", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.ARBOLIVA); + game.override.ability(Abilities.SEED_SOWER); + game.override.moveset([ Moves.SPLASH ]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.ARBOLIVA, Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should not trigger when targetted with status moves", async () => { + game.override.enemyMoveset([ Moves.GROWL ]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).not.toBe(TerrainType.GRASSY); + }); +}); From 7199aee9adc98bbc3cc927516aba985c4a1180a0 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:09:25 +0100 Subject: [PATCH 024/171] [UI/UX] Fix showing form names and types (#5302) * Correctly displaying form names * Fixed bug which displayed wrong form types * Handling unobtainable forms * F button does not show up if there is only one obtainable form --- src/data/pokemon-species.ts | 13 ++++++++----- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 041632b183d..43b719878bb 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1003,19 +1003,22 @@ export class PokemonForm extends PokemonSpeciesForm { public formName: string; public formKey: string; public formSpriteKey: string | null; + public isUnobtainable: boolean; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false + catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false, + isUnobtainable: boolean = false ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey)); this.formName = formName; this.formKey = formKey; this.formSpriteKey = formSpriteKey; + this.isUnobtainable = isUnobtainable; } getFormSpriteKey(_formIndex?: number) { @@ -1812,7 +1815,7 @@ export function initSpecies() { new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), ), new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2366,7 +2369,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300) + new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) ), new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), @@ -2465,11 +2468,11 @@ export function initSpecies() { new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true), ), new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), ), new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 683045d7814..e3386033030 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -1583,7 +1583,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { // TODO: are those bangs correct? break; } - } while (newFormIndex !== props.formIndex); + } while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable); starterAttributes.form = newFormIndex; // store the selected form this.savedStarterAttributes.form = starterAttributes.form; this.formIndex = newFormIndex; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 791b80d8da2..153c132d45a 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1698,7 +1698,7 @@ export default class PokedexUiHandler extends MessageUiHandler { openFormTray(species: PokemonSpecies): boolean { - this.trayForms = species.forms; + this.trayForms = species.forms.filter(f => !f.isUnobtainable); this.trayNumIcons = this.trayForms.length; this.trayRows = Math.floor(this.trayNumIcons / 9) + (this.trayNumIcons % 9 === 0 ? 0 : 1); @@ -1949,19 +1949,19 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - this.pokemonFormText.setText("Form Text"); + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); } else { this.pokemonFormText.setText(""); } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); // TODO: always selecting the first form + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex ?? 0); // TODO: always selecting the first form this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { this.setTypeIcons(null, null); } - if (species?.forms?.length > 1) { + if (species?.forms?.filter(f => !f.isUnobtainable).length > 1) { if (!this.showingTray) { this.showFormTrayIconElement.setVisible(true); this.showFormTrayLabel.setVisible(true); From 595413edd702ff2b64ddf2b02d6f8ed21320a011 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:14:22 -0500 Subject: [PATCH 025/171] [i18n] Update locale submodules (Feb 12 21:30 UTC) (#5308) --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index bfcd7f91c39..f46dcdb423c 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit bfcd7f91c39630f155839872c8f66fd0a89e12ac +Subproject commit f46dcdb423c24137a25d9f6078cc6be68502801a From be0f3b2ab3d57fdbe8fede812a2e8cb66e5e5b28 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Thu, 13 Feb 2025 04:14:22 +0100 Subject: [PATCH 026/171] [Bug][UI/UX] Dex bug fixes 12 feb (#5307) * Fixed bug when setting tint of eggs for egg move filter * Form text is properly hidden when going to filters * Displaying level up moves of alternate forms * Offsetting form cycle button when uncaught text is shown * Pokedex buttons now appear on mobile touchpad * Hotfix to prevent "Normal" form to showing the text * Preventing filter texts from showing gibberish * Moving cursor to input text when pressing on filter * Introducing method to get full obtainable unlocks for a given species * Filtering obtainable unlocks in dex * Buying eggs in dex does not crash the game * Shiny icon does not overlap with luck text for evolutions * Shiny is maintained correctly when cycling through different pages * Displacing text elements to avoid overlap for localized form names * Checking starter caughtAttr in addition to pokemon caughtAttr --- index.css | 12 +++---- src/data/pokemon-species.ts | 60 ++++++++++++++++++++++++++++++- src/ui/filter-text.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 48 ++++++++++++++----------- src/ui/pokedex-scan-ui-handler.ts | 7 +++- src/ui/pokedex-ui-handler.ts | 45 ++++++++++++++--------- 6 files changed, 127 insertions(+), 47 deletions(-) diff --git a/index.css b/index.css index 2ec106516d2..d32d9da9bb1 100644 --- a/index.css +++ b/index.css @@ -164,13 +164,13 @@ input:-internal-autofill-selected { } /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant { +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleVariant { display: none; } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 43b719878bb..5883bac3fc8 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -7,7 +7,7 @@ import i18next from "i18next"; import type { AnySound } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import type { GameMode } from "#app/game-mode"; -import type { StarterMoveset } from "#app/system/game-data"; +import { DexAttr, type StarterMoveset } from "#app/system/game-data"; import * as Utils from "#app/utils"; import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; @@ -32,6 +32,37 @@ export enum Region { PALDEA } +// TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed. +export const normalForm: Species[] = [ + Species.PIKACHU, + Species.RAICHU, + Species.EEVEE, + Species.JOLTEON, + Species.FLAREON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.PICHU, + Species.ROTOM, + Species.DIALGA, + Species.PALKIA, + Species.KYUREM, + Species.GENESECT, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.ROCKRUFF, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.CRAMORANT, + Species.ZARUDE, + Species.CALYREX +]; + /** * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given * @param species The species to fetch @@ -997,6 +1028,33 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali ? this.forms[formIndex || 0].getFormSpriteKey() : ""; } + + /** + * Generates a {@linkcode bigint} corresponding to the maximum unlocks possible for this species, + * taking into account if the species has a male/female gender, and which variants are implemented. + * @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}. + */ + getFullUnlocksData(): bigint { + let caughtAttr: bigint = 0n; + caughtAttr += DexAttr.NON_SHINY; + caughtAttr += DexAttr.SHINY; + if (this.malePercent !== null) { + if (this.malePercent > 0) { + caughtAttr += DexAttr.MALE; + } + if (this.malePercent < 100) { + caughtAttr += DexAttr.FEMALE; + } + } + caughtAttr += DexAttr.DEFAULT_VARIANT; + if (this.hasVariants()) { + caughtAttr += DexAttr.VARIANT_2; + caughtAttr += DexAttr.VARIANT_3; + } + caughtAttr += DexAttr.DEFAULT_FORM; + + return caughtAttr; + } } export class PokemonForm extends PokemonSpeciesForm { diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index f961fc9b385..f69cf113f05 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -133,7 +133,7 @@ export class FilterText extends Phaser.GameObjects.Container { const handler = ui.getHandler() as AwaitableUiHandler; handler.tutorialActive = true; // Switch to the dialog test window - this.selections[index].setText(String(i18next.t(dialogueName))); + this.selections[index].setText( dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); ui.revertMode(); this.onChange(); }, diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index e3386033030..8b5a5bd12f1 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -16,7 +16,7 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { Type } from "#enums/type"; @@ -383,7 +383,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons"); + this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons"); this.pokemonShinyIcon.setOrigin(0.15, 0.2); this.pokemonShinyIcon.setScale(1); this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); @@ -601,7 +601,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const form = species.forms[formIndex]; // If this form has a specific set of moves, we get them. - this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; + this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; this.ability1 = form.ability1; this.ability2 = (form.ability2 === form.ability1) ? undefined : form.ability2; this.abilityHidden = (form.abilityHidden === form.ability1) ? undefined : form.abilityHidden; @@ -741,14 +741,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return biomes; } - isCaught(otherSpeciesDexEntry?: DexEntry): bigint { + isCaught(otherSpecies?: PokemonSpecies): bigint { if (globalScene.dexForDevs) { return 255n; } - const dexEntry = otherSpeciesDexEntry ? otherSpeciesDexEntry : this.speciesStarterDexEntry; + const species = otherSpecies ? otherSpecies : this.species; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]; - return dexEntry?.caughtAttr ?? 0n; + return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData(); } /** * Check whether a given form is caught for a given species. @@ -765,11 +767,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } const species = otherSpecies ? otherSpecies : this.species; const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; - const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = this.isCaught(species); - const isFormCaught = dexEntry ? - (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n - : false; + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; return isFormCaught; } @@ -783,8 +783,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { */ initStarterPrefs(): StarterAttributes { const starterAttributes : StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; - const dexEntry = globalScene.gameData.dexData[this.species.speciesId]; - const caughtAttr = this.isCaught(dexEntry); + const caughtAttr = this.isCaught(); // no preferences or Pokemon wasn't caught, return empty attribute if (!starterAttributes || !caughtAttr) { @@ -1235,7 +1234,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { case MenuOptions.BIOMES: - if (!(this.isCaught() || this.speciesStarterDexEntry?.seenAttr)) { + if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { error = true; } else { this.blockInput = true; @@ -1372,8 +1371,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.evolutions.map(evo => { const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId); - const evoSpeciesStarterDexEntry = evoSpecies ? globalScene.gameData.dexData[evoSpecies.speciesId] : undefined; - const isCaughtEvo = this.isCaught(evoSpeciesStarterDexEntry) ? true : false; + const isCaughtEvo = this.isCaught(evoSpecies) ? true : false; // Attempts to find the formIndex of the evolved species const newFormKey = evo.evoFormKey ? evo.evoFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey); @@ -1535,6 +1533,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonShinyIcon.setVisible(true); starterAttributes.shiny = true; + this.savedStarterAttributes.shiny = starterAttributes.shiny; } else { let newVariant = props.variant; do { @@ -1688,7 +1687,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - const egg = new Egg({ scene: globalScene, species: this.species.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const egg = new Egg({ scene: globalScene, species: this.starterId, sourceType: EggSourceType.SAME_SPECIES_EGG }); egg.addEggToGameData(); globalScene.gameData.saveSystem().then(success => { @@ -1856,6 +1855,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.canCycleGender) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); } + } else { + // Making space for "Uncaught" text + this.instructionRowY += 8; } if (this.canCycleForm) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); @@ -2093,7 +2095,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; - const caughtAttr = this.isCaught(dexEntry); + const caughtAttr = this.isCaught(species); if (!caughtAttr) { const props = this.starterAttributes; @@ -2240,13 +2242,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { - this.pokemonShinyIcon.setY(135); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonHatchedIcon.setVisible(false); this.pokemonHatchedCountText.setVisible(false); this.pokemonFormText.setY(36); } else { - this.pokemonShinyIcon.setY(117); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); this.pokemonFormText.setY(42); @@ -2276,7 +2276,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (isFormCaught || isFormSeen) { const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? this.setTypeIcons(speciesForm.type1, speciesForm.type2); - this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + } this.pokemonFormText.setVisible(true); if (!isFormCaught) { this.pokemonFormText.setY(18); @@ -2321,7 +2326,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { */ getCurrentDexProps(speciesId: number): bigint { let props = 0n; - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index 0fc7171842a..3920c866486 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -115,6 +115,10 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { this.reduceKeys(); + setTimeout(() => { + input.setFocus(); // Focus after a short delay to avoid unwanted input + }, 50); + input.on("keydown", (inputObject, evt: KeyboardEvent) => { if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { // Delete autocomplete list and recovery focus. @@ -169,7 +173,8 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { this.submitAction = (_) => { if (ui.getMode() === Mode.POKEDEX_SCAN) { this.sanitizeInputs(); - const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); + const outputName = this.reducedKeys.includes(this.inputs[0].text) ? this.inputs[0].text : ""; + const sanitizedName = btoa(unescape(encodeURIComponent(outputName))); config.buttonActions[0](sanitizedName); return true; } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 153c132d45a..940223528fb 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -7,7 +7,7 @@ import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type { PokemonForm } from "#app/data/pokemon-species"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { catchableSpecies } from "#app/data/balance/biomes"; import { Type } from "#enums/type"; @@ -411,15 +411,15 @@ export default class PokedexUiHandler extends MessageUiHandler { this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(); - this.pokemonNumberText = addTextObject(6, 140, "", TextStyle.SUMMARY); + this.pokemonNumberText = addTextObject(6, 141, "", TextStyle.SUMMARY); this.pokemonNumberText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(6, 127, "", TextStyle.SUMMARY); + this.pokemonNameText = addTextObject(6, 128, "", TextStyle.SUMMARY); this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonFormText = addTextObject(6, 122, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); + this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); @@ -565,7 +565,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); - if (dexEntry.caughtAttr || globalScene.dexForDevs) { + if ((dexEntry.caughtAttr & species.getFullUnlocksData()) || globalScene.dexForDevs) { icon.clearTint(); } else if (dexEntry.seenAttr) { icon.setTint(0x808080); @@ -606,7 +606,7 @@ export default class PokedexUiHandler extends MessageUiHandler { return {}; } - const caughtAttr = dexEntry.caughtAttr; + const caughtAttr = dexEntry.caughtAttr & species.getFullUnlocksData(); const hasShiny = caughtAttr & DexAttr.SHINY; const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; @@ -1255,7 +1255,9 @@ export default class PokedexUiHandler extends MessageUiHandler { // First, ensure you have the caught attributes for the species else default to bigint 0 // TODO: This might be removed depending on how accessible we want the pokedex function to be - const caughtAttr = globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); + const caughtAttr = (globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(container.species.speciesId)]?.caughtAttr || BigInt(0)) & + container.species.getFullUnlocksData(); const starterData = globalScene.gameData.starterData[starterId]; const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); @@ -1292,7 +1294,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (fitsEggMove1 && !fitsLevelMove1) { container.eggMove1Icon.setVisible(true); const em1 = eggMoves.findIndex(name => name === selectedMove1); - if ((starterData[starterId].eggMoves & (1 << em1)) === 0) { + if ((starterData.eggMoves & (1 << em1)) === 0) { container.eggMove1Icon.setTint(0x808080); } else { container.eggMove1Icon.clearTint(); @@ -1303,7 +1305,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (fitsEggMove2 && !fitsLevelMove2) { container.eggMove2Icon.setVisible(true); const em2 = eggMoves.findIndex(name => name === selectedMove2); - if ((starterData[starterId].eggMoves & (1 << em2)) === 0) { + if ((starterData.eggMoves & (1 << em2)) === 0) { container.eggMove2Icon.setTint(0x808080); } else { container.eggMove2Icon.clearTint(); @@ -1580,11 +1582,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } const speciesId = container.species.speciesId; + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & container.species.getFullUnlocksData(); this.updateStarterValueLabel(container); container.label.setVisible(true); - const speciesVariants = speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v)) + const speciesVariants = speciesId && caughtAttr & DexAttr.SHINY + ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(caughtAttr & v)) : []; for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; @@ -1595,7 +1598,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!globalScene.gameData.dexData[speciesId].caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); + container.hiddenAbilityIcon.setVisible(!!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); container.classicWinIcon.setVisible(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0); container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); @@ -1729,7 +1732,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.trayContainers = []; this.trayForms.map((f, index) => { - const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const isFormCaught = dexEntry ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, shiny: props.shiny, variant: props.variant }); this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); @@ -1866,6 +1869,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { this.pokemonNumberText.setText(species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : ""); this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonFormText.setText(""); this.type1Icon.setVisible(false); this.type2Icon.setVisible(false); if (species) { @@ -1899,8 +1903,9 @@ export default class PokedexUiHandler extends MessageUiHandler { if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); - if (!dexEntry.caughtAttr) { + if (!caughtAttr) { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); if (shiny === undefined) { @@ -1917,7 +1922,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } } - const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormCaught = dexEntry ? (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; const assetLoadCancelled = new BooleanHolder(false); @@ -1949,7 +1954,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + } } else { this.pokemonFormText.setText(""); } @@ -2054,7 +2064,8 @@ export default class PokedexUiHandler extends MessageUiHandler { */ getCurrentDexProps(speciesId: number): bigint { let props = 0n; - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props From f1283ad1c8c8e4681a1c7db09b6eca54957bad14 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 13 Feb 2025 22:11:40 +0100 Subject: [PATCH 027/171] [UI/UX] Valentine 2025 Event Banners (#5310) * Valentine 2025 Event Banners --- .../images/events/valentines2025event-de.png | Bin 3267 -> 20550 bytes .../images/events/valentines2025event-en.png | Bin 3267 -> 20537 bytes .../events/valentines2025event-es-ES.png | Bin 3267 -> 20570 bytes .../images/events/valentines2025event-fr.png | Bin 3267 -> 22433 bytes .../images/events/valentines2025event-it.png | Bin 3267 -> 20372 bytes .../images/events/valentines2025event-ja.png | Bin 3267 -> 27437 bytes .../images/events/valentines2025event-ko.png | Bin 3267 -> 25791 bytes .../events/valentines2025event-pt-BR.png | Bin 3267 -> 21243 bytes .../events/valentines2025event-zh-CN.png | Bin 3267 -> 24584 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/events/valentines2025event-de.png b/public/images/events/valentines2025event-de.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..8dd41924a774f7175e47d526d174b5e99d50f329 100644 GIT binary patch literal 20550 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 Z@>j3vnmn{tQ39Rx=jrO_vd$@?2>=XxLvjEB literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-en.png b/public/images/events/valentines2025event-en.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..dc36dad33943be6145ee187cc3205ff1c739897f 100644 GIT binary patch literal 20537 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 F1OPEhqUrzu literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-es-ES.png b/public/images/events/valentines2025event-es-ES.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..0915299b7bdce6c51f3981035b27580fcb2c43b8 100644 GIT binary patch literal 20570 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 b#|ixBUtw$Dz{GV3d~~3vtDnm{r-UW|3Lu^j literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-fr.png b/public/images/events/valentines2025event-fr.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..dbaf23101ed15bb449f5e1bbc24bcd017269280e 100644 GIT binary patch literal 22433 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%0DB$D!)baVBcO z*KZ~E>{%>FiDZYKd5rzk<}wHE)}P*-v8}nwg5$>s%XhoZ`O&XcMLKlzo^e)wwpjV* z>mvt%=L4nsPL!ZcN`{qFr}~(y>K(-F)J2Qf^QgdXTX<7JL4 k;Lp&Os}(PQBRLnVpj3Ss`8DPV5)<7cE+?IaCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-it.png b/public/images/events/valentines2025event-it.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..b10eb8083beaf5fa321eabad9e64d77cbcd830f7 100644 GIT binary patch literal 20372 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 BH`M?D literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-ja.png b/public/images/events/valentines2025event-ja.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..7e9fe5ad3d4b32541215d9cf8ba766299e2ed11f 100644 GIT binary patch literal 27437 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

    v!V-wL<9tE9CA@ASTs_1#fvp3 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 HtKk0uK!Vgt literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-ko.png b/public/images/events/valentines2025event-ko.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..558a402fc7764d11b01d5a13b4c836df2e2c8ae0 100644 GIT binary patch literal 25791 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 literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-pt-BR.png b/public/images/events/valentines2025event-pt-BR.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..45fa40f30fc9476a65f8d2ff134e4264c8dedb44 100644 GIT binary patch literal 21243 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 diff --git a/public/images/events/valentines2025event-zh-CN.png b/public/images/events/valentines2025event-zh-CN.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..13256da720cfbb0e57ed3c3fb3d60eaa075126c8 100644 GIT binary patch literal 24584 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 KGb=H5js8Dn0t&VO literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T From d629bf12ab584162113db9c3e0ca2ded061de889 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 13 Feb 2025 16:20:13 -0500 Subject: [PATCH 028/171] [Misc][Balance] Organizing Evil Teams (#5303) * Organized all evil teams * Improved Giovanni and other Evil Team Leaders * Experienced endless pain --- src/data/trainer-config.ts | 259 +++++++++++++++++++++++-------------- 1 file changed, 162 insertions(+), 97 deletions(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 016a2c9bca6..564518845dc 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -581,107 +581,107 @@ export class TrainerConfig { switch (team) { case "rocket": { return { - [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], - [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], - [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ Species.RATICATE, Species.ARBOK, Species.VILEPLUME, Species.ARCANINE, Species.GENGAR, Species.HYPNO, Species.ELECTRODE, Species.EXEGGUTOR, Species.CUBONE, Species.KOFFING, Species.GYARADOS, Species.CROBAT, Species.STEELIX, Species.HOUNDOOM, Species.HONCHKROW ], + [TrainerPoolTier.UNCOMMON]: [ Species.OMASTAR, Species.KABUTOPS, Species.MAGNEZONE, Species.ELECTIVIRE, Species.MAGMORTAR, Species.PORYGON_Z, Species.ANNIHILAPE, Species.ALOLA_SANDSLASH, Species.ALOLA_PERSIAN, Species.ALOLA_GOLEM, Species.ALOLA_MUK, Species.PALDEA_TAUROS ], + [TrainerPoolTier.RARE]: [ Species.DRAGONITE, Species.TYRANITAR ] }; } case "magma": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.MAGCARGO, Species.HOUNDOOM, Species.TORKOAL, Species.SOLROCK, Species.CLAYDOL, Species.HIPPOWDON, Species.MAGMORTAR, Species.GLISCOR, Species.COALOSSAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.AGGRON, Species.FLYGON, Species.CRADILY, Species.ARMALDO, Species.RHYPERIOR, Species.TURTONATOR, Species.SANDACONDA, Species.TOEDSCRUEL, Species.HISUI_ARCANINE ], + [TrainerPoolTier.RARE]: [ Species.CHARCADET, Species.SCOVILLAIN ] }; } case "aqua": { return { - [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], - [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.TENTACRUEL, Species.LANTURN, Species.AZUMARILL, Species.QUAGSIRE, Species.OCTILLERY, Species.LUDICOLO, Species.PELIPPER, Species.WAILORD, Species.WHISCASH, Species.CRAWDAUNT, Species.WALREIN, Species.CLAMPERL ], + [TrainerPoolTier.UNCOMMON]: [ Species.QUAGSIRE, Species.MANTINE, Species.KINGDRA, Species.MILOTIC, Species.DRAGALGE, Species.DHELMISE, Species.BARRASKEWDA, Species.GRAPPLOCT, Species.OVERQWIL ], + [TrainerPoolTier.RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }; } case "galactic": { return { - [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], - [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], - [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.ELECTRODE, Species.GYARADOS, Species.CROBAT, Species.HONCHKROW, Species.BRONZONG, Species.DRAPION, Species.LICKILICKY, Species.TANGROWTH, Species.ELECTIVIRE, Species.MAGMORTAR, Species.YANMEGA, Species.MAMOSWINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ALAKAZAM, Species.WEAVILE, Species.GLISCOR, Species.DUSKNOIR, Species.ROTOM, Species.OVERQWIL, Species.HISUI_ARCANINE, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT ] }; } case "plasma": { return { - [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], - [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ Species.GIGALITH, Species.CONKELDURR, Species.SEISMITOAD, Species.KROOKODILE, Species.DARMANITAN, Species.COFAGRIGUS, Species.VANILLUXE, Species.AMOONGUSS, Species.JELLICENT, Species.GALVANTULA, Species.FERROTHORN, Species.BEARTIC ], + [TrainerPoolTier.UNCOMMON]: [ Species.EXCADRILL, Species.SIGILYPH, Species.ZOROARK, Species.KLINKLANG, Species.EELEKTROSS, Species.MIENSHAO, Species.GOLURK, Species.BISHARP, Species.MANDIBUZZ, Species.DURANT, Species.GALAR_DARMANITAN ], + [TrainerPoolTier.RARE]: [ Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY ] }; } case "plasma_2": { return { - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.VOLTORB, Species.PORYGON, Species.BRONZOR, Species.MUNNA, Species.SOLOSIS, Species.JOLTIK, Species.FERROSEED, Species.TYNAMO, Species.ELGYEM ], - [TrainerPoolTier.UNCOMMON]: [ Species.BELDUM, Species.ROTOM, Species.TIRTOUGA, Species.ARCHEN, Species.GOLETT, Species.DURANT, Species.GRUBBIN, Species.BLIPBUG, Species.VAROOM, Species.ALOLA_GRIMER, Species.HISUI_VOLTORB ], - [TrainerPoolTier.RARE]: [ Species.ELEKID, Species.MAGBY, Species.PAWNIARD, Species.DURALUDON ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.ELECTRODE, Species.BRONZONG, Species.MAGNEZONE, Species.PORYGON_Z, Species.MUSHARNA, Species.REUNICLUS, Species.GALVANTULA, Species.FERROTHORN, Species.EELEKTROSS, Species.BEHEEYEM ], + [TrainerPoolTier.UNCOMMON]: [ Species.METAGROSS, Species.ROTOM, Species.CARRACOSTA, Species.ARCHEOPS, Species.GOLURK, Species.DURANT, Species.VIKAVOLT, Species.ORBEETLE, Species.REVAVROOM, Species.ALOLA_MUK, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON ] }; } case "flare": { return { - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], - [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] + [TrainerPoolTier.COMMON]: [ Species.MANECTRIC, Species.DRAPION, Species.LIEPARD, Species.AMOONGUSS, Species.DIGGERSBY, Species.TALONFLAME, Species.PYROAR, Species.PANGORO, Species.MEOWSTIC, Species.MALAMAR, Species.CLAWITZER, Species.HELIOLISK ], + [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOOM, Species.WEAVILE, Species.CHANDELURE, Species.AEGISLASH, Species.BARBARACLE, Species.DRAGALGE, Species.GOODRA, Species.TREVENANT, Species.GOURGEIST ], + [TrainerPoolTier.RARE]: [ Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG ] }; } case "aether": { return { - [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], - [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.ALAKAZAM, Species.SLOWBRO, Species.EXEGGUTOR, Species.XATU, Species.CLAYDOL, Species.BEHEEYEM, Species.ORANGURU, Species.BRUXISH, Species.ORBEETLE, Species.FARIGIRAF, Species.ALOLA_RAICHU ], + [TrainerPoolTier.UNCOMMON]: [ Species.KIRLIA, Species.MEDICHAM, Species.METAGROSS, Species.MALAMAR, Species.HATTERENE, Species.MR_RIME, Species.GALAR_SLOWKING ], + [TrainerPoolTier.RARE]: [ Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY ] }; } case "skull": { return { - [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], - [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.NIDOQUEEN, Species.GENGAR, Species.KOFFING, Species.CROBAT, Species.ROSERADE, Species.SKUNTANK, Species.TOXICROAK, Species.SCOLIPEDE, Species.TOXAPEX, Species.LURANTIS, Species.ALOLA_MUK ], + [TrainerPoolTier.UNCOMMON]: [ Species.DRAPION, Species.MANDIBUZZ, Species.OVERQWIL, Species.GLIMMORA, Species.CLODSIRE, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.DRAGALGE, Species.SNEASLER ] }; } case "macro": { return { - [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], - [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], - [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ Species.NINETALES, Species.BELLOSSOM, Species.MILOTIC, Species.FROSLASS, Species.GOTHITELLE, Species.JELLICENT, Species.SALAZZLE, Species.TSAREENA, Species.POLTEAGEIST, Species.HATTERENE, Species.GALAR_RAPIDASH ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.MANDIBUZZ, Species.TOXAPEX, Species.APPLETUN, Species.CURSOLA, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.TINKATON, Species.HISUI_LILLIGANT ] }; } case "star_1": { return { - [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] + [TrainerPoolTier.COMMON]: [ Species.SHIFTRY, Species.CACTURNE, Species.HONCHKROW, Species.SKUNTANK, Species.KROOKODILE, Species.OBSTAGOON, Species.LOKIX, Species.MABOSSTIFF ], + [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.CRAWDAUNT, Species.WEAVILE, Species.ZOROARK, Species.MALAMAR, Species.BOMBIRDIER ], + [TrainerPoolTier.RARE]: [ Species.HYDREIGON, Species.MEOWSCARADA ] }; } case "star_2": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], - [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.HOUNDOOM, Species.CAMERUPT, Species.CHANDELURE, Species.TALONFLAME, Species.PYROAR, Species.COALOSSAL, Species.SCOVILLAIN ], + [TrainerPoolTier.UNCOMMON]: [ Species.RAPIDASH, Species.FLAREON, Species.TORKOAL, Species.MAGMORTAR, Species.SALAZZLE, Species.TURTONATOR ], + [TrainerPoolTier.RARE]: [ Species.VOLCARONA, Species.SKELEDIRGE ] }; } case "star_3": { return { - [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.CROBAT, Species.SKUNTANK, Species.AMOONGUSS, Species.TOXAPEX, Species.TOXTRICITY, Species.GRAFAIAI, Species.CLODSIRE ], + [TrainerPoolTier.UNCOMMON]: [ Species.GENGAR, Species.SEVIPER, Species.DRAGALGE, Species.OVERQWIL, Species.ALOLA_MUK, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.GLIMMORA, Species.VENUSAUR ] }; } case "star_4": { return { - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], - [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [ Species.CLEFABLE, Species.WIGGLYTUFF, Species.AZUMARILL, Species.WHIMSICOTT, Species.FLORGES, Species.HATTERENE, Species.GRIMMSNARL, Species.TINKATON ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.GALAR_RAPIDASH, Species.PRIMARINA ] }; } case "star_5": { return { - [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] + [TrainerPoolTier.COMMON]: [ Species.BRELOOM, Species.HARIYAMA, Species.MEDICHAM, Species.TOXICROAK, Species.SCRAFTY, Species.MIENSHAO, Species.PAWMOT, Species.PALDEA_TAUROS ], + [TrainerPoolTier.UNCOMMON]: [ Species.LUCARIO, Species.CONKELDURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], + [TrainerPoolTier.RARE]: [ Species.KOMMO_O, Species.QUAQUAVAL ] }; } } @@ -1500,9 +1500,9 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE ], - [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE ], - [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO ], + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.ODDISH, Species.GEODUDE, Species.SLOWPOKE, Species.GRIMER, Species.KOFFING ], + [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.GROWLITHE, Species.MAGNEMITE, Species.GASTLY, Species.VOLTORB, Species.EXEGGCUTE, Species.CUBONE, Species.LICKITUNG, Species.SCYTHER, Species.TAUROS, Species.GYARADOS, Species.MURKROW, Species.ELEKID, Species.MAGBY ], + [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.OMANYTE, Species.KABUTO, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GEODUDE, Species.ALOLA_GRIMER, Species.PALDEA_TAUROS ], [TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ] }), [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -1511,71 +1511,71 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY ], - [TrainerPoolTier.UNCOMMON]: [ Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR ], - [TrainerPoolTier.RARE]: [ Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.DIGLETT, Species.GROWLITHE, Species.SLUGMA, Species.MAGBY, Species.POOCHYENA, Species.ZIGZAGOON, Species.NUMEL, Species.TORKOAL, Species.BALTOY ], + [TrainerPoolTier.UNCOMMON]: [ Species.RHYHORN, Species.GLIGAR, Species.PHANPY, Species.SOLROCK, Species.HIPPOPOTAS, Species.HEATMOR, Species.ROLYCOLY, Species.SILICOBRA ], + [TrainerPoolTier.RARE]: [ Species.ARON, Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.TURTONATOR, Species.TOEDSCOOL, Species.HISUI_GROWLITHE ], + [TrainerPoolTier.SUPER_RARE]: [ Species.CHARCADET, Species.CAPSAKID ] }), [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA ], - [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.QWILFISH, Species.REMORAID, Species.ZIGZAGOON, Species.LOTAD, Species.CARVANHA, Species.WAILMER, Species.BARBOACH, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.TENTACOOL, Species.HORSEA, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.AZURILL, Species.CLAMPERL, Species.CLOBBOPUS ], + [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.SKRELP, Species.DHELMISE, Species.ARROKUDA, Species.HISUI_QWILFISH, Species.PALDEA_WOOPER ], + [TrainerPoolTier.SUPER_RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }), [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB ], - [TrainerPoolTier.RARE]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.WURMPLE, Species.SHINX, Species.BURMY, Species.DRIFLOON, Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CROAGUNK, Species.CARNIVINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.YANMA, Species.GLIGAR, Species.SWINUB, Species.SKORUPI ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL, Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH ], + [TrainerPoolTier.SUPER_RARE]: [ Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL ] }), [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK ], - [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO ] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.WOOBAT, Species.TYMPOLE, Species.SANDILE, Species.SCRAGGY, Species.TRUBBISH, Species.VANILLITE ], + [TrainerPoolTier.UNCOMMON]: [ Species.TIMBURR, Species.VENIPEDE, Species.DARUMAKA, Species.FOONGUS, Species.FRILLISH, Species.JOLTIK, Species.KLINK, Species.CUBCHOO, Species.GOLETT ], + [TrainerPoolTier.RARE]: [ Species.DRILBUR, Species.ZORUA, Species.MIENFOO, Species.PAWNIARD, Species.BOUFFALANT, Species.RUFFLET, Species.VULLABY, Species.DURANT ], + [TrainerPoolTier.SUPER_RARE]: [ Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA ] }), [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COLRESS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_boss", "plasma_2", [ Species.KLINKLANG ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_colress").setMixedBattleBgm("battle_colress").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP, Species.FOONGUS ], - [TrainerPoolTier.RARE]: [ Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO ], + [TrainerPoolTier.COMMON]: [ Species.PONYTA, Species.HOUNDOUR, Species.SKORUPI, Species.CROAGUNK, Species.SCRAGGY, Species.FLETCHLING, Species.SCATTERBUG, Species.LITLEO, Species.ESPURR, Species.INKAY ], + [TrainerPoolTier.UNCOMMON]: [ Species.POOCHYENA, Species.ELECTRIKE, Species.PURRLOIN, Species.FOONGUS, Species.PANCHAM, Species.BINACLE, Species.SKRELP, Species.CLAUNCHER, Species.HELIOPTILE, Species.PHANTUMP, Species.PUMPKABOO ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO ], [TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ] }), [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.JANGMO_O, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.CORSOLA, Species.LILLIPUP, Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF, Species.MORELULL, Species.BOUNSWEET, Species.COMFEY, Species.KOMALA, Species.TOGEDEMARU, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.ALOLA_EXEGGUTOR ], + [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.CRABRAWLER, Species.ORICORIO, Species.CUTIEFLY, Species.WISHIWASHI, Species.MUDBRAY, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.PYUKUMUKU, Species.MINIOR, Species.BRUXISH, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.MAGNEMITE, Species.TURTONATOR, Species.MIMIKYU, Species.DRAMPA, Species.GALAR_CORSOLA ], + [TrainerPoolTier.SUPER_RARE]: [ Species.PORYGON, Species.JANGMO_O ] }), [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY ], - [TrainerPoolTier.RARE]: [ Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE ], + [TrainerPoolTier.COMMON]: [ Species.EKANS, Species.DROWZEE, Species.KOFFING, Species.SPINARAK, Species.SCRAGGY, Species.TRUBBISH, Species.MAREANIE, Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.GASTLY, Species.HOUNDOUR, Species.SABLEYE, Species.VENIPEDE, Species.SANDILE, Species.VULLABY, Species.PANCHAM, Species.FOMANTIS, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.WISHIWASHI, Species.SANDYGAST, Species.MIMIKYU, Species.DHELMISE, Species.NYMBLE ], [TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ] }), [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED ], - [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU ], - [TrainerPoolTier.RARE]: [ Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA ], + [TrainerPoolTier.COMMON]: [ Species.STEELIX, Species.MAWILE, Species.FERROSEED, Species.KLINK, Species.SKWOVET, Species.ROOKIDEE, Species.CRAMORANT, Species.CUFANT, Species.GALAR_MEOWTH, Species.GALAR_ZIGZAGOON ], + [TrainerPoolTier.UNCOMMON]: [ Species.MAGNEMITE, Species.RIOLU, Species.DRILBUR, Species.APPLIN, Species.ARROKUDA, Species.SINISTEA, Species.HATENNA, Species.GALAR_PONYTA, Species.GALAR_YAMASK ], + [TrainerPoolTier.RARE]: [ Species.SCIZOR, Species.BELDUM, Species.HONEDGE, Species.FALINKS, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA ], [TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ] }), [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -2225,7 +2225,11 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOQUEEN, Species.NIDOKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2234,20 +2238,32 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })), [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.IRON_THORNS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { if (p.species.speciesId === Species.GASTRODON) { p.abilityIndex = 0; // Storm Drain } else if (p.species.speciesId === Species.SEISMITOAD) { p.abilityIndex = 2; // Water Absorb } })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.GARCHOMP) { + p.abilityIndex = 2; // Rough Skin + } else if (p.species.speciesId === Species.EXCADRILL) { + p.abilityIndex = 0; // Sand Rush + } + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2295,7 +2311,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2384,7 +2403,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -2425,7 +2447,10 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 0; })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2448,7 +2473,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Sharpness @@ -2467,7 +2499,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.HISUI_GOODRA ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.IRON_VALIANT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2477,7 +2516,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyardos + p.formIndex = 1; // Mega Gyarados p.generateName(); p.gender = Gender.MALE; })) @@ -2597,11 +2636,26 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })), [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ])) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2614,13 +2668,21 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOZOLT, Species.DRACOVISH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2666,7 +2728,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form p.generateAndPopulateMoveset(); From 6acd15970e10e31fa03b5e35400fe498c765d487 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:20:54 -0600 Subject: [PATCH 029/171] [Ability][Bug] Remove partial designation from Quark Drive and Protosynthesis #5315 --- src/data/ability.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 347054d2447..e5b674d4fb4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6285,15 +6285,13 @@ export function initAbilities() { .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.QUARK_DRIVE, 9) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), PostSummonAddBattlerTagAbAttr, BattlerTagType.QUARK_DRIVE, 0, true) .attr(PostTerrainChangeAddBattlerTagAttr, BattlerTagType.QUARK_DRIVE, 0, TerrainType.ELECTRIC) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.GOOD_AS_GOLD, 9) .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS && ![ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES, MoveTarget.USER_SIDE ].includes(move.moveTarget)) .ignorable(), From dcd1636338ae025f9a593bbec6cc8ec8bde38c69 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:28:59 -0600 Subject: [PATCH 030/171] [i18n] Update locales submodule (#5318) --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index f46dcdb423c..f917baa1bb2 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit f46dcdb423c24137a25d9f6078cc6be68502801a +Subproject commit f917baa1bb2fc5071587b7894ce7b4898cc64f36 From 3fd5414f5cc2182b6b5521d80e357c5da2b525ff Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:37:54 -0600 Subject: [PATCH 031/171] [Misc] Increment version number (#5317) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4398037822a..270b72afda8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.5.4", + "version": "1.6.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 94d580a3ec9..3861d5fb4ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.5.4", + "version": "1.6.0", "type": "module", "scripts": { "start": "vite", From 5ad8f189501a0afea2cc458eeacecaadae5c192c Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 02:13:28 +0100 Subject: [PATCH 032/171] getFullUnlockedData now properly accounts for forms --- src/data/pokemon-species.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 5883bac3fc8..8473f7788e3 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1051,7 +1051,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali caughtAttr += DexAttr.VARIANT_2; caughtAttr += DexAttr.VARIANT_3; } - caughtAttr += DexAttr.DEFAULT_FORM; + + // Summing successive bigints for each obtainable form + caughtAttr += this.forms + .map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)) + .reduce((acc, val) => acc + val, 0n); return caughtAttr; } From 7611061378f61e21381719a33f21266f3e02774d Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 02:15:24 +0100 Subject: [PATCH 033/171] Updating version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 270b72afda8..1bf7649704b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 3861d5fb4ca..4e43b835189 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.0", + "version": "1.6.1", "type": "module", "scripts": { "start": "vite", From 8f498f1197df29673b25e2f9116589feae59065b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:03:14 +0100 Subject: [PATCH 034/171] Counting default form in caughtAttr for mons that don't have alternative forms --- src/data/pokemon-species.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 8473f7788e3..4349cee2cbf 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1053,9 +1053,9 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // Summing successive bigints for each obtainable form - caughtAttr += this.forms - .map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)) - .reduce((acc, val) => acc + val, 0n); + caughtAttr += this?.forms?.length > 1 ? + this.forms.map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)).reduce((acc, val) => acc + val, 0n) : + DexAttr.DEFAULT_FORM; return caughtAttr; } From d159901ea1464911af612cd950c0eb4c5b671b84 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:03:58 +0100 Subject: [PATCH 035/171] Updated version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1bf7649704b..b3ce2c3b415 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 4e43b835189..bbbb0f56f6b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.1", + "version": "1.6.2", "type": "module", "scripts": { "start": "vite", From 77fbcc70ef7c0c56c6b75f8e252ecd46c442e8f1 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 14 Feb 2025 18:40:13 +1100 Subject: [PATCH 036/171] [Bug][Hotfix] Fix fusion with dual type + monotype with shared primary type. (#5322) * Fix fusion with dual type + monotype with shared primary type. * Update version number * Add test case --- package-lock.json | 4 ++-- package.json | 2 +- src/field/pokemon.ts | 6 ++++++ src/test/field/pokemon.test.ts | 11 +++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3ce2c3b415..2ae45b1e2c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.2", + "version": "1.6.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.5.4", + "version": "1.6.3", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index bbbb0f56f6b..495815be15d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.2", + "version": "1.6.3", "type": "module", "scripts": { "start": "vite", diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 82674fb8b46..b1e48df5c61 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1322,6 +1322,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else if (fusionType1 !== types[0]) { secondType = fusionType1; } + + + if (secondType === Type.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type + secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) + ? this.customPokemonData.types[1] : (speciesForm.type2 ?? Type.UNKNOWN); + } } else { // If not a fusion, just get the second type from the species, checking for permanent changes from ME secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts index 0a1ddac9e90..0c282b44f49 100644 --- a/src/test/field/pokemon.test.ts +++ b/src/test/field/pokemon.test.ts @@ -150,6 +150,17 @@ describe("Spec - Pokemon", () => { expect(types[1]).toBe(Type.DARK); }); + it("Fusing mons with two and one types", async () => { + game.override.starterSpecies(Species.NUMEL); + game.override.starterFusionSpecies(Species.CHARMANDER); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(Type.FIRE); + expect(types[1]).toBe(Type.GROUND); + }); + it("Fusing two mons with two types", async () => { game.override.starterSpecies(Species.NATU); game.override.starterFusionSpecies(Species.HOUNDOUR); From 7b9d1d6570a9560909acad59a8b47c263eb1d7ad Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 14 Feb 2025 21:51:41 -0500 Subject: [PATCH 037/171] [Hotfix] Fix crash involving female Pyroar fusions with exp sprites (#5331) * Fix crash involving female Pyroar fusions with exp sprites * Update locales submodule --- package-lock.json | 4 +-- package.json | 2 +- public/images/pokemon/668-female.json | 41 -------------------------- public/images/pokemon/668-female.png | Bin 898 -> 0 bytes public/locales | 2 +- src/field/pokemon.ts | 9 ++++-- 6 files changed, 11 insertions(+), 47 deletions(-) delete mode 100644 public/images/pokemon/668-female.json delete mode 100644 public/images/pokemon/668-female.png diff --git a/package-lock.json b/package-lock.json index 2ae45b1e2c2..ce1feb7db41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.3", + "version": "1.6.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.6.3", + "version": "1.6.4", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 495815be15d..c9b5798af76 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.3", + "version": "1.6.4", "type": "module", "scripts": { "start": "vite", diff --git a/public/images/pokemon/668-female.json b/public/images/pokemon/668-female.json deleted file mode 100644 index 13d67c90194..00000000000 --- a/public/images/pokemon/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f88e039152d4a967a218cb721938610:e6991ce9c3bad348cbc05ebf9b440302:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/668-female.png b/public/images/pokemon/668-female.png deleted file mode 100644 index c8f4e205491a3c9298afb167fad34989f8374085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmV-|1AY97P)9ipC~f?H~&!QiD!hish$88UPV zX(u5MN3Tnl78^R0QcSc72YT@Sk_7y}^xnye&XO&Ec#yfDzW0!f$u4>Rk(|gR-)KI>MZL8`JY?jNP&BPpk z6|3KFQ6lfn-Xc{mT6Lf2H;>h)Axik%pjItc)tU~_I*I3uq1tV~#v*s8`={!Q&I&?M zEt~!CDA|j+TdhG$g9vL!E*a^euWJRRMZ~jg`J-=0@=t+I%akdP8K*>eQUBYPZAT?F7FrJ>ozcaRU5 zxHTzg-8A_bJ&aN_4fI8G8h0oG=;o!VGS})bQdotb6mO_W5BVh`EjEaFjJ^68!pF@y zKNr|r^idL66vPgq{YMaac5iN$<`D}J=>Z}Z6{ct!1w6o=b}OCL4pIuFMFEdl+^sYR z+98=pSuV1y;Cw~{1+qn`+l0J9bs9_RNhuf9PQ$q!iV|7s*{n8=1qqF6k#^>JMOf;& zYLMrk8KPFnA^@cd9}x*V^st8{KK6IMJ@!Ts9iW;x2@fGMA0TB>K^!zYh?0GDriQ5Y z8x%IkUQq`n7I8dvkr(!m{cmaZMzm80P=bitw=s+_cc?Jepa4b?W7MDxsDmhxQna^w zC5S`gxPlIm0H+S(D*z79$it~aR6+?BIT<1;G`{iCFewBmM58JZ8*DnI@Qs{Qj2#F6 Y0boY}eU9#KL;wH)07*qoM6N<$f?NrLjQ{`u diff --git a/public/locales b/public/locales index f917baa1bb2..58dda14ee83 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit f917baa1bb2fc5071587b7894ce7b4898cc64f36 +Subproject commit 58dda14ee834204c4bd5ece47694a3c068df4b0e diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index b1e48df5c61..5c6fbb34aea 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4042,6 +4042,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + if (fusionPixelColors.length === 0) { // ERROR HANDLING IS NOT OPTIONAL BUDDY + console.log("Failed to create fusion palette"); + return; + } + let paletteColors: Map; let fusionPaletteColors: Map; @@ -4055,8 +4060,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Math.random = originalRandom; - paletteColors = paletteColors!; // tell TS compiler that paletteColors is defined! - fusionPaletteColors = fusionPaletteColors!; // TS compiler that fusionPaletteColors is defined! + paletteColors = paletteColors!; // erroneously tell TS compiler that paletteColors is defined! + fusionPaletteColors = fusionPaletteColors!; // mischievously misinform TS compiler that fusionPaletteColors is defined! const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] .map(paletteColors => { let keys = Array.from(paletteColors.keys()).sort((a: number, b: number) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); From 8555ef7cb78ae7b0ef2dcc19dcbca694070fecc0 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Sat, 15 Feb 2025 05:51:28 +0100 Subject: [PATCH 038/171] [QOL] Make the name and formName readable for bigger sprites in pokedex (#5328) * Make the name, formName and type readable (bring it infront of larger sprites that would block it) * Dont to type Icons otherwise they will overlay on the "want to go back" text * Update src/ui/pokedex-ui-handler.ts --- src/ui/pokedex-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 940223528fb..9b54266b3ca 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -537,6 +537,8 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterSelectContainer.bringToTop(this.filterBarContainer); this.initTutorialOverlay(this.starterSelectContainer); this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + this.starterSelectContainer.bringToTop(this.pokemonNameText); + this.starterSelectContainer.bringToTop(this.pokemonFormText); } show(args: any[]): boolean { From 4d5f9cecf102d429513d78f0f5208fc981e5982b Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 15 Feb 2025 20:32:07 -0600 Subject: [PATCH 039/171] Fix Zenith Marshadow missing a party icon (#5301) --- public/images/pokemon/icons/7/802-zenith.png | Bin 0 -> 396 bytes public/images/pokemon/icons/7/802s-zenith.png | Bin 0 -> 396 bytes public/images/pokemon_icons_7.json | 5950 +++++++++-------- public/images/pokemon_icons_7.png | Bin 51140 -> 51451 bytes 4 files changed, 2996 insertions(+), 2954 deletions(-) create mode 100644 public/images/pokemon/icons/7/802-zenith.png create mode 100644 public/images/pokemon/icons/7/802s-zenith.png diff --git a/public/images/pokemon/icons/7/802-zenith.png b/public/images/pokemon/icons/7/802-zenith.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0fee2d6096fd8d6e0c6135bfd47d71a6eff0c2 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`r2~9ITpb)7zJFKQx7;Cn{oI6vhz}n$E+jZKG!y{k^Jd4`11ZjuAiv=M zP{0uEUm*k%EbxddW?P6+uW^joTG!tv6?>RECv37kFe-<*}cAQ)W! fU~OE}+FFK`J#t5WE3bV6^e}^`tDnm{r-UW|T_T?L literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/7/802s-zenith.png b/public/images/pokemon/icons/7/802s-zenith.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0fee2d6096fd8d6e0c6135bfd47d71a6eff0c2 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`r2~9ITpb)7zJFKQx7;Cn{oI6vhz}n$E+jZKG!y{k^Jd4`11ZjuAiv=M zP{0uEUm*k%EbxddW?P6+uW^joTG!tv6?>RECv37kFe-<*}cAQ)W! fU~OE}+FFK`J#t5WE3bV6^e}^`tDnm{r-UW|T_T?L literal 0 HcmV?d00001 diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index 0523a232d79..03eeba88a70 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5,7 +5,7 @@ "format": "RGBA8888", "size": { "w": 502, - "h": 323 + "h": 325 }, "scale": 1, "frames": [ @@ -324,48 +324,6 @@ "h": 29 } }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 293, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 28, - "y": 293, - "w": 28, - "h": 30 - } - }, { "filename": "798s", "rotated": false, @@ -381,8 +339,8 @@ "h": 29 }, "frame": { - "x": 112, - "y": 0, + "x": 0, + "y": 293, "w": 31, "h": 29 } @@ -402,7 +360,7 @@ "h": 28 }, "frame": { - "x": 143, + "x": 112, "y": 0, "w": 30, "h": 28 @@ -423,8 +381,8 @@ "h": 28 }, "frame": { - "x": 173, - "y": 0, + "x": 108, + "y": 28, "w": 30, "h": 28 } @@ -444,7 +402,7 @@ "h": 28 }, "frame": { - "x": 203, + "x": 142, "y": 0, "w": 29, "h": 28 @@ -465,8 +423,8 @@ "h": 28 }, "frame": { - "x": 232, - "y": 0, + "x": 138, + "y": 28, "w": 29, "h": 28 } @@ -486,7 +444,7 @@ "h": 27 }, "frame": { - "x": 261, + "x": 171, "y": 0, "w": 29, "h": 27 @@ -507,7 +465,7 @@ "h": 27 }, "frame": { - "x": 290, + "x": 200, "y": 0, "w": 29, "h": 27 @@ -528,7 +486,7 @@ "h": 27 }, "frame": { - "x": 319, + "x": 229, "y": 0, "w": 28, "h": 27 @@ -549,7 +507,7 @@ "h": 27 }, "frame": { - "x": 347, + "x": 257, "y": 0, "w": 28, "h": 27 @@ -570,7 +528,7 @@ "h": 23 }, "frame": { - "x": 375, + "x": 285, "y": 0, "w": 32, "h": 23 @@ -591,14 +549,14 @@ "h": 23 }, "frame": { - "x": 407, + "x": 317, "y": 0, "w": 32, "h": 23 } }, { - "filename": "800", + "filename": "795", "rotated": false, "trimmed": true, "sourceSize": { @@ -619,7 +577,7 @@ } }, { - "filename": "800s", + "filename": "795s", "rotated": false, "trimmed": true, "sourceSize": { @@ -639,6 +597,48 @@ "h": 30 } }, + { + "filename": "800", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 145, + "w": 28, + "h": 30 + } + }, + { + "filename": "800s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 175, + "w": 28, + "h": 30 + } + }, { "filename": "805", "rotated": false, @@ -654,8 +654,8 @@ "h": 30 }, "frame": { - "x": 32, - "y": 145, + "x": 31, + "y": 205, "w": 28, "h": 30 } @@ -674,31 +674,10 @@ "w": 28, "h": 30 }, - "frame": { - "x": 32, - "y": 175, - "w": 28, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, "frame": { "x": 31, - "y": 205, - "w": 26, + "y": 235, + "w": 28, "h": 30 } }, @@ -718,32 +697,11 @@ }, "frame": { "x": 31, - "y": 235, + "y": 265, "w": 26, "h": 30 } }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 31, - "y": 265, - "w": 28, - "h": 28 - } - }, { "filename": "773-dark", "rotated": false, @@ -759,8 +717,8 @@ "h": 30 }, "frame": { - "x": 56, - "y": 293, + "x": 31, + "y": 295, "w": 26, "h": 30 } @@ -780,7 +738,7 @@ "h": 25 }, "frame": { - "x": 439, + "x": 349, "y": 0, "w": 30, "h": 25 @@ -801,12 +759,75 @@ "h": 25 }, "frame": { - "x": 469, + "x": 379, "y": 0, "w": 30, "h": 25 } }, + { + "filename": "785", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 409, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "785s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 437, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 465, + "y": 0, + "w": 28, + "h": 28 + } + }, { "filename": "792s", "rotated": false, @@ -822,8 +843,8 @@ "h": 28 }, "frame": { - "x": 108, - "y": 29, + "x": 70, + "y": 57, "w": 28, "h": 28 } @@ -843,8 +864,8 @@ "h": 30 }, "frame": { - "x": 70, - "y": 57, + "x": 62, + "y": 85, "w": 26, "h": 30 } @@ -864,8 +885,8 @@ "h": 30 }, "frame": { - "x": 96, - "y": 57, + "x": 62, + "y": 115, "w": 26, "h": 30 } @@ -885,8 +906,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 87, + "x": 60, + "y": 145, "w": 26, "h": 30 } @@ -906,8 +927,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 87, + "x": 60, + "y": 175, "w": 26, "h": 30 } @@ -927,8 +948,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 117, + "x": 59, + "y": 205, "w": 26, "h": 30 } @@ -948,8 +969,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 117, + "x": 59, + "y": 235, "w": 26, "h": 30 } @@ -969,8 +990,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 147, + "x": 57, + "y": 265, "w": 26, "h": 30 } @@ -990,12 +1011,54 @@ "h": 30 }, "frame": { - "x": 86, - "y": 147, + "x": 57, + "y": 295, "w": 26, "h": 30 } }, + { + "filename": "764", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 85, + "w": 25, + "h": 30 + } + }, + { + "filename": "764s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 115, + "w": 25, + "h": 30 + } + }, { "filename": "773-ground", "rotated": false, @@ -1011,8 +1074,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 177, + "x": 86, + "y": 145, "w": 26, "h": 30 } @@ -1033,7 +1096,7 @@ }, "frame": { "x": 86, - "y": 177, + "y": 175, "w": 26, "h": 30 } @@ -1053,8 +1116,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 207, + "x": 85, + "y": 205, "w": 26, "h": 30 } @@ -1074,54 +1137,12 @@ "h": 30 }, "frame": { - "x": 83, - "y": 207, + "x": 85, + "y": 235, "w": 26, "h": 30 } }, - { - "filename": "2026", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 57, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 59, - "y": 265, - "w": 25, - "h": 28 - } - }, { "filename": "773-rock", "rotated": false, @@ -1136,53 +1157,11 @@ "w": 26, "h": 30 }, - "frame": { - "x": 82, - "y": 293, - "w": 26, - "h": 30 - } - }, - { - "filename": "2026s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, "frame": { "x": 83, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 84, "y": 265, - "w": 25, - "h": 28 + "w": 26, + "h": 30 } }, { @@ -1200,14 +1179,14 @@ "h": 30 }, "frame": { - "x": 108, - "y": 293, + "x": 83, + "y": 295, "w": 26, "h": 30 } }, { - "filename": "764", + "filename": "772", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,16 +1194,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 0, + "x": 8, + "y": 2, "w": 25, - "h": 30 + "h": 28 }, "frame": { - "x": 122, + "x": 98, "y": 57, "w": 25, - "h": 30 + "h": 28 } }, { @@ -1242,14 +1221,14 @@ "h": 30 }, "frame": { - "x": 114, - "y": 87, + "x": 123, + "y": 56, "w": 26, "h": 30 } }, { - "filename": "773s", + "filename": "773", "rotated": false, "trimmed": true, "sourceSize": { @@ -1263,8 +1242,8 @@ "h": 30 }, "frame": { - "x": 114, - "y": 117, + "x": 149, + "y": 56, "w": 26, "h": 30 } @@ -1284,8 +1263,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 147, + "x": 113, + "y": 86, "w": 26, "h": 30 } @@ -1305,8 +1284,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 177, + "x": 139, + "y": 86, "w": 26, "h": 30 } @@ -1326,8 +1305,8 @@ "h": 30 }, "frame": { - "x": 109, - "y": 207, + "x": 113, + "y": 116, "w": 26, "h": 30 } @@ -1347,33 +1326,12 @@ "h": 30 }, "frame": { - "x": 109, - "y": 237, + "x": 139, + "y": 116, "w": 26, "h": 30 } }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 109, - "y": 267, - "w": 28, - "h": 26 - } - }, { "filename": "773s-fairy", "rotated": false, @@ -1389,33 +1347,12 @@ "h": 30 }, "frame": { - "x": 134, - "y": 293, + "x": 112, + "y": 146, "w": 26, "h": 30 } }, - { - "filename": "801", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 136, - "y": 29, - "w": 20, - "h": 28 - } - }, { "filename": "773s-fighting", "rotated": false, @@ -1431,8 +1368,8 @@ "h": 30 }, "frame": { - "x": 156, - "y": 28, + "x": 138, + "y": 146, "w": 26, "h": 30 } @@ -1452,8 +1389,8 @@ "h": 30 }, "frame": { - "x": 182, - "y": 28, + "x": 112, + "y": 176, "w": 26, "h": 30 } @@ -1473,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 208, - "y": 28, + "x": 138, + "y": 176, "w": 26, "h": 30 } @@ -1494,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 234, - "y": 28, + "x": 111, + "y": 206, "w": 26, "h": 30 } @@ -1515,8 +1452,8 @@ "h": 30 }, "frame": { - "x": 147, - "y": 58, + "x": 137, + "y": 206, "w": 26, "h": 30 } @@ -1536,8 +1473,8 @@ "h": 30 }, "frame": { - "x": 173, - "y": 58, + "x": 111, + "y": 236, "w": 26, "h": 30 } @@ -1557,8 +1494,8 @@ "h": 30 }, "frame": { - "x": 199, - "y": 58, + "x": 137, + "y": 236, "w": 26, "h": 30 } @@ -1578,12 +1515,33 @@ "h": 30 }, "frame": { - "x": 225, - "y": 58, + "x": 109, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 109, + "y": 296, + "w": 25, + "h": 29 + } + }, { "filename": "773s-psychic", "rotated": false, @@ -1599,12 +1557,54 @@ "h": 30 }, "frame": { - "x": 140, - "y": 88, + "x": 135, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 134, + "y": 296, + "w": 25, + "h": 29 + } + }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 159, + "y": 296, + "w": 18, + "h": 29 + } + }, { "filename": "773s-rock", "rotated": false, @@ -1620,12 +1620,54 @@ "h": 30 }, "frame": { - "x": 166, - "y": 88, + "x": 161, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "796s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 177, + "y": 296, + "w": 18, + "h": 29 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 25, + "h": 28 + } + }, { "filename": "773s-steel", "rotated": false, @@ -1642,7 +1684,7 @@ }, "frame": { "x": 192, - "y": 88, + "y": 27, "w": 26, "h": 30 } @@ -1663,13 +1705,13 @@ }, "frame": { "x": 218, - "y": 88, + "y": 27, "w": 26, "h": 30 } }, { - "filename": "764s", + "filename": "773s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,123 +1719,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 7, "y": 0, - "w": 25, + "w": 26, "h": 30 }, "frame": { - "x": 140, - "y": 118, - "w": 25, + "x": 244, + "y": 27, + "w": 26, "h": 30 } }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 165, - "y": 118, - "w": 28, - "h": 26 - } - }, - { - "filename": "2075", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 193, - "y": 118, - "w": 29, - "h": 24 - } - }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 148, - "w": 25, - "h": 29 - } - }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 177, - "w": 25, - "h": 29 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 118, - "w": 23, - "h": 24 - } - }, { "filename": "2103", "rotated": false, @@ -1809,12 +1746,75 @@ "h": 30 }, "frame": { - "x": 251, - "y": 58, + "x": 270, + "y": 27, "w": 21, "h": 30 } }, + { + "filename": "2026", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 291, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2026s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 317, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2075", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 343, + "y": 25, + "w": 29, + "h": 24 + } + }, { "filename": "2075s", "rotated": false, @@ -1830,180 +1830,12 @@ "h": 24 }, "frame": { - "x": 244, - "y": 88, + "x": 372, + "y": 25, "w": 29, "h": 24 } }, - { - "filename": "748", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 245, - "y": 112, - "w": 26, - "h": 25 - } - }, - { - "filename": "2103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, - "frame": { - "x": 260, - "y": 28, - "w": 21, - "h": 30 - } - }, - { - "filename": "748s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 281, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 307, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 333, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 359, - "y": 27, - "w": 19, - "h": 25 - } - }, - { - "filename": "745-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 378, - "y": 23, - "w": 25, - "h": 25 - } - }, - { - "filename": "745s-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 403, - "y": 23, - "w": 25, - "h": 25 - } - }, { "filename": "746-school", "rotated": false, @@ -2019,8 +1851,8 @@ "h": 22 }, "frame": { - "x": 428, - "y": 25, + "x": 401, + "y": 26, "w": 28, "h": 22 } @@ -2040,14 +1872,14 @@ "h": 22 }, "frame": { - "x": 456, - "y": 25, + "x": 429, + "y": 26, "w": 28, "h": 22 } }, { - "filename": "796", + "filename": "760", "rotated": false, "trimmed": true, "sourceSize": { @@ -2055,20 +1887,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 13, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 484, - "y": 25, - "w": 18, - "h": 29 + "x": 175, + "y": 56, + "w": 17, + "h": 24 } }, { - "filename": "796s", + "filename": "748", "rotated": false, "trimmed": true, "sourceSize": { @@ -2076,16 +1908,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 7, + "y": 5, + "w": 26, + "h": 25 }, "frame": { - "x": 272, - "y": 58, - "w": 18, - "h": 29 + "x": 192, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "748s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 218, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "2089", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 244, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 270, + "y": 57, + "w": 25, + "h": 25 + } + }, + { + "filename": "2089s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 295, + "y": 51, + "w": 26, + "h": 25 + } + }, + { + "filename": "745s-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 321, + "y": 51, + "w": 25, + "h": 25 } }, { @@ -2103,8 +2040,8 @@ "h": 26 }, "frame": { - "x": 290, - "y": 52, + "x": 346, + "y": 49, "w": 24, "h": 26 } @@ -2124,159 +2061,12 @@ "h": 26 }, "frame": { - "x": 314, - "y": 52, + "x": 370, + "y": 49, "w": 24, "h": 26 } }, - { - "filename": "750", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 338, - "y": 52, - "w": 25, - "h": 24 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 273, - "y": 87, - "w": 19, - "h": 25 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 271, - "y": 112, - "w": 23, - "h": 26 - } - }, - { - "filename": "750s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 292, - "y": 78, - "w": 25, - "h": 24 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 317, - "y": 78, - "w": 23, - "h": 24 - } - }, - { - "filename": "776s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 340, - "y": 76, - "w": 23, - "h": 26 - } - }, - { - "filename": "801-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 363, - "y": 52, - "w": 20, - "h": 28 - } - }, { "filename": "765", "rotated": false, @@ -2292,14 +2082,56 @@ "h": 21 }, "frame": { - "x": 383, - "y": 48, + "x": 457, + "y": 28, "w": 28, "h": 21 } }, { - "filename": "727", + "filename": "760s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 485, + "y": 28, + "w": 17, + "h": 24 + } + }, + { + "filename": "2103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 21, + "h": 30 + }, + "frame": { + "x": 165, + "y": 86, + "w": 21, + "h": 30 + } + }, + { + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -2308,14 +2140,56 @@ }, "spriteSourceSize": { "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 165, + "y": 116, + "w": 21, + "h": 27 + } + }, + { + "filename": "750", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 4, - "w": 23, + "w": 25, "h": 24 }, "frame": { - "x": 363, - "y": 80, - "w": 23, + "x": 186, + "y": 82, + "w": 25, + "h": 24 + } + }, + { + "filename": "750s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 211, + "y": 82, + "w": 25, "h": 24 } }, @@ -2334,159 +2208,12 @@ "h": 21 }, "frame": { - "x": 294, - "y": 102, + "x": 186, + "y": 106, "w": 28, "h": 21 } }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 322, - "y": 102, - "w": 25, - "h": 21 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 294, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 321, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "723", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 411, - "y": 48, - "w": 17, - "h": 22 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 428, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "745s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 453, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 54, - "w": 24, - "h": 23 - } - }, { "filename": "2028", "rotated": false, @@ -2502,8 +2229,8 @@ "h": 24 }, "frame": { - "x": 386, - "y": 69, + "x": 236, + "y": 82, "w": 25, "h": 24 } @@ -2523,56 +2250,14 @@ "h": 24 }, "frame": { - "x": 411, - "y": 70, + "x": 261, + "y": 82, "w": 25, "h": 24 } }, { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 436, - "y": 70, - "w": 23, - "h": 24 - } - }, - { - "filename": "781", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 70, - "w": 19, - "h": 25 - } - }, - { - "filename": "768s", + "filename": "725", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,15 +2266,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 24, - "h": 23 + "y": 7, + "w": 25, + "h": 21 }, "frame": { - "x": 478, - "y": 77, - "w": 24, - "h": 23 + "x": 214, + "y": 106, + "w": 25, + "h": 21 } }, { @@ -2607,14 +2292,14 @@ "h": 21 }, "frame": { - "x": 386, - "y": 93, + "x": 239, + "y": 106, "w": 25, "h": 21 } }, { - "filename": "2020", + "filename": "726", "rotated": false, "trimmed": true, "sourceSize": { @@ -2623,40 +2308,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 411, - "y": 94, - "w": 25, - "h": 22 - } - }, - { - "filename": "729", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, + "y": 4, "w": 23, "h": 24 }, "frame": { - "x": 436, - "y": 94, + "x": 264, + "y": 106, "w": 23, "h": 24 } }, { - "filename": "781s", + "filename": "780", "rotated": false, "trimmed": true, "sourceSize": { @@ -2664,62 +2328,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 95, - "w": 19, - "h": 25 - } - }, - { - "filename": "2105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 100, - "w": 24, - "h": 23 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, + "x": 7, + "y": 7, + "w": 27, "h": 19 }, "frame": { - "x": 347, - "y": 102, - "w": 16, + "x": 186, + "y": 127, + "w": 27, "h": 19 } }, { - "filename": "729s", + "filename": "780s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2727,184 +2349,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 363, - "y": 104, - "w": 23, - "h": 24 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 386, - "y": 114, - "w": 25, - "h": 16 - } - }, - { - "filename": "734s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 411, - "y": 116, - "w": 25, - "h": 16 - } - }, - { - "filename": "733", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 23, - "h": 21 + "w": 27, + "h": 19 }, "frame": { - "x": 436, - "y": 118, - "w": 23, - "h": 21 - } - }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 120, - "w": 19, - "h": 22 - } - }, - { - "filename": "2105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 123, - "w": 24, - "h": 23 - } - }, - { - "filename": "2050", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 348, - "y": 121, - "w": 15, - "h": 18 - } - }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 363, - "y": 128, - "w": 23, - "h": 21 - } - }, - { - "filename": "2020s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 386, - "y": 130, - "w": 25, - "h": 22 + "x": 213, + "y": 127, + "w": 27, + "h": 19 } }, { @@ -2922,14 +2376,14 @@ "h": 22 }, "frame": { - "x": 411, - "y": 132, + "x": 240, + "y": 127, "w": 24, "h": 22 } }, { - "filename": "758s", + "filename": "726s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,104 +2391,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 + "x": 8, + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 435, - "y": 139, - "w": 24, - "h": 22 + "x": 264, + "y": 130, + "w": 23, + "h": 24 } }, { - "filename": "732s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 142, - "w": 19, - "h": 22 - } - }, - { - "filename": "2053", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 478, - "y": 146, - "w": 24, - "h": 22 - } - }, - { - "filename": "801s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 207, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 235, - "w": 20, - "h": 28 - } - }, - { - "filename": "783", + "filename": "727", "rotated": false, "trimmed": true, "sourceSize": { @@ -3043,15 +2413,78 @@ }, "spriteSourceSize": { "x": 9, - "y": 3, - "w": 21, - "h": 27 + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 137, - "y": 263, - "w": 21, - "h": 27 + "x": 286, + "y": 82, + "w": 23, + "h": 24 + } + }, + { + "filename": "776", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 287, + "y": 106, + "w": 23, + "h": 26 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 287, + "y": 132, + "w": 23, + "h": 24 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 309, + "y": 76, + "w": 23, + "h": 26 } }, { @@ -3069,8 +2502,8 @@ "h": 27 }, "frame": { - "x": 155, - "y": 206, + "x": 310, + "y": 102, "w": 21, "h": 27 } @@ -3090,8 +2523,8 @@ "h": 26 }, "frame": { - "x": 155, - "y": 233, + "x": 310, + "y": 129, "w": 22, "h": 26 } @@ -3111,8 +2544,8 @@ "h": 26 }, "frame": { - "x": 158, - "y": 259, + "x": 332, + "y": 76, "w": 22, "h": 26 } @@ -3132,12 +2565,306 @@ "h": 26 }, "frame": { - "x": 160, - "y": 285, + "x": 331, + "y": 102, "w": 22, "h": 26 } }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 354, + "y": 75, + "w": 25, + "h": 23 + } + }, + { + "filename": "788s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 128, + "w": 22, + "h": 26 + } + }, + { + "filename": "724", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 379, + "y": 75, + "w": 19, + "h": 25 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 394, + "y": 49, + "w": 19, + "h": 25 + } + }, + { + "filename": "745s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 413, + "y": 48, + "w": 25, + "h": 23 + } + }, + { + "filename": "781", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 438, + "y": 48, + "w": 19, + "h": 25 + } + }, + { + "filename": "729", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 457, + "y": 49, + "w": 23, + "h": 24 + } + }, + { + "filename": "806", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 52, + "w": 22, + "h": 25 + } + }, + { + "filename": "801-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 398, + "y": 74, + "w": 20, + "h": 28 + } + }, + { + "filename": "801", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 418, + "y": 71, + "w": 20, + "h": 28 + } + }, + { + "filename": "803", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 438, + "y": 73, + "w": 23, + "h": 25 + } + }, + { + "filename": "781s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 461, + "y": 73, + "w": 19, + "h": 25 + } + }, + { + "filename": "806s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 77, + "w": 22, + "h": 25 + } + }, + { + "filename": "734", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 354, + "y": 98, + "w": 25, + "h": 16 + } + }, { "filename": "767", "rotated": false, @@ -3153,14 +2880,35 @@ "h": 14 }, "frame": { - "x": 245, - "y": 137, + "x": 353, + "y": 114, "w": 24, "h": 14 } }, { - "filename": "767s", + "filename": "803s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 354, + "y": 128, + "w": 23, + "h": 25 + } + }, + { + "filename": "732", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,15 +2917,603 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 24, - "h": 14 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 269, - "y": 138, + "x": 379, + "y": 100, + "w": 19, + "h": 22 + } + }, + { + "filename": "801s-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 377, + "y": 122, + "w": 20, + "h": 28 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 398, + "y": 102, + "w": 23, + "h": 24 + } + }, + { + "filename": "768", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 24, - "h": 14 + "h": 23 + }, + "frame": { + "x": 397, + "y": 126, + "w": 24, + "h": 23 + } + }, + { + "filename": "801s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 421, + "y": 99, + "w": 20, + "h": 28 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 441, + "y": 98, + "w": 24, + "h": 23 + } + }, + { + "filename": "735", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 421, + "y": 127, + "w": 20, + "h": 24 + } + }, + { + "filename": "770", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 441, + "y": 121, + "w": 23, + "h": 24 + } + }, + { + "filename": "2050", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 98, + "w": 15, + "h": 18 + } + }, + { + "filename": "756", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 102, + "w": 22, + "h": 24 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 116, + "w": 15, + "h": 18 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 126, + "w": 22, + "h": 24 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 134, + "w": 16, + "h": 19 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 150, + "w": 22, + "h": 24 + } + }, + { + "filename": "733", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 441, + "y": 145, + "w": 23, + "h": 21 + } + }, + { + "filename": "761s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 153, + "w": 16, + "h": 19 + } + }, + { + "filename": "745-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 165, + "y": 143, + "w": 21, + "h": 24 + } + }, + { + "filename": "2020", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 186, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "2020s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 211, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "802", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 164, + "y": 167, + "w": 22, + "h": 24 + } + }, + { + "filename": "2105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 186, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "2105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 210, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "734s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 164, + "y": 191, + "w": 25, + "h": 16 + } + }, + { + "filename": "770s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 207, + "w": 23, + "h": 24 + } + }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 231, + "w": 23, + "h": 24 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 189, + "y": 191, + "w": 24, + "h": 22 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 186, + "y": 213, + "w": 23, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 213, + "y": 191, + "w": 21, + "h": 24 + } + }, + { + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 215, + "w": 24, + "h": 22 } }, { @@ -3195,8 +3531,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 142, + "x": 186, + "y": 237, "w": 24, "h": 22 } @@ -3216,14 +3552,14 @@ "h": 22 }, "frame": { - "x": 317, - "y": 142, + "x": 210, + "y": 237, "w": 23, "h": 22 } }, { - "filename": "769s", + "filename": "802s-zenith", "rotated": false, "trimmed": true, "sourceSize": { @@ -3231,125 +3567,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 340, - "y": 142, - "w": 23, - "h": 22 - } - }, - { - "filename": "752", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 363, - "y": 149, - "w": 23, - "h": 18 - } - }, - { - "filename": "2074", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 386, - "y": 152, - "w": 24, - "h": 15 - } - }, - { - "filename": "2074s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 410, - "y": 154, - "w": 24, - "h": 15 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 434, - "y": 161, - "w": 23, - "h": 18 - } - }, - { - "filename": "745-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 13, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 457, - "y": 164, - "w": 21, + "x": 187, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "770", + "filename": "802s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,20 +3588,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 13, "y": 4, - "w": 23, + "w": 22, "h": 24 }, "frame": { - "x": 478, - "y": 168, - "w": 23, + "x": 209, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "722", + "filename": "746", "rotated": false, "trimmed": true, "sourceSize": { @@ -3379,19 +3610,40 @@ }, "spriteSourceSize": { "x": 12, - "y": 8, - "w": 17, - "h": 18 + "y": 11, + "w": 18, + "h": 13 }, "frame": { - "x": 163, - "y": 188, - "w": 17, - "h": 18 + "x": 187, + "y": 283, + "w": 18, + "h": 13 } }, { - "filename": "735", + "filename": "733s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 236, + "y": 149, + "w": 23, + "h": 21 + } + }, + { + "filename": "807", "rotated": false, "trimmed": true, "sourceSize": { @@ -3401,308 +3653,14 @@ "spriteSourceSize": { "x": 11, "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 163, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 165, - "y": 144, - "w": 23, - "h": 20 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, "w": 22, - "h": 26 + "h": 24 }, "frame": { - "x": 176, - "y": 206, + "x": 234, + "y": 170, "w": 22, - "h": 26 - } - }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 177, - "y": 232, - "w": 23, - "h": 25 - } - }, - { - "filename": "786", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 180, - "y": 257, - "w": 20, - "h": 25 - } - }, - { - "filename": "786s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 182, - "y": 282, - "w": 20, - "h": 25 - } - }, - { - "filename": "778-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 182, - "y": 307, - "w": 21, - "h": 16 - } - }, - { - "filename": "757", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 18 - }, - "frame": { - "x": 180, - "y": 188, - "w": 19, - "h": 18 - } - }, - { - "filename": "735s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, "h": 24 - }, - "frame": { - "x": 183, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "728", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 188, - "y": 144, - "w": 17, - "h": 20 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 205, - "y": 142, - "w": 23, - "h": 24 - } - }, - { - "filename": "760", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 228, - "y": 142, - "w": 17, - "h": 24 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 203, - "y": 166, - "w": 23, - "h": 25 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 226, - "y": 166, - "w": 22, - "h": 25 - } - }, - { - "filename": "789s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 199, - "y": 191, - "w": 23, - "h": 20 } }, { @@ -3720,14 +3678,14 @@ "h": 21 }, "frame": { - "x": 198, - "y": 211, + "x": 234, + "y": 194, "w": 22, "h": 21 } }, { - "filename": "806s", + "filename": "807s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,125 +3693,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 200, - "y": 232, - "w": 22, - "h": 25 - } - }, - { - "filename": "756", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 200, - "y": 257, - "w": 22, - "h": 24 - } - }, - { - "filename": "745s-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 11, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 202, - "y": 281, - "w": 21, - "h": 24 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 203, - "y": 305, - "w": 21, - "h": 18 - } - }, - { - "filename": "2051", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 191, - "w": 23, - "h": 24 - } - }, - { - "filename": "778s-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 220, + "x": 233, "y": 215, - "w": 21, - "h": 16 + "w": 22, + "h": 24 } }, { - "filename": "756s", + "filename": "738s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3862,19 +3715,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 5, + "y": 6, "w": 22, - "h": 24 + "h": 21 }, "frame": { - "x": 222, - "y": 231, + "x": 233, + "y": 239, "w": 22, - "h": 24 + "h": 21 } }, { - "filename": "802", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3882,16 +3735,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 222, - "y": 255, - "w": 22, - "h": 24 + "x": 231, + "y": 260, + "w": 23, + "h": 22 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 205, + "y": 283, + "w": 24, + "h": 14 } }, { @@ -3909,8 +3783,71 @@ "h": 24 }, "frame": { - "x": 223, - "y": 279, + "x": 195, + "y": 297, + "w": 21, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 216, + "y": 297, + "w": 20, + "h": 24 + } + }, + { + "filename": "752", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 259, + "y": 154, + "w": 23, + "h": 18 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 256, + "y": 172, "w": 21, "h": 24 } @@ -3930,134 +3867,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 303, - "w": 22, - "h": 20 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 245, - "y": 151, - "w": 18, - "h": 13 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 248, - "y": 164, - "w": 17, - "h": 24 - } - }, - { - "filename": "2051s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 265, - "y": 152, - "w": 23, - "h": 24 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 265, - "y": 176, - "w": 22, - "h": 21 - } - }, - { - "filename": "743", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 245, - "y": 191, - "w": 20, - "h": 22 - } - }, - { - "filename": "747s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 265, - "y": 197, + "x": 256, + "y": 196, "w": 22, "h": 20 } @@ -4077,8 +3888,8 @@ "h": 23 }, "frame": { - "x": 288, - "y": 164, + "x": 255, + "y": 216, "w": 22, "h": 23 } @@ -4098,77 +3909,14 @@ "h": 23 }, "frame": { - "x": 310, - "y": 164, + "x": 255, + "y": 239, "w": 22, "h": 23 } }, { - "filename": "802s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 287, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 309, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 332, - "y": 164, - "w": 22, - "h": 24 - } - }, - { - "filename": "749", + "filename": "789", "rotated": false, "trimmed": true, "sourceSize": { @@ -4177,19 +3925,61 @@ }, "spriteSourceSize": { "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 254, + "y": 262, + "w": 23, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 282, + "y": 156, + "w": 23, + "h": 18 + } + }, + { + "filename": "743", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 5, - "w": 21, - "h": 23 + "w": 20, + "h": 22 }, "frame": { - "x": 331, - "y": 188, - "w": 21, - "h": 23 + "x": 277, + "y": 174, + "w": 20, + "h": 22 } }, { - "filename": "2037", + "filename": "732s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4198,61 +3988,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 22, - "h": 21 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 354, - "y": 167, - "w": 22, - "h": 21 + "x": 278, + "y": 196, + "w": 19, + "h": 22 } }, { - "filename": "749s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 352, - "y": 188, - "w": 21, - "h": 23 - } - }, - { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 376, - "y": 167, - "w": 22, - "h": 21 - } - }, - { - "filename": "763s", + "filename": "786", "rotated": false, "trimmed": true, "sourceSize": { @@ -4261,15 +4009,57 @@ }, "spriteSourceSize": { "x": 11, - "y": 4, - "w": 21, - "h": 24 + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 373, - "y": 188, - "w": 21, - "h": 24 + "x": 277, + "y": 218, + "w": 20, + "h": 25 + } + }, + { + "filename": "786s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 243, + "w": 20, + "h": 25 + } + }, + { + "filename": "739", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 277, + "y": 268, + "w": 20, + "h": 21 } }, { @@ -4287,54 +4077,12 @@ "h": 24 }, "frame": { - "x": 394, - "y": 188, + "x": 297, + "y": 174, "w": 13, "h": 24 } }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 398, - "y": 169, - "w": 21, - "h": 19 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 419, - "y": 169, - "w": 15, - "h": 18 - } - }, { "filename": "755s", "rotated": false, @@ -4350,8 +4098,8 @@ "h": 24 }, "frame": { - "x": 407, - "y": 188, + "x": 297, + "y": 198, "w": 13, "h": 24 } @@ -4371,180 +4119,12 @@ "h": 24 }, "frame": { - "x": 420, - "y": 187, + "x": 297, + "y": 222, "w": 21, "h": 24 } }, - { - "filename": "761s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 441, - "y": 179, - "w": 16, - "h": 19 - } - }, - { - "filename": "775", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 457, - "y": 188, - "w": 21, - "h": 20 - } - }, - { - "filename": "775s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 478, - "y": 192, - "w": 21, - "h": 20 - } - }, - { - "filename": "751", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 198, - "w": 14, - "h": 20 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 420, - "y": 211, - "w": 21, - "h": 20 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 455, - "y": 208, - "w": 21, - "h": 20 - } - }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 218, - "w": 14, - "h": 20 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 476, - "y": 212, - "w": 21, - "h": 19 - } - }, { "filename": "793s", "rotated": false, @@ -4560,14 +4140,161 @@ "h": 24 }, "frame": { - "x": 455, - "y": 228, + "x": 297, + "y": 246, "w": 21, "h": 24 } }, { - "filename": "2019", + "filename": "747s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 297, + "y": 270, + "w": 22, + "h": 20 + } + }, + { + "filename": "2074", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 24, + "h": 15 + }, + "frame": { + "x": 231, + "y": 282, + "w": 24, + "h": 15 + } + }, + { + "filename": "2037", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 255, + "y": 282, + "w": 22, + "h": 21 + } + }, + { + "filename": "744", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 236, + "y": 297, + "w": 19, + "h": 22 + } + }, + { + "filename": "743s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 255, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "754", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 275, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 277, + "y": 290, + "w": 18, + "h": 13 + } + }, + { + "filename": "749", "rotated": false, "trimmed": true, "sourceSize": { @@ -4578,17 +4305,101 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 476, - "y": 231, + "x": 295, + "y": 290, "w": 21, - "h": 21 + "h": 23 } }, { - "filename": "2019s", + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 305, + "y": 156, + "w": 17, + "h": 18 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 174, + "w": 17, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 197, + "w": 17, + "h": 23 + } + }, + { + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 322, + "y": 155, + "w": 18, + "h": 19 + } + }, + { + "filename": "749s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4599,55 +4410,13 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 287, - "y": 211, + "x": 327, + "y": 174, "w": 21, - "h": 21 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 308, - "y": 211, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 329, - "y": 211, - "w": 21, - "h": 21 + "h": 23 } }, { @@ -4665,8 +4434,8 @@ "h": 23 }, "frame": { - "x": 350, - "y": 211, + "x": 327, + "y": 197, "w": 21, "h": 23 } @@ -4686,75 +4455,12 @@ "h": 23 }, "frame": { - "x": 371, - "y": 212, + "x": 318, + "y": 220, "w": 21, "h": 23 } }, - { - "filename": "743s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 392, - "y": 212, - "w": 20, - "h": 22 - } - }, - { - "filename": "739", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 245, - "y": 213, - "w": 20, - "h": 21 - } - }, - { - "filename": "754", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 244, - "y": 234, - "w": 20, - "h": 22 - } - }, { "filename": "754s", "rotated": false, @@ -4770,12 +4476,33 @@ "h": 22 }, "frame": { - "x": 244, - "y": 256, + "x": 318, + "y": 243, "w": 20, "h": 22 } }, + { + "filename": "728", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 340, + "y": 154, + "w": 17, + "h": 20 + } + }, { "filename": "739s", "rotated": false, @@ -4791,14 +4518,14 @@ "h": 21 }, "frame": { - "x": 244, - "y": 278, + "x": 357, + "y": 153, "w": 20, "h": 21 } }, { - "filename": "2027s", + "filename": "789s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4807,19 +4534,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 10, - "w": 21, - "h": 18 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 265, - "y": 217, - "w": 21, - "h": 18 + "x": 348, + "y": 174, + "w": 23, + "h": 20 } }, { - "filename": "744", + "filename": "2037s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4827,16 +4554,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 + "x": 10, + "y": 7, + "w": 22, + "h": 21 }, "frame": { - "x": 264, - "y": 235, - "w": 19, - "h": 22 + "x": 348, + "y": 194, + "w": 22, + "h": 21 } }, { @@ -4854,33 +4581,12 @@ "h": 22 }, "frame": { - "x": 264, - "y": 257, + "x": 377, + "y": 150, "w": 19, "h": 22 } }, - { - "filename": "741-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 264, - "y": 279, - "w": 20, - "h": 20 - } - }, { "filename": "762", "rotated": false, @@ -4896,8 +4602,8 @@ "h": 23 }, "frame": { - "x": 246, - "y": 299, + "x": 319, + "y": 265, "w": 18, "h": 23 } @@ -4917,54 +4623,12 @@ "h": 23 }, "frame": { - "x": 264, - "y": 299, + "x": 339, + "y": 220, "w": 18, "h": 23 } }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 283, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "728s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 283, - "y": 258, - "w": 17, - "h": 20 - } - }, { "filename": "741-pau", "rotated": false, @@ -4980,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 300, - "y": 232, + "x": 338, + "y": 243, "w": 18, "h": 22 } @@ -5001,35 +4665,14 @@ "h": 22 }, "frame": { - "x": 318, - "y": 232, + "x": 337, + "y": 265, "w": 18, "h": 22 } }, { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 300, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "723s", + "filename": "723", "rotated": false, "trimmed": true, "sourceSize": { @@ -5043,14 +4686,14 @@ "h": 22 }, "frame": { - "x": 284, - "y": 278, + "x": 357, + "y": 215, "w": 17, "h": 22 } }, { - "filename": "741s-sensu", + "filename": "2074s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5058,20 +4701,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 + "x": 8, + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 282, - "y": 300, - "w": 17, - "h": 23 + "x": 397, + "y": 149, + "w": 24, + "h": 15 } }, { - "filename": "731", + "filename": "741-pompom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,16 +4722,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 421, + "y": 151, + "w": 20, + "h": 20 + } + }, + { + "filename": "775", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 17, - "h": 22 + "w": 21, + "h": 20 }, "frame": { - "x": 320, - "y": 254, - "w": 17, - "h": 22 + "x": 396, + "y": 164, + "w": 21, + "h": 20 } }, { @@ -5106,14 +4770,119 @@ "h": 20 }, "frame": { - "x": 301, - "y": 274, + "x": 377, + "y": 172, "w": 19, "h": 20 } }, { - "filename": "722s", + "filename": "775s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 21, + "h": 20 + }, + "frame": { + "x": 417, + "y": 171, + "w": 21, + "h": 20 + } + }, + { + "filename": "778-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 396, + "y": 184, + "w": 21, + "h": 16 + } + }, + { + "filename": "778s-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 417, + "y": 191, + "w": 21, + "h": 16 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 441, + "y": 166, + "w": 21, + "h": 20 + } + }, + { + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 438, + "y": 186, + "w": 21, + "h": 21 + } + }, + { + "filename": "737s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5123,18 +4892,18 @@ "spriteSourceSize": { "x": 12, "y": 8, - "w": 17, - "h": 18 + "w": 18, + "h": 19 }, "frame": { - "x": 320, - "y": 276, - "w": 17, - "h": 18 + "x": 462, + "y": 172, + "w": 18, + "h": 19 } }, { - "filename": "753", + "filename": "779s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,20 +4911,125 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 480, + "y": 174, + "w": 21, + "h": 20 + } + }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, "h": 19 }, "frame": { - "x": 336, - "y": 232, - "w": 14, + "x": 459, + "y": 191, + "w": 21, "h": 19 } }, { - "filename": "2088", + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 480, + "y": 194, + "w": 21, + "h": 19 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 370, + "y": 194, + "w": 21, + "h": 21 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 374, + "y": 215, + "w": 17, + "h": 22 + } + }, + { + "filename": "2052", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 391, + "y": 200, + "w": 21, + "h": 21 + } + }, + { + "filename": "2027", "rotated": false, "trimmed": true, "sourceSize": { @@ -5169,14 +5043,56 @@ "h": 18 }, "frame": { - "x": 350, - "y": 234, + "x": 391, + "y": 221, "w": 21, "h": 18 } }, { - "filename": "2088s", + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 412, + "y": 207, + "w": 21, + "h": 21 + } + }, + { + "filename": "741s-pompom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 433, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "2027s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5190,8 +5106,8 @@ "h": 18 }, "frame": { - "x": 371, - "y": 235, + "x": 412, + "y": 228, "w": 21, "h": 18 } @@ -5211,12 +5127,75 @@ "h": 20 }, "frame": { - "x": 392, - "y": 234, + "x": 433, + "y": 227, "w": 19, "h": 20 } }, + { + "filename": "2088", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 453, + "y": 210, + "w": 21, + "h": 18 + } + }, + { + "filename": "2088s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 452, + "y": 228, + "w": 21, + "h": 18 + } + }, + { + "filename": "757", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 18 + }, + "frame": { + "x": 474, + "y": 213, + "w": 19, + "h": 18 + } + }, { "filename": "757s", "rotated": false, @@ -5232,12 +5211,54 @@ "h": 18 }, "frame": { - "x": 301, - "y": 294, + "x": 473, + "y": 231, "w": 19, "h": 18 } }, + { + "filename": "731", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 316, + "y": 290, + "w": 17, + "h": 22 + } + }, + { + "filename": "771", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 316, + "y": 312, + "w": 18, + "h": 13 + } + }, { "filename": "731s", "rotated": false, @@ -5253,12 +5274,33 @@ "h": 22 }, "frame": { - "x": 320, - "y": 294, + "x": 333, + "y": 288, "w": 17, "h": 22 } }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 334, + "y": 310, + "w": 17, + "h": 13 + } + }, { "filename": "778-disguised", "rotated": false, @@ -5274,8 +5316,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 252, + "x": 350, + "y": 287, "w": 17, "h": 22 } @@ -5295,54 +5337,12 @@ "h": 22 }, "frame": { - "x": 354, - "y": 252, + "x": 355, + "y": 265, "w": 17, "h": 22 } }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 337, - "y": 274, - "w": 18, - "h": 19 - } - }, - { - "filename": "737s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 371, - "y": 253, - "w": 18, - "h": 19 - } - }, { "filename": "741", "rotated": false, @@ -5358,12 +5358,96 @@ "h": 19 }, "frame": { - "x": 337, - "y": 293, + "x": 356, + "y": 246, "w": 17, "h": 19 } }, + { + "filename": "728s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 373, + "y": 237, + "w": 17, + "h": 20 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 390, + "y": 239, + "w": 17, + "h": 18 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 351, + "y": 309, + "w": 17, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 373, + "y": 257, + "w": 18, + "h": 13 + } + }, { "filename": "741s", "rotated": false, @@ -5379,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 355, - "y": 274, + "x": 372, + "y": 270, "w": 17, "h": 19 } @@ -5400,12 +5484,33 @@ "h": 19 }, "frame": { - "x": 354, - "y": 293, + "x": 367, + "y": 289, "w": 17, "h": 19 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 368, + "y": 308, + "w": 17, + "h": 17 + } + }, { "filename": "759s", "rotated": false, @@ -5421,96 +5526,12 @@ "h": 19 }, "frame": { - "x": 372, - "y": 272, + "x": 391, + "y": 257, "w": 17, "h": 19 } }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 389, - "y": 254, - "w": 17, - "h": 19 - } - }, - { - "filename": "774", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 406, - "y": 254, - "w": 14, - "h": 19 - } - }, { "filename": "774-blue", "rotated": false, @@ -5526,35 +5547,14 @@ "h": 18 }, "frame": { - "x": 406, - "y": 273, + "x": 389, + "y": 276, "w": 17, "h": 18 } }, { - "filename": "746s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 423, - "y": 231, - "w": 18, - "h": 13 - } - }, - { - "filename": "777s", + "filename": "777", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,54 +5568,12 @@ "h": 19 }, "frame": { - "x": 420, - "y": 244, + "x": 408, + "y": 246, "w": 17, "h": 19 } }, - { - "filename": "771", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 244, - "w": 18, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 257, - "w": 18, - "h": 13 - } - }, { "filename": "774-green", "rotated": false, @@ -5631,12 +5589,33 @@ "h": 18 }, "frame": { - "x": 455, - "y": 252, + "x": 408, + "y": 265, "w": 17, "h": 18 } }, + { + "filename": "777s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 425, + "y": 247, + "w": 17, + "h": 19 + } + }, { "filename": "774-indigo", "rotated": false, @@ -5652,14 +5631,14 @@ "h": 18 }, "frame": { - "x": 472, - "y": 252, + "x": 425, + "y": 266, "w": 17, "h": 18 } }, { - "filename": "736", + "filename": "751", "rotated": false, "trimmed": true, "sourceSize": { @@ -5667,37 +5646,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 + "x": 13, + "y": 8, + "w": 14, + "h": 20 }, "frame": { - "x": 372, - "y": 291, - "w": 17, - "h": 13 - } - }, - { - "filename": "736s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 389, - "y": 291, - "w": 17, - "h": 13 + "x": 442, + "y": 247, + "w": 14, + "h": 20 } }, { @@ -5715,8 +5673,8 @@ "h": 18 }, "frame": { - "x": 406, - "y": 291, + "x": 456, + "y": 246, "w": 17, "h": 18 } @@ -5736,12 +5694,33 @@ "h": 18 }, "frame": { - "x": 371, - "y": 304, + "x": 473, + "y": 249, "w": 17, "h": 18 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 267, + "w": 14, + "h": 20 + } + }, { "filename": "774-violet", "rotated": false, @@ -5757,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 388, - "y": 304, + "x": 456, + "y": 264, "w": 17, "h": 18 } @@ -5778,8 +5757,29 @@ "h": 18 }, "frame": { - "x": 423, - "y": 270, + "x": 473, + "y": 267, + "w": 17, + "h": 18 + } + }, + { + "filename": "774", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 406, + "y": 283, "w": 17, "h": 18 } @@ -5800,32 +5800,11 @@ }, "frame": { "x": 423, - "y": 288, + "y": 284, "w": 17, "h": 18 } }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 423, - "y": 306, - "w": 17, - "h": 17 - } - }, { "filename": "774s-green", "rotated": false, @@ -5842,11 +5821,32 @@ }, "frame": { "x": 440, - "y": 270, + "y": 287, "w": 17, "h": 18 } }, + { + "filename": "753", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 457, + "y": 282, + "w": 14, + "h": 19 + } + }, { "filename": "774s-indigo", "rotated": false, @@ -5862,14 +5862,14 @@ "h": 18 }, "frame": { - "x": 440, - "y": 288, + "x": 471, + "y": 285, "w": 17, "h": 18 } }, { - "filename": "808s", + "filename": "753s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5877,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 + "x": 14, + "y": 8, + "w": 14, + "h": 19 }, "frame": { - "x": 440, - "y": 306, - "w": 17, - "h": 17 + "x": 488, + "y": 285, + "w": 14, + "h": 19 } }, { @@ -5904,8 +5904,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 270, + "x": 385, + "y": 294, "w": 17, "h": 18 } @@ -5925,8 +5925,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 288, + "x": 402, + "y": 301, "w": 17, "h": 18 } @@ -5946,8 +5946,8 @@ "h": 18 }, "frame": { - "x": 474, - "y": 270, + "x": 419, + "y": 302, "w": 17, "h": 18 } @@ -5967,11 +5967,53 @@ "h": 18 }, "frame": { - "x": 474, - "y": 288, + "x": 436, + "y": 305, "w": 17, "h": 18 } + }, + { + "filename": "774s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 453, + "y": 305, + "w": 17, + "h": 18 + } + }, + { + "filename": "808s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 470, + "y": 303, + "w": 17, + "h": 17 + } } ] } @@ -5979,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a4de8d1c4f7d4f58c929b8b5479e03f1:3c8ac308e19a7f9420a4df8a78188490:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index c9a396ed5c60981ba160c14a52f169a6257bb2a5..5e6421360fdbbcfce36acf687bd3395ea46656c1 100644 GIT binary patch literal 51451 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 Date: Sun, 16 Feb 2025 05:34:10 +0100 Subject: [PATCH 040/171] [Bug][UI/UX] Setting proper labels in cost reduction dropdown filter #5316 --- src/ui/pokedex-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 9b54266b3ca..5180d7bd956 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -336,6 +336,8 @@ export default class PokedexUiHandler extends MessageUiHandler { const costReductionLabels = [ new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedOne"), undefined, DropDownState.ONE), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedTwo"), undefined, DropDownState.TWO), new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), ]; From ef11527b9acc12a49f679873d1cf40e5020f463b Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:07:07 -0500 Subject: [PATCH 041/171] Remove outdated Victini check for monogen challenge (#5309) --- src/data/challenge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 10fb9c55d3d..b6d123ce933 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -456,8 +456,8 @@ export class SingleGenerationChallenge extends Challenge { } applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { - const baseGeneration = pokemon.species.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.species.speciesId).generation; - const fusionGeneration = pokemon.isFusion() ? pokemon.fusionSpecies?.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? + const baseGeneration = getPokemonSpecies(pokemon.species.speciesId).generation; + const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { valid.value = false; return true; From 4bc617bd5fbb5a3ba57336ffb2d996963b4e8771 Mon Sep 17 00:00:00 2001 From: Kenneth West <45572572+KennethWest@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:18:19 -0500 Subject: [PATCH 042/171] Fix [BUG] #5081 Wrong visual text when using priority moves on Psychic Terrain (#5091) * Fix [BUG] #5081 Wrong visual text when using priority moves on Psychic Terrain * Apply suggestions from code review for global scene change --- src/phases/move-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 9d32189edb5..73468dc1690 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -354,7 +354,7 @@ export class MovePhase extends BattlePhase { if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { - failedText = getTerrainBlockMessage(this.pokemon, globalScene.arena.getTerrainType()); + failedText = getTerrainBlockMessage(targets[0], globalScene.arena.getTerrainType()); } this.showFailedText(failedText); From 90d32b886c772107b79945c513a0b603bcd824a5 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 17 Feb 2025 08:20:50 +1100 Subject: [PATCH 043/171] [Feature] Tera Rework (#5233) * Commit old stashed changes * Complete basic implementation of Tera * Fix effectiveness test * Make tera retain until forced recall or faint, regain on biome change * Experimental sparkle fix * Fix champion teras * Attempted fix for double battles tera UI bug * Fix the fix * Fix linting and test issues * Fix more tests * Change int type * Implement tera for ME trainers * Cleanup species inclusivity check * Make tera instant recharge if terapagos in party * Make useless tera shards not generate * Implement stellar tera damage boost * Improve tera selection UI * Tidy up animation and localisation * Improve tera button sprite * Fix Lance tera * Make tera instant recharge during E4 in classic modes. * Fix formatting in the tera common animation The animation was also not playing due to `frameTimedEvents` being missing as well. * Make tera effect start after animation * Implement save migration * Update version number for migration code --------- Co-authored-by: Madmadness65 Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- public/battle-anims/common-terastallize.json | 774 ++++++++++++++++++ public/images/battle_anims/terastallize.png | Bin 0 -> 2092 bytes public/images/ui/button_tera.json | 158 ++++ public/images/ui/button_tera.png | Bin 0 -> 6700 bytes public/images/ui/legacy/button_tera.json | 158 ++++ public/images/ui/legacy/button_tera.png | Bin 0 -> 6700 bytes src/battle-scene.ts | 25 +- src/battle.ts | 2 + src/data/ability.ts | 48 +- src/data/battle-anims.ts | 1 + src/data/battler-tags.ts | 2 +- src/data/move.ts | 66 +- .../global-trade-system-encounter.ts | 4 +- .../the-expert-pokemon-breeder-encounter.ts | 9 +- .../utils/encounter-phase-utils.ts | 10 + .../encounter-transformation-sequence.ts | 2 +- src/data/pokemon-forms.ts | 45 +- src/data/trainer-config.ts | 252 +++--- src/field/arena.ts | 2 + src/field/pokemon-sprite-sparkle-handler.ts | 3 + src/field/pokemon.ts | 109 ++- src/field/trainer.ts | 20 +- src/loading-scene.ts | 1 + src/modifier/modifier-type.ts | 79 +- src/modifier/modifier.ts | 104 +-- src/phases/command-phase.ts | 3 + src/phases/enemy-command-phase.ts | 4 + src/phases/evolution-phase.ts | 2 +- src/phases/faint-phase.ts | 2 + src/phases/move-effect-phase.ts | 6 + src/phases/party-heal-phase.ts | 1 + src/phases/quiet-form-change-phase.ts | 8 +- src/phases/tera-phase.ts | 51 ++ src/phases/turn-start-phase.ts | 15 + src/pipelines/sprite.ts | 2 +- src/system/arena-data.ts | 2 + src/system/game-data.ts | 2 + src/system/pokemon-data.ts | 9 + .../version_migration/version_converter.ts | 15 + .../version_migration/versions/v1_7_0.ts | 49 ++ src/test/abilities/libero.test.ts | 4 +- src/test/abilities/protean.test.ts | 4 +- src/test/moves/effectiveness.test.ts | 9 +- src/test/moves/freeze_dry.test.ts | 10 +- src/test/moves/tar_shot.test.ts | 7 +- src/test/moves/tera_blast.test.ts | 27 +- src/test/moves/tera_starstorm.test.ts | 11 +- src/ui/battle-info.ts | 6 +- src/ui/command-ui-handler.ts | 64 +- src/ui/fight-ui-handler.ts | 4 +- src/ui/run-info-ui-handler.ts | 23 - src/ui/summary-ui-handler.ts | 3 +- 52 files changed, 1784 insertions(+), 433 deletions(-) create mode 100644 public/battle-anims/common-terastallize.json create mode 100644 public/images/battle_anims/terastallize.png create mode 100644 public/images/ui/button_tera.json create mode 100644 public/images/ui/button_tera.png create mode 100644 public/images/ui/legacy/button_tera.json create mode 100644 public/images/ui/legacy/button_tera.png create mode 100644 src/phases/tera-phase.ts create mode 100644 src/system/version_migration/versions/v1_7_0.ts diff --git a/public/battle-anims/common-terastallize.json b/public/battle-anims/common-terastallize.json new file mode 100644 index 00000000000..3843464dbde --- /dev/null +++ b/public/battle-anims/common-terastallize.json @@ -0,0 +1,774 @@ +{ + "graphic": "terastallize", + "frames": [ + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 225, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 200, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 255 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 255 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ] + ], + "frameTimedEvents": {}, + "position": 4, + "hue": 0 +} \ No newline at end of file diff --git a/public/images/battle_anims/terastallize.png b/public/images/battle_anims/terastallize.png new file mode 100644 index 0000000000000000000000000000000000000000..78fbb7ec33506e0318de050424d429e8bc428314 GIT binary patch literal 2092 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 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/button_tera.json b/public/images/ui/legacy/button_tera.json new file mode 100644 index 00000000000..7b64db66ae6 --- /dev/null +++ b/public/images/ui/legacy/button_tera.json @@ -0,0 +1,158 @@ +{ "frames": { + "unknown": { + "frame": { "x": 0, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "bug": { + "frame": { "x": 18, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dark": { + "frame": { "x": 36, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dragon": { + "frame": { "x": 54, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "electric": { + "frame": { "x": 72, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fairy": { + "frame": { "x": 0, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fighting": { + "frame": { "x": 18, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fire": { + "frame": { "x": 36, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "flying": { + "frame": { "x": 54, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ghost": { + "frame": { "x": 72, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "grass": { + "frame": { "x": 0, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ground": { + "frame": { "x": 18, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ice": { + "frame": { "x": 36, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "normal": { + "frame": { "x": 54, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "poison": { + "frame": { "x": 72, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "psychic": { + "frame": { "x": 0, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "rock": { + "frame": { "x": 18, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "steel": { + "frame": { "x": 36, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "water": { + "frame": { "x": 54, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "stellar": { + "frame": { "x": 72, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "button_tera.png", + "format": "RGBA8888", + "size": { "w": 90, "h": 84 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Sprite Sheet", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } +} diff --git a/public/images/ui/legacy/button_tera.png b/public/images/ui/legacy/button_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..c9672bafa39be1077386d05e922bdc2683dc53d1 GIT binary patch literal 6700 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 literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 3f285c274af..4033f44eacb 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -9,7 +9,7 @@ import type { Constructor } from "#app/utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; -import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, ModifierBar, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier, TerastallizeModifier } from "./modifier/modifier"; +import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, ModifierBar, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier } from "./modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; import type { Phase } from "#app/phase"; @@ -1373,7 +1373,11 @@ export default class BattleScene extends SceneBase { for (const pokemon of this.getPlayerParty()) { pokemon.resetBattleData(); + pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); + if (pokemon.hasSpecies(Species.TERAPAGOS) || (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)) { + this.arena.playerTerasUsed = 0; + } } if (!this.trainer.visible) { @@ -1658,7 +1662,7 @@ export default class BattleScene extends SceneBase { } initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); + sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, isTerastallized: pokemon ? pokemon.isTerastallized : false }); this.spriteSparkleHandler.add(sprite); return sprite; } @@ -2589,11 +2593,8 @@ export default class BattleScene extends SceneBase { const modifiersToRemove: PersistentModifier[] = []; const modifierPromises: Promise[] = []; if (modifier instanceof PersistentModifier) { - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); - } if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { success = modifier.apply(pokemon, true); @@ -2670,11 +2671,8 @@ export default class BattleScene extends SceneBase { addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { return new Promise(resolve => { const modifiersToRemove: PersistentModifier[] = []; - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); - } if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, true); @@ -2798,6 +2796,8 @@ export default class BattleScene extends SceneBase { for (const modifier of modifiers) { this.addEnemyModifier(modifier, true, true); } + + this.currentBattle.trainer.genAI(party); } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { @@ -2929,7 +2929,7 @@ export default class BattleScene extends SceneBase { const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { modifiers.splice(modifierIndex, 1); - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, false); @@ -3130,7 +3130,8 @@ export default class BattleScene extends SceneBase { name: p.name, form: p.getFormKey(), types: p.getTypes().map((type) => Type[type]), - teraType: p.getTeraType() !== Type.UNKNOWN ? Type[p.getTeraType()] : "", + teraType: Type[p.getTeraType()], + isTerastallized: p.isTerastallized, level: p.level, currentHP: p.hp, maxHP: p.getMaxHp(), diff --git a/src/battle.ts b/src/battle.ts index 7ede7b2982e..807ac215ea8 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -92,6 +92,7 @@ export default class Battle { public started: boolean = false; public enemySwitchCounter: number = 0; public turn: number = 0; + public preTurnCommands: TurnCommands; public turnCommands: TurnCommands; public playerParticipantIds: Set = new Set(); public battleScore: number = 0; @@ -180,6 +181,7 @@ export default class Battle { incrementTurn(): void { this.turn++; this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); + this.preTurnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); this.battleSeedState = null; } diff --git a/src/data/ability.ts b/src/data/ability.ts index e5b674d4fb4..6ba5f685acd 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -239,37 +239,25 @@ export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { } } -export class PostBattleInitStatStageChangeAbAttr extends PostBattleInitAbAttr { +export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { private stats: BattleStat[]; private stages: number; - private selfTarget: boolean; - constructor(stats: BattleStat[], stages: number, selfTarget?: boolean) { + constructor(stats: BattleStat[], stages: number) { super(); this.stats = stats; this.stages = stages; - this.selfTarget = !!selfTarget; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { - if (this.selfTarget) { - statStageChangePhases.push(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); - } else { - for (const opponent of pokemon.getOpponents()) { - statStageChangePhases.push(new StatStageChangePhase(opponent.getBattlerIndex(), false, this.stats, this.stages)); - } - } + statStageChangePhases.push(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); for (const statStageChangePhase of statStageChangePhases) { - if (!this.selfTarget && !statStageChangePhase.getPokemon()?.summonData) { - globalScene.pushPhase(statStageChangePhase); - } else { // TODO: This causes the ability bar to be shown at the wrong time - globalScene.unshiftPhase(statStageChangePhase); - } + globalScene.unshiftPhase(statStageChangePhase); } } @@ -1307,7 +1295,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if ( - !pokemon.isTerastallized() && + !pokemon.isTerastallized && move.id !== Moves.STRUGGLE && /** * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute @@ -4788,7 +4776,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): boolean { - if (pokemon.isTerastallized()) { + if (pokemon.isTerastallized) { return false; } const currentTerrain = globalScene.arena.getTerrainType(); @@ -6201,7 +6189,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .condition((pokemon) => !pokemon.isTerastallized()), + .condition((pokemon) => !pokemon.isTerastallized), new Ability(Abilities.QUICK_DRAW, 8) .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) @@ -6353,29 +6341,25 @@ export function initAbilities() { new Ability(Abilities.TOXIC_CHAIN, 9) .attr(PostAttackApplyStatusEffectAbAttr, false, 30, StatusEffect.TOXIC), new Ability(Abilities.EMBODY_ASPECT_TEAL, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPD ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPD ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPDEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.ATK ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.DEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.TERA_SHIFT, 9) .attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1) .attr(UncopiableAbilityAbAttr) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 99e9e82d4a6..a179f3a3e9b 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -56,6 +56,7 @@ export enum ChargeAnim { export enum CommonAnim { USE_ITEM = 2000, HEALTH_UP, + TERASTALLIZE, POISON = 2010, TOXIC, PARALYSIS, diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 91ab10aecfa..b97be756048 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2485,7 +2485,7 @@ export class TarShotTag extends BattlerTag { * @returns whether the tag is applied */ override canAdd(pokemon: Pokemon): boolean { - return !pokemon.isTerastallized(); + return !pokemon.isTerastallized; } override onAdd(pokemon: Pokemon): void { diff --git a/src/data/move.ts b/src/data/move.ts index cc22f582790..7e504e87667 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -791,7 +791,7 @@ export default class Move implements Localizable { applyPreAttackAbAttrs(MoveTypeChangeAbAttr, source, target, this, true, null, typeChangeMovePowerMultiplier); const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !globalScene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { + if (source.isTerastallized && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !globalScene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { power.value = 60; } @@ -4634,7 +4634,7 @@ export class TeraMoveCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > + if (user.isTerastallized && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > user.getEffectiveStat(Stat.SPATK, target, move, true, true, false, false, true)) { category.value = MoveCategory.PHYSICAL; return true; @@ -4662,7 +4662,7 @@ export class TeraBlastPowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user.isTerastallized() && user.getTeraType() === Type.STELLAR) { + if (user.isTerastallized && user.getTeraType() === Type.STELLAR) { power.value = 100; return true; } @@ -4720,30 +4720,6 @@ export class VariableMoveTypeAttr extends MoveAttr { } } -/** - * Attribute used for Tera Starstorm that changes the move type to Stellar - * @extends VariableMoveTypeAttr - */ -export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { - /** - * - * @param user the {@linkcode Pokemon} using the move - * @param target n/a - * @param move n/a - * @param args[0] {@linkcode Utils.NumberHolder} the move type - * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise - */ - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isTerastallized() && (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS)) { - const moveType = args[0] as Utils.NumberHolder; - - moveType.value = Type.STELLAR; - return true; - } - return false; - } -} - export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -5009,7 +4985,7 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { return false; } - if (user.isTerastallized()) { + if (user.isTerastallized) { moveType.value = user.getTeraType(); // changes move type to tera type return true; } @@ -5018,6 +4994,30 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { } } +/** + * Attribute used for Tera Starstorm that changes the move type to Stellar + * @extends VariableMoveTypeAttr + */ +export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { + /** + * + * @param user the {@linkcode Pokemon} using the move + * @param target n/a + * @param move n/a + * @param args[0] {@linkcode Utils.NumberHolder} the move type + * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (user.isTerastallized && user.hasSpecies(Species.TERAPAGOS)) { + const moveType = args[0] as Utils.NumberHolder; + + moveType.value = Type.STELLAR; + return true; + } + return false; + } +} + export class MatchUserTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -6345,7 +6345,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { return false; } - if (user.isTerastallized() && user.getTeraType() === this.removedType) { // active tera types cannot be removed + if (user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; } @@ -6525,7 +6525,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); + return (user, target, move) => !target.isTerastallized && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); } } @@ -6548,7 +6548,7 @@ export class AddTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.getTypes().includes(this.type); + return (user, target, move) => !target.isTerastallized && !target.getTypes().includes(this.type); } } @@ -11076,7 +11076,7 @@ export function initMoves() { .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized && user.isOfType(Type.STELLAR) }), new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), @@ -11271,7 +11271,7 @@ export function initMoves() { new AttackMove(Moves.TERA_STARSTORM, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraStarstormTypeAttr) - .attr(VariableTargetAttr, (user, target, move) => (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS) && user.isTerastallized() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) + .attr(VariableTargetAttr, (user, target, move) => user.hasSpecies(Species.TERAPAGOS) && user.isTerastallized ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ new AttackMove(Moves.FICKLE_BEAM, Type.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) 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 65bbab16603..f494aaf2c28 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -594,7 +594,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", tradedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", tradedPokemon.shiny); @@ -615,7 +615,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", receivedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", receivedPokemon.shiny); 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 2f5843e39d2..a4e80c158bb 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 @@ -1,5 +1,5 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; @@ -23,7 +23,6 @@ import { EggSourceType } from "#enums/egg-source-types"; import { EggTier } from "#enums/egg-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { Type } from "#enums/type"; import { getPokeballTintColor } from "#app/data/pokeball"; @@ -387,11 +386,7 @@ function getPartyConfig(): EnemyPartyConfig { nature: Nature.ADAMANT, moveSet: [ Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH ], ivs: [ 31, 31, 31, 31, 31, 31 ], - modifierConfigs: [ - { - modifier: generateModifierType(modifierTypes.TERA_SHARD, [ Type.STEEL ]) as PokemonHeldItemModifierType, - } - ] + tera: Type.STEEL, } ] }; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 351b969b1a8..d745da5ecb3 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -46,6 +46,7 @@ import type { Variant } from "#app/data/variant"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Type } from "#app/enums/type"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -98,6 +99,7 @@ export interface EnemyPokemonConfig { modifierConfigs?: HeldModifierConfig[]; tags?: BattlerTagType[]; dataSource?: PokemonData; + tera?: Type; aiType?: AiType; } @@ -329,6 +331,14 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): tags.forEach(tag => enemyPokemon.addTag(tag)); } + // Set tera + if (config.tera && config.tera !== Type.UNKNOWN) { + enemyPokemon.teraType = config.tera; + if (battle.trainer) { + battle.trainer.config.setInstantTera(e); + } + } + // mysteryEncounterBattleEffects will only be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied if (config.mysteryEncounterBattleEffects) { enemyPokemon.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index d4ae3496b0c..0cb2a695de8 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -61,7 +61,7 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()), isTerastallized: previousPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); sprite.setPipelineData("shiny", previousPokemon.shiny); diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 0226aef79d1..46dfbfecae2 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -1,8 +1,7 @@ -import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier"; +import { PokemonFormChangeItemModifier } from "../modifier/modifier"; import type Pokemon from "../field/pokemon"; import { StatusEffect } from "#enums/status-effect"; import { MoveCategory, allMoves } from "./move"; -import { Type } from "#enums/type"; import type { Constructor, nil } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -399,23 +398,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { * @extends SpeciesFormChangeTrigger */ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { - /** The Tera type that triggers the form change */ - private teraType: Type; - - constructor(teraType: Type) { - super(); - this.teraType = teraType; - this.description = i18next.t("pokemonEvolutions:Forms.tera", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - /** - * Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type. - * @param {Pokemon} pokemon the Pokémon that is trying to do the form change - * @returns `true` if the Pokémon can change forms, `false` otherwise - */ - canChange(pokemon: Pokemon): boolean { - return !!globalScene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType); - } + description = i18next.t("pokemonEvolutions:Forms.tera" ); } /** @@ -425,10 +408,6 @@ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { */ export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger { description = i18next.t("pokemonEvolutions:Forms.teraLapse"); - - canChange(pokemon: Pokemon): boolean { - return !!globalScene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id); - } } /** @@ -992,19 +971,19 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)), - new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK)) + new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.TERAPAGOS]: [ new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeAbilityTrigger(), true), - new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)), - new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR)) + new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.GALAR_DARMANITAN]: [ new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeAbilityTrigger(), true), diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 564518845dc..9cbec400a87 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -175,11 +175,51 @@ export const trainerPartyTemplates = { type PartyTemplateFunc = () => TrainerPartyTemplate; type PartyMemberFunc = (level: number, strength: PartyMemberStrength) => EnemyPokemon; type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; +type GenAIFunc = (party: EnemyPokemon[]) => void; export interface PartyMemberFuncs { [key: number]: PartyMemberFunc } +export enum TeraAIMode { + NO_TERA, + INSTANT_TERA, + SMART_TERA +} + +/** + * Stores data and helper functions about a trainers AI options. + */ +export class TrainerAI { + public teraMode: TeraAIMode = TeraAIMode.NO_TERA; + public instantTeras: number[]; + + /** + * @param canTerastallize Whether this trainer is allowed to tera + */ + constructor(teraMode: TeraAIMode = TeraAIMode.NO_TERA) { + this.teraMode = teraMode; + this.instantTeras = []; + } + + /** + * Checks if a trainer can tera + * @returns Whether this trainer can currently tera + */ + public canTerastallize() { + return this.teraMode !== TeraAIMode.NO_TERA; + } + + /** + * Sets a pokemon on this AI to just instantly tera on first move used + * @param index The index of the pokemon to instantly tera + */ + public setInstantTera(index: number) { + this.teraMode = TeraAIMode.INSTANT_TERA; + this.instantTeras.push(index); + } +} + export class TrainerConfig { public trainerType: TrainerType; public trainerTypeDouble: TrainerType; @@ -203,6 +243,7 @@ export class TrainerConfig { public doubleEncounterBgm: string; public victoryBgm: string; public genModifiersFunc: GenModifiersFunc; + public genAIFuncs: GenAIFunc[] = []; public modifierRewardFuncs: ModifierTypeFunc[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; @@ -212,6 +253,7 @@ export class TrainerConfig { public speciesFilter: PokemonSpeciesFilter; public specialtyTypes: Type[] = []; public hasVoucher: boolean = false; + public trainerAI: TrainerAI; public encounterMessages: string[] = []; public victoryMessages: string[] = []; @@ -227,6 +269,7 @@ export class TrainerConfig { constructor(trainerType: TrainerType, allowLegendaries?: boolean) { this.trainerType = trainerType; + this.trainerAI = new TrainerAI(); this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]); this.battleBgm = "battle_trainer"; this.mixedBattleBgm = "battle_trainer"; @@ -550,6 +593,47 @@ export class TrainerConfig { return this; } + /** + * Sets random pokemon from the trainers team to instant tera. Uses their specialty types is they have one. + * @param count The amount of pokemon to have instant tera + * @returns this + */ + setRandomTeraModifiers(count: () => integer): TrainerConfig { + this.genAIFuncs.push((party: EnemyPokemon[]) => { + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + for (let t = 0; t < Math.min(count(), party.length); t++) { + const randomIndex = Utils.randSeedItem(partyMemberIndexes); + partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + if (this.specialtyTypes?.length) { + party[randomIndex].teraType = Utils.randSeedItem(this.specialtyTypes); + } + this.trainerAI.setInstantTera(randomIndex); + } + }); + return this; + } + + /** + * Sets a specific pokemon to instant tera + * @param index The index within the team to have instant tera + * @returns this + */ + setInstantTera(index: number): TrainerConfig { + this.trainerAI.setInstantTera(index); + return this; + } + + // function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { + // const ret: PersistentModifier[] = []; + // const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + // for (let t = 0; t < Math.min(count, party.length); t++) { + // const randomIndex = Utils.randSeedItem(partyMemberIndexes); + // partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + // ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? + // } + // return ret; + // } + setEventModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.eventRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); @@ -851,10 +935,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => { - const waveIndex = globalScene.currentBattle.waveIndex; - return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : undefined); - }); + this.setRandomTeraModifiers(() => globalScene.currentBattle.waveIndex >= 100 ? 1 : 0); return this; } @@ -910,7 +991,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_elite"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 1, specialtyTypes.length ? specialtyTypes : undefined)); + this.setRandomTeraModifiers(() => 1); return this; } @@ -1197,16 +1278,6 @@ function getSpeciesFilterRandomPartyMemberFunc( }; } -function getRandomTeraModifiers(party: EnemyPokemon[], count: number, types?: Type[]): PersistentModifier[] { - const ret: PersistentModifier[] = []; - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); - for (let t = 0; t < Math.min(count, party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); - partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? - } - return ret; -} type SignatureSpecies = { [key in string]: (Species | Species[])[]; @@ -1747,10 +1818,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.RED]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PIKACHU ], TrainerSlot.TRAINER, true, p => { p.formIndex = 8; // G-Max Pikachu @@ -1774,10 +1842,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.KINGDRA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AERODACTYL ])) @@ -1787,16 +1852,15 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type1; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SKARMORY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CRADILY, Species.ARMALDO ])) @@ -1814,10 +1878,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.abilityIndex = 1; // Drizzle @@ -1840,10 +1901,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SPIRITOMB ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1853,7 +1911,9 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type1; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TOGEKISS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.setBoss(true, 2); @@ -1864,10 +1924,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BOUFFALANT, Species.BRAVIARY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION ], TrainerSlot.TRAINER, true, p => { @@ -1882,16 +1939,15 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.speciesId === Species.KROOKODILE ? Type.DARK : p.species.type1; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.VOLCARONA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const pokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ pokemon.species.speciesId === Species.KROOKODILE ? pokemon.species.type2 : pokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(pokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.DRUDDIGON ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ARCHEOPS ])) @@ -1899,7 +1955,9 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.teraType = Type.DRAGON; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // G-Max Lapras p.generateAndPopulateMoveset(); @@ -1911,10 +1969,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ Type.DRAGON ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_kalos_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.HAWLUCHA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1927,6 +1982,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TYRANTRUM, Species.AURORUS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus + p.teraType = p.species.speciesId === Species.TYRANTRUM ? Type.DRAGON : Type.ICE; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1938,10 +1994,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.KUKUI]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kukui") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1965,11 +2018,9 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.HISUI_DECIDUEYE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; + p.teraType = p.species.speciesId === Species.INCINEROAR ? Type.DARK : Type.FIGHTING; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[5]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(5), [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1982,6 +2033,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TAPU_LELE, Species.TAPU_BULU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = p.species.type1; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ZYGARDE ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Zygarde 10% forme, Aura Break @@ -1993,10 +2045,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2017,10 +2066,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.MUSTARD]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_mustard") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2033,6 +2079,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = Type.PSYCHIC; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_DARMANITAN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2050,10 +2097,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[2]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(2), [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_geeta") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2070,11 +2114,9 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KINGAMBIT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Supreme Overlord + p.teraType = Type.FLYING; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[5]; - return [ modifierTypes.TERA_SHARD().generateType([], [ Type.FLYING ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(5), [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_nemona") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.formIndex = 0; // Midday form @@ -2086,16 +2128,15 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GHOLDENGO ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.speciesId === Species.ARMAROUGE ? Type.PSYCHIC : Type.GHOST; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kieran") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2117,7 +2158,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.OGERPON ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(4, 4); // Random Ogerpon Tera Mask + p.formIndex = Utils.randSeedInt(4); // Random Ogerpon Tera Mask p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.IVY_CUDGEL)) { // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. @@ -2129,17 +2170,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const starter = party[4]; - let teraShardType: Type; - const pokemonType2 = starter.species.forms[starter.formIndex].type2; - if (starter.formIndex === 4 || Utils.isNullOrUndefined(pokemonType2)) { - teraShardType = starter.species.type1; - } else { - teraShardType = pokemonType2; - } - return [ modifierTypes.TERA_SHARD().generateType([], [ teraShardType ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) @@ -2162,19 +2193,20 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(species => species.baseTotal >= 540), [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - (p => p.abilityIndex = 0))) + (p => { + p.abilityIndex = 0; + p.teraType = p.species.type1; + }))) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.abilityIndex = 0; + p.teraType = p.species.type1; })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) @@ -2185,15 +2217,13 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.abilityIndex = 0; + p.teraType = p.species.type1; p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, @@ -2212,10 +2242,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Rayquaza p.generateName(); })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN ], TrainerSlot.TRAINER, true, p => { @@ -2713,10 +2740,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.generateName(); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setInstantTera(4), [TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -2749,10 +2773,12 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setInstantTera(0), [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); diff --git a/src/field/arena.ts b/src/field/arena.ts index 5ee065d71dc..60ee4b5b03c 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -44,6 +44,7 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + public playerTerasUsed: number; /** * Saves the number of times a party pokemon faints during a arena encounter. * {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave). @@ -63,6 +64,7 @@ export class Arena { this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerTerasUsed = 0; this.playerFaints = playerFaints; } diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 074933f0f00..d1803cc036e 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -27,6 +27,9 @@ export default class PokemonSpriteSparkleHandler { if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) { continue; } + if (!(s.parentContainer instanceof Pokemon) || !(s.parentContainer as Pokemon).isTerastallized) { + continue; + } const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; const parent = (pokemon || s).parentContainer; const texture = s.texture; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 5c6fbb34aea..dfce632ab06 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -52,7 +52,7 @@ import { getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; import { Type } from "#enums/type"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { Gender } from "#app/data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; @@ -79,7 +79,7 @@ import { DexAttr } from "#app/system/game-data"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; import { getNatureStatMultiplier } from "#app/data/nature"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; -import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; +import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; import { TerrainType } from "#app/data/terrain"; import type { TrainerSlot } from "#app/data/trainer-config"; import Overrides from "#app/overrides"; @@ -163,6 +163,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public pokerus: boolean; public switchOutStatus: boolean; public evoCounter: number; + public teraType: Type; + public isTerastallized: boolean; + public stellarTypesBoosted: Type[]; public fusionSpecies: PokemonSpecies | null; public fusionFormIndex: number; @@ -172,6 +175,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionGender: Gender; public fusionLuck: number; public fusionCustomPokemonData: CustomPokemonData | null; + public fusionTeraType: Type; private summonDataPrimer: PokemonSummonData | null; @@ -269,8 +273,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; + this.fusionTeraType = dataSource.fusionTeraType; this.usedTMs = dataSource.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); + this.teraType = dataSource.teraType; + this.isTerastallized = dataSource.isTerastallized; + this.stellarTypesBoosted = dataSource.stellarTypesBoosted ?? []; } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -319,6 +327,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.fusionLuck = this.luck; + + this.teraType = Utils.randSeedItem(this.getTypes(false, false, true)); + this.isTerastallized = false; + this.stellarTypesBoosted = []; } this.generateName(); @@ -355,7 +367,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const getSprite = (hasShadow?: boolean) => { const ret = globalScene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? "back__" : ""}sub`, undefined, true); ret.setOrigin(0.5, 1); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()) }); + ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()), isTerastallized: this.isTerastallized }); return ret; }; @@ -723,7 +735,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); + [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { + s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType()); + s.pipelineData["isTerastallized"] = this.isTerastallized; + }); this.updateInfo(true); } @@ -1208,6 +1223,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.fusionSpecies?.speciesId === species; } + /** + * Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it. + * @param species the pokemon {@linkcode Species} to check + * @returns `true` if the pokemon is the species or is fused with it, `false` otherwise + */ + hasSpecies(species: Species): boolean { + return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + } + abstract isBoss(): boolean; getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { @@ -1284,9 +1308,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride: boolean = false): Type[] { const types: Type[] = []; - if (includeTeraType) { + if (includeTeraType && this.isTerastallized) { const teraType = this.getTeraType(); - if (teraType !== Type.UNKNOWN) { + if (this.isTerastallized && !(forDefend && teraType === Type.STELLAR)) { // Stellar tera uses its original types defensively types.push(teraType); if (forDefend) { return types; @@ -1590,23 +1614,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * @returns the pokemon's current tera {@linkcode Type}, or `Type.UNKNOWN` if the pokemon is not terastallized + * @returns the pokemon's current tera {@linkcode Type} */ - public getTeraType(): Type { - // I don't think this should be possible anymore, please report if you encounter this. --NightKev - if (globalScene === undefined) { - console.warn("Pokemon.getTeraType(): Global scene is not defined!"); - return Type.UNKNOWN; + getTeraType(): Type { + if (this.hasSpecies(Species.TERAPAGOS)) { + return Type.STELLAR; + } else if (this.hasSpecies(Species.OGERPON)) { + const ogerponForm = this.species.speciesId === Species.OGERPON ? this.formIndex : this.fusionFormIndex; + switch (ogerponForm) { + case 0: + case 4: + return Type.GRASS; + case 1: + case 5: + return Type.WATER; + case 2: + case 6: + return Type.FIRE; + case 3: + case 7: + return Type.ROCK; + } + } else if (this.hasSpecies(Species.SHEDINJA)) { + return Type.BUG; } - const teraModifier = globalScene.findModifier(m => - m instanceof TerastallizeModifier - && m.pokemonId === this.id - && m.getBattlesLeft() > 0, this.isPlayer()) as TerastallizeModifier; - return teraModifier?.teraType ?? Type.UNKNOWN; - } - - public isTerastallized(): boolean { - return this.getTeraType() !== Type.UNKNOWN; + return this.teraType; } public isGrounded(): boolean { @@ -1748,7 +1780,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true, move?: Move): TypeDamageMultiplier { if (moveType === Type.STELLAR) { - return this.isTerastallized() ? 2 : 1; + return this.isTerastallized ? 2 : 1; } const types = this.getTypes(true, true); const arena = globalScene.arena; @@ -2785,11 +2817,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const matchesSourceType = sourceTypes.includes(moveType); /** A damage multiplier for when the attack is of the attacker's type and/or Tera type. */ const stabMultiplier = new Utils.NumberHolder(1); - if (matchesSourceType) { - stabMultiplier.value += 0.5; - } - applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { + if (matchesSourceType && moveType !== Type.STELLAR) { stabMultiplier.value += 0.5; } @@ -2797,6 +2825,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyAbAttrs(StabBoostAbAttr, source, null, simulated, stabMultiplier); } + applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); + + if (source.isTerastallized && sourceTeraType === moveType && moveType !== Type.STELLAR) { + stabMultiplier.value += 0.5; + } + + if (source.isTerastallized && source.teraType === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (matchesSourceType) { + stabMultiplier.value += 0.5; + } else { + stabMultiplier.value += 0.2; + } + } + stabMultiplier.value = Math.min(stabMultiplier.value, 2.25); /** Halves damage if the attacker is using a physical attack while burned */ @@ -3837,6 +3879,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + resetTera(): void { + const wasTerastallized = this.isTerastallized; + this.isTerastallized = false; + this.stellarTypesBoosted = []; + if (wasTerastallized) { + this.updateSpritePipelineData(); + globalScene.triggerPokemonFormChange(this, SpeciesFormChangeLapseTeraTrigger); + } + } + resetTurnData(): void { this.turnData = new PokemonTurnData(); } @@ -4600,6 +4652,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; + newPokemon.fusionTeraType = this.teraType; newPokemon.usedTMs = this.usedTMs; globalScene.getPlayerParty().push(newPokemon); @@ -4751,6 +4804,7 @@ export class EnemyPokemon extends Pokemon { public aiType: AiType; public bossSegments: number; public bossSegmentIndex: number; + public initialTeamIndex: number; /** To indicate if the instance was populated with a dataSource -> e.g. loaded & populated from session data */ public readonly isPopulatedFromDataSource: boolean; @@ -4760,6 +4814,7 @@ export class EnemyPokemon extends Pokemon { undefined, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; + this.initialTeamIndex = globalScene.currentBattle?.enemyParty.length ?? 0; this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource if (boss) { this.setBoss(boss, dataSource?.bossSegments); diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 65bca641163..5bce08afae6 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -11,7 +11,8 @@ import { TrainerSlot, trainerConfigs, trainerPartyTemplates, - signatureSpecies + signatureSpecies, + TeraAIMode } from "#app/data/trainer-config"; import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; @@ -36,6 +37,7 @@ export default class Trainer extends Phaser.GameObjects.Container { public partyTemplateIndex: number; public name: string; public partnerName: string; + public originalIndexes: { [key: number]: number } = {}; constructor(trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: number, name?: string, partnerName?: string, trainerConfigOverride?: TrainerConfig) { super(globalScene, -72, 80); @@ -546,6 +548,13 @@ export default class Trainer extends Phaser.GameObjects.Container { return []; } + genAI(party: EnemyPokemon[]) { + if (this.config.genAIFuncs) { + this.config.genAIFuncs.forEach(f => f(party)); + } + console.log("Generated AI funcs"); + } + loadAssets(): Promise { return this.config.loadAssets(this.variant); } @@ -667,4 +676,13 @@ export default class Trainer extends Phaser.GameObjects.Container { } }); } + + shouldTera(pokemon: EnemyPokemon): boolean { + if (this.config.trainerAI.teraMode === TeraAIMode.INSTANT_TERA) { + if (!pokemon.isTerastallized && this.config.trainerAI.instantTeras.includes(pokemon.initialTeamIndex)) { + return true; + } + } + return false; + } } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index e8f817c1c39..fc685fc2332 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -103,6 +103,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); + this.loadAtlas("button_tera", "ui"); this.loadImage("mystery_egg", "ui"); this.loadImage("normal_memory", "ui"); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index da2ab49e9fc..35ed75d8c6e 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -11,7 +11,7 @@ import { Type } from "#enums/type"; import type { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; +import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerrastalizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; import { Unlockables } from "#app/system/unlockables"; @@ -19,7 +19,7 @@ import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import PartyUiHandler from "#app/ui/party-ui-handler"; import { getModifierTierTextTint } from "#app/ui/text"; -import { formatMoney, getEnumKeys, getEnumValues, isNullOrUndefined, NumberHolder, padInt, randSeedInt, randSeedItem } from "#app/utils"; +import { formatMoney, getEnumKeys, getEnumValues, isNullOrUndefined, NumberHolder, padInt, randSeedInt } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -275,6 +275,36 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { } } + +export class TerastallizeModifierType extends PokemonModifierType { + private teraType: Type; + + constructor(teraType: Type) { + super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + (pokemon: PlayerPokemon) => { + if ([ pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length > 0) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }, + "tera_shard"); + + this.teraType = teraType; + } + + get name(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + } + + getDescription(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + } + + getPregenArgs(): any[] { + return [ this.teraType ]; + } +} + export class PokemonHpRestoreModifierType extends PokemonModifierType { protected restorePoints: number; protected restorePercent: number; @@ -1192,28 +1222,6 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } } -export class TerastallizeModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - private teraType: Type; - - constructor(teraType: Type) { - super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), "tera_shard"); - - this.teraType = teraType; - } - - get name(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getDescription(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getPregenArgs(): any[] { - return [ this.teraType ]; - } -} - export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemModifierType { private chancePercent: number; @@ -1469,14 +1477,21 @@ export const modifierTypes = { if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { return null; } - let type: Type; - if (!randSeedInt(3)) { - const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat(); - type = randSeedItem(partyMemberTypes); - } else { - type = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + const teraTypes: Type[] = []; + party.forEach(p => { + if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { + teraTypes.push(p.teraType); + } + }); + let excludedType = Type.UNKNOWN; + if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { + excludedType = teraTypes[0]; } - return new TerastallizeModifierType(type); + let shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + while (shardType === excludedType) { + shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + } + return new TerastallizeModifierType(shardType); }), BERRY: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { @@ -1719,7 +1734,7 @@ const modifierPool: ModifierPool = { return Math.min(Math.ceil(highestPartyLevel / 20), 4); }, 4), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - new WeightedModifierType(modifierTypes.TERA_SHARD, 1), + new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) => party.filter(p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))).length > 0 ? 1 : 0), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => { if (party.filter(p => !p.fusionSpecies).length > 1) { if (globalScene.gameMode.isSplicedOnly) { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index d955385ecee..fe61eadaccd 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -3,16 +3,16 @@ import { getBerryEffectFunc, getBerryPredicate } from "#app/data/berry"; import { getLevelTotalExp } from "#app/data/exp"; import { allMoves } from "#app/data/move"; import { MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; -import { type FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { type FormChangeItem, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; -import Pokemon, { type PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; import { EvolutionPhase } from "#app/phases/evolution-phase"; import { LearnMovePhase, LearnMoveType } from "#app/phases/learn-move-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { achvs } from "#app/system/achv"; import type { VoucherType } from "#app/system/voucher"; import { Command } from "#app/ui/command-ui-handler"; import { addTextObject, TextStyle } from "#app/ui/text"; @@ -25,7 +25,7 @@ import type { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import { Type } from "#enums/type"; +import type { Type } from "#enums/type"; import i18next from "i18next"; import { type DoubleBattleChanceBoosterModifierType, type EvolutionItemModifierType, type FormChangeItemModifierType, type ModifierOverride, type ModifierType, type PokemonBaseStatTotalModifierType, type PokemonExpBoosterModifierType, type PokemonFriendshipBoosterModifierType, type PokemonMoveAccuracyBoosterModifierType, type PokemonMultiHitModifierType, type TerastallizeModifierType, type TmModifierType, getModifierType, ModifierPoolType, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType } from "./modifier-type"; import { Color, ShadowColor } from "#enums/color"; @@ -786,72 +786,6 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi } } -export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { - public override type: TerastallizeModifierType; - public teraType: Type; - public isTransferable: boolean = false; - - constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type, battlesLeft?: number, stackCount?: number) { - super(type, pokemonId, battlesLeft || 10, stackCount); - - this.teraType = teraType; - } - - matchType(modifier: Modifier): boolean { - if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) { - return true; - } - return false; - } - - clone(): TerastallizeModifier { - return new TerastallizeModifier(this.type, this.pokemonId, this.teraType, this.battlesLeft, this.stackCount); - } - - getArgs(): any[] { - return [ this.pokemonId, this.teraType, this.battlesLeft ]; - } - - /** - * Applies the {@linkcode TerastallizeModifier} to the specified {@linkcode Pokemon}. - * @param pokemon the {@linkcode Pokemon} to be terastallized - * @returns always `true` - */ - override apply(pokemon: Pokemon): boolean { - if (pokemon.isPlayer()) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger); - globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.teraType === Type.STELLAR) { - globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); - } - } - pokemon.updateSpritePipelineData(); - return true; - } - - /** - * Triggers {@linkcode LapsingPokemonHeldItemModifier.lapse} and if it returns `0` a form change is triggered. - * @param pokemon THe {@linkcode Pokemon} to be terastallized - * @returns the result of {@linkcode LapsingPokemonHeldItemModifier.lapse} - */ - public override lapse(pokemon: Pokemon): boolean { - const ret = super.lapse(pokemon); - if (!ret) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger); - pokemon.updateSpritePipelineData(); - } - return ret; - } - - getScoreMultiplier(): number { - return 1.25; - } - - getMaxHeldItemCount(pokemon: Pokemon): number { - return 1; - } -} - /** * Modifier used for held items, specifically vitamins like Carbos, Hp Up, etc., that * increase the value of a given {@linkcode PermanentStat}. @@ -2022,6 +1956,36 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { } } +export class TerrastalizeModifier extends ConsumablePokemonModifier { + public override type: TerastallizeModifierType; + public teraType: Type; + + constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type) { + super(type, pokemonId); + + this.teraType = teraType; + } + + /** + * Checks if {@linkcode TerrastalizeModifier} should be applied + * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if the {@linkcode TerrastalizeModifier} should be applied + */ + override shouldApply(playerPokemon?: PlayerPokemon): boolean { + return super.shouldApply(playerPokemon) && [ playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length === 0; + } + + /** + * Applies {@linkcode TerrastalizeModifier} + * @param pokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if hp was restored + */ + override apply(pokemon: Pokemon): boolean { + pokemon.teraType = this.teraType; + return true; + } +} + export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { private restorePoints: number; private restorePercent: number; diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 632344be335..411022a84b4 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -118,6 +118,7 @@ export class CommandPhase extends FieldPhase { let success: boolean = false; switch (command) { + case Command.TERA: case Command.FIGHT: let useStruggle = false; const turnMove: TurnMove | undefined = (args.length === 2 ? (args[1] as TurnMove) : undefined); @@ -137,6 +138,7 @@ export class CommandPhase extends FieldPhase { } const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: 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 ]; @@ -152,6 +154,7 @@ export class CommandPhase extends FieldPhase { } else { globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } + globalScene.currentBattle.preTurnCommands[this.fieldIndex] = preTurnCommand; globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; success = true; } else if (cursor < playerPokemon.getMoveset().length) { diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts index e76518bb71e..429674e7786 100644 --- a/src/phases/enemy-command-phase.ts +++ b/src/phases/enemy-command-phase.ts @@ -81,6 +81,10 @@ export class EnemyCommandPhase extends FieldPhase { /** Select a move to use (and a target to use it against, if applicable) */ const nextMove = enemyPokemon.getNextMove(); + if (trainer && trainer.shouldTera(enemyPokemon)) { + globalScene.currentBattle.preTurnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.TERA }; + } + globalScene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.FIGHT, move: nextMove, skip: this.skipTurn }; diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 12d2923ec36..ea857cac8ba 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -116,7 +116,7 @@ export class EvolutionPhase extends Phase { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); sprite.setPipelineData("shiny", this.pokemon.shiny); diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 340c5362087..f354bc8031e 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -108,6 +108,8 @@ export class FaintPhase extends PokemonPhase { globalScene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + pokemon.resetTera(); + if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, globalScene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 35fe446fc43..65d8d95cde6 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -450,6 +450,12 @@ export class MoveEffectPhase extends PokemonPhase { target.lapseTag(BattlerTagType.SUBSTITUTE); } }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + this.end(); }); }); diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index 2c1a6c33163..c87c5d00be5 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -36,5 +36,6 @@ export class PartyHealPhase extends BattlePhase { globalScene.ui.fadeIn(500).then(() => this.end()); }); }); + globalScene.arena.playerTerasUsed = 0; } } diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 185156a20c7..6cd1129d318 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import { SemiInvulnerableTag } from "#app/data/battler-tags"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; -import { getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; +import { getSpeciesFormChangeMessage, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; import { getTypeRgb } from "#app/data/type"; import { BattleSpec } from "#app/enums/battle-spec"; import { BattlerTagType } from "#app/enums/battler-tag-type"; @@ -11,6 +11,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; +import { applyAbAttrs, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; @@ -51,7 +52,7 @@ export class QuietFormChangePhase extends BattlePhase { } catch (err: unknown) { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); [ "spriteColors", "fusionSpriteColors" ].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; @@ -145,6 +146,9 @@ export class QuietFormChangePhase extends BattlePhase { movePhase.cancel(); } } + if (this.formChange.trigger instanceof SpeciesFormChangeTeraTrigger) { + applyAbAttrs(PostTeraFormChangeStatChangeAbAttr, this.pokemon, null); + } super.end(); } diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts new file mode 100644 index 00000000000..f4b72d39192 --- /dev/null +++ b/src/phases/tera-phase.ts @@ -0,0 +1,51 @@ +import type Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BattlePhase } from "./battle-phase"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; +import { Type } from "#app/enums/type"; +import { achvs } from "#app/system/achv"; +import { SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; + +export class TeraPhase extends BattlePhase { + public pokemon: Pokemon; + + constructor(pokemon: Pokemon) { + super(); + + this.pokemon = pokemon; + } + + start() { + super.start(); + + console.log(this.pokemon.name, "terastallized to", Type[this.pokemon.teraType].toString()); + + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.teraType]}`) })); + new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { + this.end(); + }); + } + + + end() { + this.pokemon.isTerastallized = true; + this.pokemon.updateSpritePipelineData(); + + if (this.pokemon.isPlayer()) { + globalScene.arena.playerTerasUsed += 1; + } + + globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangeTeraTrigger); + + if (this.pokemon.isPlayer()) { + globalScene.validateAchv(achvs.TERASTALLIZE); + if (this.pokemon.teraType === Type.STELLAR) { + globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); + } + } + + super.end(); + } +} diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index c64d7ddf526..c6d145e1a4c 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -21,6 +21,7 @@ import { BattlerIndex } from "#app/battle"; import { TrickRoomTag } from "#app/data/arena-tag"; import { SwitchType } from "#enums/switch-type"; import { globalScene } from "#app/global-scene"; +import { TeraPhase } from "./tera-phase"; export class TurnStartPhase extends FieldPhase { constructor() { @@ -139,6 +140,20 @@ export class TurnStartPhase extends FieldPhase { let orderIndex = 0; + for (const o of this.getSpeedOrder()) { + const pokemon = field[o]; + const preTurnCommand = globalScene.currentBattle.preTurnCommands[o]; + + if (preTurnCommand?.skip) { + continue; + } + + switch (preTurnCommand?.command) { + case Command.TERA: + globalScene.pushPhase(new TeraPhase(pokemon)); + } + } + for (const o of moveOrder) { const pokemon = field[o]; diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 67639d6450a..90c0e65d25c 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -351,7 +351,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const data = sprite.pipelineData; const tone = data["tone"] as number[]; - const teraColor = data["teraColor"] as number[] ?? [ 0, 0, 0 ]; + const teraColor = (data["isTerastallized"] as boolean) ? (data["teraColor"] as number[] ?? [ 0, 0, 0 ]) : [ 0, 0, 0 ]; const hasShadow = data["hasShadow"] as boolean; const yShadowOffset = data["yShadowOffset"] as number; const ignoreFieldPos = data["ignoreFieldPos"] as boolean; diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 98ab611ff3c..518acb55c89 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -10,12 +10,14 @@ export default class ArenaData { public weather: Weather | null; public terrain: Terrain | null; public tags: ArenaTag[]; + public playerTerasUsed: number; constructor(source: Arena | any) { const sourceArena = source instanceof Arena ? source as Arena : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.playerTerasUsed = (sourceArena ? sourceArena.playerTerasUsed : source.playerTerasUsed) ?? 0; this.tags = []; if (source.tags) { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index c16fab9db04..63d79d47fba 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1087,6 +1087,8 @@ export class GameData { globalScene.arena.terrain = sessionData.arena.terrain; globalScene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, globalScene.arena.terrain?.terrainType!, globalScene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.playerTerasUsed = sessionData.arena.playerTerasUsed; + globalScene.arena.tags = sessionData.arena.tags; if (globalScene.arena.tags) { for (const tag of globalScene.arena.tags) { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 6459bb5033d..20507860e4e 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -13,6 +13,7 @@ import type { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import type { Type } from "#app/enums/type"; export default class PokemonData { public id: number; @@ -45,6 +46,9 @@ export default class PokemonData { public pokerus: boolean; public usedTMs: Moves[]; public evoCounter: number; + public teraType: Type; + public isTerastallized: boolean; + public stellarTypesBoosted: Type[]; public fusionSpecies: Species; public fusionFormIndex: number; @@ -53,6 +57,7 @@ export default class PokemonData { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: number; + public fusionTeraType: Type; public boss: boolean; public bossSegments?: number; @@ -103,6 +108,9 @@ export default class PokemonData { this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; + this.teraType = source.teraType as Type; + this.isTerastallized = source.isTerastallized || false; + this.stellarTypesBoosted = source.stellarTypesBoosted || []; this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; @@ -112,6 +120,7 @@ export default class PokemonData { this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); + this.fusionTeraType = (source.fusionTeraType ?? 0) as Type; this.usedTMs = source.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(source.customPokemonData); diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index aee84805143..95537461768 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -7,6 +7,9 @@ import * as v1_0_4 from "./versions/v1_0_4"; // --- v1.1.0 PATCHES --- // import * as v1_1_0 from "./versions/v1_1_0"; +// --- v1.7.0 PATCHES --- // +import * as v1_7_0 from "./versions/v1_7_0"; + const LATEST_VERSION = version.split(".").map(value => parseInt(value)); /** @@ -138,6 +141,10 @@ class SessionVersionConverter extends VersionConverter { console.log("Applying v1.1.0 session data migration!"); this.callMigrators(data, v1_1_0.sessionMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.sessionMigrators); + } } console.log(`Session data successfully migrated to v${version}!`); @@ -164,6 +171,10 @@ class SystemVersionConverter extends VersionConverter { console.log("Applying v1.1.0 system data migraton!"); this.callMigrators(data, v1_1_0.systemMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.systemMigrators); + } } console.log(`System data successfully migrated to v${version}!`); @@ -190,6 +201,10 @@ class SettingsVersionConverter extends VersionConverter { console.log("Applying v1.1.0 settings data migraton!"); this.callMigrators(data, v1_1_0.settingsMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.settingsMigrators); + } } console.log(`System data successfully migrated to v${version}!`); diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts new file mode 100644 index 00000000000..2acb9d8151a --- /dev/null +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -0,0 +1,49 @@ +import { getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import type { SessionSaveData } from "#app/system/game-data"; +import * as Utils from "#app/utils"; + +export const systemMigrators = [] as const; + +export const settingsMigrators = [] as const; + +export const sessionMigrators = [ + function migrateTera(data: SessionSaveData) { + for (let i = 0; i < data.modifiers.length;) { + if (data.modifiers[i].className === "TerastallizeModifier") { + data.party.forEach((p) => { + if (p.id === data.modifiers[i].args[0]) { + p.teraType = data.modifiers[i].args[1]; + } + }); + data.modifiers.splice(i, 1); + } else { + i++; + } + } + + for (let i = 0; i < data.enemyModifiers.length;) { + if (data.enemyModifiers[i].className === "TerastallizeModifier") { + data.enemyParty.forEach((p) => { + if (p.id === data.enemyModifiers[i].args[0]) { + p.teraType = data.enemyModifiers[i].args[1]; + } + }); + data.enemyModifiers.splice(i, 1); + } else { + i++; + } + } + + data.party.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + + data.enemyParty.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + } +] as const; diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 42627da51a3..f6e85979c69 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -11,7 +11,7 @@ import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; describe("Abilities - Libero", () => { @@ -258,7 +258,7 @@ describe("Abilities - Libero", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); + leadPokemon.isTerastallized = true; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 787834f8a9d..c7d04b9e1c8 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -11,7 +11,7 @@ import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; describe("Abilities - Protean", () => { @@ -258,7 +258,7 @@ describe("Abilities - Protean", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); + leadPokemon.isTerastallized = true; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts index c78416b1237..09c94c740cc 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/src/test/moves/effectiveness.test.ts @@ -6,7 +6,6 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; -import { TerastallizeModifier, overrideHeldItems } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; @@ -15,15 +14,14 @@ function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Sp expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); - game.override - .enemyAbility(targetAbility) - .enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); + game.override.enemyAbility(targetAbility); const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); if (teraType !== undefined) { - overrideHeldItems(target, false); + target.teraType = teraType; + target.isTerastallized = true; } expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); @@ -40,7 +38,6 @@ describe("Moves - Type Effectiveness", () => { type: Phaser.HEADLESS, }); game = new GameManager(phaserGame); - TerastallizeModifier.prototype.apply = (args) => true; game.override.ability(Abilities.BALL_FETCH); }); diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts index 9206a103a35..f207e297191 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/src/test/moves/freeze_dry.test.ts @@ -117,11 +117,12 @@ describe("Moves - Freeze-Dry", () => { }); it("should deal 2x damage to steel type terastallized into water", async () => { - game.override.enemySpecies(Species.SKARMORY) - .enemyHeldItems([{ name: "TERA_SHARD", type: Type.WATER }]); + game.override.enemySpecies(Species.SKARMORY); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.WATER; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); @@ -132,11 +133,12 @@ describe("Moves - Freeze-Dry", () => { }); it("should deal 0.5x damage to water type terastallized into fire", async () => { - game.override.enemySpecies(Species.PELIPPER) - .enemyHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]); + game.override.enemySpecies(Species.PELIPPER); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.FIRE; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); diff --git a/src/test/moves/tar_shot.test.ts b/src/test/moves/tar_shot.test.ts index 5fb70abc19c..66f540e4f9f 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/src/test/moves/tar_shot.test.ts @@ -83,10 +83,12 @@ describe("Moves - Tar Shot", () => { }); it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => { - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]).enemySpecies(Species.SPRIGATITO); + game.override.enemySpecies(Species.SPRIGATITO); await game.classicMode.startBattle([ Species.PIKACHU ]); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.GRASS; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -119,7 +121,8 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]); + enemy.teraType = Type.GRASS; + enemy.isTerastallized = true; game.move.select(Moves.FIRE_PUNCH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index 34d171b47bb..08e401ef9d1 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -35,7 +35,6 @@ describe("Moves - Tera Blast", () => { .starterSpecies(Species.FEEBAS) .moveset([ Moves.TERA_BLAST ]) .ability(Abilities.BALL_FETCH) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.STURDY) @@ -45,13 +44,15 @@ describe("Moves - Tera Blast", () => { }); it("changes type to match user's tera type", async () => { - game.override - .enemySpecies(Species.FURRET) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIGHTING }]); + game.override.enemySpecies(Species.FURRET); await game.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "apply"); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.FIGHTING; + playerPokemon.isTerastallized = true; + game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -60,10 +61,12 @@ describe("Moves - Tera Blast", () => { }, 20000); it("increases power if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - await game.startBattle(); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; + game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -72,13 +75,15 @@ describe("Moves - Tera Blast", () => { }, 20000); it("is super effective against terastallized targets if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - await game.startBattle(); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; + const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "apply"); - vi.spyOn(enemyPokemon, "isTerastallized").mockReturnValue(true); + enemyPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); @@ -93,6 +98,7 @@ describe("Moves - Tera Blast", () => { const playerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.stats[Stat.ATK] = 100; playerPokemon.stats[Stat.SPATK] = 1; + playerPokemon.isTerastallized = true; vi.spyOn(teraBlastAttr, "apply"); @@ -169,10 +175,11 @@ describe("Moves - Tera Blast", () => { it("causes stat drops if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); diff --git a/src/test/moves/tera_starstorm.test.ts b/src/test/moves/tera_starstorm.test.ts index 22dd5b3c4d1..1e934b88c86 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/src/test/moves/tera_starstorm.test.ts @@ -29,8 +29,7 @@ describe("Moves - Tera Starstorm", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemyLevel(30) - .enemySpecies(Species.MAGIKARP) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]); + .enemySpecies(Species.MAGIKARP); }); it("changes type to Stellar when used by Terapagos in its Stellar Form", async () => { @@ -38,19 +37,22 @@ describe("Moves - Tera Starstorm", () => { await game.classicMode.startBattle([ Species.TERAPAGOS ]); const terapagos = game.scene.getPlayerPokemon()!; + terapagos.isTerastallized = true; vi.spyOn(terapagos, "getMoveType"); game.move.select(Moves.TERA_STARSTORM); await game.phaseInterceptor.to("TurnEndPhase"); - expect(terapagos.isTerastallized()).toBe(true); expect(terapagos.getMoveType).toHaveReturnedWith(Type.STELLAR); }); it("targets both opponents in a double battle when used by Terapagos in its Stellar Form", async () => { await game.classicMode.startBattle([ Species.MAGIKARP, Species.TERAPAGOS ]); + const terapagos = game.scene.getPlayerParty()[1]; + terapagos.isTerastallized = true; + game.move.select(Moves.TERA_STARSTORM, 0, BattlerIndex.ENEMY); game.move.select(Moves.TERA_STARSTORM, 1); @@ -82,6 +84,8 @@ describe("Moves - Tera Starstorm", () => { fusionedMon.fusionGender = magikarp.gender; fusionedMon.fusionLuck = magikarp.luck; + fusionedMon.isTerastallized = true; + vi.spyOn(fusionedMon, "getMoveType"); game.move.select(Moves.TERA_STARSTORM, 0); @@ -90,7 +94,6 @@ describe("Moves - Tera Starstorm", () => { // Fusion and terastallized expect(fusionedMon.isFusion()).toBe(true); - expect(fusionedMon.isTerastallized()).toBe(true); // Move effects should be applied expect(fusionedMon.getMoveType).toHaveReturnedWith(Type.STELLAR); expect(game.scene.getEnemyField().every(pokemon => pokemon.isFullHp())).toBe(false); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index fa8767f5eb0..ab7f76daf0b 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -324,9 +324,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastTeraType = pokemon.getTeraType(); this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2); - this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); + this.teraIcon.setVisible(pokemon.isTerastallized); this.teraIcon.on("pointerover", () => { - if (this.lastTeraType !== Type.UNKNOWN) { + if (pokemon.isTerastallized) { globalScene.ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) })); } }); @@ -542,7 +542,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } - const teraType = pokemon.getTeraType(); + const teraType = pokemon.isTerastallized ? pokemon.getTeraType() : Type.UNKNOWN; const teraTypeUpdated = this.lastTeraType !== teraType; if (teraTypeUpdated) { diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index de75f29ff6f..f23cc78c9f7 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -7,18 +7,24 @@ import { Button } from "#enums/buttons"; import { getPokemonNameWithAffix } from "#app/messages"; import { CommandPhase } from "#app/phases/command-phase"; import { globalScene } from "#app/global-scene"; +import { TerastallizeAccessModifier } from "#app/modifier/modifier"; +import { Type } from "#app/enums/type"; +import { getTypeRgb } from "#app/data/type"; export enum Command { FIGHT = 0, BALL, POKEMON, - RUN + RUN, + TERA } export default class CommandUiHandler extends UiHandler { private commandsContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image | null; + private teraButton: Phaser.GameObjects.Sprite; + protected fieldIndex: number = 0; protected cursor2: number = 0; @@ -40,6 +46,13 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); + this.teraButton = globalScene.add.sprite(-32, 15, "button_tera"); + this.teraButton.setName("terrastallize-button"); + this.teraButton.setScale(1.3); + this.teraButton.setFrame("fire"); + this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(Type.FIRE), isTerastallized: false }); + this.commandsContainer.add(this.teraButton); + for (let c = 0; c < commands.length; c++) { const commandText = addTextObject(c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); commandText.setName(commands[c]); @@ -62,11 +75,22 @@ export default class CommandUiHandler extends UiHandler { commandPhase = globalScene.getStandbyPhase() as CommandPhase; } + if (this.canTera()) { + this.teraButton.setVisible(true); + this.teraButton.setFrame(Type[globalScene.getField()[this.fieldIndex].getTeraType()].toLowerCase()); + } else { + this.teraButton.setVisible(false); + if (this.cursor === Command.TERA) { + this.setCursor(Command.FIGHT); + } + } + this.toggleTeraButton(); + const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); - messageHandler.message.setWordWrapWidth(1110); + messageHandler.message.setWordWrapWidth(this.canTera() ? 910 : 1110); messageHandler.showText(i18next.t("commandUiHandler:actionMessage", { pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()) }), 0); if (this.getCursor() === Command.POKEMON) { this.setCursor(Command.FIGHT); @@ -108,6 +132,10 @@ export default class CommandUiHandler extends UiHandler { (globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); success = true; break; + case Command.TERA: + ui.setMode(Mode.FIGHT, (globalScene.getCurrentPhase() as CommandPhase).getFieldIndex(), Command.TERA); + success = true; + break; } } else { (globalScene.getCurrentPhase() as CommandPhase).cancel(); @@ -115,23 +143,29 @@ export default class CommandUiHandler extends UiHandler { } else { switch (button) { case Button.UP: - if (cursor >= 2) { + if (cursor === Command.POKEMON || cursor === Command.RUN) { success = this.setCursor(cursor - 2); } break; case Button.DOWN: - if (cursor < 2) { + if (cursor === Command.FIGHT || cursor === Command.BALL) { success = this.setCursor(cursor + 2); } break; case Button.LEFT: - if (cursor % 2 === 1) { + if (cursor === Command.BALL || cursor === Command.RUN) { success = this.setCursor(cursor - 1); + } else if ((cursor === Command.FIGHT || cursor === Command.POKEMON) && this.canTera()) { + success = this.setCursor(Command.TERA); + this.toggleTeraButton(); } break; case Button.RIGHT: - if (cursor % 2 === 0) { + if (cursor === Command.FIGHT || cursor === Command.POKEMON) { success = this.setCursor(cursor + 1); + } else if (cursor === Command.TERA) { + success = this.setCursor(Command.FIGHT); + this.toggleTeraButton(); } break; } @@ -144,6 +178,17 @@ export default class CommandUiHandler extends UiHandler { return success; } + canTera(): boolean { + const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; + const currentTeras = globalScene.arena.playerTerasUsed; + const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; + return hasTeraMod && (currentTeras + plannedTera) < 1; + } + + toggleTeraButton() { + this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(globalScene.getField()[this.fieldIndex].getTeraType()), isTerastallized: this.getCursor() === Command.TERA }); + } + getCursor(): number { return !this.fieldIndex ? this.cursor : this.cursor2; } @@ -163,7 +208,12 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.add(this.cursorObj); } - this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + if (cursor === Command.TERA) { + this.cursorObj.setVisible(false); + } else { + this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + this.cursorObj.setVisible(true); + } return changed; } diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 72fb90066e7..1c1dceb24a5 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -33,6 +33,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { private moveInfoOverlay : MoveInfoOverlay; protected fieldIndex: number = 0; + protected fromCommand: Command = Command.FIGHT; protected cursor2: number = 0; constructor() { @@ -114,6 +115,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { super.show(args); this.fieldIndex = args.length ? args[0] as number : 0; + this.fromCommand = args.length > 1 ? args[1] as Command : Command.FIGHT; const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(false); @@ -140,7 +142,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - if ((globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, cursor, false)) { + if ((globalScene.getCurrentPhase() as CommandPhase).handleCommand(this.fromCommand, cursor, false)) { success = true; } else { ui.playError(); diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 02bcba17a73..bf07374e21a 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -420,17 +420,6 @@ export default class RunInfoUiHandler extends UiHandler { private parseTrainerDefeat(enemyContainer: Phaser.GameObjects.Container) { // Loads and adds trainer sprites to the UI this.showTrainerSprites(enemyContainer); - // Determining which Terastallize Modifier belongs to which Pokemon - // Creates a dictionary {PokemonId: TeraShardType} - const teraPokemon = {}; - this.runInfo.enemyModifiers.forEach((m) => { - const modifier = m.toModifier(this.modifiersModule[m.className]); - if (modifier instanceof Modifier.TerastallizeModifier) { - const teraDetails = modifier?.getArgs(); - const pkmnId = teraDetails[0]; - teraPokemon[pkmnId] = teraDetails[1]; - } - }); // Creates the Pokemon icons + level information and adds it to enemyContainer // 2 Rows x 3 Columns @@ -444,18 +433,6 @@ export default class RunInfoUiHandler extends UiHandler { enemyData["player"] = true; const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); - // Applying Terastallizing Type tint to Pokemon icon - // If the Pokemon is a fusion, it has two sprites and so, the tint has to be applied to each icon separately - const enemySprite1 = enemyIcon.list[0] as Phaser.GameObjects.Sprite; - const enemySprite2 = (enemyIcon.list.length > 1) ? enemyIcon.list[1] as Phaser.GameObjects.Sprite : undefined; - if (teraPokemon[enemyData.id]) { - const teraTint = getTypeRgb(teraPokemon[enemyData.id]); - const teraColor = new Phaser.Display.Color(teraTint[0], teraTint[1], teraTint[2]); - enemySprite1.setTint(teraColor.color); - if (enemySprite2) { - enemySprite2.setTint(teraColor.color); - } - } enemyIcon.setPosition(39 * (e % 3) + 5, (35 * pokemonRowHeight)); const enemyLevel = addTextObject(43 * (e % 3), (27 * (pokemonRowHeight + 1)), `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "54px" }); enemyLevel.setShadow(0, 0, undefined); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index cf5d40bc006..1526ae982e5 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -334,6 +334,7 @@ export default class SummaryUiHandler extends UiHandler { 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.shiny); @@ -782,7 +783,7 @@ export default class SummaryUiHandler extends UiHandler { if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon?.isTerastallized()) { + if (this.pokemon?.isTerastallized) { profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); } From 4361aa089ba5af9f2ac0e3400e50937475b09c84 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:31:46 -0600 Subject: [PATCH 044/171] [Refactor] Replace integer holder with number holder (#5350) * Replace integer holder with number holder * Remove duplicate NumberHolder --------- Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/battle-scene.ts | 4 +- src/battle.ts | 2 +- src/data/ability.ts | 10 ++--- src/data/challenge.ts | 32 ++++++++-------- src/data/move.ts | 38 +++++++++---------- .../encounters/safari-zone-encounter.ts | 4 +- .../encounters/weird-dream-encounter.ts | 4 +- src/field/pokemon.ts | 14 +++---- src/modifier/modifier-type.ts | 4 +- src/phases/money-reward-phase.ts | 2 +- src/phases/pokemon-heal-phase.ts | 2 +- src/phases/select-modifier-phase.ts | 2 +- src/test/achievements/achievement.test.ts | 4 +- src/ui/modifier-select-ui-handler.ts | 4 +- src/utils.ts | 7 ---- 15 files changed, 64 insertions(+), 69 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 4033f44eacb..c7e3d4bc928 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1212,7 +1212,7 @@ export default class BattleScene extends SceneBase { } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); + const doubleChance = new Utils.NumberHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); return Math.max(doubleChance.value, 1); @@ -2628,7 +2628,7 @@ export default class BattleScene extends SceneBase { const args: unknown[] = []; if (modifier instanceof PokemonHpRestoreModifier) { if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); + const hpRestoreMultiplier = new Utils.NumberHolder(1); this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); args.push(hpRestoreMultiplier.value); } else { diff --git a/src/battle.ts b/src/battle.ts index 807ac215ea8..242954a3729 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -203,7 +203,7 @@ export default class Battle { } pickUpScatteredMoney(): void { - const moneyAmount = new Utils.IntegerHolder(globalScene.currentBattle.moneyScattered); + const moneyAmount = new Utils.NumberHolder(globalScene.currentBattle.moneyScattered); globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); if (globalScene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { diff --git a/src/data/ability.ts b/src/data/ability.ts index 6ba5f685acd..bf3b04e1f63 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3115,7 +3115,7 @@ export class ChangeMovePriorityAbAttr extends AbAttr { return false; } - (args[1] as Utils.IntegerHolder).value += this.changeAmount; + (args[1] as Utils.NumberHolder).value += this.changeAmount; return true; } } @@ -3957,7 +3957,7 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { } override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value *= this.multiplier; + (args[0] as Utils.NumberHolder).value *= this.multiplier; return true; } @@ -4058,7 +4058,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { export class RunSuccessAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 256; + (args[0] as Utils.NumberHolder).value = 256; return true; } @@ -4128,7 +4128,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { export class MaxMultiHitAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 0; + (args[0] as Utils.NumberHolder).value = 0; return true; } @@ -4259,7 +4259,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { export class RedirectMoveAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.canRedirect(args[0] as Moves)) { - const target = args[1] as Utils.IntegerHolder; + const target = args[1] as Utils.NumberHolder; const newTarget = pokemon.getBattlerIndex(); if (target.value !== newTarget) { target.value = newTarget; diff --git a/src/data/challenge.ts b/src/data/challenge.ts index b6d123ce933..c6e85be2389 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -349,23 +349,23 @@ export abstract class Challenge { /** * An apply function for AI_LEVEL challenges. Derived classes should alter this. - * @param level {@link Utils.IntegerHolder} The generated level. + * @param level {@link Utils.NumberHolder} The generated level. * @param levelCap {@link Number} The current level cap. * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyLevelChange(level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { + applyLevelChange(level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { return false; } /** * An apply function for AI_MOVE_SLOTS challenges. Derived classes should alter this. * @param pokemon {@link Pokemon} The pokemon that is being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns {@link boolean} Whether this function did anything. */ - applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean { + applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean { return false; } @@ -393,10 +393,10 @@ export abstract class Challenge { * @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 Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns {@link boolean} Whether this function did anything. */ - applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { return false; } @@ -405,10 +405,10 @@ export abstract class Challenge { * @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 Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The base weight of the move + * @param weight {@link Utils.NumberHolder} The base weight of the move * @returns {@link boolean} Whether this function did anything. */ - applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { return false; } @@ -913,22 +913,22 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * Apply all challenges that modify what level AI are. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL - * @param level {@link Utils.IntegerHolder} The generated level of the pokemon. + * @param level {@link Utils.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(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; /** * Apply all challenges that modify how many move slots the AI has. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS * @param pokemon {@link Pokemon} The pokemon being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean; /** * Apply all challenges that modify whether a pokemon has its passive. * @param gameMode {@link GameMode} The current gameMode @@ -952,10 +952,10 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @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 Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean; /** * Apply all challenges that modify what weight a pokemon gives to move generation * @param gameMode {@link GameMode} The current gameMode @@ -963,10 +963,10 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @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 Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The weight of the move. + * @param weight {@link Utils.NumberHolder} The weight of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.NumberHolder): boolean; export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FLIP_STAT, pokemon: Pokemon, baseStats: number[]): boolean; diff --git a/src/data/move.ts b/src/data/move.ts index 7e504e87667..60c5690ae44 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -908,7 +908,7 @@ export class AttackMove extends Move { attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2; if (attackScore) { if (this.category === MoveCategory.PHYSICAL) { - const atk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.ATK, target)); + const atk = new Utils.NumberHolder(user.getEffectiveStat(Stat.ATK, target)); applyMoveAttrs(VariableAtkAttr, user, target, move, atk); if (atk.value > user.getEffectiveStat(Stat.SPATK, target)) { const statRatio = user.getEffectiveStat(Stat.SPATK, target) / atk.value; @@ -919,7 +919,7 @@ export class AttackMove extends Move { } } } else { - const spAtk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.SPATK, target)); + const spAtk = new Utils.NumberHolder(user.getEffectiveStat(Stat.SPATK, target)); applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk); if (spAtk.value > user.getEffectiveStat(Stat.ATK, target)) { const statRatio = user.getEffectiveStat(Stat.ATK, target) / spAtk.value; @@ -1337,7 +1337,7 @@ export class IgnoreOpponentStatStagesAttr extends MoveAttr { export class HighCritAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value++; + (args[0] as Utils.NumberHolder).value++; return true; } @@ -1369,7 +1369,7 @@ export class FixedDamageAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = this.getDamage(user, target, move); + (args[0] as Utils.NumberHolder).value = this.getDamage(user, target, move); return true; } @@ -1385,7 +1385,7 @@ export class UserHpDamageAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.hp; + (args[0] as Utils.NumberHolder).value = user.hp; return true; } @@ -1437,7 +1437,7 @@ export class MatchHpAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.hp - user.hp; + (args[0] as Utils.NumberHolder).value = target.hp - user.hp; return true; } @@ -1467,7 +1467,7 @@ export class CounterDamageAttr extends FixedDamageAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: number, ar: AttackMoveResult) => total + ar.damage, 0); - (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(damage * this.multiplier); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(damage * this.multiplier); return true; } @@ -1499,7 +1499,7 @@ export class RandomLevelDamageAttr extends FixedDamageAttr { export class ModifiedDamageAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const initialDamage = args[0] as Utils.IntegerHolder; + const initialDamage = args[0] as Utils.NumberHolder; initialDamage.value = this.getModifiedDamage(user, target, move, initialDamage.value); return true; @@ -2164,7 +2164,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { * @param user {@linkcode Pokemon} using this move * @param target {@linkcode Pokemon} target of this move * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} for move priority. + * @param args [0] {@linkcode Utils.NumberHolder} for move priority. * @returns true if function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2172,7 +2172,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { return false; } - (args[0] as Utils.IntegerHolder).value += this.increaseAmount; + (args[0] as Utils.NumberHolder).value += this.increaseAmount; return true; } } @@ -2210,7 +2210,7 @@ export class MultiHitAttr extends MoveAttr { * @param user {@linkcode Pokemon} that used the attack * @param target {@linkcode Pokemon} targeted by the attack * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} storing the hit count of the attack + * @param args [0] {@linkcode Utils.NumberHolder} storing the hit count of the attack * @returns True */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2277,7 +2277,7 @@ export class ChangeMultiHitTypeAttr extends MoveAttr { export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = MultiHitType._3; + (args[0] as Utils.NumberHolder).value = MultiHitType._3; return true; } return false; @@ -4118,7 +4118,7 @@ export class PresentPowerAttr extends VariablePowerAttr { export class WaterShurikenPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = 20; + (args[0] as Utils.NumberHolder).value = 20; return true; } return false; @@ -4140,7 +4140,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr { const stockpilingTag = user.getTag(StockpilingTag); if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { - const power = args[0] as Utils.IntegerHolder; + const power = args[0] as Utils.NumberHolder; power.value = this.multiplier * stockpilingTag.stockpiledCount; return true; } @@ -4449,7 +4449,7 @@ export class VariableAtkAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const atk = args[0] as Utils.IntegerHolder; + //const atk = args[0] as Utils.NumberHolder; return false; } } @@ -4459,7 +4459,7 @@ export class TargetAtkUserAtkAttr extends VariableAtkAttr { super(); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.ATK, target); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.ATK, target); return true; } } @@ -4470,7 +4470,7 @@ export class DefAtkAttr extends VariableAtkAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.getEffectiveStat(Stat.DEF, target); + (args[0] as Utils.NumberHolder).value = user.getEffectiveStat(Stat.DEF, target); return true; } } @@ -4481,7 +4481,7 @@ export class VariableDefAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const def = args[0] as Utils.IntegerHolder; + //const def = args[0] as Utils.NumberHolder; return false; } } @@ -4492,7 +4492,7 @@ export class DefDefAttr extends VariableDefAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.DEF, user); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.DEF, user); return true; } } diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index aa497e3c8fc..130c55c361e 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -10,7 +10,7 @@ import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifi import type { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#enums/pokeball"; import { PlayerGender } from "#enums/player-gender"; -import { IntegerHolder, randSeedInt } from "#app/utils"; +import { NumberHolder, randSeedInt } from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; @@ -279,7 +279,7 @@ async function summonSafariPokemon() { if (pokemon.species.abilityHidden) { const hiddenIndex = pokemon.species.ability2 ? 2 : 1; if (pokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); + const hiddenAbilityChance = new NumberHolder(256); globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index e047a7a4f01..f7c70cb7052 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -12,7 +12,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon"; -import { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; +import { NumberHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; @@ -452,7 +452,7 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new if (newPokemon.species.abilityHidden) { const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; if (newPokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); + const hiddenAbilityChance = new NumberHolder(256); globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index dfce632ab06..1377f11187b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -204,7 +204,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { throw `Cannot create a player Pokemon for species '${species.getName(formIndex)}'`; } - const hiddenAbilityChance = new Utils.IntegerHolder(BASE_HIDDEN_ABILITY_CHANCE); + const hiddenAbilityChance = new Utils.NumberHolder(BASE_HIDDEN_ABILITY_CHANCE); if (!this.hasTrainer()) { globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); } @@ -960,7 +960,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns the final critical-hit stage value */ getCritStage(source: Pokemon, move: Move): number { - const critStage = new Utils.IntegerHolder(0); + const critStage = new Utils.NumberHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critStage); globalScene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage); globalScene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage); @@ -1074,7 +1074,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const baseStats = this.calculateBaseStats(); // Using base stats, calculate and store stats one by one for (const s of PERMANENT_STATS) { - const statHolder = new Utils.IntegerHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); + const statHolder = new Utils.NumberHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); if (s === Stat.HP) { statHolder.value = statHolder.value + this.level + 10; globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); @@ -2567,7 +2567,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @return the stat stage multiplier to be used for effective stat calculation */ getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { - const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); + const statStage = new Utils.NumberHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); if (opponent) { @@ -2617,8 +2617,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return 1; } - const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC)); - const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA)); + const userAccStage = new Utils.NumberHolder(this.getStatStage(Stat.ACC)); + const targetEvaStage = new Utils.NumberHolder(target.getStatStage(Stat.EVA)); const ignoreAccStatStage = new Utils.BooleanHolder(false); const ignoreEvaStatStage = new Utils.BooleanHolder(false); @@ -2797,7 +2797,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** Doubles damage if this Pokemon's last move was Glaive Rush */ - const glaiveRushMultiplier = new Utils.IntegerHolder(1); + const glaiveRushMultiplier = new Utils.NumberHolder(1); if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { glaiveRushMultiplier.value = 2; } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 35ed75d8c6e..30ad287fd98 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1186,11 +1186,11 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { if (p.species.speciesId === Species.NECROZMA) { // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... - let foundULTRA_Z = false, foundN_LUNA = false, foundN_SOLAR = false; formChangeItemTriggers.forEach((fc, _i) => { + console.log("Checking ", fc.item); switch (fc.item) { case FormChangeItem.ULTRANECROZIUM_Z: foundULTRA_Z = true; @@ -1206,6 +1206,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. formChangeItemTriggers = formChangeItemTriggers.filter(fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z); + } else { + console.log("DID NOT FIND "); } } return formChangeItemTriggers; diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts index 70f0019227c..f460f89a72a 100644 --- a/src/phases/money-reward-phase.ts +++ b/src/phases/money-reward-phase.ts @@ -15,7 +15,7 @@ export class MoneyRewardPhase extends BattlePhase { } start() { - const moneyAmount = new Utils.IntegerHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); + const moneyAmount = new Utils.NumberHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index a544d47df70..6d0621b8f48 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -62,7 +62,7 @@ export class PokemonHealPhase extends CommonAnimPhase { this.message = null; return super.end(); } else if (healOrDamage) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); + const hpRestoreMultiplier = new Utils.NumberHolder(1); if (!this.revive) { globalScene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 3b9a0a0405c..a3a2fa1aa24 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -45,7 +45,7 @@ export class SelectModifierPhase extends BattlePhase { if (!this.isCopy) { regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); } - const modifierCount = new Utils.IntegerHolder(3); + const modifierCount = new Utils.NumberHolder(3); if (this.isPlayer()) { globalScene.applyModifiers(ExtraModifierModifier, true, modifierCount); globalScene.applyModifiers(TempExtraModifierModifier, true, modifierCount); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index b515c6bafa8..2d1cc50603e 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -1,6 +1,6 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; -import { IntegerHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -174,7 +174,7 @@ describe("LevelAchv", () => { it("should validate the achievement based on the level", () => { const levelAchv = new LevelAchv("", "Test Level Achievement", 100, "level_icon", 10); - const integerHolder = new IntegerHolder(50); + const integerHolder = new NumberHolder(50); expect(levelAchv.validate([ integerHolder ])).toBe(false); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index a3508532631..76d02c191bb 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -14,7 +14,7 @@ import * as Utils from "./../utils"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; -import { IntegerHolder } from "./../utils"; +import { NumberHolder } from "./../utils"; import Phaser from "phaser"; import type { PokeballType } from "#enums/pokeball"; @@ -191,7 +191,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const typeOptions = args[1] as ModifierTypeOption[]; const removeHealShop = globalScene.gameMode.hasNoShop; - const baseShopCost = new IntegerHolder(globalScene.getWaveMoneyAmount(1)); + const baseShopCost = new NumberHolder(globalScene.getWaveMoneyAmount(1)); globalScene.applyModifier(HealShopCostModifier, true, baseShopCost); const shopTypeOptions = !removeHealShop ? getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, baseShopCost.value) diff --git a/src/utils.ts b/src/utils.ts index a906ee76391..56df3f3f48e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -342,13 +342,6 @@ export class NumberHolder { } } -/** @deprecated Use {@linkcode NumberHolder} */ -export class IntegerHolder extends NumberHolder { - constructor(value: number) { - super(value); - } -} - export class FixedInt { public readonly value: number; From 0913c77140de9eb2df2dc3323f99719e809da427 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 17 Feb 2025 11:07:09 +1100 Subject: [PATCH 045/171] Update version number for migration code (#5354) --- package-lock.json | 4 ++-- package.json | 2 +- src/system/version_migration/version_converter.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce1feb7db41..739ce18496d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.4", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.6.4", + "version": "1.7.0", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index c9b5798af76..5a191b3ec99 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.4", + "version": "1.7.0", "type": "module", "scripts": { "start": "vite", diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 95537461768..98d340d03aa 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -172,7 +172,7 @@ class SystemVersionConverter extends VersionConverter { this.callMigrators(data, v1_1_0.systemMigrators); } if (curMinor < 7) { - console.log("Applying v1.7.0 session data migration!"); + console.log("Applying v1.7.0 system data migration!"); this.callMigrators(data, v1_7_0.systemMigrators); } } @@ -202,11 +202,11 @@ class SettingsVersionConverter extends VersionConverter { this.callMigrators(data, v1_1_0.settingsMigrators); } if (curMinor < 7) { - console.log("Applying v1.7.0 session data migration!"); + console.log("Applying v1.7.0 settings data migration!"); this.callMigrators(data, v1_7_0.settingsMigrators); } } - console.log(`System data successfully migrated to v${version}!`); + console.log(`Settings data successfully migrated to v${version}!`); } } From e1327c1d2d87d85f4baa494220ee63cdf31b4b9c Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sun, 16 Feb 2025 19:40:11 -0600 Subject: [PATCH 046/171] [Balance] Guarantee Tera Orb as a reward from Rival 4, Remove it from Classic Item Pool (#5353) * Add Tera Orb to Rival * Remove Tera Orb from Classic Rewards --- src/data/trainer-config.ts | 1 + src/modifier/modifier-type.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 9cbec400a87..d9aab528e72 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2192,6 +2192,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540), [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) + .setModifierRewardFuncs(() => modifierTypes.TERA_ORB) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, (p => { p.abilityIndex = 0; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 30ad287fd98..336cbe67ccc 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1859,7 +1859,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.TERA_ORB, () => Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), + new WeightedModifierType(modifierTypes.TERA_ORB, () => !globalScene.gameMode.isClassic ? Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4) : 0, 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { From db2235405710da32ba7d051bbf7ff22cbf3d58dd Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Mon, 17 Feb 2025 05:30:27 +0100 Subject: [PATCH 047/171] Update starter-select-ui-handler.ts Spnaish text size (#5356) --- 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 65c159c62a8..b919679be00 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -88,7 +88,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { starterInfoXPos: 33, }, "es-ES":{ - starterInfoTextSize: "56px", + starterInfoTextSize: "52px", instructionTextSize: "35px", }, "fr":{ From ed8ef4806847b914239944cdf4d1a14f29ff9dab Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:17:04 +0100 Subject: [PATCH 048/171] [Localization] Move Touch controls Localization (#5349) * Update move-touch-controls-handler.ts localization * Update move-touch-controls-handler.ts --- .../settings/move-touch-controls-handler.ts | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index 6128f5954e8..da7ac7f0514 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import type TouchControl from "#app/touch-controls"; import type UI from "#app/ui/ui"; +import i18next from "i18next"; export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape"; export const TOUCH_CONTROL_POSITIONS_PORTRAIT = "touchControlPositionsPortrait"; @@ -71,7 +72,7 @@ export default class MoveTouchControlsHandler { if (this.inConfigurationMode) { const orientation = document.querySelector("#touchControls #orientation"); if (orientation) { - orientation.textContent = this.isLandscapeMode ? "Landscape" : "Portrait"; + orientation.textContent = this.isLandscapeMode ? i18next.t("settings:landscape") : i18next.t("settings:portrait"); } } const positions = this.getSavedPositionsOfCurrentOrientation() ?? []; @@ -90,19 +91,22 @@ export default class MoveTouchControlsHandler { const toolbar = document.createElement("div"); toolbar.id = "configToolbar"; toolbar.innerHTML = ` -

    -
    -
    Reset
    -
    Save & close
    -
    Cancel
    -
    -
    -
    - Orientation: ${this.isLandscapeMode ? "Landscape" : "Portrait"} -
    +
    +
    +
    ${i18next.t("settings:reset")}
    +
    ${i18next.t("settings:saveClose")}
    +
    ${i18next.t("settings:cancel")}
    +
    +
    +
    + ${i18next.t("settings:orientation")} + + ${this.isLandscapeMode ? i18next.t("settings:landscape") : i18next.t("settings:portrait")} +
    - `; +
    + `; return toolbar; } From af91ea85c37d4217e315bb39b3f37179ad4623f3 Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:22:12 +0100 Subject: [PATCH 049/171] [Bug] Changes Daily Run item stack full message to a delay (#5339) Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> --- src/battle-scene.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c7e3d4bc928..e6649d0999a 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2605,7 +2605,7 @@ export default class BattleScene extends SceneBase { } } else if (!virtual) { const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, true); + this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, false, 3000); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } From 7463bedbfd3bf07871b35b6d4950ca5634935679 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 17 Feb 2025 20:44:51 -0500 Subject: [PATCH 050/171] Un-screw the pooch (#5363) --- public/images/pokemon/261.png | Bin 8254 -> 8248 bytes public/images/pokemon/shiny/261.png | Bin 8254 -> 8248 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/261.png b/public/images/pokemon/261.png index 9e47128a54563806080e72aec81d815b09c248df..da22d88806f9e55ba51849a9f7e2d7313198ac4a 100644 GIT binary patch delta 8235 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 delta 8241 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�rL1-S$52(81Z?|N)(}I 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 Date: Tue, 18 Feb 2025 02:45:28 +0100 Subject: [PATCH 051/171] 651. 661-662. 672 exp change (#5314) --- public/images/pokemon/exp/651.json | 899 +++++++--- public/images/pokemon/exp/651.png | Bin 1139 -> 11775 bytes public/images/pokemon/exp/661.json | 751 +++++---- public/images/pokemon/exp/661.png | Bin 620 -> 1985 bytes public/images/pokemon/exp/662.json | 1028 +++--------- public/images/pokemon/exp/662.png | Bin 1869 -> 10736 bytes public/images/pokemon/exp/672.json | 1442 ++++++----------- public/images/pokemon/exp/672.png | Bin 5155 -> 3354 bytes public/images/pokemon/exp/back/651.json | 817 ++++++++-- public/images/pokemon/exp/back/651.png | Bin 974 -> 10248 bytes public/images/pokemon/exp/back/661.json | 752 +++++---- public/images/pokemon/exp/back/661.png | Bin 583 -> 2256 bytes public/images/pokemon/exp/back/662.json | 923 +++-------- public/images/pokemon/exp/back/662.png | Bin 1526 -> 10153 bytes public/images/pokemon/exp/back/672.json | 1442 ++++++----------- public/images/pokemon/exp/back/672.png | Bin 5492 -> 3416 bytes public/images/pokemon/exp/back/shiny/651.json | 817 ++++++++-- public/images/pokemon/exp/back/shiny/651.png | Bin 974 -> 10407 bytes public/images/pokemon/exp/back/shiny/661.json | 752 +++++---- public/images/pokemon/exp/back/shiny/661.png | Bin 588 -> 2256 bytes public/images/pokemon/exp/back/shiny/662.json | 923 +++-------- public/images/pokemon/exp/back/shiny/662.png | Bin 1526 -> 10157 bytes public/images/pokemon/exp/back/shiny/672.json | 1442 ++++++----------- public/images/pokemon/exp/back/shiny/672.png | Bin 5434 -> 3416 bytes public/images/pokemon/exp/shiny/651.json | 899 +++++++--- public/images/pokemon/exp/shiny/651.png | Bin 1209 -> 11786 bytes public/images/pokemon/exp/shiny/661.json | 752 +++++---- public/images/pokemon/exp/shiny/661.png | Bin 619 -> 1998 bytes public/images/pokemon/exp/shiny/662.json | 1028 +++--------- public/images/pokemon/exp/shiny/662.png | Bin 1870 -> 10740 bytes public/images/pokemon/exp/shiny/672.json | 1442 ++++++----------- public/images/pokemon/exp/shiny/672.png | Bin 5142 -> 3354 bytes 32 files changed, 7361 insertions(+), 8748 deletions(-) diff --git a/public/images/pokemon/exp/651.json b/public/images/pokemon/exp/651.json index 5db25b75d8e..20bdccd5bd4 100644 --- a/public/images/pokemon/exp/651.json +++ b/public/images/pokemon/exp/651.json @@ -1,188 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 116, - "h": 116 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 58, - "h": 53 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d110ead01ff70d3da8dfb432dfe00ac0:207046ea51a1627a342c2b30f969868e:a93e5fa02e10bf11e3ed8bf6571835ca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 239, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 60, "y": 0, "w": 58, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 355, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 59, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 179, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 297, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 101, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 329, "y": 252, "w": 51, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 47 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 109, "y": 252, "w": 51, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 204, "w": 52, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 52, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 166, "y": 202, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 52, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 275, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 204, "w": 54, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 333, "y": 202, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 202, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 55, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 413, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/651.png b/public/images/pokemon/exp/651.png index 42a1af8184dd395abf7d0ae59d3e7f188c334764..633a3cc0c750f941f93e03ecdb12f29e6fe0e9ea 100644 GIT binary patch literal 11775 zcmZ{KWl$VU&?Y3o-5r8E1PBlug1fV5uq^JdXmALw%R+E>cXxM!+v3jRnqXhv?|$7? z-Be9=P1m$k_cK}@p{62>fl7)B2M32CFDIn|2M3?|ud^Y)|Ht7>$rArZ;9WIjzrs~b zkstpXu&XI)N&lnR*x2Gs*iw3A7UHCOdU~lMRH-Hm*QTF9sT|!umEP(sidH1LySpDB zA2n;3i~k8=xoN0q!oB@pZ9gWf2oCNeoV=8TmS@I(W>oT;V5~H~I)`-A*xOqxdlx(| zoV?swg8W6XG>yLyXiq`ZszatkM*ySJ`4KP1b2s#x}2~`?@`X&XPyU<#PBuF zsw6<(>oIAWONxtGxpEs(XGv^48}k!O(JMy3YH$E9N z-M}HWe7EFFV~705LY|$EN`^1dYyhdgWwYU zG;JUFea#o|5J{SZR#Hp+dCdq3vYm%jS4sS)Qv~i73N}x%=9uHi(lf(F>Z3H&r474F z_JHiq07_uw5q%sQe6Yw_=t!xG=t9o7Z`A;nIcnQ-d2*B})($oSm~+FRdja8?i{we( zIrB-0OJS07yJeTjLr3?w5f@9t zVnaC~EdWsT3CG-h(gAHyE^cvK0OO+i5Vv8Pv5qZ583YqI7wRj*1(=eVEoB_eAy9(# z_cg(%yzOd#NfW%!ZtU5sRiBXN4OeRCisXM_HVzYwCI3QYjjZ3b_wC%cIRBBk$)8ew z^kofNQ76VgTC@}oE%6nDd5N(;KRr@7!Pu+21TGT3OD;E`ojK{UzW6RXyUl)Obw^_L z_kViQUp~|MIg~Z12a}6l2CeeIE}q=%;-I@Po*q%q%wICjC4E!Z)tvKAx;}VfFgB^- z>A-VgBRa_J3WYWyt-Ac$>VvsoTl?*wUm)jFRDK1!{vzBIQ+j(B*!e6@Y2cXPQqgr~ zIEifD$Y-mV7b-nlinr(Ij*Q)A_NzsbCB6Ina4_$=hy1yjGBU1q(TzsJ~hPKNISHp92}w zd~et1FNM=L9Dd8jpSspv;W8NKDy}%E?pDCIE&aPv_zJyt#$~WLCFUinl+!;pd(o(k z9f$7ACK;YsVn2OfP5WFj8)aR@jGr@9JuH1HZjXnU<@ZU&D$V(p7Nt7+rINS?U$?Bi zU%QMTYN_rg>wh=Dw;S3^JDx{h*>e(QVb@X9sKBS|m*K2DBgD;IoBRG=V8-(Zt8}a))sk6&D zYu;TaAAj~iJnOCh3hrKEWkM-?>q^-jr=4DB%R8+|#3qB9D3z)vc;tRO;9)u^25m;| znd-a5*pxOJ0z5Z;GZ$q&0TTsfmc!N}rw2Lr0WCfRL>+irg1c!qeqtJ#E)nL1CoK#W zlX_DGh{+Gh`*zFGD6TQe%|>s?mX9K)>{%!*bCV(5p(K2xijR1=(S>&}jY+R&hj~tU}em9*%Lk!~<0%I%}?VnYdt%zAfmmYcaA4^oLH0G)* zoydz?AkPhe=$bJ0)nhlF4p3Wfqa}nX((oa)Uuqsf^u!Z! z+)Q@xh7MgeB2rPglMnKKMbR{EaWY~9Yho$Mw zcKn4r&}sF|Cvk{%t+kCb3|CC0(BEjzl7A{O-Jfj!vGnI*Y;@%Kt!IVfgEeutUabBr zB|TQCtMH#1=b!2xM|KZX*bnfm(Yv?`>zTv5XKYX1W(6PD7P{Z1xoWAS1hwI|8yrNp z@}2E)!?&y3c<@w~++f*F|IwTl0Bk$%KpG^@V$s_Je?_6LF}?&xr#Fg;Nrk@n(-+f( zL5o{wrmm2(tvB{d4r!;BB3>JwN^&dZ%YsJ;Y~p$`B#e-W`@L zDez~t{)T{@jJXH|Q_VV;b+0$(Fte%d*_EgoX~QvYmyX}DFJb&sVA109fRe=7{j}4a zuU#uFrpF-)&o%XLIhr7XcltaR(y5mhbe60eeW}Z55QOKcIWN}N38iJ5JRM?>W&l~$ z<>%d+Q}@Rj>Gjrmn(^~&z?gH|8~zEr|KMSei$aPm$GrKFyXE4!!%NP&NvSW-1KV#E ztLa0>?%n~8Y*t-$Z%SMPdSar<8Z0u)+VIo28RYi%Y#~WqFuBkfRyB|!9pns2ZT;c3 zuW_Kj1dSWD1$tO7Ba}MmlA(uZU#A&KFLJ~FxW2Bd7hw|)@=`m{vQ;Hv*}gS2uyIm1 zj@5!mx6|{bXL=1!x#`>Uj9IkjQcqlD-o31VW3b(C*9ETX8u}c@Bd-UY3rofYP#bnX z4cjH0d1%nlQ#F`2=l8WJd@TFYuh?d=<>J4>GDqT3y;H^PzzQRIm#I&*WV>HN2J})) z{)3k@4XJOxD{RAERV#{R!6|KPfniV%{#Zs-3}8))D|hW^Rfw3xan)Xfh^4SuKb1Aa zw>AxE8T?fsFG#Bi*+r1sf1iUPsOkR1-5GC#d|JoiVzlNgKOOA6^jzHK7P$L$)kW!W zHJ`3PG1*;v6b(^`EI1U9cfPcuLjIUAg2jiEZcGeK#D^ph*(y>R8nXoyt*5 zPf{$KU1g@9wF=Fo?7pCXiRQ9cQCQj`jSODlQRBHwi76p+0l6z$rx>Zxv)CDo?XRLg z`E_jW2j?BiG$nl=@Qo&7f!6JgRT*{~aUVGLpBHM4)~KwZkH2V%t~HZy*fZzeX>e6- zT!k76w7bqZ&}u{6PEf`j|2lNwI}+Q7iXT2Y?yWWmIUI6^y~HJNTs`ay)+ON!@jjo6 z88nzjAOl`BEob$O?8AP@*lWUuwmj~{(D^(%>U@2|mpe~3)2bV)j*;1=&+;F=5OB)@ z$pfL=WNmXFND05N{~Ta4i~^R96rf<~L+1;Yos|R%qj6Q0N-y1sScM=w>H-cth-hnW zvjd3wMulf#zo}RFLU>`923aBF5O)63uT5-{YiOT z?5FZnZa_u%LhWlCn`*+tUXe8h*{^3VvxuRRIpCSTChVC}B803q-u@fmZ&S0p&`tU^ z;MD2DSdkXH+06HGA0l_o3Uq8VGT35B1fedLzR|43@v3~S=Gd3+CI#@;gAH((vTCiqArdV{~cUb#X~X>I0Mb}V==V~6@c&E3CR9kS05>5%s6!Y*gzzhE_2gl!U- zZDtg1|Fim=A!NTw1bsEI|vKW=J>$&05NMUqG>2Ea~os>f+ol|0z8V4COgjcD5&{G7%l+e^l=IHHd0tnay zk6TsHy8HE~rJ~*c7+jeFCCXSlzq!5K|NW@SsGDJ4$YIM9RYjx%vfB30d%E^hhb$`? zm$NMgD>fogS>v#A%AJklxpZ^bhUvL^KT^zAXA>_S*G?vVhfUs)^mH2;Hs`hdq^vM|K7Q@PNU2>ycb1$amdMEpMntSoS1G5 zgzy5cb*QeCw9GMf`DpcS2{P6vVg=ivhJSh|Hn7`owN7;`UOs+J%QJ362z9X90M4v< zXA1hTcTy`)nPHctL^8O54dsNfF}hF2c0}l4lt{3f3i6B9SJ)Q3J+F7%4#e6`9&>&3Xs6akyAm~ei4tTW_lpdxl4D%cmV}VP2!~_%O;-uIt_7;k~@@ALkf0?sb+$kwMQ$uJU0jS*Mi)dFf{l zH3_?(CS;dF<4zyi#6?})aehYCrx!~Y{dtQ0qO` z)b}i_rn6VHaj@&I)s|82LLlC$4_c3okc6dcvM+>ab0N*Nc>yX9YoD}?lu#88yArNM z!~l2IU1lNU@$$oYlFa;xg-SH-T0_gewjO`cNNp7K{4VJ#zpUrdVOd~xZi5xhaio({ z8tNJ7VgIGw;TPX^1tx&c!}1C*l)*V4-n0Jg)$N0V>QN>GExyf=N3>2#8yLj|TTh2< zNbJqr_S@$Zb^GtW3HHm+ear@-2()l}d z%;OJ;f+k=RPUwJxK&o~;_An@e2;2Rbh=u-nN;Gk5UiLf8Ve4{TO;1c62YzMfT-uBk znl%8v*>MR!YpY^qa`)-;hlsZxec39&5pa|dq*KgMWYFy8ATKgtIaLchE?a#-tckmW zEhGedn;#{8ppwgNLC~krCL{&MJdpG( zYJK2Q#=V+q3?y@)89z|mkgi!b^(jgbo%#lfXd2%=JKTTp6s6(Nxc6BFMbq#ry@z0k zOVZGs6GcI9vKzB4Q5;%KumNSY`I@0o8HtK*dNW>JI>U?Khoh6eF2iGI_V}~GNbMee zydw91*3iQtW%m9Cw(Pyu!t2TLbO+^eO3Pb1Mp3= zHsl`ZIZWw{n`T-hKISd}dF9#G64RD&BqX(J1wx>Pv=+(wkTXF+jOkg*Z{w!3`XF4l zvmAWTM7e*9Ph~EigN9?uC2J8gpb707M+6M9f%|CgxzQv%P@(cUt11=MjFA@6pv`^Y z!*r0EB;TYAun@m|1Qka4F}g5>+B2@0r`au2ook?KU$@+Kno8Q(XSPFQMbIUXnEYfa z36HX3E*!Jm@`MxNOS;bRsu8dqz{2W9Nk`@~(e(tn4E%S!pwOmV8g*acHZH5!6UZFo zV5fCZ-L0A8WH(cbVbEIb)L0qM;SNxVyUvmCqeo_nOjrazNs?P?!zRkY8f*KKJ=(EBD)x2ThM?h5SH+?&$w7mnoU%Vs%JXi3e~iu7$U)e>;|1!gD_{&RTu_w;%1Gk>j@ zzFUESR>@crE&0wmxlK5Z1MWh>a~+VjBB;<)a+X1Cg`i;~f7DznpB7RwmSIk5_DQ*5 zMiqu=J4=RICE2UdL2X^1?slI7aEAMP8P|U#$6m&L_^9veID-x5C-|~i%CMz_Yfca= zs~71(clOg+8A?*vYd!N1D8Ph#GBYyuj?$h1QQ7T$6QX~PB^SKh;UD;qbdmm-ZSQ7F z3)65#KW48%a-FTJ0@Ft;^?dc@9d>!zc0rA(vgp~cO69#2zA9qjT5V;)wR|(? zjfBr#SwCU6zZ3Me3X97IB0M|29}Dk)JY{Tsh*{7c*65%=?%{5XGh}+Yo(seLUtI04 z6@|yL8W(-8vkGeS0u$**O3IVv3LOnlKV{g==FwK?uuxFr6)ki1TYvBU5U9IT-ek)* z7+CNSEXhj9h`Dm8E$FsaAf-LT4PpLCLWtR>-QtIckdc#lh1_71OryyrXl)vIJ<$6e zTWdgybgvcfKdbLl2$Ze}{uDlE{*rAfDc{23Wfa}}GNc>%y;ffyPi5!s7QJV2S+k^U z*$&a?TOU%E~RZ? z4XI}hp@Byd)+|S{yHtKX!q5+--%OYZp~ouTn^zZWN?Sf&znCrkIsFvF%Gaa*TNj#; zYwY5#9+Il8+8%a&!a{MT#P07i_4wllw+u#%HAK5|+uWTPZXYla1ZSnNBumDI>m0UU zW~4@L1^+hC6i}ZRYbDv--?0t03HZvVSPkCVK~%{d#YW8_NdIjPz>>r(V@mX~AmhlY zFgsTy+IB$PaP8R6iC(0ZtG;~u?g@c-jAwNMC|WY?e;urGLc+ zlig9)z}qt$FYzE0OY6?40{E>7*hLON&qmVB`v+Tv z%}m}ONK0G9^Vt1y_?bwCX&(Ve-*KB|CpDyOQM86Du_}qbR64hPoVYD`8qk!F+;!j3$7ODPVN{Uix z?Y6LD?m&%{Mp4yPf8`U4FNRD<0buDBP4}IY%{IMApvUvl*`fRFA(!!)kWUr?L0Ww! zhG9{Pz(ICYv6QThI%Lp{TUepRZmZhi=m(E9j$VQ@o3~!1v1Uq?tY^eV^X7OYAK7>&ixug7w3Rij55>}||!DtCp@OEhq z36uT2H4neqc)U_qDr>F%xPV zdLJ99u_&dV$tLYA|6_`zRhQdtF(7c@6&jVL7sQNuB=>{_uRM~+(it0UI~C|BJ6Ypj z>oIki-yzGqQIP&It{L{YoZF+3@ljEIBlysj=H1?It>Cg<9o3Yf-X5Y^O+@VXcG^4^ z1oDhb(=_9@0J4KXHGiIlUv%Z1V-DV3Dy%fLUfegjv!h`?7@;Qh+AxZdWg5KCZIrqu zXxgLv#Ur11hbLtDXI!cgzNPLw+b=yM&T@kUgS<-HoPr-}}~>OiX99@cD>r!Av%7Ra-_fK1;Z{z|fR6!QH#5+Qs;H8;3EAV!KIsPN^r^2s2 z{xKR_lb0AB^7M+et5V?Gio3UI^~f?3hH~8O^-vT3$4(&F_%u5e-8t!>FB)9^T`ZuA zz}bx;zj=nqzy4U!GW&a+M;*W0FpB3kja44`y}-@lIArNgZ$HpDZ>B(;UAJpqVDC3n zwM~Q-W42oax;(SZb|MU@EzNrf_h8xB7o8L|xq+{ieP1~#hb8!}gPNCjBuB5D;)pJv1Pa-_KD>dj?@k&6 zkM)xG4^_Q#H^QYVJSY$yzSVYn2N(sMOJft+e`A)UWL(YvasFuzZ=PPOFli%9YM`Am zOC+_`|Bv|~jSOg_i+zYIl=?^(kp(DUF4gJXLp?TX!UYsGt_a1Hrps*<_%-IP_eS zCXw0Bda3HS*6QX?(2PjJzmO$RK5fS_{P^mT!`7(&N&2Ke|Gh)(+QUc>{;)3(EAyk{ z1uO7ddAcwo2t@;E8j-P}L$Cjgaokc4FJV3K1ZhthY z!j$C(%rqY;BqK$bn+(l2+a4m9;6NJ8XbikyqM)oebl22AwoM*DIQq5MS(3SA1imdk8n@g7P=y zzdneKz+*a>jUcItA02E7OyIY__gc$H6Fp0C!Wztq48x4mEDu@)K_e>)7w>Qr6ndOV zjH}b0hnJL0sWdr!u0j-2RaJPsT3KkNrpV&MqcI5QnT`1+@2$sxc)CSN65xFBFoM0? zAt`P`t*N>#VTf$vn|{U={1dM0v}@{sTyUMdm{%#AaDwJZEMf%H^72NvBUYaeXpWWO zp39Zf1cuEN(>}#pcigwvN<~<4`vME|mWe@(7-_jI;hhFPYaVvhcPK+%@FPQHxkGiv z820xBk~P@ISuf$Ul}irk>1eEXk=eL0MOwjRC$RTr24>=m6P+v>8bw*cAMp0WGd|GW zLEg6RdB5?a;F$;6FSR`Bn30q4x4bd_Jh)1MDFQV@j?XfV zPk5Zw@egin{;Xe78^Y1X&(uKY46J9(a2w6JJO$nP4#>8(@G>en+yRHQyinrhO zSHf5Q%5*Hm|AyxHsC#J_Wpo%q5=Z{L1C|yNC4{@VuIImhA4Rh48ZbZ7(kYzsB=_RD?N5m2GOTJnl&+<`qYv zN=+@_Jfi!PMEpC){)n3lnWgd?ksU<7v={`p5~YU2*A*o(Gh)T#qaE0^T6m;d0KZ^+ z)0x%QVaWwm^hUp~BCi-WbyG7i4f5Wi=r&DPq%i0DrThLXLeTrK7JzX&P-#&OZ^RH< zu0RyM{0Y688mBXEgfyw?HoAFB(th*96OUx35;zmv6RiI)E~B)si?WYjU1&a?6JT@2 zUnE{T(B%z6zvt0@tXwc)ATN{tZheOI>0J2t{SDOWL0L*FQ%S%}^8@oxABx&^IL1vi zlY=ac8Ez{48Ff>1_AlLq`_4CU(D*%+O0mY&;+z>cHi~Aj$BV?w;?|`IV1zbx2TE0h z$42Y|?2n@>?yEY?{Gl{;ATeDFlK{IgCTJZ>?%yOZpjt-zdcvI+=Wz6i{K+XcAj_@z z_XZ^HZxwm1n3%%Bw>=fOlY*CSF|nKp+PZn{{k;SrS1y~jwo*@9=9nKHjY73QJMnJV zjK4d_CVXjmy>WuGVwu4s8o&aMoeaz+&&oIr2t}e1B=v%OjQxm%U_;T(hEli6mCHzh z0h)RJ0NZuuV2Upt1EnH;7d}z?B@9rqxHi*{j2A5f4v>a{Tov&3WoYg{u9TsZBVk=2 zH$R(R)+WAOJ|FfDeoF3CusQhlwJ=bemRnT7^g2(mh=r_7LE8$Kd_|mwMHE}XkI+3Qejt%l<%7BQ z6PVM-Qwww!)!z|q)PrM2@v@Lg$|feu z)&r&NE|vqcv{sk69vVtSd5|(p!s@O699p z%M4{{+|T|A%`XGEALdI$*^jmLApf?iz1X|z-)R{tF~0P!sxc>XiQgdFtyB>u>sN$K z%@fP(Ym_(y37!xcm`()eJ3GDSi~52-SvQ(l5T$gcP4i$w(p%MAhJ%>37jGmMv-gO~ z-!|98Y+pR6k|c zqByj2bt{i@B3I_8kG=3$LLeS7N%4mbA;c=z=ibkVDqrQ_Uvz2}A?5Ks}7+3HgKUU$r_B{QmJ5 z2ZS24WQb*G9JzKXg;)l+i3d3e(%fnKYOXTpP^osc}kt zWxnc4V;hEQW0HajV&r2yTy%ay++IvKcpf^ja_{p~fE9Sl3BPg5aZRb11?y{{OrZtk z=|Y&2gSY^W^Gl#{!)$X0{qOM4qvgmc>Ih$mB<1G5b!byNjwF5_GBF<6^!1I zH|sr50hc-b^e~4h-^&c!TVdALk2`svbK~{ocS7Bp(bu!?(6%@Mpqp`*m zUOXN@E#!oodtY5A>&Lgt0%E;qwA7WgDO%hee#qnhQ^0xQEw&K4fwM z)On1;T)^~uZ_$QCVw^V?NHJE0wniG(TCG1CEr1PQ?;+PG1Q?Q=5DA}>%29;Fz}HSK zSU#;4+$wvYGg zvEG)qIMrh`MNyM`abAfm1Kz&oCy#y+c28R<(MP`1pQx=cvX1;OPOIw-ac#F+v$?R4 zbGL&|hAzX`i5V_ox&*$X9!6`QNK2wX>#Sc*AN)3i$IIAFEFnU;?POO=Bh&LLdwEf&0VHTz=@5gB4m%+v5dNcghcb1UR+8T%S^P$veF^^?+ zJ!9M{%Apg9BUuWhRxCB`dW`XXxH`$hr@JK=qw5j(BO%?A7C4M9Xz_VX2m1{m6NTbg zWj$~>sl1S3>f|0mQ>1y@Vvn;)UR6BOYKLXFML2ve?){Cmo&7r_=rH48sza4uu|lUK z_aL^&!ATCgcGeVCRr&8#dQY2|3$aprZY0|mv9D01sfXVlj2m5*>)g$rqfnA@2j7uR z(Ao4_F19ej{dPdfHrfQOWY8qCu+YQZ+61qNk;+GV6`uR^}mM z_X8P!)|Le5x}^Qth)-cTuO$IgEAG+M84~yk_;~{t=qVZUF)o=! z<1&Nc*9Y(tafiT0t~_57nXgd9igK<*%)$iO8Ic`8c)qPPaQ4#^CodT4jAu|w(kxfR zO>SUYs*NHdUKt>Cy*j*4w?MlC%*jz9|lTjyTmB zO&oueQ?r;g7vEUrcGV_yMMDa>h|Pd*@m~$T5GKFM@)8i~*c5#9JaoSZlb_p;F#qK!JFOjz-J2MX6+B zZ5smFe--6zu{REvjYX~(tjVWPbdS6g9r$T!E^&~tn59JqF=Abh zb=q0)Gi<1MQ?6G&!RtBL#9>fyDeoqdcOcvGJ2q+K>sFrLknpeF|P0GAvX0!H*S-0GYghP3I0`t za_DCu5tx67IkDf_`hq~YZY&|O(MkF&eNeq=oUrEK{K{8SUHj^g@V2|h!AYO~M`&@0 z@!<}oNBdPtk`U;=}%{KZ?H#DvSjuLCQr87w<~Um>wr-d&SghXQ?8{P=A}q zAK#?kzs(M6gh-eB$?~$7`I41ERs)&rb4#4A7*2k8s>4-(qj7v-gYbNO5jH6f;sf>g zZ`ivzdu1hlEG5_Mz(3FUA^Rpy_%&1hpRaCsTyN;%=DP0mUB|g-P)v-T4UZ3t51iZu zf-6m2n0unB8h(%|m_YgWlev+pmJFQU8OOtSNB6ecZ!TtBzR;(sJyM_`kNbl{J}mkw zI>f8BM2kbaOiBYmRP}J5&IqqJ8QDeV&omdId)=z~#@TECOE>=?`v2o^W~CGUy2m&@ zb=7<~*JbAGQUi1jq&keUDvB)u^d6^DfaHHl{wIQvv#8S(88^!p<1_y=;Xe% zwbgtRN%R!%&393wZ%foN^kMOV@00!8GQ2s!VJ*@1sTw0?+*BgH=d&!$bv(uyfafi$QFqUpmLJRapMsC6wFsi`|8r85 z|4qb>qj_PU&)>%3rKcf8{Wt52x+_e{6Ln%fm(l zE{qpS$v}%JK4|O)2X;R0h}=#ej|JA->ElzaMLr&mrI4S)0;*hDdm$uGVZW2g00|1I z*}Z>3NVrw?G$Z$-F#?rJEd&s%g`ye?Rd)VDLo`lSDBA9ZTmjtxt&)TqldLp6kb(JDY525 zznq^mb(m|Du)rqzeP30j%L=JcSBLzrvYnzYzOG|YdNjJ{fz$!c%JFJV6n)`vshV25 z>&Gea~UMGBhJ%(lM00(Zk&Df*(TN?$;c0gL#8C`Df*MPK}^w^p#VBJTG=- z$yFk!ps$spubj@Mzr4SRB7n74g)NU3_hu?`fqoRN8tHOxStLoNf+Dr2%LVdOdaZ9{ z=+FVu6tZ5GT>7q#r|t;_l^vvmqv$Fpa1L_V0B50UP1K=fYcO*8H-l}`N>@2!zElJh z7W4)w=XpwlUBbE`666+%Pjvn0&U7Y6NqbNRl$UngLdbtPLP>r&;3dB~5Rw=U2uTbF zgd~OoLK4FPA&KFDki>96NMbl3BrzNik{AvMNel;sB!&Y*62k!}@x)i@l!oDeUn}C# z6L6m!S z3o|*`HV4f*9IP=-4uH&XfVu_=#|#Ic7KysdZ~$tPsLKoosB4m_OAZH0%@TEq;Q)1Q z5_PHJ0Ci0gkQok8*CbJw7!FX^COzsB!vX3BlSEx&I1tn|Nz^5V1JpH1)D>blKwXnW zT_J`8)U`>}C5HpML|tMyAS5vy5Rw=U2uTbFgd~OoR`SDvEYKwR;b4)I21sf+SScXn z?ZbfxBq%=|aL@30%0I*BDgO+gr~ET~(Elwz`N>ay@)tq)#pbeN;L`vA002ovPDHLk FV1mCL2s{7) diff --git a/public/images/pokemon/exp/661.json b/public/images/pokemon/exp/661.json index f01755ccdc0..74bcbcb06a0 100644 --- a/public/images/pokemon/exp/661.json +++ b/public/images/pokemon/exp/661.json @@ -1,356 +1,397 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7dcd93b1058cdbc2640b9885ceb2e854:a2e65850e27a715b371214cfcc8954f8:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 96, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 98, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 137, "h": 152 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/661.png b/public/images/pokemon/exp/661.png index 52e31c9ec732581857b69f1a5b39d43186ae0fb2..ebc25efa895b4e4d06763d377ae7d1fabd5167c5 100644 GIT binary patch literal 1985 zcmV;y2R`_TP)0{{R3=Wsg300001b5ch_0Itp) z=>Px#Bv4FLMF0Q*5D*YRKtTBT_<%Jg|7uLLN;dz}Oj%}ts>1SpkF)af@`4iWh5!Hn z40KXXQvm<}|NsC0|NsC0{|UrUCIA2jGf6~2RCt`#n+=Qx+v;Sz!~82bLTzi!Q+?ZVy9|G>7nO zlh)%NN2?$!C2N+V`O2jBxZfXfFdOPj?p+XNmr)bl^ykmx zN$Kj{Zm}*iNinAj(+ryk9-H7vluRCn2^}W2M~*2uT=ShtBRM`pkNpYrI25$sLviE_ z%ww`kywS2~*hKO;)a3$llk{k;W4O!rCcVeLLUf#;QuZa|f;L8MQk$&%A+(hsQ z;n|xsH(MPfh}O4Y^7?Fp%?5Zhk}@6MqiHLM*0*4C6d|w2=EAQrTiELRr?~nr${&o_ zq&4|`)|H#A(v(k+=<mG$EdI%=_k_>pnCa?GQD?SKbWj=KkvF;}h z>P_D3uK3WH$3CCchYbuCx8b?NGIld!JL%Mbe zej{*`G}=pyJ9NV$txA=2EPt(8+ahffkH@x>r^og@+M4vQ<8=~I`}qpoL@MI( z*q_Gf^zGCA7LL1;8WX|7(>8r)AolqdB+Tg#{_Erp(X(cPSLgL_+~R@VXw^Qyy5MeZAq_Sc8bkJ%-QU(lyFJ1h)DnAf1(ry zKY+8z2h8bEei2sY6I1l#!8e=J%MwI0rEW@5kLQSB&8BJW8bX`{&E+7Vg@Q^;Cb&Yk zc7Pucw~tM(AV14fK}CiE*{}nS7-&L^+62--XOrHiC1f=qQ;H%kiIAco>j_x}$TSDz z_)wG6rzd38Ftm2fTG*!vx~jI1fb%LqCaf8yq9?2E1h*)tn;;(n=hX~NS+o7$YA(9K zT>B#Hab5$+q%})TtEq78SPQBmmQRcGYCxv0S&btq?AYKy-o)@RaGtSdeN%=Vo2k@G zqWYLP&sZ}?XgciJ2yzqPBQik_$jmh(lCUEelqSf>V1kq%#rm4jLe23?z~6?DPmqBU z17yOQg=}!lrpAt)pe%{)vkwX9F+kR@8M}Px24F=5LGbygOpt`b&6>5(wN^m&9SeL^ zCRi-AH7gQD(7q)>AH)Pzs0ak@cVXzG0kV@BLa2xY#@bi1nhCxWl;X?~LPa1j*4|=* z2@0Mh4ueTZ9o@3^WOWjWgHRDu#{pRl$l5E6pdzM@12P-uL8$1Uj((Ym^DvlnP)EPa z!g&yZIv8msv*09RFbIJ=&hC`YvY!eIn& znn|Z2nGDo%zs0YPB6bqoB#4{37${DH4Aj@uamQfVYBEsImdJr7ENPU1x|)jQ(N4k) z^t+~g6OaTMsDsw}7$``B3>4E^F9QWhh=Dq2tz5N5k0{B>Kq0M#3=}3I1`3;c87NG` z4Ae(!5d(!ukb$D6UIq%25Ca`-sxwe&^JGn1RSriISwu}$1{(Culh&3-zDZDMy68<+ z1{&m~S9%yn9cG|rQ!fJzVU?0zJFGcmXp^9L{_(f^`cwr5DsP_Td+THlSK~ZuCT<3* zY@R%slFs2sZ~AGbB2^8cZ6a@;WVp}fa8=X3sGET*n(M~ z=1Yq~mO`KZ=rxdZ1{$3O3ro{=vPI3afDLu?2FR+_X#7=^{5oZ@slX|u& z1G`yG)Fgo|%D`??5j_d+Mx5BhPO^6+&TImb47TX_5sslEAW2}03b4D}1SL6kBTgD9 z$qVeJG_jMM!0!4$6w?drCNu#Q6H(B)O)QFuDCoo{fMSjSyUR^Xiis%b%qoat0tz~{ zi%l^h1^tOCGQ}JNcGt#?AMBo00+vOSsojI;j(5Y4Iq<^SMu#f**lXT!Wn8{)k zDfja4Es63M0ELhJ#)o)`KMAG1uqWI#`GsD{$v?Pl2RRYt#V!Y=L|aCG?CSgnOpuu3 Taek!E00000NkvXXu0mjf=nJ=3 literal 620 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 literal 5155 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 diff --git a/public/images/pokemon/exp/back/651.json b/public/images/pokemon/exp/back/651.json index 2dfe8c0091a..d000767029c 100644 --- a/public/images/pokemon/exp/back/651.json +++ b/public/images/pokemon/exp/back/651.json @@ -1,104 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 106, - "h": 106 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 49 - }, - "frame": { - "x": 0, - "y": 50, - "w": 53, - "h": 49 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:04a3a807a85b2fbb34c6e0e609d7bcd9:4422017bd667a14a570c0aab29c8a613:a93e5fa02e10bf11e3ed8bf6571835ca$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 272, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 100, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 56, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 51, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 165, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 160, "y": 247, "w": 55, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 55, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 221, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 200, "w": 56, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 56, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 149, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 332, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 165, "y": 198, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 215, "y": 247, "w": 53, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 107, "y": 247, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 53, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 198, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 326, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 53, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 107, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 55, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 55, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 387, "h": 296 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/651.png b/public/images/pokemon/exp/back/651.png index dd8d2b22d61c27ca7c6813243fd64eded3fe73f3..b16c8d5d67ba95019d7122effe729ed2ade7b6b8 100644 GIT binary patch literal 10248 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 diff --git a/public/images/pokemon/exp/back/661.json b/public/images/pokemon/exp/back/661.json index 5ccc4bdde31..be82a4ce425 100644 --- a/public/images/pokemon/exp/back/661.json +++ b/public/images/pokemon/exp/back/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 68, - "h": 68 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:64046aa714277f415100be681fde9148:1306649eb47cc5be6e5f0b266b6c13ae:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 39, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 36, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 112, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 34, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 74, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 34, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 156 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/661.png b/public/images/pokemon/exp/back/661.png index 8ab845902d1e1fb78f8e6e904e3b8a44c85fb801..67d9bb04293a63318e605128865abba319371db0 100644 GIT binary patch literal 2256 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 VwzGhZ-Y@_F002ovPDHLkV1jEZ0KWhL diff --git a/public/images/pokemon/exp/back/662.json b/public/images/pokemon/exp/back/662.json index e854c2b896c..52cc70bbe5d 100644 --- a/public/images/pokemon/exp/back/662.json +++ b/public/images/pokemon/exp/back/662.json @@ -1,671 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:66c0226d9868b335d6f9adbc58ca011b:9d85ba89536227407c6480dea06dad13:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 70, "w": 53, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 53, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 212, "y": 70, "w": 52, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 18, "w": 52, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 247, "y": 204, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 36, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 1, "y": 196, "w": 49, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 33, "w": 49, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 56, "y": 1, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 56, "h": 65 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 224, "y": 1, "w": 52, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 52, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 107, "y": 68, "w": 48, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 48, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 277, "y": 1, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 51, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 113, "y": 1, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 18, "w": 55, "h": 66 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 48, "y": 249, "w": 44, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 31, "w": 44, "h": 50 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 191, "y": 248, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 27, "w": 47, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 169, "y": 1, "w": 54, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 67 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 101, "y": 208, "w": 45, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 18, "w": 45, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 246, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 1, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 67, "w": 50, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 50, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 265, "y": 70, "w": 47, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 47, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 102, "y": 138, "w": 44, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 11, "w": 44, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 147, "y": 193, "w": 43, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 43, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 191, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 31, "w": 55, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 51, "y": 200, "w": 49, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 27, "w": 49, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 156, "y": 69, "w": 55, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 55, "h": 60 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 133, "w": 50, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 50, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 208, "y": 134, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 48, "h": 64 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 257, "y": 140, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 48, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 52, "y": 137, "w": 49, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 49, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 156, "y": 130, "w": 51, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 13, "w": 51, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 329, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/662.png b/public/images/pokemon/exp/back/662.png index 4e6a3c8827725a869a8eeec86b1552a42862d92d..39a9e8e53adacec8eead94a06ef9d2ea071457c1 100644 GIT binary patch literal 10153 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

    bu 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 literal 1526 zcmVPx#Cs0gOMF0Q*BNi5LHX>#{Jzzi}Kty1(Ha7oEOvaWrrhr@j&qU77&i(!UAH8Jp z0000DbW%=J0RR90|NsC0|NsC0|1AVTtpET8WJyFpRCt{2oQsm9I1EK2U}!qM|Np(~ zH-3VyVrD$Mc1=yHlN@wp2*Htx*Xyqw%d$L8;34dwuP=~<2|UCJ;-N4C4-tWQD2TvA zSj=#W41c@9Cg2cUY*!-!X~c1m8>nbv1fNW?nAh_BZ`QR&BeOwt@iE6i{|+uwT)P*16OThpmaxLt9po;0HN9<334HBD3iC8ow2&szmk zlcsWTM_VPqy+E2L89rdu=oRhOd|>0HDM+WwwRCDLc|MvmW+PXsYFb zmPMxunAHG#sBLYI&NGTvJMy4uGCH~MUsqGc1+L8u_v$6JwJzW;AN15Dt?OwDyj zsHs*SHrH}IpfJn1VXh%6Kg#IyaQDU(&hESfqFQMzG3A{V~hW2~We zPtcKtf`N)1#aMZI=CiwJTX-!>hIw(1HD2D%KhAhfZ}YQMb#lLDW)*;w|n@ir0+eBkExmAe#f ztiV12Iw-meVydhqx&R;gHI_O30Pz@FEn4P00*J@RYUc{gw?XdoC6kCD~TKn~cp zoA-4HB^;FhOvFIUd_SL4`4iSXV!!O9IRWoSLc~AENOJ<-kAz5mUlZm8xk=T8Afm<( zk$n3~bAsHYYC;fEV~0p1NOO8bExkS#=fs67#g_hRqHBI#4dsQ1%4c>JB+iMgmR8TM zwjPR(_M9us33X$s9h9gEb3)bLoaLDNwIn)uNOHp58fsaiR8>uo6RK7%r>E^cK64*H zno}>gSdMCHf}9|=RsCzZol!D1aZYS8YP)5PQu(ng&WWpL&QEDSk$*|o9pYZBbbrco z;=AcjTE(sG#maW4Fek*#95ZE%vKOn^pQ4;Vxw9{(VitO_vH;SYK)JLJD^v5mSjF~* zImyg|T&)+YvVCDrfLh)p_R6~o$d(`4W@t{BUlL`{)T(CkoItg!1~%V|)hj31ElfeR z7pr?t0>3Q4ZTpfmCy`zjfYmT6$Vs4<9WTpGH(I18$mtWcvO|Um@^iZ0DytU@Q{(4! zvsq3r)>AoMit&1}dgg?l7u{H^BNe!_o0|+&;4bc;BHy2#3*5!cO@=9Omp3;Vrodg^++>sjcX>CI zVG7*k-B3m;a92_qrNCXJGz;9Fa}xN?0=GylJ6=91aQ7`!%>p;z_IWXQxB_=m?N1lD zqa%U#u?pPn>7E5{4u$80%LT7l;6~hLfm>oWYJppDvyl@Vw7@OTi63Cr-hbox|J2^+ c_-~DW0sdEfOZvFI0ssI207*qoM6N<$f@Mn4zW@LL diff --git a/public/images/pokemon/exp/back/shiny/672.json b/public/images/pokemon/exp/back/shiny/672.json index a8bb0336e34..f877b9abc2e 100644 --- a/public/images/pokemon/exp/back/shiny/672.json +++ b/public/images/pokemon/exp/back/shiny/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e27a409eb13547a4ef97935b726389b3:05b6a88e37fb9d64101b9f9071f3afb5:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "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/shiny/672.png b/public/images/pokemon/exp/back/shiny/672.png index 2fab39d2aee36390952e5761a967008c095c444e..848b2e359624f9bfb5d60acbaa5d011b43929268 100644 GIT binary patch literal 3416 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 literal 5434 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 diff --git a/public/images/pokemon/exp/shiny/651.json b/public/images/pokemon/exp/shiny/651.json index 4289441de3d..20bdccd5bd4 100644 --- a/public/images/pokemon/exp/shiny/651.json +++ b/public/images/pokemon/exp/shiny/651.json @@ -1,188 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 116, - "h": 116 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 58, - "h": 53 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:53a767b5d08c0b868b90b8a06972f1db:ac5b599a09e8592218deeebb976d4e5c:a93e5fa02e10bf11e3ed8bf6571835ca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 239, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 60, "y": 0, "w": 58, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 355, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 59, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 179, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 297, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 101, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 329, "y": 252, "w": 51, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 47 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 109, "y": 252, "w": 51, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 204, "w": 52, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 52, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 166, "y": 202, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 52, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 275, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 204, "w": 54, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 333, "y": 202, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 202, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 55, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 413, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/651.png b/public/images/pokemon/exp/shiny/651.png index dcd70d1110009670c4321088960027bcd393915b..1e59bc97587d7b88e6683e42cd481d3d57d0ade4 100644 GIT binary patch literal 11786 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 XVunN=QhC7M00000NkvXXu0mjf07E&K diff --git a/public/images/pokemon/exp/shiny/661.json b/public/images/pokemon/exp/shiny/661.json index 6dba8b616b3..ba6523f22b1 100644 --- a/public/images/pokemon/exp/shiny/661.json +++ b/public/images/pokemon/exp/shiny/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f9a4d305d58fcbff383e0da1712abf6a:1bc270d999d234ddb64b1c01d568ad86:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 100, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 102, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 157 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/661.png b/public/images/pokemon/exp/shiny/661.png index 2b73fb85c544f5e99e70e1ad4ed3e80483c13ec2..0e2d5996bc2bad04e25c51c0a6e30c20504feae5 100644 GIT binary patch literal 1998 zcmV;<2Qm1GP)Px#Bv4FLMF0Q*5D*YzK|%QV_Asa?LdQEI%Iw2P)w^qx)aa^Hq<^0m)b73O!New((7OD^k}51GHMnrXV-%F1`) zbep2c_uGgS+6$#eazjjpI(35rd$)EG9w{+*Cuy4 zX0`tQ`};oow4Jxx)>`_csMAP_`fW6qAep^SKKJP3qfcS8M;%$2=uMkS6JKNZa4)(? zjSpAWHjXWqQM=K0{T-@)8_mVV|HU6WDt)}#SQ?#e`fU`KZMA%~NJ(M&3P~QN*U4>` z@U8%C)H-29=d;c7SjRCduSFfDr$biSM3=Z4zGDQdKS+=xEsx+I> z=p}5v?$SncS;t)al-FP$rm2>vV)J;d!)F_Tv%VA`pOq;(YpUg`*u*xTcL_#v*TpL5 z@4@O`JpA#h+3J)wuh+6Fp_Y!deRNT5!s2wf#5#}X`pqpEb_vk05#YPxRJv)d(T&SiUq zUnfDa&a(7#Z=GEm(k6{+&#{Z_6CAcWOT9i>THK66w3KbCI*f}8%X-?Zx30C0^5~zZ zd0)N!oU~EfP%gp9Cx`VG@KhC4T4AG^P@VU;6rbG$nrW_?M%WxKzTJ5p(E)rZv#;(Y zo885l`fg$OAykwNA^K}|9F!a?Lo}#P`rH_wi<3HE4B#4!D(f1Y91u7-sqoB-7iU*_ zZ!n1jP%NxLOzM2zZ`VnmJ-auO41psjCG2cT@N1P$No~QN;><}Eb{7VN`SvU*CM0h~ ze_}ww2w#H^zm_|!0QRE@r1|#OX9YMVgH>TlR~tL)(*HNrW#8?tWy)LA@kj|>Y z8Zj1xvEg9}I_n6l8ZnlHv0AHj%NM^YlY&Yi>Od<4uKNAEXU6jRcz>6I zOp!nDK`W<|I7t|l<#W5ml%7H|hFdGn#Q|1fXjD`Z#(Me0cJ7yiXrn0{Yt@9SUi*Bp zeAP{`R1i$GxaM1M^)zWM->GRR>PIhZ1>tHF&>}_sUXHC=gz=)?-d2GPvx5)YzohM+i(?obP;7UOITWy zM;>en&SD4l7?Dz&4tKnghR>}MFN*CW)dr;DbE`yOk}4Bvm@1Qfsf(Im*fv$BPV08n zk!jsjnd{rYxFC(7%5V17>Yy}Cl^F`oQe~8esWL&qd8&-kAXR24xL&yCxG;^S%9w%^ zR2ip1s*L;cR2iocRGFmUm@4BmOqF3@o+{%sNR@m0T2xs(*;_E|Cd=HZa%W$IDwk>E zWUqPFHaoYf^qq{p232mPJ<<(4DhaA=_vNXwbBmVt2z)CE;ki}SAs!7ermRwB{bX-; z%u{EX1r;?X)IpUSCwm2qYqLyIr|SDEXQUM_%d}7SN^A;PX4Y4!+d-8ZCwucFvKq@= zPH?L9t*|Lcm7RXFH!Ho=EK|k21qIKKXmeCKs%4r62Xm_YRM36Vcl!=Owgn_r&fS`< z60yvxZ*xL`DpP3~dO`=9Dl=&gLQm*GQ)MPC3;;cm0}G3}G>6F*av)(bnKt4uE)6RG z!#dl?OJUu0tVH7US;H7Di;C=lI2GVMGFp4#T)Y8Zcr@VYD5MaY?rNF^oG1 zg#Hr7?ZKX(NaL~RkUAi(gEJ0mGX{HppbmX{bx<3S_RDqX!?Z&NNTadmpfYwEk3EO9 z0crS*><_eQr`4Rcg+0gBX{RZiwuL>1wK3B08QHOQK$?9BL1_x7 zZDP*>bzmBEMt0nQX*~8ER0pKd*mJ~yRG7z}L+T(Z47u{~Iwlo{TzPCAM1}jX=YTpk z6^2}Sa34s85mz2v2vA|nm4B#Dg9`Uz&#Pn1-{CN@&t><`bMX%i>kYI9uWpIw~Rw_6Ut_^H=MVf10z%Y`EI g1$*%`6!wpff9KpTZG00001bW%=J06^y0W&i*I z^+`lQRCr#^l(C8%F%X7Vkn}Tbkr+RPPMzxnwoGG^D;F-yy@7q@K?ow9A>k0I%yxQ% zyj^DGxzlRKHY80ll|S+EFSz)+KRxK2VRg=TJ!t+5r}r+v1>SDA;$U@J-lmkcC#T<3 zXUVS<-v|2q>_djSE6jIWoFD9j%?x!{m=DRo;^dG6)Lmh=k0~9FYkG8>Jo~yUTpT24 zUjG7ig0H)U#p(U((619X40G^xSD3F4!5_kkoSQ&D>#i^#BCcp#96;H9;rjQ8bA!Iw zC0;rRJvjkhcDoZVobU0GoZyAUA?AC3a)uZm$$@52VoSiuI+V1wg z6X)Z8_mH00iHOh*D{&abdG+c3{^4o=g_N8#J9T$_c0R|r+edP~<$R>wH|=h@cd^_+ z&IGjkw%L`Tp*VL#%tywt-CYcQokm`^yK>0NG>zwWt2D6!XLqZ_2kq`i+#EAByCW*c zwGQt>;pRyk%W{stQ|}Ev+0=b7W1-e?C5S4PO4+7Tbfl5FLX?I%W|i?Wm)$S(Xj2|sQG*k z4ci`qVcSE?wugpow=COkS+?D>Y`bMycgwPEo#KDey5B<#*p%QjA3Fd5002ovPDHLk FV1gOYD|7$= diff --git a/public/images/pokemon/exp/shiny/662.json b/public/images/pokemon/exp/shiny/662.json index 9aa396fbae1..3600bbcd38d 100644 --- a/public/images/pokemon/exp/shiny/662.json +++ b/public/images/pokemon/exp/shiny/662.json @@ -1,776 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 167, - "h": 167 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3ab37b59d2c6d2f3d8b7379738b89720:769cd0fc38f80c712966ce15da281c1f:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 221, "y": 131, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 57, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 113, "y": 70, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 19, "w": 56, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 335, "y": 136, "w": 49, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 36, "w": 49, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 197, "w": 63, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 33, "w": 63, "h": 51 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 1, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 16, "w": 59, "h": 66 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 119, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 233, "y": 1, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 54, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 176, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 288, "y": 1, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 59, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 338, "y": 187, "w": 47, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 30, "w": 47, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 249, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 26, "w": 62, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 68, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 58, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 169, "y": 141, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 17, "w": 47, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 275, "y": 198, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 62, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 61, "y": 1, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 288, "y": 66, "w": 54, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 54, "h": 69 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 60, "y": 69, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 52, "h": 71 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 170, "y": 70, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 50, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 133, "w": 49, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 49, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 275, "y": 249, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 30, "w": 56, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 205, "w": 64, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 27, "w": 64, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 221, "y": 72, "w": 60, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 60, "h": 58 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 113, "y": 134, "w": 55, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 55, "h": 62 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 223, "y": 193, "w": 51, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 51, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 51, "y": 141, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 169, "y": 193, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 279, "y": 136, "w": 55, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 55, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 386, "h": 299 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/662.png b/public/images/pokemon/exp/shiny/662.png index e45e79556c551c29d5d90c0b8d206f6ee14c0639..4eae91c7855f1e9e2f9fca1e9e89abe29e5d043d 100644 GIT binary patch literal 10740 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℞~o8>&TJ>+IN4{d9< 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 literal 5142 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 Date: Tue, 18 Feb 2025 02:52:21 +0100 Subject: [PATCH 052/171] [Sprite]-2.0-batch-4-exp-change (#5277) * 707 Klefki animation change and removal of experimental need Animation is high enough quality plus personality for the pokemon that there wont be a need to try and make 1 better. this is the best animation for klefki * 704-705 change of exp + 707 Experimental removal * +707 fix a Json over sight and now are displaying properly * 708 animation change and removal of Experimental need Phantump's animation quality is already top notch and dont need to stay in exp prison * 692-693 exp change --- public/exp-sprites.json | 18 - public/images/pokemon/707.json | 1598 +++++++++- public/images/pokemon/707.png | Bin 866 -> 60116 bytes public/images/pokemon/708.json | 1130 ++++++- public/images/pokemon/708.png | Bin 478 -> 9062 bytes public/images/pokemon/back/707.json | 1598 +++++++++- public/images/pokemon/back/707.png | Bin 767 -> 53052 bytes public/images/pokemon/back/708.json | 1130 ++++++- public/images/pokemon/back/708.png | Bin 415 -> 8914 bytes public/images/pokemon/back/shiny/707.json | 1598 +++++++++- public/images/pokemon/back/shiny/707.png | Bin 766 -> 53052 bytes public/images/pokemon/back/shiny/708.json | 1130 ++++++- public/images/pokemon/back/shiny/708.png | Bin 415 -> 8914 bytes public/images/pokemon/exp/692.json | 1148 ++++--- public/images/pokemon/exp/692.png | Bin 2127 -> 2628 bytes public/images/pokemon/exp/693.json | 1172 ++++++-- public/images/pokemon/exp/693.png | Bin 5995 -> 30712 bytes public/images/pokemon/exp/704.json | 2153 +++----------- public/images/pokemon/exp/704.png | Bin 5657 -> 1246 bytes public/images/pokemon/exp/705.json | 866 ++++-- public/images/pokemon/exp/705.png | Bin 1913 -> 22217 bytes public/images/pokemon/exp/707.json | 1931 ------------ public/images/pokemon/exp/707.png | Bin 6310 -> 0 bytes public/images/pokemon/exp/708.json | 1028 ------- public/images/pokemon/exp/708.png | Bin 3240 -> 0 bytes public/images/pokemon/exp/back/692.json | 1148 ++++--- public/images/pokemon/exp/back/692.png | Bin 1711 -> 2046 bytes public/images/pokemon/exp/back/693.json | 1130 +++++-- public/images/pokemon/exp/back/693.png | Bin 3625 -> 26876 bytes public/images/pokemon/exp/back/704.json | 1841 +----------- public/images/pokemon/exp/back/704.png | Bin 4012 -> 620 bytes public/images/pokemon/exp/back/705.json | 824 +++-- public/images/pokemon/exp/back/705.png | Bin 1474 -> 7798 bytes public/images/pokemon/exp/back/707.json | 2078 ------------- public/images/pokemon/exp/back/707.png | Bin 6398 -> 0 bytes public/images/pokemon/exp/back/708.json | 503 ---- public/images/pokemon/exp/back/708.png | Bin 1754 -> 0 bytes public/images/pokemon/exp/back/shiny/692.json | 2639 +++++------------ public/images/pokemon/exp/back/shiny/692.png | Bin 2189 -> 2046 bytes public/images/pokemon/exp/back/shiny/693.json | 1130 +++++-- public/images/pokemon/exp/back/shiny/693.png | Bin 3625 -> 26876 bytes public/images/pokemon/exp/back/shiny/704.json | 329 +- public/images/pokemon/exp/back/shiny/704.png | Bin 637 -> 620 bytes public/images/pokemon/exp/back/shiny/705.json | 824 +++-- public/images/pokemon/exp/back/shiny/705.png | Bin 1474 -> 7798 bytes public/images/pokemon/exp/back/shiny/707.json | 2078 ------------- public/images/pokemon/exp/back/shiny/707.png | Bin 6398 -> 0 bytes public/images/pokemon/exp/back/shiny/708.json | 503 ---- public/images/pokemon/exp/back/shiny/708.png | Bin 4648 -> 0 bytes public/images/pokemon/exp/shiny/692.json | 1148 ++++--- public/images/pokemon/exp/shiny/692.png | Bin 2126 -> 2628 bytes public/images/pokemon/exp/shiny/693.json | 1172 ++++++-- public/images/pokemon/exp/shiny/693.png | Bin 6269 -> 30712 bytes public/images/pokemon/exp/shiny/704.json | 2153 +++----------- public/images/pokemon/exp/shiny/704.png | Bin 5659 -> 2532 bytes public/images/pokemon/exp/shiny/705.json | 866 ++++-- public/images/pokemon/exp/shiny/705.png | Bin 1851 -> 8405 bytes public/images/pokemon/exp/shiny/707.json | 1931 ------------ public/images/pokemon/exp/shiny/707.png | Bin 6292 -> 0 bytes public/images/pokemon/exp/shiny/708.json | 1028 ------- public/images/pokemon/exp/shiny/708.png | Bin 3255 -> 0 bytes public/images/pokemon/shiny/707.json | 1598 +++++++++- public/images/pokemon/shiny/707.png | Bin 866 -> 60120 bytes public/images/pokemon/shiny/708.json | 1130 ++++++- public/images/pokemon/shiny/708.png | Bin 480 -> 9062 bytes public/images/pokemon/variant/exp/704.json | 48 +- public/images/pokemon/variant/exp/705.json | 57 +- .../images/pokemon/variant/exp/back/704.json | 44 +- .../images/pokemon/variant/exp/back/705.json | 42 +- 69 files changed, 20785 insertions(+), 21959 deletions(-) delete mode 100644 public/images/pokemon/exp/707.json delete mode 100644 public/images/pokemon/exp/707.png delete mode 100644 public/images/pokemon/exp/708.json delete mode 100644 public/images/pokemon/exp/708.png delete mode 100644 public/images/pokemon/exp/back/707.json delete mode 100644 public/images/pokemon/exp/back/707.png delete mode 100644 public/images/pokemon/exp/back/708.json delete mode 100644 public/images/pokemon/exp/back/708.png delete mode 100644 public/images/pokemon/exp/back/shiny/707.json delete mode 100644 public/images/pokemon/exp/back/shiny/707.png delete mode 100644 public/images/pokemon/exp/back/shiny/708.json delete mode 100644 public/images/pokemon/exp/back/shiny/708.png delete mode 100644 public/images/pokemon/exp/shiny/707.json delete mode 100644 public/images/pokemon/exp/shiny/707.png delete mode 100644 public/images/pokemon/exp/shiny/708.json delete mode 100644 public/images/pokemon/exp/shiny/708.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 6ee812d67be..6322b8968f0 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -409,10 +409,6 @@ "705", "706", "706", - "707", - "707", - "708", - "708", "709", "709", "710", @@ -1543,10 +1539,6 @@ "705b", "706b", "706b", - "707b", - "707b", - "708b", - "708b", "709b", "709b", "710b", @@ -2679,10 +2671,6 @@ "705sb", "706sb", "706sb", - "707sb", - "707sb", - "708sb", - "708sb", "709sb", "709sb", "710sb", @@ -3820,10 +3808,6 @@ "705s", "706s", "706s", - "707s", - "707s", - "708s", - "708s", "709s", "709s", "710s", @@ -4652,7 +4636,6 @@ "705_3", "705_3", "706", - "708", "709", "710", "711", @@ -4969,7 +4952,6 @@ "704b", "705b", "706b", - "708b", "709b", "710b", "711b", diff --git a/public/images/pokemon/707.json b/public/images/pokemon/707.json index b37a090ddb5..ee5036fb541 100644 --- a/public/images/pokemon/707.json +++ b/public/images/pokemon/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:56a3742632a462544b501f22a2cb2e57:5315127216c0bad2620a5352c4e424ba:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 578, "y": 149, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 95, "y": 62, "w": 59, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 14, "w": 59, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 519, "y": 2, "w": 67, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 67, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 280, "y": 2, "w": 82, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 82, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 93, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 63 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 95, "y": 2, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 95, "h": 60 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 190, "y": 2, "w": 90, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 90, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 362, "y": 2, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 445, "y": 2, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 74, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 586, "y": 2, "w": 65, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 2, "w": 65, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 2, "y": 220, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 4, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 319, "y": 447, "w": 42, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 5, "w": 42, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 447, "y": 489, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 614, "y": 500, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 10, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 573, "y": 453, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 267, "y": 480, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 184, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 2, "y": 443, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 226, "y": 442, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 130, "y": 438, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 366, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 52, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 682, "y": 221, "w": 48, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 18, "w": 48, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 519, "y": 361, "w": 47, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 47, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 43, "y": 502, "w": 44, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 20, "w": 44, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 714, "y": 505, "w": 41, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 41, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 402, "y": 489, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 471, "y": 219, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 692, "y": 80, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 389, "y": 147, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 399, "y": 297, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 610, "y": 375, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 141, "y": 360, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 638, "y": 79, "w": 54, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 54, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 362, "y": 67, "w": 60, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 60, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 474, "y": 73, "w": 59, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 59, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 264, "y": 147, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 57, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 298, "y": 264, "w": 54, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 54, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 524, "y": 148, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 211, "y": 135, "w": 53, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 53, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 471, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 569, "y": 302, "w": 48, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 19, "w": 48, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 154, "y": 134, "w": 57, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 57, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 154, "y": 64, "w": 60, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 20, "w": 60, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 214, "y": 64, "w": 59, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 19, "w": 59, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 2, "y": 292, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 18, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 696, "y": 426, "w": 41, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 41, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 533, "y": 73, "w": 53, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 53, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 56, "y": 135, "w": 62, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 62, "h": 64 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 662, "y": 373, "w": 62, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 62, "h": 53 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 655, "y": 505, "w": 59, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 22, "w": 59, "h": 47 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 422, "y": 437, "w": 61, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 61, "h": 52 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 326, "y": 136, "w": 63, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 63, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 321, "y": 198, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 57, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 519, "y": 291, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 20, "w": 50, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 445, "y": 363, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 20, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 45, "y": 426, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 189, "y": 352, "w": 44, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 44, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 667, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 425, "y": 218, "w": 46, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 40, "y": 18, "w": 46, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 148, "y": 203, "w": 47, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 47, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 572, "y": 224, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 18, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 244, "y": 287, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 763, "h": 577 }, + "scale": "1" + } } diff --git a/public/images/pokemon/707.png b/public/images/pokemon/707.png index e96c81bb95369f8219f547fe152e4767c745a9e8..899ab995926e35fddbc93f56da45255bbeaa5183 100644 GIT binary patch literal 60116 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 z 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 delta 856 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 YA38^ry&*^IjQ{`u07*qoM6N<$f~JZ@`2YX_ literal 478 zcmV<40U`d0P)N2ei5HJVTh&817XEHd{7eazko zQ-Q0w|6s&t`{x8FVnij9ndE8SCAm(rf)q~xLibYW06JTQih)-P(~wU6YGCSM-cCKS zd3|D*5E&aW#mEJ>WDh2Aw`45ob31@VeTH>>iQW`8D=PX$bR*qg{%VD!Z3FhnC>#ggtiM>MEe_$Oo*^kPm0 zUODt?9oV&kQ_|`3= Uq{stNX8-^I07*qoM6N<$f>_AQ1^@s6 diff --git a/public/images/pokemon/back/707.json b/public/images/pokemon/back/707.json index cf372e6a60f..b92e1983efc 100644 --- a/public/images/pokemon/back/707.json +++ b/public/images/pokemon/back/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8e9f9a53c8e85bade8027fc978f717a4:3280efd867363be1c2e5a01411ad5bd5:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 428, "y": 143, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 98, "y": 62, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 14, "w": 61, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 530, "y": 2, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 11, "w": 70, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 194, "y": 2, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 85, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 96, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 98, "y": 2, "w": 96, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 96, "h": 60 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 279, "y": 2, "w": 91, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 0, "w": 91, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 370, "y": 2, "w": 84, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 84, "h": 64 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 454, "y": 2, "w": 76, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 600, "y": 2, "w": 67, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 67, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 372, "y": 210, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 4, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 172, "y": 450, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 526, "y": 443, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 432, "y": 453, "w": 41, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 10, "w": 41, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 43, "y": 438, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 2, "y": 435, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 13, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 565, "y": 366, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 131, "y": 429, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 485, "y": 426, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 649, "y": 421, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 2, "y": 281, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 53, "y": 214, "w": 48, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 18, "w": 48, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 354, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 345, "y": 421, "w": 46, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 20, "w": 46, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 567, "y": 451, "w": 45, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 45, "h": 68 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 423, "y": 218, "w": 52, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 52, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 2, "y": 137, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 2, "y": 65, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 19, "w": 59, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 600, "y": 71, "w": 58, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 19, "w": 58, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 577, "y": 291, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 303, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 400, "y": 364, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 524, "y": 285, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 266, "y": 213, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 19, "w": 60, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 674, "y": 219, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 58, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 150, "y": 288, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 18, "w": 56, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 250, "y": 351, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 53, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 674, "y": 149, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 214, "y": 145, "w": 52, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 52, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 48, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 161, "y": 217, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 343, "y": 66, "w": 61, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 61, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 279, "y": 64, "w": 64, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 64, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 667, "y": 2, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 19, "w": 64, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 101, "y": 223, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 89, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 671, "y": 281, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 274, "y": 441, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 62, "h": 50 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 275, "y": 491, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 674, "y": 505, "w": 59, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 59, "h": 42 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 612, "y": 498, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 213, "y": 491, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 62, "h": 49 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 372, "y": 287, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 21, "w": 58, "h": 61 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 96, "y": 296, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 51, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 84, "y": 441, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 728, "y": 149, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 42, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 690, "y": 434, "w": 44, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 44, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 669, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 259, "y": 275, "w": 47, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 47, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 212, "y": 218, "w": 47, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 18, "w": 47, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 578, "y": 213, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 18, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 724, "y": 281, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 772, "h": 549 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/707.png b/public/images/pokemon/back/707.png index 78aa7077f905c0b7c7029fa3a8c857ca5607437c..83ca7298f451d674810fc1c95504dd832fea7f85 100644 GIT binary patch literal 53052 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

    j&UFj(q0ux_ETi@F- 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 literal 767 zcmV`B}<>lq_g_rWqh4}dRxrc;v00001 zbW%=J06^y0W&i*JeMv+?RCr#k(XndWKoADt8F2a?1)Y74InX|VgI{0+N+6ITDwM(o z6T@ZU%2ZdSFlpSGfH5qnadC}`0~e{T3LJrenmmGwYgDLllQOe91(8_062wzT?D8@5 z4-0MWC>T`ZtD#N}bJ=>38<|ITQ#H)Z#N)a%cvOd92B4idMx)|b^|04QlZj2XRy~YJ z8y&}m7rrUTzDEqe(9@0?e~khQmAlzP!m_L=-rJM2;la9|YO>;cbL^_7 z!Pr=+?Ahh)JsMlZm1pol>#}uy;c(4Z>wc&@peNq-%tCj-=60<0Y@lPw&bi1z>ohyp zBF!aU*KQ4c&e*w`$BotYXEFGi9b8#g-E_y}c9>ch z(Xw`;J6`KxQu5eRIO4T#zbf;}6Au%p9WtzhGhV$e1QFXwxpBv1M_b1UJ@MEj>@0Bg z+q(zrQqj2m)9&Xb@wdYTKd-AWO;|``h^Nb>&poxSTHbja4RlsWY2Bi9J0P%byYO)( x+^}|5Ls<4Ws2NOp9W?F^h7|7Kz%bY~_BTEp`3mmzr8ocp002ovPDHLkV1kWUa+v@C diff --git a/public/images/pokemon/back/708.json b/public/images/pokemon/back/708.json index 33edc5748bd..22aa1885edb 100644 --- a/public/images/pokemon/back/708.json +++ b/public/images/pokemon/back/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 43, - "h": 43 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:baaaa3a73da00bbc954269f5f5228420:171d77a039e525f9a3a332d9e2d5d82c:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 88, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 175, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 10, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 88, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 13, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 132, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 14, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 176, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 220, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 17, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 264, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 262, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 44, "y": 166, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 23, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 167, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 88, "y": 206, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 20, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 220, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 44, "y": 247, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 218, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 262, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 177, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 264, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 222, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 307, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/708.png b/public/images/pokemon/back/708.png index d6ba8dd838caf9e304a088f6d1fafa6a1b6fd96d..9e094aa7122a634de5507c96f1529a63226fa510 100644 GIT binary patch literal 8914 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 JPDHLkV1lNLxk3N{ diff --git a/public/images/pokemon/back/shiny/707.json b/public/images/pokemon/back/shiny/707.json index 8151fd60f08..b92e1983efc 100644 --- a/public/images/pokemon/back/shiny/707.json +++ b/public/images/pokemon/back/shiny/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c2d2cb3b868498a2b93c8233ad35af4a:09ee133b9c655c6135da1abf1c9b6ddf:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 428, "y": 143, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 98, "y": 62, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 14, "w": 61, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 530, "y": 2, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 11, "w": 70, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 194, "y": 2, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 85, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 96, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 98, "y": 2, "w": 96, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 96, "h": 60 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 279, "y": 2, "w": 91, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 0, "w": 91, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 370, "y": 2, "w": 84, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 84, "h": 64 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 454, "y": 2, "w": 76, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 600, "y": 2, "w": 67, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 67, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 372, "y": 210, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 4, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 172, "y": 450, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 526, "y": 443, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 432, "y": 453, "w": 41, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 10, "w": 41, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 43, "y": 438, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 2, "y": 435, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 13, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 565, "y": 366, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 131, "y": 429, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 485, "y": 426, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 649, "y": 421, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 2, "y": 281, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 53, "y": 214, "w": 48, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 18, "w": 48, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 354, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 345, "y": 421, "w": 46, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 20, "w": 46, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 567, "y": 451, "w": 45, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 45, "h": 68 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 423, "y": 218, "w": 52, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 52, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 2, "y": 137, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 2, "y": 65, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 19, "w": 59, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 600, "y": 71, "w": 58, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 19, "w": 58, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 577, "y": 291, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 303, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 400, "y": 364, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 524, "y": 285, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 266, "y": 213, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 19, "w": 60, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 674, "y": 219, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 58, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 150, "y": 288, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 18, "w": 56, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 250, "y": 351, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 53, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 674, "y": 149, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 214, "y": 145, "w": 52, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 52, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 48, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 161, "y": 217, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 343, "y": 66, "w": 61, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 61, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 279, "y": 64, "w": 64, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 64, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 667, "y": 2, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 19, "w": 64, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 101, "y": 223, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 89, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 671, "y": 281, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 274, "y": 441, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 62, "h": 50 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 275, "y": 491, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 674, "y": 505, "w": 59, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 59, "h": 42 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 612, "y": 498, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 213, "y": 491, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 62, "h": 49 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 372, "y": 287, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 21, "w": 58, "h": 61 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 96, "y": 296, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 51, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 84, "y": 441, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 728, "y": 149, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 42, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 690, "y": 434, "w": 44, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 44, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 669, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 259, "y": 275, "w": 47, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 47, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 212, "y": 218, "w": 47, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 18, "w": 47, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 578, "y": 213, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 18, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 724, "y": 281, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 772, "h": 549 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/707.png b/public/images/pokemon/back/shiny/707.png index da84624a35c7d7bff385f7419d98a888dee5c697..8d7e59220917bcbd3b1d2815b9aebae74a72278a 100644 GIT binary patch literal 53052 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

    j&UFj(q0ux_ETi@F- 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 literal 766 zcmV@|jdUrly6nv$MaynarF$<$he{<+$?Bh4}dRkI-ZQ00001 zbW%=J06^y0W&i*Jd`Uz>RCr#k(XndWKoADt88D>XQ7}56;{)vzIQRuNAV>(LNa6H( zgQ!x##>8+Cah*x!$^=}P1r@HY5C~kQxh8N$2&iy%g+Ps~beYv{5DD6qAf7^Emyel$ zSmNb{?-2tq^t5BfU#-AEM{TOQ_6$DgT)u8E9L|n4?x(T=o$+oK2D$^<+i8|9Mmm=4oQoWEE@S6f z#9rb}>((&jw3(ZG+*ECUn&aha(4l!avR57lNJQXq6YBuq!YH@=qC z{NB22_#c<4Kh7>PVdq(7_gHino<)$l0sR4ydII+Z3?%*CzrRRINod0%Wy<5^v%9UE zy>hjKKt@3n5&#LnO{Uy#5{Ijmz{?AE^A8?(e!5!S?HwIaxOuVh%neuH;y8#X`@BS_ zLn*`6$Lw5AviVD&3)m$@l8Bxx`QvgI0nbenDKH9`MNx}>w|DiNPScdw&5DzgqI9`m zhd?PIyT;@2@&O=B0A)mVv1E7K@25JS&qS_tdziy!SX7>5P!lxMl5jKw#W<;gd$V wVe5>BupV&GGMEiIuPx#8&FJCMF0Q*5D*Y6Fg!_4TUl9IfGj5EP(`MurrFuqeo!5I00009bW%=J0RR90 z|NsC0|2G1g)Bpe=07*naRCt{2UE7x9x{k9_N;&`k#S`mFQX~bY;xj#GjbC=}ZWIGT zvdc*T^EmV)8Go-qA9p~H6rd0*d=KCIgt&?CJ>ZyRp~4Z(eqeBHPyXOwn1tV1$^jMv z8`A9YgNl|OxV+y3X90Aoyz=pUKB2-A`<4u(P^+5YYu#8~N8SbNa1dCpa^l!a1C#A5 zzjgS9>MmH1Z<0&l(R~H#{sHUtCa_moi|$#VOI>Yau2{S9B10>yfkSlz*d`gI*;@DE zad_n?Yc5&Mtyr7yx)cRF!0#=X`^mf2fu4zP4gu_r#L-FA-q3Zsz~bsB>e|@!U?;}p z(ByqS1@@=kcfFO*FUmJRm)6ET+65liTG^`0v6aNqn?fSc+xtpg!2Mrx&S`DV#;$x{ zDurJ5G0PIsF7R6S!Ruy^1I7LtIy5XJ@$Sv7`=fApuREy}E?NIh&h&RczCNU>}^srEkR|y|oQ-{UH^?@Bew7`An@fR=09s z*!+6`sbkZEJ)RT#rf|->=^P828{o<6X07gZ@oU&$gTvTQ1zQLc9T_mEoM ziCufkCnp@oo&)Q0XuYZWW}L5&O;5&GV9(C?Ts4z*2R8o$*w)+cFV#VV(z>>0A8{xz zn8q7YZBI_@^$)YILwKx3pzeHA>|;;P;axfDP#jxy$ctviVl;i{JF^0|NN|1Y#Tv!# z>rM_%-P+qh-j60jhny?)pl@Am?1}c)4*HqDy%+;aKHI{vKwU!OOa`|1M&EtIbobbU zmi55mYZ4bL!1rMtXc2-b4EGkp8k$QA6b@h`y&Wpn?(I)l>l=*zRthF5qR`m8I>~T}w5Qih-&{`SBlETLI zNySF$Zn1=L`d-~~Lsfs>rcG-U3}X|3WY|6WGc3vh>aBd;0^vTuJ}~4zgAMiOeC@t+ z2w)!(4k0Y&*of8zd+XmF`~a0B*hd9Jy`?x70!Qi|aUGz=2w*>G4ca>$i(R8CcB{kn z&+)q0Ss%d8-e9b|7QLAWU!-oqT{Isb)CI7ZX0pt|k1AjsiCj_v&b zE*a&pxznjDi&B8;_VWzpfXWb&EJd~?+#9F+RlYFxHV&~J8Cr@6-2`)>B=%=~q_+fL zNl4ZGMY3;6@b0?;w`I$CQL12M}>AEQt0Bn9W5iISLVR;-k)ls3pkY-A*0~Jj=^Qp~z z2QF4t3HCxOc4eEN%xc)8l{f<$n+fGb)-B0(AXfMOS5{f(pp)6pAH9(T_Pa1W@@fu#;9m+M%j`)&M>nCMYDA+c=lm>g+rCm z<7DxRwYBRk=>MEmtZ}+=u$L`awz`B)8~?G&u!66z*+%8pK@&tP_)<8kS!SZ?k(Ip0 zP-<91V#&3d=0!-pMazqbxYLAY8X7v8zyq8KxS>x1=HVTZhM66oLCu~#FLGJ#wbt?y zLn$xyGPe$p7n!-4#A7}@v%<3kUEtaAi-1W!VA}XcX|*z04Olag7a3JWWaTxZ4?X6S zi408N{-?dsMm0*T zgM8k`^v$BK$aOqgwuA;HQWtH_tWX)A{l{K?|F%>~`42VnHv>C4jhxCS50-B=quB>q zwXDQ3dMo#`1UhA47oKOopcWQtUPQ@t@LZD2iwGZoRe{Jb!OU=9z%5BtmU&IXOegfbxeQtv+Uh2@Yui$xTsLi3Q{?5Dt{oE zXl>2oOzezmNGOj4!P%10nM`1GO4P`|$RMyYdGIbh(@{oY=`;^+vy&e^vcmH?3bya{ zB^tHKU(^*Y=bO=)1Q#F`*Z@}@$}z4GW>jJd{J}nR*v>qTmH?SbRqXs7Lo z`n03V@N_A2@TM{sI4qi5leeZPHC{sA3mnahxS9#ZuE1$&4-_~gniW|QksvbxvdZhB zCs`2${JRWUicl*@Z2y>OR#aoz4u_TMc=ec%cnk@g0kMNgtJB<*;R4I$E233R*7(F79AV)HV z!>L@Rvhf|fURrO=kRgz8aWW0qp~f$=8k{kp2H!}oLl2Btn?cpV1H+ZUBhVUm&kv{{ z$N|F|jRqDyP&k|5t{JQB=m8ypD2xL2E~c?;iBuQ}!{mvLRQ}u5j8gz=t}&loWteNZ zx)T+E!WqKGD#J&lH3r=-Sr34KxsGsP1hk<=Dx*grveJ>)jS|EbaRX9x%svC7W0ld8 zXluC3a1=(r_>Tle2Kwt!6!b`V$qEIXE1^(DB(yTo06bP1JVKqdBT#s|Eo+!y1V%PB z+mB$SDfU~URR=I!6Q@dKK%CHNEQf!(674F^aC&M-%XM|_EpW$3`l54 zGP2lRX9SF|MzAt+l*mf_3<9oZM=wmSfb+c8F``w;ui~vKYwZth_FUhKFqB6hJQ9p zV&~cBU@z7o)jq0mRn5h3=1?}l61jPti5Aoqf7IB)GSULul<5)Kz}As~_{V&RH5@heHS3&VFf>L5@Sw#&rzBN(zOAB&gw^lW3DY zh`pNH!Np`6If|sN1z8Ml1JiYbk8M`upjBBufXo45qbC|%R319aM8#~aVLS9SqXhNR zL=AH-!nAN8o01e>HgIiEf#QdV%w!V(SUT(f)AIqRItQe|`IgK~2NJ(HYgB`VEJ>h( zTj+m(tBLVMa?X^cBYGz41sz(;*WB@QkdGwV>&MX$_UJ177#V-NIx8k3C7( zjqYDuvKbb!Iy-0nW1U;lOduym|EiIS7ss~e{P!rqWMLg$GqG-x12bcf%j==;-`w|a zR5OGDdCLE}W>!vxZ#kWn$^%QBnHCFGGh^Lm-L@y|wXg5>nKhc-eV96U_909=2IIhE zC~jr0L*F}&Exv!&+yg7dy0N+kv=(8_o&g3^GXTAb`7GGt=C$G%!WIwL-Nc91?$9F` z|8U{~67A}nh2zrQXIkpO+>(>REHH?ZX3#yYgMfc9@lG&}8NtOJ}Z@tRw)=AHJpqqew-$arZcrVs*F8lWjQH^Em>>agWu;hZ0 z(vUYNL&l&)Gb3Al#s2+Ys4pF^OGW#xQ7ah#2n8PkU(-*oJ7!Er z7oz5CzHXEXW<~InLJVBd$oPqPt^+Ek!XA9QB2;A z!S>?t7>_^SgcMS1JTeI6n3@5sI|=0C2eyYEM24+9NtnF--&k$CfGLn#400j&4Gir_ z0^a6k(1SacW10b#$4~gZCAxv#%Bep!A5ynxVeZsy(^Y$N`@Eeknv1 zk%5MMuuu>zFg`9LzSqf?*inX#kPK}65c2wwltjOsMZElhy&l-?=n~H*Fvwu3Hrx= z+Z3$)$+0o~Cpw5k81qF8g+rIZEH1K}&A@ki5|7yT_RgmAbsiZ%xjE#_2e#3EGszNg zOS%`{Y=0oX=*R*X9tGiNo>RV?sfT@mV zOW*0x{-uug*i?>+W-J7`t1jl;-W$_lO<#~Cff!n%B{imI)mQ9c=M^HI`aBd?nPBPV z*sqKpNt5AvGp!l(*}w&Vq6KsO7hi9CS2%v0BumcXRwP)NsCYhSaE50>Q+d^^n6hS|Q^8lMYWC;8Ar1zj{Fsll-0k2;pl0GY1zV%%PHGjs3oIUw80ux2Cx zB0>_>=q?5>taB%3^W{%uAd8;VXeRNBB?$$+?%b1z4&w^JvJczJux2dzFwOQoEmAe3 z0~cyo$xdJNC+u^-J;U;3$&=1zQ0vkeAWu&RF=d6$M(`>JuV?LNNKqD&kWTmEm|l|) zOyDx1p^B0f?8tSn2?n`sWIfe!&fLsEuR4&P@X9gC=xITs1T)Rho$gO19l+8Td@8|n z7=>j@;?>ruuLX5@d#R4G*?E@0)nQJ3@GHl%QT?i;@I`GQyKARJIj4Z)9HQOg2GR9?C`s^c)xV>LwH z38);L$nyMkduzwM!`*}=7OXv@qU~Qcf&;_u(1iulY*#s`8Ir#sZwkJpuU;6$`Z|am z?94csm4gFWHhV`MxDe0`9Z})TBv`?Y1$kag#sw`@Iii_mwpVTDPLcrBp_~)EvTcf2 z8jC3$sT>gvHrp46oPm{K+itJrI$~IFV#mq@uZ)Uj>!6j4M)MRqvXNBBTG(X~sf-_D?!?A1$CD4Pk(3SA*jWehRL2pTTN0`q zIYLo_yV4h-y6n8zn+I>Q5e2gZC>HjJrDDX!DTH(g-IQ$V!dFv1vO}+cYCr9WW(mW>87VOh{O7*kMdqj^l$9=u|%BY4g8~Rp64&qchsf1 zm2rh=0RTc`2|vsY!S!ueLYTyN0#i65DG;`G$|Jnx$9R)Nw+mMz^yS@pH5N>WMc?Xb zd?{-&>T*;1h*cbq;HEgMCH>6b^l(QGKgPrIVPGA8%~pZToYchAt_DL4?U+!0jYY8{`R z{~p2Ud{Zkngk;f~p+og;v$-Xk6v&foowM1&&#H!&zi5uy=^d|QJ04O8p>M;!dT;W~ zp!&KTxW1a_pC(aGv3IN~9NQGgGSh;4P^O1o%U^IuZO4w@79Fx#*I5gLgR<8pwr3yC z8bpzMXXbH{hXXcHY^Vk>AnE8eeGZ9KOLevmkiel72zSL7sD)g&nio4ua!WXNg_VO>S7;U(8RF|8SI+ZS z)Oiws42RtCJBJdjyNPuqOoqk*QelWT(Rj3DYm8~`88~$S$xFd$KLLYs0GzUz|0=Ov z8L7KN9?e3(2UZs}SeJnJg?ml{^Q#3y6{x%wTx{lVIpa-FfgC2`x_#=)b|hdNKM?R-{YXGyfRT|4v%j4`pH#MXaeDA!60U>i zK@QKian}|+3U*CquHJRlUl;03a&Vx> z(O(w=OF~~7D3RK(L4df^{qaCwKg8ka!H1Z8{JvcIuz0dq2Qwf&8vkMCigthsUo^($$5ve$~ z3o=VeE3IiNX76B&VbGpou0@ah8>I=Jx54oa-esxRKP@k>uSsM*9(zx0M|V{7&% z(X=&LSVStg4hq_wq@X@9-nOqF@-drm#)ewgo#&}99)4mf2GM%uY7=%QN^A;KYpCvv z*L0}zuF(fTG-3DmbXbEAgsh5wU^*!1#yKb}YIjz96WeM1(?75jI-;+gN4j$2xivc-@yW2hu z|M5w5P&zBvlNhmyt4%wHma62P(OJ4tz8(mr>a*ET=kigECD%Vy6QgwK(*crdL zOpTQQnWS)V7G-6+&HQZXfSJ{pnvqBak4c=U?==L193R*zMuqth3w<{{$=C zeQZ~fh>fB!XVK^yIusH5^oinV9-|aa;(Hw|&NUv8Nj%^vu^D3dcVZIHTz+|{b1YkK z1adc|6T@_KdXmn%;h(bYuHr_3#!wW6n+|P)LHC}Q2-8_}466<$*;d=nEn>6y!HKtd zYSzAt9v1o$51=zcsFk(n2x_E)CkZN`&%YQ1`b#uNZ~6VlIwPro$(DMw*g2#roJnta zY#z#D)uF8RGd0mjbJQ2loMKQsAQq{3KD&v(M9NMg*vU59Rg!czTU%ZHglyZFd82S= z!LkH~4y%V=JLb(qlA2A+za9?|mD=zWf?eiccnrh}@7VTrp_5j0g?s)2VKFaipdWl2 z4;Xhpp5yeU zZKPtG#^Fx9eQQj!r(as1tbys^dg#}$JpwTa5bF`(GHeB=M6EGMv+^Hwa6I(NH(QZ- z0EqS2s$?yJjgtaVc*A0?Y3NZW4*Ct13C#j(#sh+piUnF;fK7bS+SrDqbjgyK?bz7oeyJxA%#zzMcc<2a)OX8 zzfDQdRo-IDI3&>Sa}7>1Pj!y%FaK>FI{pC}!qdnHAT`^?7=CCyZqx$7l>?@5ltpv? z@1Mg~V3;$%+g~vPunfmwi-8YJh(rPqVAcMx|6R1AeN?>vniooHkh&2QWdz&}zPl6i z@qou^Or5QPz&?1;D2jk{~C zF2R8B(ZemgF&y>iLATR;LJ03ISopCKBN5V`X3bwd7XcWfK#pwygJFT3L|+bnHTa|c zckZuNcq3Wrzb?1itRo(qinKD3VS}ZeT~U`!ZC2Wk8&NoL;Q=_y@Q(ZPxCje@5FEJM zVY?EA<4A1(K)WF(!U64H2FFWBnFKgL_SsZ2lm@uf2@vf+5-_Ak@6~Z8Are?U{C4^t zSNIZDIz#V0vH0Mu;3 zczFi&C?5^5%Fk!E^8rG%O{gMBgOOlXcg^$<*sJ9l*Q$ReET1Fp1_V}9vE$;8(OB*4 zw7p1B!ma8!=wobyHh$sE|DI^JFaBH}E{|%q^p@`sZ4C&p!3a(ScXvsRbTvNRwFNST@4nANm;bF5L-S}V?43`Tmu4Fn&BhOjC_FNi!aal zZw6~?HUbGhxV`0BHgbr70DEG+2nYyAx=1q&4mnEUkegkk6o}{lxjg5e&N~>I^?4Fv zjY)6BAuD2Gz`>vLf6gb?uK|HXGiupMGlWHxtD&Y8NONg;0jZHc$?(JCw)eshF}ft8 zQ2g+D1_ans=!q}BI`kC&o#`E04*p%s*bW&_#sBu z2?%J;{EjV-?U#~f_((G~AJ9_@+!x<98*b(rlz6K#=2X$VIC z%qP}Yw#Rc!1b9&=w&LP{#xJU;O2SAU9Ktl+vE@fcPc1M)*I4Ddd9I^&Jff}1Jpcd# zL`g(JRG;08eauyx4i9Qce@fr>OFZ4)ck15oJgHsAe{~f^ov9BTxKg|8G?JdMMkWkn<(m$hcY*(WlT?*M#*LBp#QKj;O&}kzIF?OQdZp1LufB5}c!H^;84?gUHrvd4HaDzU zHZ@!QVpg`KNyfqtrVD!GEOQQbEff=fAkBas&)t9qt+JsR8PT(I+waVH-T?;$HrPK< zICd*%;q~K#z(|;GvNc=IiJ&7LCsAJxV{y2ewfo6!*}r{nXu7Knv-=Gc!mFWepS%)r zHpHL5Yc({(v41-?Tir-b0uD+9_CuKQxh&o8DgR$)aA^1V<_&?KlhDC%o*_y%EzW$~ z1$UmD@z+cRp_D>k+`&@zTYT%%A)fz~$TEM`h7rjJBz)XKEOrng90~~Z<9n|^3!gzB zKa_oFZu{>WZ6ap(5>xm(gUMoByW6}`C1T!u^q5lt04xsujK#)oo&uv0X4N~k8EAK( zjosjOnJiq-C+OoZ1t9t=&soFFif!fJ2FnQt;jOAM$(vi@`D# zcU;l@((RN4ZL$;g_0t0PgoDof4{1;W~Bz^NYdeCY5m?lXLw1=PKRMI!5ky*|$~ ze2;K?&=81we;8ZlD2u&jiR~TGIerIU{Mr5N?D@K6Xz8GPK9pxbkLa`eZ+RDx+6W@3 gbollEX}A6V0PCcw^af8>avO00DGTPE!Ct=GbNc00A;dL_t(|UaiuxYQr!PfZ-F^yCqt8jn937 zrZ1otRbEqw!D~RA=YoiyAkfFI?nr}DYwW)mKApr3hFfX}wMq**$anNvnk^ykl;d@&qw2mp*@{M9#Tqmm+u~%d99glu|mUH3^^Q%m-o0 zl-4sP>*?|P05kMNjwGK?9SK8b@9DSI2kI7K3I#h)T`SDD%R1l`QD0%uW+mtS*u)EV zZ!#H_hIt}yB5|mT&6kLW(KIF5jVq1s{wKIcN)|N(d_S4 up)}|^ZPx#Bv4FLMF0Q*2L}f|Jw0+(99LIY&7C^`#Yr!6fJCCSVB7Mvw6wGG|E{FuOaK4? z40KXXQvm<}|NsC0|NsC0{|UrUCIA2lwn;=mRCt{2T#J(9stycx67c5#|M!A;NkTY) z>`c|EOYKf&GHG|KL9r9bJRbia?bwY5y$aT_E@3lhf6t>U;i~Kf)*^UCaUtAa3(W6I zJ&9a5StA&s-he{aw@}36SIU~r&b_eZ-rt+yb$hd*=dE# z`wG^ZOCXECI6(>nnM6 z2F)fvjk8Sj)WX_9aGs#AQxu~895r5e%dr;VW!}%D4amZ5qgD3!0=0dE^oeTp8_orAIk0{zZQtetjm-RE@dmGDG@T{E zstz-9xj_9~ovHQ{Y7m@Q6qi5egnEL=P#;hyad{xU|Yit(Cu7xNK^waV`y2i zU{wZ^c#r1>#AJF495Cqz;>EL+h!M2om6d3X1<{{|)@=R-_4=UA1tTkdWWnVPh{d}B zaYZ{t(SaaCq!=ZII#Dl5?LhNTgTH%6RSNt+8*F=BlJhO7+6o8k?S!-L@| z7ao>);}JG#lH#f~6$@S^EVIgrv>nwh&~7y)+FXbhA=d126&%wz@)?NBA>N4dl<)WM z50w7`#KmY9F09IYg>w|I;IM{Sg`kzUr`iP@T|F7KxzMs^m$TwWi8oxvgbNkJ;|-Li z#tVNB#4>LJS7uASB34-hr7kwvK&VXS(#*2gl zuAm{r8gD(2cPp*D^r`6BlT}8vssxS~o1j{@xygkp_-uk`yokA;@egdOi7^^3I)3a; z&QxfMMY2jBf@;y`CKq5~5LR)57+ZbhDi|v%*MzNE`8${vDq1Cn+o~3AZgasL>#SjL za6I4%s+5V03_Y<5#oMSBv28Ax!>+SdJjtw(Gbad&hN{9{t?%oaRa6}b`aYNW3{PpfIC@f9|fQj@dWd_@6{;6$QGU>r+nhH+QtE@sF z#h2y)+*hEI%z7}+OY|2RCG}B=W%g`pEgmZ+vmT6-68)7%HMQeznLYLum{Q!=NpA9J z0<2(dYsXM#mky9h*0rr*S~591@;vGkyUm05j3|r}`zX520kN%s^%V?DMr|Jy8+CU} z^t@+8VU*lQ(Pf63HTsrwQZnu*67ncXfFGnp&wECejpFe(C3;q7cd_*RSd?7aKIA+q zU|Q_vJtONzF^I^dcoy&Ryo|kGW)XR2mUqp z@N`P_g3Ah4G2RYygIt!}CvHpht;-j)_Lzs@W0Hqu4644CwH$H@H)nJMUc;(bRYTWB zp>TN#xv$X?>Ob*$oE5!rfB%8l(u?qe?hT8-XT@y+`_EcOP~G}&%2Ydf=4+QiSZa|ce2 zHhckA>gDm-w7dvP%}bUQ*(2dqSnrBA-XQ79_nYbN{cgRSb~CID;grDlgb-Z5VwAfl zW3?oeiD>;8#hZ(`n@$KnC2XasU}T4dt46-XGo;oI@sbR|D15HHRl7BBE! zpU?1hZn)RdQ};G2Fr=MfZLn~`I z2|;&QxN6kfe{sD$mXBc-yI4@wGZ|F-Kzk(gT$ak#SB!GRS})J_<62C;f|k4ilsyt! zm(zv=v9;g=-mV_DS;4m(;S~ezkjiGmJs*(Oh&DjL;ZNF zm^wMo9Wc$75O?}a2Kvktex14zesZ8a5}3=AMQg=iI}S`0Q|HO*BkJL9b)c7AFj?lQu!cU9<0000A}g|}$N@@r^jayI~hj*qeR`N4!2_rW;-|NqPM1H=FT00DGTPE!Ct z=GbNc00+}aL_t(|Ufr3&Ya81Y#%C0G2ncYGB2AM@1xK$QN_YVWH>6uRg0~*m*YCmW zW>n_LI4@AgqAI+N{lLah7if1~W+T8mZA!oaqRm4TZQdq;=^xWGcO)N6lY1{Z1PVO? z0r_;k`R)kt{qY6sO*N3rg+n`$7*>^26U?P!>r@HCU4UJzP6XkqmWZe2`2Lv$CWb?t zt>;*HT}~{b+)-IX!E3z#!Ld}G=HFQNhv68OjF%tQbo^jHG-WJ{en(|K0H7qbzx>^# z_+dz0&#^N55itX`Vu<~}m{b4QX4Ny5FSobee+Vj%XQ&Y|*;+Ov$7%jJWYuRFDw8y>W+A29ASJjN~2<@f4mftcT}6> zVh0fqYWd1O?$J)7>cb;)WHrszj8)4|zO-|&Pb;{o_qxwJ33P{@5Ho;?Rf>2=^*DB8 zn{Q33(fb9xw>zj$Ew9qks;LbolGOnW@mcy_rqZa zAX$9luK@L2r32imVZ(VD2(Ljy@usfd>0M1bN6Fu{;>%7QR@9)8I2~0Ogf%pi?E<{O z{*eZ9%`O7tNkq{{a8 zRyZaAXq}hnLqtfGn6A_?u9&Mm(}$dpf*46n#!s)XRiY0OA+<-O7Hk3~`VbM)p;4h3 zVLC3+hlG&Yh1!90c4Ybx5E7{c?c^l!u0$UKLaH2oEZ77;!6pJiVs*hL*Brq&iV@exuvMTjZc);38kv5Ab3!i3ZoXxJ&SiI9*&WmFZ`ENmhpq=yzZ5fGA_ zO(cXQp$}&Y5q-E)i0H$eLQWt46mt6D6cYLnr-0yd5mNOe5D!S(o;CMEp`-n1r^1NJ z(L0FdRM}2^UkTFLgPeN6W9^oxs@&zw`Yq9YB{+4}=?D~G;OH)VX7*h{OZ1zGz|qkX zRoVyBEpzG+Tr}fviMSa#m>dVQlXg2sOuW$LZ;9eVavc8YvbYFh_P}Q1Z;AM7e=r?F z>)%*d4%`R#w?y&l5mCah@fA51@L|Ile@n!*13A8F{e%ltu!Z!uL|i*Ge_;xrxoTq> ze@nzA0gSH@aG`br3wrokBJME^96@yZJaw;YIk~4LVn>8?yaw#)B4bkTDhtPXS|WCg zbL8s9CgUJy5B0*ro1T^^BnmNY3V9*qAC$7&Ng5D-ZNuzROSIe}ktnxC_Cfe<1dslcT>)skk@|Fn4@R zE+IMMGn0Q!LR#jTsE0jF7w1p;$ZHVN7aJ>%ySTgfv$IQ%>l0F_;I5iPDpre%oJ0X3 zt;jixE(&zq5D}7fqK_6)Oi0m4eP%+65{n@3kktPbA^G7}ULReY2nfjqK^GI7D65ai zP<;+U;(~}iJ%l80Xyk;%H4#UY5|Y2vkrR?hcft`Zgd`!FiG`5ljsPGer1CVUd7X03 z^dTiAc2t!(oiKgK35gx4C7LpQ2nmUMr@&n8Bc=}tAu&tRwFH{KqL%2K=|ezB93!tj zG{HhTX8Mp25+f3&8Z=5Rk(iKzxM;G{QcENvByO@gpJ<6>gj7&m-?T&rrGBPFNSX=B z(Q|Q2)LWsC5+Ui#M@ZaceX=E5B_#bXCn51`G{?5m2NROMKJydOZId;y(FYTfhS`~) zkhsaRwM0xv*MB3&IU%XQ>u7C>n2^4oP3MFJ4nX22%hnPxA-%djn-kKbM&fjYT3c&J zOH?K#<#fz|zPx#Do{*RMF0Q*5D*Y1CMI)OA|gw3KtMoWUti3eJ^#c^|HxT3bh9I($VHXqVcPPg zcV7_z000hjQchC<|NsC0|NsC0|NsC0|5r-e6aWAq07*naRCt{2U5R3(x{fV_q0&(G z|Gzs}i!JX9P|2NFnt9#1=>(PKW9djX*5mP&ul)ZKb;u{w+^^wNBl(n~PZ;fUW)te3 zhup2!s8RP$6%OQixBbXq_nQngePUuhVK%4mDda{lsJpc|92|e#qQTd5Xu8#8Qj;0g z2bA17m{6g*+x^_H#i}ray7IY6J?Ii{^$Y&g+=YhE%zvoxeogBBC3O8rXsZ2qqdsIY zhlLMlxpm#B*nS@Z+|6oEjzsHeTD@OaNy2eUC{=c5J`U|W0l+ze9LQZ%B(&ZKNP;@0 zLhIMIZL9mt)>g{Lg8I2)D8U0hIW>=XSzV=Nn&gxGK`G|e*BH>-HGp0N6 z2C}W>=43t^=zRX1bqa?!4W`DWB5rEb4O8P>sU5*}Gjl`I0hXJp3suI{w zX}yb$7jmpK6GVU`%qfAlSnKoW=iE@horGm?znR{;Bw3=*P2kTbA8Ll1(Pky?%(Jea9Zq+@U>`V|2VA-Cb*(_<1kPO*b%W(?G_ zQ**Ki!;|BZp%gPc3vAXEj4QKd=hFrhF(S`@POsM>ct2Cr2hcG1^aSFp$qeMC4V29n z3?x>SoSM_vj>x=DhVS#hMqTA`SxR)?fF9zq{AWH}f^o~0*mlNtV}l7tVF#lKa;tj1 z7IjUeiv##QQ{$6)Gc#K%e4q6>tSdDxXF#Q1v}P|rT*7*+#g^kvFC@8Kc^qN!Vmxxk zq0WZ_Anvuy=Utr1Qt}bp3~1U6v}tB8L|l$pUF72)$uPlFwb7cr#(){?!CLancS_Bx z9=uQRIGyxy9^|%dhP3Xiz2Y_M8_mqjMN<=vD(6ct*>OlOT5rwbs7?ootd{M{V3f`9 z46Q$DJDoEZLjgkh2BSC|fwJJ1Q?n4Z&(=mtWc~7@D+LKQ-+V#Z z6=!(1-XlHf7~-}(;$U(N=4Nnl=g%x=RS9=GUsEJ2P{u369O^n&QXX=+XnD<^Rg}`Q z`N+PQ1bZs1Cq0okY+E+0G6XmvET@K%k3P&5;KbB?#ncqM0sYO+^b#7EU$k4WX3uJ> z28m0Mog$`zCmqMNS)Se~bf5>eOfaM_XUCDvQmi+)BtZdPDa5&%VP|^D2@9Rc_pM5| zW-sRoC=6_vt_vthI{6Mf>F`-4&r=&(N7b0w{BNd|!R$zG+ew4fBKUmS%w*@rCdNu# zkrB6!i)^?pXDwJ+vAke!i4dVD9n|8p`HeiBHdyK95NnGw+S$Q=|w>9 z>0awLP&sV1owk@zMraG%snK?UJFNsD3xo5{G#uB)E>6$hqGb!7T(kK!53&8cX2llQ zD<^jyI?%VhwqlgiPi56y1GylATT{g|b9!ouY@WTr1#u2l$#J|$YS;@FqDRo z90pn@vr%MZHPWDz7GpkwSKVn3wn5|OEm8px;_6y`UJ40JqhAUHSCH7Yi=c zpPJ)0j6$>$gL~?knJ56E65$Q9ajto4a9kz8MT>TWskAm+$%f72@`!NkOkdH8RlHVP zeFIz1b8>RII#-$qd1j81#>*tXZY*rY&3@x}x_-ZRQyV<~VuK;}YJkJ%6+^f?P5rXq z-ayO5^U^ajk1znS<)}^}n3ZQXcHC`lyMi`vV7O?F4bAi|@BNJ?L<=^KDDXTI6Mm4; z3$0iaj#h$OkNI?Ry}DXiA`%g-lcUM+1A5{Ojv&XF1JFU;tYR+suvvU>S$Ap_X~MQ5 zgSAc#8!a)EkXoTL-PoCSK--Yv0yVK3y+unSd%v9xTSwI#ztiEU?ivE)#q0IO>(!JK zGRDhIQh^s{Ex0h`tiixu)j?E4_?DU(F)=hReHJSOAkQ0s&)M{3oGE$JMr4=C@GC9^ z2*~lWMH{v#tKjVwEZHa=EnOZiFki4<1LJLz3q|?i3_uPLhmd=}t-b2zsv+(b#wO=Z zJF)E>OlK0v$Qyt+UC5iNrFm{@)FjkPh+F)j?F}|$BAl4BgeS^{qrUx>B;sB#w_X#* zD~6#F$eD$<8*3TJLCkvt5-MS}TNRd>P?N-5hqZKRLoE@&2clfR35oZZk-f==v~2e( zGl^dD6pxKg7NwVLFW{0PLJ;nZ@$ygXvzF1N&C_>A9Dxq(RZbnc!L8n?iQFk+yV+({ zN*{Xz&uqB(s7g#CHK}m4w}GxP zM}blgj>Y$-c{gXk1_G(I(VLF{1-h=4kvwQx+~Wb|v@e;S z8MW_%Vl%eukn5YAL;!E{25ySPxF}Fq^u^->6XMwRod+juxKF9OB0EQwq(CAZ6&Yh! zh**|0#)J5(T#QxotSEGE)?UYV)b456cQltaBT1SIpUoO%2)7Q;OYV7QcDZ(rX|a$i zuhLG$1qo5JH?;#(c3@~WNlj7%11Cpd+no&;wBa-*nRgE{sfVNN$c92h+IWqa(~wIT zs3|2Hzs>%!{fVpg1w^Dut3a~uwAF-Rd0(yA8-^Ua^a{1xjyUVjn}$j9|$>?pP$VW z2nw!vwQ95$K<*8vRjT7;i!MTI^#v5sKa`* zxrcM+6Llhp44(8oDrRY^vwFR13kAb$#kT4yHh`e8^|rev>>+8o#waqZP7wz zkj@(Vm^@E~h&zTcw4fg~*I0DFmQ38^DW$^9Qy?Cfq1gn6WKywjm?Vps4V4 zj;{(xx1#tRJ5yB(N12I=x7?L-rK~vnwo4~6UNIE;#xif8z}w{HhU)_@C9Jd`+n5{qKPGVxg_f-vsS!HAWOIf(+8;DK1MnX5XJ0>rLMU zZ%`Omv}gkpDmsgIC_KjY&)5)*=nz+d91c<|j^FG|L)N{d!%@+ba$XGEp0xi7Wd#c| z_{y3uYrIM*k_JOl{qUR1&!-p&o;BCtr_J-AxM;pL=?-HFJ%=KP?Oav z;#w6!1hV@n+Rsx2;+Dzxrn~1&dl4rW?K2)2I=RDY@MhAAV*^KGj?>z)HCWLG@Hq>) zWH_oAP!_g1Ntx$>F}f@-8;S~^G&0!JnTimnoIKz%6gV%t8eK}kTO5~X;c*5zry`KXq5OlHp&$oSV~qA1fE=x*Ikjr(SP!fx8r)6?kdHCH zIw0qC zv1Vft!FJGohLEGh1B(ceZQe=PyRlu3KQvpSe=p*jtqftvAa4`Mb(=*i!;wLoS+#wzHnCXq(d@xRhhz>dJLGT zD=00pJVLeIiawU?VuN=R4-QFu`e%*@oB!uakmg>*(Ni8}H8?HguMPLzyWJ^Ds_r9x z{q3xVVO3I*PA2ydi?;Z4xS(8Mge!aGn#vTOngisCdwl z9p&3aF^AO@-sQAd$fdG?Q!**jE_q^k({<(DnmouwooW%-IQe=N^D=@syJ+h_W=@=# zbqfNly9^+2L;>ke|AGrgM)Z1^umjbPIUuIo!blE}RIrmHCQPwt#C$oSLrP{p$kZ3- z^jw~mNvK)iMCOn?eT1dP;2)K9r^eZcdAZVLX|c}XSiOtNeZp9Nq-1~Gg(D*nD%w$P zlt^Bh{vBz&#{(KeSboqKipoM8f=aFMrsrdBA4aDdzTAuMI~jCxg7u_-6X)hJQIaof zYF7=WBzTLRTG}D!NMr4_Juc}!JPy=kK)iFpdeIj#^<=bs(-sg^Ah=-e@^D`%xp&mQaJL zK2O>u@X8A#;kF0_NB-=X=l-F1u_5y_OcW@B-$YH5g6F{rakzG`*MOilIxcFxmsZ5C z^d_EVuwbX8V;%Hskyk;?{Q;bVgDSHg5y3kc)p^0%7GLo--{IuU1;omn(`5&K$H>r= zLO$8)Nt;EFyoWNRMXH%cC?kc2+OOFNKHy5vii;PwtX&Zw?*R1!OBi^)_F=;TzTG0X z`L&{!`98HSf)BXT^SW$7hs&D5gAEQB_=IU6~{4Q)D>Q4YaE5ErSZda}E2lc}t?%G(S z^<=tSjr{8Ekn1cV4Qsjg`S-{tKDE}hn>k0G2^|O4G0drZb3mo&2xjgW?nP>T%UAz# zUh=qw9&oz}E3SjrN1}v zAMvjr$Y+}s$m@7Eco$p4SACEh`mCvEg-^aYoJv*yzae**62W`gej)6E1-)MJ3;Ecx z(ko_*7K(SOS9J{JwEpv&#xwq_H(%3A?kN;=7;1G4(Y=ZrLGC3oiP{1g8cpyUcBu%I z-H5o@Kxe1qRL1|Gb#wh;DAD1CP$0X}V3b|IqZMhPl{{T1#*fW?$DX`s9Di=5Jkm;9kNcHrq2MZ7serG4# z)fMP*om9Kf{}ad@Ku*D>wDr%?w(25{TU?JZGMC<->5;H7TY%N*_HCxf#Oc>`b^4`g ziITy(wcsOMj2DBO7*diIks4 zWz(HB?NUtg}d9*}cR3@{1u4IX= z@RlTH%(4;Su%OWM2tRW${+a8uFAFHVeid+q?~(l^q`mf>3ac-_9-%);1= zTPPT*H%gG6e35BmN?b-9F_SjLdEIAL#vH6Fvq^OAuB79LsgF4K`UO{yHR%@3kCxu6 zNjkQ3bIegfZbQvi#8hu)Yyc`m)gktn<0j4NS05D)Ea>e^ZVl;A4_k$sd+0+ZxKrnA zUfTQc?n@m(?THs*!nL8wdb;DgKToed)1WiinaqRSHvc@YdBrqcnN1Y`SmwdK+$6|QyOy6Jj8L~pB}`e;2k8!g~xO_Q_y93@bQa@ z?c!!1r!lF{)qfAnDSW-a+}pCDv5p_c`*!fQ%N6e*Z2aUxaV0yRuOe}e#N7BIQ*^l|tCR|#+ia@bVYEE%|i z-8d&r-6hnzcC`Q&sw?#vdmo|de|AD!qB84y1OMmeQN)!;WiYl$ca~tns+~sUGh++z zjP2+XbRf<(Y_*)kb8}6I!<4OrHiR6jg7)wmT(GS5^4{NwIrwuR{%qN>dYFsn#02pR zAeYLE3y?#!4|vz8$`qyi!NsT&Yd=he+eekJ#pEfYKzs+{go1zvBPnS^-0PM6$P6(1 zRRp=6TMq9FHd7wq*#6{bJ2|tNo+ncGr)t?-Ytfd5oJs|t`NX|dn_p#uKM`(WIZ3%} z%cWhtry7$>Hj@}z$|&M@v%bW8Fl0g^C5?!C7ZCS~+Jj5T?b`N;9|K&FIUw9%a$G|d zOMylS=;l=S zB>_RfT$BKx^ztBN#|*jdMwOAie7)I4AW@+h#G4oByegAO`8R0n3>p7{Ic1Zt0XAH# zFr~AUKDr2s(uEjHN*e2z`I1-xazMCthd68z%@>e1efkGgWaNXzL-0oG1XUcqc<-#Uga3jbu zEm<)88lfiHnr5&!>0Fv(%Ge!~@~2|BR^K#$5y)Yq9u{n~rx0>g%xS8~l+|jX3__6U z6z>%P`zI)0nnlRjLhLZ!UX_7)kn^bUjtT#OR3$GMpGsLKOgER0)K8O~-vw`j z>!ye5#AAwL%%zm*{R*Z#(1wt!V9pd|a+4y<3c=*~1;C*SV0nwfRj2~InHg$%I9!F6 zu2rO~On&zD9!>ZY#TY+LfL3pAo5-%$epSiTYoqOvRgzD6W%5WXcq5;gK;kfxImCm~Hv7RU zj3kYd8VL|M#w-z@Y5%*irhuOllS8tP`6BgrG~E(I4iL8=W2r)}jJT)<=txgc034Vb zkvnKj5h$kDGDn$Oix$;k`J%aT?oR0!jBSCo6aD8QoU!cl?M)iMgsI&$QN~4GoTSi! zi)67r9U?U14Kj9^Wb>s(UyL|_oJmf1V=-E#+Bmrb?&dpF{soWDsS%JnTLARZNb>A5 z06n7sG_@BkdWU6}tF|oojh$Js$kYplWc?2^V@!>$`Dn!sbH+U6W-N`Us92v55p?tj zF=t$yLtp4}HWyb3Z1|T!+HN|iXoI-ykV|_=AkG zX*N0+l1GJiFX12G=#r4LGv>_aa^o@1SjdZQOihJ|!ZVfeZ3>+nK+aTqA<*D(HUT+f z9bqv>-0@wF9r5};c42bP7XV4MjuGbqko5-W40et`ZL?E)6)rt0kCu1|f6u7$6;(^> zAZFVLZaL!^6OPnaPD1C3EaWIg)a(ZVgd*$_aukrd8F!mD1f6hl&SopLPC+MkjB6@D zyB~6;0$}ItxCs}J=lB!W$6CzXZv~78%ZM}jws^*oAVLJJXls> zAV*z=2kebw;OF+4&427Qz!s-Y(;0?P*f)y z2|%5rLL16OWDsW){?<}@qTn14lFdhmd%HBH4|87ek1H|uh!tFTK{3M8l8ykb!Pgn6 zA>znuT0#1`S#Myr0JKEh3s!OZ*}^<&8-+Gp@&&+lcaYcP1t1*;phn8r1v$3iE|me| z+93z83M9uAvG15OQkv4q8D;Lpe*-6hFa5NbX-TsNJY{D{j;$Z0AU9dat;?(AHh#m>62*-9jHYY>un7*S@DnEz`2f@~HSt2qj>_3kCSPv~6H6`OcOz;fj~;1c zUEQ29mwWLp_$#a`?D&0y_5c7N07*naRQ);1jCYwZJMztgNXv#_fs6HX~DWb6H7F7Xpq!GC=y--_7_*q$d zvJzJ8!F~gfOXXg1hzPdtnn5?u7IIG_h&pg`FcZu1CXh9cRR6q&@A)_%AWC2i5`83>olCHTq7l7PKQar4~dM?BQ>Ndd^ zEaWKpVlK?ptc;#M#BI)aB19bK>w;Xqd~eSvcp08X0OF2uo10_E(fdbFhd4zRe89me z*soiUztvikxSF9NC{6C_0x5fLX}(d4nYzfO;a3(zdc`tVqM6gY+IZ znK=AF@}*ZqocZFFPrmwcW3- zk9r)C1NUvuw$vd9Vskh6$Ox<`|r;IkDT z`g@N+4t$+5AxQCojzkGCQvfu76^b#Pm9kU-YB`IQHXst=!*-UOgph;fg2`8VzTYz} z(j+*e3lWqU*KXIOgR~90f)LTkN{q4GVV>N*NpH<{Ec$2j9^Ar^YegIi!!1*FR_Owu zt^cJ|^?QTU0Z5vV3rr$f_@mM=7)ZVrOupLk{rL5&N&!%2DT}tHm}7ubZ38q{UrItQ z2oXJLF{Y{lahZ>U9Pvm^=m)0tO(y$kNFE}k;-!$l8(7Hs1wdW)2mRi_1t41{TR4#S zHhPQluQ2DwlL<2UGXI+<_nESgbDx_&JQo1{SZC9(#YKo+WGR#w7c%3XlL|qI5Uiwb zIQ8S5V9qWAtq^i=h8((v18_y8X2kAvB&xl(WUan9(w^>RhF~&2_t>S8oyJID-X)#_A zR|6b;rnfSX<45ZEI=wX`t`Bl zb}OYd_fk!OJII{EldK$Ap$`0W26E46qXQrp6abCSnY4gh#$?VL&?NFPd-eqkNFQ>G zERz|?)!acmm=xlUVG!D2vk#asL~yP*0WE1rzTg1&LwPl4cg`%xzO=O+P{zZ0+FTUj zSV{hfSu^6i_3ANWT06Q~1|4AlHGoE#67NV!a+ny{f_wG-vV_We@DNKfsoq32_S0 zCOZFm1wcN}CMG9qG!=P+nF5eIb!v|QYE$!D{v8pBW*@GHtOuaT9zVW3`Kna8h?U~p z>&*qGeOmUZC*OyfGa(O(&MLu$HO6mC8EJ>8A%3@JUx>IR3=y<>x3^Sc#sp7+s^tvi zI0%LQ)hht5tLF|%MoaHN@peE^i_us_IQSx#$tVErwEz^0M}~iL(SnFDvJ#|n#&=Wp zwY4WJ26@4upC2(QZAqhwcZja2{!xUGIf_QWjq%_%nSfmxKf17|>iF#dax0nj+` zBeUC^cXI6xltG^1ShUOW<73XRSzwCdwgURfi~@7{UwSLp2*;>%z#Dz{K=PG1^kd!J zfop3z1@pAy;i7KH5&4aiuMKmDWsPzaASJy#xJ~#ao)umb=ti8s)sgsBSpZ~rV7)<8 z1cE=TH&FHt*eC#T&B8^X>fEF?*4Z!|i%>*_!TlI;SWn-sOC0*K?;+R?abk@6Z8_u{ zGQR496_86-|28__NQlD-L1k@(+@ctIV{gosglgD`IJgG8uX&(nti)%N1wb=~$t)xG ziR}?ccmsP$qEEA#GO7nfprzxC!hk5w1SX7kZ#9s7g;dz908(b`YNs&&4TwwS`{IZh zpHU#h?IK0N5Yd(u4+|#!{Dxm=cL}pd-R4^6H(dd6LVvJ}WUyTi<;B9KYKJ)c>O4ds zIHRyPaGujbZ)h*daBTOsRQm&bUg8i(xjwE}${Kf|B`u?(p9%7PK77jOef$&!LIiE3 zG-bsn#lCDcciBr`&5(^mwg3nP`okT}-H4OU!1|J>;5_6GXm0R~LW?^%BM3I8!HPPQ zb=EW!*%zGpfq&%iO{2oN`ZBDfwvIFdF0TG5en)m?t5z&QHNja^;k=7 zq=XJRr>cMCB(zwrE<#|2GEEIB$~hTCoJj7Dris&C@^$%)HisO=Ud{G(?3#SrscR_CS zu>iW-R>wp)gMd3&Mgq_r9y-MfNbGS_;ym(*!p;%sE~9~9YD=M~x1R~I)1NZpSdcaL zk`mtQFy7NUeDM>~5=@0wj1PA^xknFwi+{JF&H(~G&T^g(l5KJn=?vJ~VmlxRK=0L_ zP%sgwZ$w=JTSBB@?n@n75B=CAWfl8FowvM0-1iP&c#)Nz9ER29ekWJ?v}by?JJIM4 znDcaG4*vCV`QNmYU?}4vJ>uyPpA{`Hxj4L5m#)S`KU6uLR<}PiG$sDw3qgflib7%a z^}C3xch+tb?M@~1Rbql&&xT2bLfJrC+%EwM?gTecVO3!!mX@e-#9>(zE6&7*9Tj#F zVp`n^wqHctHEvFxNtpX?(~!HKEr7%0k|TB5ZW$-RDD($>Z15lDudjz2k;?Ri*)bqjae7dg*WF8z-qWmX5`y@r= z#J`5PE8LtuIXO*!5esFCPAGf;aqV&zo0gW$W9^}ehcEalIqbtLae3}TpOA|Zh? z5|BBMI3rxd5{Ua8X-LS2yxcWPxKK9#R#Z(;PIb~{oTVkz<30~AVl6{kLj~z>F^2Lf z$X%huhM>;0_%cbs>oW$-a}#meCztahSyXr&<}w#I9b{+dNguM<6>jd9_e0v{n6uP$ zeawK#qmEu7J@Yx-Cdzyr;LME+>lo%fXR!;4F~3Ja0B_0p`dtGylr=>StL5duHo=By z2j=KM{nvKNO8!HT`$f(RfJ@HTSt{555z=aSm!ovP?DEfNub=|V!39vOP*MqLe;0E1 zyzkbaHr9(CF8Sjhgk0t&f~FUnFBNgb)4aI@Z(ytrb2SpxiG@)d^g>SSX3iwFfoYD{4QoMXGL*=s;r z79DWZ=<(UQoBQ|QhFlVHWUFn9`lyr4jJMR)T{%r55JdP^=8l1?G1|rEL_jBv^j6xIHkVbpa%ELwoHDrYG;tY1Ck_Q+ps2ZPy& zKsvi;7_x zNLLZ}2b^5?-hYA|I3oWY(ILF0odCNzR94JVS`nA)e&#g2?txrdt<1v`i)!wAH6~9O zXeBNG0mS8R?_|h%QPhK5-$&0ofg0rcvXqk7e$`WOCw-HXS1U#sKyL25k2D>*mA8~C zQT22CYFWwO7rO>8z(4tw0sNx(>~QAxZRtx>K zUAUJTTf&5`apK{Q>NOAQ7RmPD^nIJSq7<*aSbMJ%%XQmYGg%5JDxFzMzNcs|A4*H- z?3CINJ5KD>&H`_zxbUkjPT+`sI!gApi9bV{%Gz+(&r^CgHWtDSUh?VHREghqMhIwr zG;a;##g0^-ra2Px`*ah6>e^6wJhoE%I)8v(O{WL0uDhG^q4p8UP?tbiw7KpGQqm=_DTj#5HVtr#G#rRN|S&gs}v zZWJY`X!VTgE|I*4Yueg#Z)$_CrR-$2Q%?F`Dl9|ZDxceqbBqDrD+Fe_!noz_E zs%9ltZ-0g17STFJ++i-9^OwoE8FJX7ZeJGFA5#t0Nijyof)jD}elm^YI+GMJoI@Y! z(4q04oO0uJMoymg&)OwNd9|<2s>L2(p?4dd_!3Di#|hRuqV;m|r^rEqzjdTPc-{ZL zQ&+@g2y-6Q(d-5MjMyb93X_znvtf$%e2w4>;e;DMUC3Cw6LHVQ2`3x78Pm9IupvhQ zaW;VZ9$XCgkH9TowQ!`)2=!*RE$T)htE4*Q;B;K>dk0BMr9F2v7=O20O#Rb&HpuJ% za{k;KrF~-}t)bdLFNSmLR|B(8z9(Qa^S6w(Sgsh|`+gT<1!a z*p8eJBLO;i`AJHf7FZZzzh7?!F->?O9 zl{W*D3V#MkxAKZvww!fCGq(}ZDK{NY8FW0eEr_76D7d*^%q7D&CMkf0#Y!o>_%7Q6o zxwT}=S$`s^LZLimtk8;^a&5ZtD`@nm_C9i;lT-(s4{EiL+ijAvw5ZTHlH$a_0&2S1 zn$IyJ#N5(Z^`Uo#(p8_h=48iboj3u#ag;dHM4D$7Edg%DfgL~Q!o*-T>jo)B)X;p3 zdi#)j>m4B1qb`1{BA615oKYkxkQmn={VH|oj$^rl9P2@FcTP-M?JKR;IdQAB9dO=( zC4bTSaRLhqHcYfDxKoPzL6P+&e?QdXK7p?Q7(tdx0#J!q(shgoFfdWEYJLH(vhZADIqQ5O; z6iLe7kfb!Vg_kiM5x01=51M)**J3*H;32~#k?75h*nDq{eS$_m^l@;onZBtm2 zlZe~bHppQ**UcEIuV_P((%z$+^{jV87Y@owLz(gmsHlx^-=DZDipJR)z5W=B1GIWS;R5q7JNCp zI778eGSa2?-D8YRNlN^Ra!t=-nqB}c3N<`pqO=w z#24LU4{W1Y#4QJb(-c-$Wl9=T;oako@D0i=V-zr`CMn{I1RPeGIl>BpS1TmqP}e#H zIj6Rum$uguN{dUXk8=l*dwZa68q{r~gDNFiE8Z{K*vl=1xC3arM!>BGAaJNCM@0HU zk7SHpNea%rJ!J(CQn?KQyR+)g4WWBo+9Aiy=*{L5J=%PLUr+b@zDBt zL73eHYQ)@O; z80ZjjIGAHJw0vIHXOok2(=Xr+^tAV2nKPxepukqE zZS2OOEhoS{HNeE8RWF<76(P4o#jMs_&F&UUgA`4VeSK6wPFrqZjxz%UB;vA=gP%dS zqby;J7$buL8RHumO6RWX%Q%<-Zz#$B6Hea$AD?u8xUtg zoR7G|jestd1cI%7#`q(%6yAUa!U#EvGBKx~q*TTdxf?v7# z*Em=CdKEDT&y71$oP?ajsZ=J zgB+?v|JrtQJ4ldOk;NE3Q zGyplY-E14@25JwZ#co`tVTl0>%5AeeZ8MahvS1>GLDs)xR14HkL4ybse+hB;MjHMB zfO{h3OcHpwH*|952Pa5`#NGK@6VWDb$6&J&Pdj5d!uVE@qrlrJ^&}-8%ag|9+>Q38 z9#U=yJ&URP0K(ywR+|$wEu=u~a<$jmJbksq9KhS48xIoyyiT!ZF*Dkja|eh+4gYXd zyV55D#ogl8s6-saMM53?$1#Y*Al~&cXD7mPPAF7xR*6i_z@ov0mr6a|YP&}vvrvE17 z*k1mrNJO3a3hE=)u)|YhgOBFuO^osV7CA~=l9C^b=dg_y)WiyS{uK;rn&k9%5l7=x z4V9aH#3?s87#}+Eg-cCuRQc}EiCNw(5+mv6H1Rl&6s^Uq-;n@vsV>Oo4-9s~uzjPL zA6do-@AnzdnTjQr;ov0ofZLfRqycf7rrovO&|>RbnRT>#X?Wl4D8Up+CxVRCg7LI0 zH32~}e6A02ZhWb%7^(_9C|k@LS+yULSwJpv(cR?4Il1mD@!)bqVp^U9GFL)?pMx9) zrej)sCs&F(`JwRaho94&LEm}$F)12{+)p69Vm-C8)@1&3#m#|!=8(;djD{UA@i2-z zidnxR2!%Z2DC2>Ydzl9jmu8IQ2Y_ColheR<_NH=kW+b(nDgF6B zdJe&37nq25+)C~gt7QE4glkRCk0Z)|+EJbf6Fe%1>BofW*GQcBfGBYtS@GSy9h}`` zmVBj4=4UBs3a2h>62{-&VYsj?g=j374wo;VG}iH}LcBc%S4LdYSu0Cao96sEcsJy`6A862bL!uAAl+9 zY}+;>$|nBsaz#(_@9l47RxO@RpkkIo+|@=Ldfaa`MXZu6M;DFEHwRS^KDmfq=Ob>F zPOZS#b35W5t;slHdQn|~ZWi+z%2;>!N=xTo5g(EBCxR-zQ=wd(>+LPwE#%1YKf2nl zw!{h4pj_C#*u}w>JnR1-$oVpq77r*fukz9rU-SJ=F7V`YmlJAA#vP{TixUU#3Nwhg zk;wW--Vl;;{0-6_T#JmoH$z%iaoHV{rKKj&p#KW3y99C{NK;PG zlHVw2MH1gGLk-o1o2!1%=8^b4|KO!a{nCHL-}TSOFSJeLMo)vZ_S4rfKR4?R4tC(lR^6p_b_v?^LT;$1-_4s?5HU)UP#>s`35(M7#Uyu>1v_I>}fnrzFGw)+Vi0?`kw8TEK z#?^ioa@iI>4su)5H2`(8S97QvdekP!oi&-tY!$X6?ra%zYzQe@lBg||XQGd z#t~~9R_GdTn`{|IMj1!eF36p-S@zR*WZm8X`Y|`+X_{zBJ?H*SC#Op{vJ>VSAg3Tm zH6SkQP+bt;TCR^eyG--H-!>bO+59qQQxY)*xdvL&5N&=Da(Zh)96&CM14VeNk0K9m zj7uA=*XAJJJzDSA^N4H8fufNJ$U#l1=|gmm;fP4d(gJ!|rX^P;dbfyam7Z_h;RjZ8 zAk_TMJi9;e0y#Pf--NiFGS8vj4!HuZRMT0rbmhE{k9L=w8)?bX@YG*~oSA0#(Y4kh z3!5YPL4eU8@aMDrb)T)&+%|&T43JJgsWFN>nfwn|@?@&zJY_1pdGp=?0i!ou$hl0u zTvVG25;D>I1T7gCKXX91X$!We1(d@O{HcRkQZal7{@KB;W48Fb1^xUq6_@z4A+FX6J*t*%^{<-8rL^R?5a+u% z_qBe86aG}5;5XopXZxXKcjEXJIMinv;CYYQ_Df6=-tmfmJKk*{Bnt7b`cejVb#Gyz_njqI)Tewv4VA@s~ zfo7<^R>s;!*ImFH=y==z+S~#Sl9IGTbsqJp7~^=?GybaYUR7|{aD!&oAQs~t%}?g% zo37%?SCwGK=WXR&E91Mv8}OP&lBXr8dA8-Oc~%ehtnLr5wD3X1VM1D5FE5ODI8DaA z9lx?DO?P{%)%JvGtI#9b3J%qx&A~grP`j&GQtKv8tEgnH7T(aTBd!2BOnb6eQ;fI1 zaXhlL)J)p_+!l zYZ`KN`^wmGgDRHXl1iK%m|GB6*sSqxTA*Bu9JkMg$A%)Nij4{5q_1IX>#_TO8UrVnlW zX*2^NU)Qe-zFTYqz9%-t}r=_Vd>e7XyPJ2hBOGpKC+hyX;WIFPuZw+!@%#@G(OrYG-nPKvd4= zR=@>_qrYa60+}gS0Xe{X*}7X@p>M2>KQW6o)uVZ3$2l%Mwi9h@r zqOH5P8fAG6v_#=o93!x{un;XF`K^XW-H3Z_;MaGDIBe#`m%Ci43p#|OL-k_#31ejs z`PhviIH%A9xHRHSc%zyU6qSsfj}g= zO+&O~dvlPW+QQOYTDVF2JrCaY&w?!sR1@U-9ja+cj}8?*s^%Cz99Hv3>uJZ8Gt3Ua zWrh_x8%qyp=6eUxo9DR|YZvTJihmJs^2J94M9mRFtb2<#XwZpsC&*P)^*dC9G8@C+ z6vLN#4Db8|b{o{)|6R{g@iL%7aZ#8on)&`!qf1dWDag9L81c&vjt7Dtk4o^gP|}9v z5}A5Okb}PTWz6a1GfQH?t=X00pKUQb`w5DW6A{%fWTYOYGiKV-@y(z4cfYF{pe2B~ zfCK%yk3$>)$%P*3FKV#(+Fr54!-ioIQ7@;n7Z<&uD{R^jCH1nL{cP2rn^1N$k$yM@#4*;J|0p#eb1T%1uJI1i@ymqv4 zaw{~8FJlfK!&zK|LxmU~JJg04p4MM_okIZ5osGeQLX5b2h!cvGZ6e7tuPx?!jv{nJ z&c+A}b*e3#?5S~DP&)!m5#k7P{xJoH-0?#MHvG#VZC}h8Ak$;EbODC3!b3nBtK#_V z1mI4@@RSq~H%q`#WiDSi>nxrJ`IemdrTNs&AT1G!B`x{&*b1VwX?RG8qlzPJlh{(X zL!8>hI2duqNVJ~T(l!*G7)Q+c==L!eIMnVKo)Ui>lm_YbZ#EJ2ZI;<2Dz&jE>fNr{ zymV`rkoMD(W3H~GCD#jl3Pv14;+PDqSG_jrdJg8bniXoSq`L3x)xQW0pkmrrllKTV>8)ySHjyWn1xy76T){Hp#>(%rg z5&U6n=Q&i$S2pS7oXs#{@niVlL0~&KnqD<{*$o0)$jFw?I%)id@ojghH?aep`Hm3; zw8Z6kAun-Lr7+J+DQ?&M5fQKP{Uji#CJVWPRUyQOJ;m`ea;fha8V%$0b7#R&M48roKu`>{QtpVM`19FfF-V zB;0`pT%Zx9Wr6H#jO#iYP#F;2zzB4(*b#@${3EZG6Lfl4>I~?jt z4%KmTf*tH5Cp1YY&pV)I^E?YW zM@#I8n3kB(wlp+1pHR;@!-fEVh>&NO818Wl8rU6>DZCdp{ArSMUW9 zS0Q}@4AkacLqZ2|VD9)^0sWbFd(?Ks$+-sZaSS&O)x>ZE?;Q?S+YsKMi%QzBNIY;P zA@`;_ef-dut6*|L8z6T)P%EByNvR|`5Hr6|{l|g>spNT5@ovh`7|tgya*r#%RA%;X z_FU}dzmTCt1X6r_k|Ea>SLgYG=w^qiJ(Gb$U2F_L5N872Bw~22Q>c!%HFB~kdD`NQ z1%*t}l)gimBOuO{THy1{Kel#m$1w?Va3uIZ4!~C*bhMovq%FuHBAw@PjQEH9HMn2g zOH1yTS%lQ&>y4(CfU|S_i&-uEKIr5O+>EOEDIF^2U+7XXh8s&6)(EHfr&e91+hG!r zb0y={_{Wg&qHFo_C_MaI4G$a*21;HRf{% z8V#{u1P12zkUE;RGRfpx|K^>||iTsHw55Kvl(`KJ0C6XbdjXQs$MJ;oJ)v%7$7JEITKeWW4!k+995sP3cAsu?r(Ca`_#NjJ5GC;S+Zpex37kW zW7;4muN*P-SGpVIhfEHPy|Aj}v=2irh!FuT5g`Iu$$OY|-zeVcvFtHE$Wu*V1vY== zWAhN=(4Cgh4bWzX`u1XYWvbdU2Lwi3Im6Qfx(qp{abn`1KH}(&NSgS^1jH1oN~fpZ zj}fUfPbk)WV&ShjIeAA)K13e>qScW&!a2s}0Ny-+xLJ79oH7#|U?*ySJSG#ukF@3G zVtC={?OX4NxWyt4x7D~zU)mYM^5t_D!=N<6CEg0-0VZ4KDbuvSI~Zxvf|7H`v_ymm z^}utCp4z_xIaLRo5xCZQf#QWBrSk~lyendIKZXwVSfvl(KkrtD8nye_>>lVA?@4J< z#(<+S0608zn%@~ZY&HM<_}6$*t$d>^XS`&Kl5l_Sx6aKPVL^|Tl+!$>C4!aw5yU+R zbhVT56Wv3z0`Tz0zfQ=t`BVKy;;8sKIp3a)YnW%}a& zKyYuCop-q{t3l9&q{}T zX3yfydI)cYUo*QNM+k>2h>f;MHO6qeob91)IC+7P(|pi}_6Rf{{98>K!&c5rvZ~kO z&XDrgP399ZH^6_6%St12KQ{#l@^j{24_0!7h(=cOX9W&e;t|HCdrc!r9MXt|UwWY! z-s(`@X%G3PB!0Omcjy8Tw_`DZ>Q_)Q#RER%h)S;y87VFsP2Awk{|WwvCx7s+RL{TW zo`CTI<0{e;!Aky{kaGouc?5B7g73U60D^YJA>{bDhkcn0_uf@-x}J&&SjI3FQ#hX` z4iA(zhU#-?a;=B9adkp})5Z@9YU`{7Lc{|K3qC6u1^RD`EFa8wz7|O_T!!$L#zyYA zhqA9qy2E9nTnpicD_90_P&Zq|X{-zOBCUPE-B^EfV(#6+o`T>-w+mi4pjuhU9~J${ zS0S~vZtJa<;<$&xw-_~^YO{yScy|b551m0b)dbA#rke^_BOP66*!)p+BJg_lE)-^X6Y%1R@mV7p`OWF-T7E`Q?h zik9!*4Tf-Zk={uky9q982~_{Np-NA;0UQ z+>}z3Qc_sGyh^W>%Yw{h26xPUT11SP=ZjIU`IPCWF!!h4NvnxHfXpX-o?=%@aTQ~N zk||ZquHP3@_6G0yV~Eq@T*9@51^1$+@NtBmF zQCBjR!4HMiyYzS$R2ss7@6z1`3X0(WA*b1{d~pXuE`^*|SNc@Kf14h^N!}*9 zpxvSD(-Hg%@gNs68s1f-joh2|h3<1W3AtNSa3FExmQ;6uLSA5mkJlzozFN)YGUpLT zWOzOCQ!+AzRbnl?{8v_e%Zn#k=IAMje^_U z>6P;1q=-1Km|h0B4amm_F(+!+c&zyjcaUuLXrTZtZJVw;X@OiOf?Idm7DGONI*<>S z6)K@xTua|_a>j8?zHj5b{FIz;ri3ra6+PK zv9+W-N0Kj-8dL(PY-J>6%cGS#Le@%@*Rs$)Ff`mwcIxVx6*LC3U&KW#Ijm-F3JV!A<+lP^Ntl!^s1>I~IrYNayhZY%(oc}#Ib zz|R~IZqRt|C&1fNA*kUGR7ii4d#etx62Vt_MY7}x_(5<1i1^*SvlhVmzX7>SWj>YH z3(oVj=IU9MPH86IaS}N<;q6g|oTtP!LGyDE!kOsMf=fvL*)pI)1b2x~)vql^HBe-3jo=0Ujnm}87z^LSWsU(6UIB?)Q-{dYzC9j8J2n<-GnU9PY*S4jOk=88J zo;?CreN^fOCoGNl$KxCxp6uCP=u#1Ju5UM-e_i`dw|NCQ4IPNgOUSbiDkbtC$x24} zNn+x}UT%C&0X?l-%&le3>m>&{!rF!v1ZTA$GMD*XG?A?$^i+}x&9p_x8*w}aZJMrc zNei}0gt@VhqxZuRY;gK@?dY!UR~Y$A5y2hU&bm{lvQlD-*^uu~e+zSkx%VTSi$s|x z^%O62TBTv2eS2?f5$-)+z8z9t-Lh?_eX_z1%6Q~8)402+H5tJ%gg?n}&Y#Lr0n)q1 z$V$t5xi8CxeB$Z|#SjHQExOcaLPj|HoW+N!<|UKP?Ht^|B3w`C8jopWkQt9eg8kM4 zO}hRW$k$DHW5}iJNU?r@RGTde_%>oRxn5DIPDYa5wXIW1s1d%%^`-5r| zgUuf=_TtpkT#GJVhHKMWMuFaK%WrMG0(WZtsSDvtv$|-gX_(t{3Vw+xuc6sbTqAx! zuz9`YyzqHjBV4m@i2HmJ>%kbL@GfNY7x*=TTdiqaSECjW2(D{4^s{X`obt*{`pYZF zNKIP!(}i1U4AS>}&KD5y8rk_Y*x+Ay&x38+nopu<} zue}YGnC=qdY}u*z>!eV$+BR_&1*KWtgVA{EJe%CP>4{@di$my-s|s7gGmFD(mm470 z)4-H$s_D*C@~0fahfYHT`9A$U+x^?;Xo=|_saHzH+b?03H4W8CS@A0cxHyr>#GodA zMgLniwNHD z=DackotCSWm>!h%f86OoUSBQEd)|g1r$v(0Uq>RxnwyTGwx!-oupkC8=2UgR)eH|x zo=6R-9T_zTO6iOsM?I9GzxtJsGp3Yknj?7HnyKShPbz4=UOoYz_=p0f{GH0qiOI6c zrFnm1Fu-xYIErs0b<4g^+5y3mF{p+)Y+>Nqvncv1tN;_@5ON2w_nk?-X`;MV+lz(~ zyn;Z~lyIlj2%c1)D={gr#N=&r*cwx(u9H%$B$094f56l^%FCQ;0C8OfTH_Fc81!z+ zBKgcAb!rj4flNCp4|EK<^XeCgzY zl~=VB1{E+E8VP~VW@VB)mB9OBe2G`Wtp zroCukufv6K@}VMv2WKW3a>kpw#Y+*qp+C5%Har0+q`J-Vr_LzlA*Y=K5S*%Sy>yqb z@-e7&c5I6va&y>@3TgFglTJ>cTQpII{-UMrwHKbqa1mUz_sc|ZCA}#GaE{=un}qoc zEQXw9L%_g)qb5AC859LL%{0E_=wc_-0SPC9|%{KD4PP+so`IPf>!Nmhqqiv$nm z-PG@Kt2&271XrmD?(`T%ni01ex}0wi&IYV8lOX5IY;*iZzG^=q&u?Y+O<>&v#GQg1 zXLm)!NqV)vqa?E1a1wGqKH?nYOs{xu+$~z#Hr^}`&JMc!Q3Ri3Y&*!IHzjbtxj$OL zeqGturQ00m#JH$66%1KhTIWt424@vuXyM( zYQ8f$#C7%0@Z70TgmHDDA^n5?el~!wps4KRdJy+2ZF6)P?gGK?!pc^vWS!K*oU@aQ zs3E87gq#wMvFD>APqZ{wBbt(_#LTC}ZQVp>1&9vmv3XANz%jh7*h;6sia!as5d zltk|0U{bTjsOet#yXK4(PR;Qz*hP8B$>BYSv*=+eAa|gP&win*1rNIF5y%z7tmQ-5 zZH`~V90*kA0cx1nht9?J3fG;LW?Cjtifu^xnyf&K5_$D(>{!k|(c(}O)4e2#?rN`p}ySv?? zI3$_xC+ZA|q;Gti<8Hwg>Ry2J5N87%=UCdL^{y~K`q{n7p$mWnnGcc2zi4%M9C$n6m@e+4 z+=ICJDZri9^)`M^!JtfZJ5a&#yR|93Idv)u4NzE3mY9aOIqnzBthuS?lkaqaa;+EO zAQnJgKUO6rjkD)@+{@&8v%ER}-V>{Kke)>EhW95@09HLc9yn9*&H4~UmC{&0As`^OIB*y@4e6l=FcZVYlifmmb9 zX~GcXoZJHveM}=e)dJ{h$HXSO`)CE=JqEhk${`hg%lL3*Up^PfZL=bH3ba9;#m-t# zbROR3_<(qjdj>5Pl#6eQQ!KwqI`Y}Q%b4r_00fwc=9}j_?+9u+mWbm99|v7c$o=*x zX>q4`$-&{@z@3WtJz&Rtp&`A^v7Dkq7s*VigNtzCPq_FtVTuKa8`}!9B4(%fQx8Gq z*7b)W?3%yCCN(^K(Dq+5`_q8NeymmA+fkF>Md<7U?>} z;%{@{K1Wl{`DWpip%4!|zI*r?*r9nDM)l#v0=0`XKA}Oh*b18Od`AFb$A}w=s*v$h zp@CMRtuQI2{B4d0pAPp0jPY^<6N*N|P@Cva z9ncmV>+|4fqRm|I)3Tp|gV3Dm${P302!CKy_ESxR)&#&`TT|y1-oW@JN}Su63rt=1t)z?VZl9=KM++zec2O5_tpyFV5bB3Ip+Tm;vQi}JAa%G=t~h7 zyb)^qGv5I@O%Z&P0sOq0rh^I(x3#A3t}opzEgMx=YrODbaeHR3Kl7y`PTb(pAq?Ob zJh}Iv!tgdnRz7p1`p4eUxKU54KQl*GH9hi$I{1FqYSY>W_SPN1FF*(vUN21cjT}LH z>|uSEU|!6EvoZ~jr!J{RlA=HJ6dzrjDMN&r!zzEPD(|+95zctNk()iJFuKi=eyScW zFRA8)87~X{1msRAs)IqNy5$PUy#SEqbe4z*^9M&KvCvq57!cW!Jlnae%bp7a`!|44*g?IR_7 zkNW}qa>#w=h(ZPo9av~tudkCVxYcrZE6UzpL@mKnFP-J|)P|A{;3^E@#nH4)4+*@W zc01<$DcVGNNwt+3n#L4Nl+S`&)ij0gyrSs}Mfv-(j3x=UYL&G{8k2~N0(e=4YR^<$ z&c#38X0C3ChW9G+B5LFcs%;fT6D8K_bR{JzDQe?B#qsDu+lh7d`sFsfl2HlZ8BH>P z=LSUOzxF%@6yoi-h&eixRs8(j6`%CD*v*0Fn&WQe!LjwWPD;`kA5s}!k0N6Bxt|J} zx8S6xAR^Ku7m;U?YNMIFIwoDmU+%+V{v_$8Uv zkKurT&ldI=8Q(mY9K@bgBW$6n~Ijf)xN<=J}2Q%V6rg z?Siw^s3|u^+e@z2^cY)5m1#8qNZ81W^HE`e01w%1$!a0P^SO_`*!&rdsPuf{z3tp}066%|->X&dp8n=Xa6B*Gp@`JQQxp(-8*d8ZXoFl~ z=f)2^f%`r=9;+o4+^o8vPGvocl#*+wQjpcyoH@60wq(A z4|42I*M6^8CG_*`6c?T|QZ;qzVzl*+qpHM&i639f)5CP9%3Sx)qu; z2kn`+R7ddc>bwA);EYTfjSFITy4hD@D17(NRPJ1i!m~xQ16=QuV^#U0rng5Zmrb|l z&Hy1|CE@gU$A?@|Ay(v(s^V};y>eUHGw;~Fux}ub3}-wrr##LG%~8>vVgw&S_oI~N z!-nzmGQef#D5z?BWPzD*hjKshA{HFOz^5d5TVHQ1N@4q)qDrsaFw|bs5j^CKLNrrG z_NL@c7xt!OJ$ZG!8DKFtU;2K#PJto7n-*k&@zyo2m%`iS8R1d=TZ+HpwxAowcVN9Pn?ri%_xfkxFL<~P1R_-`v!LPR4Q+#4o$%vnLm8~ zhHPPDwy^dCEo9?8p`k_wo8ga@-uRdBP*LynU3Jq&}v9yUfUL+k)ch9 z17`}MbpUipLO+X$8ttX7xQXCB4%KURPd5&}X|;A6E`_+Kh^VIgXCXH^Lf@$3cV<*F)DgTTP4P8F(AJ!%bTeQ%Oxjj+6prYKW59I+oF8Om zjzIZ4WDCuaRb#5(ka=kx6%{(ShKf~%6T|6)9Bt-f$5M$nY|mT)cOT+>cS?PEF@X2j z4O9n5v0j{Xxq`E|n=(Y`AH_N1Zz~FRAzNs2-IN$cr+}kK4m22%V72sxR@{jS4?#qV zY-gQFQL!fHJ*KdP{PxV;cKQuH=<6N93+Li8+7_i`vwH-0LjaFeCkhHC>5``u90T6R z2tE3r>>RPgx!1eVb#uKwWyLTjV@?tm71}rn94SjEinLq4{U*dUDB>($5xvE0!Y%xw zamik}?0KNcS`~7=h}*c?y#-ub08foESx|T~1-1-$w+y(yvi(X2yf7!);@peU{i=fU zcBID~ePF*uQK4<~v*37Ihf|EKey?2UBWc?+Z@w;yt5S#85&SC132$mK*BZbRs*6e2 zh6Qy2x$Y#gRQm}>mSYPwR?<_-GD`LVEjX5*8paU$(J$Qlk9y@EUrV&R_RO2rv3ecB zb+IFObU3m!5L6TlMS-H4H%(~H6cp%hC~YUof6b1L=BRC&{Cxl2$QC+zu;&+giV7I@ zI>FsP9Q-%s^~z<3S82~II)a;G9ke&ed4~jPv|k6q*aFCT-n18Txvfz+zM5OM#YBe?cDf|tFVLA2tijiH<&C-ZOo@7S5{&^^u+0P^wMQ<*4Q zBuWfX5NadzBa^gkBW$5B*~bX63nhn^cF6T9Qg-RI4<}M;d>yoB=6CsY0J-Cdh`4|2 zLhYHcBlwE*mwPgB#z&enD!ek2axx!s#+feKCMgH;f&kvYgVPm-D2F^%{_B|}m?K|R z6Ijq9 zDTX7FQBaN>+}(Cl8DPk!J{9gu_8-8OzV z?0%*qYTkHf%749xo7@x$wqVA!=h;G(?Bn1HnU~w;vRbgH09vvKvf@irD#KZ({BTAf zmuSxnEhFKCifIV`-W3+=``R-L(ukLeB)sY7^|}}Fn*w+da(y`@)1IO7-zel_wxIKD z!7XUT$$lmC$`%z4EmOYwBSs^)qVoF!PES0XHok3S79GKVBFJf+84P;12dJ}2dy6%2 zcGNc>AtywGvGmNnw!21~e7@@DtQH%ymiVAFDDrEck2uQwOu3YajFVeZ$ z%qv9p(o$6Lur0Qt+`d4R;?ZynvfGCf3clBkuleIi3vJso8v^F$=B*wRpIRA!oO*-- zT(~(zwsEGQ4-OoIi?e!4yT z$62qmOXOy-D}wt0T(~(re@|2C78dp<4Xpff6-_hMfP0j~+$orFH3 zJ(P1n`LE7^!7aEsa*)G0`jL5fk}WKfEmX68g>%4}mo3+OwNp(A9%XnzQK53*9Q|eX zqP(&~BFE#G9Y7HcN41e3UnJxbuXU22+ZhVS)QE=QU63O^9KdY^R|ITQv!gF;wf`XC*710Aunr=J0P4oJ-=I7Ddh*}?3=h#SOvx8f$|yb^bJ^444!UkrjODTgez)e7Y!Nr7H?acE!AB@wV>l0KWms$j~^!%;0K6X8b; z;MDS%`w{1P(+s*5W?G7F3Q_`bRaKNjy7L2aFIQ$=E(TG(8S>OIri~I;HAPzF*n$z5 zr9%~vh0cB-r*L4u0H)733(`44H&GA$>{3Dr6}Ni<2Fx!3HrrAroxwRD@WG9J84gHp*e zda9yjbLQUrL3*?}HRIR#&b*oX40qP-HU~MmaR$t)s#Q&zC7LAF&lXsVBPLlb(e zN`O0AR-oD?s9DDK)a5pmN%3&a0es*&ZZkLBSu_7?*@&r=t%7OyBQEHCkii1&X~;?H z@^MY2Q@%2OSPSVA;7z7IV7!MT$Qlax*t!5xyt8BV+{aj4Y4|#hPvv;R9Nf&auGQaaTkyBbJQojR(KZLNt2-EQEdDJ0x3wI=zT?^U z8kr4FlEHtq^rFX7*zbbQ+&^7Tx*qsxfoNaPfKzhMEd7p_hU)5o$QzSv!`v;`7krkL zDFWRMAF5GQQ_=7QuUskN>r(9I zHm@(Z4>xV29MIe&)bF~vM^nw>i?cr? z@dcDoUvS$PJU6$Et>}MIzJU8Xl4#O=S6}e2eC6>d_66VC`+|R+$X8k=g*b|=eqZn} zroM8Cr2B${d-M8&e*yQEYb1BKN6;7i3%IXbCAr({FYgQfm9K#0oSfJrzo;+xSH5B- zjkr1N3+`bKUcLBY?khtw-WU8EXumQdKH{)RGvDcz=nMXEeZjwo`^t!TeZc{5TDwN{ zYt$EUUWa(7yK(nd8S4xFm9IDv z$1)R5nnho5ZTo_E^=SUeSA0o!qIVs0FX#*Ym9GfN_RPJkFZfr!BBapakH3AkFZfr! z;siWg*c>5(-nqWuU-=4)P5|!Zbw8tToazhym9L-}yoDV%Gjgsk_*cGS1iR2Tc3V5w z7yK(kIysubk=&uD!nCx}h)lSH6$bu5goP(>0e6hdr88O_~kl z;QDar3(l?R$NPeR<$qDANwZe6M>F*W4|+65eZhBiwlDZs{s%?But_ua1!u_33K2KY zKe8|Q?)L>(r~86`<$qD=kel+`g3pQ&=bD!ukkh-@7ku*jf`1|Rl^%h%;LsObQD1Pr zPTy}uFZzO;FQ(~Kljg7dPYd7$8`ArI!8Ie!?+dQ^#lkP-zH&zBj&s=;oFl99`hr6l zZaLS9{wrTW3HpKy$cet-5LOq7xG&_sG9>dO>xvI`+`$geSH!4m6I|v+Gg2_ zp1OiRwCxK%P3v^v58U7vabGzhiN4_e%YyV@i);&S8iRik_mx43`+|EiNpU~+Mch}0 zrQ8>s_EPcK$jP?gU-=5iTtXc7XkOF=O`6sDzTjW^pBI;@=6aZ7k7m)N`P;(uD?>dS$~E$T3$_>0fnR{e00000NkvXXu0mjf&Qe$- literal 5995 zcmV-x7nJCUP)0000mP)t-s0000G z5D+3ub2D>*HgvNzv(?T)25Cwzqg$-Y*Bgzv7#70C$Y>zZ|^Bx#kUXu)I|aZi&|G#vr_j2g}VK zEN`HBYYuKvZ>0(FZ#=joWsNjhPu;Ro*5ZcZPP3ILEMTi#UN=syb{;fewLtK7$0i1D zu%M|2z_uCfJpku$yNm%}wHB)2JK-_ET6@6NTN%tX8;SB0tTv%>2$o0VkcB&fCZgd+ zt7#B)wO+hY$bf6M5#{3rCFiCVFzq%W3+ufoD&<2wl!{$#YytnmwI$QVHWrmXKk`SY zLAwBrEzrfLT!E(j6S}?w1 ztt`;81NazR^gyy=A@18I3pPM&QKPFG^P1jd{$J(7N9Q4UL1+CSnPRsWu{mdjqpj;)B)5*+4))yWT{wyb{62cMcv`FsuvyY zKh!|7^QDm}%f$}rY`{{{wOHtTEqYefX^!KnGx`|x{frhsI}d!dbCU%dy|ewQdsbC? z2k;n8v07DIaAoJ653T+o=kq1`iUrkDy~kCB9f#I}zW>o#9hCx#!E3&L{?aQJcuV<$ z^P;X?Tdghku&U^PWaPlQM)*-FazKm1qrr*=)uOUgaM=P^?O9bZ_C}FeU=Evsc>t-d zSm3mMwN_glHNm7dE%&^t80|8p7ElKIeo$~`y)rA-NBL54&;y&=%!>7ARR#5^Qxrlt zO|sNDtj?HFDA(mn>q-e{Qrq|ERfQ0O6)EJ%B!yW2haf>Mxy&=1_dt{^u=&!W@}LKS zBww*Ts?uG+j>7qYdjU5J1VvXkL2YSIs>jyLr#7=pBledlWrWMGv$C+FIa`4p#hTFA31H^~uqL(9irIW&!1VES(kgaA`tcREZXYk1Pc2SZCkqcyDqB*< zgK%oQK}(61w$Sy1o(pP+4N+>xOukmVse5)>RclXEB%mb~velXIZaK(Zsw)#Zgdk@gsr?1#q zi_O`Wj6}wovv|pjGCxq-+bh%YwG~^6fue=E!9iY2tO2CDi_=L8R?R>Vgz^qNSs?@p9Mi+*?LV1q5)oR-Mj@7fO@twD@M!4 z+?6#8vQeONQ)@eKt$FT8N+AGuC(`^sH)61=T1i`}{!#oimT6s9>zH-dIBO<&=f?pF z*GG7z-qcz%#Mz>O1Xw>(g8~4^dJOalyz6YG+R~}hIpA|KI_<^_HfD2RL)E!HSl16P z(9QT7tK+LwueG*|7AWwZu`9*{2cz+REq z`4#rAWSb6LGqYraazoHrYt}4h!>k|V!)FA0{c%oApxvysRk>P+VNi-+@yD%Oh^<|+ zRaslA)YPf}^ykiwnSneA%k}e%_ip9@1*?LyR(WgHP`W`e>-$dlkf8oJzg`eqpnPOq zt%@EU;FmX<)=gr|h2c4AmEk}5??0V~&N?vQDK}FtS!;S1&uNfZGSEwIy~U|$)+{X7 z{r;E(e&`!9i3P^kRZ~q9uavUz$hU43+qhPEn#CFZ`%fv;vJ?G*`wsh3!j{tAIc;H_BaK^OuFfFo=5RVl?{uu978EoN%n zB(}kt0q&AJH(&vO%3!_Clx8>|^w`=n8Ty3X2Mx#kAsYo`A$i~RxwDWGhb zDEL}+p}j2MX4kzND};HlKsqZHT`D=E+A0cLK_nshl; z3~gBy03dQ;aock8z-9JnQ~@RotWlLU6U-yY*)_uuK(N=GNVn#J{?+XOGtp&>W~`ln z-%AH3DvO;9#sGV=0g%0fCtYK7l!Mh-^RRW-O-6Mq3Hq6pvIncX+yE^MbQi8vF0TG; z2AFj~kDK7;&5+(b;-1&&irao};j+E?69aSM+j~V1JURp0@yno)4E= zP+iAVw=I}UYZlgQbT=}Ka|`SMTehDLLs?RN9erdV-zPxXVyZP!H^1z*qqLjSJ3`c5 zt+g9fD2{J118np8I56cJ)n$<_UM;rPs<(_@wQ4~)zslc>y8^8%Mw^#5)l#`$wS_3q ztxl#|$v`x~iv>_`;E)&KSYuX1i_Hy+5gsFumjn>jorI^Z1| zwM*5cV54d61s&I2;Ci)8c5Y_DU@mJ1Uh9tF>`0dib(>H-ylg{N6h%z{)v#FO6|1!& z00L|ZnyKPtt!uEBq?yjkLc>?o-y+-5O^G{XCsb`quj%fP#fyD<1$9H&&R&$yO~YlY zZ7hq|<&V~~oxd;9vJ+gjZDl>XrloA#-~4{vzvJ)t*GG#a-_3%~-?aEuns>9HqaW2? zvx$%QvY_v_ppE7~YKC78eT08w!Y}s#zP%OxQ4a3;DXmohO%Coc`mN@{?~cL0@&JCb z>Ma|D=xXej$KY`T{1xKret8TY?J>O&L-~Gx3>xPE5+>ibc>po(vF*g+bEbi8bF{Lp zYk|8w4(Ch*Sx1y@2!qaq0QFm8%mekMi3irtSHsgR+}3K*plK3=<$+z z3^5G`2c`IF;i3hOcuKU-u+Z~3O%Ip`Xqztw28W9|kU8S1rhP&i3p`*NvMtttReBYK zEK9`G0a_I5M~zzUvf#(kpkHmEx`aH{a8hH!e9eLqV7jFR9*%x02(pAc?dc_F52Et5 zSgLf~UV%)fEo>AY4Lq=bRviebT3L`Cx9ynNHV9{Oz{SjKN=8GAQ;5)PW$gU>i;=KJ7s?YJzb~<(?qbGA4G&1-ESB%qHZN1wD9Lv5?{vSvVOr!MG*$!@7AU z_81VckC`B35msy!k#eCLBBm9`xF3GmS&@nD*up)%JbizxLi8TgJY%s|1dC3a8FEIm)&JV%KQBmIuw4*g}jU6WcP2 z9b4F(a?}A267=mTJP~1@d&yv`sze$(I%-}Hg9}im^?Dw(Wnx<%G-F~LX0c@p_XvPB zTyWTDL4v*=N6S_=t3>2mOFTVBa?g#L*@Zykbe}I12nX+#g zrIwLzCrD_Y=SI!!BSyg9!nh4_&}Aexev@Mh_l67p-0wla|Md-K*|&~-8(=x%!lqP;ArgAe2T;zRi+RQ^!F^NbKIig$)`#L}Hf>5Zmxu z4~?^A((Zr<*-_IcZB`gHIUMwuVmcib+?PxicqDe_DSo1wRpGau@W(7*Ov>rPs7cx^ zKWbu@DDQv(i5&uq!O&qi5>NA&Iz2)YWtH854fJVg&CsP2`vCr#XD>8PpWpbPX?$Re?)2>qI+AQ$1cooC;2 zFeg&8(y1Wqad^_Cqb9&XA3$QO3=&&K@a~^Hy*^_Chn`vrSx3CjZc5MRr7p`(8eFh0 z$1L_|6^4V}OV%aUc#6b!SnvP@y%YJ#Ahn!%x_&OdQ^KA$3%iVu8VFIM#AFnFWj6TA zkV9f~aCP>bxJnKL?AvZ)yiW~SF6`;{SrBwtFlpjJgG@%pC#~V29Tq%^m&bxvLC`r1 zByjevXP$zF`M_=q@;P9H>0r_%gN6`zhEH1U3nXx5kl3CueEru;pM9Y}19K^BRPSa5*Heh@TcX%hdJ;I|%n3dFpN&o|?N zjP)^L+D)2i%JZ)*p48BwIjWaqwx1;=wl6e6{n{y$q2F2nuqCuwGAF1m2EQKbGT#cG zFzq5X6*!^>Pikn;0S!A#1?NO;e=!!4pk+(|PVu(}0Bi}Z9(o#sUytI}qb>_3O@;uh z4^70@1n2@0JEDR|MC^eefcX9kF~mJ207tSO089>8=qXW8ha?8OLF;|oWqi`0EF|v% zz7Pl4(x9_MY(z}wh}bl|sNRqSof3c}`mF^38$zpro)Y^u1i$XZt(UsYPns!*n4agC z;fGovV~&W8dxI9Qn;ifc%yWfZHk#(X_79hOq$RH`v(vE*B=>B!HMF2goteuVIEG8 z&1C>!`c4uZ^WfL8%j%OR?lSy8;%e0p(>WG0TQ5h0K2F3g6M$_mxE%}N92Y-%@N3Xz z831D$NKdADfLk1z%(OmEl7F|~BxSMV4Vd8YMA!@G=6 znr*~%!h;Tp*k;iT5nBPMZWj@oD9FSvX7pSA8|ng)rRtfd1QOkYsjW;Jj@fqKKXu(E zVwzk4ERqwkZ7UEBy0dQvsRx(>*d}5d3UW-p^%3RFQ$--rU8LUXq_HV@_-Q+BAf~ww zcz7bVxqBoH#@!OJ_0O615V2=gBBS4iKhrQz9rSb;rnb%+54sE|O*if$Vke!4w~ds2 zgGENfHdOFUB6ef}K;g&WFqphmJ06+ftnqNt&|N|g#3pogS7l6Z1w&EiPMnCXz1>5^ zW(51(>!~>N6nI*;D`Twjc+xz9bKxzzdOT?XKP^2Ue#nruJBZkG-2%=$g=6en7qMj0 zuwUO#+fByw-bg$lJ(1OR2OI^xC=PX+wp~lcw5Nh^60v8_ zg05I#clC!jq5*I{_j?7?wrj|kelRNdHW7Ol3z}U!&qo@8g)D19Fm1bbjA>2<-$lgU z@u(f!&+UFLF9fca-Y_pWZm&C#p@Lt3DgE)KnM2@ubp=k1+uFgY;Ejpc$4uA-Tt7c< zYcXI{@b*OP<2||gUFXK_jvsEkZO`v+e(+nBjcL%H3jTj-gd-mKyS2?B(|3Tj?`fDj z?Y+U;w>thn+aI=^e-FQ{U!^R0;BS4Jb(hA5tgs@Cx3-)c+vGmd+a#YJLo zN~?XZ7#wgQOYHTu+PC%KhyyudFQe7I<4oMkQ>_qt>kP?viNO_O?-oPyO*{yI=%

    bu5*)52 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 diff --git a/public/images/pokemon/exp/back/672.json b/public/images/pokemon/exp/back/672.json index e323b585879..f877b9abc2e 100644 --- a/public/images/pokemon/exp/back/672.json +++ b/public/images/pokemon/exp/back/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "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 index 5281168ec2e10c8880dea389d7ba3d9a70a8c3d9..ef5cf63938e866b2da1ca8b338b5da1e8efc1536 100644 GIT binary patch literal 3416 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 b{sHw6-$c72gV!Xl$0Qo6U{IB^&D;M0mUIh_ diff --git a/public/images/pokemon/exp/back/shiny/651.json b/public/images/pokemon/exp/back/shiny/651.json index 4e96154d67b..04a791f539f 100644 --- a/public/images/pokemon/exp/back/shiny/651.json +++ b/public/images/pokemon/exp/back/shiny/651.json @@ -1,104 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 106, - "h": 106 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 49 - }, - "frame": { - "x": 0, - "y": 50, - "w": 53, - "h": 49 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f6a8875e3bdc40a01569005eeaa99a4:fe6f34e605d5c3077475cfd03942ff77:a93e5fa02e10bf11e3ed8bf6571835ca$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 326, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 272, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 100, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 56, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 51, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 219, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 248, "w": 55, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 55, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 275, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 325, "y": 200, "w": 56, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 56, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 54, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 332, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 248, "w": 53, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 325, "y": 247, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 53, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 149, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 108, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 162, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 55, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 109, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 164, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 387, "h": 297 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/651.png b/public/images/pokemon/exp/back/shiny/651.png index 99fa14d5df96388745608606bd1fcd62643f35c2..b607fa69a1514e4cae648be2f05d5ff611424862 100644 GIT binary patch literal 10407 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 RFC72?002ovPDHLkV1jGZIdA{~ literal 974 zcmV;<12O!GP)vv)NmJo#M3jrAQk(Fwx-9nWAiHhQB}+j93by zC?A>eQ-7*}GN(5T3Mndv9w1-$se4UNCtH2_wkcCL*n<3@rmENlb;jf)bI5mww3#aV z@`5r|gKdbEA|g8U|AML-qy*`BcJ3fnp-AtvE~$#aMM@`5SEZtu-b-Cjr9o10bT&2n z2Byl_6bY%^V3cZfoj0v63y8MvoHL0pW6P|E!V)g0sz>W8x&7h1b4St*$Q+{mbPt@(La`2yZ zu8fQ-3=Tw^*ya#bp#5p~5mBYVVPKx;+2#;)n1I$Jj&4)T0dY_^xncP@?o{eFwG5AC zdFwY10C!WEnKT{S`DNh4a+ctZJ>+ohP+^^}xG9y(HK=@Zf6Fz-(-TT-!( z?l?PAUZ6<%p-jZQ04$QaPX&9~VVu6aK+!Ui*C|j!sk_vA;`8p3z+VmtCXV>I%hOT<_2K6oa6PQ{;8%e-)OE$_mRyA4|!zQK+zN6q$$X zY!vGilyZVvP|AsFAt@(TSjq`&0VyY{g`}LY7Lbi%N=P;eDM8sNx-5Wf^s&&65rXC?84ltd{f=?+@blyjH( zB1-a&>QdcQwFDXIFx%|(+1*)i&FdNMSRs3a1l5&=TDkk+2rJVaf6?ln; zvQa<=NjXt1DCI;?B`oDc)zFj^-d#X83Q8f_D11}5vr$xOmvYj(Qbo8IqrGOf_vEfB w*XV_*Qp7h?M0{)YNfDoI?crCy`jxo;0XF?lz9wNpGXMYp07*qoM6N<$f+d;6CjbBd diff --git a/public/images/pokemon/exp/back/shiny/661.json b/public/images/pokemon/exp/back/shiny/661.json index 1199eaead4b..be82a4ce425 100644 --- a/public/images/pokemon/exp/back/shiny/661.json +++ b/public/images/pokemon/exp/back/shiny/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 68, - "h": 68 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:622c17fd3933b7d7d1eddb422fc24fc5:684446320bdfd8fa492ed28395182fcc:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 39, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 36, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 112, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 34, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 74, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 34, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 156 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/661.png b/public/images/pokemon/exp/back/shiny/661.png index a76bde31ab30d0dd84bc937bdaf09182d88aed43..a38de0cabe4e269c1b582159dbbb1b80c98073eb 100644 GIT binary patch literal 2256 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

  • ~oz0ZKyYteyl93A+}4$o7y|EO{_Ik6W(ti1j*m(L3lNs1+~6D?`4fOWN(ff_<n)%$$|3+IPx#Cs0gOMF0Q*5D*YeMNPs`R85&ZX3SFFfqrILfPiy=kA1VhtiQOScfhe8;p z7UIH#wB=!lT1bty1N$Km7O92&x3KVK7SK|K71Tlw6h1Nj{ocN%-|zj%oP^1=oeaq< zj^lPHkkAe^P1jprq|Idb+x|r2rv1d@(#|%I<2+w!6@Bk?YA3_r-w??>zw_abC)pPJT+zNYo1)0I>_KQ=t%a4 zm8r7~UU9MqJRpM(dcY$x2tD8l8C+Sl-&+QY|EDdh{mwF&{W4cJXwpIX>}p_De~a{q zS!t3VYuV7h6{6xpOG|Pm|OgeH(Z#1VPPyz zF3i8NuzWjS@xv;yFDxvp%*$d~W@Zbc1uS9rEzIK$Y?PfZddtFC{n{ilWU{Nq>enWb z!ILe9vHfdGZF|>NSp7wA5 ziE=SUxW}Ne9dV3V!q|>Dx?9d5D{Og(Fa0QHio<4cc}H3L;oBeOG_t(Yuv-ppe}s)J z?_j2Ef246O)h02fVnRDNusu_{+8$|qEw6uLll@2>p6qVzAC8MJ>Q(VJH2?qr07*qo IM6N<$g8wjATL1t6 literal 5657 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 diff --git a/public/images/pokemon/exp/705.json b/public/images/pokemon/exp/705.json index d710ef9e5eb..eecb83af45a 100644 --- a/public/images/pokemon/exp/705.json +++ b/public/images/pokemon/exp/705.json @@ -1,272 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 91, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 119, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4bf155254b23c88780e7eee282256589:82bb727988054c3064e203b6908ff464:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 159, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 39, "y": 125, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 200, "y": 60, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 39, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 79, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 117, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 127, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 39, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 78, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 117, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 155, "y": 181, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 119, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 79, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 39, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 196, "y": 123, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 200, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 159, "y": 60, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "RGBA8888", + "size": { "w": 241, "h": 361 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/705.png b/public/images/pokemon/exp/705.png index 670e8be5d51fd8645ca363e13dcc9eca01115e36..0bd8323bcb4b8fbc15dc239eb284a60dbf675a5b 100644 GIT binary patch literal 22217 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 diff --git a/public/images/pokemon/exp/707.json b/public/images/pokemon/exp/707.json deleted file mode 100644 index 253d37ed70a..00000000000 --- a/public/images/pokemon/exp/707.json +++ /dev/null @@ -1,1931 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 283, - "h": 283 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 45, - "h": 70 - }, - "frame": { - "x": 120, - "y": 140, - "w": 45, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 45, - "h": 71 - }, - "frame": { - "x": 151, - "y": 210, - "w": 45, - "h": 71 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 44, - "h": 71 - }, - "frame": { - "x": 235, - "y": 211, - "w": 44, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a13ec2d124f7e95263b088a395e9d780:8c9f0ed432d15fda1ebbfa6ff4063d39:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/707.png b/public/images/pokemon/exp/707.png deleted file mode 100644 index 294d6e35e70db97317b4a938e9f32a0b6e6bcca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6310 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 diff --git a/public/images/pokemon/exp/708.json b/public/images/pokemon/exp/708.json deleted file mode 100644 index f03fc408ded..00000000000 --- a/public/images/pokemon/exp/708.json +++ /dev/null @@ -1,1028 +0,0 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 206, - "h": 206 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 50, - "h": 40 - }, - "frame": { - "x": 102, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 50, - "h": 40 - }, - "frame": { - "x": 152, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:db6408a4e96a3c4552035ce768316e02:28f26069e5c44ed9f6fa66442864f895:796c82c5076b122f2663381836c65843$" - } -} diff --git a/public/images/pokemon/exp/708.png b/public/images/pokemon/exp/708.png deleted file mode 100644 index f71cbaa535d00f3e9f23f590a3ebe771a45cc649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3240 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 aCF?&hbjbvQv=V>-000000001b5ch_0Itp) z=>Px#Bv4FLMF0Q*5D*Y^SRz0`Kv`K?%$z;{#7r}DfJdRTVcPPuv$L}D|5Q?QGXMYp z40KXXQvm<}|NsC0|NsC0{|UrUCIA2ja7jc#RCt`-TibTyAPhut665s$|98zz2oSa; zdfMIfOVh@~h!ME)jN{yYb-?2{pi9^_IJ_SZ>mcwp(12DNM#>imt#OU?U~`F-O`#VG*qn#r<8lBvq2a{btngB**8tUs#h_ob z>hnh$fgK?2hs?Bjjb0;EE*6J=JRVKesc^pPG&-KE&})Dy#2V2fJlDe9H3D%ej@PusWiB`UTNH}4-}f;<;AM+Ptkc=X>&CnJ;?%U zS5^Fh#Ef32MsdhF)Ln=L0bJ3ZMbi@L-{P_$)PcmOMO7B>Os@pZJ>8;6J#;P>qDdQl z5IL>p8wV%~mdf74d?E&yMp+H4Ugv^LpDoX8MTCAv=uE8iw=iZTj&qK4WzcNdXWf|_ zhNW?{xFRyVaA9|r5mJ9{{j!WMGfFMeqU*_3V+v;VdTzLU-5feOo`^2vqfC>FbHm+T zM-|k==%C}Bp)H4o`a5}@(S}{8UMhO+_$}&sWnD}hew3Ct_FB_wDU`9(X4K1wUkPOv zXbb9XF1th{24XvHhgTcHu#gih(5{l#Y{U@5EzLQ=(EL`f5v+Q_u2<6zc&*rVWiOR& zsd~ZghXvjR+IqJiTz8dm9*NDN%nI#_-5-gKa;?xh#9YJb5&V}h%IVud!sd)M82VX{()OWAF>aeQ6pDrVXQ zA6$1~vXUw;jH}i~QnP?-})2Jbvw80J*CM!+45t+MmV>ISiw3s&6+$r@5SphgvveGP!6f$6% za~VSQ*@&1Hnydih7_{tflBj0B$$8H&Xu2^oM>@2ac1#+Ams=tzaPwrPpKp}n^U3;Q zO(`c}5-1iepv_f7UQRS=Aa=hXS=o!odr7u1-6%OhADvCm_q1is7&VZP!d3V*S*i1l zXO6(|GK)IgPTixg(?YZ_Pl9f8&t8^oud!d$&7V(07giluTd@aF>49(Hb#*>B= z{cyT;V+}nHXALRVf|bQs#vW4q674^I*n^61Npg&X*zC|2ss0)WJl1jk(F)1(wy3_7wru)usO^-{Gt-%Ay8jbsEG znk=-fW_qdGTyBN3fvu5@K+k`YvIlFYda2rs&beMP3Z0m3m!D)?y)l<)lu!$tA&85&< z_3h_-RxdATGqJv@ySfP^BSvro4bL?fx9zfSVD%ETxv{>ftLtwiYmDFq>XY>ZyzxYf z=JmR1b7y^LcQ#tsxo}Q0$OhjCP2l23g%dBTrk;H}>3N$u>l?@;+-Kd6myCNzo|u(B zL+_5>@y|1Eze>@ynX$f|3*LDij#%@(WXwbI&VAyAso3_yqKRPJhBJ;y1>feu`i|r5 zy&23C)`#TNv|I%Xz8b)K_Mw72V~iG|Ci>f9M$%jJ;o_O{gmf0EA`W9H& zJu$IV^&JtpKk%{!?Php#gudXTM}Z|Im#8qT`<| c`maC!0Hm;+;G&;}d;kCd07*qoM6N<$f|QZ^8UO$Q literal 1711 zcmV;g22lBlP)0{{R3FC5Sl0000jP)t-s00000 z00108cOM=wFG@^3JVZc+w`j)lYiMS2HvoZ-kFoXn!Gst0!8rf_|4~pw)c^nh0d!JM zQvg8b*k%9#1~5rPK~#9!?VOE{tSAtLEm)wLhJOFYT|rb-RI4b6n=HAR%p`rNa{&K7 z={pSny=LwD6Dh)~kj6YLKcBbh<5(5Jnf16Dv^ZE}lQW=*{P4;l!-{$i8N7AK8XKbw zS@?Y8xg4yE#w=RYc=eApEMXCQWa)*$(#~N&t z(tN+a-}kG(MuaBN9LTwh znX2d*Up$vcIsZDEV>G4?WlYNdL?VRztiHl{^Bs^nW=^w_mpQYxN`wgWxGKiE)lAN0 z7^Sh!=cDvk=1Kfa5`1kWqcdPy`O^eyP@#%`5I>WQiWnu!^8K+mTYMC&6ys+S>y6ou zvH2Opu)G!{S}#>D<8LLdV2oih#k5dT{$iEi?)cwIygx(<&T5Sblh#!1*A}bn;_oEZ zk2clbSnU}@PScU{YwLVgvmAdX(bfiIO0gPCXKM|iiVj8WUHrWSz{R6kDXn!bsX6_N zC3fgp|NUc~yNQ300J!8#PYqHNRqI|(u{Het{WJbsil}Y+#aKZCVAmlFw(9P^LJMm+ z_BU35Pz7>hS$w0#sYIzDnl%8nhWUiPmHfn>LhqqUXtCeS*qk0fTu3&?yth^N5=zRL zd>$zn;1A+TcGCYv>H_RI0Y~@rcrC?4SyC18B8G}vwEdIG94eHeDFOH#1>?h_P zy9W`M_%=N}kucsC#wv54bN5RXD8#>!Fd74yU1O#yz$+m++lGgG#p%us&y1}SDQ`d@4^Ed-hl_6-m&rc_W*g7 zgGAp-cyapSdF(_20lnWyXctE$8{bO=4E=HX1Ic9Ug*ZKZ_nf2q@c)r)VV2sHbfsJ3mVZJTucs723!<*gN)v$of#*c9L zleywMBC%{dgTr>ar&j~(izFNy-@)OD0PXfQavhNvHok|$Hixjl_Elaq8{fiVZ5Ife zHa0Si8JdkBd9u?P9HA;RaG1cxPk3@Xlkmaellc0IjTd?H0d-am z*cnbwd#y|H%RHGKGnV3u!^_Y6z1G~V82`FfnJ2S9ot5H?>uKq-*Sb%9lCvi9-@13) zzJ61?eVwrmaJb5t_pe)I?cs2pvA4Yr>jH;qH+UW3FbVthfWxH6tqyP)O-DPyVKg0W z3x~;cv@IN_)6uqYm`+FA!r=-!+7u2m(^2OCzod?iwt>S8bhHT^uA!qX;V^!A^?}0# zO4I`mlP=dC;4tZM>;Q*p7s&Q-7(b7F;4o#~_khE=d#`?Q80D)E9H!h$pf?+Lo5~J5 zhlv-*oQ}pX)4~go-+t%tMEhQ1EZ;et&K@s#g6whb{1-o;g6#bW4xRu2002ovPDHLk FV1ja$PPhO7 diff --git a/public/images/pokemon/exp/back/693.json b/public/images/pokemon/exp/back/693.json index fb29d014658..6358a8908f6 100644 --- a/public/images/pokemon/exp/back/693.json +++ b/public/images/pokemon/exp/back/693.json @@ -1,230 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 223, - "h": 223 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 90, - "y": 147, - "w": 90, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f3b26f7df2eeda76e504b3f1294ac699:a2e5c9fc75e286a40f09ab013ac5cb32: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/exp/back/693.png b/public/images/pokemon/exp/back/693.png index a4b891370430383fa788a80ecf20c3026b1e10b6..4772c64f8d0d5a22dbf4894c4445b4f3b608f3e6 100644 GIT binary patch literal 26876 zcmV)GK)%0;P)Px#Cs0gOMF0Q*5D*Y1CMI)OA|gw3KtMoWUti3eJ^#c^HgvNiqR2&+yMv4UHs7S8YE9qti156}O-Hnwf|0_YHv8+TFA{NIBkG_gBoMw!5! zyu)oe<=Jl+y`usU5OkxxF^Q`w02uynS-?#IMcyB`%Kk3SY4UFny&-oynOhL*C;vZH zGZMJRc)x*jqH-7e37xyi+)M$dzrn=5L(TU{=6eA8xKH#kncEHFW(v9Kr{^?H@6LL^ znzNF5lkx8ZXx{g{EBFkVJe3Q{-0VY-$v+}Pe!4Nb2GDcBcf>E|-Tu)yfLB|P2lyQlenfU@k#9}uS?vhQa+ z>V1AELJ!ezUiA1UB=_g^9FTmI3@UhbadBBl$3el}v(!5Cz$T!^g+>OvfP>%t>uWjw zw=63y!2R4i%k~2ReR$TV<%@*>WY+Jots9)%!T-Vj{^j{6==4jzhs+0&aSHx<fBj zdpDI?+MXGZ1|RoWyrZ~IREW@zkNMzv#}(|mlN2GeTTu5Rv@{p9?l>pbZ{_^*0E`G# z{0GU8I0qW!;Iga}8B(y28KwdN0i+25augH!w-Cq%S5Tx)mb@Ng=fMluyA^G#iwgnj z_wBL)Ca}(;_pCe4y9h+vUUngq&wU=8yFD>fjxL}O9f7@@l05Ujck|CQ2s>Mr)Cyak zO23qZ-+T`jmvJDJ3_u66ZvJI=Gs8cuB&QrgDJJx=zQvBH1kh2ts_xvaYmN0T`D8ek z-@`mp4ZuTTzO=)cmAvA=OY#Y&m=02zfFYFH z!7!D?i;AJ0N2p#vqULpV=;1sfLg*Kbj+kZ;YPF0Q<@7`f)uB$1XMW2_W=Wiom(A;( zZE;(V6}xJPE@SSwhkX%!A$kqVDN!*s2o`dp87Uo9`g0b&6px|R`-$B2<8m?!K-cCb z1Tp1=LYFomLa5daCLxJtJO29d6yNmXVuOj(lVqvJ}3G| ziS>%?dpMts_ovM@251!JO#nX6KUDcw?4KbLRBTx%D)Ti|kODv;5ZRf+&nY>9=U-)5 zyn;DZb1yBiT%Reyf4u~t z1kp%J9~V*a6^1bY6UW|KL-1}Iq3A_X(Tk|1n}+ISfl_kfh2BX|kd9}4H>{txE%QMJ zBh*8*#Qk~6XQ1OHzn_tOc2NZdpVx0`eq{iKICdKU=>k?-0;WWI1)W=mp$yOnUGh%o zWP0L7W2{#=cd6VN+X|iHRs2jy*L1G+egM{)Pbzs9{M!gENol=^O2z<|HN-I^r?&u_ zEPw;O+uW7^GIp@Q<+t3QoHGawwskgvF4@-lhHVM&;P+lUNDceT`vJJZKTF>4>%9-q z+ozIc{kI>keTJj@C>Y(*08_B@?rY0_fZ6iEy5iJ=Fmp-nPC*J6aI-UN*sK z>_VlldnNzu8(3^C5=!K@4qRC z8XaGio)`@;IompcPzjA%1UTKQZFoN)fQ{rMgdURLs9xfl?KDCIm5h|UewoU!lxk)M zHidXwOc^=Rk3P^*>ihaydfjMHvTqA$AF6wBZ`)SFxp*P8t8o?U$P)ahs4_w54Uz{f zcqhD*+Zt6VS@q82RO~7&LRstYipeY>vjUe?N--N!tvQgE20{Ots~ z!?u)$Hz)fOlY@6Po0`ix(?I9sZe)x9g-sj(KZ?HFH)twEhWmU4{dy`)WFV2t8Gy-D zB++_9&9tFiT!5JL5qCBsBdDscCH6u-uhMy(pXv?Pp(cCMa!_#R@$1wxm~gLr>0ss) zNaXpql2)1fTT{O)8pFTfaj@vWp0E@;`vLVH&Pg3V9lZwHg2ZxDHk(FUAj-Ee-b>}_luOd!fO+u*-MLS)2q@4aMzTzwWp z1^vchrh!m1dlfxW2=LtzZ58tZTnx+7Sj-PzKd86}p?mIwfm(W^%VB8}kDusXMrFT{ zc5wmq?TzJB0ulM=26mt+`3(P&;F~TKFoNZl(xCFCXq3wgu<)rl31i3IMIJ3cufThv zB_l9lImYJ>>C6oc^U<;Z)8P-dI73W1k8Dece*cn>=j$3yVporQPW^K=$AyUf7XNwI z(Dc-UQYulYPoL3q;v^C~?n~EUiC3^2gr;iFjs&1R=?SRTqRZmmMQEM#g741*6tcNb zM)EoUk7bCd6qOFnfC8Q<`ZlnPXe3n?Nr3((k(yS@rX3bWFO*jP6}k5Vh=K_QJ` zhT~9X=sLK~vE|&c9&5P5d5`mdq_Imoo=O6tr+)*XBd(zdP_JNL5RB@#Mnz^%LMvAlpgTyQnRWQ_gd;k7x~wK1qEt$y?%|(-g6uh6?{# z?05<_(dS%4fr?Uaj>;J!`RUynA~EGlm;|7$RNak(fID=AOIWm=I!)|gKF9x9dZO## z{$r;Ta*k)CQ}J}j-s!9`bvb#<1C-_8uUW&tpl8szjVJqf6n^R|M003Jvn5_nbt zs`x)7zu*GK_%FDIgv2pWNb@H84GyS>3M5n}J=T@*zqE~v0!@?$6%iWPcPnr%bn|WbRn$0e+8nGxh|L%+cRK|Hg&8D`b9Z^23I%7x~|WHOKA!fPWNH6g{S>X`pp7{aM*WC}!`c44OhQ=5;f&Vq|zc%@=xduki z^J&RgqtH~=qJAL}63v{<&qjv5T@?kgQffAH{Q^9R$^T+jAOKAl&@y194Cnj(zly}3 zPft|-oN)epTFzPY1e?E9d&Yq5G z2%KB}LM;0+1;@g`)MuM?02YN7MPD#ql=&fa#s3m#!O{yO^z;gi_3cxa+RG~xx2Ri*sr-CHI->1w2B^JnnCPR#lg z$a%R#1)wgtFEwn&p^@xBi@qZOL*73FDAS-h13fSL8vjk#9}!&P^K&A1YSkMPiKx`7 zUnMY-Mx1kHqF5cD#Y)xPyXfN%Xt%BXP_%$0pd@0KW+2PFDu zWLM`DtnvqDpMZHP07IdDrOA2zS1o!He1ZRhYpBx*+Jz|)0j83!184y)Dn5Q0g?snh zl9H!ZX<~s)uk;&)bo`&}0v5azta#)76a>MZM?$fib)?8fh!z0qvpFjd2cWWPNo+3w z^hq#*z5tvp9w88EYFF{Udj45N1gJn&C^cQ@Cw}Uu&Ga`pV zY_Cgxg^2&G-4coPyK5?4W*{*@qPk8W+I1?5sUwYG0!JpjFVt2c-ydpOLt^o_YgOfB zvJ;h$M(IhZ0cY*3#rdZfePBGR;BD)44r%(H;4au?n@9g|DR%BdHywWT7r*= zFn&HY5wJv7s|6y`V+NB)rMSn_%PACy2Ce6HGk zD#?FjC2xp44+-XokR==a?lF~*_=(|EM1FEcf8-|6>6vM`M7w z-Aa)XSbVaeKC&}U)`Qm4lYF11-iOoDAjer7=_7RDYqB`$TKvyCZv`j)u zt6bo#w$~MlF0hxp;>c~7Q0^nik55nhb06jOB=l)I4mt+UaDXT=F7Tp<$h7Ld;o*A( zDte)=R~vw{p;0ast*4?8_(#dF_DvoVHLRZhjNG%5&rn(gpObrV*Zwz@Qt&?!5&9OV zMg^!co05e<)?s9K{{C_$KWi2ej znD~cMa-RMh3|zS5`FeG{ofa8FqbC7qVz`23`ig>BB&0aaYUK}V0WM*t1&q8kNVAGEhG!gn^j z;&HaxzwkI}HPk73VS!YRzj_W1z%B&zCn>RsP5934H5yQKyo@fLHY|WGET=n3a5IHo z=blEW<-L-xuwhg%x`@LAsWTr^p4uzxeE?_`Fe&dOoRt8zHr30oKDSrsJSar*cl53M z)==@6!lc6|Hs~%T^Y9ef@)?^Kw1F*z(DLLFN=Fo}mHfP936x-cN`4Zhaj+E9=Z))^ zfkp&c0sacU|N1WX4->v5`>AIT=VG zq5qXuGA`n6hz12?e;`5}hx$yBK{w&_J*GEy~V$eza$s9Hu}=hOLA}U zNjn+G3NEA|bZ9B-%IDuNojgPU-okDFlW`(^kj(vmti0b2GGHB0>Jp{MNRty+-;ETi zZXSF!^3d()W$Fc0{vtpzgSf(W6G~!Yw1U^UCuiy;xYNf6$}cvvPwqv8BzchhJ$mpMMp}+%U%+-tFSV$sz z-X)_z?ka>nRDL4qNv*(kCH8RsoF#kVpwI9q{=O}lS;j@oofrVOq!2hW=UDf`^U>NQ z8k_1<@)LmPM18)-zo`AkA5k#4%}y$3-a_a+&mlzo97OL+A#nD$@jrjBk|9J$Iz|3g zj}LxC!FDtL{4}`7B$>?5LG)e^_kNU7R{R|@f>q@wZ>J}r>c5`(+oeH^_os#~r+0sB z?HTWKVLChCf>6#+Tz>v}O>#^8U(7swi!_*4VFm9Mzu&on(zvR}1otSpMfLM_)lAnj z58o?|+zK#FKd;{&fZo%j3{yTYY_lRnzq#JHtO-QSUo;ub_|4|(77%T)fvES~%f{se z+yfw<8@D(4Nvy~6q(1BO)}-zMsM_Alv`k$5 zMJGDv;ZuDKJ02B)z6+oVQ9fS>1qf5h@FCdQv=Lq1bM^#UcLSrBGB1Wlixm~cU{Sb zbs9YuVM^+?2Uw>!j{D}e7QAuM+e$F>F~D~Kl&20sz+e==8FjBQkrT}zbmU#Ln12kJ za1DU$q;}wh(fsR~733qO3o}uaIaBBri%7@nL_N4c0Oe>{C+c!IG_I%j{v#AD&$m}e z2}V&YPToLX)XKl(#V8pw^RE}+zAts~7sR{=AdxzyEc5^{{xW~K~Vn6bk?MV^b?4l=T{Bw%uX+NIwB(2c?{fD(NXp`8GlH~yS&_W1Ow4Fn8I@fzrPU(3(MgIvZ(HQz3Qf54K6EvbSyI#5 zM-a*o#RG6Mectb1bOy*a&@FyMznd?Ksma@3g%i7Ufi~N!lwXedXAMw~(9;0T_-Lx2 zLbyMeIaPD4Qo)4jDN&a^z0-w)k1w;|+v7XXt>q>z?kqx+0BI09kUl@WZn0*>cH2X) zGR^J2TyjF^QB|+I6nZ1I3d%aVDWR=i>&VH!(KXkZArp#w1*CG^3`aKlk)C;U%Cn_F2>%kUf zj8nu5Bp@Z*9zKA|S7!4*YPtdm_ZSfT0#3*%PNO9g6;eGxJ|sZoO;Z<_1o@LKvI6G| z?|OOz$Uo>^o)YN0b?WpOp3f9t-Al+7N?yOxaokY9UyF#WOVjdi{V({!8(&kyD-8|y z6996rlh9smlFmgx$qJT*m>-l;Qs?mjr+Mv1C^siVhMu3|ki&*J^ zW=Iwi7usD>G>OrJ_lJUQCXwoQasNZIUuv`!-2jm9uXFeq2GAlK{Y``(Yuxk-IxQia zs53&P5bQ7Wysi7(=0Is74LymVD(CF`H)(U9m>$CMw-0kjCvu@@Q|D+6UcpI-w3=SL z3N%7r&Ge`bK<cXV>8^DxixQ1GeYM-ZB*x4E{P0i^XfJz$v zA$yK0bv|!ZhLVL(g3wgIJ4N{YEBvFHm%AH4oEcm8;!%sRPMvN89;1f%M1{l5zW`V0Q^VA`S(nWi4`p?@>=n^Nv*<5 zE7V<0XOCYy-H$07z&eJkWhrD0V9D2B0rj9Fy^pz905nl=(C^Zz-}>XwcLRtmz#XlO z8?L0+lMH*rVih1bJMLBNJ@gqA=J2jp|Q=~)2qZp$37M5<&Up(p|eu& z9s#JKUwOKwPT@8H@t0eGpVTo4w(QOY^o0N`9nZH{v?=p6K3}DNwW|QizS;l4`&FFX z_UN?2xMep@p1Y>qb3AK*yuDG|rNf<=n($M!nJt4=(DZP$uihkZBY<#fHV`SiefaW&OgV9^4;y0%!_TuT0>W-5<;%WlxRyy@mCJ0F|S})23|*Y8AH{ zWpRmG@Nt|yEYxyt7hf^sS%gLa4b@#^_9!!{rOq=Q`#t{wh}JRS*Sx+o>(MV=`(K;; zCIGov@I=CDh9QWnkonjA{A6Jrk9x*AN;Qeb3@zQuC{C;p+DLCz{nfeUA7yXa^`D*{ z_Ezy_Pa16JoFOu|5&!@o07*naRA>Yrd_YtG2?YI`MrZ`k;@md^h`w&64+v#me4f^> zr*8or_~e!fo#pI6D1*}e?gT;&g!Vl;s*`hcQ*J=8th(#h)m^>&&{2Fz={24@KLUUP zbo?&?t~LGQ?od&)cLRuCQN&-t{W^VqF4nkc)aFM_bfhOb#$XbiA~Xxov{jtfQCy)G zeVjl@r?)YR_=(cUGhpZfRb5m7YG*G9rn~r}1HYWxR%IOt9-$-nfk+ShqSPe%T~qNR za4HV;djLejq6g?#(F#Zc9Tt$aut%-DBY7ktfNzL(B^#(RFALCgNuU=y0Q_DOf0xb=Eem^k6E=z#TMkKdZy&+~)JETxCEaTXTlB3RRh}$J`ecP5ykYXt^l?;v@jhFoQ1KO=L2oM6 zC|IM%_==U*mC^6A^xwXB7l8cqgnCrBfgeff_&`5*{PQ8=gPRt`Yif@ughzP&R78DGCO$x14?#zLc=%?X~*> zB=4)^Pc% zGBP_)?)|<+dT;R+=e7gcD8uKus_+Y1!HM`6`FOuizc&Mj3K?+Etz)K3?5}3})%rJD z03N>R;$LD+SVvb9EdZ^iDxjJi{XQ-p8Gr_sGu=Mz`J1y7LP>u~PTpO7b>_A?`7=7b zg4r<`{VHmUT+R8>rQn+ZG!bS#X?iNc9_ln0$uVbO+t$y2j7!!I#8qU}hG2Zw8m+|S z6eDO1LfN7KYGY{jfTc;*D8y!8@#XSWI^nCmXj}Mh5Pm)be)xvNHLu^rt9R>q9O`BO zx#=G~`@ue1npcmnXiWD*E#M=5nJYJZh+$Bw8jt>ezRK%3reJ-u#pfVEGh}4yFllho zJ)XZj`!rm9G0-J<7(nPW8T>c}d%dhuGlj1V!Qit)!M6hl`(!e^Tg#&V8!cf`Ur8GN zH~FZdA)-Sr;zJjY&yYIi72Rw@M84U2xB&=ZQ#Q->Gu*hLyG||7-vj>>#aA}BZH;3Y zqF~17m(egO#p6@IBh;th`vK(Ku}nWrOSEiSfJ_gI<)62U>u!!=o(*gL$5~&tngSl;EP`feUXIe6M<9Z|H-y|At zbc1dM(1V&l$LxpbU#~TLx36D7Vq%y<)!m%YGs9CQ>Dir(o<1Bqx!^;!kL&IaU=fxq z0N1*%mTxgEZXo9PHnV5pe_ip_fA$&(KhA5vUenYRZLH%~xAIN^`S~Z@usZl}uR5}^ zxi&q75I`|z1(T#tSrlOx;!*FDO}2b|1Rp04Mm8V>kH%gbtUh*m)ccIFl$oTnM-=io ziKHg)X3m9`uN*Axw%xpr@2GuJKLe4^pby?|D!wWUVIn9k@8cRk zrKfeFL%;U}C}=wGp$lV{yrnfiyH9jMi|^_9owsbCxYdTEV-VgqXL5&Pdmy;ZR%{Wg zI{2oX4|4rOQ`_O}OL2B?h2|5Jf#R$FjZM4`CLk)FC;+uRSC@M42N2Sb`CnJQf#N5h zuu^j9S*8zfV^Tyet5-+Vh3Mj1TG99?HoGmf2O6%^PfwYZlgoinO!_#?XABFuCmxEk zPfuHYoi4tzrCntq+Qm&rlt)G`)%2|Z@&s1m9>=9~AA!xyzG503ztbAN^M|+#(P}_2 zJY9XtMT1Fh)9P!XP3BI|fNZm1mT5r?@Xc}$mgOxfoxJCaMY;HzN?kYO{)c?0rt4L_%C4*Hl3q1#1rQPdLXe9xm%C6& zv&uvy5`AyxRBkNn+a_7)w##a^M88NatNh=NJZFU-=vhuJK%q+_zJFb z$alu8!AQSSw$+~i_Dz2yfQSHB8EjrxQi!tj7xk$zux0*o(kU)a96X#0E&6Y|r7TOX z`s&=HrCA7`Im?nzui@DVe~@h*EWQ?v&_Z(CeZIF&7XuY4`p8{g@869ZO@AMNA|mu2 z-<3`pRFaMWr6j08B=jI!eO$MR!Ps{mE}Pt@d%*n&jaR+Fsy-Eup7lI#A`a^R-yv5eD3H*p$Kh_sn%QCaK{d2MSf)t+}`xaf@ z^zR&Z0Voi-$NeAk0-a~YQs6~I_uWd2@vX_ppX z^jA4;h>EXvZVUZi5PjFU3qXOuP41bpbU9@6dR;N2=z9$zxKu;htn@^NeDRes4(;5w zAaHK1@&}--&~qzFnD27gR|ny+9{0Z|b+VqL_XPBDf5%p>Y_h!9g8nvS_ZDBx+!ntK z&HSsCnvpwwq|6GPo>$Z^Jt~HaJN5360 z8$HEWoZBW&Hp?@8mvtyquJl`2q37=!^`j&t@;iJYLUeplH4pT`fh-6M$R|T|?AGjZ zz8@dJ5ZzvrQalf5wacmGC-$Dp`y<>AyabM ztMYJP?qh!M;4Xlue>*Z+&~xZIpn{4i;3x;J?0Jy;J2CVdJBrOw0ccjCZzHCdQ+RR| zgZFbWxIk1{T)LnE5_#^|L|A9JzthS6gadtlv;n#%`g{wa1r@I)0A1olvkM9<>UeUy z#(f3;&k^)L?sanicL2rmJ>r_4CzW@?)&fFbZy=`ZK?`2!ZIi(1%L^KMxqKktC%`h?+*v$*F5$-;0w&l`S-=VhExC|y5x9x*k5meSrcVIEt)@(bNg?AMc;T(1$- z09wp(yZv+TzTPYs~IICXL-yj-KBC@pW_;2WL)@&TLALTA3o5&YdMK2RBi zjyjxZSeH$IwBfg?rKDmVF$r9QtVQjg;fp-#>8S9=Ixf!xv`zsc?upQv5mu5Cb&IRj zgVRoK7(=}sMe##F4pBnpgZ7zbI^a$0g057Q%*nb2?-3Xq1^>g%RQTPo%{9O3_!L;Kfeo5FQ|}IWay2@;F%za01e=b7Q}zWq7?sAlYr%3@EHZ1nEOG49&>X2 z`+8|Tj1rqE`7gG-e+NRHoH=E4AWaY&xll<~P9RiNOp;=J`d!GPjyp|amYd}msYFs0 z*q(s#r5n4_=F{Z?pc~hdKH^llU#|gZ&dK%NqM2>jICO%X9$3mP@1E&z9DI-j1ffzx zkji#S)M6L9_V}ATIiK~Cj*W}kBOTkH+d7tg-dUeG@Ru3IAaX1J@F1OO-Bp(%2fsM( z%y38;IE*|uaSL|Y^j7jfj5WA1s47t)tOL=_}p7t4CN1fXr9DCh5+9C+2e5=x=v{m!1u zg7{K-8oEHm-%6@d zBFYdx{EonkX7>>guVlevAk+bFJr*4mYAX~8mQu{1wmpW#YqEA8>C?HgRB9?Z1f3^7dE{i6Y64hN>yQ9tAorL=Gnt#W^8Er zW-3de*hGXfE81HB3f)WUI1BkZUrc>;-PZJjV>VLF4i0SdSD}$=`Upw zs#>_e3ZSxWw;O%361`_-$Z$YBKZ1vLlhQ9?WYFsnGz!pV$*jmfDW%^bJN`!+`3j?c zrr+-X_`m=trj`EyGXN{El5gHr7@M3 z7y0I7CY_$U+ltCg?kx=YbzDfy%SiOW{*)}nb;);E}xLM=NUOl_n zlldh81$o27c$`S$+TYlKIN;Xw&?=5~Z0&l1gQ)RvODnjUYEObxahOTR<poU44edWikccI1D8{5r|M`~y)ala&TP5>~Ir*!#RV zKI#LzUXfi=2B7#jw0%3Ws3OaJoBKVMS0RDWJpyTBk&~n2teIVt6aADegHwOhYrOyb z9Ru$sUy2A#)fqd4;l6I<;$Te_n@JKa$*TOwUt;JN}xqvvbn0!`ojgHNVG8C2+ zs%!-N9^rGRr`wXbVF!c$ra|wq`>%1Ib#Thd(YD@Mgoe}#?9f!Uvs*H^jVwZqoFjpY zy!RfoWau4EdsN2@(IXhOXv*gpYDEU2>HIl(X5O?W?j!VDgD!Dz5{Mc??Y4;<04Y>? zmLUu+CVMuiNn{s}!mo3o^C5Z7{94kcTW7btD+F`+Dci*UB_GcRstts?^Vmy7p$yP? z6kp~W<(_cSmq0w^W7J(axjpi7K0h7va*#GRJU~}GMiXtx{2m`lK4IG+?)@w|d9#46 zI^RU-UiEN!71!GLjL=OfB|>Nmpiq7yWsrLoSL~q+%$Ivu(I(b56NtKH9xu=$lox&2 zfj=)%*#rB|;SW~OiQFaDre8u`;3oj;T$~YC-NU6iu3h`HxFxxh_Osu{#TgAi%Ls)> z?fJhXe> zv6b35Nm&=3VQAKpZ7lfzIzte_=706&SRb8JS%y*hT-C@oE`XqFY>Z{3VjeM$KE zbZadkB2psdpiQJOBC}iV0E1UYq47F2U2EB7o$Z;UZ}y|k03YZm(OpWk52}o`*_L-NKrJ1A8koNl?zf5f`DO_T!Q_yPUD8?y zD9FS;tgq~!{mwb`_~(#7)LI06yC%uDUK>MIghqBCmpZ6c;?E?cDAH-2o>rGFZEAVf zDhfpiJzRts&}tu0aqK;x_=fegMmDD@xj%)6Fa%qu1UPdRz(puH|BglF`Yc#0(*Ub^Ik>9 zr*8}^f%nKeyCawoA`b`8dR7tZI8U9p94LQ-H?4O}3FvMJk zEkkbCB*9P>L<&VyJlqQhE;U(_eqsjw%MxuEem6p=3@)c2@|L`-N{t8jU&+BO%M`q+ z*Dq86>O%0+q-MbxRwNhJX8}48yC#n8sei5~5WTSm;ucn87r^fVXF!xB<|F|sP0j4t zEg3vRv-|zKpFrp#+ozVacm>hsly^6jcAkBWUP2^MwgI>T&_0rr!6qfSgiH5>EHMFS z_f5nqBLd@}0Y5q~2n=coL^OBkVRd-9I*2CZG0C2RFY%dd?<563&S-!4&83pO#Ek2} zcQ-_-6HFy-B39=4?8_)Vt?-W9*GMYFr#9jKZ3j&dqht7}C56ZwEeT(cocXGcI`fKk zwqOv=u@${Cm^!LJdv-26RDAAZ> zz=zbnE8)aPr1?z1QirM7Q+26@_RRyBpp|A0(&K3XGP@ZHxG{ zq^!^G2PoUz>$Og~JK*^a%Eu#u=ttG+{EO3U)9|I;GwpURh5Vt%JwLOaZte4OAcqMu zy$D<}S+A%pPm?bf&N zaMthlojk;CIc2``51oK=H%6N$d!dns%g`%?;Ezs(a%Q!nK7>H+6&Jm%xv?lf=Fz8R zx%ct(5xM6E_iiWH2Y2n|OoOGXzTIj$^)7Y zVTDl9ntZ^dBZwB5pE$%@FQ*#BrER_HIV{75KLqU^VC!;{OIgUrh<$$_*U8SdiVCb^{(Q_trk+BI3ZIZ$rE?cQ_toRji(DNMZC z#I2KT!`qd3zv!uCatABrS0a@AsDXFdY!qw5Ch=<}mp&Fn%nBzPo%V|Js8%cW@8X!4fC;5xkuKY&1eq?*@ic!qR^r zaZFFy%HydWR&8_a?PXmwf_#s<;#*Et;Yl5588>*i46%zBbp!VN)J!iJ!mI|3Lbt_my5>57Q>Y_pSJ@P)wLANxQ6@4$*t1E zN?AX-#pW|nEbm|{bvK54&on0LH}i!&3md?5{8OgvE4x27?m&)HwUf=x&*rc-Ur*?9 zCI8XJ-iv!!*%krxZBp5P5qjS6iN{ci$%#34F~B|voj%fk(r=$%!=H-$DhCSZ13`K4 zfe{u~kkt*}C0@yY*x0js45e-M_9j*OudoVp`7E_;Ua#_BrB^xM`JKZ=;uj9GL zod)Ip(+*U^FEyi|?A|T}5BOsik*vmzIX682ZnD7t1v9$=Itn-T82l#HfI_JOA(s_Y z%aO6n#S2|+b_qhq?vVXqfKKSnrk$^#4BqWBgoalI)y9h$^V_qR_`m9-M+o~S*u$z% z+p$TN{F8UME6=KgzNQErc^&U(0ZMl?U?jkcF_zPjph6;*)n!CV{9kzY20@P7KHt=r zetW2=9QCfgm(9S1(0PDHJIc3pX8fbRZW&*1L;^ER8Ea&Uu_8X37GTYcQQ!-2+kH?k_B3M8osOsKgho`FS??yM-U4DFF067?F1_ z@;~&7<}WH%-yVyVdMfr;Zv{{SsKY)5u3I}Zm0V@$u2i~Z2tnyP%Je)Nza~@>)jMIn z!T;Nl%#K@+KE5~Rbf73Asjpr#y~@oB#uvVvT7@?2TZ_o}h)S-q4`>)4CP9csyT|G^ zp+&!SsZcchgkzh39m#qp>cA&F@94t4H6)i(eqrOsah%ji^0Cx=uW-b<%K#0n8I|9@ z7Cf21rj<*Ir zAK}B+h7XQ>#N!aWd9vC2o|fE6BrSlZb?@2LB$NO}zh~mFMNbDsIpQ#TaM}^X=0&w= zWA0y+3SsW&JpZ~}?aQ@FwJJBU@B(GE9rHDEOVxct;+2nEC~Fcp3f%-T2I$)BL$d%S z(dPme$^4CL_hKD@(dc3|yq-eOg8@qO2Q$;}`zcZN)9`Hp{@#=3(J!q>k!&>ADgZPz zv1E(EL;vRyI@9LTrh^up38%U-^$kw+sOSNJD$$^;2AE`rztovIDH*K;G=j+Kq{R9n zfgZEo8Ca8LGy9i4;(r#Nel^6R9 z2UMC)zrDJ#cOK@y4A62D>!+QlZ^>reg4XTg1f@fmywY414ZaU3xM6s1{EAA$tG$8H znN0!wO$0@Rt|tJh+t?{USyUn9;Pya^gpXvi4Q2AG6KL^MBpc?x0?=9$>!+P4jfPtw zZJKB=xlz-FI>6BXVcD;tcn^??U1)#vB%z0)5`9n<2}G%e^#0b3{r*E;gU~}%0;i3u z%La*=Bbg3maU`?Z*2XF60RNR@HILAJq(^Y?$O1Iue5is7;r@_Qbpe#$x>r^=_HBt< zTP$W&^W@Az!WZp&(C?QFxG;9X2S&2-n7M$YvKMngvwoH?DaDou zO3h99W=d%HVG&s@AZ?rV7a~-AemUE?tQB+gx4%5HfAM50WOF4Q1!LaNjeQAom7B zmmN0!4sO$xrhS0Kg&seh6H9!K(JDC6aI_1tZNmf=Jguk_NvU8nu%0^q0sY`}t)(9<-#ULvMh{7Vj?zYL-17gEoV zk&OQf@k`=0ga)aDT#}xN`X2c2EW~Dr%}9_-RT}hxI!vjg`Y6<=xBRywS(bmM;5RUQ zH-(xP;gbOR<->1l;MRt(5`N8|ryD?G&&j6XLh&VW^U!Dsp+@LIy3u_@QG^-K8o66DUC^xwM2COdGy$%ihnV@MIIy;g$w(h&)EvSpSSE5GsGn(SI<>Mzk61}B~iIunNEQA=Ryug z=lDlWge7Dn8K+iZ?}A#zA?b?F`KcbkFTg2?V}Q7dECVz%GT&E&Yc6MUHY4%?(G$H% zO>BvBl~x4ampD~vrWr7~W7kLM44JhRR7_!46j}(a^PkZ}%75ki1a~5x{1A1WWDc1T z@X{LGjoY@cAM@2&LEbtTpi1sq@Tp+3BY)9ep{lTu@q3krRNna@GRaj=r7BqlrZ85Z z@8p*(LM??orcg^n^ZXYbbe{i8`+i;Gd95aBOMAz#x5O##&tjBXWcVEdW0beWmRLfC zQF=`|s(UkynWQ&)-dsZ@h&4Qts@R1DSgHZ|!3HDf zjgWi#lA;}fJM_z^Pu3^DiYi09RT5NhtSKVs8vYBBEbg*)?8n3{h@Kkqy5R&7y9Jhe zz$^X<^StH-1JoX=P-3Sb0`eznik(BXJ2C>&fEc`PVRj|)z9;2gL&1eq1y@L~TIM2t zk0o27)fV8s1X27C>>c|ts!8xAy7{i&6Jm2(=~rI0^j9AF>ev8gx;RmI#HwBoqZsOl#P1r{)%88DHcnX1%DMS%yr zoLZL52Oc1LJ-Ehyc+|a@|Jni|?P8?}%{2+4@%@DoJBC%nBoe2K*vn6eKe8GvRTWX$ zTWM`ueAd$*qN6cGdQC%cQ^Ak=!_#VA5C#*d3M!UYT7!KD|6!jtvtxL^$?*+Cxdjq> zcu#x<7F8Z-n$VAywvMAxhAOOIlZ8o z1Tx~fl>gS<+a96GS%Q)Mm~Y3Y@(Nn)6N$Y5P&qVHo>x~DC}zncAF>@C3k#8WR>5?03G>`K~BmVr?A%2{wS>UB23+!)Q*iTCF<-ht8#1UHsz+U9707;&suiA-~;&K1e3)6~2_*Rk0JH z$i3#+al5piV2Zn0gMFDEfLhg35b)%H0W_4V#M1+T6Q5lV9Z-o2Qz6sKG%SlTrJ3l|U-sPe5{7+T>`);APA&fQxsEgITAJZ8I zE*~rx7Cg!Q5k8gYRT;VPW4Ir!$L^sv)^^z&yNSjCTj-fkP;zif|2upK3m%`Gh|-_0 z#*m}=7yjO&hXAM$u*CcqQmuvWPAkt#c|+tLie0#34K|WUTsiQyTTqSx{9Uamdd8=2 z<@(2(KN>GJhpIwG5K2#9Mr5Y+pYG-%`!pT}9AW#&tT%(uvSxi!Xv>O~ zZe#2T@gVJ)4hKr_o4Yl#0eKuxRI6@eOJd4nKFK1QJx#6 z^=bI$sn-_&=%Gt2gYtdYV_hflroI}hcCmgcwwnPWc=t&2nt78%oZv&gXbmp3AQ~)s z<$-(gX)E=uq%m3$iIz-v|Act+DdK@`K~QMdNGhF#f?j}1goM}YHN~w3Z^)}NWCKqg z)qO}~U&jKz2KW~})R&>!SSF&82c--m>B9Y7Y}W(UPwM6!B02!tP*?Pl_?%C$sMNC6 z7lfp$ko5=Gi9#7PU5UY%7wX4X$-I^#fV#>Ucljb|^pMgarjMLx@KXv$EX8M>sq; z9@DyL@y|&_%|#n*h7eDMe5nif^Is$J055s>)ct}!bSgjZ)cx2!__S^1^j4?+d4N*E zxSTRwaP9|XKE0MHc8si>41n0qS`dODr9({lzb=vH5fkZ1R6y{Fsn$nq0fzs?0;(y* zG#PCAHV5xBl$!)ip1)^U$-5{&O@(*v`5$yXb`Mfj95Sb)TA{Gcrl5Rw>15V(0Q8Bz z0MN%}Zoqyh{KPJ(=74zBtIre99b*=vP4D$xLILZ1!Z<<8l>mYb%#~ z#ZVAIw8zK!L=mNQ^;4Gz`@}z`S{+G&25Bn;&1}fna26E=oJDjuIqn^Ji$6+!C9fx} z*Z)z=HMlc66KT|?4m+*Y=Ro#8@C!^f&Q%(rz$&=UDp*Qr#uOdSGMkxuEY+fa<2*&v zMROdBx>(VMjJZf}xXE$CoPcpA}tzZJXA+v@q96~hOk4c&w zzXzdCzj&qRfzHqAg5bpg(S$7@b)_nG5?L-1i0_9Y$?HOaCPDY~p%vq1*@ctGsg~~! zy*VxZ65QvZhp&jPl=wS+nH3|nqsj3tBXoC;Lima{m` z#VthCtUTU>C}ER2Dn}@|t>Ju;6(`ezw9vuDfU7LvPy&6$Tk66^Ol)@i_=Zw4F5w7# z+D~2qK)S~9UyR!SZv_?En8hFOK@rh;y>6M7j*5UwAFtzHz8;Zu3;(c|-}bh<%j41- z@}{|cf{s9yLvY#U#u&YXzVFT7GOmd;>9mT#=Vdl9*o7nV)a8J4&Vq{6Q~xv_-1+4D zJaFUT!UB~5Dg{`{D`=a&5LTC)v8}A{^b?Q14?6m0T2(mf+>m(;T6hYg%V0!B>2s$$ zXW&T}k6e|&K?qyNFO|qBeaS0}#%tS^A}XzhTOfKh@H1UF7tJnoa_&qYN`{{vc@m1A z&kJsEl!vpQd_&Tcp2xdlY9;{rpEG~){iw|QV8l8{gX_WpHn*QoyiIgrKXJ+Q3ENj& z)+5t}Tcd*Yok3@PooIHxUW-ulwZ9D`|AE$ubK`ab&3)00QQsLBy&*4T$li`GnSG6I znPSiT!6s(=d1(-nf$7%7^}w}VIB7p%Kb5X^;#CaZjF*X@;GZH3o8!+55juTOSj0hx z9J6*jFiSDX@Xrd8G2{2-R~P_)d%;kc>5Edz|aO5t?wWm3v{QOiLz0(a7bE zkSjs>q-GAG7u;OxozByHhvzk6F*h<|8nt68)n@-J{T5IPYjOVfo_eaepW80xytD~t zKx9QTa=&N>pp(2gk{A2i2vx$j-r*L(msQ;>q*>m;+Gf4m$4|}U$hpw|3p8_$#hZhe zrgT&6qW5qGpeaIMeUD_s0L7c=c&_Z+-B;+Bzb`CC#XGJ^b4?w~(9&_=YwO9(JNNF0piEtRCC$&Z zN!}(*OQlhk{Z-LR>w8(1i_6$?x2~}%D+gM@Vstjg1qZXC96+sSzBY(a^CxN$oQ9}R z$vOMsM-;;o!Ha%#U8AUP72x~ec=PdUUM1O=R6c!EONZU3ZT{6#35zA!pOn1!*F;fS zbHk4N5jrb;dYmed#?$vc6`ToT6Tf5hW)LgT!)^GdG{)X*yv;T{cQ3FdFMgtUGP3E5 zUj|1Y4bUt?5&T_K&$FDHGih5-R6Hknda3up%V0uGZ4*O|moi|-NMqC6;+#1ckftuQ zBi2}eN)WU1&)U`5C#2R;0oVq?iN1r+di)QlcY0&-L%(Ic@k7>bNkR0z2&Gq%HmXUB z2wl1n>JJj?v@MQ`CHH(n@ZzO&X`-iS?RX#@cp`fL%O}!%!00i5CL3za3pyFvW*fwc zQtC_}x_XGq*&2X8fnt2>$ilXZqEYX!&ihP|8bYX?$(Z@6`$?V($EWTMLiN;r@=3#D z92GN8XHZO`&X%uBi4dfAEDzETM;b>(_h3{ay}QrTx5!Nl0EvUx{diJ;c$r_Z-5BWP0(f4>Ai=fKom|A%pdfcAzlO$K&Qws%mcF;qU{c|BIjyRo| z3ZH9_?AQlkC8AA?&qSK>a2aVKxKWus0I3O32r*0rF#%}oA_frJ?hm|~VR@6)XGHx~ zzRJp+yU?DL{!2^rAnzSQ^{soUI6Of6?~BhwMaQ>^inDg1B>2H($hVheG4zMNza$d! zBEr?+TKWS`Of%I&fan~-zsbLkVL&nLnAW@cH-cCepm#L6=Pk|8<2azbgoLtYs<`>1 zmJN^woDLzh0MIBZ&cTJA#Y>&sDhRTUbmg6biva508~1BMAhlORH+{|ED*-R);26#a zv21@pc)hYeFq==cbFx9cwI7x0wejY;+1rw6=wqTu9~k>{ANHB?OxmWC6YoZom^&sQ zA(sJY0wDv^k#Jy!zqcoL6QN$}z!576{Y1?@oD5>2{3mJC@jZZ+>_Jx?#^`t@;}rcx9H!(ZFQFqtV{XDF(D`ll zqt^v7+vMKXY=a;T@|PU82>W+BQ3;_eWTZp%aBiQXSofS@^dvwdpQe)0u?j35WjnSt z@v)X8I_R~W0I1}0NyV*m-DarqIdk|O_a0=LcY>Jja{Kx#b!y(Dj(3KOvMGx`gc|XB z+crWER9?wpH=$AAY!^E(b*!@`Vz!+`1P}}8p6HA{hM(A*pyC$Bc zB%C$+$+33;^gt+rv_aRrbgyGqG&LJEVgE7cpJgB3$jG#SdN;9q$<^#ww0^9mpQL?l zeJ=t7|d+}xI2HrM1n-FMSNxw*Xg`rP99i<^0Qy#~@q?1|v5 z20#G1obb<;ut*ra0-;M}$GLDIO5cV84e+a*>1rbMZyurjt7!!>(^4!4G4Y(z<^ISI z$`xis;%$JM@KTWu1C*hup0+NkA(DGMwWZ;v-owltsx5>?pbWbsf zacsWd@cn_1BP9I++17i{g;H4;EusXYo#`2X7U{FxbFLu~&*E2NrmZCqePNO1H(XaI zXwdt1vLIZjNjB0+aE~TuP7Gqb6>lOvt<_`xH;*1uZ>BdFC8vs3E1WR@m zOD=k$>=S?%5V~Xp@8#W|x#*iw_6y{(AJ2_$bhJf~k{ht&Y@qq7ZK*^Eg#?$Wd+w-G z6DbV_vBud8><^^9+XSZDiNQ=1JQ0kJ6_~fz8wiEeHI!z~_~ydOAd|R>h)QAc zErdoZsewp@Vy&&_M@Ud}9-$Q&wU!ho4^8ir31TG@)E}_0_wz;|#Sb6e5`9+oSr`#h z8lMcUvfMX6dHjla5&A9XoFFFS8**Xsyp)nKJQxmYYvI)#g3^tN^4$G_xXyLkN4&~s z?c=tF;KTn6>Zro@h7$!bU#sjgjP?vb3vUYohJeiqzBqFR`wf8R5LyU}sLZbZKp(w! zI52@GM(C6oN>EiF5qamH^fpa~`h!@(_Za1eIf{+p^B+D1Kj&ejaO8TIC#wEbh&=KX3ERF|B(<8a{GxQL1dmJr2K zvkKEj%CGeYOk?JUzSkrNr2;&s+s)08BmPez6A?g^mj< zW5-P?C4ol2HL%!0jEdf) z$$jE5i=_cr`7~g3{3Cvt*}I0-2%f&~;f}<}%s6|E_4!;_JoR0MvSUNBkc2iDgW|B3 zJbN!uF=Piha&yh})SB8P$iy)WVvwc}om^)` zRqhYu06NweCjO)F;-3K3Fq&F0LL>4Qn#upcO))R{$PVarr{>H&{}S-|^h3`UOTIfS z_LP+w?!}H_JRGRS#M+K*xWkaGn^OQSD3`fjgzHm2A_i!78>ZNKSb7s@Qnk*2NHnQ@ zS}<}SS(ZaEO*~m=YG-bgU%@v&ByWQ_Z=1Kyut-YPJ*+xHr;xB1f}pW95)K|YS$PwV zA=T+30swUVm87@ptc~q#5UU{+>M2$l!OCuQVpYpQR>yT>zG!C#M(HBZb?#;TiY-6G zoMON&fYRRCjDLtL+7RbKK#VX@~71HMfK^gI}{$uf%Mw0498U}+_bQDGr*dR;C; zt3wL9ztYl8K?8 zkqYfDmbu32BGWKf`@>@M2)Ta%o_>{xP)1SF+NkQy)2NIgfaYN|t-+K>u@Ay~6`-5# zPVOZaszMkEzYn3x%{^By7Fq(70SaZlX~HAx@Ng~g7+ zDUkAVYJF{MD@tpkoJIN00HzK@j>%-ztG&kRnqbRrtVdbVWD^aqBT-0iQRwCp{Or0U4RXrT}IYY$#dla{=%9sS4U{3q!?oBPUT zZoTEnGQTSD)?A9BV@y>1Vcbe71civVz26C*nhp_NO z0Wo`P=$x4)EDR!tqt>(FGOeTHQw@^Ps%I9-$kcqq^`lr;fX&-j@)8!;W>|bYieWKJ zangyR?0BZ(AnK}YoC&oF0KpSy+`kM$Qw=aYANAzH%jvVub!t|0|5A(VNtKNrnm*la zhOkBh%L@kl3yUlwUsQ#>dewKD1b8As>%o}ar+f8QKU$QX*iKDnTua-64q%eEQCM8L zRH4kd92UW6|J}j;L8^}90dcYxQN-5P$b@7?$D|Wt=>RAdwi!ECAX@lYrRt<~LsOaS z9Ey6!&uY;%wE8~k zcihO>4=ldeS%BK%YoMZLrMKv#|LpfzK|Q&yJl#ie;`Nvq zYth$hP2VL^6KCMrdNiBRPn(g{a1RL0i-*)R;yNRG5)Ted?>f?uj&k^k+q%MHogh(kQd%aXKot&BbL&Sa zipnWK{fj8j7~k9pP_C3B??Zww2C@3=s>yxmVejn^U~C_7ooW@6$j2dRamzquWdE{- zQZc}LfU@*Eo^}$v&K-|D0vQzw{^0nd6&4rr$vsLf5OkpuJ|!R|6*{?6DzBq3)5z5+ z)_7To0>ne;XYH0j-yG5h@;)A+$=r~nZ+IJ1c23jewpA(@0fqgY!Pp)aLGUCf9Sd2h zKAWbg@M0J$fo}4x&a3h1#XihlVe(1h;)H;ig|iGk$HHQX;9eOy2vbAQmGOuM5dc8TAK3_qNd==xt!No8KW{a;drP~zd|bXF@Vo#_9AJ*@iZ_QZbD=6M#(?pm%N+?b zPUj7RHe-2-mn+2ti>6je?YHy10`eY0Puk&{A4#TlAoR!|Y4QfoHLgLL8qS;Ux~oxX za`$!J3X1@7NlrfGudi`-AbyU&xVh*x+(hsJFm8GZi*Z8ut_w8*f&7sBwfs-`Bt<1t zm%sT?wu}nE-e`7C>qVPkOgnz}f7~V#0V~fkc&=-+a{CIAvIm3~`U9N}tTH*@)s zORWb!E2~eAn#EbUxqHpLTJR2_0+^@JO&bqgQL(rVFd$k%4h%K^Rkxv2u`LQXJVbHI zZrA)EImPa0Do)+=Ka^z&`ltHjeXKfH z9NGiM--36gCri7^QdZEvdt<6}?gy^wBGBWE5*NLPE_sGHb9-lDh)Z-6aDkrF+0~EL z$zjAdyTAYGut{h=_HA-DKYP-D=$KGVSHT~rprMSp|DI>;)#rIZ8 zR!sTB_3P1uuAL251OIoYTUXs4@ck=8k+=V&LZH(}a8E$}_Dz<1hC0}E-IOb((D-xN zGlVB9u2cM&6Kf6I`?+2r7XvtcNHlQ~znFqt- z_l_x}kYB73+J}L(tx3Bj3=X>PyYOt9?D z@!oR-|3=p+d5lTAGhe6?QpoSt2yk12yXVshUb8RJTX}H9{~toXXOumL)yV$^LNPa? zlHGk5aH6eI0cc(xSG*kfZYU2<1+R?4pBnr%$Mk_=E?KulNWKJ=N}FEH=2X>!5(Ad`zAal^FgirV$mNM)Wc_K zNWX122o>Ro3;l=C8;8;dYlMzgWDpv%uD_{~nG997neZUVR70qb@&BUyjRORt?pd2P zQb=^x_it+i#8AT%-~5{QJm)MHU1<3Mr+?$!K^}wkpR$cMjnG+CPBaHrQjx*$J-+t&zxO{Bez_)@g##AQe;Ai#YzIJbrqR$H1RZA0Nrc zXk`7*XoOv9EEAN-?8Wgf#@{&1W=qaxC}$cp@^^!LG=RSgN?|%1)BTT#h>Si2wt*CkAz8@!zlF=LfnAf~DP0(i*{FKk~BE|LO40f~5$RuS8X3`TO$t z1!Gx?3L%XcKl+FFJKfNa&|87{n{>3<{&{)){4gFPs}O_HZT{On1LUIiiaapdZ~qN> z{P>7GMy!z#?L{G5^L4iW@8Mo(%02QO%Y!kxZU3VDy#scw53LcSkad^6!2NF?8j<1d z&dfeTAIn4Tr2pgc`1t`#!DTGTPs@tG%r&+&cFhHSK9@q{2yW;o-V+^6(uBTuBq*kg3{qKq67mR+5?7Lj*Acsf( z;xT&^$Gm~=*Z+sb@$-WKI(vjdRU^Ci7+xoTL@ARVNBI+PD5XhgUK~HYj=wh?LZ`@O z)HJdfjlBNP%h&+QRSj^bW_b@ozuc0DV~+s(di{gw1!GFafJTf${_l^FsE0rGJM?(6 z8-hIe+oV(+%ij{mFBtNI$1`#n?pi|7X;&7YxNrZ3|4(wT|96$R4(|l+)#2EMZW~OT z^QvhZ5~UA3`(+`=1cUj}E>k zK0L#UV~#YkmNlXk!g<(Fuj#6R5=m3i5pn!O=!HXEMy!&$Mw0P2G~(r8V~dDm`j3g@ zcML-1WD`=-$l9-wv(JqGrlG5)EJ6pw@eiPv4DUMM*T^3LXn3DJH-b1a@6i8Aas2!+ zE+eOsPK{t)_0x;FU>xapWT_$RnTEvidtb`<{~D2p@KL>6BS7Bb%p>f-Z*Uw5rt0D8 z#M2GXzaoy`FyvVbR)Q+(`!oV{0{!;)*S=*;5=H1C<%b9Z@ZzdC#Al)D+Q|NqwSVL7 z!7hW<63X~qjR2i@{^@00Go~l{$d|H;pxK1PDkg0JhB-%1M^Qx<5vtIc#2B!k5;v@lxk$- zfB2JJ-!%?tAUyFQdPXSAqa=-uu4w*g&j0LyPkJR-RDyqoD#>bOS@?SUpXU3f;cE7Y zo>!a}zatdhJ~8)!qcpaUdH(pT;`jvvTu7S;pVKn2s6nYjX#^F5*E0WAm2gV#S{Uwy zZ@)||@!gjPsWja8@qbhrzhO8J${yo&sKh@|L*09$5m5+U;_ydR!jIG9^R%yZ(ho|3 zHd`eP6v!VH$8Q+&qP0=UM9**^g{;Eo_FvG5V33f?Z`1lm$$_6k0S!+I^FPP(A0M!K zmw_6YXorbAdcZ0Z_s0Ck#|zGJm&cyN^copT!zcMT-Ahi zJpTo0nZ_FVS-x)?7N0B)@WKcqmWLZZ!SJ6S5UT{?i6@-mzX?_&f6`~D-8CnaAdLi} zi5uPiHJff3Zs%PxQ7q^AgQd*AT@2BWKdKUx2T23U(vX)@c>HUI-ZdzKlS<%o1%4f| z@ORRME{O_OJ>tT)2NFtjjS@)e9!t~19rfXr0Xs~kp948xV(kh=_U)!l~ z(W-e8C>h@uVKR_IoG|IXL##HL*s5&$-K1n{5e&IbwaCQHL(%2!bKIGYk+G^RP@RhX z%B{}&H7c)01uv{LwpVs#L5+5&NX{>?sZt28{F|GZX!_jPrhU-pWKhd0pJ}@dBBukuygTiG)xkSNdCx| zIAG8Km>XTCC)H1P2ak^kQe0{@0?U{Q8S5{@nq`aa_z>Nm@;zbC^ZkL_faD>9f<+iH zf$mEqeX{-!iAv#y-b&I&Uhm-vjRM_j9h$Rm_#k{Mt`ZH<7Xs{6o(s5WcbNial~x=~ z68k=XJq2)@EpWuwKwfpBYg+vGo=3f47K$YE((US|aY}k#iNKXc*2%~2%!=3Jp2j)_ zA<5jhW)fifEj0QfJ*>b@qW#HoUg-XZUI$^}vwV7Q zJ~qJ_52JeB46nYgOh`o?Ml=6#-A5-ep)Io zcdJz%1*#&XRRTDcQGhX*JK`BWfh#DXxl{L_DbuoYS$DhN0QUok96H*PD31pFE^0Ncx@7}V|pEA=yumaS^k94?`4MLpaz?(ZQ zh05*m>R$tpXrO@ z_P;xN3{g%zhSCVOAuC)6{Veva7;xKF?@=7K)zE$j)(QD#Z{Xu?*UI`FZ>P=U`y;Ez zl$`kU(ljG#uT{lRZwyKCD&?{%n@f;bv9RDvs|F{uWJld54^?3d#vY#GRS(gTHXr$T z3yw?KzDj#p1cXi25~UO+A0vJpG|Qo6&1x>&Og>|XBhF|Jhr~DG%lFU?d~Ueg z^L!IghwBU|%Ajy>-qxi!g@Fa36>?I&d0HgFic=R830hT!+Nd%k9r}Fv8qgG%)LYLJ z@#gGlzQ@RvFP(z8xlT1#G&E~H-ZT{W=?QS-KjdWmL$c1jaFwHr%~^ftd+#zSX5&?G zHdC(sa;RZ{+VDhGj0oBy(@V&Aw$tQ9?Mi6?@8czxu^A!L+h=4q+C}xH}D3~s(>i#j$i1iYaE*k$@RKwATHH}H< zj$aei5H@0^qA$|_QgtthWa9NfxBj1UWDvUdare3?CXYTy^$-n;WUAY8+g20f`Nhx3 znp<+)W)UU$#d&4fiQKl2h#&aHZ%MHe$%s3|U=Bgb+>dQjLG=1JwImOk(krU@gMFDx znjE)>izkSTF;8#=MVlX|(Ze|B38qup#iIhzZ?mr0!|b>70}D^5S^<#c3 zNq-#5gF%Pr*9toL6?LP&5|R-B%XmmT%;g*ciI5`14%U~256E9QyEO_~Z4 zTtt5lZ4V2=&(TP_*-+o_a8-`ne`zl=hPLy~?HT+WMq!3dngr#8{0mc;b2qI` ze3|3oydO|UP>Ek;La+QF@y%rwIl~}pQ|%q#f1VwL<3hZqV?a;7v^d$TFF%C}Xi3JYTQl`?2hZLMgo1#e-8>e89X2J(%+5Okkw^?jeNqTFT4M z99#}*Z-Cxs2~+FknN)m9x=~qDdACTg;Xs|!F7=FV9TfLtU3EFTWEwK{Ypnmk&u)gG z1Tr6-6Fz*9r~=jpw}s)0MT?Nbsb2&RLM1X}{pjIevP<-pXXpPJ6sz!~ADbx>B4+77 z<=RO5E;VZWAM=2c`Q2Dyhudc-7pTz&DRk`MC)0IWj(uRY+rEl2^oR6}(3eJ5$F?DM zuhB;O2Xib+4D=ji9zouXsSFxl_0V+)+_!4seqt@lcBddL zWnL>AK@q8S|K3d1@YcNdQ`CtEMl2d8J>Sq(t`73r>cbWvKL=6>P1+Uh18U`$F z#_}1l^g_@c4uRpM>}!XT01BXTe{?>x;B|xid&XEG_{I#bIMqpHu5=9bHm;Fg8Z1#WW>fRpJ87I4m<`8kn|^ItzTelF-0j7CHi&AHh2B# z4pONYxVwW#ZXMQVw0Kkhrgn{!SprQR32spW@%fjgd#73;#u6~GwA-2>j5x1^Kl(h_ zad-deRD5%wFSALU7omyw*zJ=}DNA~nRpjUq<_-4T-Cw9_RryX@ckn=H;VPQv z_!hZJDnf!8ngVTP+=S2_KRUk@+da<;4{zGC7S)NbJ3@8xSoInG!79GA=y{IF$PnkX ztIOx#RZ2fRQJ|-|dSC~6bNwS@h|o8FrWU}e$7+2g0Ur;EE$e>f~9XN*f_0bwO=J&e_7{(<+tiVo?DL9$(J*bN+6G1s{qy%c|6Lzg@+Vv>02FG$VmIFmP zGgZh44XhTM*YB&#Bk6U0ntF+T6YExvL-lbI&VwzUo4KyYmvtZ!WzW2l*>#Rd<&EvV bdjQ&_Ho2VS%~<7p;Q$9)SDSV#|3Ci=y2ZU> diff --git a/public/images/pokemon/exp/back/704.json b/public/images/pokemon/exp/back/704.json index cfee176924b..ff94c52a2a8 100644 --- a/public/images/pokemon/exp/back/704.json +++ b/public/images/pokemon/exp/back/704.json @@ -1,1742 +1,101 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 72 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 24, - "w": 41, - "h": 48 - }, - "frame": { - "x": 0, - "y": 72, - "w": 41, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 25, - "w": 41, - "h": 47 - }, - "frame": { - "x": 66, - "y": 0, - "w": 41, - "h": 47 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 25, - "w": 41, - "h": 47 - }, - "frame": { - "x": 66, - "y": 0, - "w": 41, - "h": 47 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 25, - "w": 40, - "h": 47 - }, - "frame": { - "x": 0, - "y": 120, - "w": 40, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 25, - "w": 40, - "h": 47 - }, - "frame": { - "x": 0, - "y": 120, - "w": 40, - "h": 47 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 39, - "h": 46 - }, - "frame": { - "x": 107, - "y": 0, - "w": 39, - "h": 46 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 39, - "h": 46 - }, - "frame": { - "x": 0, - "y": 167, - "w": 39, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 38, - "h": 46 - }, - "frame": { - "x": 189, - "y": 42, - "w": 38, - "h": 46 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 38, - "h": 46 - }, - "frame": { - "x": 189, - "y": 42, - "w": 38, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 116, - "y": 92, - "w": 38, - "h": 45 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 154, - "y": 89, - "w": 38, - "h": 45 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 130, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 116, - "y": 137, - "w": 38, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 78, - "y": 138, - "w": 38, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1af9bc6c970e4ca611c23ce1e26ff660:ab013a92210cb1b0ae94301a2c9b4c2a:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 0, "w": 27, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 27, "h": 31 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 32, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 27, "h": 30 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "I8", + "size": { "w": 79, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/704.png b/public/images/pokemon/exp/back/704.png index e08171177fd5e842a6b56217d5e54fa74b06f7c1..a67b79b0ee973e0cef19c01c2ede2a1579d346f3 100644 GIT binary patch literal 620 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 IM6N<$f>mn=TL1t6 literal 1474 zcmV;z1wHzSP)RO&00001bW%=J06^y0W&i*M zOi4sRRA}DKndzFVDiB4bB$(j)zwZ^t0&3Wre0?rIdR)DWLSnGjF#NAZTF1A@T{O+> zNKcUfqqL3f>%4(8fQVrMNZY`?{c=TV`?ATDk(s2rB5IT^C=FX&Ln??^S45?S3E?1D zW}hedh*(xe2YF#~D0t5EkJ1%73^R(HUX0Ou&T8O7BsKJ$gG*yOFd(>S;@GgoMQ=;6Km-Gekn%`B&$cq z_xtUZEzqd!fG$g|+oCU^>e$djh`04IA z2Z$&J&Fz^&FH6+1!V%tw+8i}Xonp@d5V2#4TeZFzsc>2NUxQ3h6_lZ*evS*8b~tvJ zL~)EVmekHMr+Lo%%CxXTePaC#zZbTW+BxPuS_ouo(omn+-IbgqKF9S{o%h%-kKO2c zEcT3<)Wc<>d28P)%dmOkg`p&&?D28UiwO29BewT`GpS$Y^H0{i7`1j87AMw@nq;<{ z4tAkGvB9&1>`np6wP+&>Zxv{ZnwgC(&s};QeQPPBxkXW;}zZy)@oe3nx>vA zNm9GZ9ElPGr-|nsu`O1pDV{agpOl|TNp0Fb$EiZg=(rQxK1~%C%0^g;euRE~*(CS8 zldkH<%zkqrCl;2=_nFFdX^{|wvmG|cc&tf7gup|~cO4)fDWOT0$@P>R$x3TQ8%)hC zlbf(Uj;@0R=!+u;T`TKF!UI{HpBB8kIR8?L{k>{S+X3yTqD_-yy~aw9vtZS>pJ|!K z`dYLBs*M}3jUY{U0ou;-XjDBOU;m&T=q!$kHcdS_9<6AkO=HcT@VX(|0M&MAtcRkF z23)mC@H5foxtQ9ckt^Cvx{>-#NuI-6w z^B$N0jrPQ}c?0lczcg)-AN#dwgEShb&~VcRX*5X35r*L!4KZzv;4@7dq|pXQ$6@;H z4vfr)89raNZ3e)VZMtfUz2QSt zn_OsNMfr|uQ!N^oce-ke!rTzmrdYH_ z-jSx-q##JOsTM6NS65SQmpwD3oo&%tR90<+X!sD-)>|||wnbC5al<>-be{bN%>kRntv;Y7A07*qoM6N<$g4kWn8UO$Q diff --git a/public/images/pokemon/exp/back/707.json b/public/images/pokemon/exp/back/707.json deleted file mode 100644 index b8db4ac17f3..00000000000 --- a/public/images/pokemon/exp/back/707.json +++ /dev/null @@ -1,2078 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 286, - "h": 286 - }, - "scale": 1, - "frames": [ - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 115, - "y": 142, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:923b4bcae7da04f16b46037df8433fd0:1631bc30b61a1b4a910dd4510c8733ca:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/back/707.png b/public/images/pokemon/exp/back/707.png deleted file mode 100644 index 6ce681a5651b300d8bfb0f13a806f838bdf798a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6398 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 literal 2189 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 aF5lPx#Ay7T2Q%*=)V|E4_Zg0%nu01I?d zPE!E?|NsC0|NsC0|9y6S)c^ni;z>k7R9J<*mfLcKAP_`d1XlR}4-N<@7rO_k)Xs~T zGjqmhRnpsbmew1t3buU^DDM$!pmJ3o292*n?U+YC-}?}n^F0U`d~VX``xdI*pMzHLg&J*NZ3%g za}~J}CIo$)yO_%*5qYR7iL9Z28%iGvlQpz9^tJJ9Z9^i$L`L?TI&zD*mJtyJk~gNS zw_i($fXs!et0jaYYmA9UV|pJX6q#7orpw)836W8$tA!Gd_TBV#*uhs5iuU6;dU70l zS~bj^VB5w=C@AWHFs=eVxa#wyi@keh&qBEBeiNTi#TSl`y1a<2%8pYI@6O79lEzJY z>0_&ILtA(gTNSGgTh$qEVyiY9yuc>1YGc8RMm$_FD0Q1=h4cY&#^Vo|lb80RFr#^4 zcsDq%1z$pG6;1WG5XZH4m7e-6lcB5&d04j+%7|_yl+j=IeJI1V6v{+hQ*tQ#nQtwW z{mi!($|T?0P$u|ZhcfD02xY{#6v~M2{7>~Zlu5o)v!QI(SCWI}NsbFqC?iRZ`Cup` zNsjqoQX)z2m9C_}>jy)Uqpxom$}=R%iN5EdIYTd882SUk=}U&XXh2{90000-1Ap3?|>Oon7@J#s%Xz+_0awtsYZuXRPz7SD!Af37>y zEl%qVvk~$nedhJ*^k={@vR_oZCL_lX($?DW*4n3$X9(FaT3;{umT2VJ5Z&{=<$5wa zgXlPHJE!g#D~8Z7$MVl(_j4Ql zTfEjI=^V+D6#F&zKLma)pClh7pQCit1J=+%z`*lQI$EV{O+K(YXE*B}Lftvp&27no zNSrmckqAmwXp|k2&t{cF)~p;7ge>u~ij92Z@x#i6OCJk zEHtA2Wz!NFLH~lZ1cUmQPfK(}(7zxpryk6+e^HU5*5mt8SfsFj|2i$-dFP#X{>}UV XA!AB$k@luz00000NkvXXu0mjfPoFD< diff --git a/public/images/pokemon/exp/back/shiny/705.json b/public/images/pokemon/exp/back/shiny/705.json index ab139c247f5..2fc8cb18e99 100644 --- a/public/images/pokemon/exp/back/shiny/705.json +++ b/public/images/pokemon/exp/back/shiny/705.json @@ -1,230 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 118, - "h": 118 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 37, - "y": 59, - "w": 35, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 74, - "y": 0, - "w": 42, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:82a03fa5424412ce647108fd8dac55a8:b9edd38338e7033be81034e75b8ae8a8:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 181, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 0, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 40, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 40, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 118, "y": 61, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 62, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 40, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 77, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 120, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 123, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 38, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 77, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 197, "y": 60, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 116, "y": 183, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 185, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "I8", + "size": { "w": 243, "h": 355 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/705.png b/public/images/pokemon/exp/back/shiny/705.png index 65c9933f415208baa289d6f238c62d117d4663fc..4ee803dd570660f6e431ec85001826852243af26 100644 GIT binary patch literal 7798 zcmV-+9*NPx#Ay7`6pHRCt`#o#~dNx(cr6U_y^KQFt4?a#(_=SaH# z`SU78MSU&JwC+8T|D(yfY*3k%G|?Fw(`93H4!+T-cVm_N$@OQdy~<`$I+TvDb=@rP*r6-fd*@h+2dj?$jLSe%04}Me!%ne)3)m$Gkg^9%;O zKP=le8lm-T0cw!jGn3BZ-P0~R6eKF!y7g^wV1ohiv$9V2^K~wry&viKSluRORMVlk zFx}6;pKpuP+4~qobN=}(MGOXs<}wpm`lrXpQ`U8(J)^m2Zc`P5L87@(-Dg|=CBW@r z5DCw+ciXw4yJ_y|S+^gauqPS?oohz#e9DEPD|#m#I2X)+PNZj20rA z3u^DSb3+IFCaIVq&b>W1zOyt|%Kc?R6%&~iBq$?SuEB^H)cLaOPS1j+^0>Y86;bD4y){|=4mzE(T{nm2Qg4H~_K4Bs z=E9uoMj;vf4%##a=F;r#wmoKacM60Svg#}uy?1mPR3ELta$)zPEPI2|kaJm=5+dWb zdXoP85131L>nNEw3#N%0wZwySS%=BGTXm{iG?&qy`NeK;6tb!s#boqW-E}wpqg&V8 zx%Bp~;t2L6qpG-fuINzN)+FbNI+KxgNG{|)N;=QfY44>Zy-=funB2%L&Ltgaj>WiT z-S&F-LNpiDo^Et|z4|^o@3oe_({%xJdF5xrmP_|uxiVfGYEMaeFj~DI?pIxx|03(w zn2g3q|8ux~%WmylX4Rf}kxxm6ZFP5mPQDq~-?M{LVohF)j-+*{58S5p&7HIoo@m@{hgzaiGZht9wze zb7%Dw(_Bhz1YNtrwh~IRn)Cd=-nGv4YSDEevSh|wn)1`)&EV@a_>v5c>Sk5-UUsJF zav?|AVQnxs_ikUu|N2GWfM|F_E;N}r|BYZzcyqqY9{(HUiu1uctxYe}>RsJ-Yvnqt zI6`#<)k^kcQ1|lg(@RN5+L=KnZy^5wq31mHIyITK7miDKmnvb7YwgvSOo&q4K&ga) z+jR(0$>n2EjBiL;$XInhiq+bzt}&s6s8`LP@F}A?TfLOUY$P>Wn{YBEMma=y1GB-S zym_e^Q?uE-qDE_j$;KG9=)mHfza7|#j%HV{KGE9PGCamEJme(+h6tKMYlF#nj8>GP z4Lr?(@MUxVwext4jr;SIkm$O%j%E#0u@Jj!%E(VZF!jhrHApZ`pO>6y^%h?|)k69a zsxp*I6$~06X(0#m2Yub(;r=G>s+a?ebvv=BF$!)48U0r25Gs^rwaM(1ukr^qh`Tay zce(IR!S!<90;fqYvXJ4fdTH7(attNa9x>f}+*S16;jS8Y+RMxs7YdxpU}`GSWsF8Q zC^4s-^7Z`E>O-^c%?>iTjs)CIRi(w)r@4$F*8L;fr|w^Q1xZ@_s#D}xd+$v}WI}0{ zt(VzIZkP0+gOOosl0;};7G3YvA4_@+5|fE;b@21d6Ec{sRNg&VZ|S}FKaq9u+rkWsewhn$wNmo(}f)M2t4RP6POpQ_usWqu^Vym!8#2Nn$($ffqtIscMST|Xv9 z7sOq?C{Y=@E4gKx5X#x&FLCdK3?W2O848G6#X*_H(JF|$KAZE89w6Sa9d36%u&AVr z_5_!y^eiaj;GhAq@|>;R8xcc2=Nq`ILC@ZhnGh>V#r9>iLAqyg*PF5p0zYlSw?hmA zIfJ;XM$g`YY%PeD8#Mk20Gz+9b#V_571GP)}!_}N<4p<;O8Oo*BOaQ{S*3ncA?m-zu_}a;oZ;O7s zM#Q2cCJ|l|n~9IX1c&7jsnI}F_v*B;DY#=V2B zgUDzne%-M!e<@k@a95X}g=J(@z6Mia{<4^bthT2EOc@N>cAcn1h!Vaif7u0Td&h9s zIApt-KqpH0!u+LXRWwU`C+TI}na-6ty8;uwS`N=z0CwyDZ1AlqnJ9Td0si3Ug#iS(ZMQCb}rb+nfjNzE|brW^) zesHX7!L>B!Pf)S66Hk(qQI&YdTD)YRwc&jg2~iPuRjo0|R`O~Br%K04Nt?XnTgw^6 zU3Y5w)#0v0cSE*q^R&Ln1F|R;J4##5$0N6D&fNR!09jq{9_|{I9sUeLlv1%O0B!S^ zhSeTW4dbqz?6uBf1@8iLU1Sdq>@_9En%E37pqvO_v zT`v`e_#W#55$&u|+!bSYQN$M~NwJm%z_UBvA0|Y@B&pi89m(bnRC(6>sC&?wN=u?7 z+gJXR-#nKs5O%c=V2!6|EbFTOv>@XKfv>B4|Ec$`eL=x&8L})?bD7F_Cnb|Shet?y z14dAehA&IH|J2W8Rcw;IEg-0oOsX=A5Un7h*0k4yC^*T+3@`Z(-(a`%zA4@rhOEoz z_jB!*oamG`tv+D2Vz*!vT^@YDt1*-V>LJRBMd0Z z8B``v+ZwcK8_5ReT>W1;ORoXF!zXLmAP#Z?bH+%v-f+!Xv5b00uO^&>#F|$BbXVT_ zk=c?h&aE_t{^&*!@^y0tI7n>9DU9VQ?)9UEc%SN|Q}1Mfqf;x*saFOh*<|ZQ9UmN!aim?-quPVVbvCQXpl_eb;3_o01HSA!F?bH*FIEvn5f(ci>M8L&n-M z%#ylTUc`O(zzvv-fgv{`SQ;CbEDoXBlH9$X4HjbnLoU~N8-%Ry1P)7DbzshzU9Lim z*%&g0X$J92@P0vifis+RZYs+dj3F;jJ2sUi3$c;`yO^p~{Fzawt_mdCe#v{U1HED& zjTM%(k!(0Cc`fWPfJercMbKSGRexRIt&xa=cYxQNkQlL4@Clu?YeiLew*$$!^KKp) zUseCjZ-=XFTVu5&AsclSIxg~eybJi{ccV^;45jk4xs7q}3GvRY8IULlLSjuz5jAUE z7aq8MTb=m zmZdVS!_K%dda|-H{&Y}dDCxjef?OO6Kq^z?tU&L0kP27XkKV+aHcHz8lR85)ZN>eA z(A{x*w$`*7e+kcHL^w>)JB(g~=x(5CgNzu`8DC9KH6T%kgS>-?vJrM()@Emrjj;+I z7*z}H4BoUL))n#(0;+M2b+X4$qKGKNx}cevn)zAq|&dGT5`>tND0ugSc}#?VTB3Xxzv(n~H#`a!L~w&ov;jF@1Tn$@2uo*|!MaRFtqUNzHBWWOYKBB3jB)QVr`h&p5&2768=z-dq7E<_ zsJV@GV(aiS%&Qc-vHl*{Y7&S1;S?QN3pDm~S&)9nKLxNnBHuw?v;IsyGw@nCJE*t!c~H~j6&f7XNA&=& z37#2nEgLrW^Q!J%{;00Tbsaf_{{6<_Ie+_c9vu65#df{7oaxI_5K-g)v6^qmZ%1%} zV?P_qIax3#$ryYqMGr$@B&)a30h7d~-dymkJ{kbVYfc~w39KF67|wEPlxSqSWVQ<) zhR{e>bHM{9d1z|N{qo9=~;pY^^zhuMeVF(`@ z)Tz$f1zavoh7gnJVF+W!)*_}r6!CJY|lnifR0G19~^@?cnb})Wf4Wh&(dKiL- z26Jljb_@52D1*eLcNjKM7x8It3~2{@-YAHuwS^vr;GwZsO$Sj~EN28!8!e-ZBa9gX zwy;l3I;DvsYN~&jh5Rb#JM5q)Lud8rmi@cJu|p$98QK`fBZ{bX5nwgHd1wSfZC~t- zK|I2<`j}m;=C==x9;LG}m`8Y4A2AFbhWm#`3)185Fpv1GzA=D@23!Iwh~+sR$*;H0 ztiHjpa~SR%8qH;g%%keHG+dKhjT8Z2jZV_=Uu zB&KAI9)|d#L2|Y>2KHznY7#IBABOm$(HFKcutyl{8ZFy{D^cASId@|}agQn_HqGxj zbQo;71k<6uuk)FejKt9e{^Cuz1ZFDK`1ZLM%)x+Grn8;1tVdE6Lb^k(mI zzWlZ6k~X3isQFCBotk^|e#4h~lvgr{vYP`bvYg!Fn6h4S zpVx%A%1F}C48@4g0OEx5ntGTgR~i5832jX1phgfUkk{1Wj9tJaVw zlQ+PxG7QTk)U+T$dhmp;+^-7u9cwjX`TIe?5wU2g{$+^=smfCQlaWjVjlyYxe+jiDWOlGMvJLwGOEm=BFyQHpDZLbYF1J2?j z_4GQQG3Fz%pT|M&jNC!_)SM0$AYgd2 z7US@Ube+jaxK536tfqIyM9~5zI)Sr-k>7%OXAVA{Gu0&K#J8LtxT{$(|zfpz(4;j0B|9;X%q(TIUZ1w)B38 zEo{8p;2Qwx$mPL4H8{Ok9mCrrS|RS>oOx?l0Rrt10kH_p`asGX`isT{?@JjSne0{! zgzyNNcYR{=kt8`tXJ1N$dBCN91Zc))2zWzS;cxu{-k$lksIS;}5~4Nn7Y*T7PkIh9 z3JPou^g@A$@DQ0d&TwJ?S~bhAo2oGHeQz zvl#+2X(40If+xbsFVXj<+Y}>dn2LIg%!^Y{@xg~CyLc1W%EK_f&e=hdWY@spLz7*+ z2W*|wJa2z2fyT=jzLCj;&V?clY~|wI1^|{8nT;gLu9emZ;gTc-3&eVk%!4Pw3BL8# z2wf+lz}EL|!7WaGIgFioeJ;5ZM>L zCw7Pl4IiRkv+!lXNA~D==$`%m2%d%lWP`@p9o!mX)F_=)&y{1&$<*>HM4U*Hhl{0om z12NocO3h!{3WWSZw*{po@fZRPVT8X)a|i7w_0VlWY03P}G!VnBrd0f07ElNZ+!mOY z#ACSAl#aiKB$>G6MqXo#*Bkak3lEOrPE!ht5DXMa+ALfW+ZLRb)M5~Z8OEE^_Q(EX z4b_CUB|u9WF=&JR;HHfDTXjYh+m^tdXfbR(vI#eYvpRnb&rumDY+IB)5pB-gAd3N^ z)S_gbiX^Gv7q%@eXP=g|KrEch!?WgN2XkO2k~GgRlg*Jq? z*6fiCM*|@!i&pb;CUYofGOMg1LS_sWHThO{h^G9mgqk>BP8mFSxdyhyokKbES!F^D z1m!D@+s6NOo+seh>W)yWV+SP)tNMM{aDiwq=o5q<10nOmP1$Ars<_nnK)*G2 za3vgH+m^N~fjN{mAjHP{U7p3JG}z7|i<};Y4h~FN-4_7mHD8txb4bO(inV zYDzun0FgwpwyQ+vP;TR%44VQBd#jO(V+Dg~9!^V@7rcxrl~dYyNuOQRf)If*x!Brd zNIh%0$X`_{#4Zw}Hpru%f;bKnCcls>1+Nq+JVji$iEnqHtuXn8R0-uO>GHXf8KkFx z6@4vIrSO%4jfi?IR*=p?C?3EwbUB`SYRSLV6M~Gu`DlR&cg{lC#YQc`m=V$qOzg^Y zxxXe_Cc4w=fJ=rgEt`h$jPcpwF&1(&ZbdiQRqhA&+G7_hHdlt8DF_d_zU_WHEC9r-x>{Z4!5eka%x8TTYGSh=G=zfHAg>)dZT(p2djK~27XYBTvBIn?G_w)_n| z+uiYjZ2IMZM;VbuH4!I9O_G4V9W~{yg!tl&H`P zudz_3n92U&gGpZ9SGPX5n8`m%nx}j`dXHj8X3m%xcK+~Ues#7g6do#Ox-W-KMHYzCuy1Z0xK`sv*DwZ*xKlxz7{r;$KBXq}|p<;*gFOZhd;(m3kM5ql$=UC#-xyKSb zwm`fKtxZV$=zy)jn!!~1_&_}8DkNa^b9MitT|QRpLJMdiPa2#^i)oVQVu)wz{B{QM zg|byxZMaQWywuYC;Vw@#84slip>GQ+2Aw~>d~D-dq3}>~bq6T!k>Bu8_}V*hVNkP<#t6`+C9H zMkqW`{0zqvUeRG#Ph79pIZMuOa6Hk4VjDa>2Q#8K_3Wu) znDd7hifx3#3ltJ^{_xVVjV~~xcp*D}B0g*?ve3zJN^Q266rEPcUTipzAT1B&JfJjY zZH6a>L9y=qSF^r5466$d%6S;Er#n9$yZ4!vhmvL}%?l3C?pZY#of-Ld%7eTL>ZD>D z9HlYBdykJ5>xDdXS$*ffu<9@_9ouN7>BHmfTW5E2bD1k=rE)yKku!m-Ol*V7fbc4m z)Wkv|$+Rg2F8if-XiD+u*v1*&3k;7!Ns4$T&QEkgasFE$ODaoaV;h9-kiuh0Qz*&d zUrN>j$8%@iR4i+8vB&xApfW$ax`COCu=p1p?fR8#w(A#Tur4k`l0r}tiW2;0(iTf2 z>SQJ=03}IK%Wr2){H~7INO%z_>95kf=@t*~K`80}w4TWGKhOHi5C!D@NdN!<07*qo IM6N<$f+QCO{Qv*} literal 1474 zcmV;z1wHzSP)%4(8fQVrMNZY`?{c=TV`?ATDk(s2rB5IT^C=FX&Ln??^S45?S3E?1D zW}hedh*(xe2YF#~D0t5EkJ1%73^R(HUX0Ou&T8O7BsKJ$gG*yOFd(>S<$$ooMQ=;6Km-Gekn%`B&$cq z_xtUZEzqd!fG$g|+oCU^>e$djh`04IA z2Z$&J&Fz^&FH6+1!V%tw+8i}Xonp@d5V2#4TeZFzv2a=VUxQ3h6_lZ*evS(ocQ|#J zL~)EVmekHM$9c~C%CxXTeNz1lzZbTW+BxPuS_ouo(omn&-IbgqKF9S{o%h%-kKO2c zEcJ|;)Wc<>d28P)%dmOkg`p&&?D28UO9=KUBenN_GpS$Y^H0{il(cpkmL}GYnq;;c z4|btHsll^^=KcZl+1SN>Zxv{ZnwgC(&s};QeQPOBxkXW;}zZy)@oY1nx>vA zNm9GZ9ElR$x3TQ8%)hC zlbf(Uj;@0R=!+u;T`TKF!UI{HpBB8kIR8?L{k>|7+X3yTqD_-yy~c`pJ|!K z`dYLBs*M}3jUY{U0ou;-XjDBOU;m&T=q!$kHcdS_9<6AkO=HcT@VX(|0M&MAtcRkF z23)mC@H5foxtQ9ckt^Cvx{>-#NuI-6w z^B$N0jrPQ}c?0lczcg)-AN#dwgEShb&~VcRX*5X35r*L!4KZzv;4@7dq|pXQ$6@;H z4vfrOsNMfr|uQ!N^oce-jz!rTzmrdYH_ z-jSx-q##JOsTM6MS65SQmpwD3oo&%tR90<+X!sD-)>|||wk1=wal<>-bf2nf8+H?it2LJ#707*qoM6N<$f^)~n-~a#s diff --git a/public/images/pokemon/exp/back/shiny/707.json b/public/images/pokemon/exp/back/shiny/707.json deleted file mode 100644 index 384c57d4102..00000000000 --- a/public/images/pokemon/exp/back/shiny/707.json +++ /dev/null @@ -1,2078 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 286, - "h": 286 - }, - "scale": 1, - "frames": [ - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 115, - "y": 142, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cdbd19c7dad9a1ff1df2740c2ec77705:390b1dd326d02ff6f47617dbaa2be2bb:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/707.png b/public/images/pokemon/exp/back/shiny/707.png deleted file mode 100644 index 538667f7252dc8d3b8cf10a08106778d9b8e520e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6398 zcmXw82Q(aE+to!7y_40#DiJLrB-)DJg<$ov2wA;v^su7$-i2tZ_tg?*gVmx%C#!`Z zNMyDA>-)Zc&dhmd?sK2}+~OMRAXA6rd=oo|p~=l-EEZN8QU_azdAu65g-ev)f%R|yo|wP7IXKHaqRKNV zZJ9fbY8>H~ZBS_$V;d2S#fjAYjw>!pk#>{s?dS>qd-Bh!ud>J@kbkb%>IAD_y7m0KGzFQW-yfvS z&NMOPL{kkNV}Ilo*KEJ=9dX|0=XuhV|EsbmM8*YJZJL}fo)b8CnCa~ZI{-LRpsR)X z^3=RYULRT1B&LpliW_q1By=)$Ct(-|dWNCn$-JT0##%C!svItvQUI&>LVQI3!7T0h znW)g<0ez?*1nA*l)im<G*S zmTHYDnZ_a6x5x$PI}8!E=nrfzQ5U1v`Jp(>dZND}EG_UNYM#bJBLtqb`|>O8fO5N(=b3-<*=w><_?}NDD5C`5aThBT`&j*Yv`;} z0vKg8uJoAg_5;bx;K=r=H@g<@{p4wg^b*uNfFO>xisQhP#Q#_ zL2cksQke(zk+RfpO3AuEQjOh-vz-q>S-HoaCVN&J(GFVOvXQ?2kJKr;WsOju0zUaMK>(^aGFJS|26VzyI z<(u9!G2Gv=>Kath<*9C=$u+UBNYZWF{gCR=wBH6dbM-CnU$SgP4Ql~g+KW*;t$Ry2 z{zUH;g!|IDERav^=S#L1W!L8)zJ+_pEt4u zmMb7j=jZnXvA?yd*4auY^=1U_4$KBla9xkrN z!{2SvE;M4)PrO5>KTA878m+9dP#S^v$DOzUb_e-J{O5eMg9}qelwvz&1#u-Gz$+`+ zFze>Ys&3hWR>g0mxxPMbn|dv?_K!Q&81jtTIsx2|E|ctyK=u`!Kbtw+wv|Hy?{5+oCt{E}jak^;=ZU*O3x*jZI3_W;0?# zZ#Q{+pj4|C`R;S410I?w+VhX^+|M1XYekE>l1nbDf34br!)hSh+H!uA%e!E0?x)|b zzvs;eE+Q9EbLI)ftSqCJ@ggO|AM{n*1d242r15=tAXwmqLA zg@d-5qGBzGx8AHDw4O>csw-*9ylXk`;3r}^H;m}3NNypT7cP{Fbg*PrL%g;b| zM76olJ1$&%pP{|IzA}DV{N5nHhOSBzT@oFJ(C@3Iv+fcTmbWVENl%%|tbN`PeK%8_ zJ#%7XYPG_uO$Sh&_6wOjb5(wUsUm&PnP7eVl-{EgE-`5jIfj#d=j}iYP{rB}y~veJ z6@!UcSo|2cB<@q&C#bzqRvbj69I)^Fu{)lOMCB571_+(RS67 zsd@r42MihpuvpRBLBsliZC>>+kvsv0V-q_q6HEq<`42>XwOlrRt%LPkq>yo^?w>4P z?~(J-n-+c3qt!I$?%Ktn6N?j_ydE*9=MrCC&1p3UY3u5GuigJwc>Bmvx(h33&Y%TM zac(uZHRaY5bme}1>`%!iUW_8xRC&;l_UPB8YU;`sX{u5}`*$2R^q^tj0m;_40X8PO ze4az;#?W?LKMtDaV9+l~v&n@>o+dcBl{ceZdEIFhyrV5GuG{2stDWqV-43#6@%Wx% zK%04I`R=MIUBVd7mVweHZ5TMrbR@^!z5wz)C51K;qA4Qi_$m2m&O-}arzM759Ut?^R3Xl-_Ugh9G$`&UAEbzFpoBLw4%sx# zH+c)Gf{i?JVxZ;ew{`+XwhGd)q}Y*ccl&!Dn&%I>JYxD^JdSAjA;DLPVn=5P3*eCN ze@9ix=pJaV^Xl6tKr}PblG+FQx2k*Z9CL^(%BjS0d!3mymPHPrL&=$WO7@ee@-(sT z>SQrFV%vm#HT=?uG^($zUs7mkbM(iewOJ{}l((I5?#KjeR*}chi@2D?xKv#4r>A6u zVm75-d{yV%?4FX~D0%ys+zoS4u9L7R80W>U9SoJa#uFas&XaGQ!z>-fs*mN#w*%zMoZBm0Z#mGFa2n%0bk=kkT;c zwXWmffi|QoAD7ZiYK+y^r)vuxFvo7ZkOX&&N-hnm&4+oU2F9ql+ZKHbUyW@Km{lL@ zcFRjk*cet(hDqE5#f*4{lRwm~Mbb_p!KzKfbfQqJ`JV>VrnM{{q6Vj16n{ za)7$(@On^w3GJ5@!jS^~*I(27`PkmQ5CbfOyK%Hfdeaya;1z?(l{=V&J?<=`_4u9F6^f=X#QUE#zDl-$M5Afg={ zv^YWYnvXU{wll%0wOB_2#IaLaJ*i=xnGm=*7vYTswwalY_V+KgmAL3~LoY&tI;T|ViC~dqm ze&SDs7>!j}J{FKYDuJfEM#Jt?rnG--IWdY_MDJ>Yzj(U;`{2hm?di@s7uMp*S48!^ z_VK2bwi-KpDH3m*aMnL`*4D61s9q0pH?_Hx{?%?r?PT~{u*oHi{W&8aspFlTH`HP6 zgLowfW#I!anIAR}mKQ~iXqKL3m$j7Aw~1v|7+28UdD52Ovch0Y2-)5PdVk^<34@fv zmIsEOo7Aqjr9Z&yr=R^rPP$fg^YZ&@yl5ctYEMzi*ui z!y_7GVg8czeajF<>Te;vP_merv*#;o>&97d$HVKeSdWG6-?tsZ+60tiMZ{&&cQYlq z2rA@$hNJ~ykX=sv<@ffX@7;fYvY#Y}aVdwq4C<7PgOx7=gEDv#i-F|GeimEeAt=4^cnk%7%wZTZD+Z@6nSix(8$x>HPqvH4h#={(WV%Cy^I7323$eIBOVDZem<-$!M2X`sv&0Pv4Nz2d^s_OlDwE=W# z*;4lf-)-@EwH8n@W<2!o_?B0@69L=0IrhwS1~KjwJo5bTr;$q29CL6pHX2Adv#O)*e(1d7_wf4Ty`CwLz0bfTEz%_--39x zj@P-cU`8bzZUY83bfRyE0EDkj|44vO`K&ME41H&sRF|h)Aa8$K=EEW!X*RCiQ_)6Nfs&guZuU4Im2I& zxUN}hR!21=Es;#{I2vc+X+1Tb$x{H{E8?4^F~d0`Mn(m>ane2`<_s`YN*65QlSzt| z28cSK_`7dC64xgw;^JB?Q4cb6(O>7ZR(@IdU}1gkT#09%O#zEJm9m}HP!&1cEEKdt zek2@4jqVWkkOh?C*r{`ooCWE+g`?5Q8dCf&7((2>5PORMm~eF@2!r#+e<7Bydt=;n z79Q57bYH!!QH_ne(AuJXR;0^1T>caZ$aXyKpQeYld{5-6F_5!j*j069(1T`o{qST{ zgHLPxiZ=I)3Z}4~Jei-~V$|ATmA2Qew`qiu+~~y?H9tcQ7v6o+5hkd48vW8QCz!&H z*jKPK~(|7+CS@LZkqj^wH?>-J}cBq ztx3(R)}t%M22wxxT}_C@tT#b4!Hu`+;P`GBms z!eH6n_l12b?5Zg8%8)B?EfFzf{m1GQ>x3Z6K{YXdfwsr3c!&>#C{-)9#UwY|r$9Xi zlf!%yjQ6`O<2P?p{0rLu znnh>OCQ5qBa@5m8%+WyH$O&j0PW_X+MEOx1^Oa=5oiuHtFo~(zhH(9n)}^SP-(n2K ziNoS)Zsea(LD0mTuP%FSEu4je<;lM1;ZiRn9;>P1o0t$_kHZ`ZjiPivT}O|aMI3@> zYMbetcbq>vJfw-=>;FWfNQ8=Z+1rf`kkWGyv)Zu+buTCATzKfmz80E!Q}T@AW2+{Q zO|`JF?GDX=^9COFuc1umbOKfeoFLZQwe(}%{y{EPYfqrJRy9I_I5+`H@l1<+$7OH2 zO+26~4zCE@K!N*sq#`fQ!|V@nc=~1*DBD#NrMN8<0P_^&E=XWIWdeYP9o$RioE4V; z*l+g%P>^Pi!qB(RxS!aUIEf0d!pQG^QImRCBD9W<_)L8LEhKykHNQdfc}u`U`+fur zR{4t6@O5C@W!XVuB1Oj%x|Uosu(FedYjNa z!SD2yjpFFui=;$({Xy6j(xq27KOCkMvY6z9j4HAkA0hkCTEee|w?$d%o#C zHwva)V(@n`W2LtoCw=l;v-)Lq19r6vM*qe$~6D+)%9>a0ikE8(`5v4@JyA*wh zV|t)2YpB_kw$R2&HnD6*;VMQK^AVerMq@HnmrK=?E|Qc<9gB?5JJ;BL)=VwsP(aBV zQ-fZ^e^Ed=41tD>psjPo<&8VD;#wN9M*ZdP9&5-7g>QMe{ZbB=)rG(4fw^81BUlCh z+KM-$+YX4>H`~vNN4A9s*?e0|{I-_l zi_{rU@>^3BI8%JuQ@kz9;a(C8e4m?sHK-d(mT>{3b|CfI369_GQp=1D%n}qZ5Z*Ug z`x^H@oPi4j(07Tw)LcKCzd8YaSUVA3hR@OCra>JMi~W2xXg~R$$hL&VTP9|o`=;Jq zjHQ`2EbBE%zRq^%2@)W}CnQg7)(}v|5^(sl+E%VTs|L5uG;l2Bcu&jSg5`#qDK#B8 z6$Ht-$rI5X2#OGR?3cd+dIXgk+gPTk?0t>X==LmEu99-yFpaW&ukV~*Zchv1u^@A; zKQt4;B=*}Mq9{$ANW9!kKh{*i$^03=~?=qKg7kB7}UBt#51_$DRMN_1fgzGPuLv=t)mj4YWcxEQOJAIm@o!i`shS5aW_8CD%YWeFve5ZSy3)vVn=2s_KTl zuHXV3dD}5vtyvd@U6Kl4ra*Z`J(fS5!-^E)a(!B`HezHjm|4Oht{cW(Sa>BdBHu|o0ScAP z)wRF|ogbSZLiY{i+1{;=Xj^LWfvm6Sfx)ADEDqs#wat}`EkoTw@uW6=J|EUb&{pqT z>sbp3IJ!hkj(Lfgc{><%7dXn}Xxl}mu8c*H9s;bAfp^mi^dWcLktZ%5LL;=kpW{75 z0PYr7#?W83;qSSDx&!_I7 z4Mzujgb>zP#QsfC?xd33!gDUbl`kz3bJ}Elz0AmIHUTPSZRDYq7D*qOV}__^INlUs zxvPR#=5b1pP^L}Vm0?lOUZklw5gbN9Qc8AM3QL)pQD-V3c&yDomcpg5+{GW*iO=9+ zab^r96Q|Lpi8Q4p+C5rnswRBo4zW+jVgcA>P~ekbCIoL*pU2UUla4;#vBPEdO^$E@ z7KHGx)R@S|ub7+c?}*;Z%L&`(e*b!VIO_o@v~RiH|7`!UNXso-0myoOn2dFK8+U8P zNI9fu`9CE1%#Y(Bj2BQL)aq}#6;$Ou!BxobFGst-Lrj^Qfk^fM>D%8J>MwMZ5lYtK F{|8R{UyA?$ diff --git a/public/images/pokemon/exp/back/shiny/708.json b/public/images/pokemon/exp/back/shiny/708.json deleted file mode 100644 index fe864e9f9ea..00000000000 --- a/public/images/pokemon/exp/back/shiny/708.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ae43a2361518d114c34efceaee18a46b:85de733a19b6cdd71d9518299acef7f4:796c82c5076b122f2663381836c65843$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/708.png b/public/images/pokemon/exp/back/shiny/708.png deleted file mode 100644 index 35e2594241ab318dd9bce9c6e95efeffb6f50575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4648 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 Ef;DQ}r~m)} diff --git a/public/images/pokemon/exp/shiny/693.json b/public/images/pokemon/exp/shiny/693.json index 991a16f1e53..c8f7763de1d 100644 --- a/public/images/pokemon/exp/shiny/693.json +++ b/public/images/pokemon/exp/shiny/693.json @@ -1,272 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 259, - "h": 259 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 85, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 91, - "h": 80 - }, - "frame": { - "x": 0, - "y": 178, - "w": 91, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ab498798f30c4ef93c4c30affa037f2e:aef6fdb8988ea3ebf127e38fb4875bad: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/exp/shiny/693.png b/public/images/pokemon/exp/shiny/693.png index 328c909b19696098011e2c8886cfb4f5ea768631..60f40ad0c406e594826d05d4b8b4552b093c9c9f 100644 GIT binary patch literal 30712 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 literal 6269 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 diff --git a/public/images/pokemon/exp/shiny/704.json b/public/images/pokemon/exp/shiny/704.json index d14609ad74c..4241b2d2a8d 100644 --- a/public/images/pokemon/exp/shiny/704.json +++ b/public/images/pokemon/exp/shiny/704.json @@ -1,1784 +1,371 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 288, - "h": 288 - }, - "scale": 1, - "frames": [ - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 80, - "y": 235, - "w": 41, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 205, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 247, - "y": 0, - "w": 41, - "h": 44 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 163, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 121, - "y": 85, - "w": 42, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 163, - "y": 85, - "w": 36, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 125, - "w": 36, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 157, - "y": 129, - "w": 36, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 169, - "w": 36, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 168, - "w": 36, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 173, - "w": 36, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 121, - "y": 213, - "w": 36, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 175, - "w": 36, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 211, - "w": 36, - "h": 43 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 216, - "w": 36, - "h": 43 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c2301c17b022e36ed40b13f27d705543:87a73272ea48477e6b25b210421da5ec:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0013.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0017.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0018.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0019.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0023.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0026.png", + "frame": { "x": 26, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0028.png", + "frame": { "x": 80, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0029.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0032.png", + "frame": { "x": 26, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0033.png", + "frame": { "x": 78, "y": 31, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0035.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0036.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0037.png", + "frame": { "x": 26, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 99, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0039.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "RGBA8888", + "size": { "w": 108, "h": 128 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/704.png b/public/images/pokemon/exp/shiny/704.png index ac31e9da30ccd35ab3c3619ef58e4a7cfd0e4239..d630d161de13e342d98dd6937a86584950bc6997 100644 GIT binary patch literal 2532 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 diff --git a/public/images/pokemon/exp/shiny/705.json b/public/images/pokemon/exp/shiny/705.json index 1d18b10d3a0..bc7b5ff15d3 100644 --- a/public/images/pokemon/exp/shiny/705.json +++ b/public/images/pokemon/exp/shiny/705.json @@ -1,272 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 91, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 119, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eb2c6abdfceb0458f6389a25d31f9dab:0ef587160e8636cec6566f480554985e:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 159, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 39, "y": 125, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 200, "y": 60, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 39, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 79, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 117, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 127, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 39, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 78, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 117, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 155, "y": 181, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 119, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 79, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 39, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 196, "y": 123, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 200, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 159, "y": 60, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "I8", + "size": { "w": 241, "h": 361 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/705.png b/public/images/pokemon/exp/shiny/705.png index 8653de923ec753255922c62c71df21d4e9d4397f..7fed21b3583942430c06bb79006c1ae0868b59bb 100644 GIT binary patch literal 8405 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 literal 1851 zcmV-B2gLY^P)`bjAEHmRp12kpQaTS%Tf%7g{62TceHoZv~IO7%RfkH!YZL z8!fQifABlw4ocEU~+w*G78jZS&Wh~5kYi~Vvv|a3^ov3WKiwCGH ztu>!p8o>X9L}AOo2`V^U?8Kc&EZe}cO-+$6wzfNYl-GF+cXD@!oc^yR=bPabt3}n50l6$Cxmtm zO?cRwOLnSTVQp|zXLj%$;x$1!EW?cR^@R;X=w_US?XNm}m4lNtfx?FEuwS0zw*F_q zEyJ%@{NgIDr9q%MB(vxOxn=kjJA~%2;2gqn8r@!qTY-O4i%Mq~<<(7Fal6AybFA)~ zdpX>#!0|J3E3LWp)>1)k8GfbX8<_)Ap4uU9wYT!yYF6ejziSO~>)>#;|1!ApoK_T6 zw|WW<7hLw|AG5)ODD*@Daw|VPaTgS?ZV;6g%9g&6^|p3qUq1%8`%Ka*EZ&GPThy%5 z)>`%0vE|a-E+1&=(#eKv7mKYY8|$UR94{b)^shQwF)Q?Ye~tOJ^wbQv^rY&g(^Y!= zq_vkJt6ozd3#E^<#NU$L4tD_o{As?rpsM*du-H zN9k>5X3lGG3$4{n^ZOTCa+XU}F8}v?vhk|EK2Ui^0*x%`?d%V za|Ks$6x)zM$+l-?+iPbe1q)IV!_np0&fPJCH6SC|hOsE|sj-VKb27}5gS#Jgym95m zxs3{jKM}l7`^KUZI|>jIJtpk8J=PCRHLVYEGmf zr>PBq!=&(-NJmam8vqAN;W3d)hAY=$>H^>}DRy1nWfJq?Hbdjau?v6$rPy_Ommf91 z#9C|v;6N$v@-9aEb^QYW@rE;RL;9-S)6?@ z;1L#-L^zB=BP=M1aF7Zzxmdg`gC po_gx3r=EK1si&TL>Z!k{{sqm2<-K%6!yy0w002ovPDHLkV1jAAeRTi; diff --git a/public/images/pokemon/exp/shiny/707.json b/public/images/pokemon/exp/shiny/707.json deleted file mode 100644 index cdc3064d8aa..00000000000 --- a/public/images/pokemon/exp/shiny/707.json +++ /dev/null @@ -1,1931 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 283, - "h": 283 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 45, - "h": 70 - }, - "frame": { - "x": 120, - "y": 140, - "w": 45, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 45, - "h": 71 - }, - "frame": { - "x": 151, - "y": 210, - "w": 45, - "h": 71 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 44, - "h": 71 - }, - "frame": { - "x": 235, - "y": 211, - "w": 44, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:26c493d70c41c4104147194dfbbab5b9:b12f3eb3fdd1a69bbf055a44f9557395:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/shiny/707.png b/public/images/pokemon/exp/shiny/707.png deleted file mode 100644 index ee0fec17e8cc15eaf47fe94010e12ac15345ec71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6292 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 diff --git a/public/images/pokemon/exp/shiny/708.json b/public/images/pokemon/exp/shiny/708.json deleted file mode 100644 index 188cebad63c..00000000000 --- a/public/images/pokemon/exp/shiny/708.json +++ /dev/null @@ -1,1028 +0,0 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 206, - "h": 206 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 50, - "h": 40 - }, - "frame": { - "x": 102, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 50, - "h": 40 - }, - "frame": { - "x": 152, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:02aeb20d3dedab69cd63430f383bb8a9:140bc3262838e3b187b88498bce06706:796c82c5076b122f2663381836c65843$" - } -} diff --git a/public/images/pokemon/exp/shiny/708.png b/public/images/pokemon/exp/shiny/708.png deleted file mode 100644 index bb896a0214c9e432ef9baef24806aa1f70b17c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3255 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 diff --git a/public/images/pokemon/shiny/707.json b/public/images/pokemon/shiny/707.json index f0e0b2053ac..ee5036fb541 100644 --- a/public/images/pokemon/shiny/707.json +++ b/public/images/pokemon/shiny/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f2be0784fdc424d853cf61d4ff5ef128:c0a67b3382e00d7635b97e14ca444b8e:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 578, "y": 149, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 95, "y": 62, "w": 59, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 14, "w": 59, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 519, "y": 2, "w": 67, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 67, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 280, "y": 2, "w": 82, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 82, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 93, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 63 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 95, "y": 2, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 95, "h": 60 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 190, "y": 2, "w": 90, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 90, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 362, "y": 2, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 445, "y": 2, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 74, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 586, "y": 2, "w": 65, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 2, "w": 65, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 2, "y": 220, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 4, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 319, "y": 447, "w": 42, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 5, "w": 42, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 447, "y": 489, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 614, "y": 500, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 10, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 573, "y": 453, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 267, "y": 480, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 184, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 2, "y": 443, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 226, "y": 442, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 130, "y": 438, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 366, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 52, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 682, "y": 221, "w": 48, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 18, "w": 48, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 519, "y": 361, "w": 47, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 47, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 43, "y": 502, "w": 44, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 20, "w": 44, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 714, "y": 505, "w": 41, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 41, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 402, "y": 489, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 471, "y": 219, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 692, "y": 80, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 389, "y": 147, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 399, "y": 297, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 610, "y": 375, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 141, "y": 360, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 638, "y": 79, "w": 54, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 54, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 362, "y": 67, "w": 60, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 60, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 474, "y": 73, "w": 59, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 59, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 264, "y": 147, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 57, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 298, "y": 264, "w": 54, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 54, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 524, "y": 148, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 211, "y": 135, "w": 53, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 53, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 471, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 569, "y": 302, "w": 48, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 19, "w": 48, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 154, "y": 134, "w": 57, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 57, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 154, "y": 64, "w": 60, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 20, "w": 60, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 214, "y": 64, "w": 59, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 19, "w": 59, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 2, "y": 292, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 18, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 696, "y": 426, "w": 41, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 41, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 533, "y": 73, "w": 53, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 53, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 56, "y": 135, "w": 62, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 62, "h": 64 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 662, "y": 373, "w": 62, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 62, "h": 53 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 655, "y": 505, "w": 59, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 22, "w": 59, "h": 47 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 422, "y": 437, "w": 61, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 61, "h": 52 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 326, "y": 136, "w": 63, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 63, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 321, "y": 198, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 57, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 519, "y": 291, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 20, "w": 50, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 445, "y": 363, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 20, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 45, "y": 426, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 189, "y": 352, "w": 44, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 44, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 667, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 425, "y": 218, "w": 46, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 40, "y": 18, "w": 46, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 148, "y": 203, "w": 47, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 47, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 572, "y": 224, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 18, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 244, "y": 287, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 763, "h": 577 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/707.png b/public/images/pokemon/shiny/707.png index 2f4efb3e8cbfbcbbcb2da04dd1ed4b4bd5834851..7aed21b78734cc675c87aa0d76de45964f8d0726 100644 GIT binary patch literal 60120 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 literal 866 zcmV-o1D*VdP)@|jdUrly6nv$MaynarF$<$he{<+$?Bh4}dRkI-ZQ00001 zbW%=J06^y0W&i*J;7LS5RCr#k(miO~Koke?ca5MO?`#_7O9qP!U2RR75`&<|;GsjZ zmJaP2G`ZkX;;F)5Lh+QT7(4`nF@}H#gQr3kF9rvU;Ru;L2sD*I492~aR5gR1tRZg^ z5)#Z?U~tsPO3tD2+JT%Gg#3;z{y6Nx*I=kxnNLHo!mNmp7ve(d(vGMj=qDx0i(OFkD49jtVO zBkkU@$LHK@RgQKo5U!xDSM6@scau0*XcV+Y3($Z?&$YXSazU%dIVv6J6W;Cyj#JEm z##;?O>-eCIyB%K8xNUEAq|W)ZT?KE=CQ;O_o8 z#g1}H;NISSrs0PRvD*_e6fZ($lO@o8bnPShjt2gwh5$}g#*#=T}{UvSrlz^ z*U;JcciPCMVw_U6cXQ_Z@mG;g$KBxdP2pod<;0vtsT-j{=2NcnjkJ9hdr!uv>};RDEX%H?B}TU}jVe92|K4wjzHq z84ddKkq#ZONcVkYNtVyaJuJYAxT6PvS542|zJPNUec=pUIAFNTI8`cKo=Hb&j9Ul? sES2*C?%eP&;)+O@pvaIxqDsX60&n^kZ?ZT(!vFvP07*qoM6N<$f^+JZMF0Q* diff --git a/public/images/pokemon/shiny/708.json b/public/images/pokemon/shiny/708.json index 06631af7cb8..abc8d24db2b 100644 --- a/public/images/pokemon/shiny/708.json +++ b/public/images/pokemon/shiny/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 44, - "h": 44 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5ae7df27c9e36b2c06c09056297b74ab:efbc3a2251be2a5a300a0c333bce242b:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 90, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 135, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 90, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 134, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 180, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 14, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 225, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 15, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 270, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 17, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 270, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 90, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 23, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 135, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 180, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 225, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 18, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 268, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 178, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 15, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 223, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 226, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 45, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 180, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 315, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/708.png b/public/images/pokemon/shiny/708.png index 1da0441109b266002bf28fab28eff98146853351..d94b12865901b92a7b83c8867603cf3b422bbfbd 100644 GIT binary patch literal 9062 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 delta 469 zcmV;`0V@9HM&JV>iBL{Q4GJ0x0000DNk~Le0000i0000i1Oos70PLzqGLbG9e`%Dz zfGj4arlzLS|Jm8uzGC3|U`o1B0{qLy~Fos za6CoGbqh2g-1#X&q}2#c8|SA8$*f(i>@Y=$B)7I99eGNb+CizNG%6sU@B#pGIWCW& zfMPu#7s-^@N2y$l94LQTD_j9D(4TSUq`8=nSyDqHw&2 diff --git a/public/images/pokemon/variant/exp/704.json b/public/images/pokemon/variant/exp/704.json index 38e5cdaf70d..e292d6fb41f 100644 --- a/public/images/pokemon/variant/exp/704.json +++ b/public/images/pokemon/variant/exp/704.json @@ -1,30 +1,30 @@ { "1": { - "6f5e80": "4e4094", - "e0d3e0": "fbb3d2", - "010202": "101010", - "bbafc4": "c7a1e5", - "2f6b38": "4e4094", - "74d457": "3aa8c4", - "3da84d": "197497", - "3f3d5e": "4e4094", - "a497c2": "c7a1e5", - "766fa6": "8b69c3", - "4c3143": "4e4094", - "cc93ab": "c7a1e5" + "807380": "b93f84", + "f2daf2": "fbb3d2", + "bfacbf": "e56ca6", + "4d454d": "8a2166", + "101010": "101010", + "4d993d": "197497", + "66cc52": "3aa8c4", + "b8a1e5": "c7a1e5", + "8f7db3": "8b69c3", + "665980": "4e4094", + "c25054": "c68260", + "de817e": "e5e1a1" }, "2": { - "6f5e80": "274159", - "e0d3e0": "92d8c8", - "010202": "101010", - "bbafc4": "63a99e", - "2f6b38": "134557", - "74d457": "d27e26", - "3da84d": "a34205", - "3f3d5e": "134557", - "a497c2": "63a99e", - "766fa6": "2f667c", - "4c3143": "134557", - "cc93ab": "63a99e" + "807380": "237e7f", + "f2daf2": "92d8c8", + "bfacbf": "63a99e", + "4d454d": "134557", + "101010": "101010", + "4d993d": "a34205", + "66cc52": "d27e26", + "b8a1e5": "4a9699", + "8f7db3": "2f667c", + "665980": "274159", + "c25054": "9268a4", + "de817e": "f2daf2" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/705.json b/public/images/pokemon/variant/exp/705.json index a29b8f124dc..bf9aa91eb4b 100644 --- a/public/images/pokemon/variant/exp/705.json +++ b/public/images/pokemon/variant/exp/705.json @@ -1,33 +1,34 @@ { "1": { - "101010":"101010", - "4d454d":"8a2166", - "807380":"b93f84", - "bfacbf":"e56ca6", - "f2daf2":"fbb3d2", - "665980":"4e4094", - "8f7db3":"8b69c3", - "b8a1e5":"c7a1e5", - "4d993d":"aa6a00", - "66cc52":"ffd047", - "4e9c3e":"0c5474", - "67cf53":"3aa8c4", - "b6f2aa":"63cee1" + "807380": "b93f84", + "bfacbf": "e56ca6", + "f2daf2": "fbb3d2", + "4d454d": "8a2166", + "307922": "aa6a00", + "46b030": "ffd047", + "101010": "101010", + "98bd51": "197497", + "d2e79e": "3aa8c4", + "647543": "0c5474", + "b8a1e5": "c7a1e5", + "665980": "4e4094", + "8f7db3": "8b69c3", + "ef6f8f": "b93f84" }, "2": { - "101010":"101010", - "4d454d":"194f51", - "807380":"2b736f", - "bfacbf":"5db6a9", - "f2daf2":"9cead8", - "665980":"274159", - "8f7db3":"2f667c", - "b8a1e5":"4a9699", - "4d993d":"007d61", - "66cc52":"49ffbf", - "4e9c3e":"842401", - "67cf53":"a34205", - "b6f2aa":"d27e26" + "807380": "2b736f", + "bfacbf": "5db6a9", + "f2daf2": "9cead8", + "4d454d": "194f51", + "307922": "007d61", + "46b030": "49ffbf", + "101010": "101010", + "98bd51": "a34205", + "d2e79e": "d27e26", + "647543": "842401", + "b8a1e5": "4a9699", + "665980": "274159", + "8f7db3": "2f667c", + "3f6f8f": "9268a4" } -} - +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/704.json b/public/images/pokemon/variant/exp/back/704.json index 179c06d54ac..1955f425b26 100644 --- a/public/images/pokemon/variant/exp/back/704.json +++ b/public/images/pokemon/variant/exp/back/704.json @@ -1,26 +1,30 @@ { "1": { - "766fa6": "7d699d", - "010202": "101010", - "6f5e80": "4e4094", - "e0d3e0": "fbb3d2", - "bbafc4": "da75a5", - "2f6b38": "033c55", - "a497c2": "da75a5", - "74d457": "348fa6", - "3da84d": "185d83", - "3f3d5e": "033c55" + "807380": "b93f84", + "f2daf2": "fbb3d2", + "bfacbf": "e56ca6", + "4d454d": "8a2166", + "101010": "101010", + "4d993d": "197497", + "66cc52": "3aa8c4", + "b8a1e5": "c7a1e5", + "8f7db3": "8b69c3", + "665980": "4e4094", + "de817e": "e5e1a1", + "c25054": "c68260" }, "2": { - "766fa6": "2f5d6f", - "010202": "101010", - "6f5e80": "274159", - "e0d3e0": "92d8c8", - "bbafc4": "5f8d86", - "2f6b38": "681b00", - "a497c2": "5f8d86", - "74d457": "bb7935", - "3da84d": "a34205", - "3f3d5e": "681b00" + "807380": "237e7f", + "f2daf2": "92d8c8", + "bfacbf": "63a99e", + "4d454d": "134557", + "101010": "101010", + "4d993d": "a34205", + "66cc52": "d27e26", + "b8a1e5": "4a9699", + "8f7db3": "2f667c", + "665980": "274159", + "de817e": "f2daf2", + "c25054": "9268a4" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/705.json b/public/images/pokemon/variant/exp/back/705.json index 93f270c6976..72dd07123ea 100644 --- a/public/images/pokemon/variant/exp/back/705.json +++ b/public/images/pokemon/variant/exp/back/705.json @@ -1,28 +1,26 @@ { "1": { - "807380": "b93f84", - "f2daf2": "fbb3d2", - "101010": "101010", - "4d454d": "8a2166", - "bfacbf": "ca719c", - "66cc52": "197497", - "b6f2aa": "197497", - "4d993d": "0c5474", - "665980": "4e4094", - "b8a1e5": "c7a1e5", - "8f7db3": "8b69c3" + "101010": "101010", + "4d454d": "8a2166", + "647543": "197497", + "98bd51": "3aa8c4", + "665980": "4e4094", + "807380": "b93f84", + "8f7db3": "8b69c3", + "bfacbf": "e56ca6", + "b8a1e5": "c7a1e5", + "f2daf2": "fbb3d2" }, "2": { - "807380": "20615e", - "f2daf2": "9cead8", - "101010": "101010", - "4d454d": "124143", - "bfacbf": "4e9b8f", - "66cc52": "a34205", - "b6f2aa": "a34205", - "4d993d": "842401", - "665980": "274159", - "b8a1e5": "4a9699", - "8f7db3": "2f667c" + "101010": "101010", + "4d454d": "194f51", + "647543": "a34205", + "98bd51": "d27e26", + "665980": "274159", + "807380": "2b736f", + "8f7db3": "2f667c", + "bfacbf": "5db6a9", + "b8a1e5": "4a9699", + "f2daf2": "9cead8" } } \ No newline at end of file From a8bf3858992d4f536caf93e1ee487a07edf2a174 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 18 Feb 2025 02:52:43 +0100 Subject: [PATCH 053/171] [Sprite]Batch 3 of exp changes (#5232) * Pancham-exp change * 698 -Exp change and undo experimental need * 703.exp change and undo experimental * 694-exp and removal of experimental * 698-fixing missing pixels and removing uneeded files --- public/exp-sprites.json | 48 +- public/images/pokemon/674.json | 545 ++- public/images/pokemon/674.png | Bin 450 -> 1545 bytes public/images/pokemon/694.json | 806 +++- public/images/pokemon/694.png | Bin 475 -> 11308 bytes public/images/pokemon/698.json | 1454 +++++++- public/images/pokemon/698.png | Bin 548 -> 3661 bytes public/images/pokemon/703.json | 608 ++- public/images/pokemon/703.png | Bin 490 -> 2403 bytes public/images/pokemon/back/674.json | 545 ++- public/images/pokemon/back/674.png | Bin 375 -> 1509 bytes public/images/pokemon/back/694.json | 806 +++- public/images/pokemon/back/694.png | Bin 393 -> 9571 bytes public/images/pokemon/back/698.json | 1454 +++++++- public/images/pokemon/back/698.png | Bin 473 -> 3251 bytes public/images/pokemon/back/703.json | 608 ++- public/images/pokemon/back/703.png | Bin 417 -> 1190 bytes public/images/pokemon/back/shiny/674.json | 545 ++- public/images/pokemon/back/shiny/674.png | Bin 376 -> 1495 bytes public/images/pokemon/back/shiny/694.json | 806 +++- public/images/pokemon/back/shiny/694.png | Bin 393 -> 9537 bytes public/images/pokemon/back/shiny/698.json | 1454 +++++++- public/images/pokemon/back/shiny/698.png | Bin 502 -> 3251 bytes public/images/pokemon/back/shiny/703.json | 608 ++- public/images/pokemon/back/shiny/703.png | Bin 417 -> 1190 bytes public/images/pokemon/exp/674.json | 524 --- public/images/pokemon/exp/674.png | Bin 863 -> 0 bytes public/images/pokemon/exp/694.json | 272 -- public/images/pokemon/exp/694.png | Bin 1770 -> 0 bytes public/images/pokemon/exp/698.json | 3296 ----------------- public/images/pokemon/exp/698.png | Bin 3794 -> 0 bytes public/images/pokemon/exp/703.json | 356 -- public/images/pokemon/exp/703.png | Bin 1277 -> 0 bytes public/images/pokemon/exp/back/674.json | 1175 ------ public/images/pokemon/exp/back/674.png | Bin 1288 -> 0 bytes public/images/pokemon/exp/back/694.json | 272 -- public/images/pokemon/exp/back/694.png | Bin 1327 -> 0 bytes public/images/pokemon/exp/back/698.json | 3296 ----------------- public/images/pokemon/exp/back/698.png | Bin 3340 -> 0 bytes public/images/pokemon/exp/back/703.json | 314 -- public/images/pokemon/exp/back/703.png | Bin 982 -> 0 bytes public/images/pokemon/exp/back/shiny/674.json | 1175 ------ public/images/pokemon/exp/back/shiny/674.png | Bin 1288 -> 0 bytes public/images/pokemon/exp/back/shiny/694.json | 272 -- public/images/pokemon/exp/back/shiny/694.png | Bin 1327 -> 0 bytes public/images/pokemon/exp/back/shiny/698.json | 3296 ----------------- public/images/pokemon/exp/back/shiny/698.png | Bin 3340 -> 0 bytes public/images/pokemon/exp/back/shiny/703.json | 1322 ------- public/images/pokemon/exp/back/shiny/703.png | Bin 1555 -> 0 bytes public/images/pokemon/exp/shiny/674.json | 524 --- public/images/pokemon/exp/shiny/674.png | Bin 863 -> 0 bytes public/images/pokemon/exp/shiny/694.json | 272 -- public/images/pokemon/exp/shiny/694.png | Bin 1770 -> 0 bytes public/images/pokemon/exp/shiny/698.json | 3296 ----------------- public/images/pokemon/exp/shiny/698.png | Bin 3794 -> 0 bytes public/images/pokemon/exp/shiny/703.json | 356 -- public/images/pokemon/exp/shiny/703.png | Bin 1277 -> 0 bytes public/images/pokemon/shiny/674.json | 545 ++- public/images/pokemon/shiny/674.png | Bin 449 -> 1779 bytes public/images/pokemon/shiny/694.json | 806 +++- public/images/pokemon/shiny/694.png | Bin 475 -> 11338 bytes public/images/pokemon/shiny/698.json | 1454 +++++++- public/images/pokemon/shiny/698.png | Bin 548 -> 3662 bytes public/images/pokemon/shiny/703.json | 608 ++- public/images/pokemon/shiny/703.png | Bin 490 -> 2403 bytes 65 files changed, 13028 insertions(+), 20690 deletions(-) delete mode 100644 public/images/pokemon/exp/674.json delete mode 100644 public/images/pokemon/exp/674.png delete mode 100644 public/images/pokemon/exp/694.json delete mode 100644 public/images/pokemon/exp/694.png delete mode 100644 public/images/pokemon/exp/698.json delete mode 100644 public/images/pokemon/exp/698.png delete mode 100644 public/images/pokemon/exp/703.json delete mode 100644 public/images/pokemon/exp/703.png delete mode 100644 public/images/pokemon/exp/back/674.json delete mode 100644 public/images/pokemon/exp/back/674.png delete mode 100644 public/images/pokemon/exp/back/694.json delete mode 100644 public/images/pokemon/exp/back/694.png delete mode 100644 public/images/pokemon/exp/back/698.json delete mode 100644 public/images/pokemon/exp/back/698.png delete mode 100644 public/images/pokemon/exp/back/703.json delete mode 100644 public/images/pokemon/exp/back/703.png delete mode 100644 public/images/pokemon/exp/back/shiny/674.json delete mode 100644 public/images/pokemon/exp/back/shiny/674.png delete mode 100644 public/images/pokemon/exp/back/shiny/694.json delete mode 100644 public/images/pokemon/exp/back/shiny/694.png delete mode 100644 public/images/pokemon/exp/back/shiny/698.json delete mode 100644 public/images/pokemon/exp/back/shiny/698.png delete mode 100644 public/images/pokemon/exp/back/shiny/703.json delete mode 100644 public/images/pokemon/exp/back/shiny/703.png delete mode 100644 public/images/pokemon/exp/shiny/674.json delete mode 100644 public/images/pokemon/exp/shiny/674.png delete mode 100644 public/images/pokemon/exp/shiny/694.json delete mode 100644 public/images/pokemon/exp/shiny/694.png delete mode 100644 public/images/pokemon/exp/shiny/698.json delete mode 100644 public/images/pokemon/exp/shiny/698.png delete mode 100644 public/images/pokemon/exp/shiny/703.json delete mode 100644 public/images/pokemon/exp/shiny/703.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 6322b8968f0..3a981a08fa3 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -339,8 +339,7 @@ "6724", "673", "673", - "674", - "674", + "675", "675", "676", @@ -383,16 +382,14 @@ "692", "693", "693", - "694", - "694", + "695", "695", "696", "696", "697", "697", - "698", - "698", + "699", "699", "700", @@ -401,8 +398,7 @@ "701", "702", "702", - "703", - "703", + "704", "704", "705", @@ -1469,8 +1465,7 @@ "6724b", "673b", "673b", - "674b", - "674b", + "675b", "675b", "676b", @@ -1513,16 +1508,14 @@ "692b", "693b", "693b", - "694b", - "694b", + "695b", "695b", "696b", "696b", "697b", "697b", - "698b", - "698b", + "699b", "699b", "700b", @@ -1531,8 +1524,7 @@ "701b", "702b", "702b", - "703b", - "703b", + "704b", "704b", "705b", @@ -2601,8 +2593,7 @@ "6724sb", "673sb", "673sb", - "674sb", - "674sb", + "675sb", "675sb", "676sb", @@ -2645,16 +2636,14 @@ "692sb", "693sb", "693sb", - "694sb", - "694sb", + "695sb", "695sb", "696sb", "696sb", "697sb", "697sb", - "698sb", - "698sb", + "699sb", "699sb", "700sb", @@ -2663,8 +2652,7 @@ "701sb", "702sb", "702sb", - "703sb", - "703sb", + "704sb", "704sb", "705sb", @@ -3738,8 +3726,7 @@ "6724s", "673s", "673s", - "674s", - "674s", + "675s", "675s", "676s", @@ -3782,16 +3769,14 @@ "692s", "693s", "693s", - "694s", - "694s", + "695s", "695s", "696s", "696s", "697s", "697s", - "698s", - "698s", + "699s", "699s", "700s", @@ -3800,8 +3785,7 @@ "701s", "702s", "702s", - "703s", - "703s", + "704s", "704s", "705s", diff --git a/public/images/pokemon/674.json b/public/images/pokemon/674.json index 9534a585c64..9954c30188d 100644 --- a/public/images/pokemon/674.json +++ b/public/images/pokemon/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 28, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:17675dc9d79a224d5cfe26d4ea11594d:afc8db52143597fb62ac44c9a1600a80:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 29, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 87, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 87, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 29, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 116, "h": 168 }, + "scale": "1" + } } diff --git a/public/images/pokemon/674.png b/public/images/pokemon/674.png index 3161096bb292cb7731df99d5cea4fad87ac6257b..85b2fafb91bd6f4cb6ddb59255bc659e5960289b 100644 GIT binary patch literal 1545 zcmV+k2KM=hP)Px#Fi=cXMfvT*RaIXQ5D>(o75+_TpY8PKmK#?gl%$ah^*6W{@;pY0FRqk7ZILvxp=$HC zLWnI|YZuCx(@7dJd(u$b=0o)tcLCgHY*zJqNgDYkn>$%({k7Rp`$|X`EaGX5q7gH8 zhg;Upn%O0#yNsDMjoi14@VT7(Ot(~YHAIbAX0F2J_jmf9plHN$^UW6g{d&DXDnX+d zsx`M?MA|LkLbFtR-`Ym({7i9|>X#6?aTFIeVwWwKF<0AI0bKd=Mm|)yo&LhDLtAgq z_7p>^UeG8D-CZQ#>!GNKHHso=#Lm6;-eW)bvGe^9Qk%@UDZW+rY7|3-tFrIbbU*eT z*2P6N(5Mt+sC)Ow-J9Aavi~9xQT;+1SYx>Hy@P^9ZbVhq(1bQHHU z(sJ?ocO^eOTgye3-+YMKL(JwHJ;dxGW=k49#OxtvOBy}I>>*|kG5ZgRnb!SAtBINY zpy*3!HCj!~+`)-;G#bqjGo7ojk%Xa*MpML0Uf^b~(fh>A|NhfRBVqDJ88J&wZwbY+ zUzs-%{uHa!6{aO#jV6d0)CyvDYnu_XtI=v=W-{?1X67MgY3oDGlK2p_f0&q|ivnJu zzGUzU^Cf~;9bXD~)$t{OS3O?}c!m4Yz$@IB2wtJSMDPmtC4yI|FDblg`BK5FzApj1 zLVd~L73NC@uTWnqc!l~B!7JRC243O5RPYM(rGi(uFBQDPd<_IMYAL*``9f-Qf*BPq z?Jt_|&l<71uXu5-VXV{D&ySPrO`y&+x`!bpsAx2F znhn-a(QxP-8?2+E@zD3#U=tM$hR(3THYyqlonnIsD(Z*MvOxqDbwg*_Acl&1q0?*- zLq(IJeG-SEqE6^M8^lo2Naz$B#8A;(=m3esP|?6^I>`nRRMZQdXM+eT>V;0TK@1gj zLlIx>!Jw$97dp)bF;vtEoo9m(6>T?EgonDwf1-AarU{ v42b8oB#u1NdzoY;E+1z#bDF6Tf0d!JMQvg8b*k%9#0Z&Op zK~#8Neb7N`!Y~xT@su6B_7N2IG=?9*5`?+q@C%fZIge#5?5K=U%xw%yuOg+Sw;iPP zeabzZv`HQNQ*!w6c%)&M64ut5USF$D%60F`b%j;g)t*MIaoxodsdr(cc)(M2A*U_g z$mOr%N7U*}N{#2LzcsWL(1uGJTlN3CxAry*w59zeR%fhdmhuPum?L$_H?5Ab4!I@` zj!Dw!mhK6M5)qF2yLp<#kRCB#h56oZo)%3Jj&qbzzG{$pBV(jlnZw-B6jq8ej*6&v$rhc&ZvQ5Mx|=%C?WNwUK~|t9jMsZt4<8cRZkHBoqk7SpLG^6 s0-uhUyR#x7^?2Yarzv7!P5`Xa5B=PtiI+i&1ONa407*qoM6N<$g8N#-Hvj+t diff --git a/public/images/pokemon/694.json b/public/images/pokemon/694.json index c770e137915..48e9623d7f4 100644 --- a/public/images/pokemon/694.json +++ b/public/images/pokemon/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 41, - "h": 41 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a121458917a5069ac5fcf0438e46af2b:afcd331d4ef231f539d602827ea66e55:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 282, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 241, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 171, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 85, "y": 170, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 227, "y": 93, "w": 52, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 52, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 50, "w": 55, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 39 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 56, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 0, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 56, "h": 49 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 224, "y": 47, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 281, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 168, "y": 0, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 56, "h": 48 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 281, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 224, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 50, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 281, "y": 92, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 57, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 112, "y": 49, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 94, "w": 56, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 56, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 170, "y": 48, "w": 53, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 53, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 126, "y": 175, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 43, "y": 138, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 338, "h": 249 }, + "scale": "1" + } } diff --git a/public/images/pokemon/694.png b/public/images/pokemon/694.png index 2659476db8ad871f02026333f4914a15575c22ea..fbd210e7d89d53b6b449e674aae79fcf40368895 100644 GIT binary patch literal 11308 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 iZT~yh|GNRp>;C{AjM#@aV|9-J00009p*RN zXdm5u`9V|ryQ}-+ZNA)21JTgUQ&H@Pqir;;!+f&&1b|UX7l=32P^6s`jX{fp7P&n5;I-5Qkd)mP`N|{a?=OT7B7T$dB2Rs!8hlsvlx9gmlo9 RS5p80002ovPDHLkV1mkp(G>sy diff --git a/public/images/pokemon/698.json b/public/images/pokemon/698.json index 34938139984..6baf41b0ce7 100644 --- a/public/images/pokemon/698.json +++ b/public/images/pokemon/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 57, - "h": 57 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:563dc7193ff897a6bf95dc8334febb0f:0dc4e9f203f0efed6323a93621a24f2c:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 152, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/698.png b/public/images/pokemon/698.png index 2e00f5693a6293f3529b97e40c4f4c7d22cae159..d9e638561d1a94e97fe8e79f8dc6c7d5b79ce238 100644 GIT binary patch literal 3661 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 fCrk44ofy`glX(f`7zFr)xB_Vb z0fEgWb@HVP6swj67dGgvdt8IB@FJsh>Z8{{8zmvbbm` zNKZ+SUogXeRB#}m+Zkv_o2QFoh)3t%tG6c|R^VWJut0I@s1?QhD{Z(6NB=T<>pZ4OD-jf~~NS55P_AHj*Ie4~fZrwD)EoYR} zuk<(UwA(56=9h&;(YL1G1`^k9zUI|7ib+^8^>9#%*O^jHA$?8W+1iH3%GRA@-6Gia z=E6=Nk%#wYUy`+(KQl>$UGK_#)-L@*VR& z%~zF{e$hXL=Z{eR>oT{j7n8DmI8NOA`1g^)N{zD}-g4o-9@Q5a7N3c}#WdacTWzG> zH&co4pA&E1to9RIz;Cxyuf+G2l;o;udFqRfbIEh9oHX6ed9h-PW2DuWrHYF=Ee$n1 zEkvzSygCC`_O7}dyx*wPA>#DZUlG^$Ds8zReaWhL56=V9-&2lAR`K5}*mG^l+9JE; k)UzCOjHmxs(AinX@U=wNI!sDU85mm(p00i_>zopr0Efl`A^-pY diff --git a/public/images/pokemon/703.json b/public/images/pokemon/703.json index e160dd32d25..5c0a6230108 100644 --- a/public/images/pokemon/703.json +++ b/public/images/pokemon/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5da3bf1b2b82712da609c628fc886d69:7a2dc2f1f3b5fa2ee6b04cdf4c952277:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 74, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 35, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 70, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 35, "y": 153, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 111, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 183, "h": 192 }, + "scale": "1" + } } diff --git a/public/images/pokemon/703.png b/public/images/pokemon/703.png index 3f3767fbc6cefdb62c569ede605e6fdff40b4e0c..ea231fc6c09709d189ef49e6f7390023265a6f32 100644 GIT binary patch literal 2403 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 diff --git a/public/images/pokemon/back/674.json b/public/images/pokemon/back/674.json index e280c324a0a..cc0ead50962 100644 --- a/public/images/pokemon/back/674.json +++ b/public/images/pokemon/back/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1fb0fb4f4e63f6114c7490a9d4d536dc:9830bfa81d721fc889ca0580935f03e3:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 42, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 83, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 115, "h": 122 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/674.png b/public/images/pokemon/back/674.png index be77e6e159886b8ad2808ba2a089c12920097f6e..9a9d0ec59dd2ec393a65c9777940fe3f0ab06357 100644 GIT binary patch literal 1509 zcmVPx#Gf+%aMF0Q*`R&40RbLPg5X8BiGc!MMYFL4Rj!;l$At5MZzD2F1hyVZoHEASE zku>gNLI3~%pUB7&chZbJ~BVbVMB;gbjB0{6w^`d1@s`VT+}n%d&jtc{*3QMZ-|B zqi6W~`rK@q=XpQ;Ob$cIV$ZNFVS284Km034hoNSvXP65bmYsfu936z3<({vBmgQM? z3~F}tEC<>*{=iF$jzZ0H&-uv`UaqoZP_v_FeEeiZ*-@z3)$_GNt~w4i`#<%ZL(pZr zpk@|75?gfVF*yu@nHXqaA31Fg1a`hx8Zdn(4@1pN&O7C^&oGoM_Wb=v{J*#V1{FJc z{;Fp>UzrhZL-6+>#cbdAm@Ieyta-p?`TqW1*EN%F7!07f-t(qJ70*vCh|B z)q#@PaU%7S>;C8X`+4s4pk}r|f@JI;j%`}P1+SAQLd`6G1VS>cbV7(QbiyqJ$t*)Z zdCb;=dEOU1a64%EB__%q@Z5&f{lN|xzrcnT%-K3<&ym~7tt`8Q63+3Q9GXxB&z{S3 zB3*WgJMx0Z`>P2>@a%a{gk{$?l=Gwyla#EW2%bIfiB#D&t^I9W!g%=Fh9Y?NoNtU} ztGerRl~4q)*U)1kuWaarf}K5I6IErO8`y#&A5isd1g*2|{;E35uCM?0`DHg3@q;!{ zb}QHQlFLQhpdsxj`|j|5$v1+Aw5M#@p(kiayUU_FdI#&CdRkE!)ln;DjC%@$9crhH zaaUn&huSG)+))_qP%~wWox%&LBbhSBT$t<-jAQP!x-i-y7{?f6VX#AJvW&4)SlS^p zS;m+PYdeG{%NTQEZHLfg8DlOSA3Qm#kUa&hiFfUm@;|}Y@ z$lPRF9Rf&urPk+=lXR5I6$J}ce)Y#R3Ral|qh_as&`N zFooDju~NY;0EA8ol?rTuvpeXd@b)0R1>WwUlR^OmstSdZgR~RrBkcBswWlDuX^M_oPFlaT)bdsV5#1)a^l|J}UL(L*(s2fvl3Y zSb1*)h%UH2NN&Mn(w1;K{g6HcZV!Sxq`+crwX3OZ*3}X`P35ERNgEe>Z&y>L_3c5l z1=?a=JwbH6^v2RGTy252SXWOFU0SKo7U)Uup8CnG;D#_ICRIH_jC4sSypgH&L+wM* z4XKo#^z6xp6m@zFlZfecHTj@!H>4-+b2a{=R4rn9Tuo2YpQQc*0T6r)OZ!ee00000 LNkvXXu0mjfvWV6h literal 375 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 N002ovPDHLkV1i|;csKw6 literal 393 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 literal 473 zcmV;~0Ve*5P)1pw6b4`k0$O9JLidmhsH5saBL-P-k;nR}@eqz_S>zqe??Jx5nIvTtFTvrq5giqM?#HOzCdnQ~* zVi&Rg^gc&c`#xe^l2^KbJrkb7SmJx(8gkdp`;)Fa5=G-r8yl8T$XqkC_T72EC$Rpu zF^)u`1MPr@LMG3K7e%762r(3Lq?l?1aXYI2B9qCsYyj86rbDh68!|bL zP$Ou@Ze*%k5mx;Hokp!!1kS?hN$jpl=Qom-nrv*$PG^ToQ~er{Ba-47K#n1?Y`(~G zf|PRpkt4t0atXW*ARZP(2dyuqAn*>?>{O1aHcU3_FR2gf$fYy{Zrg*zRzFJOmq`?D zz_z83qbwxu+c1zAs|&LII9`>6EXkhdc$!Kap#tVlCGJ=ri}ME+PCu_7UyHJWg&)D0 P00000NkvXXu0mjfrbp2X diff --git a/public/images/pokemon/back/703.json b/public/images/pokemon/back/703.json index 4afe5c3a14d..d6752e6f7ff 100644 --- a/public/images/pokemon/back/703.json +++ b/public/images/pokemon/back/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:32e6c2d8721f80aa2afd20f97c5e4cf1:2c61f7a426cd2d739241c87d6ab5ea99:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 110, "h": 117 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/703.png b/public/images/pokemon/back/703.png index 1f52ddd3afe8f558cd02c43561e45dc2f9f81131..b5b35e07027c4de34195629e74d0cbaacceb0839 100644 GIT binary patch literal 1190 zcmV;X1X=ruP)Px#Bv4FLMF0Q*E>LqvM_Fl2rtE}uR^vp?Boo==nKU6xMU~cO5j$a-*|yEZRe4q+ zQFw!4+V4hF@mTJyxz|fAmg+KPF+yh?kusJCu@k^TubyPXX0}(Q1^4c`YeWU8Y%(x1D-T}8-L)`;KiP)cprLU$r$%ETH=n(pa`1U zy=wotDFj8#)IKegMC~_wVCr6GRr~PGKNZbQE!Xt)Yth)02>k*obQr=_^wg9JfxZJ3 zLdsV{cM)B=M%Q^E3h~_UKm{G|Fpj_iREhizc{n65={YaPOBg#ueiwwm#qR0`rw#de z>A-noyu`mczlY)bFD8zjs8#h%WnK_Nex2V3B%mh}sfd{+Ob?7GLa|6RC2SPYQ;K5(H1bL_*u~1Q`tK+r# zU8@Cxho#);wT(L5kNFWE=veYCVVmDmq-NluI3F}hUZ#8bz53Jvc*w!E*Mxf(FbMfm zjR}uqG)?GyNeNV7;NjYYjwxM_D^$SXVcGRSNPb7)0fG*l&i-+JN8o`q3gmYN9w6vQi^ut$fd`0a z^l04X_lxEaKnLL*EeUuII(qqis(IR|oBYne18vkazq5=_5zRcmKgjsgCXoCN!2@r? zB)>yCL7IT_I|C00bfElB!2S z)&!K_8F)ZVKv02$2Ve_81qvPj==i&Vn(&v$`=5AG=xz^6jtJ@i^_!_#x~um%t%yD z8jU(nDl=AZ;%+cjD*Yuk}zmY1m&)n?BrX^MNKPt>J{VghHdRP!(1a9 z$GLAvwo^FFvT=6RQjB|dl8aor9>EN&pMuFn@G0gQW&87`Q1_T!8p@fwGtcf;kPA;l zH-`DMgiJzyQ07lO3Wg;WWOoMA8WOH3R?b)I;yx+m3O*@)b0*dw43rU=Rk!6*00000 LNkvXXu0mjftj)Dx diff --git a/public/images/pokemon/back/shiny/674.json b/public/images/pokemon/back/shiny/674.json index eac9372c5d4..cc0ead50962 100644 --- a/public/images/pokemon/back/shiny/674.json +++ b/public/images/pokemon/back/shiny/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:efc4d9ff714ef5249d5ea29e541766f9:c21489bea9a10b1521844e4efb4735d5:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 42, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 83, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 115, "h": 122 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/674.png b/public/images/pokemon/back/shiny/674.png index 96734feb3f7f64cc522f611cc7335575f74619df..4617b03c6ebd59ac2c07bd5f2c84264d37769099 100644 GIT binary patch literal 1495 zcmV;|1t|K7P)Px#El^BUMgRZVfHN}?5D>q=qfH+laB5hYYg}eWJs}||W4=YLq=*0i|21hOOOZ70 zVnILosF(l%01tFhPE-H?|NsC0|NsC0{{a90|0mmV-2eauJxN4CRA_JCn3mg_bd@(D@Vj?;W8|>NBmSu{x zHS#cQu%f5!KbDTDql2))?w(6T`XP|9-Nf>?qXi>iJqBR~?6%{hxYHA?UJQP&11ki7mSGm>h<{ zOboQIMNZoTft~M_227vH!%#Dm^IAUp3`5Cc&)&N!&(F`gu99TX&krzDPUri{2 zXU}^gEW56uoF{#lq+|s}@a%a{q{^;o?Qi1}#>3Y(6v3-v}Dgp0Z_!o}eM^E{p2u9jtrmX+>dFN3E1G?kNm*sGTy#U4^wBYNw2GM`5%> z&6F{A3eTjDWXc$GVX{Loj=9t7!f1zJ9Ak`y!49FxGR96}X@}5c8DlQ2?GTzQW6XuM z9YT|3jJa_9;|YqM+GH7HF8sc{oGw#?Cd(N6g}+8uPldlOoUdO0ea}>w>=2r)cF+4- z8w!H~LX))_W7ba60HMj+uXzzW+Np&so+Z#^8DlIgpEf6@e4m}?G}KPul^_K!HD%FB zNv{-_Oc`U;PVvm!_DVH+rVKG^r#(1?Vo$)RowhL)dlE+Nw2h(kUeWkAIH4hr(pQkC zS3+c)_ElSUIH%xf$RqGd8reNj3#VNw6wr%GucS?uJvYB;qzdKozGwrlq)nDF&J&+4 zD|rN7Nt-NVoYGI#P`>lQD`}HujB`(^fWRwhlVyyXJ%cFx8b_KeV|?`#3JAQCp46NN zlHyVUfmhPVoaDKMLaKmQ(#V`->k)_dKkml`yK@8clJz6*uuhE3O{Uc$fV5X?eGWNE zN2y#TpslfIw9#s8h@BKG72E57JxU?G8FA6hNS=P&heGiUkm;DiThPlOj)p4osm(PnnKgo*lcSlOvoQ zCq>Q#9T*8G$4QMzCr3CrPHId5Ir4}7(6<8UU-bO?_8`3l#YH$eDXmms3moCJc}_|y z71#n#IJr(rDiyFwo^bM=RNYXRp}6cgE3t5LofH@suu3SLJSRoQ1yvOw$4Q}a=~q?L z>zgDxDN-tfJ}UR5L!@yT^--xO9um~;L8Cq@_2fh3?LmR8lD1fRZv%)fxIIX2!DG^v za60{vJ_K$Lf;*(ZVr{jnscqKP5FFoL9_+hVqHB!biMS(+$>ye zfwovzPY_*Nsn8baN$;Ne!K~nhFeN5cJwc3gNhiFKsq{nbL(mPWl%DkL$%hnmdJB_? x>2)>vpl&y$C+%}J{-RVZVtQOnPt$Kwe*w}&MLwvHdjJ3c002ovPDHLkV1fXd&FcUF literal 376 zcmV-;0f+vHP)d01xJ0# zwO*7w4kpu(kVs>uL6Vf+}e#)h52I)fBT!Ezl@c*ha~qob`og^8>6LKn6d2 WGPx#Fi=cXMF0Q*5D*Y8EiH2*B0xYuSy@@kJw5+SOwG16h7U{n|0 zm6iYUrzN;N8~^|S5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV9E07*naRCt{2U5S$0 zIE)n~w=E}8{QrNu=8cmC=c&ab4TuSQot3m9E_T0~bHD z^SWM(ceqwDdaHcBehA%oYkKeG;(zR8H)hGx?8dU>&!C%cP44}nkE_Y2So6b**L522 zjBhReqjm$Fs2zS{g~E)o zn|ev*xhghUFPiL@+=}40qniNaP+T^BmjbTE)Jv}G*RrFZNdCy0R_BuHBgV~iQT@lU zty-b0j;^Hc$C4g&4KuUclo{0Yb%ksPs^q9(DxdyhT+&!^RMTr0HLix$jVsOe$+Uh^ z1i@|4?^*%4h%hhAEG`${g0{Heq))@@D7AM@5~+llq(GAYU0$~F8qxuz9~!Vi@V9ou zmh{305K(j%m#ZyF*irFA$%R(KoJb3j-4GC$g0@fud#*{o*PS-PzuzAuJ%Y0ja{CwE z{G=!m(Lr2ZEYR4|%iw5R8W$v)PG~QkYd}=W4w8T`@K>M{WKfw2uj@>y-S=%AvF;}D zbr=^Mc%TpnH!TPtTz4iAO(okL?*=p1NF757gd%();E)1tY6SJX&hv_Ysu;XCFoD>b z;?YH~vgKoTm4Ve>ugmBthsZ1m^Qicm4X)xB5Jao@1>~-RZIx-l;Kubb4DKswJIfyw z9bl3GZv3fBo>fxCmO2_^`j%|AUKhVkhNwsyAR>~@;49hNMTI&Bi~LoV#i+N#3F{%b z6A34p+%K5(v0gePDcF;3rzGfh3GfEv8K;UNqoc%M=BUZmOe9(hAXbUD#Ee4S1?iNg!BFJ-e$A zTu?eMgxy~3~-WHeU=xgLCk-V&uXl+J0RBIq~Rj@VJgR|D5<}Ai& z&*tR!=a(DFpvn6zqW`m6J{F8Mts+ z(q%z{RT$A0Yb05-x8Gwk>0}T!SLMY;GPnzxjBP5pts7aCxF`+FOI`BE*3xa!5=2a= zAW9{{;y45s>}s*KP-VOo7u2de+5QQlC@di7$&-bPiwao}wphSZvn19T|H&Zv-n3lk zuR6HoLj(KxQH&S{g_IL$EUWT3EaJ1ADr#}`Vv<&fsANrLic!l1XdO{0Rck3{noe2| zo79D3g3AdI?N2^|MjRIDkrMc4(NO{snWL8rBKTmBJK7|BAp>C{t0dcK0LQKuizi#B z{@(9M3a)1yAtZ@4!bKLMTQ-+)-$9b$1u&wHUhq*q^Hr9tI`N``b&_QXBn{eIBQd;5 zj8E8`k_IliCLH&BP_~xs%6;Fn8yAuM%PRoM`T9HjH=GS6jf5P(Hqz-MK_o~@158qA zZH}O}U(INX*pj>Fo8W80{XGJ?5ShAv?O$JSc&R9t1ao6#NAmMt{3I3SHERj_TSPAo z(L^$*5q;JtL_~NMmSo31i7F#R_k-RZOtKKZZnv+m$8j87GEljB2F2^5EN~R=nr4y& zBA9=3Po-R7f_T-JWliIFJl=8-0xo&pA40et_s0WWmL*A8E*rQkE@~EuqN1b)TWoGG zV{F%Xaco%z&c^XZD1pn+-8THDDufh+mb^`pzoT_bRQAlG#*M=u8oFW)XQ{wAbQ9U4J4H;x)`|odwuyTZjNOq<49;F zaPN<4Mak&i%k@q2A=Dze`VzIGvD{Cq=;-TyIvLEHcRUd?|)YPde;+zDFA7RNF7Zr5VWT5k*5uE zlx*Zi)p{(s$>?UC$lAcIje41*B1k&8v7j81%-yjPhJy+okK;BG$}3>}gKZV6HAU#X ztneCk2vzL5$WEi^vidQpK8*%!h<1&{Yt9$$MCWiUe!v3bWlY7YrsrREvDmrG_QT@paTD znT1;#IkTvWFUW@DZAAO&_7j4ECUrE@W-Ja1gJ@vh{zbIflR@y{s3{m_&BAdVDq^=A zL*XX`lZbV?u={=@xtK-kvT*O<)3+*^M3x<0pJ*Q>L+GW+pGf-nfFV5i^}3@UNPdtE zA0?79@M}Sj;N)rJy0K2lNs#qR>3hv@AD8LTz91(*C||bMAxK~KURDQC|8?s}STNUU zD|zP~KDYOf>41R~86O$TivF!_#O-W$WoAK)1?NO|(-i50fjDtIxy6|s z=t`O3Tp@kLX^M*W%-U-&>cca=sOM2IilVpNKyt2=g~b+5;eCrOD(Z_G%Nrcs-l?E~ zP$$U`MWu8wzQ1O(R0*fjZo{#i`lwuG>}KE~iH@=gC13U8khAJ01y2$*=@cVH8dYlc z@CrtwLbfoHVE-LUepbdu_5!?Fg_7q*SJ```=)9HFf%n_kbV|m)u*!C0@m|zR5SJ<_ zWhV!h?|8%-Kpnlfc?}^tAF(K+=nz+_BzDEDlX}Ti!oQ1Ac@fL%h3N0Bs)OIkj%pYo zM+w($h|oy%gaV2j{`yy_whC|1a32G5HNqOg$Vpcx!xyILMooV9Iky)q3PGnEyD&>E2j z5v`4Ow6PcbwTMo1lF!YOmnT9T|J1O>DQ^};Ih|xXC%Yqu?7d{clM23MgeXQY!~=(v z7-}%eDkdoF6s^6wwQ!0;H`9NcD99nec2@=Y2Z0V=VV|D}7VwvgXVHt$z}w{vp^ah0 zMTy02sx9ff1UI`xYi7qff#ih+Pb^BUZTQGqs|Yk$z=#P_u8Cx>G`j`DlVI=%Ixiuf z1{$RLg#bfA;RA@*(PnTL6s%QQn=7JH8rgIT1x1m(+B(~c9~D%h0_P1{MAz(H6J(3N zV((u%Tfj`~YnNRoO+Zz$Sp_HdL=a~m+M#SPT$cIL?f?Z9zH!fcREz-0{*o=Ox2<*o zYrz6xhzk5THnjFaUp=IJ35(3x1nBZNLzejUr7L`pD_Gh1Uvm9*{e)xgeUL zL}|b4gwB28&!Qti`bdNN*^4e`USd)FAP%UMbV6hG6xsxh;1Yrn0zkmFUjk?L9tU)E zV+Jc2B}pPkh?gW6=rRh{MkLFh0K!7_!h(X%xyoYgg?yAE0I~=Kl(MSfHDFB&Uvccm zp*hMhs@LpEaL0lh*pyRaFO~{u|IlJ8KjzGr?S+Pm1i4OGrTAbq(LL4OQ@zb-EzQ!Z%=+qNFJ_ zT-+c%q@MGKC|u{H3;8S23g7TjKMgFPNIgm*^?%ANkO@Zd?}2n2i+p3S@$X3=j!f7% zCZa{WO`=M}rN(mVIjfs5w%In&T5~33V)fKd*>*%6t~^K;ql*Yu>omS`n`bm>BBNp> zvJWatz0DeD9OtYO8%uVBR$6Omx$nk$`LK{UTuC-EnVT*qrKSw|#){1aCMr8=<5T5? zYYCp{OB0Sm=6gyvsqkW*R&)^`;xS4h8vm>o3ErmwK~W-W=)Dgj$N3o3qxVb+gXG^T zdRUp&E5>%=if;L@2_r-{seEH2Q4fh0is@XKFk>tn=S+4lgzV0KYqZw6y+Jf~#nEJ~ zC7`mTRi_Zr!}5hHfzpR&9Or#6YUTunR|AZ*|FDRz}gx2~KeAqI`W4mV@-+24=yRAts*}v~MxFMe!Sl6M`? zKku>N*7I51dg6avyIYj}{rk6DFiCmk60|onytUcGcp-Y4ThJx(pQpp0KUuJ2nUGzH zRe>m?4;LxxNNf#q354J;L?=BW&D|k2HfTiP?K~_@hElzIh)|##x4HG zg0A!$dfVs;u+od^Wab};QANjuE|5H*=lKTse5TuUbcZ*I%FZMi|GWV*qnj0;5#W@! zPm^HG+w+~a=T}MJ-I%&GDX;4#HQbT>Mzi@3O~9eOPZ*U1QT|ivMXMF{o?JennL#Sx z{x*X2L<&n?c#Z=Z$9~@40`bpRs}56Tq=#zjtx+RRVn*8vrh;2qM37)kM zgBj3^4wNsDiX@pS;0g@}_dRBV(h$;AH;{>n;UC_nY8G;iYny5Y9-cW?>a3A`XxD?_jo z3Tb;T%3XjFwDj4hH=NvMOYuh*guY^UWo$)|evdvGJQcY(eoxS4uNd#?iQ{d8E^eGA zyiLNhx?m-K>KL)v4NE8emEbDEmVAzDyMGC#=Kv%*7k+ z^{;SbYsVJv0w}sCX1cQ9efKdD^4dH+34 z-hwTDC*QySH~#k2(Vc<|i|z%mt*#3Q{URII`dJ{8DPj``t`*=D!A8J^SMiN3+yi2e zo*CIfjXCI6HXHz2AowJ8cW>YVe8F3Yw?F5(E9lNhrl@q#eJ-9uB#qeQeinFhTR9R< z`^aBlW6)|f1QMXu{w+%WdNPdSr`)9NtC9o`TrC1t*tfx?ra)|~q3{h)NS}*kaLMOg zjxG6)7hnu8{UnX(KDSnZ7<)o(NDK}XC{UB3`?Mr7N(9KjbR{4Oz_Eob56T3!{EchPfrglY=B=VC|eAYplV8YWDafj9^O{ z4Izl&76v7JaD(Axq{K10G_3H6IJ=FiTeTeYzzL-$>CM^Mb3IC0#6e{n7z0gQ= zzGJKLVubhXl@gXYY=}WgX`9Lm3p|8$s8xaM23tmzH8OeX{!sWP?A=X-Sz73meb6# zKE)<7DwoVcgycI0Ff`hd_R@!O3=|fIiY>&7w!w?9e2lygT*K;w_aFY3d5|GZlWw)b z4}{OpxvTgzKD4T(%E?8RSr`X9x$OwT$}hyzuTeZ#(cC-wdc6?mQzcNQp>^jB(`ZvF z=K>3(EJy4ZH9=H*AK}!vx0A(~K4YU;W0^h{c#wIJtU99u`J?OrZE`Kk3V^F+P-7Jk5;iTw$;wA}kE6 zhrxkZ7^6#v$4J@<99E6#c}=JXi+zYLwRg^gtY;*0#SaI8$asnsIl7G>qh=MOzoqH$ROM;*dP$Tf}Z zd1ODkjfpND#`ggmV)5|5B10zk^f@BzPN<16VHTs%t= z^~etHI>lfSrFAyMCujH-eXwThl~XwC@T0J9d3E;L+JEw^b1@sfL0=TZyu!gv$ZtLl zYjpNYYXDFrEd8;XaBjZ$;k&Lb4g1xZ{d4U&lKYE7L3-t>hSE86P#d~*Az z_g3?$xNFMZM*LWTcdwn{W@86;n~UceJx%Zao4a#?M*P^F3!9*B z25*~FCDmQucOc%+wQ^%4d=UmzgY)Z1xj#fJCZ3=8A*nkuwPDsCUV?eLSUiK<)t!n< z>V(tVSj>{L{zYnW0~kFXIlIGP=VCDF-P-JSRqq>} zZ#EOcjX(JrrBdW3fDuDuj$;+4`ocaaV>`_B%Hml?H)ESuQ%Chi302WG6mIdGzIJ`n zBXSe$-fGka61G0m*~s?_=Z>3$5K5=(H{-5a!w|9wL+ZUgVf!# zzX)86E}f(}8sz$ktCZQGo}vMhSqLV)a=?(1ERZUvVP(Wl!|6T9r#aVvO;QvM4(`a+ z9W~$EPSKzgDJl5&)YZ!OY_(t+WtpsqYamk_0>T3W#LyY@l>&~W<-`w?>^#+3i5?B1 zat6y%j4}!*)M&DH=njo)fH*QR8d5NZt_Fy0Z$TcRi>H=&(u~ZIlJ7<6EHB1vj}Xp2bqoRUHkz-z3npMg(U;rmQj( z6rReU`~I6)JkX7T?Om+i>QXG>J0K{qXC)SA`{mPM@KJawj7p)lY45wr;_(tq;y7x7 z8C37lvdRv-aj~?5m2#4=zB|t**)vb2$v0|))_tFv=4&);sXowNH`RPCw%%g>u$#?I zHL&x4(r~wFE>+qUWq1|#LnIyrZN#S@09u8tvd&NaIi z54&-Z$#2y)E0&V`YuG%dExf?VH|3#6fI;iRVt<+W%Ji z{3p6RF?X8v$?Wz~^dPZe)~dSS9Dxv2;ZF3SE>Fz&bKNZ4Yhzf>9BUILHjK(j;fSO^ z(?GCM``>!w{Xmx|=GljGvCk|cIW}1X!e^%N;B>kTT2*&?sjt4bkB)f^bva{>?Q*a{ zY%A+x^cb;W(1xC_C4q2&OM6>~x*Rcoo3%5u%)1`b^~IW-GkTsj^l5^4>V!mh=;BQV=%xn#w8>Z+9Pck%cMQ|L&U3#3a=<>vT%`8yUr)0fwfNJ)>`>=M7 zEW7KSs!M!;CVUechZXscVs0|)*4E}ZS&wQk&J8i0g1nUzueH|p+%6#KQV16!VBcsK zujzx03%k8u&!(0sovQM+E^v8Qwnx=B#vIl3$%5&sXT)WpRaIk{$k*DKQ8(U+K2l|l zxyOY*P)#56dE&49(W{oRR@I;}OcuQ8via!<*7gmm6rRG2U_%A;1#{K!;xi^TD1@9c zuNlR}#EfDMT3L3i$`teJg5_E$#?aCxy04xQL7Y$RkQ>qCu;J7z=*+>z&C=j2kw&U4 zF&Ak_m9RB(+*+q)R#ybqLaV9ybW~_%kA;anX)r8C7QbK3ptV=}ZmGwNp9?3T^1633#u8 zI3NoG1tOeMr@J!H=??jws{pR1O1QT7^Ya;@uoO0-rt54TNEn#cv#;8~{Ak}gf9GxJ z8Qc_yuhP}81;Rv9LVe*qTZ()V?-QyNXg%iG`8M@NGh#1!l7FT(z5YA`SEy&q7}(DP z8;VIAddS$8K->p`n1BnO$s%CeF#rWz6ZN3$st*Q2?X?|TyXBlp_b=7(RzK)YXL_AP zmU`APrb}hOl*{UMAFl_kzp{X|*aRu^qIgkH9V5 zsJo?}K`9B{u4opC76_elma%bKp~qal?boehAzR|uGJddM|>7~c3`nrqaHNCLRmJH3(>XbMn-|R)u}eo>+f4K z?vX7}rUs85UMy62?QQ6s1aSySjz%WJC?pk4*PMFLIUo|ik7IN$K{@BH!bJ%uwN8UG zKLiR{joys1N$eY<>*WLB0|GqYZtP575NzZJQodPTmWH3mkDG2!s6n(KhrC4;JyXZTe#FBq5>XeT>(@EZ~Y> zm-Bi23BknGw&{zx(=1#}=M(+EAepT4Jr-L0J*rmB@~s}rBooIsMy>HZayPbJi(A!- zS$#iXnCMGM<>3&l@=JOnq3v?Jnh!WH&WY}i9_*7gUTnIrqQnx!-TvM8`zqV2jOEqC z6jI2lnez=?*+-OEd+F_3ApgN>Q5majvK-Rsb#_*bi|HdMv2|lR2nW5XcKHyQg)(ht zc#$sjQC7LKPf&7#^HK(VghO`!X;NR7IX;SE zysI%Uren7*>Tjiu6H)rm^*PwTse96eF0ek#MNVwISHNX`$Z8DZU0Y%}*a?zWT)c;_ zbV|f5qO8MD>rM5rKIU5PS|1@+QwoUIh}=WfFE(0)N3GrGywLAWV~eQzRm8$WH@P=; z?Z63SkqKOCiylKxPH+*5;GNFKbDLI|uC)c!)rBs){RzRu-s3MY4t9-kz!Kxoi_LJ* z+C5^H?Vjk{ds9Vlt!?_|CQZ8*dtS^&tKD&`j|nF`pX!HpwTIeZXMG4-1SMiSwos-N zaAnh%j+_G#o$qBhB|_UAtL>9QPT840HYGB+pHf~{j*sDR`I2$e;xBLrK5|>Mi1ld7 zJ^p4bIy=D+uJD>tuJel0VT(WK5XjyLu2?t_T#NdR>tbd|T6T#lk@Mmkz#Ww$&a;`c z_-~v;Ah)aw9l|ySR{n9)qgg8m18l%8!P9QxXdZb*m?YyIT-XxtC)HTK?;pdku^vsj zSLf`%!k}XGhf~gr32#R=&{SS_HKNi)CoS=?!A~VemHSS+Ci!Ps{X@)2sO;O;0df;Jso2X^r~DrIBR z2{~TWyc7vWgV+SWr9SCS_L-$0z_`IX>AUCP9zw7?DKbdj6yX%jknK7I&aN4UXE$XH&Knj7rk z3iP{8nCcy{4sVZWH&2|slHbMcqAz{5cb<5#y*>Re;Pe}yJ805`ivY^U_RaS-ggd$= z&x`wE2A9?sQoL(6o+F(wqOwlG@AjKwg~q?>Z9j(YEn*fv{Y&rL23lwYb$W~;acO<& zbG>6AaXE3XX}3=a=+N(d$OiBnDZ*M{HJ^1YEP@(U!hBX2nClJZ{C|C_^N41h%29;_ zbRio+$`q>;5Q<5Yrh_q}eUZDp(Tm-r9!}Pl9exJ6qEp?Bwm0k4Z#3UOV*{A`?mc{* z4;tvDn^bg<5wT20SFeo5=2U2f-x+h0rt8?68t+9`MzM^>vu2}szn~|he0Q_o^~Qc@ z98H?R4p~c!C00hgi85ET`vtRko73+_XM9`>Gh`ng`%&*=uS7oce10!G^E2#{PmcY- z)_JD7i~M5u`@5X^E-lNaaPT|Xr}|HU@O{qwdo5I_d8+>l^Zs{_?8X{B6#hYMWcAS>s1SeB+V3P8GSs4D=ZYmRmeb(Aj0da65S z>n(5kuV<_l4fC0!C%n3O3duH$yPl$A<`963NqJPLg>%Nls4Rk+Q(_jAK60W_kq`4b z5eNE#4Z_z=cf{oxMedq<&=UcjPx#Gf+%aMF0Q*vvhv{zsmUfx^8ZP>HYB#5D>A;%_X0zC+`3K{rzv0!OF_Y?*G5E ziH6+&vbX=T(s?xP0000HbW%=J0RR90|NsC0|NsC0|NsC0{}2^Gp#T635lKWrRCt`l zTTLb|65$@@R;hwrlPCUg(`V@VjxBUv)wOntkFM+ow@^H?8prti|?>&wr< zjXjWO?Ai2xg|3qah8gw`BjM|QADajs#;+sT#$v1KGt0vXYv`|AxI?;{<>16(s}aNj zLm;p(i|!Ghdy80UA<#uwiA6^Sl?Mky1I<{zw-zDf7J`E#He3H<3yN61b3CF84j62a zz005!1i3{t2e68DVl{qXfTO_(yK8h~5boX<<*EZ)%$B%SB$G4Ms{*?Rm2IP2t%cH9 zqI(YjTRsVNJ2KpP8UQtPF4Mh*f?t*peLX(PEkXrHK>8qJf!R=-v2+Wn!;CpSp_b+G zSemoqZ6z68(vfOf0avS!ZdG#1gpDrV@9X1HTIi`BU29m?e7E}0tagJcY-qBS1`l!6 z+VOQKSOFX`lE3#6gZBM>T^{WS`m`4ofYq%pE~~)@gKVD_{)~s-qJa;jZoMF%*(y8f zLfBJ>0sQmX@m7m9fgRS@6`2+3j*ozeIPc!TDr(E>60$xvMrHBtAy^EkgWK;j4%}3u@x*~{zO9z=Vm3lA!3}sbX9(6g5SMm8i=V*$DqSyp0-T^1 zcYm97Z1aUV%LKTx zFrmkrWVGw)|3DpIrhfxi$lW!0esh5ni)FE)=}ppsYi3LQJNCQa3A~v0fYW;~BqBj; zqI&uto>!}1-+#Vkx)J6AuTHyO9HCo|<@?Y7z7@JoFnuQxpo`li&)`pS??E33DF+!$ zXb4d9KBDx`hoK}71IHW`u-EQX|15>444(jdp;P_G^+t@3$Af>$ngDyDQ~hW70-QSB zN@dEY&H{lo7A)8coiJJO%g=EeSqszj7AoDc*QXm?p^eJIhrx^M`1R-KCqG#n)R!NH z?gTi#8hfB#9K;_D(z3$yX!xVOra(1cz@<&%ADNZ0Cd}@z{44YZKs0#_<^FnZlC9_Vu#(nhxc| z%Mlz<2O|hNQ0F$?ecR4BWM(C!gQ36c4fOW?_(Bs)+y+^u~FZ?E+Q!c|-heL0U?zS0OiF7cGmg0yC2v$sm zjmB=@dhd}g=e?^D#IVMvwA(6v{sPdMZnXN;0o4<_lJaA<~ZSzHrW4-A)n#UW`~>shoa$}$cl%dM3D z6NfrXUq68(;E4Y<4ymzI`N9$SHHSQDIYsw(9rC1QgBh!77U2sW(uw$BZaSaz;^Ui8 zE)nV{bRCF^@LJjjyRXk3x|*(v`4Pi#-Ns9a=kbX$MNn{;ctk zl`x#h>Nz-dg+nDT2NT4CO9@jfL9XK%T;Wj4OU44t21u7v!mL%0)$HIgxWJ+GQ|nMg z&B7wmWtA``%X-T6F<7s2h?Ehh(DEo@s84kap6hiEH731`n7s5TVN8M36%M(STrMRH zVN;rPudZ?k0{FaiC}AjF?A32LB;=(-3BzQJMfU=S(DiD?R>HKD5eMN4huE@b2HI4@ zB)VOY#SFp~4q-u?l$T45vZ#bPQXJ$AGYA(rgf(hxUdD^I5(efBKM0>Ygv*G{%hjcX z$u88tVXK3HZ|9#mWLromml6i%Om_-DeSGE+DkExvuoe%VF6R50L%uRnjxK<)Q~Yy> zd}YMa%OAT$!%p$f9rBeCOOFU(%oM-Cp-Dj*q$dbql=c@mWcGpRTCyyBFaoeo9Fm#o zDl&1upE=DNub`Zl;~6S4MV1BV?IvAwYcA&{TSdlhaWhKv7+DIjsnM0M;+i*9WYT^= zSo6k65r%VqH!6;ke2Fh2s3H^h1sdsYM53p6Gy1~DthEI-&+>&bGG3QeBzlEm);TeB z#i?Z+;k*?W&-MnkkqUWNE{-mgkjez4wlA8i=m#0uL(paE61_4N3cWyQg0vr5p-YNhmyxAM53I|o*;)l)I2XpK z;9kNwty|kwp`ur1WaV9I6u{Ks-?~H((FNVya5rd#%S6euZQGp1$wToA$;cjrZdId| zb6jX(D#YEi5iW#f5^T-0eyvEagZS=UjmG3cqX@bgCtBAKSGrlGrvb^z1$s}y5k0RsSsQZrm0)@FM*k+{7Y= za}*OQJDura;mCM2KXi>{l-~{4193*CYxM)zEbY(XY`S#mPwU3k5{hAwQH%U0WzjXR zqal{#>!_jzQ&xGb?AE&>S1+MEv8fmVsP0g@-ek}fgBD*|jkc=2ID5;w3;kB|w_Xow^TA+<~6i9>Fdnumu2j-IX_o7Bz0PGXGYBtp| zb}T!Y;|S?0e`0R9?Fz3&LO`AoW__03lYG%_=7caS`(stxuY~uEFw5K{OZ8`x?)c=m z&I+@t9hWEvRz!I!1rQ!}LM`@H>ViV}H?B7yFTpYBEg-c?iz zJ{6KtGV!8jXHjQM-AnK7$Nl z7Nefi1z@Nj?_6nDeF5phENTW-qtTBmYMfu}#$?f&D$Jtquldjfc(5N=)DqAm$4qo< zlvzcIO8}J!S; zL?k+z9?jTO&AXl4I@nm&-BYb5+SAxh&Mu>Qx@QzsUdhmTX%V4YM(OXW$mc9!qOOKOd9|I002ovPDHLkV1nj}H4Oj& literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^<{-?$3?%2XDwO~!#^NA%Cx&(BWL^R}>H$6>u0UEq zKwxu8onqCpyu3z(O`r0o9Q^TX*Z=*eHl99v>eQ*1e?R{H`}gFYrw@Qic}s%)f*JlJ z0bLfywLo)IJY5_^JUWj~eO=U|z|+d>(zx{f|2=120}8d$t*vv@>L1L|SC4$SL1#P1 z!=FFfIV{_kr*{bJ&hgg#QaVlkK<3|)r+v$x%Q>^B&J;csxoqjK2qz2ab)GH3y^_y- z%?`2@`5v6qEPim;89&3~^^G+);R)-uev`W4E%C>Aw+!3^^Ej_9al6Q&u|2?2 zgH`g`DNb$CCo5tWH$6D9uu1-Lou&M#UWLXR=RW!!jCg#4X_-`qU#a*X<9GE^uICSO zEPDPR_>M@5-FjVxzFXDr`czi`v{$xUGD)^5T&PGX!_Fk2WAm0ozipC&?H1=UgS)a_ z=Cryecf1Z~*>N$j;x6m!&l~qz2lhTBVH{(R_nb=J@cN$Qravg=25_iVDNPHb6Mw<&;$UKy5mp) diff --git a/public/images/pokemon/back/shiny/703.json b/public/images/pokemon/back/shiny/703.json index ee6074b20ca..d6752e6f7ff 100644 --- a/public/images/pokemon/back/shiny/703.json +++ b/public/images/pokemon/back/shiny/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d9d865fef42b5a28e45d32fccd741f98:96057dceb7fdf650f54901c6be0f386f:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 110, "h": 117 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/703.png b/public/images/pokemon/back/shiny/703.png index ea22e4ad5d4a22e7684785e4432893babd4a0b39..635d930e674e083a87568b2cf9ffb7295955f258 100644 GIT binary patch literal 1190 zcmV;X1X=ruP)Px#Bv4FLMF0Q*E>LqbGc;^@u#KSaWo2sk`1nalOArtcSy@?WvA>1j^1+;w@&Et; z40KXXQvm<}|NsC0|NsC0{|UrUCIA2g7)eAyRA_2rtE}uR^vp?Boo==nKU6xMU~cO5j$a-*|yEZRe4q+ zQFw!4+V4hF@mTJyxz|fAmg+KPF+yh?kusJCu@k^TubyPXX0}(Q1^4c`YeWU8Y%(x1D-T}8-L)`;KiP)cprLU$r$%ETH=n(pa`1U zy=wotDFj8#)IKegMC~_wVCr6GRr~PGKNZbQE!Xt)Yth)02>k*obQr=_^wg9JfxZJ3 zLdsV{cM)B=M%Q^E3h~_UKm{G|Fpj_iREhizc{n65={YaPOBg#ueiwwm#qR0`rw#de z>A-noyu`mczlY)bFD8zjs8#h%WnK_Nex2V3B%mh}sfd{+Ob?7GLa|6RC2SPYQ;K5(H1bL_*u~1Q`tK+r# zU8@Cxho#);wT(L5kNFWE=veYCVVmDmq-NluI3F}hUZ#8bz53Jvc*w!E*Mxf(FbMfm zjR}uqG)?GyNeNV7;NjYYjwxM_D^$SXVcGRSNPb7)0fG*l&i-+JN8o`q3gmYN9w6vQi^ut$fd`0a z^l04X_lxEaKnLL*EeUuII(qqis(IR|oBYne18vkazq5=_5zRcmKgjsgCXoCN!2@r? zB)>yCL7IT_I|C00bfElB!2S z)&!K_8F)ZVKv02$2Ve_81qvPj==i&Vn(&v$`=<{9 literal 417 zcmV;S0bc%zP)2@A&xmNaQbh00001bW%=J06^y0W&i*I zD@jB_R5;6pl+hN1AP7Vq&@%h~|6PIH(6r{E6z>5AG=xz^6jtJ@i^_!_#x~um%t%yD z8jU)SDl=AZ;%+cjD*h!lGjmVvvlE;}|?*-vzX5$W(957l~G%}`(V?W-c^zY>}zmY1m&)n?BrX^MU5+Y>J{VghHdRP!(1a9 z$GLAvwo^FFvT=6RQjB|dl8aor9>EN&pMuFn@G0gQW&87`Q1_T!8p@fwGtcf;kPA;l zH-`DMgiJzyQ07lO3Wg;WWOoMA8WOH3R?b)I;yx+m3O*@)b0*dwgV+x~Lv6oy00000 LNkvXXu0mjf?b5S% diff --git a/public/images/pokemon/exp/674.json b/public/images/pokemon/exp/674.json deleted file mode 100644 index ab275feb366..00000000000 --- a/public/images/pokemon/exp/674.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 90, - "h": 90 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8a56731ba1ddcc58654c5fd4c09d4b6c:7feee6e8d94135fbc956d541853811cb:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/674.png b/public/images/pokemon/exp/674.png deleted file mode 100644 index 68fd635ed4f9fba928acd933444354f0bfe90499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 863 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 diff --git a/public/images/pokemon/exp/698.json b/public/images/pokemon/exp/698.json deleted file mode 100644 index e0096ec0ecf..00000000000 --- a/public/images/pokemon/exp/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 175, - "h": 175 - }, - "scale": 1, - "frames": [ - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2dce35b74cbe50cf08e71af3768cef4c:e4d5ff1dbd47865af99315586fe42981:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/698.png b/public/images/pokemon/exp/698.png deleted file mode 100644 index 6d8ca55588143896d9a9b461583b0368f1e052a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3794 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 IM6N<$f&s>hXaE2J diff --git a/public/images/pokemon/exp/703.json b/public/images/pokemon/exp/703.json deleted file mode 100644 index 75e52fdc904..00000000000 --- a/public/images/pokemon/exp/703.json +++ /dev/null @@ -1,356 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 37, - "h": 40 - }, - "frame": { - "x": 74, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 35, - "h": 39 - }, - "frame": { - "x": 37, - "y": 81, - "w": 35, - "h": 39 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 40 - }, - "frame": { - "x": 72, - "y": 40, - "w": 37, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 35, - "h": 40 - }, - "frame": { - "x": 72, - "y": 80, - "w": 35, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:01a847d167639aeeb160ddd9a360a558:5e33077f4810fe91d17064ff7dd6bf4d:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/703.png b/public/images/pokemon/exp/703.png deleted file mode 100644 index 5a0c63154efd96bd3063e0c4c0c179ba3bc22198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 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 diff --git a/public/images/pokemon/exp/back/698.json b/public/images/pokemon/exp/back/698.json deleted file mode 100644 index 01e3235cc36..00000000000 --- a/public/images/pokemon/exp/back/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 181, - "h": 181 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:47af8de4c4888204d35a4e17ac074ed2:4f5193840bb62c79e8f9d414f094a882:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/back/698.png b/public/images/pokemon/exp/back/698.png deleted file mode 100644 index 43738b789283a21ad8aaa844c19509d3e5376331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3340 zcmV+n4fFDeP)Px#Gf+%aMF0Q*5D*ZvbbcXvrc-f%FtYN?s)V=yvfTf&?*G64^0I}r%>Td2rs4m< zz`)AN%KiQQ%IanM0000HbW%=J0RR90|NsC0|NsC0|NsC0{}2^Gp#T63YDq*vRCt{2 zUD_b9$s$8w0sx3fOUvArM=JNoQ8KcDS)QeQvv^Eun-8s^A+TC7D7JNU`tS@X~& zpMQYRb33R*bW(X~EQsfE#_E}4J^L>d)-5{3r$=Yl9ELo}F@zdv5=f@~EE5F9Cl3fc zhxpJ?e^#)7c@jd6Gzlcpa7juc=TAd%oTkhqpxZ$!p^7vXB+v*NXGpOd`iY>kxPW`| zglcIbNF)-bjzq#Io%OS$!$h$RItK~5v;=|+WG+1X2TgGTFH4wcmV)@1a7$LeqLMZl zr4U(s^ULGO1+NvkEXPr?VSn)g=i@lC0#n;StUZtEIKud*U{{J6t;|zKJ){C@v?(aQ zeWu}$Tw6-tc_C;)UBY=N5395(D1paP#<%rOi_NAPb$4y%Sr=^zO5m}Vo~GUm4)e(9 z2;5_v7gd{z62{-_jwMuKnX-nd?BLsoc6Yf;2wDJgnDf#?S6P& zFCl}n=8MU{C$v1m)6{QlH0J&32hdE0|njkm%0N=W!KeRhn=(ivt zZ7=Z{Ll3aNOnZnm1|BGp3$({sV`vZ>rXQv~ULx4NiUab+FNCM-uZD7my=#YWfJJx}4wme-LoE16)ij2xG@y>ZcVS zu^U4qWe@`I4Iu#w!q~Cn`t#_IKOY*A6bT%xVnLWlB(~+_&p#g~Ya4u9Ff0f&m@I#y z*n?cAGOT4Vy(i+aAj}BKDK-`s(~D}9!60^INR{?3_Zk6%*rEB0Skle4L%8)H0E5_} z`I}yCNB`5rmsJ9n4&lih2L=Zon!ofqe~G@%AEPO9*q2Fr@`Z!bz?ss*DgWw|~cI&IiACc3ZcW7c6b+y1?^X1Us|QPUXj)#?pwylKd^<~1x& z1rLL@Z5o@)XTdXOvfehszqdZNZOzAzwR}qbnw0vS%B~>W!Lw)V8! zbOkRMPr5gaxetA$Z^dyE4O*NvZ`&eKr)(pv&-2CVAc5$*Rv#*&c1~~E#S?=)^PFN4 zDF(JsXOVRX^hQ{pCE=;Aw^SdrLdtnTv*@)JGv2G!`tF{51$~~;oipogCZruvS0I`7 zwvtd+Ii2~OCS-AqN$#}lQ}n`kf08TeOm*Hk*1oDU)in#K#%QdRss$^V#ty~8R{8FD zOel{~6?6PRNXJTcT-W%aX5CpSW8MYQ*)(=Yrm@7dGO*Da^3mM_WaC(;nsAtW+_8?q z3A|O$+1y*qh_OC04f$XPb4)#-kg^nY!a8B%akmyZFQs^Cu^6VYxGn-}7BD`#Sv*%D zw@?!S!xV^*Zl6<`buvsT=CqSY?O>aq^uEJ!t<|%%*R8nsxSyE7^e7fbne^1T#yHl! z?~Y;pxwR1Xm$8AY>(Y+!*;pxO&862pE#&W&lkYC04imyCTRZn&H`&};DW$}-tSO&> zs%PV0Cjkb&9@Eo)wmBUz-a!T>o^>mq8ORuBCOLhHHGSx8Lu_FTrpqa8ykp%1-^H4L zlXmE%u&h~B2ZCNJT)@zGDk^Kstkn+3KE1xc8hI0>@d?jmK?mDzBQRyxv=`uV(;aMC zoD6G{b`^tYuSb#zgD6`UfaxmHGy+Z2h5c;;=X!&sX!8lWv)G|}Pgcl19PY{YgHSerHug!RkX<#EUf!;%M?)of5& zkiwr0kJr>!4HRrMYZTOnhlH^JY>(Nr*We{s!GIF6f=xiZW1b+AF%7YeMLQVLmw@yq z=PK*IN1qPQWPvhH)gk5`O|tdHh`apt9jH0oPa zejzOvZMi%-ERR>X7?Ab(WHhzLWNk{yWK_Ju;fl6_)J^tyuc1cVeV?(s79v8uYX zQE3zf6zv3iyi5-rO$L)TMp}!y0>`ed+a z^Q`NVjHsFu;B|CgC%06%6P9Ruq~f9Li;Yj4*QTQYuj2%}r5YsTp$o!eGDK^h&sbHG z)5Ng0y^gqB%0hOfmJ}F_I?U=WP-gMvf1NdFk+ODnGcx-PRg3uII{O&1M;c==eA@zJc1dF> zA;!3_nO40Uw(q*5b0P+UIiZwMD`ijYQ8tQ|PcEL@&Lw)ck zqRRau`{J0L-THAXgQ5R&yH~95bfvj(9u;fR={%FI*O+s4u_H-U6wAZcZ8R9tl657K zY5PO2stav@$e++>%NG|7YwgZ%eO z^2H_hTziojO@;USkqm~EbgYSo6Bds9K&G1T=E`s^{&-HEFOIqBJ!{0++HH-Ic93{_ zU|2iS4~Ou_B>P^7W9lIOSR>su!5Bxjb|bV~gW*bRHby%AompsWjC6!Nm{Y#QTC|uQ znu)46815^1)#Ru)!no^{_0d33)1MPW3^9ixtS><- zpk<7Uqb)mV4trZVRMzm`Zk8@38&`zAXy>z^an%b1Ssj2dEBW>#H&a~7hV4Prq6k1R zI%BMXF;H`*ITY&ELP)&;fMXaR+}p-Dd%X9M8pu7kM;g6EZ4hrr$5_RJC8DbX(g6r# zAo%8I)Xf)Yzve=`7HoX;GwQ_>UZF?;54e&*+P*@YTTHZpae31eqGoPjv~- z8snC+z1?nhHZHU7yh?&GF06^6z1^Vw0WU$y5B(u~jE3Yz!oHA9Qz#&eg}|GinHH*Q zheFX{I3`SnkUK8P7-!1kEU!r@E)3I7ue$|foGmY&k7~+Y5dp#g2p2=i7-!3i=OfL9 zXbVFi4uu-yOnGtD?78$y5e*45A(1s?j5FoYY@{L@6lOs@3N*&q^6U)?QDHhHpfF>c zEssnXu~j~Rofo0a8QoNnG0v7pS(AJK!T?A_L7SgVraaqVcu5$y)I94Hb8Yi8R$d!` zRQhri0nSMP639TCpVdI#_vcv``yg9IwlDzVr^fs|0PtL~Rqb-)HBrd^b(hF<~neZBTWx&l=PS2OLRoU>N_kDA96GO2k@QnfME%%rN;A6|D1&!17@ zY?m7OJebnCJT)*r`LP@aXgTgt-fG2h?e`KG5-~zhvIOe-e4c%~;Ye>|&8iqAAaiHeA|BJ**ZuS9X(n|C}DKrNq8(p>H?e%`1#G!sCH zRaLtxRaHGU6GElWZSBr#`$>;xqNsAFf%cgZ=m2W74uTkJKV!=l2+f30Qr|nDQ4m9!xT)GWGBSm|@#9y7ff&jJlus>tWpft9P%$)38MYl^Ac*>Yzta>_)gAK;h@w(vnq>bw zA_6hg9QqYuAcpcGpZFbNAcitBOh6Drp}GuoX(2yxomfH6WILp4RhKXH%Sd_WV)U3Z z8Q73y9v0D2M#?+QYVS98CPN#Nnq@msM#^^w7g`E+CcuW&=Aq1ObafXRI}>C>LdTU? zS-OdEXF_bqe6dMffM)JWb5Lh8v>|54bhzeLPMry|A;_x`XF_er*sBmffo;gpt1v%- zZ3uBa&`*F6cReTlL>Gc1T_aZT+{l@XLTn`BCs>Gi7355S4PjmdITK<-pjV-yV-R9q zh4~2(I^G(J>4`ufj#gAOyV%^AjLMy$Tc^!w~Z-heXG(5cDckbbK!u>44}M zhoDzsegcG`SGlbIO|Np-U3cAe*Ijqrb=O^Y-SxlLA2eoYjX)PxWB>pF07*qoM6N<$ Eg7V+K5C8xG diff --git a/public/images/pokemon/exp/back/shiny/674.json b/public/images/pokemon/exp/back/shiny/674.json deleted file mode 100644 index 52192847bdf..00000000000 --- a/public/images/pokemon/exp/back/shiny/674.json +++ /dev/null @@ -1,1175 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 124, - "h": 124 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 29, - "y": 82, - "w": 28, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 85, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:76841431bc0f022caab94cff146aa974:cfb5f5b4c165e509044ceea57b0d5b30:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/674.png b/public/images/pokemon/exp/back/shiny/674.png deleted file mode 100644 index 75e7b228137bbcd742458065b25d8da5b409642b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1288 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 diff --git a/public/images/pokemon/exp/back/shiny/698.json b/public/images/pokemon/exp/back/shiny/698.json deleted file mode 100644 index 197e3b844b3..00000000000 --- a/public/images/pokemon/exp/back/shiny/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 181, - "h": 181 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7926d4052a1ca822dcfc49423c76e3a1:6930576af3683498fb06f805ffdf25f2:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/698.png b/public/images/pokemon/exp/back/shiny/698.png deleted file mode 100644 index dbd5cefcbf0c1ee998b2b4eaac48c8d921b48f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3340 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 GGywnv$D82* diff --git a/public/images/pokemon/exp/shiny/694.json b/public/images/pokemon/exp/shiny/694.json deleted file mode 100644 index 2352bb65a43..00000000000 --- a/public/images/pokemon/exp/shiny/694.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 44, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 43, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 0, - "y": 68, - "w": 41, - "h": 35 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 34, - "h": 37 - }, - "frame": { - "x": 36, - "y": 103, - "w": 34, - "h": 37 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 43, - "y": 34, - "w": 39, - "h": 36 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 82, - "y": 35, - "w": 39, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 33, - "h": 37 - }, - "frame": { - "x": 70, - "y": 71, - "w": 33, - "h": 37 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 31, - "h": 37 - }, - "frame": { - "x": 103, - "y": 71, - "w": 31, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8a9916d2af3a40f04636cd5b11758f77:333ac780963a12589518f0acf1d61fde:b0990f9650cfe63b836cbed33f0b44d8$" - } -} diff --git a/public/images/pokemon/exp/shiny/694.png b/public/images/pokemon/exp/shiny/694.png deleted file mode 100644 index fe927c067425b4f2df589b37f8b9cf41ed4234ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1770 zcmV+M#*Bicy=eG-$2M=k$HOR+_KR2iI74ld9hF zec3cy6_y2*q9#HA;hy>V6ZiS%wNTeNGRUOJ$jcTPX+{D7RLH2CtfU!7}1hd((8em0PJa(^M){ z!Ku>l41#MFY_j^IiB~MAp<>i>BtGF3FhRre(<+-0>^D73T}{n{y?qK6(yYO?`ji__ zo3cZNS!jkCrPMZQa29Z>j)Y-Vo21s@pMa?ejv1wPNprnk&xDaGn}Kbb#1@u-i2$V~ zP)KtP7=rIqN5Ph+fvExEfT7W>isSh~6EMK4dRtY;tH8()QLMSnvs;p}J{L8+M!8t`^^5EyK+gBm~q+8x&WbSy&&nnwmW7J?Vl z$P!tNVtiBlJ)O;FS~p;ZfGK-8h%T$`h!J*$L4%VG#*Z0h{6K?2{RBL%mgugk>pKGwCSs>-d@_IKb%q^sm6^`G}oLT$r-zL*akQ@*IoNpY1gno`;^`J!jeiz{FB z%n5OoC_3i6xbiZ}GyC9O8-=@(QJy(3t_WjflwBclwnjki%=M)fmmyp8IT zQJ&eucpK%5$OyDv8|7tGN}%=IC?lgfm?fPy%FCz@W=*e+GBT=*S<_*o2qQ((7-kF8 zZ=Y!qQcMg>d<^G>>Llv3*gJ+mZfqasCIlxN9kR@ zLh3eDoOhX-q>Um>i5eCgbta5scJVffFj4raEjDVoO;~0VZ=-+>Hep)O#jNSKQ3^BD zpo3YGvQcQeiv7tq%z1I8I|NQ@#yoRgTzNC* znN!J|F=bAQD{scq%z3wyXU_YmJRgu2SNYTY?(=TPpXPU;cRT(xzx#xbO5C*Beg1Kj zKh5tx@i;1>C`B6X!E`*1>bq&Pdn>N~H_Xe^?&{SD+u@^3%xN6A-9N_MJz)}VM}s&` zZhE0H<31ndVaoHHHe=Fc-HyNMVnamUcsPFxO>77$3BkgfRUT#Vgr_|r(^~Q z)A2aUi*31S!o(bqDMr$CJdW}(a?=Zq%)zbm^dlZeiBufoG=Yi2Jm!!vna5EI6B){e zhAFM>T#69P$}wWIF4bkFgRr%M=8u!_ph|=YK+G$dg;ee>b5sZ5kUEQ(HI4e zIb%|fqZowATPwv14p=u(0;a?`serr`9Dc*-xYX%T2$Rt% z9%lS_NW4&rG7jBXIL^hxpsjUQiVB0~968R29C+~<4Jt()pE$N^B~?+S=*M2I_=;DG zW}J{{rec+%AA7apD?WL(;wzaXBwE_D<<*L>93L2wW9-YZfpI6sz8o4DiDvA};V{OX z82fT$u%lK;W9&;ua%#m_lJRPVI>XzST)bML(DU}?Xcko~)EUmc91jDLXoRu$swH9V) zVeHHCF#1{xpwDpjB^z}as#fSTjD0zj279ly5IWDPx#LQqUpMF0Q*5D*ZvbbcXvrfzP5C7-G=vhr_~!6)wj%c_LYm!Y@+vfTf&?*G5| z`nr$0=l{RTvCGZM%F6%T=IQBxn!-000(rQchC<|NsC0|NsC0|NsC0|NsC0 z|NsC0|5SmEqW}O797#k$RCt`doQZPVx(IsFIZ>|i{;ztu69BPLR$5JG8XGY2 z0R$!4`iGax)UmGT?7w_0i*8>Z58Zyh|6*8+=Ca)Hx=Y|y3mACq0*@HW*B29)e;0We zya89`4Y(7$14aOQi8tVmys#Q9FKAhom$o#;SY+JsZ8SHTmkb6wa=k@f1hB#uSs#&? z*l7xwH`8);%)A(od^Us&fD5qSLCM$K?Y6F{#_3gknJg=+aeBq^E`?)xJ_8m*8%;40 z0GLt(yi16;fS$;-_XY7bzCaes4d@eZIyLe(!;&WgcSni0v=?_|Z@ht_;Nn)T zywRRU&Eo>~@pt`$#M7@sR4|1a;Bmv* zwKl|!=e^a2cqqJ=0he8Gy`%ze<=r}N>|c1bi1@eLwiWQ)9H1X^0>OT3BdqLti^sMt zJcr;lv`xa?wtZ{7H17bs1&8&1XJ|8UvfpkpZ6n#2Qd@;L4AyanSqPllzVD#C`1}xf zqkT^u8qdCXxkcV=&zY?J=?sx9&h24E2@R2Gq8GE;5^r)?$~hvR?9mA=@y6x9ZXr-E zBLK?0Yov|#-2Y=gWRi3m{{D7*n9u<>@fO_RRcC?Rc+~O+kCZp&^*&W^4=`J<E@+=VE>rZspuE`_kjpnJ~?B&1s*9sfdvJ;Z)&-Hpuaai6; z)4Vo%8o7R?&jycBpKTn+Q=Ef#g5o|R$tL+#n&idKf_Le&WillmfOF73pj-ot%zN!l z{4DsL9?oz$Xdh5MKE6dq51fQqu;RIsc8n4__*$lNW4-p~wDF^v@$wL#FWcF|c)@QX zdym6yV@B@t^RtCHZbv97+7{0$yq|AQ0u7DF4fFZ=KQ)YH?<|?b#~T2_(K%mnrAY`r zPL1dC5yQM>Cw?xRjugM@qh?>@iPITeBF+gr@YMRe`WQ4Np5kCdnW4ys7drC@jUCU5 zGDDG%nZ&&1l)}mJ^5^9NEc+3Z>SI;Ms_q&4F<0B=AM#%8#yQPv&5t>M$6?IwHFwA)JvlfE_^R4b?GtaY9x=VE~O6*$v)M7|$(k zF(J+aW<<@N3}D&uk-vEXZ@M!)0FB486W;ix>A&#hp`K+ok6YbL zC=I~`tR7aYMtv5W@hL zod9P(`RhN;XuNeAJXBt4Htj06$?N<#y^}UFvJ$ona^z^)mKhitJi9;-l96FH?fEc; zPlQ))aFkK356;LioA!ch33K{*M;n}EWF>4Dgy&rhEtJ^cRz_CBWItv znlY<(B77Q!Ipysc%zvSeM1mtun3LY0D!8S8TyHm(WTqxa_{0ixlGoIlwDgbh*}FnA zRTCt9;)FS6sEIXc=^vA_;Wv1z@JSR%4dOm_O{!2p$nHls=8p9N6R1nzZzfiMR1Z zd)6H_+^9_HH4)~JlRk~o9InT?`fB>el*_&1-t((&PrMB`eppb-BEgX$&6#L%Q~%g_ zqdnt7d)8Hzn&iJFU3!;3eY4UWw#5ZrS^wA=1M>aO*0;1om4r!3Ur8%s+Z)kE$ z|Ck}udb>B?zW9p%@~h)MgxeTfAT_o)BT=*Tk7fBm+>!SIa0T8$`XulobssZTmi}?g z2?YD2@vcKZY#ZQZmD5Q2BnXb6x{qIy7hC_hMw(!MJVx5CzwEdyEs;L$5^q=c@k{bz z>mS!gw&zS%yxfrfGU*wm{+JT?L^P`5H1((chatp z8hBBQ3z|hs|H#-`-dYp+TMqiw)^jYV#RbjcS$*VC6Lt=Jfpe94X%1>}VM%(5b5I|N zm%XSvO-GYHZM-yRro}zQIjE0>HIZUK;v%Ht-Dr!mlEs}I?vOoKEdQh~#-P-j;6@)z zu)i%Byq4X{SHM!9efEdZvd`=K$XUH78BzSLsgIo1PqO7DPZuXrI<1eK)lYJ~L#xs786aZNJ;-#uU4i$(y{|yQ%q#9$n*M0VG7x=l$MytUXiQ^7(}#N4(zS6B_^_0 zq%{NP49%QWJFg)ovR9-q0~#;ZN6ws7VMC~5B6~&BaQ>)1a^j?l3T$X=tQC1$A4y9R zJ-pBlwwP!_-gic8B zNaQK-7|O3XW!P-A3A=F^Ji-onf8$`}MXcCRgAKZ8L64Ojd0rw#7Pn#}Vnf&*qdjh)$FBmSduC``fAP{i zB1IPJTXaM~Xr|fY7+l_8gYJ1|XULph-Nq1&z-}Jb#d}a}Nb5`N{4@=^XF*;HTP0Sy zI0Bibve_LFaB^Zpm;es zjyHzn`v$ZZT5jFAXu8MDBW=wG%-a5mFqpbAWYGtf_R3w;fa_Fiy2lID?rr5)6$rdn zb4Xd-kFfEoy6210UU2I}F;@90P}1(XYHm_Qfw$}n33Shj5)*b;@AB(}?r~aoXUPP6 zaTEn)Q(}Ti=>6NRqO`XH^+yMT4>rrZa~nf~_8MoLKEM!umg(9(&-mbt`{dsZ#*HE6 z*#zyySX(eDmZ4LNw%wN9`I%^Xdx5!*(exixRGr#{><(-UDF~m_I9~0pIGe3_#&1Ac zd(O!2{B8)J^EgI#V+k{7~SQ~ z;^^hA4;1DOyE;a9=`a&669W+MQ;Wq6=fzW|Fn~Fj>7Y%3*?mliL2QJcy`JYaMW5CH za%6l&aPi_(3E@QK7{(^LYohBmrJ{Tm!bo5eWyXJ zTcTD&v!u_*RCnq1GgMSaCA3dymel!}>Mp&0hKlO2W=Wq9YnMy2ekRepN@&b}m=AN8 zOS68{M3X8ZJ^Pv2nx4_$QK#wI&(!ANjQ-N0XFpS$zozc{KfTV_20=aSf&c&j07*qo IM6N<$f+fz15dZ)H diff --git a/public/images/pokemon/exp/shiny/703.json b/public/images/pokemon/exp/shiny/703.json deleted file mode 100644 index 4762fa91a2c..00000000000 --- a/public/images/pokemon/exp/shiny/703.json +++ /dev/null @@ -1,356 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 37, - "h": 40 - }, - "frame": { - "x": 74, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 35, - "h": 39 - }, - "frame": { - "x": 37, - "y": 81, - "w": 35, - "h": 39 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 40 - }, - "frame": { - "x": 72, - "y": 40, - "w": 37, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 35, - "h": 40 - }, - "frame": { - "x": 72, - "y": 80, - "w": 35, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:253ca4296d88ee81990e3297ca0f62aa:8f78420201adcea5fb7920c60446c81d:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/shiny/703.png b/public/images/pokemon/exp/shiny/703.png deleted file mode 100644 index 4e4064509ae2de6364137507a57e641ca58341d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P3?%t>9eV(zv;urWT!FNJfPnn|`+5Pz#>OU| zp5E~Z38|@BnH%@#RBmW}@Ts?Va_@ro|Ni|mZM~8JRLxitTqRhL#tEJqU`RA`>rwK7@TF52-bvgQs9GQ3(AHaYoae~J)PRtwb9)PyZk9HB?v-=F;6|m~+)`&Y z-;;Besm|a!u{$c?c+T9NUnF8{PP?C|l#kDw(33ZN-{C2a$8Tiq4e!t^qYXkGOe`-*>*w{B+Q{kHK(gC76FJ(laIS?DioSaPXoW!b*MbyvUdJ#+H0 z;5n~T`Rs#LDORT}{T(Bd8TiZHr}6ZjrTnk zPcv#{xVFD3O?Vjh`dHz^1#1kOW?MQr#}wY4qmuD#!JA?ptH&j8&YQh7^jI*n#jjWJ z`HXeW+c+L^mCO`svJ&E-^7-G4$y?r>mlx(pDqN`afkVWb~&99C?%`d&{Q(x))G?vX4XB&5~*F z6{O5R&skut%Cd2X{@_%QO(8_p^sT*FVUsB%Y^g8>8GI_>tUlDxI{(k^xXo$H*}MP-=ZYbpEQ+dbvA*^@)gyU!h+lXw15(ybS# zo`1G^x~p&2gA40!?@vs*WH2>VZPxLy>vIoY(Bs*tS6X$dRJ7>j!n;{=T$y_sJWhr3 z?rdn#^?A~263?1)s+A?@(s!>}v35pJFS$$k{Ro<+D+6M_QhTho^yV(bV7-JT&%$=C zbufB*$c@Y6ES=)Fvrgf! zKGU}OPqI6vp1UrUnpm@sZSID=y?uxFW!Gee3a#Y#-m2AkWqEGt>sqC+g~?Y}sRhY@ z3tf|-d%*lE+NR`xUAj!1<_6i{7 zB%KZ7NWTV3AF|E{l1)HGK&AWLUV*6Z*>_JJi*ZRm3M3!oFaw2>tnNqOoWaef)$rf_ x*wGkXWzEmc`({k--6`c3w4bwo-}Zluo1Sj1%=%Gi1}vEvJYD@<);T3K0RT;#X+i)1 diff --git a/public/images/pokemon/shiny/674.json b/public/images/pokemon/shiny/674.json index 0ce6a2d9018..86d6cba1b01 100644 --- a/public/images/pokemon/shiny/674.json +++ b/public/images/pokemon/shiny/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 28, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3a00525649c00ed79ef7fff441994eb0:17d95f774222b5d9946bcc63782468e3:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 58, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 123, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 86, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 28, "y": 81, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 28, "y": 81, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 86, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 123, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 86, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 114, "h": 162 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/674.png b/public/images/pokemon/shiny/674.png index 097368405fc1a819496cccefa34b9c3508318ce2..7c8e71d598800d8c28a3908bd8f111f8c85a396f 100644 GIT binary patch literal 1779 zcmX|?c{m$r9>=LO6&pwCR*xW|mFlvM7}~hvidGyEp_Il|lc4RmDl|HcYjvhHag-M9a6fOHyG%CyJshs1qtn+{j{$>kk%G(P zu3qWBYfoZxj-$l zq3NP(Q3wC;uOnqX!dC%(MsmE%z96dk@n^KHvn=MW68ZW*Yf6wrz1wIlc^g}C&@#vj z(F{iRCfO~e+h$0w&0bD(MjDg;Q8s-52l4NI%=;8~r9UB^A~hkHM;>3b>HcCTdsPJ{ zXWd#i=6l0ilU66!|ETUEA(cdHP6ltvEbMM=uM~b#H7X9EMKs zSe}-d+z{R0cFepiO#0F33ost$I_ul6as-|-#f$%C=T73(kX;&!hk*`wixEk%*Hy1d z87o}gRxW(hCTwvgk=b08*LOvQfj250xeR>)6eF716He)&oy5?_lsJNuFPI#Y`yrhy z&ROYbsp8Idh5!Df?f%;`-R=v=3kKRe{{1K+^SfSrNcj@Fm$R37;MlS<^Ha0Xtpo^X zom)V-wTMIhR@@vNi@*l$9r%PsOtvR-{muA^&;>D=_KD)Lk*Pn7Z)^Y6mu@9}w^52u zi@Q4LQZmP7I(NO-J$CJ;gR6W}xBYQ`yvIahRhT*jDr*b%Lpbn4>6r9^|Lae78-V#NW{^Vs zRC2C~5&le0^+a{nVA6*blzzAPBAZ?5hlxt%jD~pqRoc`_GI|y|$Ylw6VHTcdEOWnU zVOPTi(d`~Pwu$&~7hIFgPL$Lz7?=3M^atE7+rFtn786TmgA*qggH0oN-51%c zoiY4^n7JLpth7EXT+Ag=Lo5%<@R+Tl{dp`##gYsj7o)`4FdC`<5dV-xHf)P+ae}_U zF+bDVCLl}{;1MqO#M0v#Atj#;>Tnn|A%+B^xTaTMPJMWK?jQ>*0XpJR%B9>l# zTiuD%e|jZ60OL1agQ9A)&AF5tCYJ+P>Oa-+iB9}%$ziB}e= zinBWkM{K;<0225yQ4d#iX-|{so+N%Ugssea@^SjnEpWq#a{rM3^@gvtEH4 z35f^PQb?j~N#s*nHi^vxy&;^bP%Rk3;sQ>$vSn6gYXcJc{2i0h+k?EZh9Jxajhpob zqd%4i)d?Pd@hJz%*HdSiO9>KGRr#HNqAhTy_8KZyd6AOuU^+Pc_k{5!KOhGR>>;cC zCHHJ}a3e$WUQSDoOAe6J1L`EB!_dn=5FqoXtwx;B@Wz_9-vF~wd%z5^(0OjkadBP) zT~-k{x<>$fHm1)az50>)4Yt0e*1PER&u)PF!f0FHht|78v-29gwH~HBf&o1bumu^6 z@83sai{;d+9^@;mJeD@M{DKpmdD7lEVuB{wdztLfFNOST*+nsR0cja=%B`*9bdweZ zDna^(Nln$V%&wZ%=NEqi3YWVR8;+G-;~tR|6>*MZqUY|iX~YK*#Gc~1pEA+zCfu`} zLhs(J+@wt`pLA?{WDU}vb~+b&3Hs2w5OOvvFj}wJ`W^abGP)mmKU-ZZO*H{Jk4ziB zZ>x9n)NAEkbWb)}hgD(?f*|CpvmRN$8>+rJ@BH@ZH@*e?JIl3OV6}<fN|3u`IgUlZX|rx>z9fCQKAdyi{ds*5aMo z{VHzaR_97dtSkT4$XGxduB}a#|Lf7%+bocV4t7}9Sj`RPOWZ7wI_2wD$5=&Nl6vPb zY;;Tagj0bCXZhVcO{huFnD3+f=r&J_I*Z0RsyN>_$efYZO7Hb)q3H@OgU*$vwk|UR ztuy)_m>rCC7EY%3HpT(~Ceud~9i;>Xwhok<$3k#$ZH*M=iyJ+tmrq+ACHl$xApvG7 z7sK=;NjpE`c~9wUnsRGY!!V_iU}h;H^%Xo@8r0ekd~0uTVF+w>0s^4Z?Wpgv&H_f@ r(&2M^R(PZi_iW|$lmpBPfOYx-J}{>G&@ZKc00000NkvXXu0mjfIPk>Z diff --git a/public/images/pokemon/shiny/694.json b/public/images/pokemon/shiny/694.json index 0893d62dc10..48e9623d7f4 100644 --- a/public/images/pokemon/shiny/694.json +++ b/public/images/pokemon/shiny/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 41, - "h": 41 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bc6e45d13f38b4219ae03e14bb0999b9:7eab0806a2282a4facdb9684c54189e5:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 282, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 241, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 171, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 85, "y": 170, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 227, "y": 93, "w": 52, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 52, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 50, "w": 55, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 39 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 56, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 0, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 56, "h": 49 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 224, "y": 47, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 281, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 168, "y": 0, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 56, "h": 48 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 281, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 224, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 50, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 281, "y": 92, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 57, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 112, "y": 49, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 94, "w": 56, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 56, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 170, "y": 48, "w": 53, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 53, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 126, "y": 175, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 43, "y": 138, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 338, "h": 249 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/694.png b/public/images/pokemon/shiny/694.png index a6c87937252afa8f713cf631bbf3b5063a8c0088..5f65aa5d4fff414b89097eb5a307883afcb1285a 100644 GIT binary patch literal 11338 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

    L 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 RS5p80002ovPDHLkV1iU^&@BJ} diff --git a/public/images/pokemon/shiny/698.json b/public/images/pokemon/shiny/698.json index 707a84c8ca1..6baf41b0ce7 100644 --- a/public/images/pokemon/shiny/698.json +++ b/public/images/pokemon/shiny/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 57, - "h": 57 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:46f728cad32ec7681d76168817f7001a:a044b85c8682cf2b3ce52dd5cb859583:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 152, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/698.png b/public/images/pokemon/shiny/698.png index c04cc11875dd48428dd105b762f0fbbf6f04a2d3..a861e0c14d560360fba42722eb19e2da188d4969 100644 GIT binary patch literal 3662 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 literal 548 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 Date: Mon, 17 Feb 2025 21:23:10 -0500 Subject: [PATCH 054/171] Fix Impidimp front Arctozolt back variants (#5342) --- public/images/pokemon/back/881.png | Bin 912 -> 910 bytes public/images/pokemon/back/shiny/881.png | Bin 839 -> 882 bytes public/images/pokemon/variant/859.json | 30 +++++++++++++ public/images/pokemon/variant/859_2.json | 41 ----------------- public/images/pokemon/variant/859_2.png | Bin 664 -> 0 bytes public/images/pokemon/variant/859_3.json | 41 ----------------- public/images/pokemon/variant/859_3.png | Bin 664 -> 0 bytes .../images/pokemon/variant/_masterlist.json | 4 +- public/images/pokemon/variant/back/881.json | 42 ++++++++++++++++++ public/images/pokemon/variant/back/881_2.json | 41 ----------------- public/images/pokemon/variant/back/881_2.png | Bin 918 -> 0 bytes public/images/pokemon/variant/back/881_3.json | 41 ----------------- public/images/pokemon/variant/back/881_3.png | Bin 918 -> 0 bytes 13 files changed, 74 insertions(+), 166 deletions(-) create mode 100644 public/images/pokemon/variant/859.json delete mode 100644 public/images/pokemon/variant/859_2.json delete mode 100644 public/images/pokemon/variant/859_2.png delete mode 100644 public/images/pokemon/variant/859_3.json delete mode 100644 public/images/pokemon/variant/859_3.png create mode 100644 public/images/pokemon/variant/back/881.json delete mode 100644 public/images/pokemon/variant/back/881_2.json delete mode 100644 public/images/pokemon/variant/back/881_2.png delete mode 100644 public/images/pokemon/variant/back/881_3.json delete mode 100644 public/images/pokemon/variant/back/881_3.png diff --git a/public/images/pokemon/back/881.png b/public/images/pokemon/back/881.png index 2f77327cfd0749bc3cf7212522734d48cd1c0954..60ab60a9aa1d7b47d0f70df8e2cd816ff1b52056 100644 GIT binary patch delta 199 zcmV;&0671U2aX4jkpbwjl0yQ2egK1*14%4Pu+Mo5sPLAh61b!nz=vvY{iNvod_T%S zV}>;{S_x<}sqsfzh<JN2C7MCRlY>6CP(S!V~Uwi~RUbAX&65{1}j6cYHYirpSt0Vvb002ovPDHLkV1gQ< BU|0YE delta 201 zcmV;)05<=Q2apGlkpb$ll0yQ27;KBcAm%_4%M$E!-U2GTWvK)%=>_ni+FL&<`aa)} zGSHY|jf_?TnoMf^krtvKA6hZF*1~vL0{>1u=Qxo$xkNf8U1`?Y!K&>B>*pMye1E$F zUoS1W9hjN&1K#cHRf6WgrHJ45+qT~Va&5`BT;X(BrSCEl67Lr?_1KIq?2J!}wBnkm@Qb$4nuFf3kks&#M4s=pZQvm<}|NsC0|NsC0|NsA2O4}3w z00P`eL_t(og|*m=c7q@c08o?S1JVEg-Q|Ib3N{p%o^8$@ZbO0=*LBt5>xVpsTi+3# z_b-F%sw5wD&bOAcVlAqn`}EP)HUzJNgzV-S!lt7}`On5ycRH z=s1LiIZJ=J#R4(6HWpDF=?HP28^d2sT>&MjaO|xCXhk+Q1-zC|JWpU~7NsK~p7-p# z*6WYv4ayNnHSj*Ph*CyS4;&YOzkU~mP!FVnaY_E{$#4*l*UvPu=>xQQd|RN^!hN1_ z0xz#0LEz{>JqIvN*uhL^e)Kk$LFa&f=1pKXFLR^krG$LI@Ef3dau67-6z3x{AYCX` z;5bqOd(0!n4k{gLz;Rse!Ds?{n5`b>xEfIBR zRntV`KAsNbRU+-+7KfK5ZQ{i{#Z@%*2It497r%fhN{0r~048Aop$asJ?}OuiWe7eN z!BWJNh&YZnn{)TjkHC5`bE3h2=<+4J_9vc|eew;Y%)f#7`D92Q#=Fp~h{KSQnOw;GFnRiuj>&;6Cgd$eR4;CYuRB8vx!CGJ4+)AtO2I@)Wy%qCVqB4dij)bPe>^u2=K@fIiZiGLCyW>L}< z)C#hg+d)K7MJO>RF}`_eM^Y>H->%^e6!9OxQu$zeukSaRLCXDS10+@b*h3a#=5eXxdxH3$5IbIuN(cK4>+6U@0|uq=n>H zw2IklEslph30xxak_(XtdX0}E3|=m*3av;^)& zT!v*BmJ0G{$+=wdbi7LYIubIU7aO?roMKN;7L~=ky-iHK=Q;QCtn!kmDo5jgg1Tgh kvRLt0|3E@|Io{(Bl5<57{hgBc6aWAK07*qoM6N<$g8htt-2eap delta 764 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 diff --git a/public/images/pokemon/variant/back/881_3.json b/public/images/pokemon/variant/back/881_3.json deleted file mode 100644 index b9101d9b13f..00000000000 --- a/public/images/pokemon/variant/back/881_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "881_3.png", - "format": "RGBA8888", - "size": { - "w": 80, - "h": 80 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f9e60b28adb0f1c25487a3423af005:e78d63b8a44825ae516935d669e48f61:1f7350865753535cbb572c579820f817$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_3.png b/public/images/pokemon/variant/back/881_3.png deleted file mode 100644 index 6ed3c2495ba2c8b75b77082b19e1354055536cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 zcmV;H18Mw;P)Px#IZ#YgMF0Q*5D*X{8$Ag%O*J-NT@F-o8CQE6UKmtUAYNT9du6RVY*43BCc;Rg z#ARb*ht!>^-0tiA|K#+xZ#e(}026dlPE!E?|NsC0|NsC0|NsC0|NsC0|2{w5EdT%l z>`6pHR9JDH$hL|+dYi6DB9 z$KF@WnfpsEW{9}CvWV<(N04*W7 z4g)5z#yDWCpwPYq9EQ(12#r7oqt>%2ZbcVSf63S}>&f&RzA*3d7E&MfFgoR{t9MS2 zubL{-uH*55A30JFF0pw@QYRj~T^vPKZ|ry(<>D7GM)6P~D!?cdAQXWL@qTbP46&C* z&=heeT00C^q^5}5_<=Zy*eC@lC5d4d0?>;@6Hs|q!6g_`yq$`{Wb&dcD4Zwrvw6HH3DdNAcD7F`38(y_U$`uPiq>1(Fz%rxdMt z!L;EVd9=ZECQ(EZH`3;~4Yh685omC)Z4#SU29XRYZd0=-PNM4sbcVJ#iFf>+2qBA{ zCZJT1#MBNVfFeSU*@?2|Ah#na6}xY1cmY}b4`8l*u)Nmyn@l8v|dQk zD#1q(6?efCnDH3=D*}U<14%4Pu+4cZsPNXM61b!nz=vvY{i0~wd_T%SYr8EnS_x<~ zsqsfzh<6CP(*=7fub{MRmbA<}e+tO0CHr!P(_xiPWh5ltFBb4KQHm3OvM4O(>19IV6U}+z&nh>G sqEb};C#Z=oQ4$M2)?bhiFUNEI19Mz%1Ee>;B>(^b07*qoM6N<$f}fk2Bme*a From 62bacf52a7fe92366329223f20796f2ac87b212e Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 18 Feb 2025 03:24:05 +0100 Subject: [PATCH 055/171] [Sprite] Batch 6 exp change last for Gen 6 (#5248) * 653-654 exp change * 656 exp change * 664-665 + 663 exp change. Will need to remove Exp need in the future * 714 exp change and removal of Experimental need Its a better improved version of what we already had all around. * 656 exp change + static change Undoing the smiling froakie sadge * 715 files and base fix I fix the sprite bug that has been around for the longest time. HELL YEAH * Finishing touches to 654 variants Gave Braxien tier 2 and tier 3 custom fire color matching the variants for contrast. --- public/exp-sprites.json | 8 - public/images/pokemon/656.json | 59 +- public/images/pokemon/656.png | Bin 515 -> 507 bytes public/images/pokemon/714.json | 302 +- public/images/pokemon/714.png | Bin 752 -> 3943 bytes public/images/pokemon/715.png | Bin 4116 -> 3509 bytes public/images/pokemon/back/714.json | 302 +- public/images/pokemon/back/714.png | Bin 621 -> 4059 bytes public/images/pokemon/back/715.png | Bin 1025 -> 1084 bytes public/images/pokemon/back/shiny/714.json | 302 +- public/images/pokemon/back/shiny/714.png | Bin 621 -> 4059 bytes public/images/pokemon/exp/653.json | 2498 +++++-------- public/images/pokemon/exp/653.png | Bin 2845 -> 2962 bytes public/images/pokemon/exp/654.json | 1511 ++++---- public/images/pokemon/exp/654.png | Bin 15117 -> 10785 bytes public/images/pokemon/exp/656.json | 1382 ++++---- public/images/pokemon/exp/656.png | Bin 1034 -> 5620 bytes public/images/pokemon/exp/663.json | 2429 ++++--------- public/images/pokemon/exp/663.png | Bin 5869 -> 6096 bytes public/images/pokemon/exp/664.json | 296 +- public/images/pokemon/exp/664.png | Bin 831 -> 2143 bytes public/images/pokemon/exp/665.json | 782 +++- public/images/pokemon/exp/665.png | Bin 876 -> 4233 bytes public/images/pokemon/exp/714.json | 314 -- public/images/pokemon/exp/714.png | Bin 3350 -> 0 bytes public/images/pokemon/exp/715.png | Bin 7342 -> 8762 bytes public/images/pokemon/exp/back/653.json | 2981 +++++----------- public/images/pokemon/exp/back/653.png | Bin 2508 -> 2669 bytes public/images/pokemon/exp/back/654.json | 865 ++++- public/images/pokemon/exp/back/654.png | Bin 950 -> 7522 bytes public/images/pokemon/exp/back/656.json | 1718 ++++----- public/images/pokemon/exp/back/656.png | Bin 757 -> 3681 bytes public/images/pokemon/exp/back/663.json | 1316 ++++--- public/images/pokemon/exp/back/663.png | Bin 2441 -> 5907 bytes public/images/pokemon/exp/back/664.json | 214 +- public/images/pokemon/exp/back/664.png | Bin 527 -> 1975 bytes public/images/pokemon/exp/back/665.json | 700 +++- public/images/pokemon/exp/back/665.png | Bin 615 -> 4130 bytes public/images/pokemon/exp/back/714.json | 230 -- public/images/pokemon/exp/back/714.png | Bin 1866 -> 0 bytes public/images/pokemon/exp/back/shiny/653.json | 3149 +++++------------ public/images/pokemon/exp/back/shiny/653.png | Bin 2508 -> 2669 bytes public/images/pokemon/exp/back/shiny/654.json | 865 ++++- public/images/pokemon/exp/back/shiny/654.png | Bin 950 -> 7518 bytes public/images/pokemon/exp/back/shiny/656.json | 2369 ++++--------- public/images/pokemon/exp/back/shiny/656.png | Bin 3155 -> 3681 bytes public/images/pokemon/exp/back/shiny/663.json | 2429 ++++--------- public/images/pokemon/exp/back/shiny/663.png | Bin 5392 -> 5907 bytes public/images/pokemon/exp/back/shiny/664.json | 214 +- public/images/pokemon/exp/back/shiny/664.png | Bin 526 -> 1975 bytes public/images/pokemon/exp/back/shiny/665.json | 782 +++- public/images/pokemon/exp/back/shiny/665.png | Bin 724 -> 4135 bytes public/images/pokemon/exp/back/shiny/714.json | 230 -- public/images/pokemon/exp/back/shiny/714.png | Bin 1837 -> 0 bytes public/images/pokemon/exp/shiny/653.json | 2498 +++++-------- public/images/pokemon/exp/shiny/653.png | Bin 2845 -> 2962 bytes public/images/pokemon/exp/shiny/654.json | 1511 ++++---- public/images/pokemon/exp/shiny/654.png | Bin 15115 -> 10781 bytes public/images/pokemon/exp/shiny/656.json | 1382 ++++---- public/images/pokemon/exp/shiny/656.png | Bin 935 -> 5620 bytes public/images/pokemon/exp/shiny/663.json | 2429 ++++--------- public/images/pokemon/exp/shiny/663.png | Bin 5870 -> 6121 bytes public/images/pokemon/exp/shiny/664.json | 296 +- public/images/pokemon/exp/shiny/664.png | Bin 835 -> 2144 bytes public/images/pokemon/exp/shiny/665.json | 782 +++- public/images/pokemon/exp/shiny/665.png | Bin 742 -> 4232 bytes public/images/pokemon/exp/shiny/714.json | 314 -- public/images/pokemon/exp/shiny/714.png | Bin 3347 -> 0 bytes public/images/pokemon/shiny/656.json | 59 +- public/images/pokemon/shiny/656.png | Bin 477 -> 507 bytes public/images/pokemon/shiny/714.json | 302 +- public/images/pokemon/shiny/714.png | Bin 750 -> 3613 bytes public/images/pokemon/variant/715.json | 42 + .../images/pokemon/variant/_masterlist.json | 8 +- public/images/pokemon/variant/back/715.json | 38 + public/images/pokemon/variant/exp/653.json | 40 +- public/images/pokemon/variant/exp/654.json | 56 +- public/images/pokemon/variant/exp/656.json | 8 +- public/images/pokemon/variant/exp/664.json | 48 +- public/images/pokemon/variant/exp/665.json | 60 +- public/images/pokemon/variant/exp/715.json | 48 +- .../images/pokemon/variant/exp/back/654.json | 60 +- .../images/pokemon/variant/exp/back/656.json | 6 +- .../images/pokemon/variant/exp/back/664.json | 42 +- .../images/pokemon/variant/exp/back/665.json | 38 +- 85 files changed, 16503 insertions(+), 21811 deletions(-) delete mode 100644 public/images/pokemon/exp/714.json delete mode 100644 public/images/pokemon/exp/714.png delete mode 100644 public/images/pokemon/exp/back/714.json delete mode 100644 public/images/pokemon/exp/back/714.png delete mode 100644 public/images/pokemon/exp/back/shiny/714.json delete mode 100644 public/images/pokemon/exp/back/shiny/714.png delete mode 100644 public/images/pokemon/exp/shiny/714.json delete mode 100644 public/images/pokemon/exp/shiny/714.png create mode 100644 public/images/pokemon/variant/715.json create mode 100644 public/images/pokemon/variant/back/715.json diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 3a981a08fa3..9548d694906 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -415,8 +415,6 @@ "712", "713", "713", - "714", - "714", "715", "715", "716-active", @@ -1541,8 +1539,6 @@ "712b", "713b", "713b", - "714b", - "714b", "715b", "715b", "716b-active", @@ -2669,8 +2665,6 @@ "712sb", "713sb", "713sb", - "714sb", - "714sb", "715sb", "715sb", "716sb-active", @@ -3802,8 +3796,6 @@ "712s", "713s", "713s", - "714s", - "714s", "715s", "715s", "716s-active", diff --git a/public/images/pokemon/656.json b/public/images/pokemon/656.json index 9f2483c56b9..3776b4ed7e5 100644 --- a/public/images/pokemon/656.json +++ b/public/images/pokemon/656.json @@ -1,41 +1,20 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 35, - "h": 35 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25355f0b039f39b6231cb75c6f8a0200:2e119e5dd64fab6d996ea751c24a38e0:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 35 }, + "sourceSize": { "w": 32, "h": 35 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 34, "h": 37 }, + "scale": "1" + } } diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png index b653616955db5df7ffed4479a3b52dca2eee8288..6acfe282dca78abc3dbe0bca782d1ef398c4fcb5 100644 GIT binary patch literal 507 zcmV2gu0004QNklcVzQQ4&CBsz_37 z&%!jNR{vaA+=xY?$zVQEuW8OiC;kLx0}+41Yaz^o*n(6W2nLgd9%DO|OcWZ-Y4C<0 z7;Wtr*Bu^}9#8O$G- zww!Mi11@H+4D*9GWN&&Pd;@`6=xg5aAVr8_AZO0^7jy!LCC+pBR&-r#80wp&Cy|dIt#f+ xWU5Ht0;&;{BPIELn24BB>y1v^qP`)U{Q$*H92eZw0#N_}002ovPDHLkV1lZ~-RS@T literal 515 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 CoNpKa literal 752 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 literal 4116 zcmV+v5bN)WP)f6Xi@@54ZTQ_E-Enz5K6$1 z03tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUFWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il z#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|>%+C|c55>;RS}qbKr-&IQ zTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bf ze_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l90Z_aBhs|Iw0E)7{bq;-T z9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g z$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL1(`yIK=_}U_z%PWq}jQa ziQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{wo%_#%{(V=tO#a9gB!7-$ zM?^BX5>d|Vn*3S!?g~$*UQipUP zL&zMmg;!4Do9IA%up=Rh?=qPj=x&RGBx1dpI68aT- z2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3O zju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvDRIYI4MQ`g1<+DyrL=EogS06Xii({|v`U^zjmmKqDIK93(F5q| z^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6bsWa4l)YH_rsduU0(?DsM zX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5oYvCT^3%%Fs?s{6^;Da# z?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR{dFa}^}2()GkV5)QF?`X z?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJuZ@h2VvIHzbs0S}Rx=JT z&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lghs_<#1?IcWhb_<+P8LFo z28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wuZrx~o$A)4PXj5p@WAm%6 znJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVPgQJ7Uq0M2^(ZDg$vDWbh zi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%562@eae34a)26HyS+zks@6 z$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWkUW(I*6U24LW8oFzvR(TOpMEs5_rp_~TJ^wNN(wM(bC zZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f)7E}wKr~0SXrM^xJP1~RL zDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N5;bK**^9Ef#WdN^)PTf9 zvR*Qp{o-l7TcBI8wqSIn=gRt3(5j`Y zdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7we(PI{6^cd0H#WFzsN0Cz zDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8%%N=0R?Jr6*6Z8cw;d=~ zF3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~E ze(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H9s-9XhaP{M`0e$>L5F*f zu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe@An_mJyvsE<#^c%!il02 zpHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf_v}A;-u3*k3(gmgUSwVD zy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+fub#UWaP88_{E^}7QP*$Y zNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw%>L5Kn>ODH}V8MesW8ASP zKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j|6Kdbc>FRj6+1Ql zT=e|YubW?}zu5oM?q%;5NT3T9w8XDy; zF8|?7j#QbwaLhWUluX&dkB^VPzrXnS_=lA|CHh0~4kGDc(G|7EwYfC|J+?f%(HZ%x)jIUlEK z5R==j7Fa#=cLIAjeDE7$*Ifo+{|i9(xD3Gl7l7_j2asTZ-P?Z(VExYlq+bQFq5}{` zKm1Jq_umMn9zFt~>sJ7*zbL`vmyZAlZGh-6tQk<{_1$HFSQq^w!1V7yGNZ?LHgwg3 zR(K0Qn)h{OP0_zE>w3Qizz9(N62SG>HJJWtZ{7nW`7-BCzXph!VOjO~8bIsry@8c- zvMd7NLq5&`!@w_aZfeQr*R}!CmoW%yI*$6UfnTZss*x&y7gq&Hze8jx06_F#!$2jB58UPxN(;)L*n^uXp z09sC1TJ?W^%mNyLW*L>~YbXpdiSuNs0pi^uD1iQ^5g0&sOsdcXc+%kxfEK+Jb3Ozm z0FM*{SpNmAKhLQ^pE?VMe2mdeDxhV6KF~^Fc>=79wCI@dbb#qcfa{0;BLJINq+j#A zbwCE5PoD_SlD-+J0etoL?c5kfEm6|%wm1S(qt8Jyq!(g10?I>h03cW+V0}xE>r0As zj4|muplRR{Ouq*%YMMAaz}ucc3#n8Ut*ofK4jTexH34%U0SW=I;oV+wA=-de54tt5 zeA0IVWq=!)b#tY8q9k*k!AnO0lzU#D0%F+dmjLGsu~FHGBBW^wugt*!D$R-*(g5_m zk48H~A@!v|ApOTo>SUrnMGKH+Nc4MM|Gm&dTosWmVs;<_o>=;@=WL+bL@x`*82^w z0ComKW`J^kr-%q|ItzfF7_zn6g*QR)+dRhIZdf5QBDLnb)BD zRlspK;RaHIPR|;I$Se?{0EqfCQ~-5-L8M`h8N|2x2G|>@JS*iEEQvY5&+heaaL!Og zAM--8>oUM>@(2AK(A1}yo#wMHD|^ChQ}MXt%N=Nx9$sYokS!SKeet>rvxT*W*iD!Z zfU-WH>E)SpO(pMWDEif4%lmM#7R~`U~VEWFZ&(UlEpYZw#4gEfJvmxee zJF(NJ84nx^Q5y>IXz2&=L{|X7>Y8{#;57i6d?*q!0A!nyo4YW=I|F)>;|K`ofKz?K z8Bo#(zd^fs*bx*^(C2Hf0d%Xl>l#NK85BUVx~*8j0hNntsk7V(pxE@53bg^yTtd+t zpP^?7I$ddN*BPLCO$)(KL*odI);FHaZ9pSW^1wJwlV=y{~rlm>xLO|4P3VXB-Q$J2NH`DuP^7eINLPk^a-ew1$&uy&Vl20fNS zUsf>viLzKcHSw1swYx+Lq-#P^LR84$tz>~8Gg%*+6=EGB3l##jt^i0DS-vT*07@Yd zDi&@4{&I@bk6p#E2jAcP%yXgpsT=T{U&1a0`d;NycfRqBZ+zn$-}uIV8GisKBz2T1 SkA`0W000024iUqiW$b5ZDf}<+t^JinPhB5kt`wmGKeDklD#a+?-xnd5;GX3 zEJKlOLt*U8kSzJeudna=-ap>wIp^HZeeU~Q@AX{Qn`mQY!oeoU1^@s!(58kM0DwW8 zzFz||(cg`oTe|dx!5?E{0C>@Nib@ZJZ7l4J=qm&Q(bd&;RSm%5aCe>W#+l~VU-?{_ zRyoo#l0|Auq9fP>Fjf};M}MD)M7~P^0M|vdp}t*k!HVNozwdCca^CdD!4a1NOeBh- z5!vn1c!>*rksMGR_o$hiS8=p$`u5r)-zIby-19+mZaW^26@|q$onVNy`8KRqqxK~v z3s3=RgySGL^M5%O94%?b4pl>@`DUO%uz~m4oGN_qS8v@onQ8 z*0&~jzk};JAg_`r2`vA_Qq8%WLpx2*n#R&sf{hF_^tOZMU#4(ip zY4k3za&24Q|CH(ycXGh*$JJo?A3^)d@2&yno;@3CRl@xzKxqYBY@ZO)U#XHI-6;ox z;m4?q8#F)WO`7_D(a|(*GsG)|&-p%}6w){?5~wJE9}D{v-67)IDnIeZgCK0a>;mT_ z&TUi%Re$1_UvjcKu}Fi-x$*rnT&E7c{z~}4ET4~_09diJ63>M8+}l@*Hq2MJO70iv z$&tInj*1iO+1aWd^P(6q@iQ-$61^y8!2(V|#wu0pF1bC9p`6}X>Wh2#!LFvpdd8#b zPf#n?7hv_crnoFuY@{D-fgsn|&uazpV-}>_?BC$ck_4yq0*1b)M@2f3y;D(2y*NwOjjJ2GE?QV3c1kJD1JWBrJ4 z?%{+7fx=6K4>FU+u4{wC!%dp_V}-1<+VfhqqYr|;0|6Q_?#&ZXT`lh~)=zNhmOeM$ zC7c$Buqh^x3?Gg@Q1Zj-eXkT&bwuDcI)Bc2g z!_?)3`R*GsW48}0wRIZq=rZ5ZKA(ltid^MDU5pik~ zihaGbGs4;@R$}TB6l1yMhPoa)@XG1k<`1Eo4C$LSL)DM0;o}dS9oHJ)nc=Ki%72Li ziwMCf$=&fAB3u2Jd=iSP(|0rpdo&~=9M-Ts8T~J$v(g%QSFsHEZB}^pMg0<}!L>1r zRz$>l>4%~#avBx5SBbcsSe%HHRjM$6pI;SmUmpH$_0q`~jS}MbAKRx;ekI5?@A%ny zhKSNWTGR@Q-X7e81cX8yybuD#SFW7f9oAuX zpI`3{2sWU||6955qX2YnAvvnG?Che7xZ1hmYjNRUZtid|1NUEQ8JVoLe0dX8aW!;1 z&vBzdm=Nyp2$pg}T7UPe*GxJ?M*i2zQtuklHAzYYc;C}O;y&ae zzm{xB-6G5?X>a#NtFF1MXJdjS&uaG_lc-Au>%2aCcMn!aU&(o|&jJD{li<6IO-gJF zZ^s`|OFltXKMhpH&8jo1{hOd_(sVZVP26Es1Uv+jFE{>3f0DpANxJ^#q{8Rx>?EKc zGoqs|T#VOntY9l%;SKjGu5Y7Y=W+%ga``r6OgM+@zZSvnqf_TILVdJfdNe|G^nKq5 zm|?v#)*i90ftQ5Vy_jF=PGMn(KH%($7>&K7fy?H2wfOa~0`F-AfAz1NV;T2l`*ov` zgi@$bpOz}o_h2hjk+L8j`CF!E>~I3ueY0)dxOPGr2&Q!%Ko;%R#$F3*a@>@{}LW<1*pT{hb2+Kk%GRQ%$E%QG4%kTW8k2m2Na&JvEE zpO%zP9M zQ{J@Yl+k{`%Oyb-XgM^sSKrJUGVWJ@ttO)?Qp1$W8pBTVN1GMKW-5c^kz5ke+Z-4= zg?f<%W>K)L?0jnax%{$WlqvcFT;iT4x(b_`F5F@EB(rQ-+7z9Ea~(uuW)?XOA@)zW z26XbuIzOLI&^v=h>oTK@o+?*~OH)bkyFIp#hto4VrH%K1W@s}q-%|zr|h1y6_o3vGABBW?=RjeLfc+(pY7Pq3}O|JK(inNb!3~X`0b4>15k+zNg$E zx{kUz@na>d3HQ#SsiR_-lG1ea2^(8?(#a9&nRmrHYk@;$Ib{Kr?AbaU#|}QT9b1-GDD_K8%UdpmgT@;;8Zu2qDjqObNFY`oQ)Rykm*i5i% z7-52jnjkGOJS5ZiPjczhiF9hT*;4n4R{OKm*v?1CCkpKzNlJSQHNJgB!f-joE&b3i z>sex3`F!wW299hFlJ0PtYCqb`H$S7BD8mtLRBCw9qUHc;90a67_ZgruR<>_Y1}WB! zs|)0d9^mX~(Z4Z_eA0sv8tw8oRwo;cU1o$vVQgJo?f)ELQ6^oxN-W8i@|M6IXL8Bz zUJ}VM4o`wz@u!M!PoT=U7EXl5B$l*DO~MeQN^DR7b>wPS5l-+KB1z4-XM_5s&~PuQ zux5y;chR;9Wp+%`Lv9|v$~dHd@^9lZa?WTnnFfa_zPEoDK+x zyGuyy`))w3UT#rG=>QI%icme~A8>RH5%nYjvy7UPRs6#=?M&|=CbprIBhSe z_aMNMB+0cG6=AUyv#C60N#4XdRKclYo&E02Hnrp^3t5LYf&nZfrC&4mX={>F6vdP& z9zJjeIA?dqAq@D3joDcm*?FeU`IhEd`#eA3k!hv9^eB0xnsXliUbWdHZFpxRZj@VB4j zB*;3V_{W6%o;}-wd9x^Kso7={akI!`ji4R4e8qTJfebZXpt3KI}~NIa>9L6nAW$?mk*e z$lppxb**pNzD)U{UdtxZy>6lEWpaY|sig;H?)ih<_^bKbWRJ#35zL&vB6sj1+jm$Y zDan!1n{wgWT<0j8MEqLys_-qwc*WENFNFhhMgEnYwaRsiW%Wy5dAuEpY)U|@xdYtg zl>-LF0G9csw$;#I?+y!Lx`ykzjG|-r5gtnZw5q1DUre|K&h%?uzKY!4!-`!k=&oom zLkUnRtDggS;dw*cvPg2K55*F!6$MfPT1rr>B7WPU9F;Otb2|wM<{LfvUI?6EK6vGz z*<}fJjruTu{YiHrB153xzm+JWp+^C5%1k)K&!k6)ViGiF+z z4WwR)a=FnhZ^>?>`f0S>gW*GkKr5fzcznY{rxqxfN9$~$r^Ek8-1uL_sYv$GKUlr5 z%C0$2PDtfnUnakb0=9y$B|%I6G~gRk3Y2!xqdQR0X1Dj~9VoxSz~L>>^ncRJ2C`9f z!*ccRJ>+^lu(!ZVKDhw{Y&_kSX>ISc(fdN`)xR4#j$`i3@w`d0-f^wBkb367ROfi! z3-T1J_q{rrEWATLcBIko2E-Hj)Op!uzAqq^ImVH>Mql=zkZ5i;NchPJ6t0eJC+Ipw a0-VARq@`8VTIs*t0JM>n;R^#?%>Mvlyn(C$ literal 621 zcmV-z0+RiSP)BV>WbkVReN_o2QYdv{}{Hy4R|;Advt700DGTPE!Ct=GbNc00I3;L_t(| zUft5ci{da82JrVl?|pH#%xx2qWsmAV;DCt7I#7bg0V!S!NboL$*8z&;zulL_&N$Pg z%U<`pRP+6K>4QQnYv^RKdi-`bFH&q0{)Q8K z6$L-4%8TtAgYBvdHhg}(t_IvQjRO`Jc20J|pz^s?_h$+m`oLoj9f1D`UQ^(Z1TYE3 z-@tkkzzX7b9M-{A8N^3C6D4lo;G}vLN>OS63*z1jf_PB*P@*4}!h@ME;s8wmvS}b5 zQURP9AZDF8}q^ zmU|vi7J#`2L^pQ}Q650)77U9Z*Czs`7bP;_Ckwmt8w3EksktCsOUVF$#rwCf#r5Ke z#8mxsV$26$Lac-$rIt$%fS?l;%4Mmb_oJRp7m!Mru$cD%=}eXc=--kc9U>sgdH~h{ zc^deVO*(ikAaDABX&`5m2B%X$fP4qJ?gN+s>J0ir@L%Q+N?+l!_PD2500000NkvXX Hu0mjf-O~|| diff --git a/public/images/pokemon/back/715.png b/public/images/pokemon/back/715.png index edcb84dbd2a1a185398fefc1e35e64795aa8b515..624780ff0c6f75e54f3fb73943026c954dff1871 100644 GIT binary patch delta 1048 zcmV+z1n2vK2)qc87&8b10002FlIzC+0004VQb$4nuFf3k0000pP)t-s0000G5D+MH zW;&*nKtMn=G&Ch8C6PEDf3%a8;{X5v5p+^cQvm<}|NsC0|NsC0|NsC0|NjsbK%oEt z1DZ)hK~!jg)!5sTqaY9lU^`WiNblu@`KmIG{ z{5C;@5x21)g0A&@c7N9=*auzAv+q7!?^~4vn)+7uja<$<-wcw|f57jFZx8@IkH$Xt zad|-MU%kZQ`*~^yvlI8A2d;rtnTZh&cPKOxjq|Vg2Z3= zT8RCv<-n`el=(Ru3tb9++}*$qc8V|XuKsaU#q<1Y8z*rXf7Tk{+z!XKrkfl z|Ji))25kFX{QgNds>(k&z~*CCaUZ&4r~dC5T5#AuIAGKNn%@Yxq2ltx4-YCQv!AvKo-7#jKGtOJ+(i>`$v)I z0T+Tbs5_4EG{8_C7QmPKxKDgEabdAAFeyK|VF2kL-!48rE#8)8`DwV3^M9%Ga=YAr z{7{x_!l46r7Xb%U)o#MTKMw4Zi_dAXFRB{s_-RCNe;fg!2!YbbzRvFH zpFae=A-Z2R1!P7396jDf&l8_BK62U2+!tMIuC}8%r?!UM4 z-Q>l^##fHgunafrzfuGQr~5hyIKQDL$Zyt%P8sGiTZ1bBKp|l8jeh{o)h6ZV)Cpn6 z&Fg?)O${<>j+g)o28Rfczx_!QB9M_UFA5jIpQbU|>HRMP@)}sit_F_$O}UPp;(#VR zgTiaLYl6n3h@GYaT!=u0p1BQDr>h1a0mAjn5wton_?bbb0Yo-NC~!Ar*#g{YI{lGh z9>FX{H~|v|?M@NYjejT)DZ;sa09VtgjYlX1q==V*`9?ve0X(5NM35&2ty6O+0iXd2 zQYSCxE_(ndi2K?p0@nqplhsC4&jCOeqzDV~6GJCLJ2`8dQy`~qMOe^%v<8ty0>GEV z(*@o_I%d{ zK!k1pK>O4{9tdkI)w&T~U@(@GYJCw2w67Aa$ZkXz3=gz`A70mpd4tnw0LQ?Z(-C6< zj0I*s=FB?(A2I;r>^NY@0#C0E=(TSZ7<@^U6xfjfUL6<)U&j0k=c@2k`W*kk00000 LNkvXXu0mjf^hUf7 diff --git a/public/images/pokemon/back/shiny/714.json b/public/images/pokemon/back/shiny/714.json index 135bc02dbd5..abcb8902edd 100644 --- a/public/images/pokemon/back/shiny/714.json +++ b/public/images/pokemon/back/shiny/714.json @@ -1,41 +1,263 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 63, - "h": 63 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:11292bc220f23110a419628bee722abd:b42c1c416a6792bd1666ba41005a2f4d:1a07d46e710b0568ec824f54fbc4fe6a$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 198, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 124, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 264, "y": 61, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 131, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 198, "y": 60, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 160, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 196, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 50, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 245, "y": 120, "w": 35, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 35, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 264, "y": 1, "w": 47, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 47, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 133, "y": 1, "w": 63, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 63, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 282, "y": 120, "w": 34, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 34, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "714.png", + "format": "I8", + "size": { "w": 317, "h": 239 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/714.png b/public/images/pokemon/back/shiny/714.png index 65433cec66599ecaf4c95281004d05c4cedb728c..e1e5d5dbec7e9992353dc0ef3d2484d906b2ddfc 100644 GIT binary patch literal 4059 zcmYjUc{r4B)E-O>24iUqiW$bfj%3Z6ZR{o@!q|!;Swi+@j40BOC3{(t-!GD^CB`yJ zwxLM2q3pXMS@MlvU*Gk;f4t9g&bgoa-1oWO>$$Es$;!frjfI~D006L|jrB1A0G%dn zzYb!cz3V%+wP_1oAjU`!@UrjBA}tWKGP5zDtq=%AUQ%97Q(jwDTiO-l;B4t+>x3;% z!+-1QwR`VOL$Cy4EG_|#|2|PkJeL6g4qLRou1#p(s?*ni?{KgZclzexF^4=%D2A>c z+2vM$nFDQ04ysIe*htPPJKiyV=e)$T1>FO8e^j5_!Q&i-VF?YV=;E!u4eL~?dj|IeBD{H zmswE>BHg>&m18~>JqBLJrQ&uUN=Yc63y{7-*>R8Dnm|`d>n!obv+HnAU2P-%VP!AW zg83y_HK8HlvAbh*0BnIMTi?%Z0SaK`r`hb^bU25#sQMsm8-ED2go0=CNV>P0e7{JS~Nj|@gOo#RS8Hl%`j$d|No-hfyGzi4M zS>7FC?h`38b_syw_3urvmQ1C;M1cjw z(A1PJ{HD-$|7E|#f=a@!I&q(hBu2vOb|z#0g>;l#BJU`a0Kd%&&c3W&2GzOOM^Fpe z9es4e(Pdfn@|6i6lqW7NIr&4|;$~Nu>*m#Et z(`LQ9_iJui54*(xfBon|^sAn_@#v$YBetyBJj#WzXNw7@F8@Tb%gdPiMJQ4P!Sfqh ziSfAB?BQ0=2xak&Gq>`OXH;*155i^(G5W0TtDC;*B7wFr6s@9}8>nnKBs*n7(Qde5wE)Z>2Ehv0za32yB4sq~7@D*OUa$#>+i_vp_ zqbDd-k0SSP`GKE2(6x!=q|&szhbrJ`<-k{CBfs3(nLR{<`gHBXTY|hMw|~1C>W1%+HolbR zTI;?IJ}{Y%zO`-I|G9HBX#RTiH04%4N>}msc5!;{*YaZDDw4A}B?^4t?I3m!V#})` z6IQbXvq;|GyWXsAD&t+BD9*Lkb=xTBvfc)_pU$1bwb9qIz8kZEAj%~84t;|n%fh?y zhl@qMkhR`{iiBBJdX;|@m5mzC#lKBBs)&MzVRB{1AL>pLc_vBM-kz5Ke2tX^3}8gG z)kKPL>yPDaNz@fF+JQ*^OaXUL`&EIEuV>_ zPx|^p=5_G0z=jXwYwamV*pVMNb0SV{|9HU86sLmU_{#TzN(@x}%08BUPo`fx21zW2 z3iN3xxBDM%hbvGPM5BL8b&nlQ0K0CqY#3HgC;`C~Z_h+Q=;Vy=0q?$(9WoEH$+uhn zXMip0T01~X<=8>8=eR1mRJ}uYaY4%n-tRV35sktxNz&ULUO?vT|8#pU zD6(O!N50ca6J4ENy_JSrns9qg1qHK55x5-RIf5Sx#?DWR zOC}9#bXj?Gnh|I$Vees5=i{>D3rjjM>wFhW_2C~ca#j3HDaIhWPv|^$`gBeBfxM}2 zTe3>1Kj5X}pfa>9da*~>#1b+dQ0rWkUJ0_f>nFp6j1Eb|eV_^2gv|4d4#bn5fs-_3fGmhg zCS7{K2)8oD5XxX|Iz^c!NOKf_jE*e2!Y}y|ORNKdpxS9%h{c#;A|2Jhp^~hUpmNqst+o>fpYL?0Xd76; zV<(3eAC+_roK3;bTNz_!7T67|33($`M(G(;_cZnI63jFAa7#WD{vdsS{YUCXQJ20O zN_Ds6aB3#$3aQ3vCBv?vl)26nUBbMCd5x+tnm}&xGt7?fNc}JKR8`oT=GD-IzjGL2 zgoYX+%`jXf;}1`>Y1BzHYP896*Q!SA^R)PmhbJfUZ61nC`U=#)dq~1?xFjt9P&4UX zW?B7w_+ti+Yz&cXbD3&A-p@6a)=rXQi!~_Lw>7IeL>h(w7oi7q&^Qb0wiDp60|sSwX*=r{~VF5V%WX8_$6O|KRLf@ zs9nd_x&dW!Lefoc9KK3FqzfI3+guPm{@^S<|dG2#B*& zK;-*gP_<5WL0j4 zxnIn{77Mr5tK-a@y;uwIz)(2#Nb7QVVI^RkzT{WK4^v_)0TIT~YBMRDut6kBjCvM%;uM${@9~Vs1TGqKn$l17GVLYmhU5<8G&>WR{)?7_w^JW(1w0s zn2Fb`0a!`PC&#(cCNi$_RLKo=>a;-;%rMn*BvQl>geX%>PuhA4f?ZCv?2k-G^O|2Q zs*&Jq|G2qW<9ETkLy1u;$r_d6O)b#d zbyQ7jCX(CuVi~8Em_u=edxM%*Q34b%pOW1r#+~%#H?b&*@?)=P;yfzCyH!a!$GCQv zH^mn$O=4Ponc`~7Q1r*aAI_D`FS)&*Sn6;fh8T`+oTcG9@L1y#y9wBf;SeMz+& z0Tw5TufHsdh^LrLe%S^z$Ea||yL&)WqBiT| zm+L8{$GmN3+~-N8PyQjcKODi9`;!pmoW{|q84U&1xs{c9Rr{zH{W0`4<4(k6>;gFr z0j6ph%wE@gr4@%xBxrlQ6DXXJZ0}i__ke(%_!V(+!Gldq0PeehOSn&iPQRtfP&{T* zzG)ytH$oi?I zie>fPNY!}^kh}ONwX7M*(V;Xm#>9U2!2$G*T}L)ltgB#ZY$xpC_X@wtRguVdy|Q9t zEn(af;yv%~9sZnIl%&LLBMCV=>)1R_@fZ=WShIh18WR%q4{WGaf6NGHn45U^xjQwK3F0d1vef$+TyM`4yo6w!HV7elp z;^Tfc;H4LJ2`fS=8GaOVutp3>5oj*9SP}Kx2IZufk(S*-Of=o>&hhNjT9GI+x;#3w3;0&wiYKq_Pu7w55Y=FAcTR zSAia>d|o<#VfVAqt=KEL?%W%QG8CjT%pMCxY+W11)an@1@xP(USkd2Olr><*4P;uI z4$>oPJx@v?U%odyvQ~PIC#8&mOkL9s@l@tX9gsqorPSAItcfd1S}&bq`#cpkOYIbHUyY{~vMve-US*Sx5h1b-pUO zXFWY7k$Y{0{5l5M40cY27X4|!Go~0U>7YY%Ag{@4@6|IHkt4<2f(M zQ_Q}1Yp62tHo5qb`he>YZ{#!A6}S1mpftufC&nsWnZx{cQv(7O5DJ~Y5gX&rqloy#Jv{;@u2phL_aEp2d}b-12h4swuN{| z2XJM8nDy$>T!$=d0khdxfP2{l@OrxzAXI;Y*E@JJ4(PJ@yu!1dbQ7e>K>W0A`PeV4 zLb`8Z7|5%&wtVdE1wbfA)Z_vq!yt&Rx26D8N)X@CfDGVP1R&jS!y`zmnIM^=F~+*I zVSvZR%-vgT_6LP|2dp2lxC6uENgofyeFxfZfHf|H8l?}$=lU^X(UQD_#+r%P{P+N6 zx!@6H0hoJ0baS^5(1Oh6|F7QValC{QB~>xL!Pw z*y!(0O!(kah?UT!_3`Kd5cGmVyBswPe$<=I0a6JQ4*LP1oXL^^{aX^GLj*+G0Kf(y zPXk}FNe8b5S;BpxTkk28PLjW^CnZa-f{>%IZwt(XooW6WH00000NkvXX Hu0mjf=*||# diff --git a/public/images/pokemon/exp/653.json b/public/images/pokemon/exp/653.json index 19654fbb3cb..a08242f32cf 100644 --- a/public/images/pokemon/exp/653.json +++ b/public/images/pokemon/exp/653.json @@ -1,1553 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 180, - "h": 180 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 47, - "y": 136, - "w": 47, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f19f65b0cc7eac6c736e7e4bd91d830:87ecb6f1ef5612019ef73bbf8249079d:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 168, "h": 175 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/653.png b/public/images/pokemon/exp/653.png index cf42c8754bc4c47c580b9ae990d80177db224b51..66e359173aa10e71051f4c9e9a9bce6d11ad066b 100644 GIT binary patch literal 2962 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 IM6N<$g2uYLp8x;= literal 2845 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 diff --git a/public/images/pokemon/exp/654.json b/public/images/pokemon/exp/654.json index a7f07f56864..74019f665ec 100644 --- a/public/images/pokemon/exp/654.json +++ b/public/images/pokemon/exp/654.json @@ -1,818 +1,695 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 390, - "h": 390 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 81, - "w": 47, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 162, - "w": 47, - "h": 81 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 47, - "h": 80 - }, - "frame": { - "x": 0, - "y": 243, - "w": 47, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 0, - "w": 46, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 81, - "w": 46, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 162, - "w": 46, - "h": 81 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 80 - }, - "frame": { - "x": 47, - "y": 243, - "w": 46, - "h": 80 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 79, - "w": 46, - "h": 79 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 158, - "w": 46, - "h": 79 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 237, - "w": 46, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 93, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 139, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 79, - "w": 45, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 159, - "w": 45, - "h": 80 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 46, - "h": 78 - }, - "frame": { - "x": 139, - "y": 239, - "w": 46, - "h": 78 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 139, - "y": 317, - "w": 46, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 185, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 231, - "y": 316, - "w": 46, - "h": 73 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 46, - "h": 77 - }, - "frame": { - "x": 274, - "y": 79, - "w": 46, - "h": 77 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 47, - "h": 75 - }, - "frame": { - "x": 275, - "y": 0, - "w": 47, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 274, - "y": 156, - "w": 45, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 275, - "y": 234, - "w": 45, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 46, - "h": 76 - }, - "frame": { - "x": 319, - "y": 156, - "w": 46, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 45, - "h": 77 - }, - "frame": { - "x": 320, - "y": 75, - "w": 45, - "h": 77 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 322, - "y": 0, - "w": 46, - "h": 75 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 277, - "y": 312, - "w": 46, - "h": 75 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 320, - "y": 232, - "w": 45, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 323, - "y": 308, - "w": 45, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6cb9cd08a225d9ce5a32640f2a1a4760:ab52583219972dae47f87bdaf152d0c0:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 152, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 172, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 213, "y": 265, "w": 51, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 282, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 173, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 60, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 110, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 165, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 282, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 133, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 220, "y": 134, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 198, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 218, "y": 199, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 271, "y": 261, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 51, "y": 264, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 337, "h": 393 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/654.png b/public/images/pokemon/exp/654.png index 31d16e68e483714a102aa8c254621525c03deba1..b1101648416769791f6cc9a43da72443f3169aa3 100644 GIT binary patch literal 10785 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 diff --git a/public/images/pokemon/exp/656.json b/public/images/pokemon/exp/656.json index 71ebaea1efb..3c2051bfe3a 100644 --- a/public/images/pokemon/exp/656.json +++ b/public/images/pokemon/exp/656.json @@ -1,671 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 96, - "h": 96 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5f39528f34681b7e85d5ea8d96776a2d:75313d84bbb64652e1825fbfbea72872:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 98, "y": 116, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 129, "y": 1, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 31, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 33, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 65, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 97, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 162, "y": 1, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 81, "w": 29, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 29, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 164, "y": 148, "w": 29, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 29, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 35, "y": 81, "w": 30, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 30, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 69, "y": 152, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 104, "y": 185, "w": 34, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 16, "w": 34, "h": 30 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 68, "y": 186, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 17, "w": 34, "h": 29 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 157, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 137, "y": 112, "w": 33, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 33, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 132, "y": 147, "w": 30, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 36 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 36, "y": 157, "w": 30, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 35, "y": 121, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 35, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 69, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 103, "y": 79, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 240, "h": 216 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/656.png b/public/images/pokemon/exp/656.png index 7afec8b08eecb7678a0abc0ddcc44eec053e4ae6..cc85a92ecbbec2b9fb1c918fa373f0735c1ff00f 100644 GIT binary patch literal 5620 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 literal 1034 zcmV+l1oiugP)Px#El^BUMF0Q*7#J8AMUpvcgIbi$VyxzS&Hsagl$@N!&CTZh{r$OkK zgXo_(y#XN3+s4UYu^awI0EqLtZ7Z9t>FZ6-fB_ILA1&Lm8;IFS?+SneuG>P(!c1zm zl2F!BZ?XVeD*y;MxNW0}4g@_R0z-+fNlab11e*ouP-P1%uzt_dCCIF90BYB$^iEPGlDR_LePKX zxXAYfxSl?DhnOJErx+*$1!&>B1CQ7F)VCOd?+DPseSAqfN1nayi#8IJ=% zJX*+?BE!c-`ME2=6CRSlF!J;!VF1M`BRG8`=W~78wcgMA;=E_s7fQ$-oSpqMz!hgXc)Pw_+pEg; zM`GvosOWO0(bWW&M0tQKu5kQj?{NK!G6Q2!8GxSy7;dm8U`OS0^XKSb>zye)2XGc3 z(|5_=47kE|J=uHn-tRlD6tDm;1*mX2vNY@tb4)0BrhgF5gHjSs{0NZYvM;9)$WED` z5B*s`xe|5@mlI0-@K3nzEe%eb0_-c8F9d;xcvenAg*&bUXx86U*+05$&=jO}T|qYl zvn&WTPE-q!UJ9OGNYF^SWust4P=kViaAm~*iD2|>2_is&>(ooWO@IP_eP9LqWk7cc0EP)0{{R33k=G?00001b5ch_0Itp) z=>Px#Do{*RML^$de$4DncL4K=L*R(*bJK!#l-H47Mt!Z!feU=LI~XZmuT_r(uVti{ zQC}-_#N{4(@agpqz&Eq`$t(XOqBaJd_P9` zZ4W4Qw zzAtou!+6smkML812M0~nGSuT4

    tzK_$Ha5EN|HNUBoBFH*FUJhPWMI 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 DS`Hhf diff --git a/public/images/pokemon/exp/664.json b/public/images/pokemon/exp/664.json index b44e028830f..5036fe74b0b 100644 --- a/public/images/pokemon/exp/664.json +++ b/public/images/pokemon/exp/664.json @@ -1,188 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 84, - "h": 84 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 50, - "y": 0, - "w": 25, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:463885b13604daf56d9395607b6a199b:02b6779c8edc4d65f396242ab67065d7:596e7d5b15b1bf041c4d7f6707c8ff49$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 46, "w": 26, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 26, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 46, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 90, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 52, "y": 91, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 46, "w": 27, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 78, "y": 91, "w": 26, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 56, "y": 0, "w": 28, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 28, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 0, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 56, "y": 45, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 111, "h": 136 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/664.png b/public/images/pokemon/exp/664.png index 5f7ee7f426ed52a04dd4f1ae917a0e843c14cc9e..d626085b5a138c4924d7fb41a73fdc7ebddcc4e4 100644 GIT binary patch literal 2143 zcmV-l2%z_gP)Px#Cs0gOMF0Q*5D*YHHa1O7O-@cubaZruT``??w8$6?+bv`o(gJ@SbDmJ9HTl8fPkaojv zSjg?-#2Yknr(N@Fr6BjUSb%$GT>96^)tGz>R#1QM?x2^;`G%#Wp|qBovq25QubX$a?%%{GksfSU$+Oq8^8fG~@!9cBy4QMM3lrsoP{ zWxZGmWjHq3ig`K8NHBdqWw7$;-!GWT%2md4y^fW`?1O^|{=M{o-Wb9K~M$J63K?iCOFl){X|tCuePwJJ9(e7T~1` z#WoogWjVNy^~Tjbrr3b?SUG_)*x!Jft9^N}v)EYSvs9SlUUMpfSkzb#rVcf>H?}J* zg#D>ZK~7nH0&F-6^Hwp@u?uCAj!G7gpP@Gw7G;gs5kP(mf^XIjx?Gq=|dqR4V% zgRn0~cU0|ja)*az{T%z?T(4PUTc3sQ?(AIOAQXeahveQrXJxLy$9;=27Mxt@TbsRY z7Prq)$U6!9yQ2?8J}KwMsmJ&|8@c`eQ14HESWJc z#~J_FPW|b+*EfmB#%8*F>JyuPY}enHG;{oS#$)Zq)ptI|U7{8%W~}9+n!90b+Vvm`ZvoAO!cz9TD?=sJEEGFEn8(0~fXF-N`m{e*R# z`pk&Us~5YQY2_4?c`?O!p`g+awnMh7oF>yUlBbxnS>_?$z3N;`;$$x2OZ2*qy- z*tKuZF+{f+lnsb+@Rt4xas0K;^d0dZbd^} zu3a#V7dE}2@NO3sj!bN3HHd81S|X-NIR!<#-DR_uArtnDPE)9NL;6f8IR{P+whgn! zJl{1<6KE_bmE6i%kk~A4);wS5DmfcsyR^*OHutPGXZgAo#M+JaQ(?sBg7&7Oq=+*+aDZF;@~{=_6`xh@+=;A8xDF9WR_~=g751XB7gZgx%yOGLvUF)$I&q+!lT$RB;=$f z3e>x?ogyYrV{HR+i8XCUdtthxwF!fyDon7%nsT_{G%z7j*O|}}Yhk&yuf&&iGj-jB zyk?hYnplHmlVqoYk&$zCorI1&3&Yn%&E*Xvrw-~tPo8y0R?4x*F%BhI*NK<`J$crG zLj{48Bg$%!qS-nRrp=aT)7On@NW(=o#nySyvtS{>(_3|NX^^eW$#0AeJ$Y7FnbQ=8 zca!+gm1lz%(3te% z$f>)#Wt%5H$p=qDh_;b`-%l}zCK2|otm+)Pd(f{8f5uH0{GB&`=&3kV z58XZOH%(U&rfVIoV}rPd?j9@%5z}>vL#EtjzbFsgy?HJfrc3xZr1- z$erW(oTB*Vp}Rl)!D0xqHb_4{Cr{*=hwdKr8>UMUWc_HJq3ZNQcTf6Rg6u}s>4)y_ zmub4_B!^IS%c^meb=MHeZqjs7Ri_f|@Z8<9O&2`Zbyb(frN4OMj^zllHHmOwH;&I; zF&U-{Cee#}hvy!(R83d3kI&hM?jCm3HJE#R&OCJYsNwn|irPZXJaqRj%N25T{RdJ^ Vg)t&w$(8^B002ovPDHLkV1jo-K$-vm literal 831 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 literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&3?x5zE|dgP1_3@Hu0R?Hf`YtLEmgC!vYMMG zb$5671)5E9%sPAa?2RR<@1l}ET;2Ke$FKiWw*3G9KTd730Z;>DNswPKgTu2MX$%ZZ zuRL8GLn02popyWE5(OStUyTs;8@Dr4L3O{_s94a#~@^ zKUS}qxzRIkTK-c!dPZ>8^O+~V|7x0Y_g+rE>%GhUD{^OVUHopV+NZvKzPhJv)*IjU zV^5tmWpRGc;Z187|7HGr^Fv?P&Rv>bhPlZ{ruEL)ej?B{GgWKec8#MQX1Agz&D}mr zuO;B{itpEix0!96C~)df#qndkJH?m%f3x6GrE$;pQr#JIw;S|G%?MkXwmdjpYO2)o zGzk~Wc^Z9+InyT_DaOpQ@|@zaNF`9Igq!K2kd|Gn>)!h%e3wJT56^ga#nMM}<;uo&iB|0=ese9( zj%b&9QF`u@N!N_^8kXU+yYfFr?Q6B%IraFVq+74QD*8lS5j>W;=^g*Ks$k=u%PCX& zrfy!=={0S+x#{L9T9M_iM2@9gHcP(3nY=0U_Od<$uf&Z`rrRugf+BQQuC#e2623Ek zx$I&8!l}RgX6@EJJ*o8Bo!rQ2YmASoE^d)kp8ni?dXG?9&mG67?Ymm0Zeb~^Tj3qy z={@DF?mhdY%xQ1epZN48VY}un{`c}5O-}Q9`GrK49Z{_F*2$~Cd1Sk2&XhM(Jf?d+ zn%e*6L9@hHQEt{+u?+z$l%Gvsa51T_Q%W~&p@;h!r-gkp;t#oXM`|Q(nbDdg>&Sg{ zkNB2=Gu4j!kL(fu;(Z~*aQ~4WvCm)zOD~Xd1t8>`Eqqu;k$zwwb>TuHfdc~Pp+I25TB-JzGL<3O*NA)$Q<{5 zcWH{fN5;kra^m()>fx@cB2NQ2|8}kUw?2N&{#RkC(q*-FjG#>8>FVdQ&MBb@03VR1 AIsgCw diff --git a/public/images/pokemon/exp/714.json b/public/images/pokemon/exp/714.json deleted file mode 100644 index 7deaf1909af..00000000000 --- a/public/images/pokemon/exp/714.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 179, - "h": 179 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 64, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 116, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:585d7099ac8249026b274a63ac9c25f0:8d770fdec6c3922ce9cc2e04a6453388:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/714.png b/public/images/pokemon/exp/714.png deleted file mode 100644 index 21c184bf4767d9e37869c9c15cace203ae13973d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3350 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 diff --git a/public/images/pokemon/exp/715.png b/public/images/pokemon/exp/715.png index 58f093d089ad4557bc1e7b4ea1ff28754e2a4e54..3967da0f1b9c15458b2ad0775c7411dddae0a91e 100644 GIT binary patch delta 8739 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 N002ovPDHLkV1i`TPBH)h delta 7310 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 diff --git a/public/images/pokemon/exp/back/653.json b/public/images/pokemon/exp/back/653.json index 48c09e77b1b..c5fb4a5db61 100644 --- a/public/images/pokemon/exp/back/653.json +++ b/public/images/pokemon/exp/back/653.json @@ -1,2036 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2657d933ba34a7364529c17b46d25589:b79a47cc022bd83470144fdf9b951be2:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 176, "h": 170 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/653.png b/public/images/pokemon/exp/back/653.png index 1f9cb2fe1682dba97a07e5dbac77c6cc6021212c..58682e90e581eb52599de21b9e9819e7195bfd9f 100644 GIT binary patch literal 2669 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 W$4G}asbYBm0000bW1NR64E6~NJ#ua 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 UB|IMZ_vWdkuBTS3Vi)y)05k42(f|Me literal 950 zcmV;n14;aeP)xr5qc1&p9El?0>Gh{Gm>pvkw5i#*# z)4@ZC=dNA?f-bH%l?TG)v2D23;d;?_LY1By^2XD3;oBLk>dIcHGz@cLUQrwnG zsgr<28bF7jzHM4R5Pj?j!D$+V+!CT&-Nya&89EG8IelU>Yb$*vP17gnAZ$&ao~P$! z+on@)&_PJde{*wAbqgnHDxrgr`e_=il#{=5>qgOcZpdLMA|7X#=S7QF*kMTBXw|*Q z^E^{qhZA-fvUH@lP->T}EjfFqL)QR99X}LFLe~JV4{~4WjuIK&;e-LbwHlC z@BJVbx<+{NEugFY%W&iEp=*S#F_E|7H@tdqk!ys4n}~-TANJ5;Xc}?i!4GVLbRvm* zy*Sz&Es{| ziP8aRu83uxso64Di4(iX*|2xKa*-D;OQ^T0x_RkrDE?j%xo*kf5Aotw+*~{TJR5R7 zHl>msw`3;wZq3d4hz;lE6|v)_)UEzb7PPOsJ1zj0S2*Za{46}%aRP8}x48t)1HN?-zMuI1NJ58Tt?|g}k*#kWfJSadI*m-y%{UBo zyV1>e%4UvqN@tdBDDH0<`m$47e(bQTFNZbQy65fAh{V5d_&BLKqA(1j8k|H?xbHSZn277m28s3vCKlO40g z*Y=6SHCee{JDEk>cDZLXVYcON<0oqHgeEI3m{++55lagw8#lyUgOtrs_Vh($07*qoM6N<$f|yCW00000 diff --git a/public/images/pokemon/exp/back/656.json b/public/images/pokemon/exp/back/656.json index 45c9ae75c29..78a3ae89852 100644 --- a/public/images/pokemon/exp/back/656.json +++ b/public/images/pokemon/exp/back/656.json @@ -1,1007 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a0be6653f39ddbef185db62f993cae42:d1b80f97b079891e5ee3e04a05cb932f:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 67, "y": 1, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 33, "h": 38 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 34, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 102, "y": 1, "w": 31, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 167, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 167, "y": 80, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 41, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 99, "y": 43, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 155, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 107, "y": 189, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 32, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 191, "w": 31, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 16, "w": 31, "h": 31 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 69, "y": 190, "w": 31, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 31, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 35, "y": 188, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 145, "y": 121, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 117, "w": 32, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 36 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 107, "y": 152, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 131, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 202, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/656.png b/public/images/pokemon/exp/back/656.png index 99119d2e96ed6860dc763ec91ae5cc9afbadb800..9e98534aab28bab2529525ed23f39ac6835f93f3 100644 GIT binary patch delta 3655 zcmV-N4!H641>qbaiBL{Q4GJ0x0000DNk~Le0002W0002s2m=5B0CkKB%8?-|5QK!5 zoSenY&F26A|3(laiji9xe+}13L_t(|oZX$-f}=VNL~%oB`~MHVm?c=2 zrco@FWYU3S(bM!Vj(Hs)HjoyUIi7;Boqun)+gz~fH#jWzpU=zsdYOF#YYy=fu_CGJ7t3n(8-F4F{QTHP{RYBh*-l?uimMgo z;;@QNel{nTmjMRre|S7DljFlE*OF>gAA;6#t!4G{dpR+T1{geFujk|E=kbV=-eZrUDmcY*89KR-Dy!0C!7O&_2&t}7z#W%ArD*73ND-{ep$_EF)b-5|9&$6bE2L31!Zu$KV_>j>)_ z$xMP7E7Dr%e=ijV`&D>6A|i=D4cj;`(>Ie> zC^=bupyMz3O)SKp7Q6t1HT=Zjtz;6B>{_mur%5@AAdbsiJ}NS%5eC1oeu@fl4pdpXrn*wcg{rEE9a zH7QDzf6TU$k`rQrFsqybC&n}(h+Hh$1>Uq}^onG@S$wbT1W&M+Aq`|+vgL72QkX`_ z3b_z*hDD{Ci6JLwg2T0ZL%uw+<>O3)#^olMixfHm6PO;=@<_#!(?BP>Y&A}-2^_oH zIHo%0PQ}ofuJ(bL`~PSF=01&)N6pdc2y=V9e;oryfOl-LMkObyl=F74VX)0x*cDQY zfY`A?8kLj)=1ynOLjt$bNLdx~} z@*t(=RbwI`c5IMFT~d0bGIQ`o^-?OfC@>LxR|;b8{|70Exue|{6;et&Hb^5d0CNYs ze=XQB(T)w$s3-(+`;bbtcZI+Rm>nC?5md5Kj}q9=rRKXWs4ydGE$-ML98pRj*w<3i z-4-xRVrL2CsH_BneMf4cYB~bEV}o%7lt8d=OC_q7M1Xf}Fpg@K#7T-95cbsLswENN z9UHbIWmFo7se9WCVAawH@Qw|CFND4)f9Fd<%-xm>swN^Jc5D!i2rXr%j-)bSj@eDY zXgNUV;UH(~P$~{{&~6G|3S#cIR4U9tyD2KPBp^D`0;E!5no)XE%KH?`12A<`stD8D zjgdr|+nA2#>aX~KxofGQYAOO9=!!#n$QEoq#U`p+U*rB^9 z9g>2WyD7Dh%shfQUMcG+<%rZ>Iy#B6C>_+InYzHvxzxDVBAgNA$y5<+K;4Q`1hJZg z%aNq+{P!1&sf)w@_JTr~?+8Mge~0ZK;|BRT^X|x}?qC3>UfNz@hN&*>k35`F&K42n zs5?@Ep?qNvLy*bD5$x&>8%*7ikV+`8%2pkLP1Ngc^qbz%IWQdVVd#xu+$b~k$~_E! z&(Jv?vxgxY{)f{?@ieu)pt4{8=26C8tXebdQ=y?>-z+YNRX-`QtzX}5e^Lin^^=ur z>(@6fMQYgVXDZjyuWvW0Gwk(~m22qNKfbW3iQZr33hZ@Ux+mV?1(11o0? zA_9&wa#BWB?vG0uR=HLw5U8g{MW{KfawRED1h7e+>6RZ-IbREbRf#5b0;`UyoF|0= zyDd%Xmfk^?vj-DFPm_9{e{zVUo3}DB5%e^v=UA1X=8an!m1F)#N@3 zt5VdQJm)MeOq2T{tjd(PXDb5(cE>cSlS{ys%iLx(BXFdY;V;Ije?)n^wle4lG}j%} zq)t8Opl2(CjzDYaXi`t1X3cXBgj^bB8U%U$E{CwHYEmb#D#7--O#)>tX#`=BSQSy` zI5Y_~u&T2N)4Um*1dJtM4LgF6MSz>sT@sk#YI70FykWU^NvH^1pq{q$U&k^Mc-^Ot zc}vUdws9NE4`MP3n*Yl9jVJ2{8Ph zW04k6FU;$70JD`dR(u`*FR@72q)t0{zvL^|>`srXmp%-f+p8S0Nua~&yA&IlEzUi- z33#iH?XS&Kwn?P0!bUT#!jkXx1js%nBcrO;+fGW(-_rv;f6PuU}_A_ckV=Py>Iw|#3b4WKScNTC`IvTV` zbdz#t0moq4spb@Ki?46^1>K}YDdf^&drq0T3?a|`7H@=LB+cDo6IA82D^X=I>Y*Oxot`GuEygd8gK3Ct`lw7|TOd zOdY!#fi)VFzmDw2SY}yJY1?s95f;)?HZ2!SSQL7#Ad#YST8f37c6t_v3k&l_Sdemk z`CRs=e_iL7A|9H1=aPe}4sy!cXLaQ&q@-MAuSyPHbz^LnOA4yG$VuDD)H#iG^WO&~Lcy$Zja#0TT4*|TE1rI{~KEP`pAk^;z zyj~^fFEf7!;PsuAAk?n{yuPy%h5Ai^*SSRjh5AK+*Skew42vWxhtWmvC)@}rBq{=^ zf3W)#j+D|3@GvUu0IFB6ilL4Hcmyi!=&ihRRisQqnm`#;*e8XcOk5M_<58>}g$moH zte1TRWujo{E_XTP+UbzPLWRw3qEmPgl!=0&T5gsO3Kf!D6wKlA!6Z})hPrakFep?w zky{ivB}uG%s1ywKYkL|osBr3e;x(pBe-sS$YkTR%sBj|BN>2)+ObiTlYbz>8JoU5d ziPw-a_4MD##e?BS=M%3XW$Ng^%Pz_h^J;Gs^>Zc9Gh$(osK|a+>uEORiPyzkG1SXJ zMfw}Q)kSx99SwNmHKa_<{dfAww)WqfeQh^V2R!lG$W=A`*2%_l?D_2YYww`uFm6G>6bV^vF z=}0kiRruWKp?~ol0OBjFi;E%XcSqe_*7bFmMRc z0sy?vNx@;@mL)F8FH6x5n3g3p$9}=l*2P5);lK-nYFWDGaN0!I>-5GhE^b^7mL)n+ zVQ?^MO6Tw(;H$BVi`OC@NkPM4tp+l{b#KC^rLzq+!@(sOkO8Q2@!5Ibt zll(ane%IB-MM-fSBw^Tm<#JyNGUa!6O6Fk~@2-O@3<#6ly5)Z{)Jn;~9mI}bsM43jpo7br5tawMl` zUCJAf8+zCVr}umfb#lJAcp2i}3lBENxnzCJ#l?|*yz Z2f{1`y**?%9{>OV2>?k&PDHLkV1jfT%|HME delta 708 zcmV;#0z3WT9Q6euiBL{Q4GJ0x0000DNk~Le0000+0000+2m=5B07mcHjegnNJQbH)Ciw!oKVg&s!35nZH2L1Oh z^q5eTkef}I##G47Ca5s^^Ip>mW+C#+7-In73ycrF{E2X$r}?;ve?!(Xg&`-(fA>k# zVcm5(d!E*MTs#Wxa?~b!`LQ0xZ|{4|R+CUJCvOD@VWY`LOd6L`m@#^jbyqX8Y%D2i zQ%?yo56Kk0iAI>q5fuN+LK8Vx?RFe04#7ebheDZ4Q8&Vr0v6HD<>z&6#y|ZX}TlK@UQz;WYQ@P;14v!NYf;n+ABrk?GfOH;Qf5&8)lAF zO)&zHBK~t&qkQ9c7`x}HL~_$0BGCMA$Hk2zchfM^=HWT9e-in27Nl(@qD$LKWLc#a zB9AJy?sW^&_H0|KN-cR^WgQb~QzL)Vwtfk-AZ?0msVZefY#wb(SE=YX7&U3^b*f4w zF)1{u_c~Rj8oenpebrp0T1zT28!FX7!qOYBQ&nn2kp0q%Hc<5@xPa6n=E|imAO6K9M#@1Ka9UD#%vhKm=V?8#&BG zrDP98lb~5LbrHS`wJH_V2(ttENa9eU)RAyst5r%KtdPYaM9QWM8)=djDT2=qv=I3}^8+T&MY~x`M796`002ov22Mn-LSTZc4mFAZ diff --git a/public/images/pokemon/exp/back/663.json b/public/images/pokemon/exp/back/663.json index 83f5b7ddc42..48526624362 100644 --- a/public/images/pokemon/exp/back/663.json +++ b/public/images/pokemon/exp/back/663.json @@ -1,587 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 226, - "h": 226 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e8559a9780e93da88e5a990643c22bc0:3bdf9c50c7e3aa9ed9acc8477ddf312d:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 388, "h": 212 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/663.png b/public/images/pokemon/exp/back/663.png index d241c8be871cffb5309d81af566de7b145149c53..6b49fc0a8032ae4cb27ab439fb7600537e4b3353 100644 GIT binary patch literal 5907 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 literal 2441 zcmXw52~d;C5)K+!R)|ZKWPym$-$)d>FG(UIk{^;MM#8Of6On)rL%7YK$J_lSrC#1VMSc7_hY>`RWto{Pk-Ih)iYHSV@0z->{Q+fgTW9~ z3fUTx<6Bc^JG3%7=cXWGVr6LyLUO;n{2@if(z9C8(a~;hZXtSrwzl>r%Y;NCMQCB` z>+8v6^6Lb(Z|jaOE-ssIP2RkD<7$G9i;F8YSC7w)k%vM^1zFQ0T_kzJ>R;XlC z+iNZo{!qe@kvzGYGV66ib>Q`8#GLhRe&b^lp)fwifB(Atn|G$zn3NQ$$BV6)pX6b= z=mu?>87r=veAh7gyCix{#T(|24wY3tJas8%{=%fnOb1F~q(&zEkg_~tq=qteLjAmn zV#e5oUmM)Ih}E3}#TS0bu3U4bo9P!3*G+q7m^1I(oVSW$JHpK{N(jqZ_e3yAzw{#x zv+PK=*yE)7zU&?F^0xOM#hB&u@a@uh4}9^;>9RS1e04#ulnIuv0{fRPm0*LK{^rVyOrtXU-IIOw!~Yrl1aI2l z-tz7=P_{WZQjybt1sNWU)#_gEi8%&wZl6y<&1m;?=h3P`?Q* z=j#t~qtXKkT-U2L0OM(tF}CaKAN8i?(|~tBM>TyWKAyU!N_2#eeknE6?LLYbFGYo^ zZ`-%aOxj;`VeLUC54^=ObohlZ9s2>rSC0%G?z$USmsm2xK)z{}YWLf}@v5aAK*t|6 z@=R$9N1L9=L!7&jO*{{;9@4m!q9>zTbJFUc@@V4&sP}ZbE7^jj9{II8J{w$N9wJ~W zVC<(d{?(QN$G|Y;dNf0}GfknQ9&D@VqX8r*c-#HV1F~)o+=WVVz=#FJHUZv0{p`bd z#KlFn>ORG`OtJnD2Pfa@p)43BWX|Q?QqfA86;GCnBPgv+-vQ?BlF^8)QJmX-%~OE~ zYHD{f-f{)H%XZ>=%3uNJraCYn0dU9MLK9B1Yh>EtT<=nD(&g#57x$tZH^HF5tfh+L zTRIPLR?jr@czuPFSJt2baQ`p0;QzvluBQV zA$~OE&`1^)95!N?@P(X^Om6eJUOB?qT93^^s`7{O8cKhG5^6{5iz?oSfZ9waoMmrZ z>~oc`9jBD-PxH9V)LywgSaYxLub+D&V!RxulYW?TYecreQCF_r0>ws!?e87e51K3XIP(v}L83jSpNTg0z3oIGcom_bht+3oL(cbEItP*k9# ztq4A<;@vX%h;ji%UE-M;Av=Y0siv){AiXAj!w3H)*SN@mUOC~5`k{zG7qUo9{d$h{ zvvL;U;T#m3VqsCm)9=mqda2)q+~TA?e1xWpDbj+fK$D3@7j}N%c^*EJyzRvg0_msLR#oM$g@&a zdgXQ9=PKUgynP09t|Y423%^m_rH6eqWw5!kZeXzeGRo}I@MQ^uV?{b*AgzM z%3gKLtx{!eNQM75JN__-OBlQ1&-!TB({tAEeeuPo3z4d}5}a3quC)ZmGi+=w#khcL4wQR4#9=ZKN5?n{O_FHqE zEns@3Ft%k2JuLjV;YoQlQ^kv$vNzjh4-%zI_>)JBRsD2Xo-@#kxNFuU9h&E{Hb}k0 zRErXvvAK_|W2dk(tP`jhD;>53=PA`H5LLeUslgY|bW9WG0xZvugVYuWYo#5pU{$>0 z$7NKE5Uuz-6xLLv%4`bpSs0||+_VuKK!sxRX?p}fl=F#b|Na)W3X+_LrNaAwyu9Gc zT6;M$+tg^HE~2I_yoo#}%_9`*3&!O*F_9-?3HK@m2vmbM-Ky#PaprC2xGa8rG;=J3 zXXu7KxNW2{@XJuJT93}1u?^z$ec9H^rVrggOE zM3A2U0BM{lfa$4*_f-C$XN3Em*Mj&b_vO4DHB$_2Eh(M%vw5M&}crdESf|=@M35r*=c=qB84m{1!?4xQ*M#}1#uCTTL1t6 diff --git a/public/images/pokemon/exp/back/664.json b/public/images/pokemon/exp/back/664.json index 10da9db36bd..61c85d30239 100644 --- a/public/images/pokemon/exp/back/664.json +++ b/public/images/pokemon/exp/back/664.json @@ -1,104 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 24, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 24, - "h": 42 - }, - "frame": { - "x": 48, - "y": 0, - "w": 24, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7fc62d03764cbb44c78d222a8281c03b:59a11cbddf36944dc23f528022e71fc9:596e7d5b15b1bf041c4d7f6707c8ff49$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 54, "y": 49, "w": 26, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 26, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 80, "y": 96, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 97, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 97, "w": 26, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 49, "w": 27, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 27, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 28, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 55, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 82, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 109, "h": 145 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/664.png b/public/images/pokemon/exp/back/664.png index 30664a6aaf1add9ec065e1888495ecad54aabc77..a8f0906c60d360e5738478b9611944096b54131a 100644 GIT binary patch literal 1975 zcmV;o2T1sdP)Px#Ay7gK6RaKX~ILKkUDdktB}o`wkAR z#lx8lo{~0`IH2g2^a|#onY>f6A(w3~4zYWb^IWm~l+{qVJjQMjE6AXaD*F!oK}psP zus`Z{egJ0t`e6ss?UrHWcMIwkaN#X7EQ}M0PRcL&fPIFJg0i@Fg24HqK##@WZJfHjBFNvTY37*U-ca`J9C;z#gq=> zpsf$HXpzizK(qQzrP-M?D`J=uwsn@aX^omrR@S3-*?TdQW2rLBhU=l5ZXrw2;4;Yt zkFiukF{FvKOSb%pKWRcsDrhT6f;N`(7HVp)DEE4f@1Ln&yC!T-|u%x)K!e?*3er}&FSTqLZ(+oa+?~oN=_zH zp(Yn^jfYA)GgFIn=*nbZfpuCLCb`N|TsUNMVE>LnBD^B+&-xj<`E)NEKNnw&=Z z6zhuW`U!blGg&q)FAMt|$(N_PNW%EM2jr%%Fpvxoh_xp1o$ZHe43T$&La;d{D<@Ad<-{NQWSD;SbMq$ywPqT; zs|H=A)rei9?FxF{vI@_Ajs{>tQ>q3|R*}x3^?ut1jbQVnj_(xU#gY)D7}HMRaTFef zpb{u2Ln8ih>2?xHS*k5j!9qzllngs`lgxH5u~1JJ9#O19fwwHbeW8NYPHwAb6BlSF zF~O2?Y3lOyS)QJ3Y$6$yRKn0sMybm++XeH$l!MHWjLoKk77kPk&oM|!5<6)XWFD!* zP8Wwtx^{9XcqzzpaTdp*qb^Cw(N3CrkMv|z!NFyDC8<;U&YXQ~@cxf(SjK(VEwFBZ zOeB9Z#rtm9L9&v>G7c9WoC!XH55%SJ=Bhs&WF_aBjK2v@2Y2bX*<3ymo|Bzi#?h&( z{-D;R!c$wu#f(CMO(a1~PTx5j$ffH<-zMT9Ase)e2OVr;dJ<$Mljuq066-uWb*x|* z^rTuYBU0xgtDwzwi3ctD+5L5`>FG&Gnw|_fI`x)z>4n+vwSz-JOqOmLmADxx@{@rC zyFz_imk2E5iG4qL6YNtQQF-Mxs>Ioa0zb)vZHiV;o|bWS?Br+@>rFZlS5Hc>muozU zWn8FDWWjhGfkoCbnr_%8lHesn?HsL2)MwxL$v()(U_EJ{3*#bE z#js^GHRo>wgtQD*=qLKGA4zB$Nst&%q7pCcxjz!b#`8uOVoZY6c-9p6g_yd*n?r!s zufEE3BGHg=j?5VLskm0n2X})?LE;&yxMb}(W`{Kb3Q|qw z7uq#->2Gt~8*_AGYUiZIKKb05G~2x0jOplSonW_`b<5?)R|(r4*$P|H*sUgTlQ*Mh znSpfFU)7pq6C@r~7$RCf1h|*+rXATI33VbDjbKn=SgGqLR&a z>~wt8Ekj{=>;BqDm**gBhNK$sJ&}^HyM5*9{`YQF;oW(<-|t4ZI^MOr5rz(>8xub} zI4TUW482)#qtp}X9Nc}gxuCIoRzhBPzEX)fJbeh%jfYGaKCyxidx?@F!Vpt!1s^`a z>n2Dh3=uV2ko+eyJx5~qG!1s0H|$z`a7FeMv3tw05i&GCIS2cG#%H}2YWFVe?OGi6 zGd^wx?4F|TZpXSa5$%J-&1So2Yg)=SEt28ey^(sm9pm~!n-*y=-|n5geD`OzIzH?M z?cPEC-Hv3_B5wxlUdO;sl1+=e8?bwoMnuV`MKXxpn`oS#Lm)=Fv8NN>2+1}rK5Ga5 z)xoE1(;{of_A?TCV;aHWb`MjwX^{+W_wIH(e%S0;?8~B`jDPAMck`(Qox1=4002ov JPDHLkV1go2ya@mR literal 527 zcmV+q0`UEbP)p%Kokb>JBH48kciO*+8AAXFGT+hAvd^{g(mHU10*n+=wIOE$byMm z7aaWO>|GzeydE9gdDHLfcOMfXxCODhC{)LwRP?n_i`D>(5{u|F6M2@aU=V#%A@aS5 zmWAR2UmWV9Y(i9I(XQZwrYN(hDvx0&cR3$mQOPPlhT(iQ7ij5x_A-0cTEiku3Z(^smz7aPM$;93`Pnmg;fS!$*TLnz*39~Q&Fy3I8 zPZrQ}yGXzvcSn&jw~N6kWBA7-+2M{tG4n8h^q+6kRWTaeeTPA-?ZR zUDH0j8RLzMCZNX;s;2uN&Ju52fDdSs(xb){$d2C7mP9oq8t#purgz zSfG`5?m_)Rd*dQink@Xu7k%lMe+v~_Dk1R^Ey#2lK@0Bibl~vLIOB}-{Q{@B-MM>- RE^`0?002ovPDHLkV1f?%>{b8( diff --git a/public/images/pokemon/exp/back/665.json b/public/images/pokemon/exp/back/665.json index 320219545d9..6e713a69311 100644 --- a/public/images/pokemon/exp/back/665.json +++ b/public/images/pokemon/exp/back/665.json @@ -1,104 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 37, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9899654837114efa492ec85d06cd415a:0050d8b3ae2b780795145dd4beb4e6bb:a72e6c94514c750d7462eab6b08ee591$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 67, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 40, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 5, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 343, "y": 34, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 5, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 33, "w": 63, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 36 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 40 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 80, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 33, "w": 73, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 34, "w": 53, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 7, "w": 53, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 38, "w": 47, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 7, "w": 47, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 86, "y": 40, "w": 40, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 40, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 101, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 34, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 36, "y": 75, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 194, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 228, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 324, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 394, "h": 134 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/665.png b/public/images/pokemon/exp/back/665.png index 1cb4789e140acae07e97530703016f642aeaac75..c989771bc5fdaad5c543d341fde93631c84175f1 100644 GIT binary patch literal 4130 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 literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4v3?xq_q~8Qm>H$6>u0R?Hf`YtLEmgC!vYMMG z^#z(uam+e<_Uw%%sqdnaK3v`T^T#jSxKA5_>KIFc{DK)Ap4~_Tvfp{SIEGZjUA%6D^d;tuwL6ZiNI%PzSZ zr~T_;-sF|Wzt`-1<62aFw`JY_1f{cG*X7M6vU~GdqwD0KdURQ~^Y-N|8(>8!Is)tmh89@4Elb$-P* zzfzA6r5$Exd$Tr+ICnM3IL+c*I&s1u>&3So^LsKeJ=iaK^`8CNl3KQf>)p0aoM!G& zuC-+5S)u9k8UAlFS#@%4P|xYd6GO6voLbsbT1~Q~Td-S_Y{MkkB+iX^OTju;r);eo{{PyXO--`C^mC4s%p05w&y{tY17MQaOEcV_I zqT&@u(VTt9f$D$)E5W*c$rVF1=7PjBL1I}~GjGL}{IabK*?F@nJ;eLz%DI7G7lp)L kudrAZw)2o?@2mQ&`6?R&tuOpEssg1KPgg&ebxsLQ0P4pkasU7T diff --git a/public/images/pokemon/exp/back/714.json b/public/images/pokemon/exp/back/714.json deleted file mode 100644 index ecdf5b1b813..00000000000 --- a/public/images/pokemon/exp/back/714.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 147, - "h": 147 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 13, - "y": 0, - "w": 34, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 34, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 60, - "h": 58 - }, - "frame": { - "x": 34, - "y": 0, - "w": 60, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5c3a62d7014eae3eb4c5e67ef6a405f3:1456f6425f3a65e77dc4017298499d80:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/back/714.png b/public/images/pokemon/exp/back/714.png deleted file mode 100644 index 0d81f19fcd4aea6a991e81dbee9174d625d7a76c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1866 zcmV-Q2etT#P)0000UP)t-s0000G z5D-8>Kv`K?W?W`!KXZ;$nZ0n#zpTIV+VVbCy9)pS00DGTPE!Ct=GbNc00!DgL_t(| zUhSAaZ{s)+#l?jJ>~$R3$tvBEPLb`-_7{+ID(vpINVZN9r@mt2HVRbG-R9uJ`nJbE zrbf(A;1vs8ubh%Wy2;4;Jd&WSfJ zgi?sU_vFh!f5$W8jSB(U-SZiiA^Q_nBEmlyNHw{TvM8~il9;ic(N-cl()BOVioPT-< z4aN~3;M<7QJ(>3>zKq#6bd}0bXMSl`}_V6PaJgTO!3^ z3^932g}rO?NmHQdn~HwX@|H zH}7&HMImpxpWfKg+#S|@c-G1yB-mZU7R#BKdMT~cDOIsTEMP7Q(1%j?SO<#@v*sXb z4fYjEeOAQ+X0v(oiq|_T)m99av&96mTA7XhndtS}nOo2fr1D0B0(rZ7#X}v<%xXEC zEf&*S^->2juF=|=TTq4HHr1&D2G6{+L(NPSi)E=?`9GDpt}~yNjRx7UK;B$8(o0>x zPirSth_Wf zNCn<$bJjK)Ya&ui3Wz?cQdM#Da?KgE0l*JFjBLcsKd-b+RI2nF^cqlBv3qcBQ;kW* zJX+5DKNotis1(!VWlRdRgYT0iefjuB$`SWbsjM88TF0fP&6pI68?3Yxk1qsL>0;bp zofc`Q3$p*QXrhs3msEx(8VQD}2KIR>(TFolHL%Z9iAJ1Zs)2o;PBh{SQw_{o(uoFT zL8^gSOES@jGfXuwYe^&;qYP6Gb8BqJ6O9!6q6b|-f~OrxG!hKk&LNd(j5BOMqr+ID zkzk~q4m&7|x6_FRWh3o$qCr_=g+=-aM%t-FgEG=asYIedS-hQ2G$@O=ACrj&WwebB z$wY%P+I~zY8kEuY6>%qtMx4>MK!-%4K^SQhhc_B_P*#yPb>Nt2D29Zj9XxDD9M~UO zpJ=p`xd$ZeXy(y&ASKE^(O4}+?EpgzN{~)^_us#G4ytmz$IO0wUH=b?wIB#>0s%QDJGc0$^haj`x zvq2cp=6#}(4?=}}V`0zM_-eoDjwaL4b+f6fAffPy1|J3#*PVf_XH#Wa4V_7R-V3pi zAf*u)CKRt3CK|mp1E>wGLS|oC@~&OM66Qjd-2sLPMT?0BTAy+g6|nswv*k05a=mx4 z4C}zh3YchUDQB(g7^EGToaCx?nFg%YNecAAl)^;gBvoTh5T+ff>VeBNf&?Tt(|w|0 zrRo6o49ceI$tlw)OBEy(z%y1JO`^e|R6(i$z!`|WPdoVVJ$-d7#I$UJgu;OGU=s}^ z#s|!$HdDjsE5FS&9KdlVZ^}mg?$Y2Yifx}F)oFGE>Rl>tRNfIgD%kvvc?=&WbvRypfOp3j|>{^4-k(6uuqqO z$3hU`iGYHpHWt$m#C7R>g#iUk39_3b*^)r>s;qL*SXI1FRF|ucPgO<>Hq)$07*qoM6N<$ Ef_P76n*aa+ diff --git a/public/images/pokemon/exp/back/shiny/653.json b/public/images/pokemon/exp/back/shiny/653.json index a5d273cff64..c5fb4a5db61 100644 --- a/public/images/pokemon/exp/back/shiny/653.json +++ b/public/images/pokemon/exp/back/shiny/653.json @@ -1,2204 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d04be8782bc4dd7044942acce05841d1:0e29431888e23f35da7ce4bf9b48965f:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 176, "h": 170 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/653.png b/public/images/pokemon/exp/back/shiny/653.png index efd98f5ee42afd1cd7be521f88fc178fd495489d..08b2420ad11ebd96d3b8cb7b81df4319c172b7b9 100644 GIT binary patch literal 2669 zcmV-z3X=7SP)Px#Ay78Wg>E8PC$_4=o%-T4eQ(qTFD^Utm)vkm)&)jGW+hZOEv zVvkYeRWs@Rbj?cY;;gnGuaA9?FP-j0{lkQtZ>74v@Qjtz6|h?G?nQGCCui*Wq{knV z*A`CfHen@oWf`<*E$z6BHzWc<_B^`9FTb^n^(;t!Sh^Tj9T&4}YX ztGuUDvk(#fYc`%?1ut2qa~0dcb2cD{D*yTc+rkSLL@sAh7+0()IpqXC zH}IxE3tX`(Lb|aWClt>rfIl<7q=V0MXgjW0)eNjU5i5?Q=?$IoLs(3Tq3H~C1o!Si_`HdMlqgmnZAp>~808;_z$)CpbY78S zMLS27RHLHv3XBktO8dK=P8%Bn24>G~_*_6yeFnYnlz=p!kJh8`&!u6-N|IFP$fglS zQNMS461o?VpWw&Xz_4PqB-A*%X&?0(pHY5>YJX<7I&bdBaK&oL{?y3E5ha$kh59~4V7{brKr=~0 z#Et86=PgP-6r7_<=a;0=o_c@ z#wxCwmh!r+={<9r_sqS>#fff2<8%@^dej9@Z+o_9%cjLqy}jAWyEaeb>b5vN2hY$f zWK8baEJ6yr6nY^Brf#>?xNzO(HZ})7O?ge4CH5B!5PA}I+o-pNjZH5{VAHlRd#{Ba zYsPVPTZ=3dg_@QQsD&PvSEg>OTN6Z)rWL-DitHW1soS|>MRIt@1vIS$HkDMI-S4Ej zouoLRix**_X*qH2=oWG;B|g@Q)jyyOlml;Cq>H0l={$kD735G!+inU7+&H?`i;qCv zN^;;=xe5YMIR>a$;T(diyk4WIgB2^D1H8&+AsVBpqrbuIKw%EBrhTZpDX8Hzq^WGr z(!!3$6v`p1n>5`?X~J40WxL9pSalud-k9^i>$-ui{YEGCDvQ&c+?c1eZgX!;cvZ0O zB5)fpKr#v}{#( z>@lU0qMYjVUnm=@H+4&3$Q$NZU#1Bbjs;Dsh!h~rW9fOX3)q19_pQ!2)NkN5k^ zx-G;pVg9hX3EuZNWpGHxf(h2SIHq2WMdH@pRn9TA=!ex_oUg3wioU;~Zf4@GSdQjLUF?c{!wH^(CvvgOjb80jw7%kFE!!EwkO^& zS=~T3W5z0P{Br+U0@|KmiDPKni;PHBeD&?W634){2aSkaf{KK#V1Y(Nx;1m?KMUFf z28@VsYhJfdBO=|J7YAM%k*~Jq#gS)5L?$cm3ViTJL?|oo3!EF<84;nZyf^Vttz<-m zvht?D6C)y)m3Jhb5BP<$^6JEbz>}?cU*K(RM8vZ4`o#1NoJZzjS$S>RwGolY%Ij7b zm?Hyzk*vHhup5|T1O9Jh;RS)+z&uX)o4E9EhQYG(!o=)^pBnJX+}kBf@e}@`zp#6| zIPj4t{H$q#x90VE-Mlm6~yo00000NkvXXu0mjfWs^d} literal 2508 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 F{{w3yLoNUS literal 950 zcmV;n14;aeP)`*VHfWZX@eI0F*x5Z6PD$ump-?Qf?MCw6@puTO|$P**%2*FM2`P>4cYu#3(^cgw~Q@MF!GV3UPB~8;O=pgKFo}M=s zW!t73ZqPwU%ztyU&UEwFX)2+EkVa`5?v<51a_fiT4{pd|C_)}@d_b9v3ZgYyz$wevE$U!ec|%3SWJQ z%E1q8g>*U5;pjNnL1<*@4$!qgU&r@FlF+rlyIhVe(|p=rd42S2b4(zzrW z45H{bv7y7zG!g0c2D>IaR@#c&+?pH@&;ckqbcPd zGlI9h(wRH*PrG!G0w4?nQ8c+h1HF(S-oqof>h&Fp8#4jjD)W~wX&0rmhzj!Px#Ay7JUVyPsP4jhY~rhjqF>-eyNw6M(a6ol>k`*=L&f>po4VX^;wUe?#k>>F5fh@Tkm z-;EyIn0+tZ2Et?uI+30lxLQ>z^7kiBd@ub5naS~bshPt_g?N8zw8SiwymS}{lOw0Q zIjhw;yr|O8OBDILxL*1Va+B+IX5ed8smR`cOmYs_ORqt0a=m7?=7-h$w-Jz+euL^c zRID%+f2|Z{K)CoPrOa~(q2#5*z%iM%fs7SNRlitPtKaww>F4LiHtIJJCd+pE+EQGt zFc*habn>$~vAhg0SjYW-nH(QRxt3I``Vh2^Yb~pn-^+<%G{E5bdOhzyKlgi-^d7UE zBh{*YH|gV#{5u8o(r+-`Uvb={;rh>IvIKSx=lC@N1LU{o;MK1qmZr5M=FHy(r*w=cALzSpM&s0dFeHXHd|Vsr^&N+4#o%eGQePu zWgCad_U~=x=U{wbF9QrNljm-+j{8mgCWl(Fj|wmC2C2}7yK{91bibHAT~gs>#b-JApY&{tl_OPfLd4Sln@-Im)rwqN7no}9YY z9LUF#pZSEB27@U&N+X%iW82EuO_GlxV~))SI-W^^UVyH{5r$!}sI{Z<{}UBJxTHg%gYj6gY`t2&EqnX zc!M##EfyJp@5C|)W{?FbRuonoSDnuP*+lBp>nJHZ*^bX>g4xTdj>4WM1Sw^^(XL5R zqGYy}l$;O~gjwYjI5DOPLF8h|F7T!;qgN#J!{U2oCwPLr3~3*~j zGb}3AObj_e6CAGP8}j9mEgxqZG%h#6T%^zmn85U?mPaaPxY>-A3Qm)sR2PrkL z8WRDrV}ms6lF}=cnS(c~mr}7sfr;R|QV?_hKS)8$9qqQLkW$*QK^lPpm^;{Q!G?); zY>-ApA&A?DRI0rz1V+H@*np0pl8t(lzxmPUYgZ1{U2^gTIW3S#cIR8Tb$0kLC)a71V+Gj$}D33JSD3P#HTIu8dq zQ-@Mg@95Jb1zD@s-_~aqg?hC$+|l*{9i|b1j&l2{1XF4+#17p>>5vq}+)b&4 zWabgf@k&`oDMzI4($PtjMd_dx&C~^U&ZWk^7U7H_Po|1s1L{_kB8b%_T#h7l=fA&L zOkEuIw-*$`d`A${JZ%3MH^|SKcSk;T2Lmwm()I!~Om$&@X4)mHqk;k23aR)tX_S3Jv}GW^p;J`bmjx{rYZ`I>4%*tXx~azHup1!(KmA zxt4x?yGfm4ub-@3L%;s9NoN?fr+4}Nj=A^1T}Bm%D_a>(WIVZRfd{3Ze?I1Xm3(iSe2pXjawO* z2zr{-b2DcN7%R1QD+3cjSChKD&SR)~>sAIPf^k@tq2|q78K@@rQCO9t=HxkNXO;7$uXF{a=-h6=c%UG7rB4@g~SSzNLV?J!N|(dRMUY8`}CI* zXIWG-WRAg@l_RL82NUG8yPaiG$&fh)Q(EvvEgnn|P?I5%MCB+3Q(EwdYT7WN*qdvR zNTzZOgDEU{+@Ni<6TB=M7&3*N3~zD4Q&iJrC)X)Pfo8696!)|%r{^kaN$$W4Db345 zIVX^lQ#rB^#lUBCGJnUiVA3{cpRso3$UC(LI}!8a##kPzV(Qq{2&~bV{B>kE#xl!- zO52W;im;HDvT3QciBsA%Lq(Lm*BbUeIUM|-kI8Zg6ibHjJ!PndZOT&(Vh7=#N_zqVtbM3$d zz2M1h8Fsg-^g-e~P&sZG3tm0izaWO;vx#*ZcqN0e7kmRnZSNK36H>e{?=1LsAlx~M z2?4mlS@0vn`yRlnTkw{Pa;Sd@;I%Ax5bE~W1ZCoyK=1cruA6euOVe>?!VJd zwzdD>>}$J`I^c=dMy{%*D#xFHuq5KV7bxmxnK^|TwRl)T@eQ^FEWM~a!N!skX0^#UnrBAPmgw}VzR zQ%gmRl=KtLZZyM$NxqM%?SLS@@wYk0r_~z6+6~$Fwj*8?Kyp3j(i7?rhJO5cu!uz_ zm!|Gtbo?cj_NV(IaTxrgM~_LI)O@@z5{AJ%dNjSIfd2OB=ddaagSf*kf^`4(>9??| z9|i&5Qh`2t#VP4j0>faWq!wPjJD~$31%-h_kQM;oeNGAv1Gg-3L4H|^cEGeOp*i*o zj1kYT`Sz@kZoq@Vl-qE=r2yAPK|fE0_CHkSV{j zQ!)>`cy}FKVL+JV)-C^wp;k%;?jUv?EHdrcom>YdVw z+115WrNwsuVG_|KxZC9^sklwgiGdCfOfrF~5u`>=gQZ{x8oVhBDoCA@!8eYu0}bAk z#SH2;9VF+vxowb~&Ve0Zn6!z#K#?hyBRM?-J0L<}#MYCXYAMhGVZr75<4rc$0koj= z{c+@g9UzOAe18l%@D4l{`3=PL_3`n1|J&m~NM0vzmpSpx00000NkvXXu0mjf@=4}< literal 3155 zcmV-Z46O5sP) zv!H;LgY%){EGW3rFi_2Q;qAfM(Ag~(u<~v&sm-vi6c$2>yYTjVTZ95sLg+QkZ?mAl zDeI2A*saa_K`AIe#i!`XWUZBgf-jv8H=4V+EuG9{DJYCpn)Bg%|<&X~h*VUyj@Lc?nY&HDj=-c4~r<{tyYU|e5VXZsg z^cQM63?F=|ZyE|b*RFE4{d%-o4FknizN;D36 z*IE~RSUSIMX^j0?SD-Gpx3^TFKg*`gqo#!tO$(T-pgpHN{)a-MSQ8Rb?zWG&xBqSC zdE8XVrb^B=H>tFF^f3#i;#ga-AM$Idt3=bjl5^R@r#nidB$tA*epsJUR$@}wblKH? zzmRj$-lUr0HkE={zcOm`_3HMEHYqqMH|<;f<92%wbD0$CN?n$n60zMbTO2>!-NRfom|I`EPQ|ewL&`x__Py?!vW2GFenF}XO{Ce5 zAyyRBtSj@P$TQu(U)a=nXj+u!3!=hX+w`N(N9S^>w=0@Um)+aG--`_eRcf8v|J3!y zrTR%}a`OdIp`)hMwN>MDse1PF?U!ZWH*KNm!O2zqosSI#m6a}~I~(T8rP@g;)qO!! zsI@Q9!nv}hdD}1PQ&cWKUu|Zzy+y)tWf0cNV9zZ)p9MkXpLz0fZcl$5j> z`elNW(iTI%Oi)tNV(6C%N=jM`{W3vGDT|?BCMYRwv6uTLX|X?1Nwl1j+S%)-92zCD zMnFke03{_;`h|zXJLeZv5*7}HlF}ACdDy{WJ+34yfRd6H%NP#EFQ6nW^q)XU35!XM zT!WIZZ~{t7SqwCigOWr+fQBkbi-D3fDoGSzuC&EKBdr1@K>?JMvY3Dakp`3m1yEAT zVxW;+fs#Z)&Q++i#ZV)tBrYImJ{BrzF{z{ml_U#dF7iv-Vge3YD5;0hVXmab(nN{ZN2MS25^(HN3|Y_VFid1xOd z&8?F5Emn35M+q~R?kHuV#ZXB+dXfFOF^9|O;8qi}5sO8!u7Ku2B^}Je=(#$k!@=pP zhewg2SKsf)+5(yfQ8erP=&hpD83LmC%t^IwTA~*Lj|pfCXffQ!;>(JBOngK!Cq7jW z@H_#z0OpDI6U0Yo!9rrarucA87azdtb;XC&nl3zC2&>7$;|k7&u$nA9uE1OftI5LS z3QUTynj}1^z+3>UDZ;}FPRbaWC_Jp-TrU?MR&cJD+Y2h(1E}?SDL}2X@TRAnGqolP zPpw2{WYSCHCbriE;gMI)S1Yd2=}(7$^P~(qv#PZ40Cen?3tRCmF6s0*>EK|M79N6* zy%H+i0&nbw_0z(06#+Wo6}Vf28#@E5wD1sg>=j?(7HClmtF-VW=pwJ!N_2WT=>>(P zg$JOEyz&!OqSND~N~MJdpo_iolNNVtG}m*5w=4j3!YfOvL@g*}g75_Bq*vzB-4v1# zUJt?pN1|8oZViNo1r#2Fj=iG0F?XZzuz?ZpFTGoo)(@>Mc=CWVCP7; z>de}!)yLaKtotzp1^p;@xN8N%14p{T+}MleIN9d0?vwV?`m6%s2}g#H+IATg=D9fi zb7{q=r7=AlD_`&_aEJp~oXEw}@xzFd4T1@6=0gUW;ypclk~tT2TOkm5Q3y#SgZtHjM=C(dqCfL;hq zDXS-L4$nSViUt3EdvoTV4xkr86J>?2BwE=*z!}YHN$7tsNH2sY%8E)ikt>;imSPBE zc9R1QLK9>Ku8at%bC?t8h0p|9fh!{d>K5iidLcAHR??Lb0f}NTC(;X`39^!|j0kwq z<~S$P3!n+I0#`-^%;PyJ1TNRoH-{Ct5(o%$f*O;q?4YS6Aj}DBL==io=nk7A0dY{G<$ z8jl`gGov-L$_koF0@?!4$@i7B_;QU87h*GVgwrcD?c`PBM&NZ3?klaE<_-t@H-{mX z{Z=ldEA3&}$gRZ~f5pY;&BFV@x{^f$u4KR6ZTh&WDs7jn3k1yU!&~nBdqR5<4cr{Y zesk=mif>BLc3nzOKu!0C``SrS_U`(evAOyhx@2W=vu(y?CRt&27L z!Ua>M0496b=zPIqe`xgU`A!YXIv*8Z`-&-K?aL-6Y zhJ(6C-&+9iV9#fBshE;}ZvnuQdvUfF8J>QlfWU)2pUtKM!;?P*g}}o-pUtLkwo_Tp>; z$nfAp>X=?Puoq_&Ko$>2oVw4EgaCU`ULnQ92 zyEwUr2Or;C1UEV4c3llz8%=dUE)Di`{2}0b3wD$B8F>M@hN&5U!}voG?=28cPV>k$ zPUVNgu^WE~^1a3X+pl9A0AU!2q83>s@&rhvpf(wfu_=N$Sw|BKI==T(aPU7 zU&ZBcI~g8=ud2*KwVAk`iphIbLNF6{Le;n$f|;J3aDYb@s>Wa@>{QyQ?3+-Pgm+r{ tJs<@s$BgMs&i6GDP6&D--KrbE%X2Y002ovPDHLkV1j9M`vCv| diff --git a/public/images/pokemon/exp/back/shiny/663.json b/public/images/pokemon/exp/back/shiny/663.json index d464b333f20..48526624362 100644 --- a/public/images/pokemon/exp/back/shiny/663.json +++ b/public/images/pokemon/exp/back/shiny/663.json @@ -1,1700 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 302, - "h": 302 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cee80289834c8acf0ea6d754131cf471:08d47f0b9be8c73bf8d3f74f4dc0a00d:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 388, "h": 212 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/663.png b/public/images/pokemon/exp/back/shiny/663.png index bb8a7a63b47cc84761cf6c9b8b35bf3bd293f826..ddb4658f34fb9ba5091e198e742b99a3acae0035 100644 GIT binary patch literal 5907 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 literal 5392 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 JPDHLkV1oUOvmXEe literal 526 zcmV+p0`dKcP)bx%v3|bjcu;00001bW%=J06^y0W&i*I zm`OxIRCr$P(!EZ@Fcbw~J40uiq85oIZL($Rk61dT@F0zl5*Q<-Tskr^FtQYd7eHc5 z8F@Ku=a$Qjn}NM|`c95drwZ?;#Qq{tJ%d=$*F;S_11w@Jg0E0SVWhl4aQ&x<_9B=i ziVfOgZHl-JK@tW{!Ut^;hd~-2LL-}q53opO8XdxLGM@-G@CzYl^I7M+Ujz}E22|iY zQk{Wc!E128YNGcHP{$-iU0rr diff --git a/public/images/pokemon/exp/back/shiny/665.json b/public/images/pokemon/exp/back/shiny/665.json index 74db8ba58cd..fe2659dbf6d 100644 --- a/public/images/pokemon/exp/back/shiny/665.json +++ b/public/images/pokemon/exp/back/shiny/665.json @@ -1,188 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 107, - "h": 107 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 37, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 36, - "w": 37, - "h": 36 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 38, - "y": 72, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:33adc9cf726011c23993f48b34d8072e:5df22173a3e399c0e4fd7f67a42a829c:a72e6c94514c750d7462eab6b08ee591$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 67, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 40, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 5, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 343, "y": 34, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 5, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 33, "w": 63, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 36 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 40 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 80, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 33, "w": 73, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 34, "w": 53, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 7, "w": 53, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 38, "w": 47, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 7, "w": 47, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 86, "y": 40, "w": 40, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 40, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 101, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 34, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 36, "y": 75, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 194, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 228, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 324, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 394, "h": 134 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/665.png b/public/images/pokemon/exp/back/shiny/665.png index 098b20d3d8283f228780e33b21dd591176380724..6b8ae18d7a0c5c4ad9d74c2201b54bb0bdc77df8 100644 GIT binary patch literal 4135 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 literal 724 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 diff --git a/public/images/pokemon/exp/shiny/654.json b/public/images/pokemon/exp/shiny/654.json index 08655169f2a..74019f665ec 100644 --- a/public/images/pokemon/exp/shiny/654.json +++ b/public/images/pokemon/exp/shiny/654.json @@ -1,818 +1,695 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 390, - "h": 390 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 81, - "w": 47, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 162, - "w": 47, - "h": 81 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 47, - "h": 80 - }, - "frame": { - "x": 0, - "y": 243, - "w": 47, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 0, - "w": 46, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 81, - "w": 46, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 162, - "w": 46, - "h": 81 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 80 - }, - "frame": { - "x": 47, - "y": 243, - "w": 46, - "h": 80 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 79, - "w": 46, - "h": 79 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 158, - "w": 46, - "h": 79 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 237, - "w": 46, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 93, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 139, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 79, - "w": 45, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 159, - "w": 45, - "h": 80 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 46, - "h": 78 - }, - "frame": { - "x": 139, - "y": 239, - "w": 46, - "h": 78 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 139, - "y": 317, - "w": 46, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 185, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 231, - "y": 316, - "w": 46, - "h": 73 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 46, - "h": 77 - }, - "frame": { - "x": 274, - "y": 79, - "w": 46, - "h": 77 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 47, - "h": 75 - }, - "frame": { - "x": 275, - "y": 0, - "w": 47, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 274, - "y": 156, - "w": 45, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 275, - "y": 234, - "w": 45, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 46, - "h": 76 - }, - "frame": { - "x": 319, - "y": 156, - "w": 46, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 45, - "h": 77 - }, - "frame": { - "x": 320, - "y": 75, - "w": 45, - "h": 77 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 322, - "y": 0, - "w": 46, - "h": 75 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 277, - "y": 312, - "w": 46, - "h": 75 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 320, - "y": 232, - "w": 45, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 323, - "y": 308, - "w": 45, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3bc1d6050e2efe57cc85a4e2787f5287:383941fac594bced71237ecb57b89444:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 152, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 172, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 213, "y": 265, "w": 51, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 282, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 173, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 60, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 110, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 165, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 282, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 133, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 220, "y": 134, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 198, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 218, "y": 199, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 271, "y": 261, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 51, "y": 264, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 337, "h": 393 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/654.png b/public/images/pokemon/exp/shiny/654.png index f619614c36210fdec9288cddb2e56d277cbc41f7..bc9177ec9184ae07357d557d20f53cfb7a5fe458 100644 GIT binary patch literal 10781 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 literal 15115 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 literal 935 zcmV;Y16cftP)ev*qyc`1`~7|MG=Qv00DGTPE!Ct z=GbNc00S#YL_t(|UhS1JYui8=hR+x}>uNPgakPZ~fEbB}#9720F@cVOt|^!-p+m6C zkwPJ*Ljxs4q0q%kA!C+65eDHQkf8~;cnJn`|E1qaC#%v+Nq&GIPw#7gk8QAd8PNg-8wU9SSfHduo$4dosI20Se#T+Jk-F8=?R+sjlvOf<+^JNj(TKvu!>4 zDdZS$2T0SNPhsV#!yU^hR| znlcKD1OC4Q6tbP0&(ZS@GTg^!xqw>%cLETy=H1$tjaU18{Wc!E?_dR5lb|L%XO{5l zVrIUceji=R?wJ+nKUSbM32MSLdtQAs#>~`6OEowz1zKA{O=u0PN@WM9mr4zTGZ0kr zgbXi~`a}k0IS6JTsOA}Cjh-qvh$jyqsOAU87=KG4RO*9_+i6l4Kqj~hLrKu<)5E%; zk^{=bamSYgZ>N+|Q08Fn4$^DR`AYgNO%6d&$*y=dPAy57A_ywkzM~~NwkLf-5d}7r zo9K30NA6F%a%|G0xYud1T+q%1i!9D5{}$5y`nFEQdo%CL)rg8r(8>jiyfQIq`i`PtxnP9R9I z$n9x^1ZiJ(1|BPlP!d!uG70kB;1|;{+Dj8D+S8B~g}n%=Sma2$7qrJ_?pr}jmvXZx zVvqB@aJeO8mxI}4%DqqqW-{l36$N9iC^C1s5nKmT#wd@?#Bk;cA}=7bhS%_HZg9hm z$Dn{*!s)@V!2EPzfuMM7(y#zvfuI0jfuJbCNy7qw1%d*A1%jdkCJhS!76=Le76^(G zm^3T^oHQ&-aMG{O1f@f zV4{FX2);AB<6!9fG?hyhr#WXX~xe*w0{5KBUC(=z}7002ov JPDHLkV1mG2l(YZ< diff --git a/public/images/pokemon/exp/shiny/663.json b/public/images/pokemon/exp/shiny/663.json index 3af6f5c5875..8c4ef182132 100644 --- a/public/images/pokemon/exp/shiny/663.json +++ b/public/images/pokemon/exp/shiny/663.json @@ -1,1700 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 295, - "h": 295 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8bf443d425b4203c8adbc0ffad215956:cf5b810e03b096373e0bdd0a7220fc2c:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 480, "h": 152 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/663.png b/public/images/pokemon/exp/shiny/663.png index 21c1e740e8d067b1631dc0f206ad0cc61807b6e0..a4e9dad1596ab81f3e8111166f2c24f97d17d920 100644 GIT binary patch literal 6121 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 literal 5870 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 Ef`8LAfB*mh diff --git a/public/images/pokemon/exp/shiny/664.json b/public/images/pokemon/exp/shiny/664.json index 07a901e0d44..5036fe74b0b 100644 --- a/public/images/pokemon/exp/shiny/664.json +++ b/public/images/pokemon/exp/shiny/664.json @@ -1,188 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 84, - "h": 84 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 50, - "y": 0, - "w": 25, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:abc9e31ee93d2f27a131cb957fe7fc3c:57e5ff2b24c643697831bc41f9168d6d:596e7d5b15b1bf041c4d7f6707c8ff49$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 46, "w": 26, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 26, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 46, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 90, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 52, "y": 91, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 46, "w": 27, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 78, "y": 91, "w": 26, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 56, "y": 0, "w": 28, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 28, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 0, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 56, "y": 45, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 111, "h": 136 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/664.png b/public/images/pokemon/exp/shiny/664.png index 2c10d379388b3b7271121d0437e38a4954427f1c..bfb8bd763714292376e73e6f5f6e3081970a0035 100644 GIT binary patch literal 2144 zcmV-m2%qPx#Cs0gOMF0Q*5D*X^9v(Y8J6Kp)WMpK8T``?FJ^Jb`#*1O z`GW31{+W6@nRHJ-NwCS{oH_)wQm|L@V5Jsza%uYuOD;Bm7rHA5Up9p#I|r|Boh5d2 zI#bass8(e)MW~P3W+iDk4$%af4eFw9aSdU=Z!R z4GXDVoOpvqZnJBCtQ6!v77K9Cj7$GGxf+vi!3yf{-5vCDDc!J~HI&y*vZ77XRm5sQ2^e@88+Jy|3A0 zlX*Ffg>mcQ_xj*y^%Jb+4kO1{AuPo9{m*aAxvX{N${BxhJd0#S<|1JY%3Oo>pWok- zHPmY=4COLwR~f)xR1`fUV|(rQr%Z;?j44dy0$TmTCd}-K9Ix?nj*|QgR%i_8YE8QJ z$?>|hwyPpAr8w8dSdRe`u^L=CxnG>@lcLz`f5u9UDKU#(!P?PaY2&PIatGR8!~(oD zq1Yy)qAUmZvEI14#}pgT9xEF#2KyUObG0uIb`~2ee3lAR+-pun5Q`e?!Q7$7_QrOF zg|Hu$mAyl<;ewL&C#IkQD=d8>X__%K|#)6XzeQUF~ z&Eokz3VA1Ce|PkO$S398IQ1C6XCv1iBrMmHyUzB~ZyM}ypU2#s%Z|DKs}HR&i)AzB z$Z+&9(kL~*Vl4p+p&Umcdxcbh=xJ%Sx#f-IFRC711P20Y_ zj`he(=G#1{q!G01xpu9;`UfpHeU_vqa8o`D-FGB~5?#mdLc+?<3mQ=Ssw+8wYR$T%GHo6(xGQo{OY}{qIxWxUHMs^%+4;Cq4ww=OuIK9- zQ;)e)&J}&O=L7F%%QeT>xx&t1u93U26LhPJmytcwVrS8%oEtPeA2(e*N1R-d+O24a z%e4#U@xrM$6yEKk!jXy1tOk+IT1&(=f>^uJekyD^X{GQU+3|G} zol60#u;)Cp=DIaE=)lqZ?4nDkE-&}De%(stsM)h{fLklnyG_q`z@L}|E!SnkDCHT^ zV8go!>L4FB_NyAXIgL(*b;Cgqg3MBlT=0DzL*y?%Cs&_}YX~mu<~TaWM0gZChJ>8d zM1guYwo}C9X{>EPF0rQVXfI56v^HUoRD}taSW^xcYz8Jo>N*oTVl6DU_L2CqZlpBrLpeN5- zaHt?~azt4TQZ!rV!F<~CZ2Gz}4QaT@sn|LXdKN4MczUZ&E)R0HIr)vTp(oGkDs!5` z@NN3&3OIc_b@lV{H(5Bt5-e4eU%)XzK;rI&T}-?M(2cQeb95#M%&gJfwq zK(0;4aM4yT4Qza%o%(uO5c*U$c62lt7Kf+f_}(;hPOWitIX-bh?s+@SbXk*R+|D>zch~QW4H?#F zbdvJ|>WmM6PIc2Y1sQT~s3AJ(rl`7`e%N$Tv(|0lBDSi-C+nW{(=`}A&vu=kn~v`y z2RU_jw`}voC;8$@2+=n3@B1m{&?LgXcnuZPHL8L;lU1EVcMtlN;m^3~g1_^|4?Pu! z>Y=-*{if+E!gQ^pb!-s#(A|RtA!52NambY0>=)&syEo4z!*mHBhZG+l@kO^_YcO&z z<#D|+Vt(1p6J%u$!o?vyboa7dG)xyA#31ru-OU;Y)3#0gFWR~%y9U85d57+vbXpHmdyJaqSmKUfSw)&}Xv=j4ez^U&R+e#3Mrf~+5{GgO^^=s_Imt9iF>ew&{ZBx~}T-xbzoK+_4-%wk8n{?8foA zD`vxV!6bT7@9^BCma6HB_VGFU(A~q1x(0KP&zXnr9yMHFL{VGFnTPKFWw}C*uKxf^ W;kRiU#din*0000?j z8O}r7Uformbeprd54?m8VWAttVhDA!4u-ser$Tl+Jt-Db3NJLI6ayX#-R&|Z*t~uU zWj$S{RJXH8Hbh9VoUy#b1SUnlD|ENZlw^N80Xox5C>#FnO0u3bgU=rK2#1h2E@F82G@IATxUEXu$EV#|Q-W1c#=-s;1wFuPoF4H!F&0-}r89I8MFRN@)ik$^y7u0!8#M z!!5fRy!O!$(gs^h&}v1}uh@pcBAH@FRgB1}v1XZa&JFfI2Y68}`6 zM9?QO@*_Vs6bd}~P$)d`c_@^cPD7!@ln;fXsdAxEG*vDXKChKfD02O_C!60SmP~$= zS@%o;p~(0|7AK%d>@(e`AuTV=QqLAiO+A( zYbC!4rn->dM6PUplbqIt{3fyG@|)zZw9RkdalYrb@P+gGmfy@5uGV6H6Bsx74Zmf2 z<+o|ndir2_<+oYXl1vo<5Mu%|Y6(n1`B-BX8MOq*uWHn)E1&)P{{Ro(L1(3PiO~Q6 N002ovPDHLkV1l`{d+7iG diff --git a/public/images/pokemon/exp/shiny/665.json b/public/images/pokemon/exp/shiny/665.json index d419d4e9f03..a06b1d10ad0 100644 --- a/public/images/pokemon/exp/shiny/665.json +++ b/public/images/pokemon/exp/shiny/665.json @@ -1,188 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 76, - "h": 76 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:af761b040cc08a74363c20cbe1eaf31a:5814711e03aeb472bfa3250552523d75:a72e6c94514c750d7462eab6b08ee591$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 193, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 40, "y": 41, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 80, "y": 38, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 3, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 34, "w": 63, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 80, "h": 41 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 34, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 37 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 37, "w": 53, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 53, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 343, "y": 37, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 46, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 41, "w": 40, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 40, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 227, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 295, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 329, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 363, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 397, "h": 135 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/665.png b/public/images/pokemon/exp/shiny/665.png index 316ad902306f35370ba073b58d1cae84751b7a62..7046825ae59c8a00400cd5aeba0a303be1be1e1f 100644 GIT binary patch literal 4232 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 diff --git a/public/images/pokemon/exp/shiny/714.json b/public/images/pokemon/exp/shiny/714.json deleted file mode 100644 index dc8d580d33b..00000000000 --- a/public/images/pokemon/exp/shiny/714.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 179, - "h": 179 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 64, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 116, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f10fb65b088005bbceee81a7323b3d04:cc45de39527285e86e95e3dc2425b833:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/shiny/714.png b/public/images/pokemon/exp/shiny/714.png deleted file mode 100644 index 53e4a6348be5a12055f2ec8d0083c21aabd34a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3347 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 diff --git a/public/images/pokemon/shiny/656.json b/public/images/pokemon/shiny/656.json index be71c2199a3..3776b4ed7e5 100644 --- a/public/images/pokemon/shiny/656.json +++ b/public/images/pokemon/shiny/656.json @@ -1,41 +1,20 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 35, - "h": 35 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:272c02df78d2de4eac23552f4c031224:82f806bb336ca1c034951e96a72caaf5:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 35 }, + "sourceSize": { "w": 32, "h": 35 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 34, "h": 37 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/656.png b/public/images/pokemon/shiny/656.png index 7779f40d332d2cc5cc3e9d2a760b533fbff2fb42..d65d9ab857dae83e6c4ba35d6e8e7191e0ad1aaa 100644 GIT binary patch literal 507 zcmVrg|5k2uzrVlu`1o^kbN}p&%)M|XQ-J^f|2HmB;Q#;t z3v^OWQ~&?}|NsC0|Ns90N>2gu0004QNklcVzQQ4&CBsz_37 z&%!jNR{vaA+=xY?$zVQEuW8OiC;kLx0}+41Yaz^o*n(6W2nLgd9%DO|OcWZ-Y4C<0 z7;Wtr*Bu^}9#8O$G- zww!Mi11@H+4D*9GWN&&Pd;@`6=xg5aAVr8_AZO0^7jy!LCC+pBR&-r#80wp&Cy|dIt#f+ xWU5Ht0;&;{BPIELn24BB>y1v^qP`)U{Q$*H92eZw0#N_}002ovPDHLkV1mQu-RA%R literal 477 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 diff --git a/public/images/pokemon/variant/715.json b/public/images/pokemon/variant/715.json new file mode 100644 index 00000000000..e43af20a0de --- /dev/null +++ b/public/images/pokemon/variant/715.json @@ -0,0 +1,42 @@ +{ + "1": { + "101010": "101010", + "2b2b2b": "43167f", + "343333": "563d8f", + "3b3b3b": "5f32b1", + "6a3f73": "0f103c", + "287366": "731338", + "575757": "7a5ccc", + "555454": "9166c8", + "801a1a": "5d173d", + "e52e2e": "903b78", + "ffe14c": "ff8a58", + "8e5499": "202558", + "bd70cc": "2f386b", + "3aa694": "a42c54", + "4cd9c1": "d04b6c", + "bfbfbf": "bb9adc", + "f8f8f8": "f8f8f8", + "f7f3f3": "d6c8f1" + }, + "2": { + "101010": "101010", + "2b2b2b": "5e3932", + "343333": "1d060c", + "3b3b3b": "c29484", + "6a3f73": "3b0c18", + "287366": "832714", + "575757": "ecd3c3", + "555454": "2f0d13", + "801a1a": "7c0907", + "e52e2e": "ad3419", + "ffe14c": "49ffcd", + "8e5499": "5b1922", + "bd70cc": "7c2928", + "3aa694": "b8552c", + "4cd9c1": "dd834c", + "bfbfbf": "43191e", + "f8f8f8": "f8f8f8", + "f7f3f3": "5a2a2b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 6c5b8b2d2ac..13c0c19bf3e 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -600,7 +600,7 @@ "712": [0, 1, 1], "713": [0, 1, 1], "714": [0, 1, 1], - "715": [0, 2, 2], + "715": [0, 1, 1], "716-active": [0, 1, 1], "716-neutral": [0, 1, 1], "717": [0, 1, 1], @@ -1510,7 +1510,7 @@ "712": [0, 1, 1], "713": [0, 1, 1], "714": [0, 1, 1], - "715": [0, 2, 2], + "715": [0, 1, 1], "716-active": [0, 1, 1], "716-neutral": [0, 1, 1], "717": [0, 1, 1], @@ -1927,7 +1927,7 @@ "712": [0, 1, 1], "713": [0, 1, 1], "714": [0, 1, 1], - "715": [0, 2, 1], + "715": [0, 1, 1], "716-active": [0, 1, 1], "716-neutral": [0, 1, 1], "717": [0, 2, 2], @@ -2192,7 +2192,7 @@ "658": [0, 1, 1], "658-ash": [0, 1, 1], "664": [0, 1, 1], - "665": [0, 2, 1], + "665": [0, 1, 1], "666-archipelago": [0, 2, 2], "666-continental": [0, 2, 2], "666-elegant": [0, 2, 2], diff --git a/public/images/pokemon/variant/back/715.json b/public/images/pokemon/variant/back/715.json new file mode 100644 index 00000000000..7ca4d81e5dc --- /dev/null +++ b/public/images/pokemon/variant/back/715.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "287366": "731338", + "3aa694": "a42c54", + "404040": "542f98", + "343434": "3e107b", + "252525": "260447", + "4cd9c1": "d04b6c", + "595959": "7a5ccc", + "6a3f73": "0f103c", + "737373": "563d8f", + "801a1a": "801a1a", + "8e5499": "202558", + "bd70cc": "2f386b", + "bfbfbf": "ab83dd", + "e52e2e": "e52e2e", + "f8f8f8": "d5bdec" + }, + "2": { + "101010": "101010", + "287366": "832714", + "3aa694": "b8552c", + "404040": "b18373", + "343434": "906152", + "252525": "6c3f39", + "4cd9c1": "dd834c", + "595959": "e2c7b5", + "6a3f73": "3b0c18", + "737373": "280911", + "801a1a": "801a1a", + "8e5499": "5b1922", + "bd70cc": "7c2928", + "bfbfbf": "43191e", + "e52e2e": "e52e2e", + "f8f8f8": "5a2a2b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/653.json b/public/images/pokemon/variant/exp/653.json index aa8c032d4e3..be967d6c9c2 100644 --- a/public/images/pokemon/variant/exp/653.json +++ b/public/images/pokemon/variant/exp/653.json @@ -1,28 +1,28 @@ { "1": { - "796934": "9f398a", - "fee772": "e190c3", "101010": "101010", - "cfb458": "c35ba3", - "7f2d1b": "3c195c", - "ec5631": "794cb7", - "b64126": "502c81", - "736a65": "68326b", - "ffffff": "fbecff", - "c5c5ce": "c093c3", - "524e4e": "404040" + "736028": "9f398a", + "ffd659": "e190c3", + "ccab47": "c35ba3", + "732e17": "3c195c", + "f26130": "794cb7", + "b34724": "502c81", + "737373": "68326b", + "f8f8f8": "fbecff", + "bfbfbf": "c093c3", + "404040": "404040" }, "2": { - "796934": "172547", - "fee772": "3a6a93", "101010": "101010", - "cfb458": "264166", - "7f2d1b": "005646", - "ec5631": "21d170", - "b64126": "0aaa77", - "736a65": "75553c", - "ffffff": "fff8ec", - "c5c5ce": "d4b996", - "524e4e": "404040" + "736028": "172547", + "ffd659": "3a6a93", + "ccab47": "264166", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", + "737373": "75553c", + "f8f8f8": "fff8ec", + "bfbfbf": "d4b996", + "404040": "404040" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/654.json b/public/images/pokemon/variant/exp/654.json index a413295bc6c..0f3b2bf3d4e 100644 --- a/public/images/pokemon/variant/exp/654.json +++ b/public/images/pokemon/variant/exp/654.json @@ -1,38 +1,38 @@ { "1": { - "983a29": "6231a5", - "f07944": "ab6ce0", "101010": "101010", - "bf5633": "6231a5", - "987028": "061530", - "f7e77a": "b55390", - "e8b848": "872b59", - "56301f": "471b70", - "af7045": "6231a5", - "8d452e": "c5b3ca", - "969696": "262424", - "414141": "404040", + "736028": "061530", + "ffd659": "b55390", + "ccab47": "872b59", + "732e17": "471b70", + "f26130": "ab6ce0", + "b34724": "6231a5", "f8f8f8": "f7e4fc", - "d8d8c8": "c093c3", - "5c5c5c": "262424", - "000000": "101010" + "737373": "5c255f", + "bfbfbf": "c093c3", + "804913": "c5b3ca", + "262626": "262626", + "404040": "404040", + "f8cf52": "80f37b", + "ffc000": "4fcb61", + "ff8700": "207d4e" }, "2": { - "983a29": "0aaa77", - "f07944": "21d170", "101010": "101010", - "bf5633": "0aaa77", - "987028": "061530", - "f7e77a": "2b5f8a", - "e8b848": "173864", - "56301f": "005646", - "af7045": "0aaa77", - "8d452e": "098794", - "969696": "1a1a22", - "414141": "404040", + "736028": "061530", + "ffd659": "2b5f8a", + "ccab47": "173864", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", "f8f8f8": "fff2dd", - "d8d8c8": "d4b996", - "5c5c5c": "1a1a22", - "000000": "101010" + "737373": "75553c", + "bfbfbf": "d4b996", + "804913": "098794", + "262626": "262626", + "404040": "404040", + "f8cf52": "c858a4", + "ffc000": "75308e", + "ff8700": "521364" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/656.json b/public/images/pokemon/variant/exp/656.json index 68743a4c9f1..1d1003f739c 100644 --- a/public/images/pokemon/variant/exp/656.json +++ b/public/images/pokemon/variant/exp/656.json @@ -3,12 +3,12 @@ "838394": "4d7dc5", "62ace6": "8363af", "7bcdff": "9c75c2", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "7ab7ec", "c9b241": "97d6e2", "dfcf77": "bae7e8", "174592": "37408c", - "fdfdfd": "b1e5ff", + "ffffff": "b1e5ff", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", "396a83": "362864", @@ -18,12 +18,12 @@ "838394": "cc6845", "62ace6": "c44848", "7bcdff": "dd6155", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "f7c685", "c9b241": "97d6e2", "dfcf77": "bae7e8", "174592": "198158", - "fdfdfd": "fff4bd", + "ffffff": "fff4bd", "9c9cc5": "c96a48", "cdcde6": "f7b785", "396a83": "5c0d33", diff --git a/public/images/pokemon/variant/exp/664.json b/public/images/pokemon/variant/exp/664.json index 02633098521..bd4164ca7db 100644 --- a/public/images/pokemon/variant/exp/664.json +++ b/public/images/pokemon/variant/exp/664.json @@ -1,30 +1,30 @@ { "1": { - "797987": "9d6260", - "f9f8fa": "ffffff", - "000000": "000000", - "cdcdcd": "e9c7c4", - "54544e": "895a9f", - "383830": "4c2855", - "727272": "a97dbb", - "8e5136": "838b53", - "f0d5b9": "a0c896", - "d8a465": "838b53", - "653925": "626649", - "383834": "383834" + "4d4d4d": "9d6260", + "f8f8f8": "ffffff", + "101010": "101010", + "b3b3b3": "e9c7c4", + "363636": "4c2855", + "747474": "a97dbb", + "4e4e4e": "895a9f", + "9d7247": "838b53", + "d1bf6b": "a0c896", + "b2b2b2": "b2b2b2", + "f7f7f7": "f7f7f7", + "855d31": "626649" }, "2": { - "797987": "590015", - "f9f8fa": "c83e4c", - "000000": "000000", - "cdcdcd": "a70d37", - "54544e": "377772", - "383830": "05312f", - "727272": "73bdae", - "8e5136": "bf8961", - "f0d5b9": "ffe0ba", - "d8a465": "dda476", - "653925": "05312f", - "383834": "383834" + "4d4d4d": "590015", + "f8f8f8": "c83e4c", + "101010": "101010", + "b3b3b3": "a70d37", + "363636": "05312f", + "747474": "73bdae", + "4e4e4e": "377772", + "9d7247": "dda476", + "d1bf6b": "ffe0ba", + "b2b2b2": "b2b2b2", + "f7f7f7": "f7f7f7", + "855d31": "bf8961" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/665.json b/public/images/pokemon/variant/exp/665.json index 02e88015c15..6d828dadb5d 100644 --- a/public/images/pokemon/variant/exp/665.json +++ b/public/images/pokemon/variant/exp/665.json @@ -1,36 +1,36 @@ { "1": { - "8e5136": "838b53", - "653925": "626649", - "52524b": "4c2855", - "f0d5b9": "a0c896", - "d8a465": "838b53", - "838392": "9c615f", - "8b8b8b": "a97dbb", - "000000": "000000", - "cdcdcd": "e9c7c4", - "6a6a6a": "895a9f", - "ffffff": "ffffff", - "f9f8fa": "f9f8fa", - "94416a": "005361", - "ff94b4": "008aac", - "ee5a62": "00aacd" + "363636": "4c2855", + "d1bf6b": "a0c896", + "9d7247": "838b53", + "4e4e4e": "895a9f", + "747474": "a97dbb", + "bfbfbf": "b294be", + "101010": "101010", + "fdfdfd": "fdfdfd", + "8c8c8c": "895a9f", + "4d4d4d": "9c615f", + "f8f8f8": "ffffff", + "b3b3b3": "e9c7c4", + "802626": "005361", + "ff4c4c": "00aacd", + "eed83e": "cae2c3" }, "2": { - "8e5136": "bf8961", - "653925": "bf8961", - "52524b": "05312f", - "f0d5b9": "ffe0ba", - "d8a465": "dda476", - "838392": "590015", - "8b8b8b": "73bdae", - "000000": "000000", - "cdcdcd": "a70d37", - "6a6a6a": "377772", - "ffffff": "c83e4c", - "f9f8fa": "c83e4c", - "94416a": "004270", - "ff94b4": "0092dd", - "ee5a62": "0092dd" + "363636": "05312f", + "d1bf6b": "ffe0ba", + "9d7247": "dda476", + "4e4e4e": "377772", + "747474": "73bdae", + "bfbfbf": "a70d37", + "101010": "101010", + "fdfdfd": "fdfdfd", + "8c8c8c": "590015", + "4d4d4d": "590015", + "f8f8f8": "c83e4c", + "b3b3b3": "a70d37", + "802626": "004270", + "ff4c4c": "0092dd", + "eed83e": "ffe0ba" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/715.json b/public/images/pokemon/variant/exp/715.json index 4ca2bcad56a..0e97862f10b 100644 --- a/public/images/pokemon/variant/exp/715.json +++ b/public/images/pokemon/variant/exp/715.json @@ -1,20 +1,38 @@ { + "1": { + "101010": "101010", + "404040": "5f32b1", + "6a3f73": "0f103c", + "287366": "731338", + "3aa694": "a42c54", + "8e5499": "202558", + "bfbfbf": "bb9adc", + "595959": "7a5ccc", + "801a1a": "5d173d", + "4cd9c1": "d04b6c", + "bd70cc": "2f386b", + "737373": "563d8f", + "f8f8f8": "d6c8f1", + "e52e2e": "903b78", + "000000": "000000", + "ffe14c": "ff8a58" + }, "2": { - "404040": "c29484", - "595959": "ecd3c3", "101010": "101010", - "287366": "832714", - "4cd9c1": "dd834c", - "3aa694": "b8552c", - "801a1a": "7c0907", - "e52e2e": "ad3419", - "bd70cc": "5b1922", - "6a3f73": "3b0c18", - "737373": "1d060c", - "8e5499": "7c2928", - "bfbfbf": "43191e", - "f8f8f8": "5a2a2b", - "ffe14c": "49ffcd", - "000000": "000000" + "404040": "c29484", + "6a3f73": "3b0c18", + "287366": "832714", + "3aa694": "b8552c", + "8e5499": "7c2928", + "bfbfbf": "43191e", + "595959": "ecd3c3", + "801a1a": "7c0907", + "4cd9c1": "dd834c", + "bd70cc": "5b1922", + "737373": "1d060c", + "f8f8f8": "5a2a2b", + "e52e2e": "ad3419", + "000000": "000000", + "ffe14c": "49ffcd" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/654.json b/public/images/pokemon/variant/exp/back/654.json index c7524e01b9a..0f3b2bf3d4e 100644 --- a/public/images/pokemon/variant/exp/back/654.json +++ b/public/images/pokemon/variant/exp/back/654.json @@ -1,34 +1,38 @@ { "1": { - "907020": "481332", - "ffe060": "a85789", - "e0ad10": "682546", - "040404": "101010", - "803020": "471b70", - "f06030": "ab6ce0", - "bf4020": "6231a5", - "202020": "262626", - "cccccc": "c093c3", - "3c3c3c": "404040", - "fdfdfd": "e7caef", - "a4583e": "6231a5", - "414141": "404040", - "606060": "5c255f" + "101010": "101010", + "736028": "061530", + "ffd659": "b55390", + "ccab47": "872b59", + "732e17": "471b70", + "f26130": "ab6ce0", + "b34724": "6231a5", + "f8f8f8": "f7e4fc", + "737373": "5c255f", + "bfbfbf": "c093c3", + "804913": "c5b3ca", + "262626": "262626", + "404040": "404040", + "f8cf52": "80f37b", + "ffc000": "4fcb61", + "ff8700": "207d4e" }, "2": { - "907020": "061530", - "ffe060": "2b5f8a", - "e0ad10": "173864", - "040404": "101010", - "803020": "005646", - "f06030": "21d170", - "bf4020": "0aaa77", - "202020": "262626", - "cccccc": "d4b996", - "3c3c3c": "404040", - "fdfdfd": "fff2dd", - "a4583e": "0aaa77", - "414141": "404040", - "606060": "75553c" + "101010": "101010", + "736028": "061530", + "ffd659": "2b5f8a", + "ccab47": "173864", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", + "f8f8f8": "fff2dd", + "737373": "75553c", + "bfbfbf": "d4b996", + "804913": "098794", + "262626": "262626", + "404040": "404040", + "f8cf52": "c858a4", + "ffc000": "75308e", + "ff8700": "521364" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/656.json b/public/images/pokemon/variant/exp/back/656.json index 34b11bfab78..f41398f3154 100644 --- a/public/images/pokemon/variant/exp/back/656.json +++ b/public/images/pokemon/variant/exp/back/656.json @@ -1,17 +1,17 @@ { "1": { - "838394": "4d7dc5", + "848496": "4d7dc5", "7bcdff": "9c75c2", "62ace6": "8363af", "ffffff": "b1e5ff", "396a83": "362864", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", - "174592": "198158", + "174592": "37408c", "5a94cd": "7054a4" }, "2": { - "838394": "cc6845", + "848496": "cc6845", "7bcdff": "dd6155", "62ace6": "c44848", "ffffff": "fff4bd", diff --git a/public/images/pokemon/variant/exp/back/664.json b/public/images/pokemon/variant/exp/back/664.json index 65474e240f3..ae0ec9fc792 100644 --- a/public/images/pokemon/variant/exp/back/664.json +++ b/public/images/pokemon/variant/exp/back/664.json @@ -1,28 +1,26 @@ { "1": { - "797987": "9c615f", - "f9f8fa": "f9f8fa", - "000000": "000000", - "ffffff": "ffffff", - "cdcdcd": "e9c7c4", - "383830": "4c2855", - "54544e": "895a9f", - "727272": "a97dbb", - "d8a465": "838b53", - "f0d5b9": "a0c896", - "653925": "626649" + "101010": "101010", + "363636": "4c2855", + "4d4d4d": "9d6260", + "4e4e4e": "895a9f", + "747474": "a97dbb", + "855d31": "626649", + "9d7247": "838b53", + "d1bf6b": "a0c896", + "b3b3b3": "e9c7c4", + "f8f8f8": "ffffff" }, "2": { - "797987": "590015", - "f9f8fa": "c83e4c", - "000000": "000000", - "ffffff": "c83e4c", - "cdcdcd": "a70d37", - "383830": "05312f", - "54544e": "377772", - "727272": "73bdae", - "d8a465": "dda476", - "f0d5b9": "ffe0ba", - "653925": "bf8961" + "101010": "101010", + "363636": "05312f", + "4d4d4d": "590015", + "4e4e4e": "377772", + "747474": "73bdae", + "855d31": "bf8961", + "9d7247": "dda476", + "d1bf6b": "ffe0ba", + "b3b3b3": "a70d37", + "f8f8f8": "c83e4c" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/665.json b/public/images/pokemon/variant/exp/back/665.json index 876adeed0ea..c5defbab5b7 100644 --- a/public/images/pokemon/variant/exp/back/665.json +++ b/public/images/pokemon/variant/exp/back/665.json @@ -1,16 +1,30 @@ { + "1": { + "363636": "363636", + "d1bf6b": "a0c896", + "8c8c8c": "895a9f", + "bfbfbf": "a97dbb", + "9d7247": "838b53", + "101010": "101010", + "4d4d4d": "9c615f", + "b3b3b3": "e9c7c4", + "f8f8f8": "ffffff", + "802626": "005361", + "ff4c4c": "00aacd", + "eed83e": "cae2c3" + }, "2": { - "8e5136": "bf8961", - "838392": "590015", - "d8a465": "dda476", - "f0d5b9": "ffe0ba", - "cdcdcd": "a70d37", - "52524b": "360000", - "653925": "bf8961", - "000000": "000000", - "f9f8fa": "c83e4c", - "94416a": "004270", - "ee5a62": "0092dd", - "6a6a6a": "590015" + "363636": "360000", + "d1bf6b": "ffe0ba", + "8c8c8c": "590015", + "bfbfbf": "a70d37", + "9d7247": "dda476", + "101010": "101010", + "4d4d4d": "590015", + "b3b3b3": "a70d37", + "f8f8f8": "c83e4c", + "802626": "004270", + "ff4c4c": "0092dd", + "eed83e": "ffe0ba" } } \ No newline at end of file From 3018a747bdc94161f9b5255e989c674279877e84 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 18 Feb 2025 03:26:36 +0100 Subject: [PATCH 056/171] DuskNoir sprite fix and base sprite fix (#5338) --- public/images/pokemon/477.png | Bin 12961 -> 13884 bytes public/images/pokemon/back/477.png | Bin 11132 -> 12406 bytes public/images/pokemon/back/shiny/477.png | Bin 12555 -> 12406 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/477.png b/public/images/pokemon/477.png index de140bf6ba9c8b8ce164af50099fddec3b1cc6f3..1013ca3d0ddd1a3d915c0bcea60432d85870b24b 100644 GIT binary patch literal 13884 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 G2>CzGB5S|^ literal 12961 zcmX|o1ymeO(Cy*`m&Gl(23<5bEN+YI26uM|?kw)Ei+gYg?(QB!a7_roCGz+|)J z77@`@QZiKHvC!1CFtmv9@W}tjT3?>u%R@FdTEElAvw%s+|B6HK)Kt>~NFHxk0|2}% zin3DLzR>Rl-{R;uKb@54QsY{4C8xA#W^kftQ-^nBkSyFcVFulB4ljj-rqFhfIhrzV zd~YZZf#kRwc3^kH+&&;6);V{Bd2gE4F~_*>r_0Z>>W3!m(}Gvz@@dF&{CK^Z`8KJz z^B#X0xzY78CvKsN|Gob^*pF5e{8y{;^k!b-r+(Fo-Q`v-=ud6!^8rXz!bQL8bCrDM zr>b8MEnnTco@?Quo?XTj5>C2RpHF!TbQ#_MQR#mBb{x(a82rO92JC#0Sugk0GsyBm z;&{J7`l~wq;`OlL_rdk)ql5C=@bT%!tPeh{BXmCHnTZ5Karc5Nqd7a>(1 zzY$ryi*w{=5@%yHw}@Usmouxl`gmPx;{@c z+;qI}<+NvG?Y^}qW z+`IGM#cZW^7Gdedj?cjb5Ahz}%0DO49~jPuhxjqxUtRt%yT-}#d1{Py(_B8f@qzc) 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 s=rfvwBOb^~R*m@mQ_R#D-kPg{15Y^o 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 C9clCc From fd066ac9b22e112a751ce3b039fb474744275175 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 18 Feb 2025 03:27:19 +0100 Subject: [PATCH 057/171] [Sprite]Batch 5 exp change (#5243) * 718 and 718-10 exp change and removal of experimental * 719 exp change and removal of exp * 362-mega exp change * 248-mega exp change * Fix missing pixels on 248-mega back-exp * screwing up the master.json to properly commit it Somehow its ignoring the master.json changes when checking mega tyranitar * Reverted the screw up on Master.json Trying to fix so test check the correct files and not look for a png that dont exists * update the exp-sprites.json after Kev gave me the Info I needed I did this * fix it and pokemonSprites text is passing * Final Adjustment for the colors regarding 248-mega. Adjusted the colors so that it would GLOW and not become darker. --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- public/exp-sprites.json | 28 +- public/images/pokemon/718-10.json | 725 +++++++++- public/images/pokemon/718-10.png | Bin 737 -> 13794 bytes public/images/pokemon/718.json | 842 +++++++++++- public/images/pokemon/718.png | Bin 1189 -> 37857 bytes public/images/pokemon/719.json | 914 ++++++++++++- public/images/pokemon/719.png | Bin 817 -> 9877 bytes public/images/pokemon/back/718-10.json | 725 +++++++++- public/images/pokemon/back/718-10.png | Bin 686 -> 12566 bytes public/images/pokemon/back/718.json | 842 +++++++++++- public/images/pokemon/back/718.png | Bin 914 -> 28071 bytes public/images/pokemon/back/719.json | 914 ++++++++++++- public/images/pokemon/back/719.png | Bin 754 -> 9379 bytes public/images/pokemon/back/shiny/718-10.json | 725 +++++++++- public/images/pokemon/back/shiny/718-10.png | Bin 685 -> 12566 bytes public/images/pokemon/back/shiny/718.json | 842 +++++++++++- public/images/pokemon/back/shiny/718.png | Bin 916 -> 28076 bytes public/images/pokemon/back/shiny/719.json | 914 ++++++++++++- public/images/pokemon/back/shiny/719.png | Bin 794 -> 9318 bytes public/images/pokemon/exp/248-mega.json | 1199 +++++++++++++---- public/images/pokemon/exp/248-mega.png | Bin 5790 -> 39074 bytes public/images/pokemon/exp/362-mega.json | 821 +++++++---- public/images/pokemon/exp/362-mega.png | Bin 1838 -> 2597 bytes public/images/pokemon/exp/718-10.json | 692 ---------- public/images/pokemon/exp/718-10.png | Bin 5190 -> 0 bytes public/images/pokemon/exp/718.json | 230 ---- public/images/pokemon/exp/718.png | Bin 4161 -> 0 bytes public/images/pokemon/exp/719.json | 1091 --------------- public/images/pokemon/exp/719.png | Bin 3530 -> 0 bytes public/images/pokemon/exp/back/248-mega.json | 1199 +++++++++++++---- public/images/pokemon/exp/back/248-mega.png | Bin 3926 -> 35945 bytes public/images/pokemon/exp/back/362-mega.json | 821 +++++++---- public/images/pokemon/exp/back/362-mega.png | Bin 1337 -> 2088 bytes public/images/pokemon/exp/back/718-10.json | 188 --- public/images/pokemon/exp/back/718-10.png | Bin 2074 -> 0 bytes public/images/pokemon/exp/back/718.json | 230 ---- public/images/pokemon/exp/back/718.png | Bin 3710 -> 0 bytes public/images/pokemon/exp/back/719.json | 272 ---- public/images/pokemon/exp/back/719.png | Bin 2529 -> 0 bytes .../pokemon/exp/back/shiny/248-mega.json | 1199 +++++++++++++---- .../pokemon/exp/back/shiny/248-mega.png | Bin 3929 -> 32793 bytes .../pokemon/exp/back/shiny/362-mega.json | 821 +++++++---- .../pokemon/exp/back/shiny/362-mega.png | Bin 1337 -> 2088 bytes .../images/pokemon/exp/back/shiny/718-10.json | 188 --- .../images/pokemon/exp/back/shiny/718-10.png | Bin 2632 -> 0 bytes public/images/pokemon/exp/back/shiny/718.json | 230 ---- public/images/pokemon/exp/back/shiny/718.png | Bin 3710 -> 0 bytes public/images/pokemon/exp/back/shiny/719.json | 272 ---- public/images/pokemon/exp/back/shiny/719.png | Bin 2529 -> 0 bytes public/images/pokemon/exp/shiny/248-mega.json | 1199 +++++++++++++---- public/images/pokemon/exp/shiny/248-mega.png | Bin 5791 -> 38718 bytes public/images/pokemon/exp/shiny/362-mega.json | 821 +++++++---- public/images/pokemon/exp/shiny/362-mega.png | Bin 1842 -> 2597 bytes public/images/pokemon/exp/shiny/718-10.json | 692 ---------- public/images/pokemon/exp/shiny/718-10.png | Bin 5135 -> 0 bytes public/images/pokemon/exp/shiny/718.json | 230 ---- public/images/pokemon/exp/shiny/718.png | Bin 4161 -> 0 bytes public/images/pokemon/exp/shiny/719.json | 1091 --------------- public/images/pokemon/exp/shiny/719.png | Bin 3530 -> 0 bytes public/images/pokemon/shiny/718-10.json | 725 +++++++++- public/images/pokemon/shiny/718-10.png | Bin 759 -> 13794 bytes public/images/pokemon/shiny/718.json | 842 +++++++++++- public/images/pokemon/shiny/718.png | Bin 1189 -> 37816 bytes public/images/pokemon/shiny/719.json | 914 ++++++++++++- public/images/pokemon/shiny/719.png | Bin 839 -> 9678 bytes public/images/pokemon/variant/248-mega.json | 43 +- public/images/pokemon/variant/248-mega_2.json | 41 - public/images/pokemon/variant/248-mega_2.png | Bin 1406 -> 0 bytes .../images/pokemon/variant/_masterlist.json | 4 +- .../images/pokemon/variant/back/248-mega.json | 44 +- .../images/pokemon/variant/exp/248-mega.json | 54 +- .../images/pokemon/variant/exp/362-mega.json | 37 +- .../pokemon/variant/exp/back/248-mega.json | 33 +- .../pokemon/variant/exp/back/248-mega_2.json | 272 ---- .../pokemon/variant/exp/back/248-mega_2.png | Bin 4809 -> 0 bytes .../pokemon/variant/exp/back/362-mega.json | 30 +- 76 files changed, 15497 insertions(+), 8499 deletions(-) delete mode 100644 public/images/pokemon/exp/718-10.json delete mode 100644 public/images/pokemon/exp/718-10.png delete mode 100644 public/images/pokemon/exp/718.json delete mode 100644 public/images/pokemon/exp/718.png delete mode 100644 public/images/pokemon/exp/719.json delete mode 100644 public/images/pokemon/exp/719.png delete mode 100644 public/images/pokemon/exp/back/718-10.json delete mode 100644 public/images/pokemon/exp/back/718-10.png delete mode 100644 public/images/pokemon/exp/back/718.json delete mode 100644 public/images/pokemon/exp/back/718.png delete mode 100644 public/images/pokemon/exp/back/719.json delete mode 100644 public/images/pokemon/exp/back/719.png delete mode 100644 public/images/pokemon/exp/back/shiny/718-10.json delete mode 100644 public/images/pokemon/exp/back/shiny/718-10.png delete mode 100644 public/images/pokemon/exp/back/shiny/718.json delete mode 100644 public/images/pokemon/exp/back/shiny/718.png delete mode 100644 public/images/pokemon/exp/back/shiny/719.json delete mode 100644 public/images/pokemon/exp/back/shiny/719.png delete mode 100644 public/images/pokemon/exp/shiny/718-10.json delete mode 100644 public/images/pokemon/exp/shiny/718-10.png delete mode 100644 public/images/pokemon/exp/shiny/718.json delete mode 100644 public/images/pokemon/exp/shiny/718.png delete mode 100644 public/images/pokemon/exp/shiny/719.json delete mode 100644 public/images/pokemon/exp/shiny/719.png delete mode 100644 public/images/pokemon/variant/248-mega_2.json delete mode 100644 public/images/pokemon/variant/248-mega_2.png delete mode 100644 public/images/pokemon/variant/exp/back/248-mega_2.json delete mode 100644 public/images/pokemon/variant/exp/back/248-mega_2.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 9548d694906..a340d02a65a 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -423,16 +423,10 @@ "716-neutral", "717", "717", - "718-10", - "718-10", "718-complete", "718-complete", - "718", - "718", "719-mega", "719-mega", - "719", - "719", "720-unbound", "720-unbound", "720", @@ -1547,16 +1541,10 @@ "716b-neutral", "717b", "717b", - "718b-10", - "718b-10", "718b-complete", "718b-complete", - "718b", - "718b", "719b-mega", "719b-mega", - "719b", - "719b", "720b-unbound", "720b-unbound", "720b", @@ -2673,16 +2661,10 @@ "716sb-neutral", "717sb", "717sb", - "718sb-10", - "718sb-10", "718sb-complete", "718sb-complete", - "718sb", - "718sb", "719sb-mega", "719sb-mega", - "719sb", - "719sb", "720sb-unbound", "720sb-unbound", "720sb", @@ -3804,16 +3786,10 @@ "716s-neutral", "717s", "717s", - "718s-10", - "718s-10", "718s-complete", "718s-complete", - "718s", - "718s", "719s-mega", "719s-mega", - "719s", - "719s", "720s-unbound", "720s-unbound", "720s", @@ -4796,6 +4772,10 @@ "150b-mega", "181b-mega", "212b-mega", + "248b-mega", + "248b-mega", + "257b-mega", + "257b-mega", "282b-mega", "3b-mega_2", "3b-mega_2", diff --git a/public/images/pokemon/718-10.json b/public/images/pokemon/718-10.json index 479c069fe0a..ad273c9ea79 100644 --- a/public/images/pokemon/718-10.json +++ b/public/images/pokemon/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 66, - "h": 66 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1845dc28b51b657957628d4b4d7af94:87a4c3e6fcac562963f6331abb3d962c:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 287, "y": 130, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 57, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 164, "y": 261, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 327, "w": 56, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 56, "y": 327, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 169, "y": 329, "w": 57, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 57, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 112, "y": 326, "w": 57, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 265, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 226, "y": 332, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 220, "y": 261, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 264, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 279, "y": 196, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 56, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 110, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 198, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 169, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 224, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 132, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 113, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 345, "h": 395 }, + "scale": "1" + } } diff --git a/public/images/pokemon/718-10.png b/public/images/pokemon/718-10.png index a2acc542c68d37300060feabfc4a2478245db173..4d15f78dd8328105366fdb583d95cc8d4ede4494 100644 GIT binary patch literal 13794 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 Y2hPd^lWtJb$^ZZW07*qoM6N<$f`}8kWB>pF literal 737 zcmV<70v`Q|P)_|-ub}4EA0004WQchCv-d>J9(GFkET*CfW*sN|6KDZ~5a57$9 zQ7~A|cITe*mH?lompkjb6dK2S56}!lP97>G*@o;@e9k|$e*nKl^9YVz7APAyX{9xqtB9BkIAzZ|3`h2;;pmw}|f+v}WVx z1i2bfA|mfM{(HwULA+xVMt30PwPc;u|3<^i#R>fR!`cXI^w1)?G+ybyF6$5gFHKb}dV3?2~SE1l9N`{Msl>$u2p;wnl zCzaZnIBRL+^h3g}Nfpomyq->JN5qkkLs{B=9PLn*O^FF9Hekg+J{nfXp1Tiv6BnSZ zqY3#OMq#WPMyq>d0dW%h*%}+V#~=~ygpn0Zv5%regIH|Qh!Uy;M8i9(rnaJo$Wy44 zOV1JjYJOcaDx0CwqJYXW_DBtR%C+H-tF;JSZ_8PJe!yJoqT(W35gUVVssl$K~~ z#$FyPIaVy(GBk^rni76-%QEKGM>udx`QO;v!)@9ZLVX&`4wM)XBbHqlTPn=3jM&yT zgf;>5g$r+Vz!WRv{oH%9fF_!#8w_Kv+8AcoB3k5!w{8|OuO2UCd@u>R*QELbf1KMv TnX{X(00000NkvXXu0mjf#m-1z diff --git a/public/images/pokemon/718.json b/public/images/pokemon/718.json index b86c5362079..98053a226cb 100644 --- a/public/images/pokemon/718.json +++ b/public/images/pokemon/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c521b0d088429d6fd0d1d291823b7881:a063fa0268f5006b3587b06e3245db2a:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 222, "y": 355, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 73, "y": 354, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 149, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 442, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 149, "y": 266, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 377, "y": 265, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 308, "y": 177, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 76, "y": 91, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 301, "y": 264, "w": 76, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 76, "h": 86 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 267, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 90, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 391, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 78, "h": 91 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 468, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 157, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 313, "y": 0, "w": 78, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 78, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 79, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 391, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 235, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 469, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 313, "y": 89, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 77, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 157, "y": 90, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 76, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 226, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 354, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 547, "h": 530 }, + "scale": "1" + } } diff --git a/public/images/pokemon/718.png b/public/images/pokemon/718.png index 0c65ebefb3181da1efe5a72d5e79d503ad32a7ab..07319fd6de0384cb8382a502fd0801a4b95277d4 100644 GIT binary patch literal 37857 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 DZmv7u diff --git a/public/images/pokemon/719.json b/public/images/pokemon/719.json index 4503b576777..29716341ffd 100644 --- a/public/images/pokemon/719.json +++ b/public/images/pokemon/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2444999ec5c861d795baf2a948bfbf12:226dba2be6e002f00cb5559f02986b41:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 128, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 80, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 120, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 288, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 198, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 237, "y": 359, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 160, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 165, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 212, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 206, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 200, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 240, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 159, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 40, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 80, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 248, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 43, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 128, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 80, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 120, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 237, "y": 288, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 198, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 237, "y": 359, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 120, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 160, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 165, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 212, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 206, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 200, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 240, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 159, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 40, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 80, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 248, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 43, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 287, "h": 429 }, + "scale": "1" + } } diff --git a/public/images/pokemon/719.png b/public/images/pokemon/719.png index 287bfb9fd27f10484290130086b1f10605019be4..536e999a3d6854c7df8b7aa5418cda37df1bc86f 100644 GIT binary patch literal 9877 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 literal 817 zcmV-11J3-3P)*$|*rV6R}h&<4lYNLX1O9%o*F8W0gOO z{1kDrW+$I?n?WVy0r@NlLmj!!xXca)x!6-!8HJVvtLElnB!H4lK|Bb>_Uk^Qj)m01 zL0VEJS561h6$=ijmEvKTxx7oG(MVRz%-O}H#1hT9HaW`8L>{F(we5`_iKL2~N!m6L z4u&$3uaVWk9-C5B@gi{M^um!U+BBjt4UCG&DZVQ2`;H_2nvs!zhI8Aoz-?A8JI9Cvxi3?5>OCjdBN$QkSaMwD_x=&irIUL~#w-}< zP{5qiikA)3#sY;9h;S5^Wg)q0jBY@Q*LxjoZQHs=+xiu&-3|rk{+g)**jg!Sda4{Z z15W%6hS#o4AsRzO-3fe)VNMnfdL?X>X$3enXhln2GZUBPtxrbA|Z%vvLpMsgYQY-nG`3J-A5k2k*V_%lMef;4lQwEvej$8Q)!y}Al zWm`S#w;aqozXFG~ecHn89A$VuDLkS~ghal~@HoS7XIz29tvXK>yh)n#NYQ{Sl4puF v;d7-sPnEARsLo@>&crvEuPEpq_alD*F>EhI)%$e;00000NkvXXu0mjfQu24Q diff --git a/public/images/pokemon/back/718-10.json b/public/images/pokemon/back/718-10.json index 74c29a2514f..75053d61900 100644 --- a/public/images/pokemon/back/718-10.json +++ b/public/images/pokemon/back/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 59, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e9f4b2c69d996349a8e35598e7ddec9c:06067c7cf2cde81fd4d1f42fe319185e:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 59, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 56, "y": 319, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 59, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 117, "y": 259, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 177, "y": 320, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 232, "y": 128, "w": 61, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 61, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 56, "y": 258, "w": 61, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 61, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 118, "y": 195, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 115, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 237, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 234, "y": 253, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 254, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 258, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 175, "y": 128, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 253, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 57, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 59, "y": 65, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 117, "y": 128, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 65, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 364, "h": 387 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/718-10.png b/public/images/pokemon/back/718-10.png index 351da7fa3b3b6e90af2cd053d5e9938a3e5741db..2f3b211e9a6b4c9d4623c3a75bc67e49e6a6c5c4 100644 GIT binary patch literal 12566 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 delta 651 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 literal 914 zcmV;D18w|?P)n(jlvA&@$0fji z0-FLdQg8klQ%vC(Q#&jHl9cfI4wlm4l(2E3vlbVS_%pWamy{kuhXp?h4zCp4V5ceU zORZY`OjnBBorC^3q?BAbQ!cc}K$z~+-C%ay0Ma)&X~#M^L*R$U;=RKF%Jl@Gi`<=e z02%vFU?CXo-}}!Rwpd;nWGx25VPVEuSrdz|*k|GX1$f0RJ_AU03_TV=lYu+9WXz_+ zdq1WSlYUcegp89i=5&Q`T+lqpe?9!{wjoZzFIN4nx`)M8WP=^!KzFqVc%K9~ibbG9 z8y26pPk5x_p$)z&yh?jH`r@ILAM}?STv>bJs^e$;&>@ zPiMc4<1OQgv9W(Ne$wCaQH$HAj?nt0u{5S0EgajEIibbMVMJq4j8CFD8MD3Ei^DZy zPIeTVYGdl0ijr+mh{+STsn(|YZGKt&)ztaiiNF(9W@C8a>_J}RIp51T+- oW4=brmwZEn5KKj9=gQB}zf4F-kevX46#xJL07*qoM6N<$f=*zq%K!iX diff --git a/public/images/pokemon/back/719.json b/public/images/pokemon/back/719.json index ea7fd0f3213..440e23718de 100644 --- a/public/images/pokemon/back/719.json +++ b/public/images/pokemon/back/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fd235f556d7919416a78362d72f6badd:d250eac977fb7684257a27d4f4c11bea:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 126, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 168, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 124, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 206, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 162, "y": 359, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 202, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 82, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 165, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 210, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 217, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 44, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 88, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 252, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 247, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 162, "y": 288, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 241, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 122, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 41, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 216, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 174, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 126, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 168, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 124, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 206, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 162, "y": 359, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 202, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 82, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 165, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 210, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 217, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 88, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 252, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 247, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 162, "y": 288, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 241, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 122, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 41, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 216, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 174, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 292, "h": 428 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/719.png b/public/images/pokemon/back/719.png index 14ff62742f737ec4ac801a172e8a80c28c737150..1c275f3241d5477b77eb17d79ec742272231b495 100644 GIT binary patch literal 9379 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 literal 754 zcmVz>%0d!JM zQvg8b*k%9#0&_`3K~z}7t=8LegfIvI(14&DHue8Mw*ivqZZ9h;eW>G%rvwtxl>Q1% zr$cs+`Lx4jI8v@Ks|-c1Fz!gXz_3(C9aH42!y=Vgt9F&qbhs&DhV`S)6p$Sg(LmNB z0wR*zZwu9HW&y^t$XT>ExcaMEMpH;Q% zq8wq`b>iQ4X)@<&bMX)(ZSeV81_S!S89B(<%vA(>X&#eKAbn+j;{fA#TZV^@y1_gr z8)c1=gN!yg?Ud#ueecfy_Z7Qg&o7VU3eab?^p7=P}-(v~FEi+_|o3*KbhVp<5Wb ki@B^=k#A6R^MpV72J1{KFo)Js!vFvP07*qoM6N<$g8PD7?EnA( diff --git a/public/images/pokemon/back/shiny/718-10.json b/public/images/pokemon/back/shiny/718-10.json index 032783b5555..75053d61900 100644 --- a/public/images/pokemon/back/shiny/718-10.json +++ b/public/images/pokemon/back/shiny/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 59, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c99dd53bf67561425f9faac1002806d0:277725239a09766c1d58b4a0f8c45775:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 59, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 56, "y": 319, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 59, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 117, "y": 259, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 177, "y": 320, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 232, "y": 128, "w": 61, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 61, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 56, "y": 258, "w": 61, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 61, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 118, "y": 195, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 115, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 237, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 234, "y": 253, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 254, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 258, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 175, "y": 128, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 253, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 57, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 59, "y": 65, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 117, "y": 128, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 65, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 364, "h": 387 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/718-10.png b/public/images/pokemon/back/shiny/718-10.png index 0479543fc7a45f9cd20d4687cd42b994fd094332..7998912c001774fb9882a9e9032b3d795addb2e2 100644 GIT binary patch literal 12566 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 literal 685 zcmV;e0#f~nP)lD|*ZSOR;C@oGqw~vrKfRSGy&zT*w z5d3GkuUH|?PxIL>fI?;(q9j8FF!%H=hK5e}!n;u+u=7e_L3~(U1a^uE%zGa8XVMQl z*OSh;RU(@G_y5G$&K>p;XW7(nCWtLs^nRT#SvKoif%qpoNz<$bVGwyQ{zBFh1aK0l z@$I)xm+S`04Te1X^@xB${CqZ5+7gMQY?@d+(vv(auHvv z@VL1z=&tK~VuBQPN0|47_9qhUXodDZkhV0V9Q+_$4h;HBdeC`QIA2F#C_xhW6}tfx zg~5T)Jm_2`>8h;cTS78%tOGE^Hxe^N;#Ec>da=1v6Eo9wm|6lY{kRdLbH>cQz6z}q z!2}`-^uI6&&P{9R7!k3?3OoyrG*1Mu%Ahqa2!ZW{WDFENn79hinQ)4P*R))qn&c&& zBY`*wlL-)Ltl>l~lVOL2ILx4RiqjpL`~jdd0SC09$wCk!6BCbB=%_A2rQ&3PiBmY< zv?%6iX_19dA+VxFgLnc~7IR`Gnngjha1l((-EKsPi;!D}ZBewB|GKIdS|vhX1>>ag z;1b~#i6JEX;dTi_Y+WJ{t5~1~ansEN^0)d^oQ#2gggiE} TdGiY$00000NkvXXu0mjfXD2O? diff --git a/public/images/pokemon/back/shiny/718.json b/public/images/pokemon/back/shiny/718.json index 4badc82d015..1a835e26b08 100644 --- a/public/images/pokemon/back/shiny/718.json +++ b/public/images/pokemon/back/shiny/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f2bba9e481cf6dfcc460f398fd1af964:386098c871ad5fe384af5f85559e7551:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 359, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 300, "y": 357, "w": 73, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 73, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 380, "y": 271, "w": 74, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 74, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 384, "y": 181, "w": 75, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 75, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 155, "y": 92, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 309, "y": 91, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 227, "y": 268, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 150, "y": 182, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 272, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 75, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 310, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 387, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 155, "y": 0, "w": 77, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 92 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 77, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 78, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 93 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 231, "y": 180, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 232, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 77, "y": 91, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 78, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 0, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 232, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 464, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 93, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 75, "y": 179, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 454, "y": 357, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 541, "h": 534 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/718.png b/public/images/pokemon/back/shiny/718.png index 4492fbd3b22593fc0cb440dee9fbdd3c35530ee4..bb8d417934708290c65a4599a298e620b532642d 100644 GIT binary patch literal 28076 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 LNkvXXu0mjff^M1M literal 916 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 Y7h-`n@2~zo!2kdN07*qoM6N<$g5daI0ssI2 diff --git a/public/images/pokemon/exp/248-mega.json b/public/images/pokemon/exp/248-mega.json index 42e7e9f7d6d..2c9370cbeee 100644 --- a/public/images/pokemon/exp/248-mega.json +++ b/public/images/pokemon/exp/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 271, - "h": 271 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 181, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 84 - }, - "frame": { - "x": 91, - "y": 170, - "w": 90, - "h": 84 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cde8b160e19f5e22098d0c8712fe3e26:5bade20a2d91d5c0e3de833bedccd3cb:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 92, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 184, "y": 345, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 278, "y": 263, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 468, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 549, "y": 346, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 431, "w": 87, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 87, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 367, "y": 429, "w": 87, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 87, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 461, "y": 346, "w": 86, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 86, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 283, "y": 175, "w": 89, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 89, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 189, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 0, "w": 93, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 93, "h": 87 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 380, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 95, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 474, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 190, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 95, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 378, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 283, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 473, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 89, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 374, "y": 175, "w": 91, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 651, "h": 593 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/248-mega.png b/public/images/pokemon/exp/248-mega.png index b7563738d3d9113ff82c8eaaeb493592e5af4c9d..167b88b09e54c09c0d47f3a2bef233e7302ec23e 100644 GIT binary patch literal 39074 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 eXwOm+h%-~&tUviw<^pSEChU?a%QgMCOo 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 Hu0mjf*-lf; literal 1838 zcmZuyd05if8m3aOP$s69gKJh`TDgSHNQxq;0g8y|s7;O=nl^5QQ>0lgH$lrS5FaP6 zCLro#={PRAO!um|PgbNi%Y|G}P%9sFYSM)HY4c3?k9(fyobUbK?>+B#&iUuC$RrOf z2n+%Ofwb^va1zO$V9yRZh2#rznIDS;fi$Y|I1Kel@Wgmd z%q#(__LTaeV@)xoQoS0#{}p3SpOv}Wqh1}dT+!{~ptj5YdsPZ(!n&>8x6rDnwiwG2*S<@M6!0Y zL0@#fSq-crnyb(A^bHam4u~r>;fE#!6Ybgu4Z7ieKH~grZ0CJ(bmEfg_;VO|k@W&$T6?up+rxLor*(c8+Nl zXZ|D*KGHbkPGc1KKu2RUqdMP+<&iy~g0o-e)et5cUPsF5O*ZY+m*tSx^!UVI=&&05 zX0CZOZ}P++^`dHOb$qwYsp`UGp!8lW-t-P=&O?r@cm*8zP=P|yc zK(n5gj^t;FAQ=HpdB{M@{WJRevt;ZdX!+3l^r$;xLBBiiIZ`VxD>HR*WSH$2L*Gp& z4EaZL&CkmzLC$_x$)x8i=d5C7lz!S zfab+@=V`QrH6Sz!$kPSNlFY`N5#IJ{1p!{(Cv8pS@dGLthotj3?p=1j#La;dxEr_aA99j7^-B*)(6t1<8T_nxE<&psh z4-(ip6idAfJt?h|g=3y4TL6q@nyJ7)I-g&wm&iJ==)3u;=>&MtWO2W(%cCrK4iWQD zJ*hUQOrViP+L4A&S7f!h*{shB#i)z@6eU@0)7{m}f5EojCpi0gfLtfWh2}+JbB9G$ z8b$}x-TP18fZ!S6hq)MSy>Jf>I1Cb5mzbO)+lnJWP7pRcd{51m?JvEuMo`SVyztHGxD2NIEMbd0_@Gg* z1#=veahhA&TkdDa=E9s37MtBr^q^R({Qx=m6vD=0ax;1U9517-}kSbDrM=7jqZ1=A3-9t zDmSy2bCIz|7(hJi zc3EC!L5+0)DxQw}8{<4g=rYY`&kO=C`n`q~SBO8}O0mHWKI~nnuO00q7CtNmI2WoFx>z^RHCPQT#pVr3{ zV!zz{L-!ahb>T};{Yq*S$!G6%X5W_l>Xddp+ePip$`cH+3e}= zHT~UeZ7}Lk)x{64?LJpIl63dZ;ToU1c(v`HPP;7)zZ6nBZ@HD>-AK3xt|94v0+iTs A761SM diff --git a/public/images/pokemon/exp/718-10.json b/public/images/pokemon/exp/718-10.json deleted file mode 100644 index f387823bf4c..00000000000 --- a/public/images/pokemon/exp/718-10.json +++ /dev/null @@ -1,692 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 239, - "h": 239 - }, - "scale": 1, - "frames": [ - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 132, - "w": 64, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 65, - "h": 60 - }, - "frame": { - "x": 59, - "y": 65, - "w": 65, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 59, - "h": 66 - }, - "frame": { - "x": 179, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 64, - "y": 125, - "w": 59, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4a92d566ab5398ac1329b7a8bd47bf23:05925b513eba9d64f38ee84fe4b031b9:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/718-10.png b/public/images/pokemon/exp/718-10.png deleted file mode 100644 index faf981826532f34f2304de363a432cd804c0b406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5190 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 IrvFR)KQ6E4hyVZp diff --git a/public/images/pokemon/exp/719.json b/public/images/pokemon/exp/719.json deleted file mode 100644 index 289b518f437..00000000000 --- a/public/images/pokemon/exp/719.json +++ /dev/null @@ -1,1091 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 210, - "h": 210 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 34, - "y": 9, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 46, - "h": 67 - }, - "frame": { - "x": 144, - "y": 0, - "w": 46, - "h": 67 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 48, - "h": 66 - }, - "frame": { - "x": 0, - "y": 67, - "w": 48, - "h": 66 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 48, - "y": 12, - "w": 46, - "h": 66 - }, - "frame": { - "x": 48, - "y": 67, - "w": 46, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 45, - "y": 1, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 36, - "y": 2, - "w": 42, - "h": 67 - }, - "frame": { - "x": 44, - "y": 133, - "w": 42, - "h": 67 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 54, - "y": 3, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 42, - "h": 66 - }, - "frame": { - "x": 86, - "y": 134, - "w": 42, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 55, - "y": 6, - "w": 41, - "h": 67 - }, - "frame": { - "x": 128, - "y": 134, - "w": 41, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 41, - "h": 67 - }, - "frame": { - "x": 169, - "y": 134, - "w": 41, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eb63d565533cc4db6abe2324f72ce7a0:5cfab760df87a56d5ca4db54a28b4a46:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/719.png b/public/images/pokemon/exp/719.png deleted file mode 100644 index f9059000661c147ea74d99d2df9f4d74787439b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3530 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 DYgga| diff --git a/public/images/pokemon/exp/back/248-mega.json b/public/images/pokemon/exp/back/248-mega.json index 25bc42548ab..ddd3987db90 100644 --- a/public/images/pokemon/exp/back/248-mega.json +++ b/public/images/pokemon/exp/back/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 292, - "h": 292 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 74, - "w": 80, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 0, - "w": 79, - "h": 73 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 73, - "w": 79, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 0, - "w": 73, - "h": 73 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 73, - "w": 73, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:625e35ec9f8e731e89fa37587ffb4738:07d356e18baf0312a4e8a36adb76fdd5:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 511, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 512, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 431, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 340, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 511, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 85, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 431, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 340, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 341, "y": 612, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 518, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 84, "y": 534, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 425, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 518, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 534, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 426, "y": 194, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 510, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 285, "w": 83, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 83, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 432, "y": 287, "w": 82, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 85, "y": 288, "w": 82, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 373, "w": 82, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 431, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 256, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 374, "w": 82, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 82, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 516, "y": 372, "w": 84, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 84, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 260, "y": 287, "w": 85, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 85, "h": 84 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 200, "w": 85, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 85, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 342, "y": 101, "w": 86, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 256, "y": 100, "w": 84, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 84, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 86, "y": 100, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 514, "y": 0, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 344, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 429, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 0, "w": 84, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 84, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 86, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 172, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 258, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 171, "y": 100, "w": 83, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 83, "h": 97 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 514, "y": 100, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 83, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 602, "h": 689 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/248-mega.png b/public/images/pokemon/exp/back/248-mega.png index 4b2a4021721c7f26d5b62834395c88169bf0794f..1e4918e5ca717c3b1c9be0d162542c500a25b5f3 100644 GIT binary patch literal 35945 zcmV)yK$5?SP)Px#Do{*RMF0Q*7Z(>wS~*KvJ92VzfE*W+Edb6aJ=0PEa++duoMNiWn#04x{r&wK zRYX((000hjQchC<|NsC0|NsC0|NsC0|5r-e6aWAq07*naRCt{1U5j=kDXvU4uJy9n z{{P>-l}G{s0z@Xb+joX@rpGQ=x7w8f>Zm9#J=$Dj;uB z;ru}|Y#_U({(D5-WU33PE64<={CoE~aOVBmXPqt7+ zylVvaE^mho(C@};0XCr?5!Ee1W!T8|F=!%-9=ilJsme?jf(q0Hs@4v$%(*Umd4IJ8 z5qd$YMO3#MHIZE@LrwNEs#gEU0wAal|68YOLDes^6+;v0;JSXDZ$U&o*PxbU7pYK^ zUEo{-@-mxSBWqs$g`lGL%Tz^Z%8D2G`-de%x*Qc2p_Z_IP2vL5R-mrPF^Q>PB<5s`!b!B9W!i8wx2B;Qd|=RX00ujyD;UVy zU_rw6$r|gQ1aOww*nzDoP;UY?Q*{$m!zVk!I&Ns+|3nRr-(LpcHmZAo+J;T2Z&=~5 zUltX@b0HPC1v^BA&fru)CIKwc$EZN4R#OFN-yob~G|XoZ@E=BPjLuTF zc3w(rhSdiV5|+u@#D$gs&Pk?o0yIG%scN7K(^L@|b*(>=`kVN?7rl2Ks-H(iTeo4k zS8%#1)DCQNf>}2($U5%@J3vRM?p_*Te^scV2ZS3-P0zCPBW`dL(pq!C%xb{bacc9arKxxs2#|Ddg=QSs9ri=r$& z^z{kZ9JUO*6g72#I#8yJ}yL8ooCfok@7C2nJWA$x&sQezVJ zD$}SP*o3;0?0j^Yn7Z(2(#+HVO1?E?t3Il`N401XjokJ6m%Wc3OSevA9&)UDMo&W?G!G+ z4%C7yKImeH^{nkvRG*;+vV=OJZJQ})00f;=wPCAApnIrl$cRqdm+?isG*NJuuSOOk z<-ZBFiRroiH&*HNK^NNUIn@?2_{Yc#P?gU3BGmHl8x-g>T?e|rRz|8LP|aLWV#`Ny zU_qWnHSxs<9QivcSRJ+Z;Q3Tm<(IH3YMZR)t^-;9Sb%MyL)5zZ2H#SJ#VtVzizc_z zz+;3wf$Hq2ykD^g8&M}z;Es9QyJk_j{#~XB>cC9ZuBx-!%0x9jke>4`XvB5IhMca= zw>qeB8#OssGtO?Iw&*6Z)2Ien8M6SrscL4c8PGjc6SO}6jH@e&E&D7z15e0K%c+do zdLVZbwev6{Jm6qd`k_K?i_nCPE;WhTmK8bz2!HLUx)$^~YI_M?^uqLavMi+LkRS7% zCp}Dhe^K})td_n8_#gS)G}Pw0hg!fQS>btvdQG(ysP5#)iQ^>-KH&;f7f>TCFxgVu zCgiCJ;G_V6Op^faT4?6NGU>N954HLuRokGttr}F1Csb=;QBU^I>!;W20uEEqyy*V= z{rW9*XK5+^2Yj?q4=d^g>HQd$;w+(JZ}atrB~%ypM_fCeeXLu@5dsVTk zbCLs>Wyng_4AVuXKJ4V+|5$*pTmWd>DuJFO&{EZTs-RK*P@F45pF&iR&Fbs(^F_~k z8Q3dyKfbEvOOvRY2pXz3=4RN>&(Df$g!PE2J68|&P4@bMwDkhE|FlO4pkWFD3Z_zk z(to#t-bVESbwb!H%YG8@<Nl^!a3 zfyjlUW>%9`VhUO517lG~wweIlLsbgPmb(6rE?c`+=3ApNxJ1RND*@{z>;&o&jc-B~ zBIp?_hm9X?p^EvqJV3MjcQBA^rg-NJjFb|<${0Tg5 z6bmH2lcC-~Z^yhN6wcDP5K z#lufDQJu_%?&`)Gw$fJhuVwY~vhD%xqeAe2$rZfE!3icJ6PQS~S0ga(ts1JokNOU; z4-?n$P{O(_6kRH2eC}%?s!t6AZOe+TWdP5D;8WC}G0z*aZULp-JwUzT0NgcWWr-0K-Z$?qDo|*CCI1Y=B%Zm`bVf~ zDxpBlpCX%4os)yT7V30xQTs=@+IZ+~L2#`$eW$oI?@Q6bQc z&kpRUm0Qur6Ds&=R96Bs}FieKT%x<{xDstNOs0G;~N+`%GSK|%GLM%9I-IgUh^W##|fGFOdS z)M$j-@PP&@*iq#)8G#->RD-m-014BF^jgZgMAcc)5!H~i{3L27te86Io!C4plGw)S zA*;D0>H!(5JLR{GQ3Ytkg&Ngor~rdg99^16YokVc32CidleIETFY9ldb!&sxOs$}Y zpQ37-xyRi_%7Fy}3@&VpKPWk>Zin>t1fXv&v4p9AxhVVd9{KQ_`}8>r5TsudL#7NdfQ zEt9mWUW{u^@1I;?y^3g$<~J z>^$lg0e+ILE?}NHb4_5p?O^hBoqsrLl(lWIzXUWtO=TTw0?w!Z6K;44?(Whpt>u3V zYLeg{>K0k|+Db=7e|C4Sw#KJNak=FpU|M+HK?OX!V+PcjP~8sHaL`6PsKYEkPu3d( z?6lQ@>a3~<&laZK=Olg-_L`KY_gi?AxmKe#xI&3~&Y*e&YS>LZgK8FF3+NtOO{sd2 zxnx_5PYgf;L)d^75Um&E`59DaMD>%Xwq<5U)DyQ&TT!QE-2`g1l@0Zrq8fm&xy)i! zSOb`jY_Pgk2UV;B+J_nre6WD-K{bFzS&j3@e}k=z^=IIG9iwB%t$@RZV&m2>6;-9{ z&1_)`)!R^E3+lYAe+pE%mIc*V|EqwHxM{^Il)8%T-bN=-P_xH~;h`_mU5o0G>>kw9 zifWP7&C0q3bQ5X-PPlPZnOIP9m#%^;yNY+rWkC(W#;7(8wxH^==Jj_=>ff=|gZe); z6$1Mnu)ha9LiN#HFcAnUYEJeB>H$MkKaFaZm0nv7y3kg%sA!JrRnm?TnGStfCav|2 zsBPFCsMecWu(e+-z%EsnP<6$mL`GH(S%a=_11fEkGoWg);ZH5pb2Vy!DSllbYjv~z z0?=C3RaC<$H$msJim|7rD>SWj8d0^3@0=VT2>!a4Np!)z1eG}?Af!gw{Boo87QES+Nzp}&5 z$qEet&K&iIt#l6%wi|4@u#>^sDUaDfy<74 zZK6Vf+KYk<&{y92Sk^6|LDe-LaD>i)cy~)y{CwD!$GUcfJq~%riwPA3Y9nT6QR)4> zTdIvJP8c+!0&R8FQL`zaRRV+{xNoaPs+w(;E33Bz6swX*G?(uItEgT_yti^vqyJja8Cf=rrMYFo~pL=GEH^pSqENnG@n7HXb?V8u@r@!1R>=x72)@ZycTwqV zIhSLK0l__UMO3e#-nLh`%xX32)gNl0{_oc>?Iybj+cMs(C;{ zZ749>Fc*ZycD6FsZF7a*YYX+Ry_}9pRM(@rU%!6U@6SizUrpbN{@ReW1v`?}rStCA zfhxB0&rsvsYq9X_I#lMSxo|!YL7}wP_2(P*!eup(y@KRgh-0P{zO3$@#Q4NpIE@c_Xd!DU9wQia#OzVPAsF0yHO5a|9W=ikj1r5(p z)7b_Qwe2tTxsFFkhrOW0(FydKXHk%BwEz@vo|d*s2Xfs;4evN1EsJoGv0*sbF;|$- z!Lx}O6|FTu9oQ?NGDF89wE{Jc_$N^NUzt0sRe`A}uu{EctEZ?D+H)2_w#F+ldSQJJ z)$p}hb=)`zY_I{9AL6V)4N>43kDb8qv3?ZbU_XGuBG5yqy3zwAW%Aeee?wSP0dz0$ zJ5YI{_7cxJSSXy>TIH{C-iI2Q6{rwfF1HSJm#rc+z+!V9{G4H-1_^bgvIKi9Mg?}* z)n2e1lz~l0Q{E{X%yq0b7ZtY?b+NLr1C_JaTF@=3US*50$MU2_p#N;t^(_~p?(nR` z;k{d{K?CYq&^`W&0{jfF+d$XbDgZAU$K|N!4r^Vg8>sF;J@z=kkFnLk!mbA0;{$F( zdcB0*5VE)tezj-q2!cJfI#Adxd0;&GF^{@Kf=#G9bPZ2Ceuk}%O(BcAZUNnaxwV&F0va9w!UMwO@r0Y;P+77g1d|CMuRQ)*?k%;hu%aL z{07`@vTpQQWvkaiz>QqjyVj0w(H_^@mSca6({6RGwa~k$?!f)mwYDH8o?$T;<^`jecIa5%rNv~ynoZyHhZm)u%Ff<{*d0*k8BbBxf*aM*Tt^2WujmQ?lxKX z*=xDe?scuD&|x>+D!g>1oump&XW?>_Jtr&ha0|cb+P85D zeU^Ythw3kYO(zszCk-rgS0szTYweXe!V2FKy25$$O7k)Fxk6sT3u{E^=$$qFE!s*2 zo-b@z083;eSMwch24GKDQmnOC<_JrIAyQ>w*L9B*^crN|@f7}9>0G#D7hwUfC|VJ- zp6*Co8V9s@I|1+U*;Vny$8D|EKteA{2N0>E$NDwR*M*x7vT$o)3$BY=+6;KF&#s9t zfJ}mAEjX-J7Xj(i-LP5fDI~T6cy8VWdmZeu0Jh?~#$OZJ4faYtyTDqdt^s=u*Bbhv zx(pbj>Vo|3{_~J*m>)!f@wlkRuqxLD{>o&pOA$@kjTD`@Sf~u#hiTrP8)c|_U zab~g=>PoK67=<04tY8N*!PjuQQ@>LR%uk|@V7qZ8xkk|7uNJO-6)Ljk6x)NoV=bJhFbE5o z2DW*P%fma)RjDw_2L1dJ0Uex)w1p}722nhg(G{r90z2@5DC;Q$*Fd&oE2M7e?%))GGZ1~w&c@70M4 z7BX*^yO*65T-7F=59IVus5XG_<0fcD zgW6|}e!w|TbAd8uC!eK4L~fcaW&;BxR znm%P%!(?ya9wH}}BHXf8Li9>2UUHp2f@Em2lnrd-IiYKVYs%U)VUYEM~YmFh3u!RPrD%Yzf7a>~^Lt!WAK87HkBck9d z*g4-?;;-X)6=ZYV;S;G!g@@KsgaxSB-qIDI>IBx%Gsrew!7Gq`o+{Ctsw=;t59^eW z?NT*h23}emj6}69sNr_Lhdk*A3S@~nsjGmgM;JNu6mmn?y!zQQbe^CX8I03=`7%S( zh}!`q*gop@*MX`ERfBJ7=IV$#V=vuYkNiLtRzWB05#@S0GQVqs2*`u?9M#%!Ya8&AMty_UMQ@V=s;KZEHnD-`6R=PGfc-Mjbvz)rscQ+H=srY_ z2CFTWI{`)*KBzbQRw5eLB)F8c_`X*wYV>RIHsP(_D+=QaVAn6apW4U3aIYqINxVqCS=Y^?C(VN1#Y|xR^kMEL*DK zuaT-8S9jL9CETQ{Q&f#?r<$3iexMCuqi-f%lLXgs`xdHg=oa#DKDvy9rW5dbb6j|i z|Ivu~<3qXFxWn`F^F`0iT)LzC9PS>SrwT~Zd0czm8h}NoRoK21T!(k5{sC)E=o%{n z#xmebIBXgvu_^ zZxm+y)t9byy`n}zANSS5jliAR`SsR1K*4P2Dnj&4k=Q$Pr8OL`S=)g zVZ8TgI^zPp0u~=`u-F-DZ|2P4ucvfZ;aV3}-x@5~ab<=T4Q*>BgyIO#tR>0DnY~ii zv()wKYz$B{wl?Ik)9SiP$XGD6Ja;?aFX$;NBN|57bS?XfP^+2gGpW$iA>*p~Yt9s@ zQV@K7wW2`cf*uF{tZ=i;J#?;B);bP8mF%iacn06qHMZTh#FY*_b0%c#T%4!d-n)?5 zPyIDE2*+=|miv9SQJt`sYhC~$Ej9Gl;IJYJdTkBCK?Lur>d<9HLpxGoowZVNeO)mk zQjVQk3FJ)3VP|d^hvR?`A80{}Et&kh##Vn%yEm@B%jf5%ubAx$Os{iAoM>YPTzMY0 z?XM+O+g6$Q;XW=qZg}AXzAW1%+$w8HWnD+t0PlorP573ZKpw;5z?|!^JAw2q+trsm zVG~pc@%nlJvty<%`9MqrhJ~D6e~nuxQKT{14>4id!!0~Ew6nGlTWKw{K6zI|SI@c* zI~o=C0673pr$batK;~>|*{OA%9Y>ZR`i@sdP0d@Bfy#$rU3=}XUh<{=SS~c%7Or3K z?{pni8CMw1kNO0H?ATh~VlD9`#J6-6RLKd3jX?%HM26gFO_7k*pCD5wBvjrmWybT$ zO^7PHOA%BW>+8e!J4TV|nCirK)Sjv!ny(YcV|{bTS!uAyS}yh(l23MY^-0!&Yq?2e z$b7b)4$JzNkUpQ+8c*+biN1VXVwpYX;b(ziC(Y!He^fTN%G6Q$hmUCSv2qAjTxK@Yg)yn{nBPIDR1cg`*t@kqY*DxH& zpG)?c5^N=arfNxch`QWbPQk;uovyBFh#vYG8dnu~fDG)jt#lY-ORK+xWZ5~Y28+&{ zJcFtbLe&Y-FgO}o%jU1AnA@=k4{@a&dAf18nQcRPiIBF?jbg>a-Ps z^C9a9Ir?mPwb6`&rUCf#sYrS^%c$p;#+#{hTK ze{)HL{Her!Yq>bnBl}WEM^_<1_^s8?5G^~Tfz=op(m?5*4|QQnZ*4%*zXN;8E=Zh$ zJZRb|uBl^>jzbx?N>pQ9I4y809;xIz$y*`Y`ESipw5FdN@5bwrR9C>#sFcmr#kf z{UnL<3u;vb?)%3Dumfv>)-9?^Ls#$9aQ`0FA+ikiLm$xhAp>S=Ea;5mX__S{W5&tv zTN2c$X%Z5XTHKbk4t#em(*GKcf5blrxm z3-FLFh=~RT6rX@kOR!7W0j`64xa;XUz>7r}>$(d$d(fakBIeYAi?|{o`m9qx1FGY7 zBsO%U3XN2FkLo_$4c4M7Ygg+Umahh6zZ5x_RmXG}CbO6)8rMKe(6HN+7H=D`D*{9H zUBCJ&dmFBsGuQ@exnlleq^tQFs6EIIbT9A%Gvu_Bj-at%mPBa^9waE>PTCXK_}CsA z=+)0qdsM?^ZuQ=J8}2zJ!4_)~q*#>G*LARbS(LyuUW2*_IedKN1-LK3xx;q9RwA0M z-$|WiNfbBDStJM>k4C~W)v$UcN9E;Ar&n-CvPxX*MQf|AC3HPC$Wm8to{$BeXkro**YhHZy{?^YhI8+-pDVCwTd1c*ANs;*UAH$u+vmyUnf}Z z`mVHt`z9`MZSu1*pI8eeC07*naRPj9NJfd3FY20Kk&qujFvKFn(KeMyE3P|6B z3^i!kKeF|_W3HjW9J1mC{Zt_9ugOYdru-;dD^apsr}pezr34Xmf+}NUElWXdxUGd- zzz(Y#YtmXye(6ccwFG5bsk%a^{)b4jZ3*U(YcDwF>{Tbi^m&)kt3nikYuI*h6`|Fv zeuFAN*>jP?y0HJDE2|N=wAKjLYAu{jq|Yh7TI`F_bk%uEwklblAy?2Evf>4YmbF_& z^MX9QG$$yCLWSA6rG{~v^>3s>g(^_`bJ#mRFFUtYwd0m_b&oAX&|upFs0w6=N!YkJ zzNc%Ktgn#)kzEtHOtQ5bNKm!@io2%lqH9oyst_Hf?RNb;rc$!NwJ-)h?z*URxT1uK zg+wA_)wlsEz%rA71Q}=k} z1*B{Yt*)+Gei1~W=%E;h;`{jUb`2J0sm4BJeE3jFn#-DSV=qaWfTRDN=UI|%z|M$J zB^QaP>l!T47{bxR%8G2Ez%+99riQ^X%n(}GltQ`Fv$w+=^6qA?tfnjdu?a{z$U|fkNG!y1@;qy=Cmw zh*DQaL!HIFoDNzYRC;yJTJ(gclU$}D1zVrkYE*yy`lYLu%2(63um`8*7gbo+yXRS9 z9h4GX7t?8?!#t1{S>B)uacO6zYHCgzggc`c9+{K|yS`}FT7WJk6)3`W8nSp7rS43H zvb|OX;G(_@y+EFJRv7Ge1Gc@biP|pgXk@D1B-#xv@ya~a@UC<`gecN7)3`w1l_$fV zvAQB)aK+Z5sDAtTjmZIcwRR%gdvp3s=RL9qQ+h#M>hZrS%l6uDoEyW7$2^p=b(biA zD~48Stb>1@qnfcM&(c4B4;NzENp6I<2IErZ0U_Egs!|H?)klF(anb2l7z@#gPw4tXxz_^J^ z==gMau@me|T8qhU^Ma*~HJZlr#V~ZEW#(S-2El&e`{3@(Y za&CjIHspYPWRD$QaK!jphqo=V))$&u-WXZSi+Mh2 zvXBOgQ8$srve*j(q;d1B9quo2tQ*G(Eh>MH2IjKZ3m9{4eC>>^sRDBsp|1SqzeWRV z*^ySwHQk+q6NlgX zm-y8V7F%3v1LmIEC-5=lzr_o-lpPHX`1O9U$+dQ-!W}aFq_U%-2}_!nV{UP+4ZT7E z{ttJp9o4@?-2l0R=uYEr=@|SRXWiyni&1xE!u_tbp7IYG&TQ!y?dfbS&xE_%te?~8 z+)~y>Ryq{}cKFs7FW8d{1^PeTwbpPANC67M4Ze$q)w?=dt6fV*nExRWwx=wl8h0M@ zUgPJGn=|32P9aCw#rdD@T1$Nk7ygrPJ;nt-<8n_XTv~gH86#{9<-ggr#EFbclY!?w zzn8L064!=IxUKdPls4&5ge~fC2=w*CnRTT|1`EW+jq$Xdh!3e*tnF{CItlnxFjIe_8V_zU84j#_@ zN!RLqcbN?6)&c`vsP5{?{>m;D_fEU<%~#`0NGC!>I~jayruN=kdr7OKf`~0-{QF_@ zX4KHUVkG>@r8vFLX`Kw5wMP&J>&hGH1Yu5t^01`g5h2}7n7S?YOxR!FS=Rov*Ir_@ zKTsV)W}+3`w=&_#wMGs1&Dv)W z%2#9&HkG`4h4XA0%`6!j+%C|Q7pi`dIcuY;4d-&G=NUo248yMtnQ&X}C1*v2MueFt z_rJ_JIhvVn!q=8=(yp_CIco!lY$+?mBmPL!_Z!-$ALUHd#C1Ot?yG%7=s6cgSfuR6 zl>1}UVrX!#nlrpxT1h+02Et_atc~_KU8x5j5k;=$+{c&k=Ji%4gu9urnF^oRJ|kT# ztVP(Ea<>JSc@}&cb^dAJ>i3I$k+mm~>Ds3H^)Qb^=IS1iT7FQOU%H(Mn~^1J54UPx zB9$gCBkZtH?zZ4Z$g|Iy@U^9xv{TkjCJO^wE3mMK#AZ!>ve=}vD$VT8OxRC_PikM1 z_T{pq7-2J%+bww3=ZxREWZ3zj#B5N$4u!byH@vfU1EuDl`Bqx@g6Bk`NRx>`qyVS< z;YKEGMpoTsb!*Q>O{uDL#b}6>jW+}9vt{yYM4Ej#?0j4X*#InA8so~!x#Ot_}@=`+SM`h2W06LvJau;_O<{w+6wbo9TWg)N22*Q`k^J#26<+$#{mc zj?d2J_|cZ%5C)VXvVijGplxw&Xq>e=B#}q8BppLH_@hwX0-6;@(bM7sBiHLQzl0l5&n2 zJ?2`U2}NYd2fNQw;gEA3U{=Oz|7B?tzP2>7L6Ho6xc!={W`eD8uPb~mO9Xr`TEQJ0nJtUYdL1+W?h7`Gzv>z4>oX~o;vNlE5*>7i*;&RUlQ^(ZQ@IM)l@xjESOjuSPKRc?uzfpUk zgBoDKehc!^H)t|gMl%?&u?ashc_-KUGgl3Nbh|~sWLXZiol%Ml{nOmD(l3+;=BqoC z3CE#2>J(BdGhh3}*Oe;70Hd@rGWxC2%#{hnfc399`~gdm3{c##bEMZFkmZd~CM}V! zDXgYzJedj2n%YufW4zHN+zT*o39!^R&gXRw%36)l%pZL^os~f{0A8*Y`UCxT2Juc` zx>lSc1FHOd?Kfq@cI|zZ3c*@?LD+W)bGtR_WXhk}vA7MVbgPYK=5^RmI$7Im$za?i zbhxX(DlTdpPR*XAxg`_!QlTqr52o4+!i8&z0K-n)tPiN88Ly6JW?*-f>11FzH(7a{ z>TwR4%Jhz=J(+O6&9Z;RmH=ZG8DMO}adHBtm&NWWTarPH&#V`kDIM-tnp^?4-cXxT zA(jmRMywl6I5#s7I4>+)l7WLz`SNCmsA(83yE)g|VyI22uwYy~1IV7rOa>UTuDfs| z9x&0~q`b21NCtHN00^wov(UF3KR2-~{Me8Qx3*b(0_>UhR^Y!b4w;%lnPzkBbYIs2rze8k4#p^ozk=DS=`^?TF;V!qm@tjtH7B#I#=#m zUb+@On>V=DhD^9771ATVjtY`;JgKG#uy6xP4(qgoOY81o!P);MuJtGx#PtBhQWNle zuX6T8wQ#MlW{)QOawW9Q+B-7gjoK?&IzG7XsGuEMs4IWivv#Lj z#G`aiiQy~?!sM>y*?}Oaq5&36TZR%&)-#mXFsEx@c86Lj9JLM#<4%BOsD%)aH8Xk} z9*%=(Fx^nJ$XbxKld5|0J=enNz9G{EhT2y9T!n@ReHG52g5K0tzIAoAWS`TCf7!Ld z>858q*QUvNT}ko^qK}dR;o>_xnmX?_QBiA+DZ8GY22PGEY?Z}2pcXxZYY}I0K|F~MbnDu%1pSW_E`p0ML3K2 zG6a~sbUwDTY1>5s?BYLBB>ILfY)TEK8VR=;Pra(5av1-AoN)rFDBD<$iNfj*gHIVt<4=jxlw3f z+Tm$U26$N=oHz~T^Om6cWY$gP7rONZTs_`Y^F}7b$%d|HO?L{f%2VgZm7Z0r;5on! zb}v1^uDP_!ZNq#Iv{FH%17q$TJ}+sikoK{4v$i!EK$sB%Y+qb9Po8~@N~Rl^_YgT- z4a}L)EzE>P?H9FKqB3zUp@Xod%O`Xax(KKa3x?gp9?d3Pep?5pLel-K^ zqE#=qCoZQ0uMZ7QQ}1wha~OJcY_Mt&Q(4TLyG5y1+K@Upmck}`PqsY>Vh#vI+lHz# zVM47^K)3ce?p*CN6`-lY`)~i73NZdNLY{rc>bll|)_V2`0# zKG3XI)|;(7#F7d9|9&;^MbdJ>yXlU#cPi$++DjEeLj;-%@A#Svu&4yWk_xR<+nUkn zO_r@KkfghlwX1HCP=K9;cUD#YQhlWNj$tPB^EqJbui*_7sZgntPa?$jdNg_82(ZK& zmk*>|(8{z>bq`1Ju&$5`w5RPRyG0V2?>$`;CjCt4Zsh=Ov-IW4sLW(4tU0&{b{MwT zjzchQfNt0u>tG&CI3iGnV zv-k+-hF^hdK8Sx?$YfkF0I2C28pC9<165r;&V>!2RqY3Fw*?lJ9U`E+I-h1kGQSFc zRcOO-;IW~&#Z4Ds;-1}wm>ZM8^^fuWw!lJUhgWE>&sj-Y>UUvKq!C6*nqL0y)$!{M zhELDdk8}4WferDDyH6HQBhk7H>Nsf+FJu1t-T2ElZy0k~6s!Qmb-n8yYeyzrUVFy9 zL|8jL38*U#Vzlo>|M_1v_Lv*hE-IW~R{8;sx7OP#FkNb_V?*t!*xSu1Og<=B{kucQ zdOE6IQfOD(hPnSONx&_3SZrRtYkqo38H^fMjB3{ufOA8`wWI9Fgd5tdzq8DZYL|WM z4-$5HX8k^y&1KIK3Ngf`%=)8!!Xz z9&_!{;K!hDVY!%2C zl}+vUE)jl+!~P^E*ydWh%(W+V??T;yxd_zdTkd~M#BMa#kBP4xs0%Rx_v0TpZT`bt zYZY7JqT8InpF2?hX4m3lCjj@JZ+IfJRDeBB04e`1bb>t%LPCXQ3hZjSXdfBxTU*k| zY-?td6TnJfnYx#uLOd#JWrMH-bq`YnmU|)>k=@kHdR76>g}^d(!?L+pMm?4`2($(7 zSlP@V)9Z%-X{>)Y3!(kPW~Fef3!Q_timN+FRXgJ7otxTk-WTc-b|LEO1_6)3P5ao_ zfTF)LQ)B(1_vPT@saj$AT!3HaTUW-K;d+EkPGew5IrceK4lh`Wilt}}*0}-jns6K0 z@fZ7ysgWr3zMPT(Lt?IdDlIlxcewW1Mknx6*fDbdVBQd3l({h>TKRTyMT0a=ZwW{n~kE&?>u<7-=?(HQZ@^(S=5omsvFE%)Po7puD#1;OjG?0m;$)AS3DWlhdZSZ)^_qoD-~it^a0llM z?)d#>JBtUk(q4bYHAR9}2eMJhu`}kKiq2ULq zK@irqfG(AeV!pLbwvsN?|+%xhn4-YYU-MgUD*ntfu|avxvjd4h(qL^GS$-#&G! zXW7_=OU<|0S~9w-zl87-pm_1Z6xSN}euE%EE2;%3UV=0OTBR2ywys{$#5{L0aef15 z92<~t*>{RJjYV9+%C*@{Rk!*}WobXC_-X3=E^wBk-T2uJ1y zeb5{J+EmpN1ULb%d|rAN&Y555J9(N{o%5`=s0U1N)!1fzc2~a6z`3WA&d6 z)oi^64ZgNkb6QEgFkFH<0m{)ubbDOu$5txrRD;lWgA&x`gN_#JAid-QNTQ=o5md99 z>RIl|$->i^?&Y1er~?m3#u_EVl5KHTYMo=p%{N|y)AUys7eP6?Vhi4-TJ$ds4Z@h~ zL@Ohu?V^_bs$yc6}bU3QI+<$;W(s6x`>m}}3g+?>uACZmu#Vml$Tt#1)|L+_-)JYeR zr-fA`uF(PVS6P7D#u6%EAW$5HS91-lDOO@ehfSa&al1*>h@0X7gH~%0ycsu<&0c** zmPvF4n3eS?d@Ggf<<~1LsG=d<$*aNaVIWmyu1NNlu?n^+4(c4sDb})JFVEb3uY#7j zBkGKAF|2FC+8czLY>F;Mg@WuvbY%j#XPA;~?OC6nFP_y+w=&ifg5&zHGFB@PvK(79 zGIv2QZR^ZEC9Q_5H3(BGG(jUONYtscRjK*_vx)nD5kASa&g5C_!?!TQWV6ckVI0UD zd&>!IsLt^wgv@UlxZn{=P^@8jI&;nERitd~1LU_GiMwiIroIHKtihWhDlvnqq_5StD&*@N{3~g_c;-nY zEz`b1o3SESQ~le>GRGE9@F2ewsHeD&*1F4ehHUuT%&5KvdKRD)vruMC`??R1#baOS zGr;oH6Pn8NFGEkT7|Uh#H!ppupfShlPGDTCG|Jq0;ttVe$}lzVph39j1`@O+YXohm znh_QG<<1UrhnF3{KGC(R2S3*rOw5+FT_ABKvSx}!98ivZy;ua9UaZ^bV?E@1GCtPt6 zslybTM97R~Twlf4ZaD8bb4%1bY2jp?Epf%`JS1$VLAVFnYGp_QGb;a7VY&*_04WNN zE8e)TD;IuV`Af`l2iIcehR$KSBZcBXHC9x0&bN3z`(hk(Ec$+KEc+PYh}VT)^CTH6 z7vWka4RXe78iZ-kISDSzup}eHJaf#mx8*+KWQC0VLLUI{D`8y>+NJe3ah0s2Tgn`( z8_SODqPI6t5ta=$M;TYp=nVq0H8u!2;pL#NtbbG10m?~5d^$OSXWs(;(M7U$wgyox z-sB(Edwi_~#WOM)kAOJ~3K~#kBqp3kq$c{nl2jv+ci9bd3>|!czC0*;~<3hMI0y|7x zeOc>9*2J|N1`V=4IYC(s0%o=iY&CHgsFJSB!>hFpz?mBa{ys~CupTs}mt24zW@=^{ zM4jggE^~`qPmV%x|PX670l`!gO02!rcN}?CJK|iU%O0#U6R-a=OpCj zpzb2Oxc-uC9SAAKQm-)0dWfNNOWKCARpu7q1@Ra+excfgVTPS*5FWQOH74H|UdAj` zm{L}$>bPTw@NlUV;vQY#a;+FBbSMBn4#(HD>gzM{r3*NhaqZN@n9~)w4;q9v*&Ng>pe;8@^T}C%Qp(ySYPHu@ zJ}~?s`cdZploG??v-qc=sv_!PtpBNUwNID<3XUljJh?z>Gcq4Q8XqN)#7x5GnY&Ef zcnUGT@b&T5;H%DCH7;}-1d^fOAhgJqpiTuHyMb7(+9i7Cn0{!k^bOJ_JiAux5nRHC zlLfxss($qLdgjKm)PEujB-@x`3tI)QY%Yw1-qzG|iZ{WE#LbzTs&}aXUxS_R2>Vqw z2torgRKGz`$-YsmR_4?}8{NVR)0LRdh^FH5Y;*e9*QDv5lb$b-sNG%P)Aet4i`(CT z7ANl!{UPw2UogjpNEpyi)lRI~Wxf&@C=&`V zP3s=4=_Q~Ru%5CYg%{jgQqpP=JZGuYAb_Dk=!2#azvtE)({{H#hhsH3;-i z+LL{$Val-0Rwk}sj^P9!Z&$FmYlkSdTmT|q4-=?6%ZUS~$%Di5yc4i${gVKx{_p?U z!?jGY!UZr1;B(97$2~s%sGLiI6?)*<@Q!Eo8U%vPa4kajTbVixZeRjrkyW=`Hc&j< zqAD&DzNQA|msQQw-x{uUij^7G<2_A-6bsto`4+4r)G+G25neScNV1`~ISbowWq?Kn znH$_8Dt;lN)2^kQ&p@iimrrLpo?)W?P}SeqAu3aB9$S_aOY4v_-)h0eso;B=yUEr) zfbF$1yd-YcU%N!%cKzA4_`ZJvm>jGXag4T_}3OFK1^%6)->1X0=Gt7%@iBI?sTIeAtnsT+NF+R5ndv5 zn+L`QwohOUpshoI9Ia$j&Mz?8ic|*b!DxsOf$nO{Q(^_f+|Go z$LMIW{2WX6tn2|_nv{~Rg=-Q)0X@51o3?7VFg!5HyW5;%voI)AEcmdSBg8=>ix)sT zAw$ZF?+@0|m0W?Pbzb*@$kyv@eUB|Q2oC3KG*ss_(5?jjOeY2FM?*_t&6r43zepsC znqcFSsca2N;aX1YNozW6&J{FUWStSbk4* z^UNKaCskS{z?uz$#unE`l~JoS-JUO+&n3`W89a@w;#wt`CZdTziT<0diD2O3Tg(-ulvmV_%BGa5JX?0Vl{@dc3vEcJJdH8lwrL0c)d z0G5FOIUKbxL04Z@zohFmx?Xhw$(CP8i_x+W(;I|-)RMGq2`bRU6;WO8^FB^PU>Y}J z_J}fU?NlAtqCyMoBBz{k9gO+OvmWpfPqu>No47s51ucrFn zjDtMKB3lfE5)a~Ii)Lw{lEc=yP<4YI+i`<&n<)&r2(#IFnXCW7_p*%QAX`^B z4uqscOlw|qF8OJlZN9oDkJ`%%hHMQDLYO>&6Q6XLB(MY*_Xn=S8Jj(VE~ZxkHY_(m zEu9ir^0N?s5KF;yTLC}6?{F2iYSrJBJ)%?ktd2{ccRknAn=Q}lrz3}222E5StyNAL zpD}9BK3%87D%zsCNP)ft)>cON7APY)1=B(l72pVu7`ad7m;kg|m3LmL%b?g3ja-%I zifVGD&4Y`1?dKTy5JoW;|l z4ag}>A`AF_&8KALWnhv|=%xx(LAYziRO1Tu_cgeNzn>D=SG4mnT=*hhz}iY$#YDR* zLhZ0!y7BR2daj|_E3xIYNo4h05Hk#;kOYMWnFORjm+RHp#0kFmNt3KBh~CRU*p8&| z3joUYnaVqSlqJTAYHfIptFP*>KBE?K(80}9Y~vJ@vYZ_opQ^xi>oPU?X*fdz7}DD_Z9n=$MU*~#u7C~*4a`VXd44Ud`(Kw zZ)NBmVY7cLyqdBGqd{{c51_eRiT3`cU%!5-?-xbiAOti`W#@{+bV@M|rev=M@ReYH zxpsy|s&R zMUyJR&8R)VvAt?cf2)-do|UETwj)@4AOgEivM6y!&e!MaZ`L1yBiVIv&?|}7?{duy zv+aI;im+UT2W$~CNf7c1rt*8OOzLdPyxqS=)TZXFXBmof6<6M{e7F90$=>s*{QIt8 zXe2G17HqN=fpA#%ZClt*XM(Q3;^SQ&LmMG&1@AFg=~>u&p}8XKhm6@JCV{mgw2MQ> zx|wBnMeUruI*NjeW0>WRg|m9=a4`l97m1g}(#m3deWPO?PqOTt2pf_~8DDAU5wggfgoG1g%WI0^I<=v2f7yX;O9$Qpl_AF zcCn#Z$rr=+?~&mDQ~5!fZi(8%e%92#<=^t7%k1`EE9{Q}-B*4X-Q@))Z>ai%s5?M6 zMOJ{`qU^DOGbkJHR>02QS7$`s;RYK(x7mM_2FDJ{n?%?nz|V0lf3AiU&_BdtyL{ju z?^?Uk)<4~~j$N*`Asg%ngRQQ$CnNqC*MfRM$Qslg8D@uTZS$>N(Ccv*x>kPf%qG`b zKkC>4y4SU~jJ(!cY#}1}Y{&HmkNrtmYpMNrX;37C)mdvDQy|BMC)9_=%q40g(e~UEpa%4?P3}?!kM3! zL-#&;VjEVE&7cmymBIi|_g;dUR6S=6^=CB5lEJxV_B5_t>UGj<{V&y2K7m&9bBU$j1UhBf=Q-B-=f{UVGZpBF7{0H z_u>FH?zKLxF58X3JPhcN3#R@}bGM1{y?A<~kmCby_VN#Id_NtGniu z7He?yO{*q@ac1s|keIp|Yc*>R@oq&5+VBm|Vy=kXiP_W?a06z79B3fpARPEM4%v>S z6#JXpHKVjxgD&P(q6#6xOvwOsZM_S!{6YuY7}J*CB}lraGfTYt?Pj`L3NjsW$9VKV zXM%03icMFE`rD#G&tE}t*XcHKtp=TJ06DHt9&71Ps_zPu1VUHJFIL|o-0Hnz2lyH3 ze!2fV^R1L$z1U>_+XmZ?gV-UEfnXxrv=sITZn^7#@gog7DrB(9W&JoCwtOpf38k)P zrhS85XU_=N^8eMZ0c!)7$Wcn?67bgrYxb?0t2oO?vJI#*Fa4ozjt#v+1H5y5Mv?6G6>#lTJ zZ`~ctT$NjrxL3reJ+d{XhDe60WNn|^^(`92>(OdQ20D{&+7DW~a@$ohRW(quQ~HF` zD@dU3_zfLn0TcpC-0bzj3BrAFvnQrhJ($8+NY;kgu#^}ZS>5$}G)N+pPE*2S1;(j+ z0y11n+c+<)8Z(IMXZ4Suh)Cw=1Br&WM$P)H!Z~`hU@P>j`l%&3?$8y;YLq@+-1A4 zb?2p-2P(4d)3t6|%I2=iH8>7DC{-t1WCMk;er{2(bD0Hg0r~z@hiNymqIX?GB=6|7 zW`eambCb{jP{Javm)X#LwQ>8ZrZ|WxR+4R?-nLZ7U3Y4L3#HE5-WBE4;T(A^KI3ab zx)!8=YtZ$AasoE5en8+k4Mzhgd}$c7-WNfeBRiVhC6|po!_G;b)%c=h%EqE@fan~jtOEBCk=zBpu;4bPfXNvGRMB8~xkQ=9@ z%ztKBHx!jab{Gc|HAKXqw{4Qu?yg%kI1Jf95up!Ui%{uGlco~V4XJ7qL~`b_kRte& zsaLGbk|o>%7F#Au@1+Pt|v^YfP{P)M5ljD}C@)z5)PK_l(DK8=^WFXsEXyZmf`Xn+9U~P5G+I zV*_JLd<`KX{%dxEtoGbRbIGIlM%*NT1+^Y;MqE0i8X&o>m28<~WgGy*x;e6X-hN`K zy&A~rH+S#~3i8+}!kon-q)Q3r$RM-Z`(~Mz3a~?+eEBqRg)FE|+~}zDPH<#R3> zW)A`ZGN>h%+N#0WW6$}9rX{SEqBVBO--mOZ~=?sq8YNf1Z1u22kgo) ztg=SPiuuS=TQ%rsgCv6Es}pbgRsoq3j6Dh}+zaUSdSU&~#1a*lz0(GG%$31r9(!F8 zV1sN(&<+Ia1n*KyZPj2l8<-lJ$pm9>yC7Y-7cd=SzUXlrZwer3XLtEJns<}1m&fKV zV4N_kH9%`c2_mdBy4IYm6CSWj1C8-h5t_QDD45nYVFv|p$&kCMfAOSA=!8kTue zp;iXV9-F9|JvO_#(x*Up32V*5+ATHb0lPHFlA%Qe(-bE}StaD>16@lA!h^^c*FPIT zA*Qy*wE~KBPsvmTth5&OIBX=v?GKo3(ON0TW^8S~HD@WCtUEO*$cJ$(!e$~k7Qyy- zE?%mk>gwioO$Fi{-JXIoLYlk&?Z2eUM;3Z&F7sIpZ=1_Z< zVh z*9*Ltu;E8X5;V9oZuZjDvBCRlZ?tsgbN(HE^lek^zY@ z#!Npy)iw4YY6UoEy)Ql1Mcmdw23em)fqlJdRFrk(2eOSxEkDA(g0;#xFc@pbQpO&^ zMh)DVl7YyEy=2fe7by_4%Z#q=Cb1b?z^=tZh6qie#+B^%8(w=LyuJ-F2xgzr~ME<*MPA165ax_Z%_l9;bD!LSFko33(9lxoTKe|cKL zoW}dfV1~Y-01jUxV7-_-2oC_SqXb+JwiO6P9EABO5M+HPW;+d+ZmFzCVBh4tQUiT{ zS4jp!gkCN*Cz$x%L&&`Tk?=M8yg;w!0B~R2l`qqug9QE9%7B6AfdD7q2-b&aN){7N zpu#$y(QV~{*usDagno*3-YZR(ZYh%0&?DHVLAV@KQ=v)*Ndy`#xVEm1w!4gimac|p zNW_TikGfvB$Y!&J*I}+g0?YG6o?pDaAi_chd*b@@1Y6^#Y069l%mZjF+Rc%ybwZY6 zRZAUnmKwV2P7QKIDM678qzE7#w&t5=f1yaQ1gS(pu4{=Y1_S~cV*LRl_WcF1_HnjQ zE|8mxX3B!&&ftq0D{2NX}#xB?!<|X7CQCs~Eyfsaur+G#u(+Y=8Z>+%t_gM=2yCqD zpD~)vQa5`9&ouDuc1G2}C*0@=cD}BstMn}uGWb^6Q0AV6BYCuq!+#)cYP&imHW$Es zw-JKSk13C^>a0dWo9NBB8^Mt|w7@7-bw}fuN;WOXJ;1E*?AeUIbU& zBiN@w_`bqm{bZ0<4Rb6UGQ4p1pk`Y`_H~UCh?~Li1A?l{`vbAK2p$e0Z&lp4xaz10 zwu>6Z{))MjH~`@TCk^JsCxqp$Wupxj=veBcUQ4G(ut9_Jq&I6az=dXo2pL^!VaqZDlJ z1)7%f$x^l+(LxPG_o{ZSRx)r*y&#-_gVuW+>e|r&!kvbWI~CGsAf9VVO!12Arfrog z$qFv>*BZ7toj0;p2^+1|Nrv}i?I+kh8uZ#3OEQ=hp{eV*=>m>F7q(b9kr6`MTrJv& zJRNsx+jF}0(BQzcscMTwSnMPNq@`#L1vCi&+QvG&ae$rTmaGNUJh?P6w`dUV_3E`V z-DF@8p*;MDbS)ua42g9NdkNwraa;$-9ZH=iJx>E@JRs6_4QA;(Ea37APm8FPDQ-f| zMzf$=D^EM!IB3e+O)jnYyFM7y;GuWlW79NYbzJv98lag#JYdPIoMIH!8g5+-C3Q*x&)uy84a>#T1 zc4`pYneg723qo#HlR;aAKu3133#!ihyy>z*7IlY~U*$fV<`8B5aXkPuxW>o|)h|$; z2I~+OpIP3wRviaEkAsS;pLEwNf$(8La?{u*4Hysj{jF?Z5rK9_0&;a3)wnyr`#H#Z z6yVS{zC)B2C`KpCLrcUK-2>~eKfp=bSpPT+$Fimw$$4vy<3L=iS^6u)*~`KKGS^B1 zWXtt7X%GVm`!LOB#*_>=7Q%DID5Rw7YDlB58CMKIuR50?ni>dMe|#b01+GXg3=X;; zE5s#>(c&KnDMDI{jb*h~5eKf0gV0?DmwLt0Uv2Ih9UymsEgED|Fm7jz$>16p&|<5T zC797w%P*0tbMcX*=3J_4`B?utw1Bz;I5_Cm-&L^8B6N2%(85|>S#wlZi@Bg*Qo zRl{Rh%Vw*_+^9ih4b&~tbAfI#*GdLFlrvDZ>Pm&Xk;xfVOqW+by%#c`7_-y?b}$$m z)Uq;ccwAKo8V5%pcKIuB6#0!3XHnO zP7&pOSwB&)f@BFA-xiX#;sw`xsUO^_JTzp*Wd^mN;X8ZQ(j|~=bKuk~wvCZ9U8Mxo z^2#k5MAHf1sovgNcJNnj8)|Ln8$z`<$PBb*bY|!Uhwg@o^ zp8Ri1R->*!C4QGKg;)j*VhwWxRG5s%k&Vjd15Ut)fUbiY9Los_!cS+hLEQ<^kph_q zD9NSLRjEcxfz=v79L8Wus4G}&P&-0HTbfVlIqamaiqIvQqW0k(96TLRd{*4%n)@p* ztmWU^&(qmhy=+kShn&a*jc##?*>qR4skUgq?F_wz73pd~6^q^Kh6vDSTGpH%^YwMr zz9u^vk2RNBR5Xw+Q2Ercs=kUUP1{^&4!F?0lLzE?kU5ex&2DiQvkb3LGYYPruIn`r zMiH;{+0wMQ?3nKb@?zp9P<{FUxK z%&bvy(w}#Hh>smT=LS)Y%9nFWx(4Be|NSaIJ0L4{^;5Dks_Fn6HE4cVSga!gWFpW5 zP|m{K<)%t=|KoqZez~5m_U+C5wMg@qx*m^8jf&e1xEY@Kx}lm*Mwj?V8sN;4r3cHN zbX7VpA-f#&$z`7g{bI0K;Rld0&0L4}Ksxs;B-kcmLxTa+JE#y^_Gc2QT=)rJsljcs zz|UoKU6Z@ExD1oaCJn~rjtF6S!hDV#X>hBIQP&H~Zs7ASgyDldvNvTlC6{k@s&469 z>>kmT9<>{F{G~UXU_|yWvj5KVM=bVl`M3Nt%3vGA|NrvC1lUA(2P{k;fo4SA!E}?T z>jl{9tv|`N{M3CER@4m+yC(>)t%l1X_b?66n^M6RgZUj?cR1`OrW>ek@YV#q$F(-V zLb=&^73>bGdzh|=-DH1+-qXtLfZdk0{<*HTDO`7AZ-E8BBYSUhtsfEv|GHKLU5&ZN zVfO^V4%kgh33^W|SOg3C-smlZgDtMLimA)??{4U8t*!kgx?5l&-sFC{s}*$cw$fqm zlFPqyOAv%5oAJjbRNcmKg><{<%B-~o7FXCFw8qXV!)RLVp2LnY>8F(jlLD-P6`5*X z?Ik!K6R}!_^{}`k7{bN^^K6+s2ciYK)?PzHq0E+gGt zu%V{rM2GCf4Ex2%~kp#F<4Np26@d}x{`iN<^f8tv= zxr{CCWu&_gR&@e=J?vc;Su3<&`q3ZNSckcu)vN9q)2dbEzOgY1bX2AO5SuQEYVT-N z&)Xo@zGON#1;HOHU%pLu8?5dG2OTCOF!2VUCP?mEB0=Tvd(5=*0!lF8vncS5C}^P8 zX{M?_zRfhv8Ed8)3X1CYh*l6$*eaHhZppWCNXHIXCG{sKQ1VX1eE;!x=Z07)MrE>{ z%3Mxks*9_)(yAA@+zaq7CzWSg)G`Y24;g3!wTU@)*Iu}Wa-L-<8SUkpba%lvo308q zV$$^>@0Y$h8kC94>#&u>wgsrCNn2h}f*!~3){U^x6V=y=SJuA;T2J+~AS-w6hAV%f z)gCnLHKMx>7P_EvaSkhJj5i~4s^@ie|tjHaRTa2++U)zbyjmrvTFUq(>_PJ7+)SV zFzu@Q+FeBjhQ*iNwi3Odi!ToCwF9=Ecu`L8#pz9a>*?|n$lF|t5nMKz!=RGs=nS>e zWMz)6qQC-r5KmeE3^&yuQBS-sZ$Pw!tcgZLoyO{mI(PDSN!N|(ZiB7zOD?X<@xwz@ z(?QYr5q+pAr^iGt9KqIrEid4JF+>52+M3Y4Q~y!C-Xbdb<};c?2A%GNy_UiPVQS*$ zhaOYfI!Bj<<+Er-$yU^W~^L z9?{(eE3$ulXo_p}XcQB@Vam5^*Ydb9D-z`~(%jO*y80jt_B0BV`uiL8Zxd~W>$GcC z%KA9O64FjB16&WQfrcqe!aSXn*1A4JN97f;;8xXNjRIzBe=fba{yI@thbt4c)xXDA zr)!7a0jpyMh}X-(_Ad)U6BJCzAG!K$D^ z+0V}x&zIv7{xf82*zn5h^Cets!dzF;>n^-NqAsq#o2mcMP}r=<=v+V;F4G`BGd{2#7=-%!b2=R&KAt=mUhOEbPMePFf9Ca{Mm2=%P2a)>wNKa2A6c{m*5Sh~bXNk6g+M!fqp*dDW1H^n z2{fCS{N`${yM=4;+E)rKFRPDYOv0M#KQC%dR2a%l)}JR}<1hY+x%R?}`Qmu*+#B?D zbqhX$$H(+C+O9o+o;`1o#buZ^&$E0;tiu<~i~6h8@7LeSqSjy5f&>^oKggc(D28g( ze^`BN5IAOIU!z6W+30S8O`!4O$?#DOus1AtsY85#akl&*>kF68^}_Z5vPZPS2ZjP< zPfnby|7RHmqWW#r&@qek7oU|}i~93z^&QZ7f1kxrvi^PFiVcDnU6hKh#74e@wrdNl z1Z}thBMBXN&S0=|u^!3A_Q2O+>qnr}J#Tq|8U^Q|^=hWr2laPyR;@|2ZVASHmp0ob zU7YjjC+{t=ZBSr0fCv?Ta)Tx@mh!&U46{YF)y^8dULFC&R`Y znk|ANZF-LzB=0S-&_a!F@QQPUagrtl?znFd*O7z~xWEikXxue~jA+XXOx358;Hd6C zbqrheXBmp>x9jf*^*0-;B5LRoh%d?57IZ`dL%Vbvlm=25FJ+cf@rbfYyr*` zkLrJdJ+uVTfuW{|Cc3mWtxGqvmoXP?fpzZMvlPM~GdF;E9D}H0;&AdrD8_W+>0y|N z=EOzfjyL3mLNl_V`cOG6d%+A1OLkRQTOOf-TJy~h4%-$sSC-Cy zN_|drga}!DSjWt*1t|?kYjH;VxID|SlbD53oPcoAWp!0?jg-Q7uKu|f`1TWphM}-2 zNJKFw=+)PppprJHOVD^;z}MHu8@W2IV==62itw&>1}YKxafQD?2{MV$!OYCXkkLMX zF@PQP3l_e{0RbcsSD`bI4yE1`u%Ty*lC ztLQ=uC)O4h$v~#;CfJ|>IzrXTigZt){5w5Y@w999jd?+Sm8oEa2_USG&#isBk>H|w zv4sj%v6m~U`slDOh;zn?tIA)G>R<}u>YMdg&X=|_!OrT~MXd}gT3PG{x=8RMF6Ep6UtM~~P9+fK$qyyP{|2O z!iu@<(r$v4D&*4UsXG>y96=?<5VLF!a+MKtxGf)DHbd>#-=7uLSj7xA57(RZm-k0i zm^MRo>V5^4i+lz6kgo4Yy9u_TteojC*XPjdL(m>(Nt9nd!%bklIU=Z%!QJ}H0|sjW z(hw+n9zLqSyyK|K0gnw8Zt`+8>v|Q1u8vI7eiLkUijX30KF5?{UMZ;pg>EK@m=&n_ zMY>k~L(dCZ25ZSG+@K8CSpO2!_3M8jHJg{)L-gr!vw)1PWSDwU z{IxRInJ~SEnLw!;*Q&(uOi(=Ns1r;|+93++mPW!7)l$|s8{kFz;hk~9#L<;})AbJu z5NH%Y679Jw*1lnXVvGxqaP|YAGhTYfzFJq>usOjUSyLhymEuvLH8dE$Ol0;;4>mflu{6gsj{WTw7{@ z7TwTNW0k9+{u!u~IlyEn-?l%4gO5+Osf5tzN$Vh!)>V&um&0PzlAQENn}3b#TEu3P zbkzxaf#X4-6A7?37k#&inX;>3N)JHf|^$?D^xdhHQnkQY>x#3L?CH9pfm#?v$@1X9U^F^Y|mV! zy$}?i65(561_7gVl=)i0AF&WO7_ULVz;*Q(Mvr3t7JuD= z!bw|n8L^P|)TG@5%ab(M2*4n1>L+yU#T_47G139mT+2nbEUFLm_*!-dI#eq!Xe2|= zD=r42+Up;imvc~kJ+vBGJBtQN;fkPK_oxcXqk)n0#~@tzLZ zG?XM-L5fpXvWYPbxFzjbO1lX*xj|c6uC%M*gbG^I?Kr(xxP_34YlTL-b}g9_7bZ^ZqO|TAHE`8DHq}D9L6~-pb7O6)b^W1P zf6=_~d+kKW_SYPuW}EfiAdJ-L$#c0LY!hr2wLNLmtI@NakC5evGaMi3*s&TsGnzht z%J;Zp#isOFTPw?K!w1-PDz2h`5tmK(Ab|ydR{f8-Gt_(F>Z?2}L-|?z$1gm3xJg>T zXH&*~EKguV@^%=uQK8BWlEXntB@iLsdVG|WcsM0ePv8PsiRie9F8|uEa-n(f0;cNI z5tB`WaS$XkU;kEIW654CRGg}Rd{6#0EuJx4rJ*XKgOaN8OQGA9b`NZ5fjF@z+29av z;Qjx8{c^eZ0@cA;UkquBxB`j|K?XMMcf9vQ-;;$$JGDt zm-1W6KV61@di{T5F<(dUZ<#B5!r&(b7o1ys>mTp2P_KplYf(29m_IPzf@-`7ZyI+C z>W;D}WH%*(Jq7#@wtG;2lCnQa*DVFgO|h$B_qf)NQ5LpP-GjQT>~bx?qec8V%I*o- zO^IMrxgHX2LH$9=a7X#KLEPtB|G);Z*dM)!>K@ch#fc&8!u+xaRhB=j>}cd)9A;po zx(D?S6=9)^>?$V^^B7AVHuKm&sqAQgdeL+7NAtDITTuU032ZNpVL`w;*W!cFVW9@# z-42hv$Hn3WsOv>rC)z*TnHhAxMY)<7um9 zFu-i+dd=sK;!0jLP;vE(69Vi({iecRP*y=~j)~Wd`LF-}XQK70-9YZRNn4Yx4oi7U z@mT4we9nd$bWMRemym^B{i0cbJ*eMSh>PZ1*xQCPnk|e%CQwV~;)+Yqum4^SJHb`= z*fPVqZ%$j)2o~7Ut5<`p5Eb~kBDUEz-GTaTC3;PjW<#$f96B3at1%H(W$vg!p-e>0 z{naXh3YzU~W!T@&?67MJ6ueR@DbIqh1c0^xdrxb%k^rvLcI`pkQtBBGNw!YD ziLE<+mp9j?x8iXn22`3bHaYB3P5m{3mcpROu-`6i?(?!|S>9tKWkms+bG&;{w-f-? zg%pdiYta$o?^mh|;IcR8mdt#sslodXzdH{S%l4oZv`3j?L;3DW`Cd z1NN)`B-MgiX00*mmVzl(&#}U}q6S3Qx&8qiC2WBj-xVjd9KHO})wSIo=wZNLH+f>w znocs!Ud zx|SbKXH+p;dn`Z-1J1C=l4E*iOFie3ABM*@Mgvd>@i|KlPr`IkS zR8TuE%Vz<4c35ZdSJh+HFc2Bm4KwVnLSCTK74zj;#E#SJ9@I@mnJ5)GMs|jQo^@Kd zDiftmP>-O7z9yq;puUJ&YlhubN!VQB)@dFa_)`)LlhPl%`0affn_GAky_#FDSw* z4GE&ZI+zB{xE?&~+jZDKC#~iMS6dyc9|ztOv9$?xSJBxzPs=mFWyx!1Rh6OvpO4MA zGbP`e<;p-#ao8BOf4(^=N?fMsZqZYPNK`mao-f7>99)F{%L8O z2hzVtRd$Ohs(Vm(l@{4I-It(C6roEV=!Yd1vP+PBET7^UH%4#-BrSVHJ?V@*Ds%+!3jJqvyS@>>`t%;bx&#B zAc1_*weVsa8Qt^Je;J%_!WVRsh1&LGa@y)d+V+z^1O&NAJDx}(GZh(meF z7hNlv(!3oNBMUgd6wr9*oOxzbZ4fetbrJV(kQPh0+331F`Xc(m#|2K@b9irY#vatg zC7y;&ZXo%dXQWFRX6}L-{9hZC9d?o{du$oCw;XnDam8x5Fw(%T;3oxvKhLcGhIrkB z`mF^+0qHVdC+=UJ*y@~$OQ4_2KvjoznZr(FJ}x0w;O0`7=HD;|UR;0j0(<@Upnh|q z8{KlgIo;FGrURVPQb9fUx|TUC?`WG$uuDpD*KF+eg@@)ylDnH}TbuKr!%o zLH5McBI+L0jV1L<&a6l6i0`Z93&{yu7Hi(%>RKY83gn9|74SXGRerYbu%iUKu~c4= z(yOoAf+=#CV6c-)G{+S(g=&(4)^+%s2 zUJigus4u2h%MD>^yr+L>>%S9qPe~7?0GAQueBBuhCS7ZkXj6O*K=Bch$zg?aLE*6A z<<;*f?Vpa?MB9ajvY$vYn|_WwYidI581b@vV0Iu&G^7gcH~g zbcfYI`5t(y!~SvK3cU(Uu7G1*->Cl#*FC5k%4Nf^j}Z0Av$7G{bv~%)XTR@1l(R;~ zf_QxG0_}=0aM&Z?Xn<6M8;zqjIqX`gwBkBXmVny?PhFsxT4nu_Y_94a)Qv@_8#b?| zZeYe2n6O-QTGFky&0b$6KnXP$p>SB`@r>fJZs@Q;(tcmmdL;&^Wb*>a{ekLSO!9mK z>b^417dzf(IEXvB#m7heVGXz?0^k%nbRD+d?Vm@1>aZ8+cSkL>WX(o2GO;F2<;=;) zH=u4T4Z2P`0g$!g2oWuY=S6&dT%Hy9=KJuK-jW8IhRLV`c9op)*Bn*JJ8g&c28Z2H z0?)GTbxziwM>f=qQ4|pAD;2-1|MeZH+X|@G!u_Ec;k0HfY!$VY!@4rTZj9O@Y3GLrZoBD^=8#s7V%+lp*tpfs0j z@QvQl<_o;WliuhB>TS>ql};Hfw5_9d=&-OcYQb}45z*|VA~~BQ>mNIXE`-82q3$c9 z=_*}Id8V8@0r6FFsdsbo^pq<>MncZrF#ATuX_U$Aby*+eUeZ+s@hHL*xww~63{?Hc$hqW155>a z!4K22C>I6!PpY?CbY-t%I8Ud$LJzPmm9NhbHI+Y zP68HS8qOlrmR~$}xZ0A?IIFCK*vw{OEQSiRkP0CeVtbTRfyuQMSH4;@Mv_y3n<$7k zeKP*d(Fw(5(a;G|g@tOwhWIh(_`DXd03#QZ;K=iqUquS**N&s(0LmhRTb-<*Eyi{+ zRHPTkt5U|Q+r)%DeOb|Cn1s3UrZ zScW%_dgH76$EETg`S+->Q-1AB_+=WdEmmZ@-3O6dXGkLa09uf z@O>w^o)cQ=EzH)m5nDj}p=AR0J6!9_&NNn9NX;_|K`CoDwG9Fc73qYPREV)v>K&&7 zr73LJjjyQ_j-eB@bu;x}OPvSoH@P;a)0=aK~^+qtqaP9YiimznY7y&>idmS%{r|M%2g^Nl39aE3>W|a3!_OyK~x`nUb|d# zCkT|{b2p2%OE(ox0`^6Ry*-(-)PfRFt1~CMCqmf|EgZHR>hTZ z0$p&zM5`;ZmgP@Bxp`U8EnIm#)BhirBjs57y2|nT%a z$bM9QqqfjmS*1P)2+a&)z0T&dp$3&7hqGx8-$BF+I7Q+m3*;3V0O*~Xf}rSyISa` zj_bF7nqb?PF-n2h8KB4?{F@Ooh87V!>pqaVg)Q?PCuPA^0-qfEUO~1cAA7}zKazP9 z!we7XnsqcsVJ)zrbB-*jO%m-6Za=3D#`&A|I&muYQ8md)4-#>3qWARx!!Abig~6Kc z1#cie=XlblMiL(jFTDX80d;wdPaue3HHYqIh2j*MXJDt{OK^~m{}Fys%Igdu88&V< zh}lOti6v`L*e}0qfbvBU7@^C2?6B+C6^RpqkBw0egsV>kI2QVw%^lD2*Q`Kjx!FZK zX#%+UY*IWxil9|kD>2vcg)aXoP{aVbKdUzt-om#W_GGULDkoDPccMBX)Y?OG%SUwh zaW}w)kfg&-z;k<2VDyT171eGsa385b6gQT6eFS1(AQsGxz=GIGOon_ z;v8%O+63S)aI4Yo7X_~ps)E4!(Ps^W6!MUJhRg~>L!$tSgnJ(HYEKTu5sWMES3ZnZ zh2=5me-k!=m?pkRvAfk-bzA?@Wmi4O3(?+31L}KdD5iC90dy1rD6RQ=fa#-CF7x!K z_q65y+__e^meIA^hsL2%O;eMQ-3Q}6mi{(O z<4WcOWbL!I?hW_H&cvw|#6`4SCcj~-@KiU7Im5d(ce2D%XqkcJWCx>o}D2*Fl=b#73) zQ~6bUdGS~%^}Hka*j!$pn>RMMNx^04n#a>#*`EcJ&(09c2sq)$0Yhx(9XRqPGgT`E zmq4Mfe}+zb1?YyPCBCA5)rX8RlDN7twUZxVqfVy}chG61-lbXOq=yCWx!mcLtIOsg z_!R>55SSO1+QFoDl{yXNMYACi;0Fag;h64+%X$?JFGjCd9I^`7_?@R-&0^M6(u@U= zlY0jJRobsovS`ePYMLo?X)xWB2smb2?<-Oh!RzL*ej_j!FO3oNM0vGC#SXE};$0Zc zU5zpy$!)^m#lBZ2Zatf0aN@j|lofW@OUDxngwj^bw;uJG=L+QP->i{8np_ts2I8xZhxFLmUk{3I0`Y3%+!@xPQ@;}RwgQ_K4a)b+Vc zt_#$n-7(8jI`($sf!wWkm;oKxO~{jeh6JgB(n6WHK9rM#6d-$J0kJdqYT%6G=jzi> zqCobhLcwj6Z*GAa)R2^Ick=`8bPs<6*{(mdHu|*43J^PMa(M$tRwJ$H+`Fc&SG=NM!%s( zY`qEBBZm@=4JocIwc1lM2Da>h=&KOEczLc*uJ~SR{O0Q5ojOZBlY+`w9<|y`SvUVd zZS4LiPt^S|TW3R5KA)u(CTf>(`#L`r{{cq{zjBb~pNi{4FqiU!9}BWuSs!}TzuUpy zgC-ukgS0?#T|dV>_Tne&a9o?*WUOb_7=l6>oMc!5%(HsDYE2LA^OdII!r-|(5&bo> zC`2)GW%X2|oP_M8wggx9|FqAXBbUWCL~FC3`6V(@OXyfKu+swd`z$+~5U)Qg>r>E+;BzreytYhJGZ>j=YJwJ*H@ zB0Ga)a1SfGx)yo`VB&T+u2ng)#mnNaBkJ+m4=h-ZVb7Z@AH%i@$Jx}DZnJH(;oc3g^K9dD zDo40xhj#j;q3M^?u8utEI`<;A(;w=)3re=gX!6j3-0D$giiagNzC>W>H~}(-{hbN83DL68 z*#3j8U*<0OuF_I&WV9)lspNOM!AM9r=WQOK5tJphP;ur1ysf@I3&6oG>J7w@wj_7f{D1pf$p~F4rp}XL){KyGlwq#|< z08w(MKs?qWCIp(G-g+Y0TvLQQRu0A2eX!}G*~x50nF|$dMAc!}SK-C*)-H=&_n4cD z@oI+@erwUCvQT4hkz+!~Eb!I8|NA*uc01i_ZlM9%2Flr5(Xl00b3LTYedRl5mI2d7 zP6gS)X=Sp?>&YDnkuOzc>nfcG;_bT!i<_;ujgX#~xmT}w2)0(g$NeG)>XCc&Z}}Mb z>|mS;PYi9qO;MbGe``~!H(3i3@`WcQN05%83JbU<;BPn zO0OU9`LzH(eRDKaN+H1$(LU`M9**@rTslnLv^(Am1;O?g>+q-W9?a?gbjkM|)8K)I eUC3pR<$YuALE%qdZd~9wc&x8DTyD1Tx${5I=BUyD literal 3926 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 SBk4i_0000~)oz*yL zv4VihPjwc|s1y`dUIuch*=^1z-GpC0b}P;MKeo95(u;Njgr7rxxPow6a(V3EK& zG2-UcQ;z>`t#pm8C zt<9rQ!0j&IT!0X;R`>Mr!#^r~9$?DhYe&;q7%@a}H zSE{i1;f~A&hkCDW@BA#r%C`#W*xWhg5t+-{79ZN06jOKV?ZVwI(yxvhJbbLEx16)g zW&49RsXngx*OPP;%I-5gPm6lvYjSw`(IYP}^BiE5SYE>5XL5LJRE*)&y!EZ0 zyXx1N83>9`6KYnzz_ejq5RahU&M9-Y3QSad$K$+<Yd9ur_@5zQ&LVm27A-UsIPOX=$`$ew#V#1AT4`;phT|7hjVU^*z z^NU{`?K)#~J1);fJ4XAMRl4p52IY4<9z?$GvoUxWrOPC)f4cIcsNvRg6LJ@-+_t{M zf8E@ODf_aR#=NSVYCkSi?2DhhoPSO3iN6J<5h`~bat^Ff6pWbuUN)CO>HIw&^X!v+ zQ%q(y-d=VqYDcW$_d~Wv*KC(LQT{dPgUqb8F&y7Ro13;(UuHVD$aaJHq1dY;cV+HX z9bEY1+kHOsb<6%SD;8Wk(f;M%Lt+t8#evoWEZZ+8*3J!Bvv|bLml?$>qP6 zm(F_k>DnAWLlyo_rHhL#4Q*bCIe)x%b6fedKPE;j`~r?YdwSNiK6vOQyw~`H@4ag+ z_l}m#4v&7HUH|ysrIN<$)7}1Wb@^DZLhR|krDy7Da$G-cm@j$iQ@8K(*A;DUA0J#w zexGCzc>l~dk;5Mz%wg_&=%Rcp@=R@9jYMjo^-0#eed6yc0?vOpwAzgOxvxThTfy=2 zwnt|lzHR*Tag)zQfp<3E+bd_xci8f7@&-5OUF&E3-t*llT`aK=B_d7RNuj}XHfB8@Dvz1%5 zyG;Ji9n=0UIs3c3|G3-ZoGtms+^RKiXWZ}U{Z^H;<+xilUgGy@Gb!~cD{o~i31IV; z?iD^IF?H=v?>oK=djfCP?e2BsOr3M;TDb52fMY9jYME}ZO7{ldG+{Ata8JD~dcb0; zZ#cu{u*W8IR{y{3wwT4>Ymx?|Pjv5N7K2>VK9K`ku3C6$Tn>F~vCt>7cX5kRs%f9_ zsVP7~kR~LR!XTAlAVCR`%Eu6uAi*GzAP30IWU!e+AVFS)9bmp6NKpt#{$0D(Pv&#Z VCq?&K)klCzKu=dcmvv4FO#pNaiB13j diff --git a/public/images/pokemon/exp/back/718-10.json b/public/images/pokemon/exp/back/718-10.json deleted file mode 100644 index 03fc4c60ed9..00000000000 --- a/public/images/pokemon/exp/back/718-10.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 197, - "h": 197 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 66, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 66, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 66, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - }, - "frame": { - "x": 132, - "y": 0, - "w": 65, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - }, - "frame": { - "x": 132, - "y": 0, - "w": 65, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 66, - "h": 65 - }, - "frame": { - "x": 66, - "y": 67, - "w": 66, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bd85fbac35b53b12b06187b29756853b:2478226f2126bdc982b17f3a3acb49c4:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/back/718-10.png b/public/images/pokemon/exp/back/718-10.png deleted file mode 100644 index 709dc3bea8ae8cb415a27e278e1320633723792d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2074 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 diff --git a/public/images/pokemon/exp/back/719.json b/public/images/pokemon/exp/back/719.json deleted file mode 100644 index 4cd0e34f113..00000000000 --- a/public/images/pokemon/exp/back/719.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 158, - "h": 158 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 39, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 41, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0db095e3b451ffc873bea6b5e23ba65d:f7ad8a345854a119edb545cc03dcde8e:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/back/719.png b/public/images/pokemon/exp/back/719.png deleted file mode 100644 index cb0c84041f905c181a42a219d6929d90985321dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2529 zcmV<72_E)|P)^(bAYBgaI>MazrVlPSD5mVvhwos`1tt$%-R3tW>-8Z-~a#s0d!JM zQvg8b*k%9#31Ue^K~#9!?V5{nqeu)z5rnqYf%*T>-B!OJ5(tN#c(>d&lh~CLNmmGH zoI6ebjfE(`J4F8uh#LxTj?oEk2f1Zzh2V~A^dNEvDkHKwjNLPWn>{YCpodCc1UHtz zjJWcISbj)4R3={nM;(dS-4D>M&D!0>pR}miYVshd*$_<~Qz8|hM_fs6nSI-ELu(Bs z$E}+z7pEeF5EQ0qYeHH{M-MXP1%woAW;dHJZ>Qq69S=w^B=&inl|H1TqXS1BHG;-C zf{yM+)%7t=OO`$lV_>lfiQ>GBAXA@1h(SwDN#)tGyqXL`VxNaGuzg5rURsdR5fPWj zeeqx2cVAss9@v_!g!E(3f*~Y3FD%&U@C>2}KQsP_IdZ732Y0d01llH|FfSa~>+p<0 z^aAKaNBV_*EHBj;K(9mYv#BFGke`tLv3q$bSkcuniT+~)D3Mj2a> z*TI0J4gl&c`0F z8L=iHprB&_Ssk8n1))V)SNhHgov`LyFsaM9?O4Y%!mx}SD&N)Vg_0Oia8O4}Dy%`%r0udsu94wUjvHmHRGokMd{*^^0wEmSX21MwR6y9$ zcUT#yTwk1({g`89bjA6^vA_x14Ni|OG^RGqz|=RS;_6wEIY9={iCA;#2zQSfJr)W~ zGf>MIxN25pPLL7WlF)_f6CQ;sEUVyVpbhs71)g$}jFzKlz|0R@*eZ!@t9{OZG({t0qZy& zMr!9lMMyi8_vkw_h>)<|KPc7U>sSV7sJM9~1C}WXgMHs?ZdrbUWpJHm2)DOK%)8Dk zmbL^uHqm3FJ7_1-v{(jL|MU>JhkNJ#gMj&)mw@?CynNonXlg8h@p);bHT!=Zsl*&t zo|u1*MX(_q$CanTruu>Y=UDxq8OizKNq7e=k_sKafkMARlX#;F{JCD0&g9R-m=RSfBwsC~ z7k^S7ZngOmB_C|9!ecus^ojv5)YqCX*}Sa^*6=Bk$DZi3>TK)1l>D-_iUaNnd4Aus zjZu=kmtuLgGn=ALuozKUp7lmLZ}uY}CmXAi;W_@0apddA7P6_aSTFHZM*i#JXscyN z`}*u9Ct~(X3Tayz!SBi1Y8g@xqN@+%-?M`CQcBy(Fh;V~@+2=rw<$!EeUe6W^L8>& zwqY}*AVhalBX2?WNg6q8ts{e03vT-h)deGB_DLRP9dz)vT1l|IUS2XHRt`-RvUWN^ zwAGHFsN=M{Y($JcNs7j09d!V2N994@9(=exqPu3ap%tH`Mc}fIIy^YqQ3X)22a6Nu zopi;Am~E2Aa9J504(#lxf?z)4NqKuX&$ACP+bM(NrOV3b7+kfI;4z}6JlaiUn^&<( z?gp5wjE=o?ql$uuh`REyHVzg$C8Zs*GCFMMMimA35tYreSbT`ZCh2~{WMy=i-l8oD z?jtH^uQm==Hc2sSr=!1&8AJ<&>4x z(V2b^z|KjotZynqTx^nTRz}Ctnrc133SLI1`{f;JvPl~6;vBMaIvO|Xk>EDstHpVj zq#2S<&CQ|cFs&O^7R-cvr8;sUMw8@8(jcTUqn?2;9^T$137Vu?Nc}i@tXK@GYFu$i zib+`^wcGOu6m^_6uQN%8rf^9IA-x&(2xLPl+gH04!5YJd8kMk~T9z{}RyUd?2{3`H&}57hQv$NphY! zzprffY|N;Q2S0*Ia$imXMY5(PaI+S;W9}-gH*2|P?(!(#t_5x^@88h!zj1|r)@Oaz rXMNUZeb#4v)@OazXMNUZ{c!yQIqv`B*#Y@b00000NkvXXu0mjf;H$n* diff --git a/public/images/pokemon/exp/back/shiny/248-mega.json b/public/images/pokemon/exp/back/shiny/248-mega.json index e6874d48784..67e88b6014f 100644 --- a/public/images/pokemon/exp/back/shiny/248-mega.json +++ b/public/images/pokemon/exp/back/shiny/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 292, - "h": 292 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 74, - "w": 80, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 0, - "w": 79, - "h": 73 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 73, - "w": 79, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 0, - "w": 73, - "h": 73 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 73, - "w": 73, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3dba844e4799c099eae9413ec740d703:7a7dc95ebe53fcea6738011b92bff44e:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 426, "y": 194, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 510, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 285, "w": 83, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 83, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 432, "y": 287, "w": 82, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 85, "y": 288, "w": 82, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 373, "w": 82, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 345, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 429, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 171, "y": 374, "w": 82, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 82, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 516, "y": 372, "w": 84, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 84, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 260, "y": 287, "w": 85, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 85, "h": 84 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 200, "w": 85, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 85, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 342, "y": 101, "w": 86, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 256, "y": 100, "w": 84, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 84, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 86, "y": 100, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 514, "y": 0, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 429, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 344, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 0, "w": 84, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 84, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 258, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 172, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 86, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 171, "y": 100, "w": 83, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 83, "h": 97 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 514, "y": 100, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 83, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 600, "h": 610 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/248-mega.png b/public/images/pokemon/exp/back/shiny/248-mega.png index 10b8bfb05f36e4a656b31d7a9dfed45cc17d53da..bb4a62d441f6c1c4a9667354926ae8248428ea52 100644 GIT binary patch literal 32793 zcmV)pK%2jbP)Px#Bv4FLMF0Q*7Z(?MYB6$ha*{0o(^3Gmq;rEol%#6C=GBzL!^8dk{Q&NBN&o-= z40KXXQvm<}|NsC0|NsC0{|UrUCIA2+07*naRCt{1U5$DpE3UMdT{3<0{_lI!NCF82 zh&G&=+ztEfoW!xqMNtwzP1CQ}atZ4n`E$5%1oQya6PRZ}524<;XXswvM%oipk5vDV zrbke}aN{A|BhsEA3voZy6PRZ}521cD-2ZJ*h^Lqy$%IGP9&4`e(q1Q;>y)uh8Q>e? z{(v3;J=bR)8D)LJ9>6_9_6FUaT~07Prs*jM97|b8K)*>M_%@)Y9B>=<5bhymzeRi9 zm`6Z=jCBI{4Co0He4px{asa@Y;Ts&u11Gp1QQ!tWff=vemml_`hTNgRbzNW3do)n6 zH{;Eqh`Iyxhyoh(3v@@fU4!l!3!Fivnb24HGHU|<>I!xs6YL8;kWjaPA}T=Ux&@U$ zBU61FmQ@WPsO|zSm^KmsNml5OKgXF-PDXaYfYj|Mf>EedF+VT-JS=i&;@-b2yn=nJJ+}gw2S&2vveg8yfJC#gJexQ>Uzb z%r59V>n{E3&q0SxNpvGRR{T7tG|Iq`a4Tmy=#D4lCa8n#BL(8ypkZCsGoW5nRehHO z#>iw>xQKLctv$k|a|f2-3Vya;&>%r)7I@88{VWCMR3|}@p%~P$PV6LFK!a!T*^e3) zP;rT}ha9+r{rV@9ef{(4Nv`SohY1`q>=*7XzxF^s9jJW;!ea$sFd-F86{v^k8mOzO zV6Z+bMI}_P0n#=`n{EmFw0=Rb-jXg_T7#yNQbUII(oGkFXP~mRoK*KK0RJjz2(tQ% zZRJ3Pb=2&D_5)==h}U1yxl6d__LTy=&bAK<1RApjZmtdm;<5rBS=T*q0(6EN9;Oy* zEE^c8u|#Uwg8Q(wJfH$~2dGqF*#z5V9amqAx~Kk611sZpmZ<^qf(xZ}7|w8qI`c6w2@zOyppcqS;Sa?ec;zTQlFzPkaa6?mwimhSqrlIsvpwT()H@w zsNo^11Wt{d7vt!fUZnZh{ln5yu7(X2EDswO*{ZcVAp_uLa)G+C?%Y=(CXTTDbSM@7l;bz8*L@4{|4wG)YbwCo8)){*Mfx%{#T(Ipo|(Hqjs5=A9sWD^k((a z>lsuN7vdUjFhVg8nt$-gixMgL`Vf8bpxBf2FeA#)$S@*EXvZ5`CYeLmr!^M{kCzCB`{rXG+DS=Z~K&AyW+#AVyvKqri zuD=g71@)_Hsvhd=E!3B`0Jc1P^Zx1MF;u`O=7X4iF^ znUF;N{e@a{&154o9i(ly0#u)mQlUVc`nI=8Hm z6{r4K#R&Vq=5qO%Ifw2Ro@1U4$w!a`IXQ9tV^xn@=bpq1gn?%#Z_ru zmhXTHT;QT$D^!#~Iy2sL7Bam4=WO+H%%hN$?{L;>-siLCNsKYgI9=@>LV z0zHJ9TZJPfJv%+r6rNyzC)iMfif;yHU_A9%S+BJ6K#tEp^qvQaNG|1h52hqR+!5wK`WwaJ3`q=`1vX{HQ;GKLo{GLb;A9|=~WLXf#7+ylbF&8ELT<#OHtm0g8tz%4@vBh+-|$ghA< zLSeSD#%0ik=nl{sDkKN2?aqC1z-C;65}Et%s{D}HtT}&jzm2G|q*=NnDjRG34PT-4 z%f&TaepuU{YNE#H3P?~@e?|5BTR^FgnV_yZl{+qA+&n%~%NWjN6=YtqP%E-f(xD4@ z%5_;-w*o7u8MMKys4ik|2i=aU8%pBxTw5=?d0<136TBKVcht*v4IzXX>h%b~SB)xR9b`Lh9ic`?$odqh zw12{NF6$$v1v936y$U)*O$jS5q6!O$rDwjUnwM4z*Ss7w#0_PAC*$6)fJDs-2(lB@ zvVz}5&8xxr4YQ*XZ3Sx7OQAXxXh5NsH5jt4GG)-R23?5yKwohQ)wLk_QWnVT+3-@= zh6olr+B|0%!>T{$S)PH4F+hul6SDg6jB0U3T^*O4Uf5bw1tKeuQO62cvf5Nr=jD@i z6*RiqY6UgY+Nr|<))oS~MZFYWAS_Gyi#J0PtU?9hRxjB(DslzB;^5(G8P7zG3#is# zYs`zMn@(BH2zeKD4K=>w0LxdZ3kVNk`>6L&@geGf>toa-3jBMZ0u#bE2fU5?HAiS* z3o0#RJ|KJVJ-1OKT#qFfqNay+Jwi27wou>^>JeE_wN*6`*n}Dz*t^i>O>Bmnk~v+) z@S+OXji_S$z7_Qi1-=jHA=Fpkb+XWf#U~Rio{#fCj+$ldx7J?*D%P~OqB5*r=r5@0 zN_Tilwz_(dVRxdI-~J}lBeI@tD;pKv9M+#>jaP~Cw$DAVfi_eRP!nv(w<>$!U8w1l zkOvA(P+<}Eh^%wa2TXma%c^1rTe4n|=*0r}VmZCvBSq|>O0wx5=4%DD#}#U>Yp8HQ zfjzg@nnAtGx@S~PuzKTT zVAD3R=|*PXlk03$lPvBe@NhkY+EJi`y5QC|S^pHMFqQ|^t7{4ulzOIX1Y`GiU zX#oROU4p}luo-qc>SnHig!Q6&WDTpb9sxas`T~KPH=>Cx6Hmz+sB(ZvXIwJu8(jYl z)b$`(mG!x*713o-7wT&D6Kov8#>cS3#$t_mvw}Oj&QQZ9R5_S^g6fu)9u>bEbYuN# zGtwfexV1zk!dREJwz5%su{ETR5c1rCAM7TD8P8&E^F2%+k4CV{B~@b)whss)?= z)I)V~T|s@dhv;umAfZ&h?*OeAjW>X{s%}EPKU;vcsA9HhwH0(6Kp!rAyQtPR^kb-< z7`U7YSf$4mmkWY?<$YQ4ZqhF3^$hf)`cDN|MUADo_y*$|6#9*2z?NC*#U~qIT~sl8 z6))Sn@GH;(YI_N_i<&;j611>m)TDrcnm-g_%7n3r z>6!Z19ezs|Oj4^Ux* zI<>2i_0phk#J~g4*&XKE0S?sIn-Ny;yNU(swtCuFI63Z^wRzqg|Mly=p>v)s!(Ooy z0t3I!?x{(qb95Expw6~^gN&?QvVshOU7(ZtKX(8L5M{|d`lH6WhXIHh8&qRon3!)| z-IJ0Lwuc&@`!y@D8}({sjc>_{pz&%O>rGJ00R^>szZdnsmnSqCAP*ED$coe929<{X z?fdmS_Os)xKB~>s=~o-IYpVs+P!4NrW$l3u-I~L7BWS1oaRcggRolAm!&V+O7OpV@ zfmynDR{2biHUb!K(Vw&Yq)~%#A8#+1p_We=_$jC4JLqtXy91R% ztH@g3{(2~DiPszG+60PEgqHO$2WmY=y;}>)#)ptam=E+vvc7O~OHNI@+qO|GTKKyx@iz00nS3VBA>wn}ILagt=Kg zC3A($bqDAZ1*SxSi00jU4z9BpxF_x`=qAvYP<5{ZSOxOx*Z-%WzCxZ#)9pRJdWowK z$aOC&#El9-?p_FVTV#Rgv-SvZqW&2eU~gj~@N1{63<_HtOQLQM0ucxMJg^;j{^`a~Cd)-=4H^UyV>njgOj!^v$^=D)4w!jgt=M*@`^$6$zs{2)a1$;Kv0nqQ^ zfP}g|vW~g+4Cwy)ze3zGAF4s`RpQ;Ccu{9N>MLC;+V86avcAp))`|L)1-64834w4R zwH|Wok;uZE@Arcqiq;1Q|II-UC6*JYPY$T_pspX(IRib>SZC^gB(>c2Kfv@z2oUUc z)DsyS6ZUrieWlX|x1*lGq=lSs0vk@~dY^4{rm;@Qx*zhVyzJ+Qybt=*T0iBd{K>L< z@U9>C0PrcY->DqaU^6gWXNbae0QeNylg+gq@RSCdfgzqDdIa|r*^|w+8~2z7yMYf8 zg?Iq>+lVTWHv=CL7J>I0>%?&AjIoZ1`fV)xZ8SJV^aSp=5mh4Z20k}<*=#KHR@)7@ z@c`~2u4jSwr>qlQ%zh1iQr7EiYi+jdw@KRx@0*OWzKy6Fc{kwq$OMOo!U^1yqJ9_4 zej5$a-EF(@${m)Tdz6;TR<7~@TsSr$*aI9SRoJ-drW@>issayhaCbdKZeG$@C1KMM z_#0r${lNEq_#4d%`382_+gi%8Tbw0yh3nCS#^=D-4si)DZ7re0bM}n0=;kPh{BVU0 zutYXauj(Cmqyv40i zK=+In;4_Zh6)(H)S4|Z6KPmTb3iq|G*l>;fl9@vWOrao2ypLOh>=mJm@?9*Vc zwg^aP<)&N3-i5^cj|b`9u=m+48(k`M9UIVNI?Z+{$F{+phkG)*Ad-P|d>9DR>?_bKq^-3c#dh3a!uoLYPlr zhB>_)8d9Fl;DdE>1=!`*n(TUO_1`2NyU<#rt&xIiqz4nle}Yc~7R`zbnAHjD9Cb2qIy&vHCNSI&h7w412HhTe*QNdUFV=W1YXzH zEh-4Mj?MBD;nIXdSWp^xRx)mP53JQ_ zFv|qv+>!wUT!pfaXNM>rs2D2L;DMbuAd7m*pmmTPG?pNHFJTr{eb0pNs-Ot_TPs6$ zsRo2m8n{--(zO~3*lw^na6h+5qPexgKcBvpydKe#qXcSvd0?R%Ri*MFEV`9A*}x*9 zh80m2fTe&J4`jyYkutwj0c$Z7&3*^RbBHN~T2h z!giwy460wCD?!i!hKyS>*2-P3o#v9QB^*0@M2#ft5%%jn|9m=`c7g2%n`=8E+AwwV z90K#Gl``TlU-kRp%9W4sfNDPqX!<5`7Yth{H_)QBgk!&eU5PtJb7_KwRT>N*Az}iX z)_Q=;i^`S*8pNgMA|JHFI6nF}UJN^ago@^BcHVrHW_*Wg2lzQ|fi^T~9qV)f=R3;+ zb;K@RGlh)XZLpjP9JtW8R%3w}Mh`pb5N)CH4eT4fG z`LGt@QEL^%X!PGT*TsWGrVUmyfo~2cRP8V=`T9W!G|pj3vtOOV?3akDuBh=z3=BlQ zHzFw91yDtK-df)Cbb7i9VR?@Hi0Yuh@_29!u-R|YSYU~(TBj2GyYNy54aV=`@WS~V zU?G}R7q`y1qaZ99cBQpe!;7n_g_T^Fh)xQ)`0uH&fqSOvz)Eth;<1!iZTO?gIkDGgjB!LB9jZsir# zxV(AJ69re8Jqk7S#uLw5YYth2tuz={xZM%C1=q(k6}G_ef&=lK5rx>mt~qOqTj$X# z$ZFi_wWmgfH(SdP7NBAKKv#ff=+^?T;QCaBXh4p6nnX3#P=CW1HW=YLr0T#-ysRjg ziR#-j!#(^6dC>(1WR1C~YX)g&6&iR6x1*}Ayt+=#OA@o@;>2FR%+NH)4gdvqjC%id zqNzdE;Vi4M2BI#sR;Rh%a)BwVV9Sp#bnEH_Uc|LkRkCJ8xo2Rq6X4ag7VFArc@bx> zfQ=|Kp{~4JRV%^12BI#smf2j7TPq_P?*e`}7zeCd*9zFaIIxb}H-NH0$QE$R+7hMY zSZoSRwD@(1*x~x>Q1z?oiGqf!+ga^$>pL!BR~EW~rvVRj)xd@9o4C2T+V;{G!05t@ z@or}oqIuszC<%+7#p*@Pt`=_-ZjBXHzpBG12+wib1^4$|kb4sx$M9a3v<&`GR}H)k zmsBllD}hUGf%L2eytIW6Bj;icI5p9jOM?3NNT`88k?#DVjSN}ZspHm6RnDacd)NwY zQ8gHETssmwzyn;@ zzA+bMs(Eq%|DSIHur`r&iNf!KdMRUFlLhVfse*m+aL`&`WMdNr7l9gUHiuiwscVq{ zBX)whip#){oTVUxsJv_`eD#;LiO7V#1N18gAnFw)Plg?i2_I37n(9+kTM77D#ArUd zyS2Q!W@AyZ9)tFP2e=9NfwMH^jmdw}#=2km{Pd=*udzjv^nbFxE{q_NEAaT$x=(7u(zIVA$Zj){SX)&InG1$hptxFY)l88pg}~=$F9swo z*ijI#23KY6skL^s*6YQmirtk-SK5cV=3d*Aw90X1!G-Hxd5iP}_93MDX}pUD;rOlh zX1?Ej)F9d_bRX6r+iB|7WLFUbqh5yKAcGH84QN==#m-dN*IK27v91^oCBH80^$9NA zbeHWAhhu;b5$HjR8!Y+CjIZ{Q?#Z~vEWdx>>WbB^#PmKLB#7Q+!j)HD`);kN`fh*8 zA0FefZPN?C;L~#xMA+3@QrR%jHNgjAEVr}50`43Xr{Y|D+XB*AzNcOC0!`8&#p=fg zFgs=%iUV>IaBR{Xx;5Vti6YI({u0ZhBizcbsfYCi*v{6%)+cXubd9X*bcj(QPjD0L zaw0^{1f=FlTS~pV=s2nb(XUu#)Y7qK5vcrf>{oBy8YN%4!z!c>+r#zq>pR0hRmK%f z7H6XYL3Z9+(bHPusz>bUDyWhPrX4|8zy;xCsuf0T=;>xPMgk;e^M zww2GVmsrPkfc6YfsoJcM&vW+v)(Uw!NCEbBWvcj*)De7*FzS?*Vf7?+hMWDG-fhWh z)m}oD96(<_kyQ|t%Z_O_57-6VLqZakYSg|^bvd8|`^Bm zcH|i9HPBT^kbbjA7@|jqGMSp=LYW+WWkOrl+N&K%`ghV=a_Es49AC6dly}UrpY!y^ zZCBO)BdYTl=tV)Rs?^C51*#)|-dewUkaF>Tq^p(yY7~<=j~&OjlnPTGY^U%!u3E2V zNFH3Iyp5nsx9cgMxfIa6(mF&Hf6g9gRE;H0aQ`1nGfNc(0m(zR>uQU(~z5Vtps(+F~Sw8n=LcERkyZOLqR3p{u3eUFKAU2xL-eR zfSt4!w8J5zbaaieOz|Hvo#Dzrf7w&`F=WCl-2|OWyiBtOWz4+L{YZcowJbT}aAlXO zrKjAB+iR_tJuhwmySkQz=_gcIaXpR*vBk`q;^=eTS80_>feHh_)3&Opf{1{}R6Dpe z+kd0Ax)yWNT za66bdWR1M)yo_0c@@V@xs6{o0{~M?+F64`Y@DA?&);gr?5!@bT$S>d58di-J>h3kh zw?Qqc8&C~g*n)eYwa(~z2Dhy~WAdwx!&VwlwfJO##%uN1tuED4`zKV-;ht!%Bf6f! z4fO!CfqcRhN^o{S@r3Jz9gZ%l%csPx;I0B6XsxVk=pa7P^$@OI{WrOSSXwYZ@jCai z0Dnl<0MBsu(+z-+{oJhU8C-Qq!Gc80rK1vY*Fkn{FhCP(;GH5qbfgNMH293_Iot!S zMURu+tt*`|2yrW}7S+ZKHzu=KCz^LROVD)hCT+_0JyeLOj;kNW)i>GuaKl=29cZmk ztys)-bv~@=3~m7115se6e0I?>G9JvDC@r^x1O>b=_QG8}z6%6)^%d%fYI@vSdzZWq z_ga$RNNW+K*mg74b+|EEl*BVXqI45(`uNNPxZ6L3m+u)^g{a!0Q-;WrDBc9;5g^@6 zG?SI7ru``zmA5Nh(ZHR_DsjCJL)+b2Lf6ZJtaXjfZB|Q)oX0E=| z11(eBcu*+g<%|`giK->*5>@2ToI-2Ks&PXXH*a$e^*3#AEodOubnQ@mQ9^!_b^ zz_C(u4MD&@z%`5M0R{OWw-{|zjpVq7VAa2u11wpWspc_GYPb8l%H7xxae-^2Pqlof zwNQde0Qj$cjQ{{307*naR0C4ayp*oyA@b006?YcBfotkKF_x;m3ED)K;%aHCh&K5u z|8>?!TMHf(T@8|oyAo_#t~$yK_{@7YveoNItr}e z8Xg#@0a<%XRGKI018BWOsoe&(XKU3GWYh(!jE%Ld1@+Y>UHtq(XRzV24;tLn$C>Dqp+M6h7{0+4UME))`FWyN5+C1{pY%_nrsJlMT91`NJLxL)Di|FEsGgctNJhER&VMw zm%>b8g`Fr2hZhtowgO)t{inTzFegg4ANHE6s(wYaM-r$xEk_Y*Si!~T6mk~}y~cXj zT9{gF(3{SZuK4sfMb#9bJ;XZ0-XHAW_(sw|9eA-$nwX~3N8M39?W^03}y65&9-K!0Hkg0XG zRHZ+50Z9dU^lO1!C8`3elUiu-+o3wzo=)8-4RI{gRovTh&>NWYt4ku#wVXj}S%%D9 zW8rEMH9!??Ovhw)w8fE|nOiJbS?%#?@X`-*$W$K?o#ueDf${-W$lEp>RZB9a?FD$vR#&OfxM*?;i$2OB4B9co}#LL7u00{;5iRd9e722X7C<4 za;ZH~HgohJ8*TL4xE6*F2a8b0)l;JUtr%E!Q@zS2>J_SrHTkOZ@kh9jQ&w^8pnk8J z2wDtE%O(XVUfZU6Mm2w!7QF0Bsc(#3 zyN-QaRBG7;n#xwHISEJ)%#i2(b{PxsdioBs2+j5Py?aWPrtpjL?;E?8E_SO0Sc1L2 zdhMqAzypqc8{d%t_v*UXR8y*SlTLqH@er5L@fz@7ZUF|}O!b%twszZGHY4I_0?xQ9?LP|PKwBNi0H>(FPI%yzV{0GYvAEh_aM|U6 zt&#>?aqlhuhirAM-`-02U|el4&Oz96Aq}=-9-@k6vj-BS^Hx?r++Sj=<&$f+mA^*= zXW8rl#@riQC*x|Vz{*2P_kQzVqk*rS$gd%Muh?2B)<&YYG5=T=d{{gOIGxC^_cQqr{DXRxatIpBgQ&_d8YOZJtzFPc;HAm(ZxXA?}9_d zI+q4di13}ti7qB>R^E5e_Jy&bK_|LggvVbNf}FuDcHO(nFk!cuz@4#y1GbhG^6`A6>DL?j z=ND|0|aTlkCX^jbcF@Jy&w=@ zQ;%DAA6K_l=9yrgvGEZl>aVdWAx~Zc(1iHepoN^8Uwxhh_tc(0(JZ(RqDv8W4l}#f z%2OC9GnfZm_wLfo1TT`7wH-b62%1N2Lw%S$=pXR}^Dd%sChmbO*zK;qdUxdMseKWl z8V9xK=?7ZYe?+)DgL(1cw_*k}>$*3Wwz=wroihPT8(oP2jP-HlEj7D}?5sZEbs`I% zs=WXkhnE=8KSo~8fd+|eVD{W@!By5=oToV_2!JQvDhZW9? z0}f|dSx{$y)huWt)|IbnAD6OmIsa~%dhmleOWMLc4k)3Yd_K;6%4LR zR3c6y!JNT(y6!)9Vw-L+zTWg!B2c(>&EdB)7Al)?z0NW~A7(+}ESUy3)PAgi3@#B} z6TbFDbH~8tOwoft{_mZ!n?yj;K2BLT!pFx4ih2c>l=I8%g4X^lDB?<9zhORTQ+vxyGth%REZ#_r&3eZT(B+f{ivN=(+^%2DhZ3Wl#d~MJo{O2e(`m=_Df@7 zV+o@Qt`)wW8O-aQ8O*`rN(AxpW^4hRS8agDY_|n&P#RoDX{>pp9ms;qwfCe!3!W28 z8(bCN$x<;}>qOVRyEunKD?JP&=R^7fK6mqjjMc1eriaP8)}CsfZ)U-z+WQ8Bh6L#& zc-!lj5-PYf-*zTplD+D#+Zeb!=(=|oL)%UwaQ84(p;bFfShcazsFZ9l^TGBk_@wra zb~n-Pn_+NW^D72c7{u-jX3ssl&x`Re`+g#D^)R{we1KhqkGr{k-|_}63MGZ{wp-%5 zHw#*gwYT;p0bOymgG=xo2iMvR=H8gKc;dv~0;LBvtF zl>P!SG`_6MrsuL?Q9C%&plkBh(_j=_w4-tsU0AZE_=A%fOl0ByJ!iQyHZWJ2ur0u- zW&v5YJ1Kpj1@2#(1q^xiN^7ihS@7aDp?pTiG!4$jL6!t0f)1`A217)c@Mrhh3;T=) zE?-?>_SGD9TUpN7^BzV{Zp(BF2c3Y3x4`_p1bsV8s8R1t>!g4;v*3%~zL*A=`d5)y z;MEH*c9y!348sk2**t@;o36#*`C258e`DWYx7!+I?6q-rirQ2ax}X(nIQ;iY=g)op z<@57b{8jII6j@N&>fJ23TzkqY-r5TdfHg3Jt1P_og=CDbkp<{|{VNuEq4^% z>kQz}f(8u#BwRH~gTPtk!HC5SF7^QAYejc>{Q^^j)fr5rGXf|PQq(Sye!F1Uq<*WH zu_>;uaSvmZpna7Vim8*~e-zNdJyuOad9z?$dHn3G_VGdOvkGQ#0ecqYfnKk*N8O)sp#U%BwIK%-*5wTv!c~Qpd%wYcLHE2~Pi2!&zRvHP6dlIqTTCY#MRJn9A~9N@ud*dVl5p ziX*|r928*gx^X!I7B{?}Dn}AQj!rfDR7$6(AT93j+TT!z(%@YV1Q&7cblu#+JZ8ML z97zNLQswLCFl0^B6gjLJ>qtW#N`s1Twc4+)zbpn9a&CuiA{H>kJ|eugoJa(8k^l&- z+E?hTz*k5-n>!9GkYIaYSvZ>HGI<-~BP9;yVxSZPNsZWsERFVFGMG}O8N z$_}oK+ys~NSl)K7sZ#9qMvC2B-b@76%gI&w$!S^EJT?flGIL*gqZ>Hq6U`%8a7!8t z`JO+;cOkgK%X`eRG1rv7qHAt{gR$OA1c7!o=~scXa<-N>R+PrVEAS3u9ms+^(jZ;R z8)zU2=hJ4Y;7ZRb(XhcfaI_s1R*d6cVyw3kLB8f+Z6<-pPdrvvPAg-j9eK34rMu*LLr|UfdsCRV3U978 z0t-~-7ZU+A)=JBC*QHg}#)`BNg%>BKuOi`9cg8{S)p|n(-cQ-BebrxeY9H)0*lLir z6jl<@RcG1!z2M61+B= z7GTA+*HFS@qlStW=5p=pfsn1it5w0^I|wd?TFC&agR%SWbgYAIf)mAxs|^{usA`uu zG8QiHO_^?JsAIL48gwKWYj7nEOyJg8_Yg~tG=un;jg?L%z4F;K9mYFL5myj>D-jSb zzH^{yh|v-iwYHeD@$4kHo&`ni9sSi(?Y$aw_(nUp1ghx3LrJj`q3XNwR<(sijQ0zu z_S%%O>0-Mns?f9@8la{Fq8qc|y!P>7?F%*-A#hd6r7d-E>6D5e&8b_YSb=Ky-Nquu zvGPWH^%4QXrpFR@6fJN7Vn>RhX~T497CcaUmHSKyt}3=1!6hFApL^JHGerd)@;_PO zGAQiJySY#?nD8_tO z=y2&<6F3W!rom)bXu7f>J^gfh?aTM($#y@uLN~Z>Qtc*sVsZtD_JrVajR{Y8glRO# z&DBg@n)ZtB;ZUiSHI0t;0Lt~(SDgX32$Vd~%dyZ53dgaqvycJ$%XEvw zA&Jb-B;6Av<1A=xs+(s3?yu~P$dPYGSV@ERH-rrJa@;CA55ICVbEn0MuksQ`9utn% zT(%cXts=S1T;<5v^fva@MyAA5Wx+Qx0EoEQ0}2W)(GMdimep^}fHk@H*N4x$U_Wusxdb zj*^YbMzr&S222KQNnihT{_-#10v1#Z>;S|ayZdc*A`5P>J)+(c>|KlmRFx(!)^~Eg z>Le`JJa${*+_KXJILF!@9K>{MW4#X4J{50&xroV!`a$z2QcqV3n%J-suw)eSZ6f&HmCIuv(ph4d}|81i6U}Jro==!U(3vR5xq0-)}?`5oAY=uFOSs-2~Q2$E%^$b&Se<$6Wy#@172b(v2!L?U{oVH=x$}6M3wsr<|Q{8K47lTai9}=Xi{=*D} zt)Ff`N=LKMIaa%vh8Jn-N1VO$P|wYGc}9fYh`PHoz{6|HJ?VQu(XGtXReu%(Cwai(S<^(;3@rfhc92Bae^MO~FN38P zAqr5Z0MMMwF8^2%@ko~NPx#MVfN@hb)nBj{^iwS5SM0b$2z+Ml9CP^X3>)(^5WGoi zgey7&{*SLSm~njs>SLPkm$?O)Vy1a{AGe(FK>z*xFNEo+*xSK|#imN1?y}YSm1TA5 zI(ieRtbGxxi|YWl>I^P#X8@xhgv>Q&P>%vILTxa;BkeRXH{J*#TQrTa$XUTt|8e!} z4t8baHd;pD(=4g(iL7U8I4~=JXGV=~R9Z{xwpS+0=X1G~osd-uFjo)g;9aJw3(jiZ z8M)xmt+AB(#AsN3(ZOD8O~q`x-C@vADER8RT`8-ls|v1F)LDBqXIy;s1`ga#9^k=i z&|ITy?2=;LdRI_POZ^>~8MbY$e4cGg&wWBr-}xQAG>D_m$4m#%L3<##l?Rw~HQpz& za%_G6*X4jduI5^fA8^H2mn=lt#R#`LPXxlcZ{R{qyNNO$U{- zUVn#ahHjrSCM*z2eqCuSyR{exRzU~2Q6Q<#z_a#Z*PlmN7Fh=>*!`AJRf763%jb=U z0a3;zK0|bTIF`T=jU!fmxcnk(O4Q*jVA$r+a0f(^R5^)wTC8l-e0K58X<~ z?QSa>Tg_ima0yU+Ou`b^7Wa8)AVC|d6(~NeXa%%ME=FYC$i zaUGpOe^ODqpaJc=)i`#!*KO4T3?cxUB^KkbQwp1ocy zmae-D5nD+o?O&Q|mI!OM)fuO4ew}yR__&&`TUlBJ<=D!7_mFBeu5@$;bFK?LjFfhW zT92pt0>lt}m?m!3TxxC^$ywtEE%+s+eCT6(mpDvXvC6OWwxaq^vUZ^LxExzyJ|*(> z26bl;#+`xPSZ{+isL+6#n4UwH+lduH^Xc*-8!OI?WyL_BY0M+HDbvDsfDM_hSJr80 z$)wG(btl*9(-vx~16)^Uuu66Xv~Jz|>K)`R$r zW~SFEFk4VpK~S_%ol&qI*9ML6gVxjb_XQB^0ja_8!cbagqVaW5kK6HF)HaE}-&C2c zZ7qF8Hv{`HjfES8$-$KsaPP&kaihkK5_hgbr;CYikHyoq*t{9-t;Olvt0|QNZMf$HRF~jz>u{%gXqRBWYw$h zk!2D?0aj&gM!;0=mp?wzhAEo1UA))J9|BTSW{OlFHC4s7L_wQhIlX$e4#!EZ9wReZ(%eT117mQAMarkdy1 zM;7p*hQNyfEs)3R)|W>q$=s_b5?_UpIUz>tPfsk z5(&$7AE2+PGE-OW`^YlCRu*_~I3Q6k@u*nuJ*z8Z)87`h&UHbr3e>Zfvx@27h$BnH zG0^V>%1ceyP?3L``oPmvLDk;9xut=|{Aydkxff}cwRO@?vE|AxE$*Z&FL6AXAI?hWK31{Gdgd zwcDiah%GIH1^cKokS1tBHQC??Eh|?_)rP2lIHU_*8c+GEF%~4qMAdVvn%z{50Uk2N zy&P$SXu$MZBv4J|+&{&S$OtiV)|RL`Vd3JNFKOjRZ%EidXYdTP*TawmZdCrM!3+(i z12Pw!OMIbz+*$DVox8+}b}|<8b_@y2(@ZD^%%;kkt~ra>u5ZRUzoPSXQ~75Gulz92 zdu2qSauLRIX`mVJ=?s=Z*Ce1SLP=5WL@@uGZ{rMG%<`oc`wL?ue2iJ-S90fZ%gH_N;7fbbj z0R;d6AOJ~3K~(Ga0y2y-C*8Ih=Zep=v3LtgX|o%y&SFpN&F?ES07UbqGha)n76rI z88%?j8jIR?uP&yeu- zyz7XC22;u^RhSim}pve$~#ZR&WLG8=XO)tOkt+XwL*?^;nG~rL0|| z-uAk0?Mwnec9HTvCBt-NEdD8JYDoHW*8Vb?`WMIm<;L_1kql6J3*`W$@v8=sm_=5d zwdYe~s?k)J^57y*mUn+nipjmP%Z?u`musH=5Q9x&>AwZO+I0z!=7R;|H4kmOvuxc!Tu@&=(4-@nZ@7L$BGe|72NoUYQ9fBrpS4=R) zBw0oCO)+2h(7PHNGkjV#2$EcKjN`nC5!3jv_N7R=+5y~DiK;KPn5Zggv;Ci)^j>ua zMPvL=-5L0Tz|q5CZgsk~TmQ01&hd&w+aYFKLh3uTuf%VFE1iPC;;B2++IwS_`AS@% zEGRr$_BMD^OG2$+BV|AeE_kwOq+u&?W2iaQ>Z#3z=Rd`PwTQ{2LyQ?V+^bA-K&G^sR*%j z2J}z4zxr0gm0i0%Ox~NEg9(0p8Np-L0a5I=07SUH9H8N1hP%SDe)2ogvPkN<&M#@<|*u3!jENge! zhBshGJq&MoTXpM@C_Jq{@TSyiqlg@0q^$i8Q(gP#DWH>HOMacFR}`u;RxfL_!q2ky ziO#?S+Bbnc!W_uzA=&{2JhZh3i5Jbf##&~Y4e)4|)lIMY>#i`H24b?1tV038* zwtF({VEYcN1GIOLPoRB@#>vCaiQ?vi1`|&}0)eF=11(;Fc}QNshqhQp4nM9v(={h= zc6wF$wUb`OE3LDrXRe+a@m|&zD)h7F_zLy8tbA}`gNYMfaZw~_ z$UqCkfj1FXRgJ`SYwdec;7G4P=`|m9!Gr`Djc=sYs%cQgw!n7jS{`7wp@TbwC1IOw zbqLxgJLzG-7zsEqD_QmFsL%?UM5bwvx-t}mrhMrE)vFeuO;Bc95p~yo7zJ&5)nR~B zPKts|Rz9qR-z@0r;4)AFk2Epa<}02xTismQU%k$tvZk%9w}WU4 z`FPn^>Ox*wgp$U>{e~9kHDuatsea$WlMy}0=Jcw9piZw4(>)p~3JO_#Kw}Uxl#KZG z!8W#v5m?v|Z3kqw(PkS*Y^gH{xI$y0)+ZS|B#2iz-`76QSqkgMM55M1KeD6+G;fJg zyF@Bu1#ypAyR#!&Ou=d?%~TBBi~&^(YoynXv8*V#7rAJUcM53gY?D&ewtAwgvv%&7 z%%`as;nnR7EVj7!sg7Br(~kW3cP)X{!{BLRJrk&*fsJVsHIhpPjU;Hl!u?$YUtV5%@aEeF)p4x}bu9DcprQB8s4` zr3S{LLfhvuq+}X1C=G2IP^+cd+S{rUu1yx*>3QwIrtf-S4U-3*G*gOpHz1q8H5Trq zkd1WTTo;^7{Vk;zoOqNy#C3#0X{LmEiQ8Zux<;+5p!=Q&m~7Po2}kIqht2=z?7|{Gf2w?aN$)Amjs^B;*r38uwr*CFvN^4CSVg@Da-WaOrM1O zgV^Y0w-oR-`TxX7y;kRAA zQMN&sUkL-;yQDawjcdKa7$)7ie+6lRFXIlRXi=G(0-pibrmy0296DFJ#R~2#G6xl39DLEH$`aeI;5K~ zGnQ)@R%;cuoHB{530txYqmTrZ21)`_V950zWa5He{-jG*7Nj*65a>Wqz?Dl)gvwXw z7@LO+(YDzwrm?BLc_msz!2nmM*K*~%69zAC$ce9n9@zkydyj4Ud$E$ixnc`>FNF=8 zv&(`6%y-0;}8PeAF4(w-aX64kpCq9_BS143rcF7UW%ew|ym!A!Zp25w)N~^v+xP zK{*|!quSrARHFkBObI9q`eb_wl;m1XY+ju7GcOx?v@RmC+cKG!rzO)K&utmrsLCPr< zS&w>{GRTxUd;E+~kD9B#a+DAnrhN19)7n2J`^-=J`=Yq&-w?jXXkE4<3|^jluurtt z*sXXOm*>q+NKe5hj_mXmj#_AK$onB@X2}U)rv#%y!Td18o{HJE_8KS(AH6Z*!mZ3^?E16K8de6nVenrAaY;2)m6OTzrG^zPDx!o&RzGmKJGaQ z+^ziSGR?3d$LzK+kbTxh2@a_F=J;a-x)<}sSCWoEKPqGGau>6cF9z-3Bfu-#KXAMW&R#jW=pnfqkj4~oa#tOnM+0BXVx)A6ko0(c(xZq!6|U%*BQyNhh* zx>MIj0*oDisg>_U1-y68i9333`YYcxN}wLdSqQvz2>4LVZJiyiON}+v37(Lh{#B#y z16>zj>MXifH|>x0y8xi|xJbht!1Iv_yTFD;|aNDqWt z)5!rT6S_Pw(KUlIQ^$OBEWa68&YazUr=h?C*&$a(4Q^fW#H=A`5rB@qnKK_a`_cqnfKnFlfc8_124w+U@tS~%ZS!t%H}{p%Kf{0CaaPIKQQR*6j}NpT19^BM zgTP6(i>j!WAc${9tm+A#khR`d2Cfp+r|VFF=G+v2YMC_HeS(ZIR{XF1u&y3#jhoFB zLV^9fLERo`nTpeRB-e!M;5lk7YN`TyH`ZGbTTma7?b_8K`{@Jir51JSWl1gn{f{%W zgaumYG;kBJ{eG*x*Ei3nL;Y$R2n$u6onhy>O#<|uxM)<*!po?&(u}A!z*`Xu8McwY zL3S8iH|ir@7X%3Y&QMyQ7NIg0KFrL%fxnqCm62JMwD2}uY1inz)0deVt;GXZM(tB= zN(MDi6;*Frjc~;%d!1}g0q$RFUHzeD31DG%Bf!W^;#2J(3T$}&1Ks-Lxk?>W^?Idh zdSct^sVB|ot+FdpT?MTzQ&UAlxY}xj+mH<>$fk$8I#KQ3#ptszwRAw5nT@c3@<67F zxc6TM&xCK*Ylm*IhJGpyd0m83W|Cqd2vnHZYvkySqbqH!4($dR=;Z;%XpSy+!hW6^O zLgUpMpdSQ}aYtm^YXb^YzFvX8y1EXAEj^+_fo}aLxg~q+o*2hKCoB`$`L+cK3;;DK zqAIfCvyVD%D{ci^>=K(kSNY0_!MSS2lu8)!I4cFiNgLI2v!DQcc>+ zvA}<3&@dAlOfQ%e@WXMuW+Nw}%9 zLvogPokdSv3u*<5{oE83BU^d37Xu4ap{c$J8cJZ@kvmu55v~JtoCP53TNJRLUtSaK z`?X|&j5#{pSphd|7y0P)Ae=xRyyhOru$eNZR6;e}YCi$hl3*nUJXC?IuRwb--~~N| z%UR$6Xg6ZpEZ|Em&DuraezjO2@C1&@`cc!zd4CYT$_MsiC$r*KjvdolV4-@bQuWQb zK@$TBbY&6O9&ta#<+d7<1?{YdM2#e{7+Pf*TrP{^t}gNuKdrWyz=K+M)fttJl?Etw zU2|)ZK*j(tY*?hqL@5&l5m^Ovz5WU}?842Up`?MA0##4KTLK-XmIne@7Dz5&J6-%x zXi(q(3^kkdfdy0t%Rvxuidh8#Q(bASm|fqAtfl(bi$a@lg|mtR;XMUJzqd2BG&6Tm zK0adJHOQ*Jk+KZXO!hhE&Fifon8m>LP}d{4Jqd&Y0@SB~Beg7Jc5&|)KYsuI;5FR) zs%zv3c?w%VuWP4U6K)j7%COIkWr1$c^*itSYr>68?^xq{HVY!5&Ia|16tC+@@SyJG*XLyV@LbMx|`m| z#|Oe*rS=Hybyg`YsB-IlpuZ2YBSAk178XaGpx%_di0jp0F%3KptsMfq=;@Kg1or{^ zH|hsnc;g!$lCQioZZ3h=?j-2#R&4<1EWXtM{hB4nu)%FCL)ZBq+PJQ1!15u>?60qF+CRU)N!w&aPw7 z)dz-oalK@-021`~JD@O1Eg}o>cyRgF{nVS@cKu)vsA)4YwRXi;FnO)1_`d>`u}Y&Y zA4Tz`1{4GRTC%I+x~>5Q7J^0v8W{A+kq9H)xQ1IERbeU+9x6~Up~Za0luO{tLYP}@ zVkEf4*^?70+G$Th#K0!x@xmNIDIY{0bAobheQ=> ztRuEoc9E^Y)WDp>aCznDu;04^KJE_o_q`ECEbAvR2)M&G5A-jpQ)Z+~hf5w?X#|p#;pbciH&zgbY;Tf1>_|s(9j}M4Zl1)DbmcW9RmQf`{ z2^!=d=57^yD*+<;^>^}X9RsuE$`WvBxdMwo$3)j~T|I$7EkAEnpoprnK#MuM3YUj@ ztqV90YGYyEWwz$6!+NZ0fPQ?mm}sn-2C|1O;|PTPNPewjU~1QJmB13&bre{G%1fpX zaYtldISVW*Fz5_rW{F-*YN)=dP22Ow*;qXN$cU6|n9E4q+F2UZNP}?*TJ^BGs2Gs2 z6a&{Fy3o=_(V*%Nu}qMx<^dAn4<`&XTqhL z?17I+8wkrBzcko%3@c#Mmk7`(RtwUFzWbnoFaqthRTTqiSq}u&ILI$SYt{vY3UroR zLyShkwsDETv?o|d0~vHmwhKAOoOOoT16hcB9(%*y9W3D8eu3wj5lt6E9A_5+3%u?J zxZp;hF-1OODhrsPftOf%c`)~{AcA0$Tmhd1-=H>uRX}Op5r&lqe$KofcTP6sNBh?Kued{~vOtX~yDTGI^PWlLE11*mCeaB3 zE|qb_;1ptbi(Q3TK;?QHF68EIu<1Xe`yn}nhtFR+2AUuMjsf?8AT*$%23=_X0_?yo zi!h#^piuy91(w*d0OQm$3)il*RDa9H%7fRGvQi{`e*TKT26yjvK`pa#FOI06!<3Z@ zezA%H3%8S8gORZ(pf%>ae_h30>x**iHG|ABH_-8~%jSOD+L&5+b@5h`WXJjSOf zl}mt%>!n4F={XuNH0#||x~)3SsspP6&2B~J3&tAbVtc)qt+OYXDG+n_(wMcosj7#W z=fxaap$%6m(59@AW_`+6(h_u@jl`HsYhcpvWLD0Ci=~YL=~r5yNEGkf`s=f5Dm!EM zL20oYbo)CK%Mka@r~p^qTj1^q#tKBCKyB90P1s)vs%ov`D#X11cMlsY0mM_t)4P?l z6>0?WYdYWi0{;1SlCc+}s~Av0U?tbK(}t@0oBil=wsM})LNkA`vy89trz-RPD|?A71KET98Sy6$SUl@SBLum{|Xf!~*_7t>M089lGYODim4O3=>dkZu6ht#eDn{o7B zi72dbh5nHc6a($LtL3XGrWpYSDJw?nB5E%Nq+iXp62q$2SiQgsY=sKc_yTL_<{>)> zu7{u#w{pf-L!o6%^>cdWVBnFTY%~zpTP3P^B@8@Z)}L2&gYs$%+Fibz`L%}4el^=_ zl(9X5H8en`Tc2QQ2UnOp^n|QY#vTUN!~lYBOLiDsVWjH-R4uDU z6mrRMV3P;J#Yg^JP}RQ-+d}@TC?Sin6evEc?MnMO&F-s_)%0tX z2eGZ1md_bGy)(yE>Zi=W>VsO%)g%HJ+1u=Vhz#Fc)qq~o1W|V{Ub1QOhF=6M0HKDw z{Mlk@=Y`T(>3ISZu5sxX5E8W0q(Omcgy`?ZaMsAGW9fZyGVEDxx< zEFzvIS+j*sdx0`mj;*pG4N%!KAS|2yUm^;eWSJk11qg{!c8;v)0x0zetNO4)q_xC9W|V)~7ywS=%`a3DP(>;Fpi#|ozj!O*S3UPzmF zWkSljqN%c7y?(7?AT%+ca>_ho`vR*Zg2)U>*(ul}JI zSnO7w6+};PmEnBB+k^tf`u54Xv(3)-@yZL5C3b+Ux>f{Ra)e{p;6wuj~rf-9? zCICH(Hp(^@ZChd1RP)RsrHG?bGF+jtwPX4ROdKCcN3QkX>-hg?JTkemQZ55+pXo}UxcsESIGlE8m8q_wH zwKR(HI#ZS2W^-*XLbMq>wva1p-k}xq zJu!G=o&DiFxHR5i)jub#VG#pX{+dwY*JvtA+PrMnQ6Tph<`)XsAX4@;vc~Oi?#j&? z7{PVjfD^N|{Qo&0|)(2Y5R@fd_)Br$(cFFpIqhW#$+nEAf_$==M zz$};2`o~Js}7pLV&+vh)G|b z2d8FUks1s=01YrBcem2QSXT{-zw{MI#gns@EI?OurvkL()wzb;j-YmOW!g5Zytddh zmWe3?yLdb7)LmquvhkiLSjE;0AM6n}?g@zye$X z>4AzCi&le8f-8U_!PEs^P_B@~Ow%{qMjo;{Mu#=Q4Bop)L_N5Y%`Nz)`d5RC7Y&H4 zw9aePupsME`&bjQb;TD#{n;VaQ2|l^0jQxXT|SP~uNj?eimumEaM2}c?klqksC8Kp z+*sFDKz9Wx_2zt5UVW7#QmEheW4a3WzV?3UpDX)BMV=NkBF(#8r5lW z)Zfw-_?n(>u|l@@eWTz4rK|c2VTNEZoplAHFn&G6bd(3UDH!9B?UO71wUs%RBC;Y!JhpK-9_6*fy?GN4)%$7jEO>>=MdO+19 zEp-U>27d4aktycl11bEtySc(4T_NsQ0OFAxaG?DY?)Q=4gb3%D?#Df4tWyen8wpP2 zfxG&fAqn@JsCuORj{zTQt^-_8>3Yam2e_Ux)*%TFW$kZdto=im6PTw^4*?${d&XF& zsD6`h-O4nmyHPi>)i+OXlR(0565(m}CvSvGfd|Zt?>wPuIMi0jrTKpOT@pY%;8xXK zyI`R_OLZw@&DOji@5@N4Zc(6cg?*}u0Nuwl!|~?7eG;&)E0}|0nFMV9aU<3A!&3F- zxdR>8?W(@=HlnmuX`{2YgQkM}p5VT}!3jKd0G;vhN~abswbmTAG?xd~#}ui0tB;>^ zIBQMSS@$Y1)5-b13kCCM8w;kFe~ozTfn-(OHX9=z?CHDdWB9z-`yblaf)5XH??hN= zEoXDhnL=T@M72NR$9-h1s$T&oSKQ)wIj?ApB`s}5pnd^{>m3;Od?+>GZaxp&5nUj+ zBIu2|qqRg3ENL)d8uHN`RDD0yZVzXu>cgFLU2m!}XjE;rq`=Sv)N4n&?IZY|HE=-c zv?1Rmz7M<@>Q$s7{NAF)HVWxD39+6bk~Qm|nmUT0jn z{1g7;4lTo3x~;MS{&7;x!0o%CaD*!?vhC0nnBpXx1+p)rvBX&5iC;VQS5!TX)wy@L zdS;KfJ2tpr7rB;n`1#-a6gUs4?N?9+h#A#M^;JC3&;_2j6l2|NeU~<}tR~wKB<4-l zM)9?lR5ru9{R;d+^W}=_;E?NP!oa{+^J?(JnxuM>B|%ev<6Oz04^*#arZwtH|6*AS zAa}45*K97sm)u@jR&*;wp90WC(n@Q2SBNr=`ek?Z>HV6lNKX2FORyH#rmeE90yL@Q zTP4gaECryVy0rAjjaAbPl>+H)=53(H$j5XRf`SI^lZCp$d#wd@#LCpK?Jd-qX%hqu zW^zRL)U9eJCVMDV1q;?zpnHZu+g3rh6+RuwXrYW$V_$KPa+2wt#m; zcR<_My=0p_Fl?>p@#}T!VXk5R>pg6RfE1>|MVUO-cFc% zqBaJ2{WExYFN~C}yYEOVA~UkaQkw#me`pjKUM{O~qYZ1Cpc4fBKC7<3#2i;Y1E~i9 zDr@np!GP^~0GhVy)t^D>=-St-e;5Xy`BoD*6_B8*215l#9*}f73$O%3wy*j+f&wkF z=G1};e7*E*TWd+G{nl!jzBJP==C4up3s)g6=oU*$L$OwM2s>^ov0bV{{q;Gx^w0=U zfp!frI~5299Zcj=91h(Ap5l&S@XI{nC6|$^Mb=hHgBZPsFzvMaG-GQ3@ntgs^gvSs+O|vRW(X7#RDtX4)uQRUcpM58NeiHEUA~Lb=KUc6M4>ZGxB8R=5sOqQC(f zM*?UCE+^F&Uw2c$3OP$az!yGyZw%VRYkgdv#`GQnXUwr@trf!f>AlFb-^bL|51#4^ z6nlCoCl*418EgyKYby?IvCH~4LVU^K>*WQ`t)Nm!R3&Ehrw(C z9IO!NQ%prxv{s9nTgzdBVu0qw=hc6`ntm$s5P(tXQcejiFQ$EUs1d-ueUj^Mq=6j@ zr1@;fhcC+5qNhMoa&zH|oELc86~3x6FlDM(>t|F=+#7^Y zpHLmhN?;1ryAjC-4Gm~y(6yu?*1c(Pz3IX{{brv-*p>N6qpc>aqO|CiFyv6oSU6)(yO{S{)D{<8UPOp6Y{t#4`L^V6usM<=R zddW@|cmmqPOj238s%F20_=(>aHO{J@(Y z=Bil>FgRMvtpL|QFW?NQdTTEVK363@C^fYeQcVGn9pFCPwAWU}1A?pj(0$17pBP{T z6zP_dK3i#UNn^>O2}Wx@$*rn5sy{{z=x$mN z3VdDkP68i{O3qppp!uq_hYQJm7-YSRq+JCp(1%=K>55~mfq0l!8woq|{) zKGRw_j2KgmgA3;A9v+TAdJas&yf^p$7O1M=7;b6wMqd^r*_d}AWC2$4whby22ybys z7aVO30+StWMGz~vfqqTd;|(4_kic z8}_wZn=Qc>e8s&YYjT~9G}YA{LxB$08B=8g(Oi}W91^2z5NH8(06!IRq$`mfW2z>) za0&K2mU?V>EB2@S$X0)7%=AM| z_TB2^`i8HAX*Qt&Q-u-gYQR=xmr&Og$Za)LAc!@lij>kI!R4RAFcJbT2kjy zBIvgk{X`*PfBSLu7FE(edJlY6qb_KOj)(Nv%wVKnkM9VTsBVx1v6bL)~%ISV?7EKA)HiUq5cfb zOL_N1>mIfMZNv#$fQ))sXX2+5u3ZKA?qv^XCG8g|;Hs<8 zAaDmvw-)$dd995c(8nAqAZKk1OEpcq8SK_V(95fUSbCpR<@#T7rmOshkgmP`M*El1 zO^fOdgBzv@V7HZ+M@>*O=tO}9Q0AK+kxHAqvIcrB`vNIJ4cpwmksUD7^#a{m4OwGy zi>poJ)>3YD1Od>EcEjpp{oN5Oz96QHZ|OflTz5(f*_^aUf$2tdEVTZbxI!ZUx0Sam z;CP)WumsB3A>4P2New_;&`Q8j;5HE(jgxR<0`2R13p*wY25gw3Dht$Z4c6t!&{Bnl zDo>Mq7Lav_d?`*eKVKpVdGdAt#dpo9<*Kie-G(JpFV~Pz6UpMMcR{}j-iRnQ5EmaY z_n-&_+giXl$S`}=zzhaiLsw`o|Noky7Es%*)_UZKYDQK2DOV51Akh4A(zHU2zh<|@ zs_46269(df;7nng=+NY zv)0O4zz8kFtavN(jB07eWC5+6EveQNN~lUrIh*~ueKj}MKmo=@!*;mF{z`vG0UW~@ zP*k^~n#8tngZ34PP-X=P%v^y#BuTXvsC2zV{WBzihQhUadPzIZnzojj?HTeJiOi%5 znkt@p@cH@ci|J?iWVfk;5|t-3Sw%p*;;{UNh0jm;r9SS-0flUSiODk8$^#t-j6k7) zexX`10MT6H`ZB1(m9p{)IX5nHWbxt*@Lrr7wBh;! zJ6h)oKvv)eZH{rk?xG&kYG0*ogscIHfHwjsU2_n~Mgl73NXbd zsG_wn4XAk4X|QtZoN8W{!daAd0CmCDlqOtJiV8BN#JujQ6Kb{H$F$afZ2CQ&i&V(I zpgtkSj4X!&Q7O=lGOgUw_Z5jy`ajZ@QdU8#EpTIMuC1=3qq?n7jCIk@O8kg`U1_ba zpMKp6P#RRmYN+b!52?QL8uO^F`0n%qqkh3jYmHO2l$8XAWa&vdHQ5@sali!Bp}@<~ zwb4L@0BWFdi(k_{LgCd~po=-swIqc|2f58qXRQV0M5p4cT7b%|E~=KORdT617u{|V zXBM-2K+&)YbxbxASp%v%60V9Yj{+9MpvT!2Zcl?yG|;%EwA6UFl2t zt{b)Acd@ndRm?l|%``Zz{*bC1kb~wMJ-?%VV-~%4~Zf%l46vM3hBkfjXfts&+l3*ck zdWAX(7;VMRw=v1up>>bHg2>r|Y&Qrd3Z#nOLaMHyY|MoKhG!cOn7BauUm~v7vIi0o zbx~lf>#OR(XnLNu;S*}WGn!UVMQgnvva{+K2xj$*$r`F9L~BvATXApF)o{&B={xW0 zrE7m;Ew@bqVuS$!+8m%@DYR;`H(Siv&CT5jbYuWzYJsMu0pR9IpUO)wskyF3g92N~ zn#M|#$g6Dkr7o=5^l0cBvaX?8BTsLGOO-_3foir^PJ^_5!iZ=AA644RFU)!sQNP|_ zcKg0UWC7$A*BX_E5m(Sxv{J8yjYGzgevL+GDcD%Zz69BvvuT7;`T>su(N;ji-WNSe z8Ym`E8Z@odd42+h^HrC;8N{P&61IZ9(^U(rQB4nYT1%us5dzY!Hq`(Fs+Oqq#w@_4 zQDdxO>GFx7nhdLwfbf74z-p@-l@AkBkrjE|LYVA;Nf1b?m_I661+3Tw)V3Fq6$vZB zhFCfe?JR&oZHU>^)w;A#U68QoDr&4z0h4RLtW#BOH4?Q}6_1b#LgCA=}fSl7PsfW2*^0U#5(vuu+so z*Q?ew_xn8bd4g)T7CI|TW57*Sh|2p+2C$Z~LN;X^0)RudI8Fkcw(5iy!4M$XU>*Y_s%^M(W6e~pQTb3W z+UHYW+d=(DNnq;NmTbz|qY=gv1zt29!hu@PUfE66^i_I*FPQ`yq2QY)7GS8Ut{@IK zkkjA3s@~S(yK?(6Ai0*WR-mm}sj*^TRe{=0K56ev#q{O%tI=2kvYcGHBaBC&xs#2l zpPb+d2{Nqi3UC;VxmYfM^r`CWd>vhZA8lE!s<=?|dljn2%RhK6(50$8fT~WCYfBYp z)eWdjE+Y>#usLi}XtfTYIi5|mtAGTx7Bsmp7zP$6P1KxRrbCP#*#;N)KxM9vKnwyQlDv51SC>S$Tkp?F*uu9eCE4_@5FY&ae zUcytj(2O(vQJ_{DO3ohKUcCnT%7*pe<_(HatKYM$Za)*VU|70Njb$5Qg4)3;H*MS1 zZ$X3TaTV2CRA?k?`0=~2H{xrb7FAbkS$>T+*^;xFgdeo4zzY}f^BP-Ug36~!fKa&3 zEnu~n-rfVa@D(CoJ@wqfYRjp>DH}F(P7&(1VDF7J~x3X#BtNr5`%a{ey$J)~nYPw}K%Er0>?I_SL z#oH2y_8)?ZYTCe+2KhY#H7t1GE_wM}V-9s)NAQT3)mP)H75MmG7j$p^*J4|MTU?PY277tcS`OVZTjt!DVfo{3&l2 zuts%%De8#=@yA(5%9)7$K6&8BScl3PVZTpveIKUZtH6)3z6;auRiM5teNQ=qdZOGH zg#I*#|Ci-|F=NSP=pSQkEb3PJZNi>GJy9Uao0I?Q82G!&Y_4COOyJaY_O|MPj^zg{ z?kn>Xz$07huK$m*yk$1oFS@P->~sl1q5jE?HD!w1re3tSJyAw| zG4|MWgb1C|^W!XUiG5{BS8>0j_lj|9u7R_jp<SXW=~r7oQ;i<1BB1zO#z1crq9G zb;ahgQ6ciVE32p{3UsJqmmT=_i*%n~7wG@mIm2D2>bc@-~aTC1@-i9hI*Ce z3O&>#rJ0Bpx7SZKrbD8xl4QfrFsonc1eLj^hq!i9RIGz+*Q zk7{Ry%2z2;eiq=n1*&;-N7y!C<0xS3_7b3Ppq?m$`fIMll+QSO`Oe$9>ct==T z9nTiPQ zpW0XX)k3WYE_2iqrCz+MtrfV>4yD%);n!=+sRjS9OQUS9YhK6XuHb&{*TewPff~4j z30~9_h3en47N6XYPro7o>=QG7iYicLr#fa|_}seG`|-mZetph#&Zf`u zqngA*HNE^NsD7`)!rCTKy5_FHenQXNsDCC8$UItemD51ZZL#+lz@MTEdB8M*SaDYo zI~O)Gs`w(KxfW4Rl(No7&&lGQV&xK!FxGW-o&xz(>LS;fsJ!_2!b;d%*60%!8qgi6 zM~Ylz36wo)4`RsfFV31h5%{N2(Sub~GL6`?1A@}kmsqB#;R))IVo}8{ee5fqz{Wqm z1>;+lj<8_pdif)E0rgMkftINtm@X3j80%3nh0UA1AL?otYXj<$VpF}#M@-vBfypD+ zKS=d^mF~IpwytkE>s{0%#h`k>^zrfgLr~4nO8ZG!-eMe}pB$idg+*P@pdKkERrvk; ziz=<)hEO)T{us+&@NjR)0%u(#@Z;`j#DAZ|0`MxO5yDEkunxua3~KVt9O?D zlxe|d8koA0uwmT-FhaeaqMj`D+yx8)q#8m{Pg(lY6u)IjkF}AyM$|PwK=qji#;7;! zU*oKhsNPJmD@@Mf%Y-Qiew;Ne;ia#ngpl{)N?pZ+@uKU3MtyxI^`j%ye|x`-rW(}m z$v_`$EGYL8<-3Z0oHZ;d`{1pjpzc+*8TCb|R%@-G9x0jXRjv=vA_yid zqMA!6{rA64_S=-|k*(!koY3fcRl1HW5c2yIYQ8CNj{2`Vt5A(9c_ykK_h|4psO!*7 z^=}#y{(VKw*R*;aUCZsI{fSY~PkLKvt$#ZW45(6W{rKR`Xo~8}9lQU7B|k2&6}O{n ziPyn~_w>NP71Tf0T63zu(^_t|-{+zPZ$G^Er-;%Bt8}d`Ku@}!dccb+eD$Z!1!*2F z$y6a~uDEJK!S$1~rlo#N=}=c5kIbFrL(Ti4QfK&wT1!9ql&OB;l>w2}(xf?u!Jpy! ztqRB|4>!7UcK{I=vb?$$)O&|h4^?J?f3LOb1(9SPz^DDs7zCvliLDHSGo5y+!HCkuBpB7_K6-UUE5tj-BDuO^WsuVx-01eQ)`L|vFr{xX{GWr z&RQu`T{&PI519Mbzh1hZ@j66Rp#Pe)+M{KVYr3X`T{hr4SI(?g+U*lK2!3+bN*U^^ z0=CiBy68s_rS79%7w|#`E`9ww)wB+>OkAnk2kxUwwoY6j|9F%AS%X(446e~jT|=vD z80rc}2jf6hpofj6?sl}kP0fQ#TEzk5?JT)z|HoLm#GV2Ax>CdIMX1(Tot+93)C_t& z3y34_6WOLamrUVOMA29|nWcY!?upg~de%~F1afedp2<)LEa|H6d2YwF{npB;|5g@| z$AZPiS$M~DVG_$?Lq6B`Ym$@t!_UvJ>i_yNR#lR-Y6pZMEx>C9)Pa?NO}c&!bH8-` zM6hB1GC&OyHUECJwIKFWR!A9HQq5D>G{3l=1rc|c!RP0%um8i3vvjdKEv+laE+8M@ zK)T)mTXY@vFK*PYwDpN@J=$1b^e7Nwm9oNBuLmoe-N_mtCsau0`Wa-UQXNiIJD}24 zEMQWSxw5YJZ!aKSp*Rcb{-s5QF6!6M=d-}g;Ns_)NUqq~DJRKaaMG%`qy5}%PeneB zsc}G~Ym~oPy1w|gG;&E;Fl{aMOM_b6daNXZ*Tr|;M9J0M?hwn(MDgcFXuE(Oy6R(A z-q1BY5GT;R=}}%uTt_{f1%Pktzt2^Tq0C`8MOFKHVyVG>a>GxOvI?XTMpCklSD|Yh z>T0i3fl32n(DerD|Fw5*OAdlCwBdmnXaE0ycgY132$ouLbcgfO)@`%#Bu32z=K$y= z&#T;&)LG!6BGS&&G-4&HsJasG1?j$K3puu^oCEP1aRs}oUkWU*`4?KOcorrkN@=EV zE&ZV*bs7hGEGVb-kVO4YtRBS2zAAdxp1v|juHCkTj0TO|#$mRx# z!$A5={M1@3_0>q7MMBERR-UD>qbltVPGPKqjs>R?cy-O}0$X`6gzoT)6Q|J1?Hg;v zT8`97;7GZZW1!X5tm2ea1vx0=a;yp*TejeG+VTp6ywXUjZ>i%_Pes0tqYDAm2G&0a zO4)$BOKB!@IaZ4lTLKIQmvLT!%RSqDtp#d$5c_xVwWn%uROJN$R={$BF$?m@&Bwfg z%PX2mvJ0n4J$cX70CqK5*{CYPwNwf~I>+#Sa`{yQi7jz+NUeg)dtPlA$ZrNC*2UHW z$jhQ?ePUnLHoc3gt~{v&i7h=B*goPlmEQ8ae6ZiVpS9G?O;m5Sw&L=kqbk*>r)&Bk zgzz%4rQ-ua>@csK-l?O&eXT`z3_P;ysG|1YQxy}*7peLP&?CLQ*y7uHoYxWuun+E0 z*4iy)_EcSdWdL+NB(VkdTmY)q0bWaiwk!64)ah_ZD94@Z^AXzCfPDjVg+Uu!2hhCA zHwv!<9`M#$hosIzGi7gkh8Q^X0qaD#2UF&A7Iy`o*T^;HvHtQ@31KZu6_8#72qH*;AWcXx zQPI$m8d@L}Y0?xVL8N_&JHMT8zH(>oyz`Xvyyu*`|J*oBi(8x=!W?XDY@9$7BM2MY z5oy+Y{1}r79=ScmJj5-{p*NW)^Wov)K_Cz)AJr!Y=_NkI`VzzfCH?U5@Qkyw4O2c6 z46(3cyRk6p$;QU@6=-At4Rcz<7(88V6^OcSI9-_RZ{^)Q-Yf~9&%c-D*r}xR{oJ<} z9&UGgTo#oUWzc6QtpE1=JJ2L#d*W*WL;|=Ur0UKUwz1mPUq;ByiTuJ{NvyIARg_NOm9JxlP z5gs3Pn_yUUDq1oZVYqlf*nMls`!ujgta@X?jROtlq>1`pk9Tt$keN93tV8=&{n~Z* zD~lMftx*R&8M$aq-v#qFh8w#icZny01YaAI+t0pLBUp zld1*sMe=>4!?m7kMYWCdkR!H;UIFo4SK7=$m+OeK#qh{okKm+Gze{uYC8dH$?NX%I zN0JEA>p+25Iv%GA=xIE>)C>EVZDwv?p#GP#?y!R(y7Kgz?(Lru!(*6$=e6m4cL1Qh zJK;)2a~cA+1uy7h7*W198#5ig1zp39Pwto6`YgYgB3k$rY?tSJqTHlzrJp;2vRfrL zlw3?-mXp4ybvnU6-4-yk`gD8;;VpjW0`>1I(NSJJL40NqM0r_`5h6 zO+#pQ9se;-#EQJhbrDeR*HAOkuNPhV&#W2vQoPy-lpmC<(4&eMIV<>N%3tC3l;W?8 zz|Y}Qi!T>C9fIey`hO-b99T((M*PJe*PY}k35+xH!S#l7h;%NI9PBGAM>cRUZkjrJ8;wJnQqx73#B-bm2+bVwypGIVcOzCWasRW@W#2RL&P~gNkj{_zN-|1cbKH7tdd0XYNjR+)k9yl zzOgr%`|M+!g5j1Rp|*4w8VoWNRlBY488DmY5Mt5rqAoXpAJY=kh9dPzCM1Rz_ew}i z4U)=|IjE!+5-Bh43#RO8ZmEum(agcdEwlYc9bIlhyZuP1LIOcgCK3Zk4_vA(6%ni7 ze#V`0X<*cC7BO;+({VSmH|{_U?uNOe33Bn0l|~tvvQNiHNlxe=2dA_{Q0Mhm(q5Kf zx`avAIkBsY&q4rma+Ze64&{B(5>*}gIe=1Gb#$PBkQ;k(U2ZTND5t$o@Y|D(M>7$2 zj=kV@GNxwcQ3&mOMDeo^5g1Za=Xd?+*kM6U^!EB{il(SqX|b~3#Bmb0Q;$=DgQVS< zvz&M=-=*vau=7V%7mB0z4!$=ws|P1_ESe5<8lE({DfnPll@EZL2fqi(8S!_q7;+ z+>~sE?;rZB)uwmuiZzc9ksH0?hN;4lEiFG|=mmnVmr8hlWF(L959h3o3S3I;lPZCL zJV*-p5YR1YGj~O+cVXsxH=u1lbpRo%5V6UdJz0M#N`^0j=lGSlH-C;ceF6Rv^tlgG zg51WIUgp(COvEJyXw_0VIn_U0Q`;Y~!cNrZChD*E7)iVV-z@3mb_8d(ukMzqEPAbl zpTd=E868WNx`@Xo2S>V*UcY^311$v^tjk2FfVNIP4w={-vu3Uzr=cX z9?*1qn~*Slgx6+12oOg-kpO)eeNBZ=%c0z5>+Kh(*0wfVT@xE~A@ zk2N&>#s{$x;~w<$Fd}ppG#_;m$!gUYGc(m}aNByrsT_B_g9CESypdXP$5#A|G!MWX zU1E)cR=Nb|^=%7IOY-#ddfUW-j^!tmoa+RL%qoeum`kdjw8TgE19XZ8g{#e>uh$E4rPzzb5VC6m&9@eH z=5sq!{XLZQ4f*rpgRc2l6gE^Y>WPOPz&*bz=a=M>jC4mxmX;f{rPz`-6A>iU_Yn4w#8H*{Wc9Z^+V#mMe_|!`q*?~`1-bv z7klslASto!gTBZ5vjIBap^NbX1saXe$w&xrntCx)IUo92|Bz6?`L{2d_-YiMXsq9J z*s#2_03%5f%L}Ml6ohbU?Q-0j6`I0FE&GL)eFLV$zW@!{w(eiJd z6^*TC>QH<7Cq_Aml>=iL3vK9rdN0xOFmMbE{7_?1kBs#Se9d^@@8DDDN=d68)2>9C zj`c9)taY1%4Ys+;3m_rQOnYy=NXWv&WjT+=u`(Nax08q6v=C(N`3w96D`9m9d*oHY z>^)ilGekWN9nKB~2Wr3@!8OZ38U~{+c{FJO#L7&x&1rtTd{VS$o`pPaK*7`ZXsny9 zq_DCf8d+3k_#7L>O0!x_*WTnjJ1DnP7RouD9a zXzX+3=Q^+ew0DP5p2?b-$(H|S8^8_!E}rsxJ5{Xh-2HbuOy?Uk7RMqT|0S!IsAUam zq|6mt@U}~ag0aJ6$6FJO=)XU8YL#@N4W;G21|&n}eGcxKNS%&f3BR72ejX?g7WLE- zti|a)Xnr%kLK`O=1ov&rC;N_#o`+kzSI^_hF!kRx&o(u_&&!DME?$Y7q~559^AN)7 z=JB>T*$}u@e@4u4RGmPVUY!GYmBxtq(}FLoZuXPp2p=4$M`#T2L-gedP}C1)!fICJ z)~jBougx@GC8Pwxhk+-_X`M}u>tXE;#e)3}Z&PZuS3WEdR}cZj({^r*(g0c@a#Oe9_~`PT4~RZ#77a z_G{GcGQ>FBU1lgw3$V6sf1+ib(-9!w z@utQT!Eeu;_kQfWZQa*JQ^?f#Fnbo?C?%H%lrQg<0mb~8+1%Kg?Jd8dECad?b@}dV zyjkt*w%c2`+RLR# zHU9XUMVSHBYl}H1POQ?Bl#i44D1y?UpBt#JzSinjkvl7vo<;-Gt>gWFCLe1^)Xz&^iyg8Bq?Tx={SB0>iC4Ws@d^`dd^3~jT)=z*9ckSu|uuDvQb zxqW4lShdsdGp=X@%;$0Yc3tRdmWJwp`}Xk8jXA&DPHX{&fx(fa#ysO0e){xUreXpX<>_|awX)>Vg!MR$1K64L(RsveaW;5K3FQ` zHhk*>L>k2WdV}HQ`NS4oQtIUfTaGN_xlT}sZVgIaNqGvb61TH#x=ge53kdv8!4I52 zi4X{>Vtk4$4=Qlm{FJq;pWj*G6vQO8^YrvR8NDl~65Gett0ZElO_x3KyxN1r2V6jG z;nh(h(GgOmFC-p2?Lx6q_c`-LBsCIy!0DZ|TrN?GTxPE*`1Ju>7Ww-Bgtwr*iLVOA znFb`&AXbUQGW}Qs?4pyj9@&{B7`O^r3Ez-+le35msN!>i@v`2^{i3 Zu#g(=Z|A4Y{BdSu1KzYS!WlY0{x3Xa-Vy)+ diff --git a/public/images/pokemon/exp/back/shiny/362-mega.json b/public/images/pokemon/exp/back/shiny/362-mega.json index 2c42a6db6f1..02354ddad93 100644 --- a/public/images/pokemon/exp/back/shiny/362-mega.json +++ b/public/images/pokemon/exp/back/shiny/362-mega.json @@ -1,272 +1,551 @@ -{ - "textures": [ - { - "image": "362-mega.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25f7f8085d78ddcdd4aadd2f3591c111:e79d613f15426593f8c7367b1afc6c04:8a7271a5423838c97ddeb1e6dc343255$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "362-mega.png", + "format": "I8", + "size": { "w": 128, "h": 132 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/362-mega.png b/public/images/pokemon/exp/back/shiny/362-mega.png index 32f3e5658a34f7a03b388f3fdcae5cb807967a5b..75d5b5075b9153edf971edd831ccf63b6374cfc8 100644 GIT binary patch literal 2088 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 diff --git a/public/images/pokemon/exp/back/shiny/718-10.json b/public/images/pokemon/exp/back/shiny/718-10.json deleted file mode 100644 index 147d661bd6b..00000000000 --- a/public/images/pokemon/exp/back/shiny/718-10.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 194, - "h": 194 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 60, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 60, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 63, - "h": 65 - }, - "frame": { - "x": 60, - "y": 66, - "w": 63, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 63, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 63, - "h": 65 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 63, - "h": 64 - }, - "frame": { - "x": 125, - "y": 0, - "w": 63, - "h": 64 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 125, - "y": 64, - "w": 62, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 59, - "h": 65 - }, - "frame": { - "x": 123, - "y": 129, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b4423fced8dd8763a4e886055e4ab1f:d04b9095317ace207a8d36f1e501da19:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/718-10.png b/public/images/pokemon/exp/back/shiny/718-10.png deleted file mode 100644 index 63d73684da426692aaba9451370a7a7fb23ffae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2632 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 diff --git a/public/images/pokemon/exp/back/shiny/719.json b/public/images/pokemon/exp/back/shiny/719.json deleted file mode 100644 index d39dc5b1c99..00000000000 --- a/public/images/pokemon/exp/back/shiny/719.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 158, - "h": 158 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 39, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 41, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4664ffe6d92453555d7befbaf3a06e34:ee4f7a42565694ad44dfdf274a36ffbb:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/719.png b/public/images/pokemon/exp/back/shiny/719.png deleted file mode 100644 index d1640abb4a0cf9e139a4059c59fce7f47b71e028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2529 zcmV<72_E)|P)d&lh~CLNmmGH zoI6ebjfE(`J4F8uh#LxTj?oEk2f1Zzh2V~A^dNEvDkHKwjNLPWn>{YCpodCc1UHtz zjJWcISbj)4R3={nM;(dS-4D>M&D!0>pR}miYVshd*$_<~Qz8|hM_fs6nSI-ELu(Bs z$E}+z7pEeF5EQ0qYeHH{M-MXP1%woAW;dHJZ>Qq69S=w^B=&inl|H1TqXS1BHG;-C zf{yM+)%7t=OO`$lV_>lfiQ>GBAXA@1h(SwDN#)tGyqXL`VxNaGuzg5rURsdR5fPWj zeeqx2cVAss9@v_!g!E(3f*~Y3FD%&U@C>2}KQsP_IdZ732Y0d01llH|FfSa~>+p<0 z^aAKaNBV_*EHBj;K(9mYv#BFGke`tLv3q$bSkcuniT+~)D3Mj2a> z*TI0J4gl&c`0F z8L=iHprB&_Ssk8n1))V)7W&Q!ov`LyFsaM9?O4Y%!mx}SDoczJ?{&?aSXUll;qDJUnukb6?s6W20J^mGTEEsj zEU7Cz*UBj2LefC5uD)*%hV5Z#a*PI9MQE~(^(D@vtTA2$O_le6Yh_d%r1TK#i@Vnp z&bC-qVbTmF4ge;9F2-=*P-bO|A2skCD&N)Vg_0Oia8O4}Dy%`%r0udsu94wUjvHkxRGokMd{*^^0wEmSX21MwR6y9$ zcUT#yTwk1({g`89bjA6^vA_x14Ni}(G^RGqz|=RS;_6wEIY9={iCA;#2zQSfJr)W~ zGf>MIxN25pPLL7WlF*gv6CQ;sEUVyVpbhs71)g$}jFzKlz`<`@*eZ!@t9{OZG({t0qZy& zMr!9lMMyi8_vkw_h>)<|KPc7U>sSV7sJM9~1C}WXgMHs?Ze4$ZWpJ5i2)DOK%)87i zmbL^uHqm3FJ7_1-v{(ig|MU>JhkNJ#gMj&)mw@?CynNonXlg8h@p);XHT!=Zsl*&t zo|u1*MX(_q$CanTruu>Y=UDxq8OizKNq7e=k_sKaf##L^@z@Sa%OMZ77NI{mKL@PPSd*!wSh^YZX! z75C~j8{Vkm5~(WBs_Ij!xI}7%Hde_WtGGm->kMARlX#;F{JCD0&g9R-m=RSfBwsC~ z7k^S7ZngOmB_C|9!ecus^ojv5)YqCX*}Sa^*6=Bk$DZi3>TK)1l>D-_iUaNnd4Aus zjZu=kmtuLgGn=ALuozKUp7lmLZ}uY}CmXAi;W_@0apddA7P6_aSTFHZM*i#JXscyN z`}*u9Ct~(X3Tayz!SBi1Y8g@xqN@+%-?M`CQcBy(Fh;V~@+2=rw<$!EeUe6W^L8>& zwqY}*AVhalBX2?WNg6q8ts{e03vT-h)deGB_DLRP9dz)vT1l|IUS2XHRt`-RvUWN^ zwAGHFsN=M{Y($JcNs7j09d!V2N994@9(=exqPu3ap%tH`Mc}fIIy^YqQ3X)22a6Nu zopi;Am~E2Aa9J504(#lxf?z)4NqKuX&$ACP+bM(NrOV3b7+kfI;4z}6JlaiUn^&<( z?gp5wjE=o?ql$uuh`REyHVzg$C8Zs*GCFMMMimA35tYreSbT`ZCh2~{WMy=i-l8oD z?jtH^uQm==Hc2sSr=!1&8AJ<&>4x z(V2b^z|KjotZynqTx^nTRz}C#nrc133SLL2`{f;JvPl~6;vBMaIvO|Xk>EDstHpVj zq#2S<&CQ|cFs&O^7R-cvr8;sUMw8@8(jcTUqn?2;9^T$137Vu?Nc}i@tXK@GYFu$i zib+`^wcGOu6m^_6uQN%8rf^9IA-x&(2xLPl+gH04!5YJd8kMk~T9z{}RyUd?2{3`H&}57hQv$NphY! zzprffY|N;Q2S0*Ia$-F~26_00000NkvXXu0mjfKv%f? diff --git a/public/images/pokemon/exp/shiny/248-mega.json b/public/images/pokemon/exp/shiny/248-mega.json index 6dc54a8aeb2..15243cf5a2d 100644 --- a/public/images/pokemon/exp/shiny/248-mega.json +++ b/public/images/pokemon/exp/shiny/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 271, - "h": 271 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 181, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 84 - }, - "frame": { - "x": 91, - "y": 170, - "w": 90, - "h": 84 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e303fed6273448420d3b88ba11175e8d:629c5a6630efddb6c94efdcd98c81d33:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 346, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 467, "y": 345, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 94, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 91, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 182, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 275, "y": 431, "w": 87, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 87, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 457, "y": 430, "w": 87, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 87, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 558, "y": 346, "w": 86, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 86, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 283, "y": 175, "w": 89, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 89, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 189, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 0, "w": 93, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 93, "h": 87 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 380, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 95, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 474, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 190, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 95, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 473, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 378, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 283, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 89, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 374, "y": 175, "w": 91, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 651, "h": 595 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/248-mega.png b/public/images/pokemon/exp/shiny/248-mega.png index eebfa35bbd4d75680c1ad7a4be28976d3194ad94..8d9d5fc316cbbddcc9da3a828f1a9c9f784ca8b0 100644 GIT binary patch literal 38718 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 FKLEYrZJ_`F diff --git a/public/images/pokemon/exp/shiny/718-10.json b/public/images/pokemon/exp/shiny/718-10.json deleted file mode 100644 index 98f6bbb0f01..00000000000 --- a/public/images/pokemon/exp/shiny/718-10.json +++ /dev/null @@ -1,692 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 239, - "h": 239 - }, - "scale": 1, - "frames": [ - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 132, - "w": 64, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 65, - "h": 60 - }, - "frame": { - "x": 59, - "y": 65, - "w": 65, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 59, - "h": 66 - }, - "frame": { - "x": 179, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 64, - "y": 125, - "w": 59, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f59f7684ea1f2b8bb14e98d16b18e3e0:a1fa21d4b2b42982b0f0546116b38791:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/shiny/718-10.png b/public/images/pokemon/exp/shiny/718-10.png deleted file mode 100644 index 26bc2cdc580488429aae462a293287a2c56997d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5135 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 z ze@%vKrFmutKI}wE^d0uQfwKw`nbS-31gp!hHe)?Brn&?-4#LvI^cv2hEz6$#EsNaO~CGG!{UeP~cUPEa!lC}gC{`&+VEKugu It9N4l55}#_%m4rY diff --git a/public/images/pokemon/exp/shiny/719.json b/public/images/pokemon/exp/shiny/719.json deleted file mode 100644 index 9bf72888c33..00000000000 --- a/public/images/pokemon/exp/shiny/719.json +++ /dev/null @@ -1,1091 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 210, - "h": 210 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 34, - "y": 9, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 46, - "h": 67 - }, - "frame": { - "x": 144, - "y": 0, - "w": 46, - "h": 67 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 48, - "h": 66 - }, - "frame": { - "x": 0, - "y": 67, - "w": 48, - "h": 66 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 48, - "y": 12, - "w": 46, - "h": 66 - }, - "frame": { - "x": 48, - "y": 67, - "w": 46, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 45, - "y": 1, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 36, - "y": 2, - "w": 42, - "h": 67 - }, - "frame": { - "x": 44, - "y": 133, - "w": 42, - "h": 67 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 54, - "y": 3, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 42, - "h": 66 - }, - "frame": { - "x": 86, - "y": 134, - "w": 42, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 55, - "y": 6, - "w": 41, - "h": 67 - }, - "frame": { - "x": 128, - "y": 134, - "w": 41, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 41, - "h": 67 - }, - "frame": { - "x": 169, - "y": 134, - "w": 41, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a418188ec41514bd9ae14eb24912795a:ee144292ee551fc92c6c10944cfe21d9:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/shiny/719.png b/public/images/pokemon/exp/shiny/719.png deleted file mode 100644 index a733b44e4b3d01f646a4764e8137b7c0f1a58b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3530 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 diff --git a/public/images/pokemon/shiny/718-10.json b/public/images/pokemon/shiny/718-10.json index 05c86055ce7..ad273c9ea79 100644 --- a/public/images/pokemon/shiny/718-10.json +++ b/public/images/pokemon/shiny/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 66, - "h": 66 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ddb567f3553fb8f8477733fc8b91dfb8:21520f234fc9684cd172bbced8ed083b:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 287, "y": 130, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 57, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 164, "y": 261, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 327, "w": 56, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 56, "y": 327, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 169, "y": 329, "w": 57, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 57, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 112, "y": 326, "w": 57, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 265, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 226, "y": 332, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 220, "y": 261, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 264, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 279, "y": 196, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 56, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 110, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 198, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 169, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 224, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 132, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 113, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 345, "h": 395 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/718-10.png b/public/images/pokemon/shiny/718-10.png index bee16c7ec637a6a6808b97d02b36af538f9ed6d2..f976d91b4f6323cd0d08c0894ed1fa7d1985f86c 100644 GIT binary patch literal 13794 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 Y2W6ohgD^$$SpWb407*qoM6N<$f(a_SJOBUy literal 759 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 gug~`XzRvF1(o!p}lw$15WLR$O4%QWG zjXKx4b)@SuRDJW|%iXP`T9LxfHb*p?DwD9>hGYx#3(>O1#Rl_WPj^?4UrVceiGLt} zNl|VPZ)4WpbnOtPZ?wmwEEf?v;|EJXgH>y%VQ{YT3x57xg1XAlIxHjYlI#4zU1#*Rq2$IQ8brai zJvve9zA^?eXT0=F>_qTnM49V*XKkg-1{-wc6E;%5NTTo2F8y5JV^eo{ylXYG4oi(l zw!vKY*%0PCTGyvr0pcFMmA4mC_=-*8W#+nk$ul( zS1ans)_%nzCOmI1wC0)xOP`eR$x-_LXvA|naBWxc#@w8x5?Y0~t5=AtT`Zvk2O(7p zZG+Fv?U@h)Km<=m2)mkXEG*3Jlz`~6p((8Nn7fYCGcgQ05?v+6B#>=!mZkv59hi@W zNaTX?#A69CA2!3=JD!|QG9J7*B`m~`P!DfoMJpn~V+oTqrPc9=s2%@DkQa9u%vJys z#?v?u0B2qIXo>;hzhySbPSe+thKi%(E{ySW>LC|&W$AB{`gTXVIG8}4^J1_UD-nEy zV?F@;^L&d75Bl*~9*#4*0OG^&g06${SW=Jd5Ilj5M>lx5AA7oeOrODV&;6w!55;gw z*H;_|!`?md4G>18ivbd-6g7K8_ zYZ$!`dT=^bBArU2bLhp{6j6vzKPh<_HpajiegcU5Yml`m;(FAH!v?2`F-YOP?835c z@eQ7K;rhk9%woo^C1i4f-O++fa#q{lmrzvi%8#PY3u9;0T5&0c_ms00000NkvXXu0mjf DPoO>M diff --git a/public/images/pokemon/shiny/719.json b/public/images/pokemon/shiny/719.json index 29e48d3b3be..12a679f029f 100644 --- a/public/images/pokemon/shiny/719.json +++ b/public/images/pokemon/shiny/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f62b9cce190b10d691ae00fdc87df448:371601e6d1aa56d47c80c70305627ce1:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 122, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 162, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 115, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 153, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 74, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 37, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 111, "y": 350, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 190, "y": 280, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 191, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 157, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 202, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 196, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 38, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 76, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 114, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 152, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 41, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 122, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 162, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 115, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 153, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 74, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 37, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 111, "y": 350, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 190, "y": 280, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 191, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 157, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 202, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 196, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 38, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 76, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 0, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 114, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 152, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 41, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 246, "h": 420 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/719.png b/public/images/pokemon/shiny/719.png index f17e9b23ca8bd9871e8230c02aa1a7f7c3f61b7a..c466201632a9383052a3590fdcf7ee4e8c4611fb 100644 GIT binary patch literal 9678 zcmZ8{WmuHY8!inJE4>RWjnq;r0t<+Obcl3=u%v|2wSt6%uyl6`EX^X|5-PQH%F;-e zl$0PMaQOYt`E=edQ};7ZT=U-Z%v|$9M_ZMOoS7UC506S+O-b*rJjcVs|42r7SChEr zZ@4S)z4TO{;nj|Uf8I63b+inW?@DTFYAr=ATQl1bVYNcZH*Zm*;kvh*4#*(n zt!dI$Oyz#-z|N2DJMf%wW=o;Z@m-C^TTfdb@Am)us2Svo@bEbB)Rhzr{Bt++;?hen zwJK;rMPsRGwxnn{S$eM z9rnEUsyf0K37nh1u$;uoYX+X-y?7Q3+|i+Mxav0!R}%51#{5ve!~u=M4L>}hI%GCxLI6INC#(&K-s3KmU+gaeLMHhc(KbI<7M2s) z4t19=rN)F3JG0REf?em&e+1pXU$i}8PW=WR_WXBL`<01u=kUJYS;e8Y_48l`rvce7 zlcxO1s)(=5XDGR0S$FQl)vpwf#}}@jUJ3Y?T(l74VxF2`36Aevoh;YB3l82l9eO9# zreE(^u}plJzWDlG@Xg}cO#yeyr&CcvDa~v`%yRlj%DHgITe?|;p!V{;tAnSA+@}DN zbc0pf{m&t1ouvc`8DC|x;Vd726+L~w1-*54uiNzvf-OzOFS8e{2nBts5NLde{fAK4 z9W%nY{UgP2N0&tBlto8ozLU#*^X8Vcb@60dRW$Z`_~z7cPzQKghev1{&XmFR8vmd4 z=xE08Kfhi~Xt12V!CUWrq6W~iAYt2JM~sYwr4RcRZN9-P2bf5Co;o@>=R20}m$y89 zcY|7g!B%S9<8hPSQ9;B<52o?h4eJe8F$?tKU_Eq{VoUI`T%35<)P3u}{&%OJ zpz-N3RQ%|VJw-28)4j4&oyd{Q&J%f!<~U$f?R;JBT(o20^KaEv66jgJRA0FFf=Ft) zkNG3}LM$tdcU*Ocgycg~VU3(JymE3%$S2J)wvP?JnPalHut|NUW+=q8z(xrvYe};+=u(3jo`M;m#NhRHA{v&?x~;lW>C(Vi`|U z%q5Ile!xJX_pSlVt`*;$_C(pd+3lmRGGC(3JF3WO$su@)Y!W5t%2r{aUzXuVNY7jo ztJQBk8#)9cLQyTRyPzaDx#FnY<|<})P0ln4ON0_Xm6JxD8-2NXvYdP@2iJb zA@@O6&!Kaio#FO^KZnYilB%A2E{PJnm7@vLgw4e3B@C5*3 z$}QKoYQ-jrGcALl{)wMsa6cb6 z*%niB9rqQ~JY(>cy%AOB_xS0)4_W>{!9=y7A^B_3kd%fi0{WAjj%1uu|2Nj$RPCK_ zgk}a;z@BeJ-_z`(ZuAT7n_Nb}5w~7kzPnGk^Nr+&LH%oq>s8pFZTSl{fa@E1;~W25 z4yWa#8|nHB{#!)n@|x4XY(TeAxU@;Pf_w4Ps&0PiM@u0@tpChqkjrZXxdV{Dx>37g z{p`@hZaSgjV6&)I#`s0`IS$fSu*dB@2rQ`&C{#SW#fyrxGxn3Q(9ntLo5%s+QYp)G z5%<~FvQ*>DxMH?9j8i~|ZXZy*tP#9LhHa3OIbL7@B4jZL8BR&3pdZHk*dt2MJLD5m zCV%11#|$8y%%|IA@ODi2Y}{@bMFV@IS4g_I-X-e3%^WZ9ctXBV#!=@q$X40yPQf?2 zVZnNTQ;aIA{91v-SD+ulY&f9C8VTV$RUOak8uJ1^0yA0#YesRppFL#hhcd@kq#5tC zPulpuegk{LHi*v*kli=#7|Q?F9OrQoBe?6t8o91@Z1y%U{1G@wWP^c1|F=JDDmTD%Y zp(nh_CE9?QbaUorFVIn6#T2$7T2IJ z(HKb?j#GWI2q`@HYzgxmVAmztXff)xK_#CODNglWnI#+l<1-Oie8pznlGvd~v1%+L z{lH1w4q*AYCVOyngTc?SWj40{#%?j!T*R&(wH+fFjzMey_VvOJ;#n%SPssPqt%ZPP z_{2lXq}5GKCLJBGf?il?xVJXHw#Z2_u1}AR!)F;%25Rj^RU#~ig4)@~o@2WlS{q(> zo^LQrc&-X_Sl)>W4GLWSm~_}Uo<`D5y9rh-Wctu18qcQ8=vpt==@JS3=5|@Z8Mvvq zTYf{Aw8OW2Kvq@?E51~&L@c^F=nIUr+iU&Caufg2M|6(Io+7TUojt3+X%ws!`qY?m zHOJ$XzuUNaEAvyBcy!{^VhY)lV9SS}{Jkv&(te10@N`B#SpT#lH|~}@Uhu5`*!{pG z!-K*nVjs`+dt|@{8vyHm?XUW7I6ZA78wLu%*0NLfXTdx}l_0ZDO-x~gc86X?`=+Yw zSoJV-L31$=yAyKOT-LA#Zc^aiGjNpyF^dboIfe860+ham&Nt(Huhqk%{lr2P`2^Z^ zu7`%0WpvHD{ngq8@lV-a{@G0b&ffhdCQfVYWwhjqB|F8N?1<$VL2p$b^Ri#d2OkaeO(KBe3~c=3Zs$%A)`}Qn~f9 zELgI&t!Flc4*{F5tz7PhZc}-0oWl`*g{Rq!NUo&Tz-8J`xR|j%~>&J38wPga6Gkf+)JuYC*+5%EKV)s z57icUo@ct$13*+Ygsp@x2Ah-;*T6F z$?(sZln8p0u*o;OVzopchh|AZ(j+|+;H9EWMbFYzrk_|oSrl)JtwJC+H#qGtBQF~%S6i93x5Jlm&^uO;2)g|UC|PYBZo&`sFOF0+ z`^PPVgy0W-=3~3Fi1KaGKF|kLxrB7;$RSRWjJcz%U-pT{?oc_HK~&Np0Q@UK$38|% zV1<}U)$Fm{>=^sMvSS&_6IFSOykZCTznv0bn`86dV67;H%|*|nrVvbINhD%SZk+?w z-Eqx4JBW$2tqfceZ6m;T6QjCyq{%MO`jX5ED=*I+I>02w$8XckZsP&m9(-*)AnJHk zvHe=IjaQI~#FA@f<4530Vn3`qtIC@7k=;y$1o-Ck$@`mpDZ-5-Jv}Xq>&LW0;M&@E zCl=AvxI(2aj>Q6xpdQVve|%wR`|c&mMprQoix|hwYk1>=?b&z#NXAH(vz#!hYB~QY z%*Gm!n1zG14sl{~wH#vUPt%vnx=ZPod*=OyXKtRgz8M{~s7puUi}cmVB#4UIJ)~?yLpCp){nZ7JpL7 z(W#`7qx%nXKfvx_3-v+lE4%!IkxJmgtu?t>NG)KsjYFpg-&tfSR^LzmX?lmhL`k%YM!}J-S|DTWi9zOV*ew#lKtk={-WSWBshxEm%iVy=X{l zXFyS%06Wh4&ENF=;`BKnXUwm zwknyjk)MrlN(>M8^JzQ~_^-1ts-(feb^ES2F1%zU&M#2RLQav^1D73JI%Uzw951+7 zlNQl2@z{483~n0u==9S|vvm$95v{aWsUh^UlM@8fFj%$|nXwTomb$9C zj;t1sR?(d;UaNZon;&~#zPB>_NjZp$u5P8j%Ga;t!Uv?XqA{Y(ju4zbgwAy)Nz46> zPc-m3?EZ7f8HAnR5z~mDwD>d5HyddK)un+**&ePOndmDT`cglk&yFqF7&#Jc%3tjjTHP`=BoaZMwr7YafKy&Piz{OkD4L-O=gms>ROwd;xy1nlXBWj zxy|+gWZb6JZT1J&4g+JxV% zVD;CX(??_nP`9~>i^Alu@IfW87yrWhbcaBys5#7pAnl+)y@U?axl{4;2~!&AK^|Ac zB)6AKe|%y%e3(1fTM2xqYaQ6pvn!^hb_V;%qaCq@p+g`dMQvXz8ck@Js`gK22us6~ z&AU}noTKM{wz?whC-xu@DLR-HNnN6z<9wFV=%kmwPra{N?5&~^9Og?Loc5}esmcE9 z<$fty!3wr|?eTFtm!USgGIBhR$Ksg#uY|^L1)MJ|^!{!mRexCW0|4-b|5!q7kbK^^R(3xlUydefCID5-M(&ac-EXN3p4PIsCTw`m@r=3VWr-4#$a{|_SwkiuOZ&gM=e$2Qox8t zleS}rDHU5BKUT*mJXHu-9IZHRks3grS(YJ49ryAK*IAUsJpFoV{wHKHwXlvl|BdP+ zU^ukDv*?#rwma4l zij;TlMsBo(l8DC2wX1Q{hVC;Fw|M3*ETG? zq|limLML2|Z&obK(qv60J9fECP=hhyy+F$**C*r0RU>~MRF`HxH&zunBNN?~SVE#} z<26a*VG&uU?UL(1KzvytE+{h}Sqe(WBf$P*XXgR^b>%1Hi;-_`EWzZc77)?~5N~eT zJ&_YUS5HMaWr6IaCRL@YMm*LGee>Bhs7Tk=4TPyCTrt}@3*}#o3=RFyQ;&g;)p93X zH~zd>Bs}w)u$Hsnp-~-_(FJzSKsJ*&c8@ViAuz7fWI(+yPY|TjTtL*$-#af>J1Eoo zo7&sPyiGm)H*d#HENY*98lAh8?(k)lkZZwsLZOfd?JrQsOX ze#Ip*5?w+?xuTUL+mAAYB_xpqpSHWovqY=JImpdvEU5?cb712i@c%DHjZXZ7vaxz- zg}AnWE7p;*UB@rgk5b3cqOkYtSbk2Xxsa8Cqda{x*H@0j zASm%e59_-VXP4303+-HtOufkg-g9u~|M0+zCJ1IFOZ7d31^OQ-y35F7$8Vbg&PG%F zx~Jz(BZu=`62k;BG=c1;r1e_I6jM2U^O{-=ghl-S;fa7ma$FF!wU9PW(d+@8oNAJu}O4X6Nn+V5b%un>}ROWXynSDXd|KR_L z&bBhq^-1$$L_n2a7DH=b$!oivTHr(*!c%u^h$lT_TU@>=T*~8!IPK0O_%KuE72yy? z$$X_W9qD?HShbC9MYsZ6JgetBr>kPO6K5m4Pfx3^!akH3I*QSA&pPpMkHE~6N_dR> z)P-tyar*NyTc2zAZ^F1@kNowpbr>$|b(o=y`XShtE|C>vn3ZlbriXTCkV z(N|>pE}bxRO#IN@XVQ=o6zGVkseZK#-wt`FKRMW_E^ADm^%0 zij_~r>Fd36$!a>=DAZ%4#n~jdu`BH764K{IQz2p{G!{M@N_jFAE zx~M?yT}0c+5-#~-BM@A(=0aLq>^4*^wS^-@)n%?;Txl|ve=mF_M$muQC$JC5o4?Th!jeen{V3nHZN!9HwSe`r)gwIE+zI~s{9neqmz`Xz1I~M z(fvk}GySBPY>NtsZCRPb6Y>eAXOV>dGa$@K@rWToLkRcn6Y)Qbyr@X zq=dEThjY^RurS-TYwm#_8XVK1uKRTTabfVnQSdE_fu&jcG_cV!0t$7RmuelZL-Wt) zdL8f|*HW@Opfv~4Yw#|Zl*jnNAb3kKFZHR>tQ$^`ZLs%We?=PV?GQ@fcUfWP7`r37 z2R|Fe)2+hGIMD~_(s@2NIjG}S+Z>&|_MXC|+M$pappd6Kuj;Sy`JASwZWXN>-^37# z&h(^?B`zE7kOOZAQ_XWoss7F&f_rRo@B)T?j{%*Lfhye|z7Q^_wGLOHs6Wh%s#h&W zm__W40+4r^EP`$ypu3I6G|c#NNG9 z5$wO@XErBcj1@o>(yfF}cj(r+ceI(tiEeH$+`)zypp|z_(F(x*)E#-22BMZS znVE2cS@9QUr~L%C0`95hd0@MfL~xKLF=LV1T5gtfU11{s*!`d0Tp`(dS2nPUt*WP^#HQj|?T7NaE0~^;lDM9`aV^C( z(A_ec?U1N4T>&4JERQ=)j!R5-(Voznz9@F5cK&cq zbWh!GhYlXkFxaUb^LlOPQD7!cF;iLtokT=qDU>h;*=fM7KbupG1IEW>uIP6>2bUL7 ztK~`$`_qVt-%S*;%R4r9Co3lXyZA#1*#q!p{YI>U-5^~ zfbHXeX&hlttNPRy?E@iucAleo;=uialt7GSj{1$O3wLj9ew}Tb+7!eW^*}drXejC- z-+-pieLdGl27URuy=Ivv<^nm^6=pp&lkfP6!@u+l2++e~E zZ=-%JD+X8Y&GwieKEZ>LjFU199y>sKmeyieRaCiMUnKRA?&eT>Qs53VJoy)nieK{Z zg>JhXVIjEjjZKtTA+B4Y90-0(8#h#ZoPd|Qf#v_?&UnvNc{|I!;a)GAvy|AvenQ)x z#)2`{x_!JFt_U?a#I8ICn+WlUR<_;qv1-fG2@6yD9vie=rl_! z^Y0t*42q`@#Zd856l;h^w!@_uGmOoX=sa>WpJFP%JYL^!fUkd{&oqXtSr4;YOvOD8 z&jn0rY5sVj45m}`IH3&Tno-J|nck-#xbHbO!Y)6RBb^*ALZKeZ$uGGZ<}6C02tB;7 z;Zw&!?vtM3wpw#{B%(HNl6uM$KvIWYp=UwRiuZ*1SHAXc;!;!yFx|J9=`@OSf)dg6 zEj{YftJG{l7eD59DN3EOBBmI*N3rw*OBrmY8k+=>)OZ=iVD)I^Md!oHQLag!MHa#7 zku7XA>@9_hWz?UK!7*&!JFm$ThcB585;Z zn}C|-=bvWM(@~{;x662f?uzk2y|%(`Wd?iFsHQ)D**vLucMM%TU2Osh8=7h4n!);c zL4)PHn@k5Wl-Lc4%>afU72d3?cmk=c1#hjUG=i!aSeghzQS*9m3tIJE-5r@hMwJ;Q z21rV(5HFqHMi})=oqmYFE)PxASHCH+Y{d*7@2Q@xiaTo?OtW5)m6!HQtP%kR z?djfgdhN%#*tEbIAUZW1J=>e)GJ{sOQ>J3yP?N9R?H9_2U^J>uPcKz>Y?Dhpi3!y4 z^t{qhQ6_?dWv$B2M)vg*3ri2M+sZFGgkCw;c(dl4yFGE8i)~Z<^oT?0HhLyOXk%}s z;_&E_CYfq5nkDf|PVd?V#8BLAo%-5s>ODkWe`Mr6t|2{E?g0v8i>kb zJ2T_Ybf{=A9I)z6hnwb+V;cfIaAq56|G0e+DEC&0jBoQRN?-`x%NEV?M@hBw$Eh#6 zhy*_y*`~3o7V(Pf9LGm< z@gVesGzsZ!Oo=uatnvwjxq4n~U24{NprhzKP#^bpEajU9)BCbxVXke=gH{wm6&iZ9 z0#kaMtVcW_2H*mc=~!k3wUmq>-FgTzIwZ4OrPM9svo_%XWs}`tl@`)kx~8wxv0)P0 z_iJ-CW;j6-vj&i)2>w})LCX_sxFgQFf;-}gPXiYh*{Tm~`8z2iOyGo}V-KlnTXTE{ ziZ6`~RU2NAdfy>k9y-FLZWyi~SkJ-Nxsx75$BU+)$z@TJ`^@#y&s0)y4fT)I!-(mo zSKppiqnObSTgjpMfK|CNQuxYZW+L5^f)(QcrRTovub?K6@v+CYW>>l@%uLkC?#Rv` z(HfRj?l#PQ-R_EbZ1jBd3X^L5>6FJ(^%jxTrL&?hClQHlKy#%7Ii~fp1qX~Za0+VbR2|CKai{vX{I0c zM-|iDV82{Bo|zrdN^N&~&`mDo_UelM6ispyR{)C5u!f&>NbKix0q?8ioT4*nOhd%Dqrs}0`}ic9 zx3`Ydt=mxxOnA-gZ6I7!Zrf>MDS5W|#~=_UW6zFzwb9$fiSvrGU}e?|>=+tMX|&L3 zF!B~xMzwPUU@3y*v}Qb32Y#FA@&`&~WSN zgt7lx-{XQrO`-WfM@shSldk>MoB?1B=tYir9?hR+jDmKD-$SBUT8t_FUU9nDIxW_VY1x(C~ zH@aeVdeCVCCA##fJRw!O=_Q1|u zXduTqrIo+#gIIadOmUU_J^A?eM5&`~mJFuntlL40!ZqcTcK=yo$6SBet71(u;h*4*p=Mut`A8hcW~-8;FY6>+Gx<2uFO`b09s5kU?3h<> ztO$xMW;nrA&1HvsAmMF>8SorwhMw?;X#_;RDnxiYZtNlt40evQDoqh8N$O%x#SW44 z-9>+mkk+F+#D8_B;^a!wB8hg&z8tNoPBGX=#yMg8Q#m6PxhT%ce`mfebMDMfN~6Ds zw(!>tctS~GC`mn?dwe-!iGslpDnHq!gPAs%`pRMYXS~a9JH8jy`#Xtb2qnfHRRR42 zsb8W9zjqVm14!VzY`bozVy@)~IxC{*&$!2QSRpDRNfk^o_peRn)R9RG;wK|{=h6J_ zWJ}~ZV!!R~wX%HTfvDWe`fjI3B6uH#@!V)fNWIYjm6HUFWmjqX zJy8SBb`D^FNhoicI?xkEmiqUiq9Gip$Pgblelvf%YCs%MJ{^(9*8Q2mo@%%Tq`hJ- zAfQ8Q{TAhVrSPgbEMhPpUG^j6>yTfa?q&hlGcGMTpT>ei;c8OqV<-jHB&Z19nzY*o%KaL<9HM_UBPoO*GK7IK% z$=iz5Rv;EmQz-9JjLok=$la78e{mw|l$&_6@ajr zyll`vsfsg8Z{I zlhc+~>3GE5Q28g?r3D3nO5 z+gw#&a&MOGr(}GzS^D?s#;LL>70%Vn`|ny3$VEZiWF;IZPVF%~;=n7sFQC$+uBU=O zAXj95wlyG~!q4}I^P$ft98>1-%&5`u$M&NjIp(+s|136ID~@sTJ4@GNjtI~m8;M8q z5_g`KOqiVE?%zvO>xnr|m9{;?J75CDUB=iQjLB!dY>}w(b@f)O@iKs&a1MLzBGKz% zM_lwvoN0qSY~RZhO)h>J$`R)gB!_AA#sX3wvD6UEUuD4^^-GSR}IN}_DoS+9(P}-!x2nt8`WyPsTdM+mwa=`>{tvGpT1o%_ literal 839 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 Date: Tue, 18 Feb 2025 03:32:17 +0100 Subject: [PATCH 058/171] [Sprite][Exp First batch of exp change (#5231) * [Sprite][Exp change] Gen 6 - Gen 7 * Sylveon new exp * 702 Dedenne * 712-713 exp changes --- public/images/pokemon/exp/696.json | 1744 +++--- public/images/pokemon/exp/696.png | Bin 1888 -> 15572 bytes public/images/pokemon/exp/697.json | 2156 ++++---- public/images/pokemon/exp/697.png | Bin 11921 -> 45109 bytes public/images/pokemon/exp/700.json | 1655 ++---- public/images/pokemon/exp/700.png | Bin 4598 -> 7806 bytes public/images/pokemon/exp/702.json | 1112 ++-- public/images/pokemon/exp/702.png | Bin 2368 -> 2892 bytes public/images/pokemon/exp/712.json | 4202 +++++---------- public/images/pokemon/exp/712.png | Bin 3586 -> 3474 bytes public/images/pokemon/exp/713.json | 1244 ++++- public/images/pokemon/exp/713.png | Bin 2057 -> 4421 bytes public/images/pokemon/exp/back/697.json | 2186 ++++---- public/images/pokemon/exp/back/697.png | Bin 11194 -> 36976 bytes public/images/pokemon/exp/back/700.json | 794 ++- public/images/pokemon/exp/back/700.png | Bin 2098 -> 7024 bytes public/images/pokemon/exp/back/702.json | 1469 ++--- public/images/pokemon/exp/back/702.png | Bin 2158 -> 2035 bytes public/images/pokemon/exp/back/712.json | 4160 +++++--------- public/images/pokemon/exp/back/712.png | Bin 3421 -> 3350 bytes public/images/pokemon/exp/back/713.json | 1286 ++++- public/images/pokemon/exp/back/713.png | Bin 3358 -> 3737 bytes public/images/pokemon/exp/back/shiny/697.json | 2186 ++++---- public/images/pokemon/exp/back/shiny/697.png | Bin 9866 -> 36989 bytes public/images/pokemon/exp/back/shiny/700.json | 1949 ++----- public/images/pokemon/exp/back/shiny/700.png | Bin 6383 -> 7024 bytes public/images/pokemon/exp/back/shiny/702.json | 1469 ++--- public/images/pokemon/exp/back/shiny/702.png | Bin 1993 -> 1999 bytes public/images/pokemon/exp/back/shiny/712.json | 4769 +++++------------ public/images/pokemon/exp/back/shiny/712.png | Bin 3421 -> 3497 bytes public/images/pokemon/exp/back/shiny/713.json | 1286 ++++- public/images/pokemon/exp/back/shiny/713.png | Bin 3358 -> 3737 bytes public/images/pokemon/exp/shiny/696.json | 1745 +++--- public/images/pokemon/exp/shiny/696.png | Bin 1907 -> 5159 bytes public/images/pokemon/exp/shiny/697.json | 2156 ++++---- public/images/pokemon/exp/shiny/697.png | Bin 10972 -> 45056 bytes public/images/pokemon/exp/shiny/700.json | 1591 ++---- public/images/pokemon/exp/shiny/700.png | Bin 4530 -> 7819 bytes public/images/pokemon/exp/shiny/702.json | 1112 ++-- public/images/pokemon/exp/shiny/702.png | Bin 2274 -> 2892 bytes public/images/pokemon/exp/shiny/712.json | 4202 +++++---------- public/images/pokemon/exp/shiny/712.png | Bin 3588 -> 3500 bytes public/images/pokemon/exp/shiny/713.json | 1244 ++++- public/images/pokemon/exp/shiny/713.png | Bin 2079 -> 4421 bytes public/images/pokemon/variant/exp/696.json | 68 +- public/images/pokemon/variant/exp/697.json | 76 +- public/images/pokemon/variant/exp/700.json | 62 +- public/images/pokemon/variant/exp/702.json | 32 +- public/images/pokemon/variant/exp/713.json | 46 +- .../images/pokemon/variant/exp/back/697.json | 65 +- .../images/pokemon/variant/exp/back/700.json | 54 +- .../images/pokemon/variant/exp/back/702.json | 22 +- .../images/pokemon/variant/exp/back/713.json | 16 +- 53 files changed, 20453 insertions(+), 25705 deletions(-) diff --git a/public/images/pokemon/exp/696.json b/public/images/pokemon/exp/696.json index 3bc9dae1999..f95124e3f31 100644 --- a/public/images/pokemon/exp/696.json +++ b/public/images/pokemon/exp/696.json @@ -1,692 +1,1054 @@ -{ - "textures": [ - { - "image": "696.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6c90e8287d3ce2aa68c9fef98f6e12f:24cf84ba4764bd88b4e751ca1911a8d5:58b7763fb9abdd043e9bfa400cfafdef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 286, "h": 179 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/696.png b/public/images/pokemon/exp/696.png index 8dd6b2cf6c7633324977d7c9b8f147cce50a9bf2..7892c40e52b4e285d3fde9d6d44a8da1068e8ff7 100644 GIT binary patch literal 15572 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 literal 1888 zcmV-m2cP(fP)Px#Gf+%aMF0Q*cSI2o5D@>5A5ShFUr$f3kAFWuM2~M@`1kq0zswR65|59W!ott{ z`uuk-H2<5`e(MyN0000HbW%=J0RR90|NsC0|NsC0|NsC0{}2^Gp#T5|zDYzuRCt`t zn~jpADiDQ}4v29xvw8ogz1{o>7=i8%)?I4KY<8-TABd>ujJI3S?ofXGZ|(ko;)7i^ z9XY>`}gquMi|ST^Z>xv6@ON1p3f(K&7*yPR3J=v z0S2t7M0&<-4lHpXi08o1odgd-smg@sfmnkW)~t3Vy$u_J1P%)*N&Sq+-E-tUu;Do% zcCmO^QHwAP{Mnw*EpS-ka3sBh;DiWsQ3ih>pGcODEDf)r4{+|!GsqAKjxlmLhZ_>b zu}>Hx`29TUb1ZSP;>(&13QfW|mtqy`Fj z!{kUO9*!_6I`A0VR&&4y1{Z$3%z8;{5(jqWi8F4kIAE8Hic)ySYVQfmvM)p{o%yJ} zWl85UhshjL_%VkqFcOSc3`2}Uv_7qNzm7@a#~4BKoPs!jWRWBMB6Um!&jC55*j~ip zk8k>&EyhC%KjJ8~P}rCq;`MTL29_LaF(6WS0SK)JuZ-b)wjl|vqPQ`cLj%tRp<9Up z1E-z^x@_PTbP1HFAZ++y^9wTd$u1^i&;-ME5q}A3J`|c7_%R4Tkg}y9yu$DzPvo$L zqz0ZrvgJm{7$M@Zrt2r&XDr8Kt$`mlS3r;+N(B(=Suy1*$tHZ@ID;R9y!M9c4oL-3 z&tc(o&Nbm9hxCLAor9g?=6;;NdZVOU=`@7%LtVjB5$vOg2lO1CLlW<9-OrD|Z9wf` z{3q>X^+Wt|s0;X5MDUTm0WSjb8)MzC`wib(BfP`YHo(6EeG^{JL*4rgBEUM*0Y1=o z;N=|oV(I4{<5CfpkU-CaXJK@{cd8OS7k)m64!+mSs*pS{(t;S{Py54ep+CguMWd=_ zbIwqw{P|W1&`w%Yu36Nr>Qd0XgQEwcwd$KO?R%?cQMam#L4x$?;pnl*?n{tKw;N}Q zt)hNax8a$O4`yC=^9w;(=Y2nEv8LxnX3?l>NCHuJUj%}_OB-GhqiWpfX?d@7Uf#=w zEvJZGC4lns{>c$L&Q;V^ja%v~h!!PX)xXkI(ZN-DgD^UnpErDyd(6%o#L>b0yg{FP z%+4DW(ZLmYgD&@&o;RqXgZX)bE;^W+H~3aW2P-=|n3^{nq5~RTMsy&}8yFaMbP%3= zM$v&ZZ(teQWpof`+bBAipEn$%13Ii`9YqJ?yn&AqqXY2wwu9*4s=T3y4%RSF`_aJ# zdBbOP;4v7v$NaoO935PgH>h%t$$5i1_YfCxKu!fa(ZL0IgD&^b6!Ag$(ZLmYgDN_> zB5zPd2Up|`s_5X7yg?NmT#z@YqJwskK5$S)2UXEeQDpUjgDN^Gio7Qji@pmSRMEj+ zB06aL{CcBb6&*Bu{%?$aWpr@n^M7gd>!X9(=bvKq z&xj7@8~xuX&Nur1_2}S&mm)Nhm-+mvykVx#uadmT=U3$obA5i5SBwv%yzTQB%Z$Wc?@4B>{Qfu;wSE4=U;n7;wzg!x+#gTrj?Z7*BZwA)esmBu z3!{AG^B4X)%UYF;`#iUp25MDEQ{DaKgV8YO72#9DB}72hoXLCO4biAOrKx!48@XEy;mUf z*Uu&Y!nvgCy#n4-_KD=*zd<%hg5tdbkoxN%l9?h&;&sRWR`_0l&|g1DzSG>ul54W4 z`98nKU#}$Jkh>Nny(b$a+3yt;H3EMI;K7aPt>l%r_?oZKtRFY$zG|wjg(dRGx^eK%IA;%dMe5ZjD+Jb#Bkd!`)HP*Tjk|T5x4BGCxcz?uOEi^mJEEFIo>R9S>=__ zpZxV?uq*ua`n{7|?jC-WnoMIGDx+WK+#D#fj}39VGOk&vXm@QmMMskAubfm?`CNZp zWtC6%*Hu>ebbnoCmCyIrRaW^0{<_L4zrbHtTICn`>#-*atNa3g{kR8>v3=Da((8LvbnYuE!m&E$((`DPG*&4|n$h#ScH=xO@HH z%=_nMCdp)z>}Dq$+075AB54RvF2Zf?x897 z1+99L_UK3121c);=i3e$gR^)F5r;lSkH{XT0i#FV^yW8N%;9KLi>$Udc3Dq{Kj zDHza%#XjK7Z9FDOxw$QejD($iV#Rr!WZYr@s(V%jZXmllyeVRpne|IuJlKCc!v*MEta8A@19xd4`7>b+Pj?h zyqka8aVLd=YI<(kDKAXVs{ruFCYpUZ1L(d^a4HL8+$a5gO$(NCD$dnC$3*Z9=}jnz zM0S&P9d9E`{!z|_6_IvrJjcTB3Wg1TAO9o$$&DvZ7e(||xZ}Mj8P;Pae!2r8#Do!B5`43V~51NHI(m{j8_Plr2al2eVKHxI1` zU70{dF=D!&MF0NI^ZbeBfWy!3TfBi+TUG*?HQdOb>^OuVh9d}UuK#%q=3T_@ zVrH*OgoE%?RTXFR z{@7s*V;~dPf1W?ww~ zai;b z;(P!cLCJ0Q_K{mJTqux@!Her@u8^2gri*tS?_F@#C9b+_YF=Zu+cV`Zo!cuB-M^&2 zv|+t`4XTa=f4vvjIT5%8y99OHM8tl#fA6(2@`ERVU9yYO2` z2IugRXkTgHoafBG$tQZ1FLr*CAO)PunRp4#4V`Z40aQL&>j`&XA)9+lUuS$lh*EIw z%K4#~;i9NOpo%ZwhRdMZO|o^w>^^Jm1&On(#t$5%Zzr4Pf!nwP!+B%q*8F7_n>+IN ztmDtk-Tui#v-|tdXA;7BF4X!ziAh5dJpkB#GHjQUc4=lV2JV8z2LV}^-=38}h!1+P zVnKLE%Fs(C>DBDL61@s?vs=u85$uS-sa`!!Q@GlEhT99&p@DS_k+%NGB?WBDckrVt zAVLV<`FE7YcHF7pS_IZgk1&rF>GdEardhQ6;PK`AWJeHTo{ahnx3X7P>)I?2^E2{!k-> z^qa7g6fwc|4@2hdS>9Woo=?s81E6X;lvL(H&tP?@BF;MZku2X0`l5SNnFww zF(LEgJBJ7tZP2?s`fZV$RJHG<#*T0Q%WZDmsZ6-di{ocL^a6WZH(B`Y@g>N^jgKgBpE*tOv%A_9!?vL)3N0Vz-piUW0s?B5$9Y2$6$ z>CCrf*+-RCuY;#Z_&5b!t02rBf82yFmVYP`8zpI>^Ws-)QiQIK9J8-Swtv$c)3`Pf z!v!2~z5bdlHMye50BVXqQA1c%hjFIda-17EFieCxT~bJ4HfkrO!zLukX} zsX?xCVk&pqmL4}R?jdT2UBM*l05lUw;`_suC~rH|J83!Z z4H_cn(-y@a1n$4B?;DKiT6&h{o*!AXl)Pz6*UNWVMNoUc8F(eJfA~GGzQn5+Y>^t)syRa0wb3H{wwz4aS-a*PYm>zb3T2*z5$5$)oaOfxa>O*(# z!$tB5PVa_lV^Q*Q5;`Nt#~>TWOQ>jOkKOF2+0pCJRfU}u6xynZHD>eR>wJwOf{U1Q zfY4~S_Rnqhf=E7rVWrq|{8#E}d50V*myd@ELNe=Wl8sh+oRKEGX>U2C~n-}2VP@NiK^E~|HOi>6$DpTnvV=zq*@Pw?0c!1Yv zKUZ@PPo?lyeHK3jw>2pL6R|@X3$w%f@4{M_W(JeI+y=&m>YAhsqU<2IFb{9)0-_lA zN)_!%8C~CPF}_z46|||G*NM9j4vJ@=i=VDY0!+?J2gN|P7nV$k`uVku}radKHR$-U~Lyhvmy zn8WS$dj&DgOhetwZ4}ons^tc-5SL0!IGOc1^nvxf9CQhOfe_~p4r0*Lu0tevUm?4z zpG!sM+jgv2AB|-`W+d*71Y97w_PV|rfM^QDg;*48p7lP40sG*xnM`LtKlX~V+vuHO z3#WQ=wxrdlP_E}(sFTu($l*`TD+_XvHpEs`Hp66axpFo_40rOMhDB~g)vdo@G$gkH zln4q?+EU9sL#rz}-qMa|gw`O#X;uDZqNbw5qaK{HB}#SWu~)kTS_)dDO^9g|$^7e2{*# zMNwQjj>Q5feU6$M6XP>B5608fM@5ruu^Z){nU~`tr`AcR(?i)8Y*rGNqX@57wxDtj z=SytqXQ9r}q~x@95k__r=MoA^qnY>9MJ0tx#T^mh>bm_>XZ#Gb3dd)&?$Fv2`!@B- ze$K-ezaVx$aObJ_2=18)V9GR`+>AuZS2j$!N@w|W;X$e?-_<5!d(!Qa5o+Olh-SZ) zmg)mNMpc0|THhU%cit5%>HvJ4@eP^#G{=GPj-<=!t5p4yoP5~ntY~}PyY2fPh68k8 zQ=3Vch9S&}ss<8FtgTwAhhzAHLA8mKlj+n5JHN5SZ>5i(4F(6G}QvPK)0=+1KB^ zo0_75uibpseCWXNQp9vGa>q5~@+B4Tk*M2F@iJ2lLp3o;-rzZB%n^cF=55itpp~x4 zuf+$UqtvPPR&^-LZDH@@)=t!&CDZKRKm;D_wtrWS;>AN|%!8!UPo*Ua&yT?vAZavZ zpqHL+53b*&i3DF}M(9S{so;hA9(K)&76W$$jD^wG>VgBpTPkiH0(fh$n!#a4pIVgT zerE{nh@Cp`_kqDR=mUa#c3rZ&*M3ccKW;xBh--tG0XZ~m-JahpX%O7##wQ?R!69hPfGS=B%;Isc8qw(D(WI2XsdDaoOXYXarscM>^Y2+LDGIlH%7p zYE_uE~+c>sszwtzpkA9UH!q3NV5!9n!d&IT!H3dp>Bjn zXh2YyPQvSDaEOZnVcruKt?}pHuJ-CKs?dHd-@E+Y{4y!-8a&ZoqWeIxeP7=+YZ5C^ z5o(-50X4-Syr{=#XXe$N1BG>>569OAVHsa()iwOB9>aZNAWMM+ZI0uoy~A=mD}S8HJI8nOUPHG*z5d& zrUx8T!F+<^A{Ib0qkI`XQq1Yig;P*8)BYl_ge-?OT3^S7L|NocA_MC~uwEb*f>G@0 zjQRN!zc6ZwqTk7lGhILnrggeTgsGC0vZu7jP$+wtqD8KseT6NdM6pv3CNAYtuv0~;IKj8O7j zoa!=!a|HAC$A1h}AydwqB2PxHPATS$H)QA;)WBLnBa zJ&YR4jmNX4@Jl5;w*i3N4{^o7-RMwJD*xQzC@DvgzdjwzkWRyv6T%Lv6SnW}?wDPeD61=<;7^>k~F?qXO-yH!! z?&w}Dv+XA?__}RYm^&v-Ka-q+cy#Sq&pTd1!D*JY5>$J+>)31zTsU?Y7NoS{fAU5 zkMDfByiB8uKjF{51VsXZcH?2xrm22FeJFlllj2mMw_0he zQpJWzO}XgfAeL%IjYb@QP^?e$c3)7pPBo4xdX`(>9s0O=NoA3QqrQkL8q7&UJr#c2O2AXcaT9Dy?B@W*_bN2bBWj7rcv@_&^Q(`9QK3^3-G zN}wHKrR@Kj!m2}fhIE%r@t#0KebhwLUMIyJ7v&IMO9%1+ZNBWBT#okio4j{-v3Abr z`3jm|7{~H8T{g$i2Z{C`l7|{MRYfzcvl$!&u;q5R!_`Dd!G+3?Mf7kI2Kh<*D>bw{ z>9wCZ9Q|rSs2a8)N!zR*0U!+^a{wlP_2s&)Pj#_og?M>#=rw=bJ=-qsM~19gY1Scj zdzSKGJB(6f^VQz8tcn>U!p{P>A51&A&%>%ctr@# zdSzr%p+?AD%dnTqPs?xt3(cPOlFfp4w;`vmw@7cHrgy_V%8Yfhp! z`4uP=$jBDXEzxafpk~nJ{5T8;_+u13yv}?z#FjfVPBf&njf4EW z|2?nA79`6SQLA9n;w}+{dR74xXRB`#UltMiE?)N|7{r5TV3-vBf9>Ju`#^jYjVb@j z9n|yF84>VbTA#uX#9#b^P zIqDvigXg>JTtkK>+O!9){?y@1XDSF8`$L50r+8wWEWbKwNYnU#2%aA5IX#NU&~UQK z0EVHsi$xA>^SG8=aGucov7SA&Y>D0-hQ%&71?>S$=vS;3)<;Zczm?U@PmTN*rCIwz z=39>K&i}crUKsJ7R0lpY3x$^U;yj>OfLAClT6CEOj}bGuE+N=8NWal){MGugtlun+ zmO;8R+6WIvYcQP%(^Crr)) zK+7k=D&6tP3MUi5z9pZLyADX(eCz5eZwEx16hhP6u|?@IVMQ_ zIkXm=PwB#nbx|k6bIq~o+zrfe8~kH}bM93g6qgzL#&&=~II;ufeUv4x7aJn`P05S* zAYGj>0JgiR^F`EYN3?i+IMBbm1Q6wKj%DjExI7TH3emR6pI?ND1es}~s-B$Sn6<2Y z#K5D0*b$)yoXSHQ`))ZX3x9W#zxhCrAqA{kKbQ#qy?jygkw4DDu%*G#J(R;U53}0v zs9SS%*2yko*c`VuFzHH%eIx82Z`IoD8|x*dNJ2Bp+szj%W)zAOrX#ahvyc=4_0A6l zg(W5aQ%o1&-<~IHWp2xqhVVqfS8(UH0xxV_FG6SkK#Z-XGRO^>>vnUf533-$#_y*t zLoq&D$R+dX~$}BnU_%&v%1fI&D_|$c~2g~ zrmwkLf-)@g5rj=*zsk-+-IwS+4n-t@lCNS9)z457$SKZC)0C<{eZoQS4(^e$b^a#7 zt^Xi?U;Hba>ATbY#b9(r?;G+CLnVUnJg1k$EZ6io0_nyjyR)S_QHqZY+EtzIZ}2FX{3Q-(iT_!h!?@`kms#VRC0HYNzS^g1%RH0BD7YV zZDPQ4M zKp5Co4xgJ?*?yd@2UGKSSfh18vt|pkx0J=#rn!eFj%HWi%W|f=NUH&cJVv;AK162S ze0y%ju|OGa|65M(wZ@nxSpKzpl3g=>m%mb)X|E9m$17pDCb?v{t5u1qDyPj;Ca~S{ z5Wp<0ZhM35xFj6HyYX#NOX|Cvh3TN6u8j=EtAlK`j$~KRhubnDdjD`G`r^RGm$3gAm}pW?W@cAv4Fm zG%r_swY;z#UQt$D{A}vwM}PR*9XL@wqC}vs2yK8{fV9_(ie!yK`XbXO_gA z%?+G~32>LR>Qx>Y57z`YojR<~-MwZS8?|RcTa`gT$JF>Uqj9BRSA(7nxXwI*BOo}s zAd_i=gg@x+@ZHgzakxQgkAHYgl3lw^_A9QPVFY5JgsNt9Rpb}P9jbL^Rt6QX_i580 ze~v@j&gFD47wDwFp{)8qc6pC=935Q(knCC!3vS&y^Wnh* z0u^_PAFMq}I;hrB2Nwkr1FCHKwZHO*GD+rKV-6ipw?cnfQ>@}{IB0h-iG$KG-%lN) zxo9h-no8gbU?VSvl|)eS@5N|2AG{5SL0aDNn^Xap?54+VlVilS6J*!b#ljYhHW3f9 zWu<6*)T(Ib;QJ+Y2JWzhDKqD4&!sj-1WRdb z-27Ysw?vuB=3cz(MV)5i{fusST=Acy6qiy_v(UNk;^BV{f~58ET3$3l6d^of-rujT`%25n zC(O@9a9tRU+SU0ve2&o=ma3Ku$L2WJ&($RGn!cUDw#Updw=hIsIQ?9X7^w6Kqu}N; z9W!MwUW^p17jTWy7w z?;bF|)E%UiUcumbXe8KV$8l^HT-ks&w9b`9tBJYx-7Y6jn#G3l^~rXTdB;^$K`Ga^ zEzj~?F?M1NkTJx(+(*BB$3%;2CIbSD=r~X|8ej@B{&}*WKx_fcew7-3s4cj}zRQFY zeDLa`#V<{#WRBLF)9|4sCc1Dxw^Hx^6U8{2-a?j$Yl{ezgPzQ#Sljs}cS&@EE zmQL#y8yks_9tqp29vNjGTGxbfnC(Z_XMKaI*~y1PR$P)`X$Ix$0i3N`g-KeVg00tA z6Yi61$JnZ#m)p+fxdgb^go`QqpETK*LB`Si?e%-dpPB&ikA};=48PeFZp7Y)O}QMD zFd&9<4bgV83Rb|Z9$&>Kd-GL;Izq$gs<+g^`It3+$*LL>fE@dt&Chph4zjS}dW*$N zb(hFeyRv2L5>(!+4v}DYwvK}^kDtSnNvhkG&u{k;EXPW<&+`e8(D9z%P@nWPr)G{u z@Y=vAEij7aFrVskAbXBbKwA*Axy@B`{g%I35tiX8^1@HmPL7FBUYT-@)53aEh*Cpd zIK`z}zSJhBdg?Um=(R#1M^nS@LhHqF9F%%?xZbjG)B)8LJx;6Ypg2goU8|*qZ*%nw zgTEcPO9w@Qrk+Jlv-2oUURzk0*heLjl>j|>bI=fJCn`7Ji@V0b4Tam~MQmKdl2D&! z^wo$2Zy86J=QV6c`_ZmIBA#Xyf8# zXnYjMO-|2k|3UUY`yd6J{qJkVK>I<2qnbZk66n9=XV&wy8&EghYZ2V#TQK+=!8Rcb zDs%HA?$omNi&%5kMDTLPHI*xK)Xd?4Fo6tI5ASZC7>VZ}p~;}137aqm{(&9FKky}V zEp!#d+~DQT1n!gMh9Y%wkik^{UbZ!*fcVu;3oJ-+bfN*!`xDN6D|>3Xn{DpWWI~ z4#GJLIc@BE64@G;v^vZen?Q$=(c^bq9fzSTYyQT}FxGVSMhqH<^mtBO@T@7&e5~wxu7jGMxmA>@c=b|4lkW}*h zh`ZoK+~NpXuJjAE_(ft^4J;iB=x7%>!3wwta?(#9c+V$Cvg7O8rSfH_&K?)6G$nuB zZWgI~O2+cbbbZdFN9@F!>G`T&tNQ4Dq}@F2FFgX|$S8+^fS8l{#iaVOf@MY0A}N!} zsMa6n2FjMk&RQ*@PUt8?@uFHxvE+rWq}50*bEd$;vUyo=;u>d<>918VRO$__nsT42 z3U!VO(eNaB(PR{dWN8j0h^s!(0hfdg=1@j0rDF0_aD{oaq&+m_;o6ziyERysx(_{@ zBG{3$NGH=e7jfG3jM~6mr+FxuAKNJ*NrSbu(O6daGmHBZcj-wj1*XiYR(;9c`;BQ4 zw>e-Gsuq}X?NF93r3lsxct4QXV*ngT|Tga4A25 zdFi5Lo>Z-x-%)LKVfezNzc+q&_~Unhm!i#(UP%5`EiIx!B+Ss$q~YdsahQvqy3J{O zbX8nN!L~kgcl4u>pp>$VPJzG~u17+$ZAPdNnoxM%$(_@emtB3AQ|5*i^BGq!l7ewSpBUg7({6Tadc`cO5G8|wTRlx^$9 zc68mDdqXLW5~=**p*~+xQuSsi^F-(D=vMf&VBot=?gT>d7?T-z>7uE>-~X%%vzG5i@oM?#n zeFV18JNQK@Jp)TI!|WbibplZB147+jC-9UOr^#Nb7MJ20Z~vcKk#-X*iD*5lPmIgvAFB>6S^KEmQS{53FzG!^pEJcVQxcP5+R$5m`Gz@PfVZylO7 z9Aef33g|=UeB@6vv6Q*z&|*}TE)jsM3fchhC1y5ktaaK}w~#2v*-{D|GNDIXr4uE= znV6euRw2skAJKJkq!CWZP<5&)u|F`v06S}M_ zAnzvsV*X$L2I)IHAEVqs?6*35pr&-x|G+clM8ouoEDS?|7D$kwYacgH+F2z1y>fBOaeqJ+t{%SSPZt55O+ zL3zshKnLG;#dSFzk_V0Sxcr;Wao5FB=v1Fc5|=MZ`+@GkF5ttU;Z5T9$_G!;++F}v z{=o~D*+`Ozf68p2%?J4pc1Lg48;PVCc(Q8odfyyDRoPm^9l6!`0xeh*x_U1Z7Z?Y* z4Tm)Ov_uXfb%tivD&rmZ4!U&fd|o!nnXTlh1$`YSiF_-ME9w*P+M@vYn`mrkt$!;O zpRUt06@*16yh#8UB?`1j#JQh&6>P<1lp@hH#TclKlsp1B29`UrOr-F=rQ`3wv$RLaf!g2BE@7x6 zcb%=x=hkjzd>&Ug`f^9}G3=|Z$j#5_fpR>&;~E4LJX68**tC+SF;`+THm#k`Ii}R(_lnfgvuck2GUAB;M9cBi4?BzdvWtIvrr7 zj=Aj-3Fs${PYsh%4lR0xbKrt>Yi(iaL?-roTo(V_&&_!a-ap@ z#4i1ov|1>-LZ|!ZuJ|i(5bBcFl}hBk6TtDOIQFL2UH|^F-YE8XzR`RZPqa^uN=TkIQ)Mu4|JZC0{Y35?bLEST{!2Y6`0c`4ad*!}#(cNk zG^qY6+>xFodovLmsNd>1*Th}zE+FWX;%RG4*5Z9qP9^?Mk0yeweI+g~c#Z;vcR`vh;^6*$E)EF?nmi!(a*%mQ|7 z>gt$(b$*+?VYOr>{xAH7C|^f{l^#>9_Ks$*BxQnp^yfcRWV*b~pjtbrGd->TZOK`` zRj)xhbBag1R*dfU%RQRJh13+@!g1w38>?jBp#0YOo1(5_Ewq$zZX`j5dal}8qpL>gP-&cg3A z;V;=o9D-^r(aMYCos%CImOdA)$v)9^#Eyhceu`05-7}zq{w%tIu)NKRdTrDyIE|dK ze5WdEF1PGw?DpkEM!iF!x1TS(*mvS)*}kM*CaZs5zAIa1IsFDd2;IPOQx6rWF&ke3 z(4(prsyku})NB0)YCfZ%W1l7GnkG0ZD;Hz8*qR}K0-B7c`9hEfEQz4sudwT zQp)4;z|+3c6$Yb2>CCCOJoUy8Ry=@B>kHGX`bXgdtJGrAv)9a(I^&AEg6AR9<}!F^ zuZCLPdo?y4M}qZxt|kYaJ#CvE6TGDZ3mJL6@3A3 zy4-obwjMON>r3sQwiow{;4bPA(?+86^=Q%!f|}F?{+VofOw;J#v)B#hqD6 z%TE6x`s$sOXLE8_af#3SzTtaf$=9DvZbr8sgby;iK5o}bZM=@KWaXl9>o79)Pc``E z9!#dy+V#sb@%31j%PMr)M>~(Yn%X9r0hjn?S;>wIZ zldLqf&gwXhq^3+%RlGtpPNmv7DkaVA{yuL+_#UkR#~(h9yr?-&I**hei(%h+ZJ#|L z)x=uO7rnzFx$H)frXe&d(JU630CLJ!V_ufBvD(Y%4j;aM=9_s&(WLWM8Vy@!H)To? zv2y9jfL#AEp%+G9S#gXo8(TP1t@sWxgW+tPYyL-<;`{Ua2~WE*0BuV=X+a^np==0s03eO771{`e?w7hH14WD$ zMUGySUWFy23sLZk@h~if<(Qpw>RYyVyTcp%WK5gLwRVojYeI{1*sQ#iZ7)m?2=rII}%dej!v z%XLF>-hc&AR+l+Iw@(`sh*%EWBl>)P6W8nIchH-NSXgHPP8n?q!)OIFLU~^}YaEX% zKmyoPx}-KF5k7y^c8$K~6gX-p#S!o&&)gQXYIJ!>R2i}L>wIz|->}N1I2OO&KjBoh zE3hZ@KJpq!0J&Z5$2tpMuluZQATE#-x8AkD2ON(Ce3ej|E7KHz%0QX_)aVgMsbFd2 z`5)^H(flbYlq)*viG^f9!=z#e@0OR&XY6mkzC2iTThvds?Thy5aH4qIT%RXYD`X!e zon6^Y&Dk|MppkrsyO-42{;F&m{)M#TOlxTw+tv?!isCWXwKBOk9z_mcgDNaJYImo0 zd#>3JB3a1~Qyud&8{rqn(ZR#JJ5AY|j}K7n`lzg?=eyeU<(gvs$VHu5GF=W+vqNtK zbbw3XQs%l@lfh(2jBZueM7P3?t}PMY?}yufU3%Rd?BaK4b!F?`V;;naPW5QjmhDTQ zY{6#J(G*GpJvTYur_X+)(L=%6uUfqJ;gVB)z~MNye25dH$GS_zvvvZ7N%NY%@{r`1 zpJ23Jxk_BmAnmv;e@;kN(zbm#uo$sru|={^A#pEy7qKX1^kliRC-Yyfs7lOwn6MC? z5`a1TmMXsTK5M!)xj`dED*=oFz616>hp^;}%r$f}MF*%DpZ#-Rc@f$LaEp>Lxq?z4mUm+7PXw0oXv$dC2hu!+1D5Jz|K z1(#C04hQyqD&9HIWh_WiyfG0)(N%S`o-*)ZrT2NMcL6=l!Qz%CatF&lc~`odzt~lD zQWLDJNg9aXoH-PNqOnOOXs9_Ca`IL;6X{S;a67RFXiQak$;iF8>-0C_K!xNB3)w=6 z?tl}Ck;6WMw*%FXCTR63o6deBM_W$<>$}VWg}wh)JjVVsv$QlZ4{y^mJwDAd`*7lK zCjRFNRRRyk4R7I{(JnK#MvW;L+1ZsTy1nVv()?9zsSsS4v`FbhlRJtNFY!#KxRsd; z<3nQ~z@mi}&mS^>Z!*p@0uDCzfQ;#+JyairmZ*4wEK6?*ci-eQjH?-W>L+P=V#y%> z3P0IG{I%Z&W_+zKuIK)z(zu-XAF;2=tnrshO0>Ai7Xm-v?gtg{tdOvV&~Tt$KJWge zF6rZ=znq1H-=rG(y$d`MeRNzKAFaT=Dg3tLt9d69$8Fpxw9Ld~z>lzumpf|)Xy-p4 z#-u9kZRm$YDNc3{Jh^U6xpitlA-o{_kzG?6q~A_UOP(vko1mgGR$ zt=!^?{H2=5L(yXVYU?UjHkzka;RT{sw;4 ze+&>7NRg;EQh^SCGE=x)#p*6P6H$qJ>u}d{rKs*~tns&L;=(O-q6#6PTg^V-o$ub+ z2c`Ptq!H9=NBUeR_S%PQi5_7P7njdWd8`mVb;2o8P1NLJX=-4z8;$Kvmw7Y=kj{GLv;g3 zr(ibxfv>f2SNY+r&?bsvD)CLN?lMkRk4WVaEo}JVQ;X*P zOEHDdswzh-@Yp=H&7-Ex+)3}a{%F$`2My)?TTr2RitP-!odstE@MV~wwH1-RzR3Nm zYNQZgX^HD&ssp4mHQy#SCN>RQD0xMCQ3L(Hi&?p+$ZPN+Sp5fH0C30Kz+AE2SxAqI zdiPXnoL>BAI&z4ECda5w6c9mN;b>oq@DQ#YwR&w7J{T#gYjRTRlO ze|Ol`j{4%cP}rd|$xQq%i$PryWuaakW$9=J6|`F(XO%diKgXhg1BdO80gIsIuZEz?D-va_3-gJYR$Ti&}}tdh;x@xN}rXjTpE7V_6t`-LgDkG@=v?P z$&o?Yt6rj`d;HyjP*mI`u0};ys){$KG-Z<;4%vS`e+eZY`BZEu++OG^zF5>4Y%Rgt}`ZW|zE;HL@?B zz6M_?DXI#hOX`FE+JFo0!kE^J0GFroKds2)!bxC>L_Q)`6eY(Yfu$;c>_|j$m-xqw zDMi(~1v)2O-nNiT5*&XAt<|j*8B2f~<}zk;V;E0_*+|6+W#a2GB8cBLcjs-gS#8Rn z9?6C%64;xnwTADfqD&qw3C4S|LtEVK?#Cg?hsSlQ)1Uqjx!J0Gy?irq+B;)HZ*;dy zP1iqOb1*g%!Ax^S0Yl~GtFS&%wl5SG=SxqJf5_uTR=x0bDi=A;oWXa=nPpUS+*3_B z!jbSD()4>I`MFg;6>U>zQ#WTl6^9rNXwh<$VzB=RwmIA>hKTaC_#X=JF3U+P_9&V> z-NoEJXTP=68BQf2=1l%MVU^pQIZ;A)O)&QC+`DuBo(J!(>v`6eH=(E2&vccZc;l~! z2-t-wDMq-MZNCkA4V6gzX1i(2Y(V?YKxU8SyqmNnTg=T0i*xamtAs2BI!jWpuSJS0 zA8q34R^s)He^*iO_;Trc3eq7JFVw_7=XY@$33jypU zTbW@PtIoaeJ43Gz*UR(C+0uTG1Gq6N{LCu=j7O)5g*!MIcyD3`j+yH6)&ZI4?KT}1 zA%_k0qk1(vdvV_~j&GH{7e#(`oDOQLOyLBS8wI4?^i!#4tq6;ZV;IQ;jL@vIsRsQt zVWG7|I>|eSM5vC;o;-^9ig?S7YM@U1d7(nFX`Vj<^npLp@x)c_At#gWsU7m)CpI^P zFZ1PpOOMY^ix3be1eE_aCU-qdk0@+QD3xR-Xw|hBnkW6zrMtwq^|>klh6m_!4TnzM zIfg@hww-alpG6Hb#6EuY>3In~5C^z4<^Q8g7n}4qhic@>Hk+RIj{1 z7OFE}zu_dH_L)(&H$)PU;V#Yn0_*^Qd^fMvo~n zN$BzBgtPvYo${`4XsLTA>LF`t+-%fdxr}z*zwPqy0V}nZf?E16uevw7-L)!?Geu3- z=+Ko^>Qi*G$hzWVP9{Uh^F}R%B`-o8kCAG|t>}7Ec|tT@%=} zWl+3N5On~dv)+GpX!J&}ZYc#PI5R`Fj#OxJGMVql+6692e``q4>je0JzcC#k&rK9{ z&;Lo)i58MtL-$Y#?YDWOr(1NLBP?)wsx05$RHD zG^68r;wA+0bdNDduKCBWeF4i(-v0dhkcIzkUZjPww5s2j=Gd?nrnWM*a2@MFPfnY# z}tD@O`Sg->9>oVVH|?(9nxXokFNb@4j}OvMzz#IX3fWGlP=| zVyBa>bo}wR0|YAD6lL!gA{o8~`Acra2B9xcR?%*F)lo=ZzPxsE`W%=L&2&ne@a9Lj z#^jF4n5=%}l#tqTP4(fasFJDe)@fwi%CQysEMLIZtMJ9&7QI!6d~521GR+x&*{NkV z-_BcI_XC-h_d|73(FMv6v<59fzc6*Z zK^`&&p0SyFbv6|IXv`0JRgCo?gsUnz{=T@ZJ9){?Wz4CnOLVP8B1acaZzo_o0k_Z;meb@}%a)QUr+A=xWuXZ6?_B-bT!`G`Ogh5`T_WUg0PT zmm0GgTr#S6cd|96>62+552CBKA;@kL->OfgXDT_tk11T(f5TltzV9Kn55E+kBWAky z22BSUxAr#fiKj@|S!+^37I*t>4RL!>wHFq|$q*_1u?RmVGlpvA(&*A%IM;kv_uZe8 zi>+JjE=--mN_f>vIC#3Erl?NSvWIA^0Xv*)tDcG>&w6oT=9~V?UTheohyvj0o~z%A z+d-+WWVS5X-F?O?)D;t*z}W`Y&gLvg@3#wpMu(b2 zHEa7>1xt0cB=J@{+5Q6xefbXjuP;FTNar-eTMF~OlUiGaq~-2YUV4Uh>%~fbODv>M z0nCOL>_M*TBDYR0A$fK<(1Yk*<<(mjPy>U%GgNVAF+$4=$ux|C#=H%Z{EN7^lb!QYz z_Bg?>9qIL5cTUDcw#N%f_nF&uGh(wV13G8(WO|{m6TL6eGPK8C>2#iUcK{ENe1~C~ zInoh-06d8(&_iNM!`n?989@H{5c~~>-XkMsEM2LEY*PwUtM`dMcnEA z`L4ZuL0K6f>e6aEnql!aa?# z=4xVMLqi*rkPX~gM3w(fgf*WKL0uJ(SN)A|xo0#eYM>3b6djD`c;bx;KVp?ng)duGtdC#ynV;@JHs_?&e5 zfdQV(ANsdO^ggZE%>DP*vo2Z;iMRrz=Kif2`(2^cRF{CF8ic~s?kAv))US7EsAVd2sdfE`( z^*=}lhoF7`yKCf(x%V3GD|_>3(4vGYd%#oT9OrwiL9kl#Iz*-F%BQ3z4t4ga33<(F z$0vlKIVB|l<Vc> z7-{`<58wZISE*H@bi8P9cf2^awC4q72QqvwznxhTZlJg5UqUrELwjG zDyoTxA5PTWOi3TL!He`ix9YXhypHuTTO$3PD9>Ebn5u;zKmOR}5dK=VGLct88rpvF zt*IvD68lEX!J)438MF9=U+bru8F!@wt6QC6kJ*5PUXp}<4n6Jqz*oU<56uHrx88Ju zmvDwD%;reRuXC9ThX@DYmd=XGif;Cdyjl~Jziu1!<^Q#hz78pPZ(xFLjljQ{Y8dLM zpLNss9d|dpFhAAEm7Z45O$PFjQKzCz_G>b#prf`A*GJEJU#9%zbi-cPKAJi;yLQ1$ zOGqX`C{XlOU$a2FEo%WHnz!|B;r&+ZAS4`_p7RH2;f+kLTi_)1v!9btjycg3;-MrdV%9`Ee?Ww*3 z``UqmJ5q`_qxT0u%dw#RyvZY*8#V~pA=1dq`%`@|Do^+lN zO;GU`2afUou+Bb{P^>CMj;dn2Rh*hKHmroOz+VYIONOoUrGYH=o9(8_m0kvYrJBNw z8O^b<-YIJa9{ibErN4=G?5~!LDZ2lP*lDu6*k!B4A#>+@cz5vX?xOIe`JD>Aa0VwS z^+~Bk+$xR|DQ7ztEI4|}2>P)!h79()e$V>Qpr2EEYg*)0SJtgMV9x(U0Z$F}_{Xp2 zHB``q@DCZBdHok_!Ktr1PLGx?{ersRXq({93aj&5Q1S)7)LZyC;70i6w2tb&&i0n% zufZYI^|fBxbk9R%ory-S){+aY8o%LIwyxWXtw*?CRivuSX3AZVbXzpZwAze3C8~^% zE&QFY!C!+f#*H2z-$?C}5umW|T%7WK$3z1UesmwHDA^{GZ2ub=%fPAToge8F&-Ol8C zWVncxVGH)crRr1whlJAE@2<)b&6v#@R?+!w?kI14&RK=sLQeFiGJ3Q*;20$VDW7_& z&8IHEo8D(2odI9dBckM~H1?6}dzQ!f|WVNmrB}Cd) zPuxA!I!v1DntB{icY;QfFAqnb@cAO)>Jj7Cs+5bmZKr>V7uhys_~(l_rdzd9t5f7C zN^zQBIbTzcSp7@D;R|E#cjo;la8JGKe85X2L=k)>|LREaIb%NWO5S{}jry58*(2`K zSq+8_EWnn)(`IJi$^n2Z{X#6`QGX>NZ#X{vz*=1Kt}5+gtL82FHlN_O?|KNgq$cLt zB3cTO62~W%w4Qjm3dC1rJ08{mp7hp2k-x{1caG@{${CKwZeC_}JV?DjOZwRU;U?2# z+6-`Gl(#`cOe$|hUTs~U%8oJ)$z)ueh~x@zssFjIc4sXWQrZysD4Ot-t*<(&O66aY z$N85EoP$~)P0*QQW5h8?Y%b|shs+EfAEPg$2mZ73u6pRa7>Nol;zE%DHyeD=5`Lpa zxgV1S&W%eD(Cq=>z`mNKA3D%3CHY>KHCZC$2KrKA|4 zKIh5A5dn5a3k!!9UU2(UU3Hh7@&qXZKwGkFz3eyL%l~j|4lSF$D!c8hvTR@Q)Tpkz)jthc*YfMYryxe>MeRpg z+9_vVgZ7V~Kx-cdS{LWI4sGb|1I__K@#0CUlY)uU_$rW8ch;gCR4*<8Uzoipq(Hw6 z&vDhJ7t#uT^@mJD5PIe_wamzTm|NJn06Ed}L-uAtFIM@!ciEbqUZD1s_;%*arh-$V zGDg`=TcN~EXU<}BjU(PysDL?v^N*YpF1@wA@eouW60h4=b%rsB6f`@B-VIs43SYj} zQ6m}m4Fh3_`-kw(1cW2Qjo{{flfs<5qhsoHRpX;U75|P3H_E+Y)Z{z12G<*{x=?6& z!z~30blE?gIZ9JNDN3XLa##Ir4S$Fflx~6Tzco>AFVv({lq0v2DgQcE0m8a~3g3pmnN^&H8`f z%OH&r3^rBPKCuIE1a+|~xFlfjm3V8$630y-$%*v_ZdCBX944th@mCEvy|JX+=0^A= zY>hZ1Z~X?#yB<_h{Vrd@g8ZhNW)+vJ16rtGZ7bJ(P%M;9}?)i(w?bBX96*T&Q1L|&iNeL;b@NK z_YNxxBf!P1Vf26X?i5#2Cwdcpa_yuyOdYXVd@5K`c|GMgxi!L0QW|Qn+AuaYqfT*( zK!8_$_RuDt>v#-a8#J=SS(cv0q+v2)eiQi)Oi2v6IG5GYLOAOGu|%H5P3NjGa3ZvyM-T7OpKWb^Tw;~*fQZEpPN1G#%!oO0ucLP--i zmeY+sfDGr&7IPD#XEY)+ds;ouHSF&+wP7cXMZNDwWKdB!87%P=wnLCNG+$tX=sdwL5f37;aqG1R>Y!;%qi%aDx+0=qTyV-#V}!d*FV_p8WVY;i9zw9YOx?b4iDaVN6+N%d zC{KYddJofFCK~1F4SPFiAVmM9q4Y)v%ggmqwmZ^Jm79>e+AiCIki-~&9M_O`A4ALO z7l}@HtkzHdIGrGlW9dbT)QZCI#+*;b261`N?Iwu{RYGD5SQ5=9l>E#rgbctML zhP0!WuP|sCYRO2E!trzI`Qfo0%Nv;=8RSz*J4oehVw)w0>JLu`2_X2ZRiWi zs}V;B*gFBvG*jt!*w87J#MjZqVOPmVr}e*>_ppPCDM&_&D`R<#_m1?7Vrq@rxpxUPhFDR9=pu`g2-_{E{DaAWzH`( z_KtspHzoslJ6DC(*3O7Lf}eB%tw26AT>da{J1e9YD(V^)MksLfK61H9Wd%sjAPd*>C9{-Obo5!ShAe=Lu$Poy>oKhe zE2V#)owF=Gq`$cm5s+z79Qq^+pw?91^taV4XGs2MV_il0=ac5wEljs7=o*$^l0sQT znMj6;hN=w~6u)HnR0n>TkwU;tNa~sw2-T6yK^_=On%dt}1AM9DWfNvQa~R8Cmzt8& z4V}(@%shsD3_Z~=?nY42EEWf1yCb4&cle%`FK$Ui;?m4^;fcI_!Pk^74^0kb=Ict# zA}38%x9CEu()R!X4%DK+;zGgLe3Xr?%jhD0czxcuuguJzd3StbuJ^LU((Rcg%_GL@ zEZtE~RkZ0pe4#jb#L$H~LkWR8o{*>jm6bNA8$Jpk-8T8-cy&+c@dfb|NfW)x-ji>s z7;_zWGHAjB1gef1^cu1;Z31wf1)dWXLbEv8eDi;P(AA=XM6YrGr$&6&kvo{!z$7rh zw9FAeo!d@QMk62ApR*t^N+_-Po$*TfDTg=AfOMfN#wqtby41+)MhH@jT; zH!})mTPhQLwI)h%NK&F(0Xo5_ick*fW@o-wV@H-Pc~)@rCZ0l6mHuP_DL~ULWvQ*_ zEBKF)oyYpRyUu_Q{uKPe>Nd5+_R?Z4*3loV^m`tuXl3TyS%Z)O{@E@#G;QRkDOtle zU)aFeA=iS6@Q++zPE{JNl49btDPx<|n>2r)VW^L>jC6=OQsEKC2QlRg#Alim0^Xl6 zU}5VtKcKc6k);4?0^?K42=M&hI*20?L)0bvVE)%cYQD~lO%3bMj{-Fh){W`B?C3gq@dABv*K&&IuE3; z_d~ZFu^l#!i8s)BeI=#Fsl=fQ%>Oy)vzCY|V0Oql_k^KIh)+b+ zCI*2tHw8IMC^_QRcC7>kFjq{%6V%G)wo1Z01nu=WwR$3Z$n~)lo z%u_e!gc*TZWMPs0#~k(0Ww@MOlhD;&@go}}smOe8o~Qx-K3{)=(}XCO)N!XNR18bx}~D=`@QC6hH#)eN2}VzLvv8Ni? z{c_(N5-~>daf-mP#w{?u-Dg)JeV_0RaLcy*R=1_i9brgkk-PC+s4)O2`j%0==_#>UC^4@o2Y3iI>W$^tI*QWhn{X=)@6`2UudaMP=k@xL5Ftwd*6V=mB)V z+Ei?_IAP04ho198_p z*LA8?2xQ0}F~@bMl;5KpT$U(-kNm9%I40PvD|Pi{i60d4A5fzqQaDX2>=gk+bhRyH zL;KC>>SJ}8Nfqjn`B}1T5b8D?9h0zTg ziBl&?_rOnxovXNBUXD{~jZc~u-C+k7=LqFMxr;P85xwJx=Y{>14u*p{fnKm z7YtEg5*iGCIsI-?=+4$20Y&#_xJ_B=<+{O}vSCZqsh^3EbdIvpDaic7r$26ks+TRf zAo9t2>gwI+M3LuZZ>`#}?QGFU-a4rR=m?Du^84_c6&xF7p>IYpEEpM8Kf$}2`@Qf> zWDx#wdG)np#;hh4=(ancV>e$5Ieg-oZO?NR=HZq`u)W~CpGIbuVx3(+n}HaLtytF- z-4XfIp)y=Z+9J5w4-*f@zx3c4?-|Ko)3XhQeyyfh%rmStzpNuIE^Ai3BlVQDxHEvrZC6NZ8#!9Cb$^ZxXepe+mO$`=lrv8B1*ZnQsi7NZ)TI0{B9GpB7(u zY`MZrB>wfd$M?_@9L>J*$YeM1`(TWtAxX&C!%we?aDlYk>&9!CF6?c_ixMJW?qU7S zEJ90}wsubh&;g!;TdO$%{3$$|!X5d8J3^?`30$0hYeCW?YDOp)U7Ss@#QkD zy)aa=lUc{*Z7$0s)$n-fomU-IIhz{*bu-=az+p>Z9H&Xy z-}cz+P^(-rhp9YaoQ_<@7%Oe12@`jJ7eIKJ9rH!Eqsu81Q>-`C&?VCQizC+EkhJc& zlm*c?qA)JU@5?>%GhZ$>5P74CTD495R|EGMF|UW2#ur zi}#tqPc6_TeDHITSlt?@@ogvkGHFe#F_BTqxwS9UWXJ$m(cKXUgnc=Zip@E_FGD*@ z`?q32D;xa^FjtCmP8%G#+EST&KWRmxV6#s{jnJ%Un%yg1ca15bHiYk?XToSKS9WzH z`i@nyyCJpdO2$EZi8BPRl?36R(xWt{SSOKa6 zd49LvG!GvK5XNkdP9~;K@oAUTo3=u#;fNv8*rS5abm4>W|0yzL+y%^u35-Y$Jw7`p z&Q;y0|!V zCN;*?R_tcpl(~Ndt?~fDAcdJC`AtN*S4GyyJSUfBRjd^F`uO!z>fq>m`q9%MF;}xH z1EbZVCq;IK56U5t*}!@Je%y~k2>Ef#u#w(wpvd)p#)oJLdoq6Z?Fu(#AedC1FbUy6 ztQSO`GE{hjj6Fe=`ja8NIJy8fWoJhr|CJHTP^He?WPfe(YX?MYWRLQXq|vjgw~}y| zs{RU=a;)BEiu8Cpzu15@9Q$(i{kHaO$Q5LrTpz)4r!xb5uz)N+K!4CJbmS34lafR0 zC#NkbG%3=5jx(j_Psj_{ z{;JX$?WIe8hRJ-y7uk8!WV?+F>wv<%acdp7Hv9#CP~q}7y=9fxIf z3bgUoU`eriiQx)smFzMmOZrCv$48kx5f0t@xS}Xe>R~Cm^BZnoVrFgD{J=l$G}>5@@Wz+94R}pPY zf+f!MsK%u); zS`%-+!dwy?NVEM>jAVBuUvb!HNWG9qwP1 zwY*c>BBk?Zz@}@ym{f*D0x}iRyfvaYTdnraYeeZX%#RO;z}(Fcd{#Uz)`pldU>GBh z23(1BOhRir)Ha|_7D#=yVCom6@IOY*lTQ|GBAmt#DIHWzihQ&}nSf=zl46q|1i{R# z{sRr949u3>)Nt4vLN-QxLRmwb<-<)a=PG97Yljj_5!%E877q?bcF?3WFK`l)Mnt}8 zYIm6K`~7G|ZU&d8rg|lF+ak{BzHV{47<}(U5WQ6(i6GD8Q?eM`*}gg7@jDT|c4Ru9 z2~7CyP!>1SF!YNf{je7VQ7S%aFCeB6l9)SAg_7m@h!IMR`4KdrpMy?0Pfv5)=cRqC^xE(hk@ zJj673a`+aT977AA<>scaj`BKz<=jJyrV&4B^c$YBX`?RM6mDtB;H#~HZqdm_V`B%A z<@9vXeq1xoN$`#IJqax;YLepyyT7D-&^!D0F26hQD5X&U?N9wd;lks+&6i*)Cb3p6Gdg1ezueJ&L9<0$ zWEC%gy_~S(_LuaR<&fvuJ-0UBq#q{zbZ!fL-Hw9%f-A|`CD~*Wp~{nQD)yaab7&gb z$5sa4fFYu2t7vxZRE?&<0{e;vu(cu$PkKU;?V7nMLhK;l{oJd@!7NNJ%V~vR)#XH& ztscr9(}=j>U!-oqK5YgKD5{kbR0=9`SsFic`<0o}^%mu6+)8)2i1{xuk*+zxErINc z`MctFD@vPWph*6QU6$DGf8(+N0|axu5tw%6+X^%(W;dWfr!_Qr6kvH$fhe0<^lnEt z2{{37j_|Zx;N-pMOb3%p5CRQ$YTXV3g7|Ds_zgJkhza)VHU14nW>XNGd~#tUc0e;4 zE}48RIgt&+<+QPLS&9q(%eS7LVle+S_2;Tb+rc&#Xp^{psow*kw!xhuuB)A-1v5+n zUz&`CCH8=s5a?sd=eSNr zW$WY8{=|rMw;123S^_DIDV0}N*g@ki>nGFUI`(MJ+60dS77%0wiJX;vO+KiiY}~-} zpWdZY{b_9i-Ll;VS4LKSj`9NoxuD)s#P4F?59LzUx+l|I8^p0ouT9`11f|9|x9C)h zc$SwG`P$!9ln+l=F-;t|? ztjikIJ!~W!tfozY5ixAau-WR#%NhbV($%W*@kl|E6PyMVj8L?6h(pgq&LGU-Z^yl= zQKp%5NaiF}>yTnMkvTZ}y{o42BS96y(R!_gmZ7YFpcSi$Cp(-NZ{m!_4-DVH>|AIT zAcZY&qRg$iaUfUjDkv$rgkY&;I7v#($Ry{RTZ$<$oQ7;?N(ZFb`-nWU^3;AV7lODj z6_JU(aJFhBu{g$3Z}Y5twKdO>j*h-FDkCCYO!x|S1D73gHYAG;(K7!0e!K2Ftc6_KGISR$5_`ELdTCqFf2UL= zP^qnC2VWLdM#qUGD{rFeEzS!1ms!O@PhumtVV8Lc?&Fa4^h_k1F^6O=rSmpcpG!z|D8u#b|llaTq@y1IBd+Wp4x9A6-7WPTVVb2fmTw685St@qKL&wJnlI)2(hM;aEuUF!J~gkQbWTbbx+~Zt>_^D(M@lUbxzWEKBtm|^3fqM>?l-^r23o-(VaAzYCkYL*j=tX0{6k%j zx|Ya7yS*$z28_Oa&b^MOw6SASS7+6U2|cOLtQDAJ=`SFysejL0*Pk0Dp#$e3|&|Cen#Bke>3&BYfH2GWW>(-M)w9Ygl%y8!CO9 z3*pDJm`2+Fx^^(dZjVqVI4_1~&SK3S9whmd8>~uCtLGDE1ayNemz*$TgTj_$RUd3p z`5wIGWMeegkgWTir(?HL(a(L|;NJHsS#{V%2ek{Hdlr`3swdYe_XI|#W&tN*54q0Q z_r}}gE+w86R#|TXwMT(sNpa2}NCgRsU(YZKU8`z-W9@g`ar=cdg25Q#%7x4H0RAU`gz z&}EkX9O`B(16dnI-O^eu!8WxX6MH`ocrAID?F87A#R8Oqc2bnfxQJo1bY@4gfd5tyvpm{8*{nGrdwKP<_$G@;ckeWC5 zuxm{XzxB~?Ma32LtHH{O5S?*M=}PZ3TOHd%WX}3Wg*54$XXL~e_LWMgx_=}P$Q9cJ z2fJSk2VOsUV#(JY?Wf5$`{v(Z4S8Zxkwzq}C{Wb6(qm?3#$T$hCiDhoI*g{Yt=0pA zP5)B=u2Z?9bP>-Qsk5dA!Q<*o((&57A~5SpL?fRzPeHhqxGHb(#T*n6r{g?!e!dwu zS-#OU zNsPsQg-~Y8dPO!-PshRIgKIKm7>X{( zkW*|IO7jAqZqw&e&C&;h`5oF$D4lxp-SI>WuD!ReEoU=s#bL;p>2Gu$*YcH+R%Oj3htqy9!wRR zXY$4va$5IJQSFE{F=VW$84gCC3h)uN7n}UVpMZa)PW@x6h%+JLY27H$7hi72PL3@= z%*YAY9d#F;)#o9l@+VxLN5WlXKws8?IMoWCndxvKtVxQX_>g106eUHd@*f&jJqVEY z(ZzhNIv(7NGm#&#L|fY`cIk0DtV07Rc*0`h{QNm#_4rT!^;i*lb@=58#)vfA=%lw- zfdRM3dY!DCX?0HUSyp+~vBNQKSgp(GZ?4I2w#^nsz0b{(khs(-3MhAhLituwrM03luTy)8WWXzb%W}F1Q^}-cbki2i*b(()Lm40;kniWaQ(+(~qY6{?H`+C@VjcmBy1Q>}K9RhzcyQuFK zk*e(;5pF-T)4-4>B}5h%a|jMHvnJkW5052(zWXQ+wn?~oN5S<;?(0OQ>%_{~cBbNl z@&9xm(dT$kk83R8>+9x%0(?>AX)yijJsz^Zi5^~ko7n5eZqvqIJ{js-`WGLe6hqOTvorO9N`BS{=h8H@)m#UQxwb8qKM=i#xn{VvmNqLlVgocxc* zC-V+Eh&xFD&6&z9R~}&&rGb`>_FZpuDlk>Re|>UX+d5N>{(K}ni`S#`e`Ls=M9-`^ zp~*If%rxW0jsZk;C=gHK?kEAp107_65R3S{WX zwI{ylnA9x4J+vxWI-$c!eH>7xf)i0v9z!@LkqBmO7)GGB%Qd<;JhPd1ojddq=QmB~X-BM%Z@?&GW>o2)U zvC>O(&8d14%uyM+Q^aCu#Ppc|joC4y-(}2Tc+wKz$e$5321HiKZ7E^56{3z`%GH*| z9YeTHXjf0;d9yzge;n$_(^Rh)s}vK`oXKbGaDm5^OI=LG4VCqfe!xxJ3*kMq3>utr zS2D8gg3Q(*PhSGyaLl-{4`!S6p?Z@UHKr{K(*9!Yd&VfHw*2K86gmk}qTFl#d!ts8 zlUrlQ5K=roFZs#f;#>>&V+C>L`C@xpf;e^1#FK|un|SU(0o*#A5AP2YZ2GWm2*=x@ z)t#g(Yn4aHFJ`UkxVNEKdpMkHmuKb}KQc9iGGvsY$jw?ag`YCH%@&*()kVqKDLZh1 zp9$=POS3>a?HhlA?RBTP8ki3L$tT9&s-c1?VIAjfeUg~eY_i@qdSMhf1`pUvElvJF zJbN)DuXEruxAH5JXZ<}z-=(j$j{DBUZI<3Y$^`#Tq}UN`K~X04V$W}%R_Uy0qC+WT z+>`V$I0`@F0H2nZHC;bU3oe*7xbHk z17@{Q>wtI;Ib^Yj5H+B9H;X)+8Ku}?wfwD*cOfUj05g%R6R42axxTWkv|<$8Y_U!aB3aJQFFnWy~$VtdTg zS=P*=7}VeL;bk?d1qi`()i*x~P!) z`jq|B{xmecPl$lBs=0k!m^6v z0O)ndh6ibBRU*P7Rh=<(dfgkE(mizgPA0wQq6&1~_JnR?B#K%+F=jZ7`h`1flyqREvmUcqKh!rz$BOW0Gt+_Iq=p_$ ztQelHsMG5|u&)EEIp^*sW`Km%0fK@&64|avA3Mo6?sgiO2UIXM;k!gtxeLRWBjE6UbwUP2HrT$gleX| z!|nEETCT=Q#Tn1LBh;uKt&u+@Wy##xn0DE-F%gH_-Vb1cFQ)0IJ%M!!ie33nyP359 zaKRqmcoONoE=b?TMo{mrH3Fwg$VRr|MG#G!Td#%mx%;6C0JKe1=jcsoTK^mwf9*aK z#uoa1#?f?~w$aeFPL^Q|nJ66;Yq!@n(B>mRxmWDRB*ib8uQ zp375}nS%2>rrw9(d_x7iz+McBY=!PQgQbXJEEbm0#^E)w4UYRPURTunuBd#e?y+~G zy>Tax+1+>BWQoGDuzL69`PMcnd+BYO9UYkOoAA=YZhUM?@@ob@Sw8c9~ua3?;* zYv=6W?#%*q<=)DMW^$y~?1RSqe*5Q8vAVbHVvP_f!vCn(hf! z+}wQ`WY@!~9!Ob;+FUM6EUnA0YvWZ{?BS&fZyz>nT z$@3jp*Oi>{PGIVpn~``jS)_zq54S+>VXTM?jI6qJIkRVrsXTK8UtBWu+Fq;ShiXw8 z!5z5yAw?Mr$i2m_VBP451N+hcT_%FbOCt2}BRKHgebP>IM<>g#BjSWm<;ZibeMg@E zP-=BJ!DmY}=2;sjx$3+ek85;=Vxh}A|v{yttCbs7ZENvbZDWUAJ>rU0bineUGZ zJ#?qTC|pkg8z>ns(dj4;%kg$TkgX8yK|*pab-$Ef2+VT3N+eSsBfDf?pJ=XLR9b9# z5~#-yP*0joHqGr-aLfW?R1Hzaz35>GD39{AqY@zvd}9*B$9ip3I`{FUV>yykDZu~z z)PoVZi|*b7&#F?6D5SdT`-pE(sOMcYp{}eJ^-aLxpvO@wO72x+O$B#tf3i$FHPBQh zULN6QSuN4)Bg8NV(e!(SW1ZGo*OS!hV15uMDo%}JIL3q_kZA>an?gRL-#9w&N6;bo zlXlJsA7LsK{3jhGeDt+GQDR=5wn5Qwj&U^wdKB?SrP7(Jf&NOMtBc92|vKWetq9Q zQ_h^??AT)H!(=>E<^5~^vl9=)_&y*BNPYVU^~p@yzjkQDZ*XYp`y7qva#7HenG!}` zK56cllcPAE{;_t`mDuFu7-L{+%ppb`ZpLh<{W93hYb&AhO2B?nlMx7ok6-5{`M!3o z##|_{#@NDgDWzVcQZN!VS~Um&ZK&w|dQ%tdfJG?QV;MWN8}6Wnt# z)QM4_&uJtYHj2Fe;Us+itzy{ofq!MEW2X7Y=t+$FNWP_;>Rg6AH)O&~&46Qd_^HF> z8pC}R@SXi3OS~Zl74k6u-df6@*En*Qk zJM=FVB)qSzSc({c-^YBadQ3Eq5g6n@z3bqF!KaYLXV}XV4hwzD>M~u)TRFLn z_gkUfQsh3-xWhQ>&X=Fe8n{2QYsCHzM) zf@r+cu6kbxnAmk>t5Z$2(;$lSawwb&+My9777+iY`)I#$n^5U0yCMMzNn_o$gjqE4 zKFCXK`$hCRk>$zXG!@yQ1jVZTnknh36zUXu%cn06kOl>NfQpkN_Pi^ijiL_1axkj3 z7pkS#l<3k`w!+|nr^uww^Jf~;a+San`07kSECP{kC}mMSzboKbpSt8`hWTZ@@AmA2RG7_fYKr zrv*6Va0lKWb1hXTqG8Knd+Bk(g!O+E5Vqe+3tPU@!TpXwEG!P4duiB@-f4`QlWt$Y z-fG96yl=oppDlY_^>9(x(~ju)E(JTwAGucH$3*)(nH}y6zq_pSF3vvEBbzTjwrK5F z%l@AL2ru{0nwW3<4X)sSO+tIS-P2CYOI$BX!#+P=s2Ypg0hTWcJ&Q9%ftIuIa^h-a zdC=`9C-+(lSrvnz1uj(iJDD$h)3(lMz^qOyC{VeFk>MiayewP5ROf9=-&mC-&Lcm= zD|I~TVW)lS7M>9?9lW23J_E< zQ&l|yr@d>ztm6HV(@MucM`33S$hFW-12@P$(rTGIQ&UprZ}l(=xKJ}=p+K(zBZ{>e z<~Q-p-lKB|d!#3IJcuSL%XVqL{rbX7tkHAIe6G_*=02|G+>QLkh|-WstWuo2(1R%l zdJQKX1skJ~(v#P>HwM;cRUTkFP4SMYdgqqsJ&PShJgDa(0Ri%uaP7Bm>Nl1+bCbXb zc4}buYiDcUp82-qoX%^2d_C%p^gZD)3JGbpwjfv{XHFH9JA73oCJne-vm$J$dOP98MQ;3_0A zcH9DHZ{9Za?IS9k8|~b~BE0X=NCTygb=FP zYc_$|Is2BrZx)@KRp&`9#jba?W6iCDR;H!R)>Fk=roJxIDvPugBL>0jWR0~E=ZZjc z6l4L1K$*X*8nN#Nq+2nq(Dz>xgJ3;M-uW)yUxkFFGL4@Q(}(i|3WOSW0*f6h9XUl&{1q zW3Ung?VBcTDt&|JB&pQin+ni@I7ndTr@+**vz_l%=krO_1NEKF!7*+pE46Xew99Kr zB<|8U+gQO#q~^Jx5!GMbD+fXOrsS>logKMI`5_3!bK(I7(!k7N?j>Ljv9poyUCxi7 zE~y{=F8FzayiB`<`Nf)q4@KwWEGoEo!FW!9;^tuOVv0dXebbC9-v?eeaY5&6MSu>) zp#qp{O=#(R+xggu8n6=eg!^>Y7dy_%v`d&@lsGK1u86a!;51UXMpRFHH3;lH1fi>R zE*%@a_m%|cP#h|Nss9jUL*MJpXMG8@I-rvJYY7|5v`d)3rg8HnaaQXogyG2fA@ltt z2=+Mj;ZnEWdkX?|C=M?Hrh)G#&L!%{xo?auC#)~iuKAXzmN-!}UlQj8D1p>Tjo9?9 zoMZFqpko`orlr);!};3eO+#QV^j&aX^j@tuH+wgRJ*qihQ5!#7id`?6kH>ju7%tEs z>03NjPj`l#*s50c-f&Jl7>4!PYhbS6{*}IS=h3@Fz0Nt_e?^a$cYMpZDS*xydkynj z$5~f!R>*`=LAWHsh+Pr|%SnCQ@k+7G=ftC7$bs?5Tnx;`zE_;b*8>tgt1vfs_sG{5 zvY!2$o66UdW!jFVTpwpy!FARzO5sG`Cp=)iHYp7`vW_(qd_G~4znycd+DmY%2z$wblMG=->@D;&W z?$C3e#~fo2O|to3BS5mW?bd-ghD<}>Swxi=D8xPWci%c7Tk(Th-A6%Id&TJR8IruZrEu}s))-G0=>XD{{LHI7B2qN=V@xD{k7h; zjAh!z)TglCg2de}i*w^BZ0{(ep#InQ_kQ=BuJO<%_uoqd$hS0#L);XBZ0&uaEq&wv zza?f0^l_{JecNQ2b|Li>0u|0gN8{W$3fn>W{{AA;e~s2Le=qlqPgmQm2lu1^8Q;>t zb6sAlB?PJz&vw3V&%}&CKcqK120m9C7d(0bnF2e{#kp-1p6nXa#8N=|tNGZyGbezkY_w=IrTTY#aH%cus(DYAffugh2KDZ07rkm|;YX)SC;bfA(;m7%L}9 z9Nz(1{Ch{^+$;*ucNG5{weZVy&Ha*H)R$UGD&DS65vYyt=VHcRWU14eJ$CkRo>-7L z;{#m^<=HqliNcd0$WhJrfjNJb+RNT97NB%&pS6)d*ELE```#3@@VnQ|*gHITI4`=4 z^v6Zzf1_2LPe)-Z2=cTdi| zcmityM=5b%!2G5M|Mf91-DoZgM=1oah{0I_8p?EXa|I4D3=Dh!jP{=zIhshh(zrB3@cT0F>skoxrTdjFfRC^=u% z(L1rx~ji%wzaJSWNG?JW!c$|aD>l_CgVj!G1lDyoiIy=*S08rrmYBzmjZ+$^FZ*{?@ zd}61VPr~UURpu-lBFS(hYg6iH>2`&^rg8DiD(5ip&W@19c$l-5Xbgb?@k9nCF-XaD zft_qjIpV;SQS|Qy6W3ZR<{h`Is$f$-k<($tX@7|rQ<6HdLKJ~^k;9X|%5onEEIGRb(P zVKByz)T@OY8zKL#7d0-fGu#`)*3MG&5Y#_IP7c8&Lg0cOqs_lK9)l*0DK}MQX&|Ya z_%IB2BW7Ejvmu{^(-E8oLSDg094SdMmj1h$Xee_U^&f3qTxVQ>3W3o2b|M@lox@=J zXrGTkp+$baG36j}la0)|4+Kr%P9SL&^;JHFsz*3I&qzQ0xM@wSI|Gh{L-}zoqyA4d zF3wuq8;6n9zk!j(1uT~^zt}eQ?cY~5F3y6YxTh%Zz^RsDJ`o@h!Vqqd7uhHT-(jZdTkJRB%ojEy> zXq#fs&f3Sav~JlouxuBeuG||*en99b!9=vD7=p{x=fcJm&Db;F9Zr}!z?{R>5BWqn z)uYpn!MK+CBFUh!*8lNCS$mTDx@ULCPq?Y0;hQi&+Z!jbH;Q;1T?omKh(X}c=@=9n zQ|6+^l*`b;pLN}&`yN3_s8j2E7&xDh`G)v-*6GSnoMmAFe=w#U4rNY_RBD^vh0kl6 zRIjkGH!@83>&SVF@)Ki#^-iaD-V^GhLU37Q%2A&_$7gZU|NBEE_0%~Eiq9wb(U?Cy zVL?t$f{_~SS{zmwD$c*_Vlx#kO`z?+II-O}J$E*Iu?;K`cfYq6wdi=;-NDo(1`Qii z@Qmj~W+7Yu?~f}@Oqlj@>idKO=0iT29E*!66SIs{mtIL}>BAkNO;vre&f2CJUFdyH zx@Y$W%olrO+}kfACwd?5bestC$s8JmcM*f#ZW}hH;JJQ!g`MNR>GA8|o;nFAb#6sM zxqOOFB_H80o_|`)CmFn#0EYtW)ll>7F|X*r`}$ZG$g)j!<$2yKg^u^{YP~3*27U?h_B)%*ijElkOW56Nk%)v-EY)o1I zjRNLA|F>t3&sb3}>>4L%0CArO30_mAA7|cz#v5&?a(5Bbk9&AEM80RoHBY%u^&ZTR zF~My(h*96?!hE2*l}a}Tp^Gs%npJ6IYPza1B|py5g-U)}oUFaSKVsN+-kJpJM*L#?&Fv zAB!fL(@Bo*oB3u!dd2)*{s#5ee9w+FU-f;@G%j9mdT(THDh6cN z1Fc5>6k_0&E{j23Rw?hT8dGM>$Zy50Q|9j^>9d5Ad_2v3nP&bM=E2_ zj=oRT%M1FIq32~odRCV7Jf2I1SVJXW~eEb4_B1N{@+1Duq z-P|k4na04$j|g|4gkVn$WC(O)DqOTV-Iy}>(FC5tOT3u*DRK6wK_I8;B*x^GTBL~c zvLArFUB6yNRG*i!1_KD@&GCsDB( zO1#O77~CU^s$yX6FnFS8;&XLl3W#E$M!jNf953s51YGz(+t1w7V1$AMqy#P)~AUH9zLzG>yz&@ZICdo{L1m|-8Df*9>( zCxK)WkZxNsa5(80EGsd545x@6ISp%FzN6AbcE(^VtL!9IkSKu)d-qs2Q|++Iq8I~Ph`~g1FJ=ke zFKtXEt)m;gPbS&&=02zXf^U{si!lka;AluFvqneOm$9TVmZ+CiekGgyz9rLamV#qM z>DAse<}sXPig6Q_SM4;uDz4i!{>g*QESYdU)q?$RoJY6=;;xx{t@Vjv{@3#ltmhX(y7yl z2rX_sm{GVdX}2YuV=rPb0OTXhG)b3+SxFMW|D=Qjc3Dnczd>x zw$^*j(?%@W=^|}3^~Z=3v6D9SHRj{Pdr1h455Z#j|4y94m0I>L5R!JXF(qo}uycsU zlp1LHES_Gi>*)!1x2@1%ZZsI| zVew<)aky>_qs2z@%B5m#+D)+i>871H8w$$`J=c!n}(zpd;6gx2{TkNb12!=qZ&r*)T7%q~nVI;&y*k19O?32b6nPui1 zO&c}mP$&CoZ_V2KCAW5Fw>c7V|0B6S#e7}_*Rik&JI29OuO*b>8~$`#gwBRoAp0gj zp2DGVvE38-S#uk4XI9xM+ZLfv-n|Zr0n=!~h;PJTeB%66W2)S~E6ms7VU1_aQcz4L z=_n3}PnZvH88n@6JEurU93sponJ*S$#b9bX_c7QkM;^Lqmz)hBTW7;v`23KO&RJ$> z8WRcA4sxcx*J3bc&Vy}$bU|aP(7u!N{p#%3*OxK(sF-UUwf5-&F<1v~4Ri*C+Z7EE z{oUitr~Yn)ea0aSPuw3oHSX&Udw#dw{NPI;Ecm_)FluRtXTxqMK0jnu?Tsa$(r=(M9uCWz6k8`_GDlG36ypsU_n6Qe}Kdq=~C z1lV&%>MQff)2h{M-y`8KcRZ*`yXR~OR~@HkHSEtCGyf*GV(Zy?1Sah}i-A26gLrZD zNMmXTn}DEShMo$DGZx93gm*7T(Jc`Fevf2a)d0V_9_@%&&R>yei~0N4z-vTl0l2SB zR=~a|r1{wp8enu3DxM9y$zMkKt<1;0QOLffBi1RH*!Q(D=vz0Yh@khoy~`QH#>zWFq*;MbB?1d`Sg%k=5|E`_A5*_8f~<=otuzo zvxJ=n2&=Gj%~<+uh}8G)%4fsh(a=wgH%F~U5S3M!_J@S)+g34X)R=NbT8A5mQMtOo z(Q(IAX)kgAc4fB(fjP<-mK&95SjeKH*|>9c9w%ExeQI5_IUByxLUF5Vk|4}EOcm@j zxbIfQpgIKCH>Sv~Joqm-;gcNg?s$SwKuEW#z#OMOZ(Tam2zRsKBe?zoG+&x`7*;c1 z)W>`_#0{*xE&fX8qeOU^a&{JAs?z1JT?N9uW-01$ZS`Fku8?U9y!4c|t=I~)Rj7xiojx0y zt+U}TWjv1_F`jdQ+#$drULZ=k9ih& zoZ_g=DCM@G0kwN;!DObzJE%15{$7cy%S|>O4)>i6YuctSH!Fj(!cK;%ik+!*6@p?6 zD%`F&rdGsf@4g$U-$|0r{W*?C>Pzm=D>{5yC}pN8;KgX;zJ71w_zT}qr_Y9FeypAi z=Y6~4&sZ)X*-kk1NiG zueMZ>E`up^eq9V2Hl{R5ui~iox~;<(uq7ET!~Jmg1r(>{+3>aYOps1BsT#$gWn)TC zd3&F#DgP3bw>01awxqDf0rj=+BWfnjhVp1wJ{$gO=4XPWqjC$vIJ@a5JFriRWNh>!Wg2NdyM z>jFd1aFkoI_HMTP+QT4c=Eu96!g!F$w&SPK&T{|Sv*C-aAx!O@HxM64&@WH_LZ%+( zsNp&)+f3qLh#GJOVY2ZOr}*~KiQaWu{l@R6XTz6TTbSB8Zy`SLhyfD+3-8R$PYH)O zio1zf-%QAHI0jsBMT^Gk*2W80y747gCuG0D+3hP%`0Nk2t+?$>aUu!L4YU=z)#OF9ixBl+w>bvA~m&3pv6C>hbpA8q(}ttxtM8h@g6{x#&5a(- zkI=uw&cW2u`OkJ{D;J+4M(pjD~}9(?Eh+cHvEm& zbOi^lsr-caG~(#hWo7?pPPe9K!#!60euSTQe4XbX5T8azpR3Et7f^r2nw|}%HCtjk z>@N2FV)1Eu^igj2+EDnt{_%6vZw(Mzvn95}?nQdkUVK^|eQKFs=-MXH`=Knj4xmDI zUqjHcW9j+eAkX!vKjwIcy+C|^$Kg#;pK3`Ry&tT7F7nfCiNhrS>q_jD=l+&??)%3v z$5qy}G4H(DEfDY zv;%n@hruNPao_mhy*0>=M+2^tvwMU!itIkTL~?wegySe14|9T``=6JLWxr2eJ`7p8+qO@+hbLUx><&o5MALj2J@*o#>C# z6vXSzK?eN{**)YhQ#L$hdveMj3x?F6gy>JeeAr(d z%I2~B2QbdF+x^DCOMIMJVo0ic^elAaxMy}8MSl=cIW^^vMFTaN?tvDQrv-dbz?lC6 z$TGW8nrVsV{1OF2Q}ApjbmNLCW6_g3e&eY80)uK5BS=`oe(gYp4`WZ(#**iqLC&)q zm*|OfhWeVJ&hbE=r|A@SLqU)VQ-0^5{019<`qQ1+Z%qFO^u=+1vJvIC206{{yP+kH zD!mUKMS-Exb6?VpgZ-V{@kox(O!;HNoSY!_J@fk>cUGW&C#m0idq2R5`(8z1jaZg+ zYK?T6sBVeTu}6<8^3#q>f@IjSJ>~dg!d!Ve_yC&!{b7)k@b#ge_KG_NuQphrS5agB z(8hMf5{Hme0Nx)b8wJO=zP=-)1?dkbD?4V-ha7)Qm>KB%sPLYZ{{Q~;{H{fd@0%l( z=lQ*he#q`=V&?zv$r5XBvK;P-Y>;Q^_%ZiK9H)A;<@o*Ysr@0tHw=MU(=Q9Ycm=jl z_=27&dEOf1nB4}l8{ezJOYE{G);UIo;!O-eHhN^Jr|6-Sa*lb*15LR%IOXyDls^{C z5g%VR0gaF4K`)+wPb&39{VrVWd}EAdc0U$kJ}uGOgh+KuG=}#}msCB;26*mAsm?nc z^IzcSvW%XxWyeRRtQ~*Mn+;!shc9Q)i*KbGYj`zfb_gxs%)igx@lZ(a{OM7Oh=`u`E;lhF$Ox1oyJ zy<>?)q=AS8;IY5Xzm0xA=9r$68}QD249mJ8f#dz2wd0Qkvs1^_&KRxduLe7iD`e{y z1?G3b%$38$ZxOS}61$o<2|YID%6s^`KBrhVv||b0UdM1r(L0ucluo&(v!fh;ESOgo zsfPh%hjJbBZ-npgyI^L$A3gVzCDsyD5Gmx8a9q@lT?C!r-Z!Q`NzqiE@$g}jyW@n^&^%3U{XNhwC5-Vi)ow9pviEC?gg_9yuNjFUJtO>dXp0z0P z?zjNO4IFOEj_;BA`=UaQp~)m1e=M4zx2AjM+s@vhmqx;6GK>M{+=)l|cM43F-PZBQ zFR?(-(h`097m3v2m9bmS&<+TSo{I!6dB)F`a32TDdMl_erhJc6?&Dq7)s8ig{OLUx;p*aPn)Ntj<=B3-g#HyshF3!WuISvUGT zr@*l-IqukVNFZAfB%bn`<7~<+jz1<$QQy@%%ftAmKOM{(;gRl`)ebD9JTftUpTHQ| zeo@)IZ;39gop5%#+ky<`)?>-D){QmKm`Sli1fR7Uv1(csq@7b6A^~ltpdUC5}HP%(yBNo`P^cnn?Xw%8L{s9X_mpyD{g*uL9ZJ zM>nTC&g~wTs0b>TDAyP-sYU@spUBY8XS#ELFYAU8=%Hil9go(EQY=(0_zU`fK#=xL zSvd}V3ywb)4XVh6NiWW|y_c8Sn6c9!Pk|TX7><9ed?YZxi~F!d%I=2|ubG&`8XvmC z5NouQ3gN<^U=K3%ZcPWC&6;i)Qw9$l;u$G-jLx0oIA!g4+2L5s_(dSUr}c$q4qcad zz~Ocr1^4slP2uuOl$Bq$w;Hjh#f8pcjk6ic=}pXsa*lK~)Hyj;sOUU&R4X=#5C#Km8dqR9?PugKwk*5n zklqWYcWI5|D9?+9g29-6F;iJL7A{J3U?3^dFVLgyrl@Q={+Kr?ZvbbfR`8f}-?QE?2C8Ap zz4`=WXyi+je|iy5tmoHMIs*07CqeNH>5Z$()+lfGTw7u9nVIND@T|DsMbDu#uw%+x z=5I{7!tuuv1N!$+V)jV-c{W7-hqavqneOhliWk3MUhu{oNNbng#{FO@y?Kprt4p>< zyi6Oe3au^?oDxe(I2I`!spIH5TnX87OiCmi&vDA#%9Niw{@98wrZY%=NB$WvNz!wn z`3)FGmkj+cIo#?V_0Fuk+8#^@xoEunbpSpUG}!b2|$havRn{q>kHKEg zreEZx@xHHl)5a{;W2`mK~T7-`yb9|Lri&*Z4?UCFv6Pt`YB#cfyf) zw(IEab-Xp@Gmbyz&AM&XL45NdJK47YC^b0w!lr$1kZEJn>Fw8el1ByM!2f*}y}h0H zBK2v`=Nx~G%_02t<#u-)QMR~+8kR2XA52#A;_X0&I^X?s6GX!GnA1FhH~PRGXG`w6 zjNX37s7R9g7W=Q#u0%rrc;#U#oK{w-5S5(QK-lxe2m1N z<`FR835UHa&)qtD>9Y?Tj@^`%<5^8Pcl>Tq`Dt^!N9My>El~fj0rqEC4!b&9{2Frt zO3aTua%=o6*O>BX-nT{;4lBU(o=q7&JMWwGs^h;W9e>Q*7f_$ys$>Gjv!_KUgX60zP2%Z_flIILPyW4Y&%Pz-n7?qzkkbJkR-rYZUD+<;bYaVuhC#RPUuPS9%b}?f#Z)wgE}91uc*Jk zbrefAaJ-cbudlox$Sdj1YfO1mvqUILJbKFUvXs%Qpnl2mdRX2sD!;*~fsFr1l$YKY z0p0s!Tug6XW5%P3CE`i6;CU{ix8L)cB&=c;wf3mPZOb{K*M%=k&M>AgQD6+-9OGs@vi$PdJ6(V+p+}z^tvyFHbNsPjbZ-|R zonwq;0lswby)kaZBSX1_B~$@CL=Qhg(^YXgtxFZ^#@bo)o z;yK(6jqlK@xjU$pRdN-{IOvF0>*9ExY87Y-GrLP;F5l>Z67sq{IOvF0>&?2 zqxt3`jn5`?jpt^LKNjp?z_{HSW3B~{*IXEB=J;d5{soL*vBqYC@!wOT-)H{<#tql_ nevUsD>|en6Us&VE{>%3NkzTaHhAz^^00000NkvXXu0mjfyytfU literal 11921 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 PM^jhUd0VgeF6#dP!jxW> diff --git a/public/images/pokemon/exp/700.json b/public/images/pokemon/exp/700.json index fbcefcf3561..2ed26d79228 100644 --- a/public/images/pokemon/exp/700.json +++ b/public/images/pokemon/exp/700.json @@ -1,1070 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 45, - "y": 176, - "w": 42, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 101, - "y": 118, - "w": 50, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8ebe248133b590a1727583e2ee69cc50:c2481ba04831dcd949e63454034488e2:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 60, "w": 43, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 43, "h": 62 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 99, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 147, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 51, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 60, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 46, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 92, "y": 178, "w": 43, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 43, "h": 60 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 136, "y": 178, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 179, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 185, "y": 123, "w": 44, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 44, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 47, "y": 62, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 45, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 44, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 242, "h": 298 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/700.png b/public/images/pokemon/exp/700.png index 997328d323d37dbc80a7e57e18f38e75187e6eb9..4d3e64fab03d97c10c95b8f5d96b12958cef60fa 100644 GIT binary patch literal 7806 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 literal 4598 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 literal 2368 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 A3jhEB literal 3586 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 IM6N<$f+kFoO#lD@ diff --git a/public/images/pokemon/exp/713.json b/public/images/pokemon/exp/713.json index 7c5c6b565e4..f4fcfa1ff85 100644 --- a/public/images/pokemon/exp/713.json +++ b/public/images/pokemon/exp/713.json @@ -1,146 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 174, - "h": 174 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 87, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 87, - "y": 72, - "w": 87, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:11a7176e3fe76c2e9fc09061688f4db6:8fdb4357b8a1808fc8dcdc5a29bec720:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 416, "h": 247 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/713.png b/public/images/pokemon/exp/713.png index 0452b1989a17f0ea11517d2bb9cba4f8177749d3..2d0b8477262557f00edfebadebfac105d39adbe5 100644 GIT binary patch literal 4421 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 diff --git a/public/images/pokemon/exp/back/697.json b/public/images/pokemon/exp/back/697.json index 9707f931b14..6963da289ab 100644 --- a/public/images/pokemon/exp/back/697.json +++ b/public/images/pokemon/exp/back/697.json @@ -1,1196 +1,992 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 374, - "h": 374 - }, - "scale": 1, - "frames": [ - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 60, - "h": 78 - }, - "frame": { - "x": 0, - "y": 78, - "w": 60, - "h": 78 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 77, - "h": 73 - }, - "frame": { - "x": 285, - "y": 0, - "w": 77, - "h": 73 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 285, - "y": 73, - "w": 76, - "h": 75 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 225, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 299, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 299, - "y": 296, - "w": 73, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5c15a6488ad8d9c5cd58a9490e3f8fe1:9f98e28712fdc6eb5949c7f74cafffeb:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 370, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 558, "y": 227, "w": 90, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 90, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 376, "w": 88, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 88, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 89, "y": 379, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 365, "y": 378, "w": 86, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 86, "h": 76 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 640, "y": 449, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 84, "h": 77 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 552, "y": 378, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 92, "y": 303, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 465, "y": 302, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 186, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 225, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 472, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 565, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 277, "y": 301, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 388, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 97, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 292, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 196, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 582, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 98, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 485, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 388, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 75, "w": 96, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 96, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 286, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 670, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 658, "y": 226, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 94, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 191, "y": 76, "w": 94, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 94, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 279, "y": 226, "w": 93, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 679, "y": 0, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 482, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 379, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 773, "h": 526 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/697.png b/public/images/pokemon/exp/back/697.png index 44a73042829c01b40178485c5530c0118b258c24..f0ae22f2bb0a065b91e1530f4e53602269fe143a 100644 GIT binary patch literal 36976 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%0AbBC`AVL3-uX}t6&1-BZT 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 literal 11194 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 ATL1t6 diff --git a/public/images/pokemon/exp/back/700.json b/public/images/pokemon/exp/back/700.json index 8919ba29366..70083de61c9 100644 --- a/public/images/pokemon/exp/back/700.json +++ b/public/images/pokemon/exp/back/700.json @@ -1,209 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 44, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 57 - }, - "frame": { - "x": 0, - "y": 116, - "w": 44, - "h": 57 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 44, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 44, - "y": 58, - "w": 44, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 56 - }, - "frame": { - "x": 44, - "y": 116, - "w": 44, - "h": 56 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 58, - "w": 44, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e0cdfdc055c08cdcb7b31d0da301c709:2affc6f4613ab8f1ba13cd35d9106bb3:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 101, "y": 0, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 48, "h": 63 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 0, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 60, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 53, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 148, "y": 64, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 149, "y": 0, "w": 46, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 46, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 53, "y": 0, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 48, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 244, "h": 241 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/700.png b/public/images/pokemon/exp/back/700.png index 6684e845a393cd682cd4bd9bf111ba12dd5db211..a3675cc15d895d7aa13fdb10ee55c89425bc08aa 100644 GIT binary patch literal 7024 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 diff --git a/public/images/pokemon/exp/back/712.json b/public/images/pokemon/exp/back/712.json index 46b8cdaad44..fe53f52369e 100644 --- a/public/images/pokemon/exp/back/712.json +++ b/public/images/pokemon/exp/back/712.json @@ -1,2729 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 208, - "h": 208 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:600bb71c0995d9554966ee794b89312a:22158bf1d17659480b23ef6d5ed6dbcb:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 142, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 142, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 106, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 106, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 35, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 35, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 142, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 142, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 107, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 107, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 36, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 36, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 142, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 142, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 166, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 166, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 178, "h": 205 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/712.png b/public/images/pokemon/exp/back/712.png index 81f7741235719fb0ab2bc374762ed501868970f1..a5b57fc9f1b093c6526e42cb02766aba206403dc 100644 GIT binary patch literal 3350 zcmV+x4e9cUP)Px#9#BkFMF0Q*5D*YpWP5XSb8(ufzrVkw#L~0s_~`Zi`1trmV$Eg%000VfQchC< z|NsC0|NsC0|9*)SRsaADkV!;ARCt`#o!OGxI1EK4nx;Dc|HETRTmTZwrNoy})l4P! z32;d}Zg-!6-nQY2<4w|KV^EP*P&lAUHU<@01%(I|vMHzt0zpiQ$7>2IfnN|tpB35cX#yUc0V{xyxoJ#%LSZpcw!D zlx|)-s0acvM%%yw9q0f4yeGyXw>$54t00{?W2`+DC|Qw{(GICH&1f4~p&ymBLVY(q za;_4dc0!n#YMi7tBamDv_*IZj1M@U;h#vGP&SR!QH}y8MRt4!al_nX`9zAHN@~{({ zCd$o12r48*R;nPK490{`>Ms&zKaLW!!D)biv>5-0$yBMXCQYFrG zI``(rdZydJA21;oT`a1Z#^SmJpOz9SsIJ64b z=?o|^^c}_xl{kdr&~-=8)Mi~ARwX68Q+`3R!_=3po;u&~Bnrimsg-s)&RwPyLOLmp zy0>v6m1wWu17EgJZ6@c*WpYQLQ+{FzNZY?cbBbG}1BIswSGF)Fl|R?>^Ft0MZUA}e$MGC-ZiWl^L)Gk7!p@ZP-` zMDNeN`pCS@b@dC^I_(%k_Lg}kc|!TkMb=*5e4RIEq%Xwsgj#ez|NG2#l8~}0 z8fecY+iyP|aoyVPzI&BI_XeFe(>kBe_xtZt%Y2khB#VfURWYo;{(T&R^vVm{x7O>k z=U#ERxtbfhpR!sfD^; zk0mxnV2akT%2KbV5*s5tDT>)%&ODabE&(Z8=&=~o^FxX45?EwkD`O0xjomomQ6Y z>KM7jGB(H~>h3t^)U(RBKeU;1VV+u+9<6Q*%kKE*)UwJ|u5u=~qDI(L%Yb|?cGc9P zidN>21huP4WUk1LSw`e@wyUnAO+7O_66NQzDpH%-W*L>wwxjj5GKMH?M`W)dpHsc4 zIhBnkFQc31F0yKt0ffotj%dElP^Y;}UX+T^?>G9N@6-J;^QiJUC6Q6`WF+M*#5c%c zFl{_3pGo3kPK)*vm{x|%Oc5C)kNacgLF6+aSN~|_;f1mfv#Cm*uIz<;2Fz)*$~J;K zY%9+wpRfN3kvmf*>%Ctl$o~glZAlskM=UQmjj3T|J#eDDxbgo<~L83Ul+)_+cB0l)B675apBD?DP z%!NvHwOw_6<}xL^u9WLD7b(%DrQZ8a96~3A?d!eo#35Ke+eKdcP8@>uvt8u1@5CWk zKRZQU`%V~w^|M!mR52WpL7-5tGd0VIMb1j^nLI=xY`AwSa_JdKKZB7irRO70AXPsjkv$7pe->aESXu{ybo~rR*2irLk`!bfQfGVp z#GRE9CnjBFCA2uQrSw`I2zneDF~W#6o*w?y7mr3Z>?$&myAbj&Lh(h?vBfPkG4x7CG*E(C|%c5T+ z5La$tBFF$eRNI%{xi(GEe{AO6>`wts=6lpw+w@M7xv_LaFv(<_>ssz_fidpW= zAK*?OM~?kA3ytV}s}2d4R+stPff=F$AwULUHr*OeGJ3N#5&7DhVCqcu-y|>@7ft4_12uypb2TW($$qFZchB>i zyLjmv$1LYjTA&#anQAt!GgGQ@WG3bpHDR8VGaf{n0T-__T)=qiZJdBQAT+zpew-}E z`uSF*4hH#=uQGzpByLdXbj!LQ*knx4g!^vh7`0}RLT=>m9&XK6bY{N(?QB9Zw<6G` z;;25nkXEO;KL+i$*2_@VdVx4ZByyd9-fMNP*=pb0PpT@eRJxOjRK2GdO1YMk8PIH) zid#v6*#XT4s&ESs&jUIYL&8E zHB{+S50o8H=Q)E=v!~5M`u*0UI=3Bq*iMXk@98~5o0GU%O7<#tEiN{_TI*+W!ka;L_30* zZ%*@8^JAXmB?Xyd#6}(6Lx0r)!~~3a_A`NtMjc(F$GugffHBWrY%Lje^bh@22N3(U z4+s}+z#Jnu>gXYzwNe&_D!Vu?i|WHQi1xF7X&^g~W7vhtkWI^_u+#tYauB5gB!~kP=z8R{FYVrDm=CIYw~Q(LzQ^t1KO{ao`-|Tckv8!a?30 zXwFls^Jvu3K(=lMPh2`A+JHI6W#{Z75MtvLgz7^8u?Hqoe$Y)wSl9GSU|rR#b9OHz z4da;fH{}VOg9;1$CWkfq= zXto)9xac_5MYDWhGoZ{efp}hy41f!H9t8a7V*t2h!Vai|_6aVyWWw$)WBVQSAlc-B zOD61qGVnpNi2qs<89Cz=>a*f-Qs{EazP`3LWhiMaPl37=IiQ<>3;ZXa8qp4(Mh!H_QA$Y zej!o3)Y7)bNptLSE zztlPtr=U{VWYmE?8yH!vbNyvMip`XFhxoB(ZbqmmPo^%kIzVK#&WswQk;6L~2V8!g zo%lt4l1~+gEf4mgmlNBp)^QG!)vT3}2k~sPnfc$vL$sOQ6T6p9Bh@_={)b*-nWa`y zw3+H8Up7c)p1nJlRsPURAhP%2nftJT6yYwWIJB^fr>Qcg$hfW$l=&-;>D4;dRGl<7 z80g+eqK%bNnENXyKE%ih^<#Ra4iRzP*x-(cHc0!;&aJth4LLW)*SW8!z7D&*Lga09wn)0gW(pH@@`8_-4DHV|=^c9#em z?D=sEAI_iz*}Hm07cZ?L;tWcdZG-574I<8{=v6=42kox8L<}#)GrfuweTjlh`29JS z?w>_MGby$e79~}g7!f(o*jZ9ZGsMAkVZCLlcKR*4XU>~4tml0X%b0?gfuC&y>$>S{*CQn{#gWe z2^t|yD{ASW&Hp&4+%$t)g!bA7jguz1(X?m`+9Sx?MfnM-Sh%3g)u62Mb8XMWUg?t=D*%c`4nW7oTG_*o-8pG6Xv5857{D&MQMNzkVLzHATm%1^rJTGZ$EIzz5p zT;663mDj8*tbBiXY7bvmG60|bdeO~wdan1!##M@|`&)M|1odulF)dtIEiEqEhxc5@ z=3P7M5@|9u_X~PS1-IBYEsV2mp)VKrm(By1mE?xvDt(ZaUSUubcJR>Y9rZF?a$qa-)4)nz5J(+q-Q75<)X!fpmiDg!)#sG z^^28yE-%qFD~h7*WxuZQCkp&Q_O6wF!Zj^ymAZ3BIcuejuAYp9+4cRiQ2PASQg%F@lnGj^vdIpAl5+m#%=snTN}p%d`oT-$>ZE1t zI+;@Ca(?=k4O)ajYJNJ-inTHp=l9vlN?(;aDWh0ve$1@&W=_-xH;UG!)ZDv#&`FuJ zqbjSV)1>BaR-b#1KU2!|QS+m{#-Crjbb7GT$r!Tv4;N(3CPWky^zGEvQB9&U*J;k) zzBOI52dBH#)~{TnV|z@+pU<0|-%dXm^q_2%os$U?{TTXO(8G1b2W56PZ+4mtI=bQZ z=hXfzl%j%I6C~4=!klg{P7}pB5mr#5z-h9WPgp^T!fj(Ate`{>i!&gsptOP~*@rVA ztVl={*oT-W4LPPdmgwOuiFp`Q$3fmjc98~7#5@EbAyr6#5R4&l*S4!P5p<$=1R)WH zx(}M6E2MgWlNjkt5E6~y`R{}7?};zoDK*&yAu`Jd&)}{?sRlVo0SO=kvt*Fm6#xVh z_=E%nyokj)P01?Cwk?AeoWu1Xe^&w!1}z9e2#10KYLOrUkgNjs7yu!-9)jeY07M{x z4+02Tun`JOC#x5}hX4=@3BsVMlL*?#?83IWhY61rDGE5?xfCUkN*yzt)v~IvpDT<*6IzUJs>PcZv7X(=V@@Ri!5ws1Xw+>Gz zkB|foF=*3K9?z|OR{ z9-a|=3~&rgW;QV|x`t@9y9WV?WLJV?I#cCM!E7{xWc*DJ01z8A>)^$vG0ntenjZ|j zARL+y(L_Np0Lj!`b#1ldKGO)C0AIxa@lUej7U<-0fhPva0}!vAjz;laTRx$b z;}c)=fK)^4Acb5PY>(cA7_J zr0Xom-y@A9F>#tKo^ox4 zJccGtGdXK6n2;gR#A&8c5P$)A3{03N3a0=D;4v^^nkbxtJdnrG#A&j4%J2B}VhX3p z;_3LH1f#(z$-|h%6i!o$rz8*LF*K#n2~W9T!o?JtZV$rd2zd-moTd~{i$%0x!o?Jt z{%)E$HJ*j6f(S6+VhT;1FAB%`KA3izze-eUtfO0V#`)WfumUAc7ER%D3Tsxqwte$IFPma4}`jltuI9 z0#bMk`f?svOreSMCEbdSry+eYynu@-GzCAK%Q^!D2lS<0aWQ4U1lWV1@YwRCn7(i^ z1tuGWWu2g=82=3PB_oWWN!E{KSqF4Wj$6zl^uirH2CifQxiH#Q|AsYrK2zq{BMN*|Do3kV#W01onASXJKUTSeAcm@a= zFo{S4H1IGd!81U}5?vwHTO*}-1_>E438V$l!z#fuK**w?4Z0?z1kWHLOLryXAhBSP zkWJA7UCB7os~{v~ch|c<@gqAOL_(JC`ULdgB@zo3$6r?Z8aY{X=s^LdfM=wF2t|aP ztYY+Va4>~*h($sss}{khyOVZ;9(+)P4 zcTTbjz$o!_tHnG5705|~os(a!0$}u*e7fbYFHl5)j7R}z*!v(A0*!Ox>6Yt?Rf}bh zDp-8M#S{Xg)YGl_!H?U=_`DWQ;_yX}GmxBc=VX|W-QmH{v?{9*U-(UmfSlZg#G*zJ zelQ>W#5 zvpvlHm#*#U&#w~~WXXe4*T{p5Rw2-^CsHJ2E=ZYvN(GoCO&;dzp?#2~W&kH7WaI^D z@*q6p*xXOS3qqE_BscR6KHcJF(?BE5GaOlN%`@<@>+}O{Q}0r?6-=ze z!>;K-+vL&)EB&zRW1_8~hjal0vI!KRhnpUDu?ZD^l0K#~$Sl)sq441ci_DU3(`zUd zmS0EJ)CWDrpZ3BKKqJN%pXSJ?y)XozhuexzbNDWWG~)Ik9RjR8sm$vP^fUJV01|j36gybyx)=6E@Ml2$YteS ziog^HH1G{Rrlg0zY`3(Lb^n10fQB9)6!$n>7EQL!Wy2);qOM?3+qP`8cP&~G z^6)r5gs*kHg4a3$(0IQ&sFLR{qV(RS5NM1jd~HfwzDwaFnj5M_+n%y>2q6F(`o^Fc z-p2&rpI$M^k!f@Rits-$xkTF)`&WYq##abM+Gjy!_(g4jMj38sj4sD2y31bL&*zAx z5NM1p_TZ`lfyVeC=^;VkssbO;SfDYwq=#I#zpBtKJqXb7)MIpoP{h)g;dd$O6g;B2 zDM+b50{UX4IaU=6(Qs=VUzLCEGP-<=S+QQWmla8wuAWtRqM?-ErKpyp0=SppUb}?S z#C=f%5{$06Mb55@L}PrR1vm-sbbBEI()ju>mhWwjBt3Kn00000NkvXXu0mjfQO#9k diff --git a/public/images/pokemon/exp/back/713.json b/public/images/pokemon/exp/back/713.json index c2e09d4783e..0ff72eef867 100644 --- a/public/images/pokemon/exp/back/713.json +++ b/public/images/pokemon/exp/back/713.json @@ -1,188 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 199, - "h": 199 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 87, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 87, - "h": 64 - }, - "frame": { - "x": 87, - "y": 135, - "w": 87, - "h": 64 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6f396042cb759179580f2aeb1af94e22:59471aca6db39209b1e31d5894938bcb:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 357, "h": 248 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/713.png b/public/images/pokemon/exp/back/713.png index 6692bc5c65a3879fe6d2ae41f1be3f80984a266f..d6782ee4357f79322d75032ddfddf2540ba8a498 100644 GIT binary patch literal 3737 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 diff --git a/public/images/pokemon/exp/back/shiny/697.json b/public/images/pokemon/exp/back/shiny/697.json index ade475cd439..6963da289ab 100644 --- a/public/images/pokemon/exp/back/shiny/697.json +++ b/public/images/pokemon/exp/back/shiny/697.json @@ -1,1196 +1,992 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 374, - "h": 374 - }, - "scale": 1, - "frames": [ - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 60, - "h": 78 - }, - "frame": { - "x": 0, - "y": 78, - "w": 60, - "h": 78 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 77, - "h": 73 - }, - "frame": { - "x": 285, - "y": 0, - "w": 77, - "h": 73 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 285, - "y": 73, - "w": 76, - "h": 75 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 225, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 299, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 299, - "y": 296, - "w": 73, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc19d18c6fcbcf52992f8e0181b428f3:44bc6e229ce96fd68619c97288aeb670:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 370, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 558, "y": 227, "w": 90, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 90, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 376, "w": 88, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 88, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 89, "y": 379, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 365, "y": 378, "w": 86, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 86, "h": 76 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 640, "y": 449, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 84, "h": 77 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 552, "y": 378, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 92, "y": 303, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 465, "y": 302, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 186, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 225, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 472, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 565, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 277, "y": 301, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 388, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 97, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 292, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 196, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 582, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 98, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 485, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 388, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 75, "w": 96, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 96, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 286, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 670, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 658, "y": 226, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 94, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 191, "y": 76, "w": 94, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 94, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 279, "y": 226, "w": 93, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 679, "y": 0, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 482, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 379, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 773, "h": 526 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/697.png b/public/images/pokemon/exp/back/shiny/697.png index cc3a5b344c3cd5acd125132b043af85868e5d46b..fabed85246250e7f49ed8a50e1b02e9a60af1f30 100644 GIT binary patch literal 36989 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 AIRF3v diff --git a/public/images/pokemon/exp/back/shiny/700.json b/public/images/pokemon/exp/back/shiny/700.json index fd3cf94bb73..70083de61c9 100644 --- a/public/images/pokemon/exp/back/shiny/700.json +++ b/public/images/pokemon/exp/back/shiny/700.json @@ -1,1364 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 248, - "h": 248 - }, - "scale": 1, - "frames": [ - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 54, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 61 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 50, - "h": 64 - }, - "frame": { - "x": 54, - "y": 0, - "w": 50, - "h": 64 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 50, - "h": 64 - }, - "frame": { - "x": 0, - "y": 61, - "w": 50, - "h": 64 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 61 - }, - "frame": { - "x": 50, - "y": 64, - "w": 51, - "h": 61 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 48, - "h": 64 - }, - "frame": { - "x": 101, - "y": 64, - "w": 48, - "h": 64 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 61 - }, - "frame": { - "x": 0, - "y": 125, - "w": 51, - "h": 61 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 49, - "h": 61 - }, - "frame": { - "x": 51, - "y": 125, - "w": 49, - "h": 61 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 49, - "h": 61 - }, - "frame": { - "x": 51, - "y": 125, - "w": 49, - "h": 61 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 100, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 0, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 48, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 48, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 148, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 148, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 196, - "y": 120, - "w": 48, - "h": 60 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 196, - "y": 120, - "w": 48, - "h": 60 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cc4ca4dff49e9c03ffd4d0d75ae6e17b:1555e19065e6e4144c3cbb6020a0ae39:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 101, "y": 0, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 48, "h": 63 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 0, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 60, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 53, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 148, "y": 64, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 149, "y": 0, "w": 46, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 46, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 53, "y": 0, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 48, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 244, "h": 241 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/700.png b/public/images/pokemon/exp/back/shiny/700.png index fe533ba5a8865fed63000de624b42b19774cc4f8..dab66177e9918bcae750be83879a7486bc3884f1 100644 GIT binary patch literal 7024 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 diff --git a/public/images/pokemon/exp/back/shiny/702.json b/public/images/pokemon/exp/back/shiny/702.json index 2e194f21033..9680e17e397 100644 --- a/public/images/pokemon/exp/back/shiny/702.json +++ b/public/images/pokemon/exp/back/shiny/702.json @@ -1,1028 +1,443 @@ -{ - "textures": [ - { - "image": "702.png", - "format": "RGBA8888", - "size": { - "w": 141, - "h": 141 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 47, - "h": 35 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 94, - "y": 0, - "w": 47, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 47, - "y": 104, - "w": 47, - "h": 32 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:72bba6c37c149abe81c9754a412876bd:fb5c4a7192ee7ba359b93fb9fea89158:ba8fdab405d5efab99c4aa1084328e6b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 142, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 140, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 72, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 36, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "702.png", + "format": "I8", + "size": { "w": 188, "h": 103 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/702.png b/public/images/pokemon/exp/back/shiny/702.png index 12401f8950b37a390fc4e07a0cd5faca924d959f..7a02b912cf0d9d0e6b6a0d3a6d18a91fe12b177a 100644 GIT binary patch literal 1999 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 bzi|8un(Dqf1Jkty00000NkvXXu0mjf2qfLW diff --git a/public/images/pokemon/exp/back/shiny/712.json b/public/images/pokemon/exp/back/shiny/712.json index 1fc96cf19a4..869a92fd6ea 100644 --- a/public/images/pokemon/exp/back/shiny/712.json +++ b/public/images/pokemon/exp/back/shiny/712.json @@ -1,3338 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 208, - "h": 208 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6fc0455d6f0af01f72622b0f21f8ee70:352443e5019cc9719abfbd45c1015afa:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 36, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 36, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 108, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 108, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 37, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 37, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 74, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 74, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 144, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 144, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 180, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 180, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 168, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 168, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 216, "h": 207 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/712.png b/public/images/pokemon/exp/back/shiny/712.png index 709718daf83275ba3812cdee1837194ff7c71e79..989ed14b08edfb8d638ef25442377d07e36d3431 100644 GIT binary patch literal 3497 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 X2adaZ<3h%E00000NkvXXu0mjfo;`x- literal 3421 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 UlI#aa|BYnY8v5#$YPM1T0_v%C-2eap literal 3358 zcmV+(4dL>MP)o*^1t-|^8f#NR7wH>0004WQchCr z86{u;CJ|hmk-j{lY(5CyoNmd)<<$!A!G{RLAzUsGFS~_%bG6u{ijFSL@+z)lhGls~ zS$8={uz0n_H@lnI$}BSt|G_uP!^&O^l0xiCF-^*4t>c<($d{)lOBZrr*|n)u-fNAA zuq}vGnQd=KhEjP%+1I-`y#D~WI>r9_<(HbZwJZ5I@M3u+SwBz4avX)NC*FDFCaHr9G z98d6T8iMPUrz>lngOT~+oJ~b@S@)*3q&*e)B65blo2BxIvf;c}-yv~|mpxrZNu560PSkvx1Yt(>9nX1P3)tQ!jgrx?`~%wH92 z3i;l5sfzg$7;Rm+_toZS4m1}+QmhN+u1kEH9+j_eL28JIHo9#6Z{udx@QeK{)~BayEx_pcRaG6z z&vt-(i)D+3S^qcv%6@LwN7S{}0$s{s>lPM}WjD+GZ15w?`sMxHu8*j@6^Ab5$kvRb zv%>BV+^YyhBFV%Kx%xDJt%EgwA=TwCd8?kI1B90pzgN&;9!J zbWu6SaS!74bUFM>LX(C!0J*$FAnWIm`kZy0>LMK+BIZG|95(teetiU8 zq=6im91FuLM{@IfLA3ibhzNU~vD6I*|$hxI$ zzdNW162Gd5c5#F-e&8s6g>)D)vaR|Ex+hs}j^kV|&k>8r8G_3Umu3#3K9cT9R*aF> z8Y1gE^KhhShZqhZ`C;it`*(T-i?3WMtFBL>+mO}d0H7dXu*?yD!d4K-=f`dcO5IDXpf(s$g(nCJ-0;((J?)Thur$;#c44EOqmwI&u6qgZa} zhY7&49NNKiGX&sex%yPPjO=KRzf=YvV-q|4;x0pk)_;DPix~p|Aj@*~DRtYjx@n#* z+~LT5?M(c;=nDBcl0|?q*+zY8T|rik(K0-Ki6+lx${fsvGcVhykN;}}wlAw1R{r0Y zWeDZUzIQbSTz>9tt+O~To7cyLzE;Uz&Ebb;{>ong9~X80>TNv7sXj(2tIpB?#-uPr zWsZhySsn4x3StaoAC5u)6A6{!B-vgRe;JI<0gM=eXgEn$b%RO& zla=h!G<=JRUy*(HZqC9GKV>*cR_g!UaKXgyV!K2QucP%PUpF9e#{!Y96cRm<0aE10WKRBMEo-G4^s_>VA=9;&2>*qB1QYN93;D zD6r{7=L`l(-VdN9luv zWkt(lwK=9H{}b>J4Xz|$SL*4JmK9C+w>c&j04gva+b4@oeAEc9wl6FF0l!~#Hl9H)m}jpAyr5E76jgG?*{ zq{4AH)ihd%xNX}3vN|AB0D$ToX`1smj-;CKv7yhgj+JEu$l5`s$VHrT*aP%oaU21= z@}qU=Hm2?f5J08`0M(TPu-V;{O^ijxqm1$B6%3s6>VPZ;WP<%Tu#hb2m{IJ?n1mI% z!5q>E5I`n#zQsOD7D0F%r;SHtxRSm@KnG+sL8jfY0J6Y2L>R}FYCKBK6dX$cvV0T?$kKvLnCD2q0gAX1jo?arOM?RYKo$=& zod$p&S0WXzw5&?bE8XNMi~t+}vPu9%z;URHE2(&#oR8}OSvrs@_?>wi2FD>it^~Rq zLqHaGfUGPB4dY6QV@X_*g2zzjDJdabsIL5rq z;|u^ToK-%qh(kQ0_^}OxuW?z&O{*V*ufM$j(eBK`38{H zko^RY^CcjQ&G81STCm`Rr&I)h0J3}t$oYJb76BlE zEN?zR>a#i0O?39M3gpb18^?%h5C8(mauvv# zlw%bE5CLSl2;@x2LFXY<6996U3r~=mv{uaq*gz8>X`a1{-fqtDjWm9 z^*^#5=Re}%hTFQc+yBGOtl!$pnH&QDQE)8d{Kxd^Q9rJxg@2qm7Wa%GBF9qUA0bwq z!#yVld;5R&uo|o$yL0JzEO+GS+%|8_C!WVLJ;yEl$NcR>b^Cvr1D=y3$1z6v54z!b zEQ3)z$D;gX<<94^%=={J-siF0lmmXWL+^04?t^av|0~#i~s-t07*qoM6N<$f_trEx&QzG diff --git a/public/images/pokemon/exp/shiny/696.json b/public/images/pokemon/exp/shiny/696.json index 0d54e1282c5..7ea3165c669 100644 --- a/public/images/pokemon/exp/shiny/696.json +++ b/public/images/pokemon/exp/shiny/696.json @@ -1,692 +1,1055 @@ -{ - "textures": [ - { - "image": "696.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:83a7f65d0ef4a30ff24cb813c97b1fe2:69043b7539e99a45979999a29408221b:58b7763fb9abdd043e9bfa400cfafdef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "696.png", + "format": "I8", + "size": { "w": 286, "h": 179 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/696.png b/public/images/pokemon/exp/shiny/696.png index 0a11f7b7ec7a90593d3a7011dd17eb393835e9e7..86ecac0d371a2a7eae3ae1c0bebc91cc7324b456 100644 GIT binary patch literal 5159 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 diff --git a/public/images/pokemon/exp/shiny/697.json b/public/images/pokemon/exp/shiny/697.json index 7d68fbf764e..c56de41946c 100644 --- a/public/images/pokemon/exp/shiny/697.json +++ b/public/images/pokemon/exp/shiny/697.json @@ -1,1175 +1,983 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 378, - "h": 378 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 76, - "y": 75, - "w": 76, - "h": 74 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 152, - "y": 0, - "w": 75, - "h": 75 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 227, - "y": 0, - "w": 76, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 222, - "y": 149, - "w": 67, - "h": 77 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 227, - "y": 74, - "w": 72, - "h": 75 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 299, - "y": 74, - "w": 67, - "h": 77 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 60, - "h": 79 - }, - "frame": { - "x": 269, - "y": 229, - "w": 60, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f5b6396fc735fbaf3881fa6c1e4cdad7:20237f200f066bd1e2f7b8926f0361f1:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 184, "y": 231, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 94, "y": 157, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 90, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 391, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 275, "y": 390, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 363, "y": 463, "w": 86, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 86, "h": 81 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 649, "y": 386, "w": 86, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 82 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 449, "y": 463, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 87, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 312, "w": 90, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 90, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 372, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 92, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 473, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 556, "y": 386, "w": 93, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 181, "y": 387, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 648, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 186, "y": 312, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 661, "y": 157, "w": 96, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 96, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 458, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 669, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 464, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 568, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 661, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 289, "y": 0, "w": 95, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 95, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 0, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 192, "y": 0, "w": 97, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 97, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 480, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 384, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 192, "y": 77, "w": 96, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 96, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 566, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 553, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 277, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 92, "y": 310, "w": 94, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 94, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 157, "w": 94, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 94, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 458, "y": 234, "w": 93, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 93, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 184, "y": 153, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 380, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 288, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 762, "h": 616 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/697.png b/public/images/pokemon/exp/shiny/697.png index b89902a748f6fe6186ce3e917b45fdafc8c33f0d..7f4a0c093276163a58e53744f22781cadf20980a 100644 GIT binary patch literal 45056 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 z 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 diff --git a/public/images/pokemon/exp/shiny/700.json b/public/images/pokemon/exp/shiny/700.json index 4b7158b6eb9..fd6ef9b1bed 100644 --- a/public/images/pokemon/exp/shiny/700.json +++ b/public/images/pokemon/exp/shiny/700.json @@ -1,1070 +1,523 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 45, - "y": 176, - "w": 42, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 101, - "y": 118, - "w": 50, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b88614ce72ee950ea29dcf939b8dfd56:5daab4ddd86f67a34aaa4b7377e3b534:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": { + "0001.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0002.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0003.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0004.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0005.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0006.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0007.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0008.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0009.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0010.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0011.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0012.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0013.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0014.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0015.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0016.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0017.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0018.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0019.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0020.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0021.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0022.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0023.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0024.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0025.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0026.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0027.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0028.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0029.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0030.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0031.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0032.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0033.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0034.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0035.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0036.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0037.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0038.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0039.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0040.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0041.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0042.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0043.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0044.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0045.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0046.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0047.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0048.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0049.png": { + "frame": { "x": 0, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0050.png": { + "frame": { "x": 193, "y": 60, "w": 43, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 43, "h": 62 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0051.png": { + "frame": { "x": 99, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0052.png": { + "frame": { "x": 147, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0053.png": { + "frame": { "x": 0, "y": 0, "w": 51, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 51, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0054.png": { + "frame": { "x": 0, "y": 60, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 46, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0055.png": { + "frame": { "x": 92, "y": 178, "w": 43, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 43, "h": 60 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0056.png": { + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0057.png": { + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0058.png": { + "frame": { "x": 136, "y": 178, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0059.png": { + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0060.png": { + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0061.png": { + "frame": { "x": 0, "y": 179, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0062.png": { + "frame": { "x": 185, "y": 123, "w": 44, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 44, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0063.png": { + "frame": { "x": 47, "y": 62, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 45, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0064.png": { + "frame": { "x": 44, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 242, "h": 298 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/700.png b/public/images/pokemon/exp/shiny/700.png index 5c809e628f5f357f80f086493e17a54bdf2120aa..f7addc720bf7f7e5b55451cef909b6f155ddbd7e 100644 GIT binary patch literal 7819 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 D(s3F{ literal 4530 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 YsH9q6$O(GK{HX!3fT7G9Ox+*-58U#6n*aa+ literal 2079 zcmV+)2;ldLP)dN1sj2`1e{`xj6I zri;S!A#C`>8oc_0!oD3pi=AfY6Knjy1|O02|G|f`%Nl?)WadLEhrGcDv53saW4aA= z6vBWRbw&6b_PTlK1W793_ptsK_~RjgOoBUM&$+33Dc}@G&~Tlws*s-|!3tw#nT-xa z9Cflj*lF@6KFtCx31pZ=Kxnv06*^&qX0jiC$S{0#o?cfNkIRV>+y$HJ@dp@eJ&}QC z$wWYwn^K_{mZQ!j3d&AYV9Qms6jzE6Ro%FYy4?4$Vozsr$IfXv+AYB)%blGz!z%7O zSi7fFP+J;#Wqu~P9#*!N!IHDRa=4~@Ho@x07n^)k{mV4q^YvsPaJWVVI#jS<$?{uL zSZ<6}kFNw?;AbZ*Y{2C_ml=Q@ZZ9kyg=FU<{`|nt4hDc7yMx82eXifdtOgHqxIPwd zV9CXLYo?Wvd0T$;Xo$GX822$nm0gkKcurvX4%Sb1I!g7<1-URfur8MmZippQ_jmm; z#=04TUbwp18n*^2i!;nf8oqbsAi=d zN`wr}u#bcaX|Ng*uh+ll(Z`U;sW6r+4_an<w7eV z7ZqUEFJWGW3oMpmCxmEs1e$ASA6pgm`dmr7cAEZ zg5Z>I$>oc5^H}5qOBYx*9^n|8fC{X*4>NUZ?uOxhT5;8Py0xJk%Xw^+E;9mw0t-n% zD6@0L3x;c^ExA-dpNk}i8LO$+rprXPuo)HDNf%)P`Tia3aLp{MS5|=zI^9*JyK1nj z0uo$dw&be5QGXje<-;kinq^hC%!G+_*`%uu4OMR}#mdzh`T1s4*fx|C zwj3JA00bb#RVp}KTPWRh*`^DQ3Ti}NUkZ*p1-XD;GU-l0 zf~()TlYK6DyI!<^uT)54k7EUz&Q#!aQNL;~iK9t5{n*d$+#_3n#oPBff3H+XVCle~ zsGzX2iE&woqGK3%xGnxLD<`@3aF(Ho1LHFl%CSim^65^&2`E_TA~rK8*`BHpVa@XE z6gwfZY_uJW^PGR*aeClDJ&6+Oo~aQ1;9}woD|*GUpq#PGet$I!Ct2t7>DH=XHcMiy zmdEN|A;({3x^$Xu9~JxoSi(Ju=_$953c&y@O;?qtYi@HDs&7qfdVN%sZYLEgvNh?- z^~j?YxKf2;EaRrrWg>hKe6tG3jB2WCoNgx-ctt(4n$;Gn`T&a7x= z)^_Q3Qo&7kZI^B@6-1-C>B{Zh*Q%h_d1@DE)1AIn1vRIlT4t^C_q;~w_EAC3srtM{ z?QGg$JE>sr0@Rrz+Z`XJ2?h!U;`C`EA5>e0|i+BuDr#DDx~r~bqoY| z@biuVsKI)7<<Fn1_!|V*ieOH$ADR?l%}h%%D2Vx!9@hP zb_~Q<`_ncLyEnk)eQe6+VYuS0dB;F(88G|OjLpMtVDJs>iOoZg$UBaKl+7b?Zd8p; z+B~StF|cJF18JMbeQe(5QSBHwH8^BdsKTDvJYwTSqpVI8&hzTW#}*90T?W ze(V^iuz8eXt8E^UW58?yBF8|L&7%TaXY+_01DJCRRM|X=v9&gj_?M9~$H0{erPx}V zN9LE(bH_ln3WY|5T7yHWZ=zC#QX|6q1_x?s^C&hV)EXSh90S!V)EN;f4G!0ifwxpB zHzHIT910x+wJJ0>B2+pCun)F4UG}-(?VIRlaOk7Luz5_w=5frd!{#w;9(v(2Y#zhr z5!|#IHjiQR=o+7~d5jn_V#J6MBSwrEF=E7s5hF&77%}35@gE!$d;tQ$P{sfN002ov JPDHLkV1jb`+G_v+ diff --git a/public/images/pokemon/variant/exp/696.json b/public/images/pokemon/variant/exp/696.json index 3a4b4480673..677f5d98578 100644 --- a/public/images/pokemon/variant/exp/696.json +++ b/public/images/pokemon/variant/exp/696.json @@ -1,40 +1,38 @@ { "1": { - "774411":"5e0b0b", - "101010":"101010", - "ff8f1f":"a50d0d", - "4f2e1d":"023425", - "5f4f4f":"0b4c29", - "af8f7f":"478136", - "3f3f44":"4c3216", - "8f6f5f":"1b6430", - "f8f7f9":"dfdea7", - "bfbfcc":"cbbe8c", - "121212":"121212", - "8f8f99":"ad8c63", - "c2c2cf":"c9bc87", - "fbfafc":"dddca1", - "772d34":"77452d", - "ff9bd5":"c98c68" - }, - "2": { - "774411":"395cb7", - "101010":"101010", - "ff8f1f":"d2e9ff", - "4f2e1d":"3e1f18", - "5f4f4f":"644943", - "af8f7f":"a59e9a", - "3f3f44":"250860", - "8f6f5f":"83726e", - "f8f7f9":"6e46a7", - "bfbfcc":"593097", - "121212":"decaff", - "8f8f99":"411684", - "c2c2cf":"7ccad5", - "fbfafc":"fbfafc", - "772d34":"375ab3", - "ff9bd5":"79c8d3" - } +"734517": "5e0b0b", +"ffa64c": "a50d0d", +"4a322c": "023425", +"404040": "4c3216", +"101010": "101010", +"65483a": "0b4c29", +"966858": "1b6430", +"f8f8f8": "dfdea7", +"8c8c8c": "ad8c63", +"bfbfbf": "cbbe8c", +"000000": "000000", +"b73b6b": "4c3216", +"ff949e": "c98c68", +"b3b9b9": "cbbe8c", +"3f3d3d": "4c3216" +}, +"2": { +"734517": "395cb7", +"ffa64c": "d2e9ff", +"4a322c": "3e1f18", +"404040": "250860", +"101010": "101010", +"65483a": "644943", +"966858": "83726e", +"f8f8f8": "6e46a7", +"8c8c8c": "411684", +"bfbfbf": "593097", +"000000": "decaff", +"b73b6b": "395cb7", +"ff949e": "79c8d3", +"b3b9b9": "79c8d3", +"3f3d3d": "395cb7" +} } diff --git a/public/images/pokemon/variant/exp/697.json b/public/images/pokemon/variant/exp/697.json index dae4554a1b7..b8d305022f5 100644 --- a/public/images/pokemon/variant/exp/697.json +++ b/public/images/pokemon/variant/exp/697.json @@ -1,42 +1,42 @@ { - "1": { - "1f0a0a":"1f0a0a", - "471515":"0a1b17", - "621e1d":"0b241e", - "902e2c":"153626", - "b45250":"285234", - "d16c6b":"416a45", - "653510":"5e0b0b", - "b56726":"971c1c", - "e39f33":"b52424", - "756b66":"ad8c63", - "b1b0b5":"cbbe8c", - "f0f0f2":"dfdea7", - "573b43":"4c3216", - "736964":"ab885f", - "ac628a":"9d5d18", - "aeadb3":"a88860", - "ededf0":"dbdaa4" - }, - "2": { - "1f0a0a":"1f0a0a", - "471515":"191124", - "621e1d":"52352f", - "902e2c":"83726e", - "b45250":"ab9b97", - "d16c6b":"c7bcb9", - "653510":"9d5390", - "b56726":"ce7ecc", - "e39f33":"f4dbf6", - "756b66":"26173b", - "b1b0b5":"33214f", - "f0f0f2":"4b2e64", - "573b43":"cc7cc9", - "736964":"f6dcf7", - "ac628a":"eed5f0", - "aeadb3":"c779c4", - "ededf0":"f8defa" - } +"1": { +"080808": "080808", +"32252c": "3e1e17", +"50131e": "0b241e", +"722533": "153626", +"54434c": "4c3216", +"964b1c": "5e0b0b", +"963e4e": "285234", +"bf7545": "971c1c", +"f19d5a": "b52424", +"9f9d98": "ad8c63", +"cccccc": "cbbe8c", +"fafafa": "dfdea7", +"cac2c2": "cbbe8c", +"f7eeee": "dfdea7", +"53414b": "4c3216", +"30222a": "3e1e17", +"53454d": "4c3216" +}, +"2": { +"080808": "080808", +"32252c": "0d0124", +"50131e": "573b36", +"722533": "83726e", +"54434c": "170c25", +"964b1c": "9d5390", +"963e4e": "ab9b97", +"bf7545": "ce7ecc", +"f19d5a": "f4dbf6", +"9f9d98": "26173b", +"cccccc": "33214f", +"fafafa": "4b2e64", +"cac2c2": "ce7ecc", +"f7eeee": "f4dbf6", +"53414b": "dea5dd", +"30222a": "ce7ecc", +"53454d": "f4dbf6" +} } diff --git a/public/images/pokemon/variant/exp/700.json b/public/images/pokemon/variant/exp/700.json index 0b6071ad765..1189d463f2b 100644 --- a/public/images/pokemon/variant/exp/700.json +++ b/public/images/pokemon/variant/exp/700.json @@ -1,34 +1,32 @@ { - "1": { - "9a4557": "452f89", - "19657b": "a63071", - "fb9cc3": "c7a6ee", - "52cbee": "e974db", - "000000": "000000", - "cb628d": "996cd2", - "f7bbd4": "e1cff3", - "0d146e": "0d146e", - "3744e5": "d648b7", - "584f4f": "5c6889", - "ffffff": "f7f5ff", - "1f337b": "a63071", - "cbc0c0": "c3c5d9", - "2999b9": "d648b7" - }, - "2": { - "9a4557": "197d46", - "19657b": "c72537", - "fb9cc3": "7dec9d", - "52cbee": "ff9a68", - "000000": "000000", - "cb628d": "5dae7d", - "f7bbd4": "f7bbd4", - "0d146e": "0d146e", - "3744e5": "eb5244", - "584f4f": "7f5c89", - "ffffff": "fff5fc", - "1f337b": "c72537", - "cbc0c0": "d9c3d6", - "2999b9": "eb5244" - } +"1": { +"101010": "101010", +"8a2843": "452f89", +"235a99": "a63071", +"895c72": "5c6889", +"d85a7a": "996cd2", +"528fcc": "d648b7", +"a88d8c": "8c8fa8", +"f18a78": "b52d27", +"fa8caa": "c7a6ee", +"64c8f3": "e974db", +"d9c3c3": "c3c5d9", +"fff5f5": "f7f5ff", +"65798c": "65798c" +}, +"2": { +"101010": "101010", +"8a2843": "0e6134", +"235a99": "900d1b", +"895c72": "7f5c89", +"d85a7a": "5dae7d", +"528fcc": "dd3d4f", +"a88d8c": "7f5c89", +"f18a78": "d14ea4", +"fa8caa": "7dec9d", +"64c8f3": "ff9a68", +"d9c3c3": "d9c3d6", +"fff5f5": "fff5fc", +"65798c": "65798c" +} } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/702.json b/public/images/pokemon/variant/exp/702.json index 1edd126264e..12feb29a0fd 100644 --- a/public/images/pokemon/variant/exp/702.json +++ b/public/images/pokemon/variant/exp/702.json @@ -3,30 +3,30 @@ "101010": "101010", "262626": "2a3b5e", "4d4d4d": "6789b3", - "ccbb99": "a3d1cc", - "efefcf": "ddfff5", - "704030": "a53c42", - "906030": "c9685f", - "efbf5f": "ffd3b6", - "cf8f4f": "e49f84", + "bfbf86": "a3d1cc", + "f2f2aa": "ddfff5", + "735c2e": "a53c42", + "997a3d": "c9685f", + "f2c261": "ffd3b6", + "bf994c": "e49f84", "1d1d1d": "1a1c45", - "fefefe": "fefefe", + "f8f8f8": "f8f8f8", "464646": "424b8f", - "df7f5f": "7cd6a1" + "d97d21": "7cd6a1" }, "2": { "101010": "101010", "262626": "072d38", "4d4d4d": "197870", - "ccbb99": "aaa8d6", - "efefcf": "ece5ff", - "704030": "1e0e27", - "906030": "2d1533", - "efbf5f": "5f3662", - "cf8f4f": "432249", + "bfbf86": "aaa8d6", + "f2f2aa": "ece5ff", + "735c2e": "1e0e27", + "997a3d": "2d1533", + "f2c261": "5f3662", + "bf994c": "432249", "1d1d1d": "02172d", - "fefefe": "fefefe", + "f8f8f8": "f8f8f8", "464646": "17646c", - "df7f5f": "d2fff1" + "d97d21": "d2fff1" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/713.json b/public/images/pokemon/variant/exp/713.json index d18009819f4..ca45360ecea 100644 --- a/public/images/pokemon/variant/exp/713.json +++ b/public/images/pokemon/variant/exp/713.json @@ -1,26 +1,32 @@ { "1": { - "42575f": "994255", - "bbeef9": "ffbfda", - "ffffff": "ffebf2", - "473552": "4c131f", - "9e7ac1": "994255", - "6a4e7a": "732334", - "8db7c7": "d97389", - "000000": "000000", - "698e9c": "bf566d", - "e6c81e": "9dcc3e" + "608cba": "bf566d", + "bff4ff": "ffbfda", + "85d7f2": "f29eb3", + "967acc": "732334", + "77b8d9": "d97389", + "335980": "994255", + "f2ffff": "ffebf2", + "101010": "101010", + "737373": "737373", + "bfbfbf": "bfbfbf", + "efab34": "9dcc3e", + "ffe46a": "cbe696", + "f8f8f8": "f8f8f8" }, "2": { - "42575f": "42575f", - "bbeef9": "fcc95c", - "ffffff": "fff2ad", - "473552": "473552", - "9e7ac1": "6cb3ae", - "6a4e7a": "006761", - "8db7c7": "cc7b1e", - "000000": "000000", - "698e9c": "a8632a", - "e6c81e": "8dd9d4" + "608cba": "a8632a", + "bff4ff": "fcc95c", + "85d7f2": "e69e2b", + "967acc": "2c7a75", + "77b8d9": "cc7b1e", + "335980": "824628", + "f2ffff": "fff2ad", + "101010": "101010", + "737373": "737373", + "bfbfbf": "6cb3ae", + "efab34": "6cb3ae", + "ffe46a": "b9f2ee", + "f8f8f8": "b9f2ee" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/697.json b/public/images/pokemon/variant/exp/back/697.json index 61a5f16551b..5303995a117 100644 --- a/public/images/pokemon/variant/exp/back/697.json +++ b/public/images/pokemon/variant/exp/back/697.json @@ -1,37 +1,34 @@ { - "1": { - "080808":"080808", - "621e1d":"0b241e", - "902f2d":"153626", - "b45250":"285234", - "653510":"5e0b0b", - "b56827":"971c1c", - "e39f33":"b52424", - "46413f":"4c3216", - "766c67":"ad8c63", - "adaaae":"cbbe8c", - "f0f0f2":"dfdea7", - "3d3937":"ab8a61", - "786d68":"cfc28f", - "afacb0":"c9bd8b", - "ededf0":"e0dfa8" - }, - "2": { - "080808":"080808", - "621e1d":"52352f", - "902f2d":"83726e", - "b45250":"ab9b97", - "653510":"9d5390", - "b56827":"ce7ecc", - "e39f33":"f4dbf6", - "46413f":"170c25", - "766c67":"26173b", - "adaaae":"33214f", - "f0f0f2":"4b2e64", - "3d3937":"c97bc7", - "786d68":"e5a9ea", - "afacb0":"d180ce", - "ededf0":"ededf0" - } + +"1": { +"080808": "080808", +"32252c": "3e1e17", +"50131e": "0b241e", +"722533": "153626", +"54434c": "4c3216", +"964b1c": "5e0b0b", +"963e4e": "285234", +"bf7545": "971c1c", +"f19d5a": "b52424", +"9f9d98": "ad8c63", +"cccccc": "cbbe8c", +"fafafa": "dfdea7", +"53454d":"4c3216" +}, +"2": { +"080808": "080808", +"32252c": "0d0124", +"50131e": "573b36", +"722533": "83726e", +"54434c": "170c25", +"964b1c": "9d5390", +"963e4e": "ab9b97", +"bf7545": "ce7ecc", +"f19d5a": "f4dbf6", +"9f9d98": "26173b", +"cccccc": "33214f", +"fafafa": "4b2e64", +"53454d": "f4dbf6" +} } diff --git a/public/images/pokemon/variant/exp/back/700.json b/public/images/pokemon/variant/exp/back/700.json index 4b65fb00405..1189d463f2b 100644 --- a/public/images/pokemon/variant/exp/back/700.json +++ b/public/images/pokemon/variant/exp/back/700.json @@ -1,26 +1,32 @@ { - "1": { - "107090": "c72537", - "af4f6f": "452f89", - "7fcfdf": "ff9a68", - "ffaebb": "c7a6ee", - "101010": "101010", - "807070": "5c6889", - "ef6f8f": "996cd2", - "ffffff": "f7f5ff", - "ddcccc": "c3c5d9", - "6f8faf": "eb5244" - }, - "2": { - "107090": "c72537", - "af4f6f": "197d46", - "7fcfdf": "ff9a68", - "ffaebb": "7dec9d", - "101010": "101010", - "807070": "7f5c89", - "ef6f8f": "5dae7d", - "ffffff": "fff5fc", - "ddcccc": "d9c3d6", - "6f8faf": "eb5244" - } +"1": { +"101010": "101010", +"8a2843": "452f89", +"235a99": "a63071", +"895c72": "5c6889", +"d85a7a": "996cd2", +"528fcc": "d648b7", +"a88d8c": "8c8fa8", +"f18a78": "b52d27", +"fa8caa": "c7a6ee", +"64c8f3": "e974db", +"d9c3c3": "c3c5d9", +"fff5f5": "f7f5ff", +"65798c": "65798c" +}, +"2": { +"101010": "101010", +"8a2843": "0e6134", +"235a99": "900d1b", +"895c72": "7f5c89", +"d85a7a": "5dae7d", +"528fcc": "dd3d4f", +"a88d8c": "7f5c89", +"f18a78": "d14ea4", +"fa8caa": "7dec9d", +"64c8f3": "ff9a68", +"d9c3c3": "d9c3d6", +"fff5f5": "fff5fc", +"65798c": "65798c" +} } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/702.json b/public/images/pokemon/variant/exp/back/702.json index a5bb32bb790..12feb29a0fd 100644 --- a/public/images/pokemon/variant/exp/back/702.json +++ b/public/images/pokemon/variant/exp/back/702.json @@ -1,22 +1,32 @@ { "1": { "101010": "101010", - "4d4d4d": "6789b3", "262626": "2a3b5e", + "4d4d4d": "6789b3", + "bfbf86": "a3d1cc", + "f2f2aa": "ddfff5", "735c2e": "a53c42", + "997a3d": "c9685f", "f2c261": "ffd3b6", "bf994c": "e49f84", - "997a3d": "c9685f", - "000000": "000000" + "1d1d1d": "1a1c45", + "f8f8f8": "f8f8f8", + "464646": "424b8f", + "d97d21": "7cd6a1" }, "2": { "101010": "101010", - "4d4d4d": "197870", "262626": "072d38", + "4d4d4d": "197870", + "bfbf86": "aaa8d6", + "f2f2aa": "ece5ff", "735c2e": "1e0e27", + "997a3d": "2d1533", "f2c261": "5f3662", "bf994c": "432249", - "997a3d": "2d1533", - "000000": "000000" + "1d1d1d": "02172d", + "f8f8f8": "f8f8f8", + "464646": "17646c", + "d97d21": "d2fff1" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/713.json b/public/images/pokemon/variant/exp/back/713.json index 8c54b0ab776..61977f60470 100644 --- a/public/images/pokemon/variant/exp/back/713.json +++ b/public/images/pokemon/variant/exp/back/713.json @@ -1,22 +1,22 @@ { "1": { - "6994bf": "bf566d", - "f2ffff": "ffebf2", - "335980": "994255", + "608cba": "bf566d", "967acc": "732334", - "77b8d9": "d97389", "85d7f2": "f29eb3", "bff4ff": "ffbfda", + "335980": "994255", + "f2ffff": "ffebf2", + "77b8d9": "d97389", "101010": "101010" }, "2": { - "6994bf": "a8632a", - "f2ffff": "fff2ad", - "335980": "824628", + "608cba": "a8632a", "967acc": "2c7a75", - "77b8d9": "cc7b1e", "85d7f2": "e69e2b", "bff4ff": "fcc95c", + "335980": "824628", + "f2ffff": "fff2ad", + "77b8d9": "cc7b1e", "101010": "101010" } } \ No newline at end of file From 8864347cb02b9f24d3438c09165b8c4fb2204e53 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 18 Feb 2025 13:53:57 +1100 Subject: [PATCH 059/171] [Move] Make Disable disable most recent move instead of oldest move (#5321) --- src/data/battler-tags.ts | 7 ++++--- src/data/move.ts | 5 ++++- src/test/moves/disable.test.ts | 22 +++++++++++++++++++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index b97be756048..8d5f21c0a42 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -42,6 +42,7 @@ import { Species } from "#enums/species"; import { EFFECTIVE_STATS, getStatKey, Stat, type BattleStat, type EffectiveStat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; +import * as Utils from "../utils"; export enum BattlerTagLapseType { FAINT, @@ -274,9 +275,9 @@ export class DisabledTag extends MoveRestrictionBattlerTag { override onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - const move = pokemon.getLastXMoves() - .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); - if (move === undefined) { + const move = pokemon.getLastXMoves(-1) + .find(m => !m.virtual); + if (Utils.isNullOrUndefined(move) || move.move === Moves.STRUGGLE || move.move === Moves.NONE) { return; } diff --git a/src/data/move.ts b/src/data/move.ts index 60c5690ae44..016dae6ab0d 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8506,7 +8506,10 @@ export function initMoves() { .attr(FixedDamageAttr, 20), new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) - .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) + .condition((user, target, move) => { + const lastRealMove = target.getLastXMoves(-1).find(m => !m.virtual); + return !Utils.isNullOrUndefined(lastRealMove) && lastRealMove.move !== Moves.NONE && lastRealMove.move !== Moves.STRUGGLE; + }) .ignoresSubstitute() .reflectable(), new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) diff --git a/src/test/moves/disable.test.ts b/src/test/moves/disable.test.ts index 3748598fa90..bd56201ad33 100644 --- a/src/test/moves/disable.test.ts +++ b/src/test/moves/disable.test.ts @@ -123,6 +123,26 @@ describe("Moves - Disable", () => { await game.toNextTurn(); expect(enemyMon.isMoveRestricted(Moves.NATURE_POWER)).toBe(true); - expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[1].move)).toBe(false); + expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[0].move)).toBe(false); + }, 20000); + + it("disables most recent move", async() => { + game.override.enemyMoveset([ Moves.SPLASH, Moves.TACKLE ]); + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + game.move.select(Moves.DISABLE); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + expect(enemyMon.isMoveRestricted(Moves.TACKLE)).toBe(true); + expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(false); }, 20000); }); From 7fafccf8de1fabdc4d6f0a6832472739944d971b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:47:50 -0800 Subject: [PATCH 060/171] [Test] Disable broken Wimp Out test (#5369) --- src/test/abilities/wimp_out.test.ts | 44 ++++++++++++++++------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/test/abilities/wimp_out.test.ts b/src/test/abilities/wimp_out.test.ts index bff68b54c75..90cd3d62af5 100644 --- a/src/test/abilities/wimp_out.test.ts +++ b/src/test/abilities/wimp_out.test.ts @@ -2,6 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; import { allMoves } from "#app/data/move"; import GameManager from "#app/test/utils/gameManager"; +import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -244,29 +245,32 @@ describe("Abilities - Wimp Out", () => { confirmNoSwitch(); }); - it("If it falls below half and recovers back above half from a Shell Bell, Wimp Out will activate even after the Shell Bell recovery", async () => { - game.override - .moveset([ Moves.DOUBLE_EDGE ]) - .enemyMoveset([ Moves.SPLASH ]) - .startingHeldItems([ - { name: "SHELL_BELL", count: 3 }, - { name: "HEALING_CHARM", count: 5 }, - ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + // TODO: Enable when this behavior is fixed (currently Shell Bell won't activate if Wimp Out activates because + // the pokemon is removed from the field before the Shell Bell modifier is applied, so it can't see the + // damage dealt and doesn't heal the pokemon) + it.todo( + "If it falls below half and recovers back above half from a Shell Bell, Wimp Out will activate even after the Shell Bell recovery", + async () => { + game.override + .moveset([ Moves.DOUBLE_EDGE ]) + .enemyMoveset([ Moves.SPLASH ]) + .startingHeldItems([{ name: "SHELL_BELL", count: 4 }]); + await game.classicMode.startBattle([ Species.WIMPOD, Species.TYRUNT ]); - game.scene.getPlayerPokemon()!.hp *= 0.75; + const wimpod = game.scene.getPlayerPokemon()!; - game.move.select(Moves.DOUBLE_EDGE); - game.doSelectPartyPokemon(1); - await game.phaseInterceptor.to("TurnEndPhase"); + wimpod.damageAndUpdate(toDmgValue(wimpod.getMaxHp() * 0.4)); - expect(game.scene.getPlayerParty()[1].getHpRatio()).toBeGreaterThan(0.5); - expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.TYRUNT); - }); + game.move.select(Moves.DOUBLE_EDGE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + 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(Species.TYRUNT); + }, + ); it("Wimp Out will activate due to weather damage", async () => { game.override From 9cc1b177454baf60738885061793486dde111bec Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:02:39 -0800 Subject: [PATCH 061/171] [Bug] Fix moves/abilities which modify abilities (#5146) * Add setAbility method to pokemon.ts * Edit SwitchAbilitiesAttr to use setAbility * Change AbilityGiveAttr to use setAbility * Rename setAbility to be more accurate * Fix AbilityCopyAttr * Fix AbilityChangeAttr * Fix Transform * Fix imposter * Fix PostDefendAbilityGiveAbAttr * Actually fix imposter * Actually fix transform * Fix CopyFaintedAllyAbilityAbAttr * Fix Trace * Fix PostDefendAbilitySwapAbAttr * Add tests for skill swap * Add tests for doodle * Add tests for entrainment * Add tests for role play * Add test for simple beam * Add test for transform * Add test for imposter * Add tests for mummy * Add tests for trace * Add tests for wandering spirit * Consider legendary weather when changing ability * Ensure that passives are not (re)applied when main abilities change * Add general ability swap test cases * Fix test name * Add NoMidTurnActivationAttr * Remove NoMidTurnActivationAttr from illusion * Remove extraneous call to triggerWeatherBasedFormChanges * Fix primal weather clearing * Change "MidTurn" to "OnGain" * Change NoOnGainActivationAttr to a field in PostSummonAbAttr * Add passive support * Remove redundant parentheses Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: damocleas Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 142 +++++++++++++------- src/data/move.ts | 28 ++-- src/field/pokemon.ts | 18 ++- src/test/abilities/imposter.test.ts | 11 ++ src/test/abilities/mummy.test.ts | 52 +++++++ src/test/abilities/trace.test.ts | 53 ++++++++ src/test/abilities/wandering_spirit.test.ts | 65 +++++++++ src/test/battle/ability_swap.test.ts | 67 +++++++++ src/test/moves/doodle.test.ts | 70 ++++++++++ src/test/moves/entrainment.test.ts | 53 ++++++++ src/test/moves/role_play.test.ts | 53 ++++++++ src/test/moves/simple_beam.test.ts | 42 ++++++ src/test/moves/skill_swap.test.ts | 56 ++++++++ src/test/moves/transform.test.ts | 12 ++ 14 files changed, 661 insertions(+), 61 deletions(-) create mode 100644 src/test/abilities/mummy.test.ts create mode 100644 src/test/abilities/trace.test.ts create mode 100644 src/test/abilities/wandering_spirit.test.ts create mode 100644 src/test/battle/ability_swap.test.ts create mode 100644 src/test/moves/doodle.test.ts create mode 100644 src/test/moves/entrainment.test.ts create mode 100644 src/test/moves/role_play.test.ts create mode 100644 src/test/moves/simple_beam.test.ts create mode 100644 src/test/moves/skill_swap.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index bf3b04e1f63..940b5f0c7d7 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1044,9 +1044,9 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { if (!simulated) { - const tempAbilityId = attacker.getAbility().id; - attacker.summonData.ability = pokemon.getAbility().id; - pokemon.summonData.ability = tempAbilityId; + const tempAbility = attacker.getAbility(); + attacker.setTempAbility(pokemon.getAbility()); + pokemon.setTempAbility(tempAbility); } return true; } @@ -1071,7 +1071,7 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { if (!simulated) { - attacker.summonData.ability = this.ability; + attacker.setTempAbility(allAbilities[this.ability]); } return true; @@ -1908,8 +1908,8 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { if (!simulated) { - pokemon.summonData.ability = knockedOut.getAbility().id; globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); + pokemon.setTempAbility(knockedOut.getAbility()); } return true; } @@ -1993,6 +1993,21 @@ export class PostIntimidateStatStageChangeAbAttr extends AbAttr { * @see {@linkcode applyPostSummon()} */ export class PostSummonAbAttr extends AbAttr { + /** Should the ability activate when gained in battle? This will almost always be true */ + private activateOnGain: boolean; + + constructor(showAbility: boolean = true, activateOnGain: boolean = true) { + super(showAbility); + this.activateOnGain = activateOnGain; + } + + /** + * @returns Whether the ability should activate when gained in battle + */ + shouldActivateOnGain(): boolean { + return this.activateOnGain; + } + /** * Applies ability post summon (after switching in) * @param pokemon {@linkcode Pokemon} with this ability @@ -2330,7 +2345,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { if (!simulated) { this.target = target!; this.targetAbilityName = allAbilities[target!.getAbility().id].name; - pokemon.summonData.ability = target!.getAbility().id; + pokemon.setTempAbility(target!.getAbility()); setAbilityRevealed(target!); pokemon.updateInfo(); } @@ -2427,7 +2442,7 @@ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { */ export class PostSummonTransformAbAttr extends PostSummonAbAttr { constructor() { - super(true); + super(true, false); } async applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): Promise { @@ -2462,7 +2477,6 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { } pokemon.summonData.speciesForm = target.getSpeciesForm(); - pokemon.summonData.ability = target.getAbility().id; pokemon.summonData.gender = target.getGender(); // Copy all stats (except HP) @@ -2492,6 +2506,8 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { promises.push(pokemon.loadAssets(false).then(() => { pokemon.playAnim(); pokemon.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + pokemon.setTempAbility(target.getAbility()); })); await Promise.all(promises); @@ -4852,53 +4868,72 @@ async function applyAbAttrsInternal( showAbilityInstant: boolean = false, simulated: boolean = false, messages: string[] = [], + gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && pokemon.getPassiveAbility().id === pokemon.getAbility().id)) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { continue; } - const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); - for (const attr of ability.getAttrs(attrType)) { - const condition = attr.getCondition(); - if (condition && !condition(pokemon)) { - continue; - } - - globalScene.setPhaseQueueSplice(); - - let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked - if (result instanceof Promise) { - result = await result; - } - if (result) { - if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { - pokemon.summonData.abilitiesApplied.push(ability.id); - } - if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { - pokemon.battleData.abilitiesApplied.push(ability.id); - } - if (attr.showAbility && !simulated) { - if (showAbilityInstant) { - globalScene.abilityBar.showAbility(pokemon, passive); - } else { - queueShowAbility(pokemon, passive); - } - } - const message = attr.getTriggerMessage(pokemon, ability.name, args); - if (message) { - if (!simulated) { - globalScene.queueMessage(message); - } - } - messages.push(message!); - } - } + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); globalScene.clearPhaseQueueSplice(); } } +async function applySingleAbAttrs( + pokemon: Pokemon, + passive: boolean, + attrType: Constructor, + applyFunc: AbAttrApplyFunc, + args: any[], + gainedMidTurn: boolean = false, + simulated: boolean = false, + showAbilityInstant: boolean = false, + messages: string[] = [] +) { + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); + if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { + return; + } + + for (const attr of ability.getAttrs(attrType)) { + const condition = attr.getCondition(); + if (condition && !condition(pokemon)) { + continue; + } + + globalScene.setPhaseQueueSplice(); + + let result = applyFunc(attr, passive); + // TODO Remove this when promises get reworked + if (result instanceof Promise) { + result = await result; + } + if (result) { + if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { + pokemon.summonData.abilitiesApplied.push(ability.id); + } + if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { + pokemon.battleData.abilitiesApplied.push(ability.id); + } + if (attr.showAbility && !simulated) { + if (showAbilityInstant) { + globalScene.abilityBar.showAbility(pokemon, passive); + } else { + queueShowAbility(pokemon, passive); + } + } + const message = attr.getTriggerMessage(pokemon, ability.name, args); + if (message) { + if (!simulated) { + globalScene.queueMessage(message); + } + } + messages.push(message!); + } + } +} + class ForceSwitchOutHelper { constructor(private switchType: SwitchType) {} @@ -5285,6 +5320,21 @@ export function applyPostItemLostAbAttrs(attrType: Constructor(attrType, pokemon, (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), args); } +/** + * Applies abilities when they become active mid-turn (ability switch) + * + * Ignores passives as they don't change and shouldn't be reapplied when main abilities change + */ +export function applyOnGainAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { + applySingleAbAttrs(pokemon, passive, PostSummonAbAttr, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, true, simulated); +} + +/** + * Clears primal weather during the turn if {@linkcode pokemon}'s ability corresponds to one + */ +export function applyOnLoseClearWeatherAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { + applySingleAbAttrs(pokemon, passive, PreLeaveFieldClearWeatherAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); +} function queueShowAbility(pokemon: Pokemon, passive: boolean): void { globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); globalScene.clearPhaseQueueSplice(); diff --git a/src/data/move.ts b/src/data/move.ts index 016dae6ab0d..a81bbd4940e 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7521,11 +7521,11 @@ export class AbilityChangeAttr extends MoveEffectAttr { const moveTarget = this.selfTarget ? user : target; - moveTarget.summonData.ability = this.ability; - globalScene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger); - globalScene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name })); + moveTarget.setTempAbility(allAbilities[this.ability]); + globalScene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger); + return true; } @@ -7548,13 +7548,13 @@ export class AbilityCopyAttr extends MoveEffectAttr { return false; } - user.summonData.ability = target.getAbility().id; - globalScene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); + user.setTempAbility(target.getAbility()); + if (this.copyToPartner && globalScene.currentBattle?.double && user.getAlly().hp) { - user.getAlly().summonData.ability = target.getAbility().id; globalScene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user.getAlly()), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); + user.getAlly().setTempAbility(target.getAbility()); } return true; @@ -7585,10 +7585,10 @@ export class AbilityGiveAttr extends MoveEffectAttr { return false; } - target.summonData.ability = user.getAbility().id; - globalScene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix(target), abilityName: allAbilities[user.getAbility().id].name })); + target.setTempAbility(user.getAbility()); + return true; } @@ -7603,15 +7603,14 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { return false; } - const tempAbilityId = user.getAbility().id; - user.summonData.ability = target.getAbility().id; - target.summonData.ability = tempAbilityId; + const tempAbility = user.getAbility(); globalScene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", { pokemonName: getPokemonNameWithAffix(user) })); + + user.setTempAbility(target.getAbility()); + target.setTempAbility(tempAbility); // Swaps Forecast/Flower Gift from Castform/Cherrim globalScene.arena.triggerWeatherBasedFormChangesToNormal(); - // Swaps Forecast/Flower Gift to Castform/Cherrim (edge case) - globalScene.arena.triggerWeatherBasedFormChanges(); return true; } @@ -7690,7 +7689,6 @@ export class TransformAttr extends MoveEffectAttr { const promises: Promise[] = []; user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.ability = target.getAbility().id; user.summonData.gender = target.getGender(); // Power Trick's effect will not preserved after using Transform @@ -7723,6 +7721,8 @@ export class TransformAttr extends MoveEffectAttr { promises.push(user.loadAssets(false).then(() => { user.playAnim(); user.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + user.setTempAbility(target.getAbility()); })); await Promise.all(promises); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 1377f11187b..714f1ec7026 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -64,7 +64,7 @@ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoo import { WeatherType } from "#enums/weather-type"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; import type { Ability, AbAttr } from "#app/data/ability"; -import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs } from "#app/data/ability"; +import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseClearWeatherAbAttrs } from "#app/data/ability"; import type PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; @@ -1481,6 +1481,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return abilityAttrs; } + /** + * Sets the {@linkcode Pokemon}'s ability and activates it if it normally activates on summon + * + * Also clears primal weather if it is from the ability being changed + * @param ability New Ability + */ + public setTempAbility(ability: Ability, passive: boolean = false): void { + applyOnLoseClearWeatherAbAttrs(this, passive); + if (passive) { + this.summonData.passiveAbility = ability.id; + } else { + this.summonData.ability = ability.id; + } + applyOnGainAbAttrs(this, passive); + } + /** * Checks if a pokemon has a passive either from: * - bought with starter candy diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts index 3445b3b322c..98f30c60505 100644 --- a/src/test/abilities/imposter.test.ts +++ b/src/test/abilities/imposter.test.ts @@ -116,4 +116,15 @@ describe("Abilities - Imposter", () => { } }); }); + + it("should activate its ability if it copies one that activates on summon", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([ Species.DITTO ]); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); }); diff --git a/src/test/abilities/mummy.test.ts b/src/test/abilities/mummy.test.ts new file mode 100644 index 00000000000..bf93cdcf61d --- /dev/null +++ b/src/test/abilities/mummy.test.ts @@ -0,0 +1,52 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Mummy", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.MUMMY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should set the enemy's ability to mummy when hit by a contact move", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.MUMMY); + }); + + it("should not change the enemy's ability hit by a non-contact move", async () => { + game.override.enemyMoveset(Moves.EARTHQUAKE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); +}); diff --git a/src/test/abilities/trace.test.ts b/src/test/abilities/trace.test.ts new file mode 100644 index 00000000000..ffa76f59769 --- /dev/null +++ b/src/test/abilities/trace.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Trace", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.TRACE) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should copy the opponent's ability", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate a copied post-summon ability", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/src/test/abilities/wandering_spirit.test.ts b/src/test/abilities/wandering_spirit.test.ts new file mode 100644 index 00000000000..4bc9298353f --- /dev/null +++ b/src/test/abilities/wandering_spirit.test.ts @@ -0,0 +1,65 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Wandering Spirit", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.WANDERING_SPIRIT) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should exchange abilities when hit with a contact move", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.WANDERING_SPIRIT); + }); + + it("should not exchange abilities when hit with a non-contact move", async () => { + game.override.enemyMoveset(Moves.EARTHQUAKE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.WANDERING_SPIRIT); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/src/test/battle/ability_swap.test.ts b/src/test/battle/ability_swap.test.ts new file mode 100644 index 00000000000..9ce7a36c16e --- /dev/null +++ b/src/test/battle/ability_swap.test.ts @@ -0,0 +1,67 @@ +import { allAbilities } from "#app/data/ability"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Test Ability Swapping", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should activate post-summon abilities", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.INTIMIDATE]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should remove primal weather when the setter's ability is removed", async () => { + game.override.ability(Abilities.DESOLATE_LAND); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.weather?.weatherType).toBeUndefined(); + }); + + it("should not activate passive abilities", async () => { + game.override.passiveAbility(Abilities.INTREPID_SWORD); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); // would be 2 if passive activated again + }); +}); diff --git a/src/test/moves/doodle.test.ts b/src/test/moves/doodle.test.ts new file mode 100644 index 00000000000..258abda392a --- /dev/null +++ b/src/test/moves/doodle.test.ts @@ -0,0 +1,70 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Doodle", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.DOODLE ]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should copy the opponent's ability in singles", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.DOODLE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should copy the opponent's ability to itself and its ally in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerField()[0].getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getPlayerField()[1].getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.battleType("double") + .enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + // Enemies should have been intimidated twice + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-2); + }); +}); diff --git a/src/test/moves/entrainment.test.ts b/src/test/moves/entrainment.test.ts new file mode 100644 index 00000000000..5d0991c8dfd --- /dev/null +++ b/src/test/moves/entrainment.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Entrainment", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.ENTRAINMENT ]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("gives its ability to the target", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.ENTRAINMENT); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.ADAPTABILITY); + }); + + it("should activate post-summon abilities", async () => { + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.ENTRAINMENT); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/src/test/moves/role_play.test.ts b/src/test/moves/role_play.test.ts new file mode 100644 index 00000000000..a37f4faac9b --- /dev/null +++ b/src/test/moves/role_play.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Role Play", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.ROLE_PLAY ]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should set the user's ability to the target's ability", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.ROLE_PLAY); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.ROLE_PLAY); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/src/test/moves/simple_beam.test.ts b/src/test/moves/simple_beam.test.ts new file mode 100644 index 00000000000..b4566669e8d --- /dev/null +++ b/src/test/moves/simple_beam.test.ts @@ -0,0 +1,42 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Simple Beam", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.SIMPLE_BEAM ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("sets the target's ability to simple", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SIMPLE_BEAM); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.SIMPLE); + }); +}); diff --git a/src/test/moves/skill_swap.test.ts b/src/test/moves/skill_swap.test.ts new file mode 100644 index 00000000000..9c0f0b75ade --- /dev/null +++ b/src/test/moves/skill_swap.test.ts @@ -0,0 +1,56 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Skill Swap", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.SKILL_SWAP ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should swap the two abilities", async () => { + game.override.ability(Abilities.ADAPTABILITY); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SKILL_SWAP); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.ADAPTABILITY); + }); + + it("should activate post-summon abilities", async () => { + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(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); + }); +}); diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts index adb97b42af7..ffe935aa61b 100644 --- a/src/test/moves/transform.test.ts +++ b/src/test/moves/transform.test.ts @@ -116,4 +116,16 @@ describe("Moves - Transform", () => { } }); }); + + it("should activate its ability if it copies one that activates on summon", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE) + .ability(Abilities.BALL_FETCH); + + await game.classicMode.startBattle([ Species.DITTO ]); + game.move.select(Moves.TRANSFORM); + + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); }); From 7ec0dba74b82060852c6e17df955884382990966 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Wed, 19 Feb 2025 17:19:02 -0500 Subject: [PATCH 062/171] [Bug/Item] Fix Flame Orb Weight Function (#5380) --- src/modifier/modifier-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 336cbe67ccc..112a3c9aa35 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1822,7 +1822,7 @@ const modifierPool: ModifierPool = { if (!isHoldingOrb) { const moveset = p.getMoveset(true).filter(m => !isNullOrUndefined(m)).map(m => m.moveId); - const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true); + const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true); // Moves that take advantage of obtaining the actual status effect const hasStatusMoves = [ Moves.FACADE, Moves.PSYCHO_SHIFT ] From a346318f9dd8f9fa3f6d43790fb7122b278afdb5 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:59:54 -0800 Subject: [PATCH 063/171] [Move] Implement Quash (#5049) * Add quash logic for single targets * Multi-squash power * Update MovePhase constructor * Start searching from front of phaseQueue instead of weather * Use findPhase instead of looping to search * Basic test case * Test for failure on a already moved target * Speed order test * Fix speed test comment * Fix ForceLastAttr to properly respect speed order * Respect trick room in quash turn order * Test for respecting TR * Add comments, fix var name * Allow for quashed speed ties * Avoid reapplying if a move is already forced last * Spacing * Quash does fail in a single battle despite this not being documented anywhere * Add move text * Update move.ts (readability) Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Use globalScene --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/move.ts | 53 ++++++++++++++++++- src/phases/move-phase.ts | 14 ++++- src/test/moves/quash.test.ts | 99 ++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/test/moves/quash.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index a81bbd4940e..acc68eb6a26 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8035,6 +8035,56 @@ export class AfterYouAttr extends MoveEffectAttr { } } +/** + * Move effect to force the target to move last, ignoring priority. + * If applied to multiple targets, they move in speed order after all other moves. + * @extends MoveEffectAttr + */ +export class ForceLastAttr extends MoveEffectAttr { + /** + * Forces the target of this move to move last. + * + * @param user {@linkcode Pokemon} that is using the move. + * @param target {@linkcode Pokemon} that will be forced to move last. + * @param move {@linkcode Move} {@linkcode Moves.QUASH} + * @param _args N/A + * @returns true + */ + override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:forceLast", { targetPokemonName: getPokemonNameWithAffix(target) })); + + const targetMovePhase = globalScene.findPhase((phase) => phase.pokemon === target); + if (targetMovePhase && !targetMovePhase.isForcedLast() && globalScene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) { + // Finding the phase to insert the move in front of - + // Either the end of the turn or in front of another, slower move which has also been forced last + const prependPhase = globalScene.findPhase((phase) => + [ MovePhase, MoveEndPhase ].every(cls => !(phase instanceof cls)) + || (phase instanceof MovePhase) && phaseForcedSlower(phase, target, !!globalScene.arena.getTag(ArenaTagType.TRICK_ROOM)) + ); + if (prependPhase) { + globalScene.phaseQueue.splice( + globalScene.phaseQueue.indexOf(prependPhase), + 0, + new MovePhase(target, [ ...targetMovePhase.targets ], targetMovePhase.move, false, false, false, true) + ); + } + } + return true; + } +} + +/** Returns whether a {@linkcode MovePhase} has been forced last and the corresponding pokemon is slower than {@linkcode target} */ +const phaseForcedSlower = (phase: MovePhase, target: Pokemon, trickRoom: boolean): boolean => { + let slower: boolean; + // quashed pokemon still have speed ties + if (phase.pokemon.getEffectiveStat(Stat.SPD) === target.getEffectiveStat(Stat.SPD)) { + slower = !!target.randSeedInt(2); + } else { + slower = !trickRoom ? phase.pokemon.getEffectiveStat(Stat.SPD) < target.getEffectiveStat(Stat.SPD) : phase.pokemon.getEffectiveStat(Stat.SPD) > target.getEffectiveStat(Stat.SPD); + } + return phase.isForcedLast() && slower; +}; + const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !globalScene.arena.getTag(ArenaTagType.GRAVITY); const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); @@ -9914,7 +9964,8 @@ export function initMoves() { .attr(RemoveHeldItemAttr, true), new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) .condition(failIfSingleBattle) - .unimplemented(), + .condition((user, target, move) => !target.turnData.acted) + .attr(ForceLastAttr), new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.isTransferable).reduce((v, m) => v + m.stackCount, 0))), new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 73468dc1690..c1e4aeaf497 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -56,6 +56,7 @@ export class MovePhase extends BattlePhase { protected _targets: BattlerIndex[]; protected followUp: boolean; protected ignorePp: boolean; + protected forcedLast: boolean; protected failed: boolean = false; protected cancelled: boolean = false; protected reflected: boolean = false; @@ -90,7 +91,8 @@ export class MovePhase extends BattlePhase { * @param reflected Indicates that the move was reflected by Magic Coat or Magic Bounce. * Reflected moves cannot be reflected again and will not trigger Dancer. */ - constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false) { + + constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false, forcedLast: boolean = false) { super(); this.pokemon = pokemon; @@ -99,6 +101,7 @@ export class MovePhase extends BattlePhase { this.followUp = followUp; this.ignorePp = ignorePp; this.reflected = reflected; + this.forcedLast = forcedLast; } /** @@ -120,6 +123,15 @@ export class MovePhase extends BattlePhase { this.cancelled = true; } + /** + * Shows whether the current move has been forced to the end of the turn + * Needed for speed order, see {@linkcode Moves.QUASH} + * */ + public isForcedLast(): boolean { + return this.forcedLast; + } + + public start(): void { super.start(); diff --git a/src/test/moves/quash.test.ts b/src/test/moves/quash.test.ts new file mode 100644 index 00000000000..3cbe79d7bfe --- /dev/null +++ b/src/test/moves/quash.test.ts @@ -0,0 +1,99 @@ +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerIndex } from "#app/battle"; +import { WeatherType } from "#enums/weather-type"; +import { MoveResult } from "#app/field/pokemon"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; + +describe("Moves - Quash", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("double") + .enemyLevel(1) + .enemySpecies(Species.SLOWPOKE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([ Moves.RAIN_DANCE, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .moveset([ Moves.QUASH, Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH ]); + }); + + it("makes the target move last in a turn, ignoring priority", async () => { + await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + + game.move.select(Moves.QUASH, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.SUNNY_DAY, 1); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.RAIN_DANCE); + + await game.phaseInterceptor.to("TurnEndPhase", false); + // will be sunny if player_2 moved last because of quash, rainy otherwise + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SUNNY); + }); + + it("fails if the target has already moved", async () => { + await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.QUASH, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(game.scene.getPlayerField()[1].getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + }); + + it("makes multiple quashed targets move in speed order at the end of the turn", async () => { + game.override.enemySpecies(Species.NINJASK) + .enemyLevel(100); + + await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + + // both users are quashed - rattata is slower so sun should be up at end of turn + game.move.select(Moves.RAIN_DANCE, 0); + game.move.select(Moves.SUNNY_DAY, 1); + + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SUNNY); + }); + + it("respects trick room", async () => { + game.override.enemyMoveset([ Moves.RAIN_DANCE, Moves.SPLASH, Moves.TRICK_ROOM ]); + + await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + + await game.forceEnemyMove(Moves.TRICK_ROOM); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("TurnInitPhase"); + // both users are quashed - accelgor should move last w/ TR so rain should be up at end of turn + game.move.select(Moves.RAIN_DANCE, 0); + game.move.select(Moves.SUNNY_DAY, 1); + + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.RAIN); + }); + +}); From c3045b58b6dca55cb6d95cfcac731dead6da39e0 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:06:12 +0100 Subject: [PATCH 064/171] [Localization] Localizable Lv UP pop-up bar (#5336) * Update party-exp-bar.ts localizable * Update party-exp-bar.ts --- src/ui/party-exp-bar.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 75970a5908b..b9da9320fcb 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 type Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; +import i18next from "i18next"; export default class PartyExpBar extends Phaser.GameObjects.Container { private bg: Phaser.GameObjects.NineSlice; @@ -43,9 +44,9 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { // if we want to only display the level in the small frame if (showOnlyLevelUp) { if (newLevel > 200) { // if the level is greater than 200, we only display Lv. UP - this.expText.setText("Lv. UP"); + this.expText.setText(i18next.t("battleScene:levelUp")); } else { // otherwise we display Lv. Up and the new level - this.expText.setText(`Lv. UP: ${newLevel.toString()}`); + this.expText.setText(i18next.t("battleScene:levelUpWithLevel", { level: newLevel })); } } else { // if we want to display the exp From 3a4c8eb92e2f1972b749bbfe5e37fa62e9f80d45 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:08:48 +0100 Subject: [PATCH 065/171] [UX/UI] [Localization] Summary removed Lv and ID No. as image texts (#5361) * summary-ui-handler.ts Lv. and ID No. Text * Remove Lv and ID No. * Remove Lv and ID No. --- public/images/ui/legacy/summary_bg.png | Bin 4217 -> 2696 bytes public/images/ui/legacy/summary_profile.png | Bin 1562 -> 2589 bytes public/images/ui/summary_bg.png | Bin 2126 -> 3457 bytes public/images/ui/summary_profile.png | Bin 1673 -> 2935 bytes src/ui/summary-ui-handler.ts | 6 +++--- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/images/ui/legacy/summary_bg.png b/public/images/ui/legacy/summary_bg.png index e4da2dd5da235dbded64b2c036088bfb6125ba9e..c482b5a1bf1d946e8f2a242bb2e03b86de6d5b60 100644 GIT binary patch literal 2696 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 BWC8#H diff --git a/public/images/ui/legacy/summary_profile.png b/public/images/ui/legacy/summary_profile.png index 1d184023ca8f77c937883b6ca5453140635bee2c..77d59dac1775bbcff8783be7657be197d81419b9 100644 GIT binary patch literal 2589 zcmbVO3s4hh9#1V!Me5^p%mLbC8|sOp$?hg0Br5@dP=XqCwhr<9JCW6{_BbN7{0>PR-1h-Tn6W z{r>;o|26yOp0JP=%iWi=SgaMHa@k(y+QF=nWlNa<atJv<_Yj#2DF)TDujYDg8vvlxsFn#J<+a zq%a0yI$WM%!ooAcBGefvYKey9?+5r=5Qe~j(I{Xs=m`q3NIA2-2y<`W206eigieui z0_+BX7{wkSh%{k!$LmbBjLd!NWvFx1^5u`142F^EZ{;g0*MfT1epJE7;7et z7TGI%ecl%HB<1L6+K7Ol*=**S1w7J}48jtL1cdk?pU-6wTq>QQQ45!#JQo;b7^ODh zMj9sxz|M%O$W&U&VLY9aU@$sp32Ht}Ou#@3Y6M{(WS2Ax)TkXeW2#9%Yh0rSF+FC$ z2%2KBumfwsC^|Tekue{Tr=qEdbR!1t#V9h> zq{f2N7&krbYK%yb2}5bp6hV^ug+%RHa2W^+0=%MeLPMIV%|C%-GL*)o96rSN=0bcf z>>U9M5N|O8i?-O42hBkhqz2cfFM|3+zzj}^@P$8vG6kbSY4n+3jT+ICCIiaI#SLgO z1{#TE4&VqP5=81r6Jwb1PB80*LV<)56pa#UEL0}tFp7CNu0dc-1xv&dlq=8(#9Wa| z$mgOWF{4I=iM1*W;)}HWh4V5}oodhP!gX*l!S_;W{Kj@GQh7}8%!_Z*BOwX_*EVFAfZw4PB+ zAmch{@4-10;9`NZ?|#y+3vgx#*l!)vhk0@-N7lqX0trB8D6QpS-DkeaHV+;y+1-~_h#pP+fIRW(YrDeUQ5FE5 ziFtp_8`*ioH_7R>W$>EAuFipZPOrXhUF{igG#_Y`uU0K=mrkq8hJ4eDr7owfo4Ks8M3t7XKP+Ds-u92Kssqh` znvU&y|HPHE?tZuLn=IRw{J$@;qb`1}^*5woPWD?Zm+tJ?SXVpQ?Hab$Z?taU6HnK5 zH(ojPhq+a^?$yQKFB0Wzc3Q)%=$xl(U4&i;!Ee}(DM+f~(k=h`+u_T%u3I1SJTkdw zioGhk!~b1r$X8y@ip{&q*%dme%IrV;&Zq1jE3ooE+xwIM9xoa`?VX!ZIP(-Y%0 z#J1iT>JpTHR~#R*a??!7t;$Sc(~+*!?Rokn>%drP%FO3Q0j0{}YvuVmTSdL@K1{vG zhw3Je-5&1=DK7b-Jz;pXHQckjQL^^sY}-wF?IX^LE&6|+Ogq@peLel9J6~s<6$Ct4 za?>w+sHxg@V_R&bW$@JT+?2F$T`v2VJnT%nxjv?PKy@tPN&4G1wvrxvTpw#*^`K-w z{MVXW)#r-}E}r-3mY#X#>gI2lDxPvvQa$)_;W?yfQ`du_Ril0TP=BI%U*P>|ZJDzv z#r^c!zQ3e7ckmjAFD%_1*cdD&iznmz9%eUw_r~vJMUl>?N1y5HyS~qSM&6$zlfT>% zj&g`}&ONd8Mc&7gZuF0tJ|(tix~}1_QPTR>$P;(5*HkX|cDelnE;KkyRvwsS{U4OD B*CGG_ literal 1562 zcmc&!Yfush5XLD~GNg1Q%_6<2tIQYYjFU*1iK9-|HRS_S5u@}<#njBo*OlcXoWSu& zE%Py@*e+kSN;Y{XBaQ%Qq8)Qqu`xaLSSSF{MRNF(3bbm_ z#mIy_0KoCZSF_>NWM}~ZAUz5l8gm7!Rrn;jC%FFn?vjgB6`F?brfD$oRh{TKoimwY z0=@k8sXU)(jel3e@lAgzY-$vd-RkRXuPLPzkzK7#PE(U7=v8lafn~+a2Ktji)>qS) z7iP`x*y2F{S|)==a*WRyh$&3*i_3_`WW~e>8-)r!mOYv1vx`+==skxiNm8QBm%2GY z2X{`UjHS3Ec>7X<*SJYpWeoUupI2r`7_SGw z@M*kT`$9HYLHFzA>FtTpTP1#q{s6BH?Cd2}erchD)<9n6;qO!gjld*3UVF!+HRj6u zkcrv{1e$&z=2>|x}Ha@bK`C^z_D# z3Ct=!e?ke-p@Z)$5J5q61mTR%v*ntZ=>!d#d^fiymN9q}S@%K2r=ucV z>wKxtO@7>M4)#E57v;Ak7$G2aIgFC<wImSJ)kbpqtcPn7~l2j^RmmxD>mPje$&Y+C6>%b z+$i<3CC3QFadiaF%$wjoy2oxO=cDCengvNc|J3*e=>PKU)U$sr52|5Czj6$K5O598h!PCUZ2a%r_c8W9n?xRYr__S zXmpCb_$6FvS><_(;4_WI0(MA2@d)N0u47_I)`!&Gg|7_$ZWvb`necthbA4H?28F4q zc16Qm)K8=pqJ&HYiuHJSPbWLo05STOb-*I;vxeGLAGNN-TXTHwP)U9=ZCr|LD=MWC zKeD{^5k??gPd*?&XV}l?%?8d9KXm08c0!ojKvdYH&n=xsQf%7I%eXo%M_kU!re?Rh zA<|RR&eU4-J6quUcDZv&bM9mCaSa_@tn6A9f$-e%Hk@1IIdWaXBVNx1JHnwde)Y3C z9j&QBrmEmAeouPv%tcMYYwArwZwwu{N*mX%%~=(#=CG#1qReggOIV)8>deK&(q=f) zYb7wVh@)^GW=zcPtvq@{uqIF-tlJZHYGdFE@@@z2o^|+xxhA_GM_Kwaq)mfw(HQdK z{{uLm&Y3!)c)Nf2*Ts;S#HI^i*N60mf`~;(KZT-sI7EmzXu8Nay`j7(Ks+TS_LgoV at^=P|>9BxI2Ykq9aU{S*ZBQR<`AmIC71q9ry8X>p^pf(k;kBH{u*iWG?28$`ag&o1xfOJ?q!``>f^bN+MB ze0g_iWEeDtHikeTK#LYimk|iWU@$)F>IAND8xumoZ8W}cm6kvlch>PEemG~`6avBd zs3Iyx7ZdS@NTyElLr`@B=9iIz12lmU7?gn{vSdt0Pr#BCDlwz0s+vJppkl^KUIaS= z55eS$g;^SGc~)eUEGtWQz=z$p`U?2t4A@qzCrAjNx5Hp7Cion?Mn8lzEL3GJt zhQ#5J9uu*Y9-`J@be>-TQ^w)KbiUA!6TlY2TwglO=I~i;K8xeeWOGF90Fl3tKKx+- zZyGdFv`iX0>zl&7RQh62x$n2%0_T_nnpR~ z9F?&!C6RvcA%6=- zWuip2CItcEDpHUnjD@R`81#`OibB*%wFWo_?EHsVL_~-dskAyoCBqg;#S9R!pF)9( zc(5=bF%d(VJeZTnOhCCjrjXC&FcATp&*Sp_1zZ8|#eS(;mgdm)#eNj*hy5`Q?9WD- zeE$RvQ;2b8Oe7KUXYw(AKmbp`hMUZpbyo62$4BzTg;F-M8#0X@MFbGGVsqLcy3lN$AHnlko!4It4`GE5e+6u0@?bT zVq*OnbuE(q*TnysbT1|T-^KU86CX~gOpd6MFwi7f3`Zy|M>}~g2+GIX(|LM3MlF%&!3J;b9zk19$8X-k6jve^G-OqLAZuH6Zs;;c` z#2X)Vxdxt)F*$1dZ z@?;%{nAjuT~OC|Eq{PFrfqE+U@0*kk{wODxa`t71=O2mR80Xr>z! zSGmTI#bOn#8-3--jYk8UE*f^7IAXsYkt+72Xj-$0_XXKc?KOe4ZE=}b&pdgudRJUo zr|sNL)~-1Bj&Cx1KlKgYHi#!?&aF#2@t$v85PGckd*W31aAEJgdn<_#`vxz>De5!q z-=&UT=`odSWlyO5iPl87Y_W7QqMsFfi^BUa>Am!|b$9uVM<*DbKskCne_v$S!TN{G zIYqfeEr+#jo$Bd3-_2z2i;O#!QGae;^ZwCOQ0ix2j4P^BSNax2mVnobSJ2wh!hMk? ztLsX&_Mmdy7dkyIpyJ!^hhx90ih1z)CjTtz+pnD(6T6R~w&hS=YtN7YvwPFlh&z66 zJU2C5;A2@TUqUKqXsPrKJGdir%|1fXqksyDv8b+){8shF=6c>8AA3H2{3F|K&E3=) z!Cy$b&Wa*+)!eon&$5g3{d?ZK*4@Xb%e|U$a`3z|KwJGk;ACTidD-}{`GnHT zKum7M50?1tJyp|2Z6LeNDa&mx*&KWstoPSVd3a1pm&bD+?g|yi;}7MUC_Yp!9*$DI z4;YH0t6ipBy7S2MMtd0JfQ`rdV$P4Z_|Tf1+H-AVA>U)q-je4P+ngaK=<0Y;MJ3lu8DWYT(jjB1gYZ*+|YGQw(N%1+*A3yced$%q}GdSn*1E+rsTO zF5u(s;4?`|3foL6F#_}nhxwiJNnu<1Z90&)B0jLKW60a&J8YA|TtsV%Un>~s<>Ei> z_R7l^L%zj_3{YONPbg`Ifl>=1{=U&n_Q-n$+B*UE^rFQqP9{x31uz%aSn)SNz%3wP zoBXo*U4|tU$dDk9-$)5tPmZK{T*)KnZygG6#X-Xvdj%-7C?%xCeZQCtnaZsdpYc+4a#Qn6maf|9~-=bjUgdm`MR0hW04dYyld>ZAiybb|GLM=#xJP3 zwX&~I{Z7|6{&~fu!(;GO`BVFdX;$1d+R;qF`2F2pkH0P?*DM0}szS1AV?$e-XLz=h zWO0J;kA*06trhNEcB!}JVZE7|N;~E5k!~UzF|=tKjrw>8k|dAUZJ<<1NGEC)-Kl63 zkw$%uVTnCxsAsn4&OKId4vL&U^~A>)3mVJcQA=FfbE_IYp9<8=sok^s#>M~a;-Blq z+17Wurp-P*Fl{}Ao*a9pH=Gc@+w1t(g#^p2_S^?$cP7xvQhie<5{)islbaJI$XfC0 zDC&*vwuXuEzetTsr0Z=S9`l@u#&zgPo|B2b-Ingko-Z-3rkh<|J@Of5*RdXM-e%Xx z4{d?#+Ot_jK4#a6;^qm&&;wR{l4%lS&H3?-07dJu)HbR|{bIXN(9R+^x1CmOi*erF zH#4ll+U!b`_+W9F;=zypt&>}?6FPU;Vo!G#+{~U4EQU|ruD?}#=c;;t;Zu7< zb==mcH-lOSiEsa_`YEz@jmxu~S#=4w4pp8yd2)h%`9Nb|rSF`r&SJ`f4%>H)a}QhD zI&Vu&XY^v25^Keer#X(dADWT9+dv7~b=KeB@$JqTtJkf_cWx{$T9_6)pm@}BCGGAW zccXsAmlsxa#Qx0IEjpe%{vv57((yr}@lsh?Szh42JD2>xD@5Pr;x$irebVJOdv9IC z*Tz&Gu~mE$@3L_(C1giuEpKzbZQ#TYwiw!1ulL>>2zo{G4M8AS_xCDJ`2H Gzu{M%7iJ&; literal 2126 zcmZWrdstH07C*=d4=QxhFEccS#zKwEX-Kn@mo;IQ^x0$VDb6&ebIB~yv?2+)IK7n8 zNlo)nPJLsRjE_{T38HVT)KO_nys6UJuf5LR=i<(= ztpq!g9Rxvy5box12*R*{T!rAkv;Y0XBJje;bN2}$i1^$(Fh8v#xc zjaN;t!Z*HrV_)vC21C!;--InD?%rdKg~BYK@}9E|Q>GrZTJ3=^;+#!;Izxso_>9Dg zSq~3| zH8dO-7W9XBFz0g2h<$XPeqy4$E(0sjcN%S9579dUFC_>Q3sxGA4sH0EKArEcbW4xN z^Lx%Un}nG4q^pnSqDAW&=Upon{2|jPX;65q4LYzKF5V+7op)&W@1zryLd40&Nz9)ojz zo#vE9+b)w)DV~>tec!w z9~%AQW0GhVP7 z=&GW)$Yp1~g*V*A$WG<1Jbw7BfCyw#w$QQ2#p^;uTan z5i6#QOm1XL$z@xyZeA3G_ZkZR!BF!I&rZt6t&iuRd##G8DI0rsL>RVAib}TtvLpT~ znMmTt!vX?l!v31<=% zy(e?_$BIj`q~rupt`9XBe<``T4a)rj{^cU@D8T7Z$)6nT5pN2YKv&7fKqBlW=rXFXaDFSP+N zI)WmquxMIqSjS5I76|jZ_9{k9$kt?S!3}|vsTL7#ify~+ff_$fx zECRr#mDVze+8}%gqMdiJQq!&@$Xli4L%=}`9mTViw=v-`g}VggrK`R-I+YwFk+=NH zllz0k#fmdd1a3b-XI=7yV^eW1*KxH(z~ikgw;k-x(?+m6K!wlN2tu((P$~Iss};0{ z0(WNNUKAm0|6+`+1oM%DRQM9)Y)461FxDXiD@aA(dy~kiE8*lTRsh{f$_pP7c@HX~ z-Ld*7su^r|E%eJJk)&xqqPlQU}<8rI2o_*)k0AOPJ9lX6_F{DXewJFOY+I&1{te9MsmIg_Qz%uSEw*2+6 ze*CFruD+Z}tZZR6kIiC2iBNS5@-xa z>1CbgC?d_3{|HQTO-)A#!l7{#9%k?E?)b$L^fGGfnXLpz*nbyEx^EtkkztBEMR)7p z$Nc_LMJS1(;ArM3M60GScI+P;80y3zCAtUbZt~9-bRnzf1Ja+QrlvCAOh0@1e#@Ej z=Wjer`8)6`)ADAbPQ0#ZF0U)PkUug>T)42qPL&l-%Aj&kN$zYwY@t5d26tX33^Ft0_@;{JixNQIc diff --git a/public/images/ui/summary_profile.png b/public/images/ui/summary_profile.png index 38bb5e84dfda3cb13df2bc1cddd8a532e5a4bad2..55cc70dc4d09fb43382213ab5321a6ac53efb435 100644 GIT binary patch literal 2935 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 diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 1526ae982e5..b952037a079 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -225,7 +225,7 @@ export default class SummaryUiHandler extends UiHandler { this.summaryContainer.add(this.championRibbon); this.championRibbon.setVisible(false); - this.levelText = addTextObject(36, -17, "", TextStyle.SUMMARY_ALT); + this.levelText = addTextObject(24, -17, "", TextStyle.SUMMARY_ALT); this.levelText.setOrigin(0, 1); this.summaryContainer.add(this.levelText); @@ -413,7 +413,7 @@ export default class SummaryUiHandler extends UiHandler { } this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball)); - this.levelText.setText(this.pokemon.level.toString()); + this.levelText.setText(`${i18next.t("pokemonSummary:lv")}${this.pokemon.level.toString()}`); this.genderText.setText(getGenderSymbol(this.pokemon.getGender(true))); this.genderText.setColor(getGenderColor(this.pokemon.getGender(true))); this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); @@ -756,7 +756,7 @@ export default class SummaryUiHandler extends UiHandler { trainerText.setOrigin(0, 0); profileContainer.add(trainerText); - const trainerIdText = addTextObject(174, 12, globalScene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); + const trainerIdText = addTextObject(141, 12, `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, TextStyle.SUMMARY_ALT); trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); From 2d067ec7ce82e9559f4117cd2896b8bec3d6fa6d Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 07:23:08 +1100 Subject: [PATCH 066/171] [UI][Enhancement] Allow tera type choice on starter select (#5366) * Allow tera type choice on starter select * Make tera type actually apply in run * Remove logging statement * Add support for alternate forms --- index.css | 2 +- index.html | 2 +- src/configs/inputs/cfg_keyboard_qwerty.ts | 6 +- src/configs/inputs/pad_dualshock.ts | 4 +- src/configs/inputs/pad_generic.ts | 4 +- src/configs/inputs/pad_procon.ts | 4 +- src/configs/inputs/pad_unlicensedSNES.ts | 4 +- src/configs/inputs/pad_xbox360.ts | 4 +- src/data/challenge.ts | 1 + src/enums/buttons.ts | 4 +- src/phases/select-starter-phase.ts | 7 ++ src/system/game-data.ts | 2 + src/system/settings/settings-gamepad.ts | 8 +- src/system/settings/settings-keyboard.ts | 16 ++-- .../settingMenu/rebinding_setting.test.ts | 8 +- src/test/utils/fakeMobile.html | 4 +- src/ui-inputs.ts | 6 +- src/ui/pokedex-ui-handler.ts | 5 +- src/ui/starter-select-ui-handler.ts | 79 +++++++++++++++++-- 19 files changed, 121 insertions(+), 49 deletions(-) diff --git a/index.css b/index.css index d32d9da9bb1..9226f968e3e 100644 --- a/index.css +++ b/index.css @@ -170,7 +170,7 @@ input:-internal-autofill-selected { #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleVariant { +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleTera { display: none; } diff --git a/index.html b/index.html index 390a29fb365..91367cf73ec 100644 --- a/index.html +++ b/index.html @@ -129,7 +129,7 @@

    N
    -
    +
    V
    diff --git a/src/configs/inputs/cfg_keyboard_qwerty.ts b/src/configs/inputs/cfg_keyboard_qwerty.ts index 5ddc12e8784..c1b00a833c0 100644 --- a/src/configs/inputs/cfg_keyboard_qwerty.ts +++ b/src/configs/inputs/cfg_keyboard_qwerty.ts @@ -180,9 +180,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Button_Cycle_Variant]: Button.V, [SettingKeyboard.Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingKeyboard.Alt_Button_Up]: Button.UP, [SettingKeyboard.Alt_Button_Down]: Button.DOWN, [SettingKeyboard.Alt_Button_Left]: Button.LEFT, @@ -197,9 +197,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Alt_Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Alt_Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Alt_Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Alt_Button_Cycle_Variant]: Button.V, [SettingKeyboard.Alt_Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Alt_Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Alt_Button_Cycle_Tera]: Button.CYCLE_TERA, }, default: { KEY_ARROW_UP: SettingKeyboard.Button_Up, @@ -216,7 +216,7 @@ const cfg_keyboard_qwerty = { KEY_G: SettingKeyboard.Button_Cycle_Gender, KEY_E: SettingKeyboard.Button_Cycle_Ability, KEY_N: SettingKeyboard.Button_Cycle_Nature, - KEY_V: SettingKeyboard.Button_Cycle_Variant, + KEY_V: SettingKeyboard.Button_Cycle_Tera, KEY_PLUS: -1, KEY_MINUS: -1, KEY_A: SettingKeyboard.Alt_Button_Left, diff --git a/src/configs/inputs/pad_dualshock.ts b/src/configs/inputs/pad_dualshock.ts index 2fbdd0ddfaa..265b39fdad5 100644 --- a/src/configs/inputs/pad_dualshock.ts +++ b/src/configs/inputs/pad_dualshock.ts @@ -53,7 +53,7 @@ const pad_dualshock = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -72,7 +72,7 @@ const pad_dualshock = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_generic.ts b/src/configs/inputs/pad_generic.ts index 256af8f0fe3..cd91fcd8b17 100644 --- a/src/configs/inputs/pad_generic.ts +++ b/src/configs/inputs/pad_generic.ts @@ -51,7 +51,7 @@ const pad_generic = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -69,7 +69,7 @@ const pad_generic = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index 98d17c4ef57..a7ae5383fbe 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -52,7 +52,7 @@ const pad_procon = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -70,7 +70,7 @@ const pad_procon = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_unlicensedSNES.ts b/src/configs/inputs/pad_unlicensedSNES.ts index 77e68e6a644..fbde98b3fa2 100644 --- a/src/configs/inputs/pad_unlicensedSNES.ts +++ b/src/configs/inputs/pad_unlicensedSNES.ts @@ -43,7 +43,7 @@ const pad_unlicensedSNES = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -61,7 +61,7 @@ const pad_unlicensedSNES = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_xbox360.ts b/src/configs/inputs/pad_xbox360.ts index 6afc452f50b..88fee731d1d 100644 --- a/src/configs/inputs/pad_xbox360.ts +++ b/src/configs/inputs/pad_xbox360.ts @@ -51,7 +51,7 @@ const pad_xbox360 = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -69,7 +69,7 @@ const pad_xbox360 = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/data/challenge.ts b/src/data/challenge.ts index c6e85be2389..30c2c9a6ce4 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -708,6 +708,7 @@ export class FreshStartChallenge extends Challenge { pokemon.variant = 0; // Not shiny pokemon.formIndex = 0; // Froakie should be base form 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/enums/buttons.ts b/src/enums/buttons.ts index fe26023f8e7..f828b280d45 100644 --- a/src/enums/buttons.ts +++ b/src/enums/buttons.ts @@ -13,7 +13,7 @@ export enum Button { CYCLE_GENDER, CYCLE_ABILITY, CYCLE_NATURE, - V, + CYCLE_TERA, SPEED_UP, - SLOW_DOWN + SLOW_DOWN, } diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index 79012901a3a..b7ad15533a6 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -12,6 +12,7 @@ import type { Starter } from "#app/ui/starter-select-ui-handler"; import { Mode } from "#app/ui/ui"; import type { Species } from "#enums/species"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import * as Utils from "../utils"; export class SelectStarterPhase extends Phase { @@ -79,6 +80,12 @@ export class SelectStarterPhase extends Phase { starterPokemon.nickname = starter.nickname; } + if (!Utils.isNullOrUndefined(starter.teraType)) { + starterPokemon.teraType = starter.teraType; + } else { + starterPokemon.teraType = starterPokemon.species.type1; + } + if (globalScene.gameMode.isSplicedOnly || Overrides.STARTER_FUSION_OVERRIDE) { starterPokemon.generateFusionSpecies(true); } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 63d79d47fba..6b25013795f 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -55,6 +55,7 @@ import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-e import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; +import type { Type } from "#enums/type"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -229,6 +230,7 @@ export interface StarterAttributes { shiny?: boolean; favorite?: boolean; nickname?: string; + tera?: Type; } export interface StarterPreferences { diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index d26c0c9f019..840304ab1ba 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -21,7 +21,7 @@ export enum SettingGamepad { Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", Button_Speed_Up = "BUTTON_SPEED_UP", Button_Slow_Down = "BUTTON_SLOW_DOWN", Button_Submit = "BUTTON_SUBMIT", @@ -45,7 +45,7 @@ export const settingGamepadOptions = { [SettingGamepad.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], [SettingGamepad.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], [SettingGamepad.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], + [SettingGamepad.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], [SettingGamepad.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingGamepad.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], [SettingGamepad.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], @@ -67,7 +67,7 @@ export const settingGamepadDefaults = { [SettingGamepad.Button_Cycle_Gender]: 0, [SettingGamepad.Button_Cycle_Ability]: 0, [SettingGamepad.Button_Cycle_Nature]: 0, - [SettingGamepad.Button_Cycle_Variant]: 0, + [SettingGamepad.Button_Cycle_Tera]: 0, [SettingGamepad.Button_Speed_Up]: 0, [SettingGamepad.Button_Slow_Down]: 0, [SettingGamepad.Button_Submit]: 0, @@ -96,7 +96,7 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole case SettingGamepad.Button_Cycle_Gender: case SettingGamepad.Button_Cycle_Ability: case SettingGamepad.Button_Cycle_Nature: - case SettingGamepad.Button_Cycle_Variant: + case SettingGamepad.Button_Cycle_Tera: case SettingGamepad.Button_Speed_Up: case SettingGamepad.Button_Slow_Down: case SettingGamepad.Button_Submit: diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index 95ad4ba41f1..1a7db1b10c2 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -32,8 +32,8 @@ export enum SettingKeyboard { Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", - Alt_Button_Cycle_Variant = "ALT_BUTTON_CYCLE_VARIANT", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Alt_Button_Cycle_Tera = "ALT_BUTTON_CYCLE_TERA", Button_Speed_Up = "BUTTON_SPEED_UP", Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", Button_Slow_Down = "BUTTON_SLOW_DOWN", @@ -73,8 +73,8 @@ export const settingKeyboardOptions = { [SettingKeyboard.Alt_Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], [SettingKeyboard.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], [SettingKeyboard.Alt_Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], + [SettingKeyboard.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], + [SettingKeyboard.Alt_Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], [SettingKeyboard.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingKeyboard.Alt_Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingKeyboard.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], @@ -112,8 +112,8 @@ export const settingKeyboardDefaults = { [SettingKeyboard.Alt_Button_Cycle_Ability]: 0, [SettingKeyboard.Button_Cycle_Nature]: 0, [SettingKeyboard.Alt_Button_Cycle_Nature]: 0, - [SettingKeyboard.Button_Cycle_Variant]: 0, - [SettingKeyboard.Alt_Button_Cycle_Variant]: 0, + [SettingKeyboard.Button_Cycle_Tera]: 0, + [SettingKeyboard.Alt_Button_Cycle_Tera]: 0, [SettingKeyboard.Button_Speed_Up]: 0, [SettingKeyboard.Alt_Button_Speed_Up]: 0, [SettingKeyboard.Button_Slow_Down]: 0, @@ -148,7 +148,7 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo case SettingKeyboard.Button_Cycle_Gender: case SettingKeyboard.Button_Cycle_Ability: case SettingKeyboard.Button_Cycle_Nature: - case SettingKeyboard.Button_Cycle_Variant: + case SettingKeyboard.Button_Cycle_Tera: case SettingKeyboard.Button_Speed_Up: case SettingKeyboard.Button_Slow_Down: case SettingKeyboard.Alt_Button_Up: @@ -164,7 +164,7 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo case SettingKeyboard.Alt_Button_Cycle_Gender: case SettingKeyboard.Alt_Button_Cycle_Ability: case SettingKeyboard.Alt_Button_Cycle_Nature: - case SettingKeyboard.Alt_Button_Cycle_Variant: + case SettingKeyboard.Alt_Button_Cycle_Tera: case SettingKeyboard.Alt_Button_Speed_Up: case SettingKeyboard.Alt_Button_Slow_Down: case SettingKeyboard.Alt_Button_Submit: diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/src/test/settingMenu/rebinding_setting.test.ts index cae2df363d8..46a37f4e137 100644 --- a/src/test/settingMenu/rebinding_setting.test.ts +++ b/src/test/settingMenu/rebinding_setting.test.ts @@ -406,9 +406,9 @@ describe("Test Rebinding", () => { }); it("check to delete all the binds of an action", () => { - inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Variant"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Variant").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); + inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Tera"); + inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); + inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); + inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Tera").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); }); }); diff --git a/src/test/utils/fakeMobile.html b/src/test/utils/fakeMobile.html index 4b566d592d9..263b03969d4 100644 --- a/src/test/utils/fakeMobile.html +++ b/src/test/utils/fakeMobile.html @@ -35,7 +35,7 @@
    R
    -
    +
    V
    @@ -59,7 +59,7 @@
    N
    -
    +
    V
    diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index e6a0ed7a69c..951aec2a3b6 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -86,7 +86,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), - [Button.V]: () => this.buttonCycleOption(Button.V), + [Button.CYCLE_TERA]: () => this.buttonCycleOption(Button.CYCLE_TERA), [Button.SPEED_UP]: () => this.buttonSpeedChange(), [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), }; @@ -109,7 +109,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => undefined, [Button.CYCLE_ABILITY]: () => undefined, [Button.CYCLE_NATURE]: () => undefined, - [Button.V]: () => this.buttonInfo(false), + [Button.CYCLE_TERA]: () => undefined, [Button.SPEED_UP]: () => undefined, [Button.SLOW_DOWN]: () => undefined, }; @@ -197,7 +197,7 @@ export class UiInputs { const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); - } else if (button === Button.V) { + } else if (button === Button.CYCLE_TERA) { this.buttonInfo(true); } } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 5180d7bd956..1ba1b846224 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -919,7 +919,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { error = true; } - } else if (button === Button.V) { + } else if (button === Button.CYCLE_TERA) { if (!this.filterTextMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); @@ -1170,9 +1170,6 @@ export default class PokedexUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Shiny: iconPath = "R.png"; break; - case SettingKeyboard.Button_Cycle_Variant: - iconPath = "V.png"; - break; case SettingKeyboard.Button_Cycle_Form: iconPath = "F.png"; break; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index b919679be00..a102fc9dc08 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -56,6 +56,8 @@ import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCa import { BooleanHolder, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; +import { achvs } from "#app/system/achv"; +import * as Utils from "../utils"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -68,6 +70,7 @@ export interface Starter { moveset?: StarterMoveset; pokerus: boolean; nickname?: string; + teraType?: Type; } interface LanguageSetting { @@ -212,6 +215,7 @@ interface SpeciesDetails { abilityIndex?: number, natureIndex?: number, forSeen?: boolean, // default = false + teraType?: Type, } export default class StarterSelectUiHandler extends MessageUiHandler { @@ -262,6 +266,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonShinyIcon: Phaser.GameObjects.Sprite; private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite; + private teraIcon: Phaser.GameObjects.Sprite; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -271,12 +276,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private abilityIconElement: Phaser.GameObjects.Sprite; private genderIconElement: Phaser.GameObjects.Sprite; private natureIconElement: Phaser.GameObjects.Sprite; + private teraIconElement: Phaser.GameObjects.Sprite; private goFilterIconElement: Phaser.GameObjects.Sprite; private shinyLabel: Phaser.GameObjects.Text; private formLabel: Phaser.GameObjects.Text; private genderLabel: Phaser.GameObjects.Text; private abilityLabel: Phaser.GameObjects.Text; private natureLabel: Phaser.GameObjects.Text; + private teraLabel: Phaser.GameObjects.Text; private goFilterLabel: Phaser.GameObjects.Text; private starterSelectMessageBox: Phaser.GameObjects.NineSlice; @@ -292,6 +299,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private dexAttrCursor: bigint = 0n; private abilityCursor: number = -1; private natureCursor: number = -1; + private teraCursor: Type = Type.UNKNOWN; private filterBarCursor: number = 0; private starterMoveset: StarterMoveset | null; private scrollCursor: number; @@ -304,6 +312,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterAttr: bigint[] = []; private starterAbilityIndexes: number[] = []; private starterNatures: Nature[] = []; + private starterTeras: Type[] = []; private starterMovesets: StarterMoveset[] = []; private speciesStarterDexEntry: DexEntry | null; private speciesStarterMoves: Moves[]; @@ -312,6 +321,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private canCycleGender: boolean; private canCycleAbility: boolean; private canCycleNature: boolean; + private canCycleTera: boolean; private assetLoadCancelled: BooleanHolder | null; public cursorObj: Phaser.GameObjects.Image; @@ -823,6 +833,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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); + // The font size should be set per language const instructionTextSize = textSettings.instructionTextSize; @@ -867,6 +882,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.natureLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); this.natureLabel.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.teraLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleTera"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.teraLabel.setName("text-tera-label"); + this.goFilterIconElement = new Phaser.GameObjects.Sprite(globalScene, this.filterInstructionRowX, this.filterInstructionRowY, "keyboard", "C.png"); this.goFilterIconElement.setName("sprite-goFilter-icon-element"); this.goFilterIconElement.setScale(0.675); @@ -1497,6 +1519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const props = globalScene.gameData.getSpeciesDexAttrProps(randomSpecies, dexAttr); const abilityIndex = this.abilityCursor; const nature = this.natureCursor as unknown as Nature; + const teraType = this.teraCursor; const moveset = this.starterMoveset?.slice(0) as StarterMoveset; const starterCost = globalScene.gameData.getSpeciesStarterValue(randomSpecies.speciesId); const speciesForm = getPokemonSpeciesForm(randomSpecies.speciesId, props.formIndex); @@ -1505,7 +1528,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { .loadAssets(props.female, props.formIndex, props.shiny, props.variant, true) .then(() => { if (this.tryUpdateValue(starterCost, true)) { - this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, true); + this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, teraType, true); ui.playSelect(); } }); @@ -1585,7 +1608,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); + this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset, this.teraCursor); ui.playSelect(); } else { ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party @@ -2066,7 +2089,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newFormIndex !== props.formIndex); starterAttributes.form = newFormIndex; // store the selected form - this.setSpeciesDetails(this.lastSpecies, { formIndex: newFormIndex }); + starterAttributes.tera = this.lastSpecies.forms[newFormIndex].type1; + this.setSpeciesDetails(this.lastSpecies, { formIndex: newFormIndex, teraType: starterAttributes.tera }); success = true; } break; @@ -2125,6 +2149,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } break; + case Button.CYCLE_TERA: + if (this.canCycleTera) { + const speciesForm = getPokemonSpeciesForm(this.lastSpecies.speciesId, starterAttributes.form ?? 0); + if (speciesForm.type1 === this.teraCursor && !Utils.isNullOrUndefined(speciesForm.type2)) { + starterAttributes.tera = speciesForm.type2!; + this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type2! }); + } else { + starterAttributes.tera = speciesForm.type1; + this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type1 }); + } + success = true; + } + break; case Button.UP: if (!this.starterIconsCursorObj.visible) { if (currentRow > 0) { @@ -2289,7 +2326,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return [ isDupe, removeIndex ]; } - addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, randomSelection: boolean = false) { + addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, teraType: Type, randomSelection: boolean = false) { const props = globalScene.gameData.getSpeciesDexAttrProps(species, dexAttr); this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); @@ -2299,6 +2336,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr.push(dexAttr); this.starterAbilityIndexes.push(abilityIndex); this.starterNatures.push(nature); + this.starterTeras.push(teraType); this.starterMovesets.push(moveset); if (this.speciesLoaded.get(species.speciesId) || randomSelection ) { getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(); @@ -2379,6 +2417,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Nature: iconPath = "N.png"; break; + case SettingKeyboard.Button_Cycle_Tera: + iconPath = "V.png"; + break; case SettingKeyboard.Button_Stats: iconPath = "C.png"; break; @@ -2459,6 +2500,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.canCycleNature) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Nature, gamepadType, this.natureIconElement, this.natureLabel); } + if (this.canCycleTera) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Tera, gamepadType, this.teraIconElement, this.teraLabel); + } } // if filter mode is inactivated and gamepadType is not undefined, update the button icons @@ -2876,6 +2920,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; this.abilityCursor = species ? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? globalScene.gameData.getSpeciesDefaultNature(species) : 0; + this.teraCursor = species ? species.type1 : Type.UNKNOWN; if (!species && globalScene.ui.getTooltip().visible) { globalScene.ui.hideTooltip(); @@ -2894,6 +2939,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // load default ability from stater save data, if set this.abilityCursor = starterAttributes.ability; } + if (starterAttributes?.tera) { + // load default tera from starter save data, if set + this.teraCursor = starterAttributes.tera; + } if (this.statsMode) { if (this.speciesStarterDexEntry?.caughtAttr) { @@ -3035,7 +3084,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { female: props.female, variant: props.variant, abilityIndex: this.starterAbilityIndexes[starterIndex], - natureIndex: this.starterNatures[starterIndex] + natureIndex: this.starterNatures[starterIndex], + teraType: this.starterTeras[starterIndex] }); } else { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); @@ -3083,6 +3133,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, true, true); const defaultAbilityIndex = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -3117,6 +3168,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); this.setSpeciesDetails(species!, { // TODO: is this bang correct? shiny: false, @@ -3131,7 +3183,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { - let { shiny, formIndex, female, variant, abilityIndex, natureIndex } = options; + let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -3139,6 +3191,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; + this.teraCursor = Type.UNKNOWN; // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) @@ -3168,6 +3221,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor |= globalScene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex)); // TODO: is this bang correct? this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex); this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex); + this.teraCursor = !Utils.isNullOrUndefined(teraType) ? teraType : (teraType = species.type1); const [ isInParty, partyIndex ]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image if (isInParty) { this.updatePartyIcon(species, partyIndex); @@ -3179,6 +3233,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText.setVisible(false); this.pokemonPassiveDisabledIcon.setVisible(false); this.pokemonPassiveLockedIcon.setVisible(false); + this.teraIcon.setVisible(false); if (this.assetLoadCancelled) { this.assetLoadCancelled.value = true; @@ -3230,6 +3285,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr[starterIndex] = this.dexAttrCursor; this.starterAbilityIndexes[starterIndex] = this.abilityCursor; this.starterNatures[starterIndex] = this.natureCursor; + this.starterTeras[starterIndex] = this.teraCursor; } const assetLoadCancelled = new BooleanHolder(false); @@ -3288,7 +3344,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; - + this.canCycleTera = globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3412,10 +3468,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonFormText.setText(formText); this.setTypeIcons(speciesForm.type1, speciesForm.type2); + + this.teraIcon.setFrame(Type[this.teraCursor].toLowerCase()); + this.teraIcon.setVisible(!this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); } else { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } } else { @@ -3426,6 +3486,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } @@ -3479,6 +3540,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr.splice(index, 1); this.starterAbilityIndexes.splice(index, 1); this.starterNatures.splice(index, 1); + this.starterTeras.splice(index, 1); this.starterMovesets.splice(index, 1); for (let s = 0; s < this.starterSpecies.length; s++) { @@ -3690,6 +3752,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { abilityIndex: thisObj.starterAbilityIndexes[i], passive: !(globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), nature: thisObj.starterNatures[i] as Nature, + teraType: thisObj.starterTeras[i] as Type, moveset: thisObj.starterMovesets[i], pokerus: thisObj.pokerusSpecies.includes(starterSpecies), nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, @@ -3816,6 +3879,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.abilityLabel.setVisible(false); this.natureIconElement.setVisible(false); this.natureLabel.setVisible(false); + this.teraIconElement.setVisible(false); + this.teraLabel.setVisible(false); this.goFilterIconElement.setVisible(false); this.goFilterLabel.setVisible(false); } From 073a36a33e5b357ffc06a198df1d1e7f36012844 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Fri, 21 Feb 2025 00:49:57 +0100 Subject: [PATCH 067/171] [Localization] Corrections move-touch-controls-handler local key names (#5365) * Update move-touch-controls-handler.ts * Update locales submodule --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- public/locales | 2 +- src/ui/settings/move-touch-controls-handler.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/locales b/public/locales index 58dda14ee83..ef43efffe5f 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 58dda14ee834204c4bd5ece47694a3c068df4b0e +Subproject commit ef43efffe5fe454862c350f1b9393c3ad755bcc2 diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index da7ac7f0514..48677122363 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -93,9 +93,9 @@ export default class MoveTouchControlsHandler { toolbar.innerHTML = `
    -
    ${i18next.t("settings:reset")}
    -
    ${i18next.t("settings:saveClose")}
    -
    ${i18next.t("settings:cancel")}
    +
    ${i18next.t("settings:touchReset")}
    +
    ${i18next.t("settings:touchSaveClose")}
    +
    ${i18next.t("settings:touchCancel")}
    From ed8d162125e87f7942a39a8ab8f7684948af0140 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 10:50:39 +1100 Subject: [PATCH 068/171] [Balance] Make stat a much larger factor in moveset gen #5383 --- src/field/pokemon.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 714f1ec7026..246f82b8164 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2348,12 +2348,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].power, v), 40), 90); movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power / maxPower, 1), 0.5)) ]); - // Weight damaging moves against the lower stat + // Weight damaging moves against the lower stat. This uses a non-linear relationship. + // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. + // One third weight at ~1.58x higher, one quarter weight at ~1.73x higher, one fifth at ~1.87x, and one tenth at ~2.35x higher. const atk = this.getStat(Stat.ATK); const spAtk = this.getStat(Stat.SPATK); const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1) ]); + movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? Math.min(Math.pow(statRatio, 3) * 1.3, 1) : 1) ]); /** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */ let weightMultiplier = 0.9; From 5072460f4c33dbec9a138a0bd7cebdf8ac60fdc0 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:16:41 -0600 Subject: [PATCH 069/171] [Bug] Fix endless tokens allowing attacks to deal 0 damage (#5347) --- src/data/ability.ts | 2 +- src/modifier/modifier.ts | 2 +- src/test/battle/damage_calculation.test.ts | 24 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 940b5f0c7d7..95601dc2010 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1404,7 +1404,7 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition(pokemon, defender, move)) { const power = args[0] as Utils.NumberHolder; - power.value = Math.floor(power.value * this.damageMultiplier); + power.value = Utils.toDmgValue(power.value * this.damageMultiplier); return true; } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index fe61eadaccd..3af2aa2144f 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -3390,7 +3390,7 @@ abstract class EnemyDamageMultiplierModifier extends EnemyPersistentModifier { * @returns always `true` */ override apply(multiplier: NumberHolder): boolean { - multiplier.value = Math.floor(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); + multiplier.value = toDmgValue(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); return true; } diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index e6aca828156..22d072f313c 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -1,4 +1,6 @@ import { allMoves } from "#app/data/move"; +import type { EnemyPersistentModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; @@ -65,6 +67,28 @@ describe("Battle Mechanics - Damage Calculation", () => { expect(aggron.hp).toBe(aggron.getMaxHp() - 1); }); + it("Attacks deal 1 damage at minimum even with many tokens", async () => { + game.override + .startingLevel(1) + .enemySpecies(Species.AGGRON) + .enemyAbility(Abilities.STURDY) + .enemyLevel(10000); + + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const dmg_redux_modifier = modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier; + dmg_redux_modifier.stackCount = 1000; + await game.scene.addEnemyModifier(modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier); + + const aggron = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(aggron.hp).toBe(aggron.getMaxHp() - 1); + }); + it("Fixed-damage moves ignore damage multipliers", async () => { game.override .enemySpecies(Species.DRAGONITE) From 13d91403409a44b1dbb5d3427c6040308dc94f23 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:11:52 -0800 Subject: [PATCH 070/171] [Misc] Update console logging of encounter pokemon on beta/local (#5389) --- src/phases/encounter-phase.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 1dd275ab130..ce85460a481 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -38,6 +38,7 @@ import { Species } from "#enums/species"; import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { Nature } from "#enums/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -156,7 +157,31 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach((move) => { + moveset.push(move!.getName()); + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${Nature[enemyPokemon.getNature()]}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.isBoss() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + ); + console.log("Moveset:", moveset); return true; }); From 6a4c6f1c89e1383623cc504143ea46f3f85a1a06 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 06:23:34 +0100 Subject: [PATCH 071/171] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Informativ?= =?UTF-8?q?e=20messages=20for=20level=20up=20moves=20#5388?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 8b5a5bd12f1..fa66a8bf65d 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -983,13 +983,23 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: this.levelMoves.map(m => { + const levelNumber = m[0] > 0 ? String(m[0]) : ""; const option: OptionSelectItem = { - label: String(m[0]).padEnd(4, " ") + allMoves[m[1]].name, + label: levelNumber.padEnd(4, " ") + allMoves[m[1]].name, handler: () => { return false; }, onHover: () => { this.moveInfoOverlay.show(allMoves[m[1]]); + if (m[0] === 0) { + this.showText(i18next.t("pokedexUiHandler:onlyEvolutionMove")); + } else if (m[0] === -1) { + this.showText(i18next.t("pokedexUiHandler:onlyRecallMove")); + } else if (m[0] <= 5) { + this.showText(i18next.t("pokedexUiHandler:onStarterSelectMove")); + } else { + this.showText(i18next.t("pokedexUiHandler:byLevelUpMove")); + } }, }; return option; From bec73fd8d300bab7ffa4211127704823a4f7573d Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 17:50:44 +1100 Subject: [PATCH 072/171] [Bug][UI/UX] Remove redundant bgm bar (#5391) --- src/ui/pokedex-page-ui-handler.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index fa66a8bf65d..4d30609a020 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -45,7 +45,6 @@ import { EggSourceType } from "#enums/egg-source-types"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; -import BgmBar from "./bgm-bar"; import * as Utils from "../utils"; import { speciesTmMoves } from "#app/data/balance/tms"; import type { BiomeTierTod } from "#app/data/balance/biomes"; @@ -242,7 +241,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; - public bgmBar: BgmBar; private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; @@ -480,10 +478,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.menuContainer.setName("menu"); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); - this.bgmBar = new BgmBar(); - this.bgmBar.setup(); - ui.bgmBar = this.bgmBar; - this.menuContainer.add(this.bgmBar); this.menuContainer.setVisible(false); this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); From 97aeceab58aad3a00fc010ab879f7aad68609db1 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:26:50 +0100 Subject: [PATCH 073/171] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Move=20Pok?= =?UTF-8?q?=C3=A9dex=20option=20up=20the=20starter=20select=20screen=20men?= =?UTF-8?q?u=20#5376?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/starter-select-ui-handler.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a102fc9dc08..80a2baf7f55 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1984,15 +1984,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { yOffset: 47 }); }; - if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { - options.push({ - label: i18next.t("starterSelectUiHandler:useCandies"), - handler: () => { - ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); - return true; - } - }); - } options.push({ label: i18next.t("menuUiHandler:POKEDEX"), handler: () => { @@ -2008,6 +1999,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return true; } }); + if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { + options.push({ + label: i18next.t("starterSelectUiHandler:useCandies"), + handler: () => { + ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); + return true; + } + }); + } options.push({ label: i18next.t("menu:cancel"), handler: () => { From e4ce822ce62df4ce93a0adc71edf26b498a0f6c1 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:34:39 -0600 Subject: [PATCH 074/171] [Refactor] Remove Promises from moves and abilities (#5283) * Remove Promises from moves and abilities * Fix `PostSummonPhase` * Apply suggestions from Kev's review * More suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Cleaning up some updated functions * Remove Promise from `addEnemyModifier` + fixes to some extraneous `await`s * Test fixes * Fix missing import in revival blessing test Co-authored-by: innerthunder * Add back applyPreLeaveFieldAttrs Attribute was removed due to absence in a cherry-pick * Make applyPostApplyEffects work * Fix move-effect-phase.ts applications Some applyX methods were missed in the cherry pick commit and were still returning functions instead of running the function themselves * Mock `BattleScene.addPokemonIcon` in tests * Revival Blessing condition and tests * Incorporate Despair-Games/poketernity/pull/48 * Break up imports * Remove enemy modifier chance dead code * Remove async from applyAbAttrsInternal Stray async leftover from merge * Remove docs and comments referencing promises * Add `user.setTempAbility` to transform phase --------- Co-authored-by: innerthunder Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> --- src/battle-scene.ts | 2175 ++++++++++++----- src/data/ability.ts | 1050 ++++++-- src/data/move.ts | 658 +++-- .../the-winstrate-challenge-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 4 +- .../utils/encounter-pokemon-utils.ts | 4 +- src/field/pokemon.ts | 148 +- src/modifier/modifier.ts | 28 +- src/phases/add-enemy-buff-modifier-phase.ts | 3 +- src/phases/battle-end-phase.ts | 3 +- src/phases/game-over-modifier-reward-phase.ts | 22 +- src/phases/load-move-anim-phase.ts | 20 + src/phases/modifier-reward-phase.ts | 7 +- src/phases/move-anim-phase.ts | 20 + src/phases/move-charge-phase.ts | 7 +- src/phases/move-effect-phase.ts | 345 ++- src/phases/move-header-phase.ts | 5 +- src/phases/pokemon-transform-phase.ts | 77 + src/phases/post-summon-phase.ts | 10 +- src/phases/revival-blessing-phase.ts | 61 + src/phases/ribbon-modifier-reward-phase.ts | 21 +- src/phases/select-modifier-phase.ts | 35 +- src/test/abilities/unburden.test.ts | 2 +- src/test/moves/revival_blessing.test.ts | 117 + .../clowning-around-encounter.test.ts | 2 +- .../dancing-lessons-encounter.test.ts | 2 - .../encounters/delibirdy-encounter.test.ts | 30 +- .../global-trade-system-encounter.test.ts | 4 +- .../uncommon-breed-encounter.test.ts | 4 +- src/test/utils/gameWrapper.ts | 1 + src/test/utils/phaseInterceptor.ts | 18 +- 31 files changed, 3277 insertions(+), 1608 deletions(-) create mode 100644 src/phases/load-move-anim-phase.ts create mode 100644 src/phases/move-anim-phase.ts create mode 100644 src/phases/pokemon-transform-phase.ts create mode 100644 src/phases/revival-blessing-phase.ts create mode 100644 src/test/moves/revival_blessing.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index e6649d0999a..962b9c8ca91 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -8,10 +8,37 @@ import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import type { Constructor } from "#app/utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; -import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; -import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, ModifierBar, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier } from "./modifier/modifier"; +import type { + Modifier, + ModifierPredicate, + TurnHeldItemTransferModifier, +} from "./modifier/modifier"; +import { + ConsumableModifier, + ConsumablePokemonModifier, + DoubleBattleChanceBoosterModifier, + ExpBalanceModifier, + ExpShareModifier, + FusePokemonModifier, + HealingBoosterModifier, + ModifierBar, + MultipleParticipantExpBonusModifier, + PersistentModifier, + PokemonExpBoosterModifier, + PokemonFormChangeItemModifier, + PokemonHeldItemModifier, + PokemonHpRestoreModifier, + PokemonIncrementingStatModifier, + RememberMoveModifier, +} from "./modifier/modifier"; import { PokeballType } from "#enums/pokeball"; -import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; +import { + initCommonAnims, + initMoveAnim, + loadCommonAnimAssets, + loadMoveAnimAssets, + populateAnims, +} from "#app/data/battle-anims"; import type { Phase } from "#app/phase"; import { initGameSpeed } from "#app/system/game-speed"; import { Arena, ArenaBase } from "#app/field/arena"; @@ -19,9 +46,29 @@ import { GameData } from "#app/system/game-data"; import { addTextObject, getTextColor, TextStyle } from "#app/ui/text"; import { allMoves } from "#app/data/move"; import { MusicPreference } from "#app/system/settings/settings"; -import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { + getDefaultModifierTypeForTier, + getEnemyModifierTypesForWave, + getLuckString, + getLuckTextTint, + getModifierPoolForType, + getModifierType, + getPartyLuckValue, + ModifierPoolType, + modifierTypes, + PokemonHeldItemModifierType, +} from "#app/modifier/modifier-type"; import AbilityBar from "#app/ui/ability-bar"; -import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, applyPostItemLostAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr, PostItemLostAbAttr } from "#app/data/ability"; +import { + allAbilities, + applyAbAttrs, + applyPostBattleInitAbAttrs, + applyPostItemLostAbAttrs, + BlockItemTheftAbAttr, + DoubleBattleChanceAbAttr, + PostBattleInitAbAttr, + PostItemLostAbAttr, +} from "#app/data/ability"; import type { FixedBattleConfig } from "#app/battle"; import Battle, { BattleType } from "#app/battle"; import type { GameMode } from "#app/game-mode"; @@ -46,8 +93,16 @@ import type UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "#app/ui/ui-theme"; import type PokemonData from "#app/system/pokemon-data"; import { Nature } from "#enums/nature"; -import type { SpeciesFormChange, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger } from "#app/data/pokemon-forms"; +import type { + SpeciesFormChange, + SpeciesFormChangeTrigger, +} from "#app/data/pokemon-forms"; +import { + FormChangeItem, + pokemonFormChanges, + SpeciesFormChangeManualTrigger, + SpeciesFormChangeTimeOfDayTrigger, +} from "#app/data/pokemon-forms"; import { FormChangePhase } from "#app/phases/form-change-phase"; import { getTypeRgb } from "#app/data/type"; import { Type } from "#enums/type"; @@ -100,7 +155,14 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome } from "#app/data/mystery-encounters/mystery-encounters"; +import { + allMysteryEncounters, + ANTI_VARIANCE_WEIGHT_MODIFIER, + AVERAGE_ENCOUNTERS_PER_RUN_TARGET, + BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, + MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, + mysteryEncountersByBiome, +} from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -118,11 +180,11 @@ export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; const DEBUG_RNG = false; -const OPP_IVS_OVERRIDE_VALIDATED : number[] = ( - Array.isArray(Overrides.OPP_IVS_OVERRIDE) ? - Overrides.OPP_IVS_OVERRIDE : - new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) -).map(iv => isNaN(iv) || iv === null || iv > 31 ? -1 : iv); +const OPP_IVS_OVERRIDE_VALIDATED: number[] = ( + Array.isArray(Overrides.OPP_IVS_OVERRIDE) + ? Overrides.OPP_IVS_OVERRIDE + : new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) +).map((iv) => (isNaN(iv) || iv === null || iv > 31 ? -1 : iv)); export const startingWave = Overrides.STARTING_WAVE_OVERRIDE || 1; @@ -130,18 +192,21 @@ const expSpriteKeys: string[] = []; export let starterColors: StarterColors; interface StarterColors { - [key: string]: [string, string] + [key: string]: [string, string]; } export interface PokeballCounts { - [pb: string]: number; + [pb: string]: number; } -export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound; +export type AnySound = + | Phaser.Sound.WebAudioSound + | Phaser.Sound.HTML5AudioSound + | Phaser.Sound.NoAudioSound; export interface InfoToggle { - toggleInfo(force?: boolean): void; - isActive(): boolean; + toggleInfo(force?: boolean): void; + isActive(): boolean; } export default class BattleScene extends SceneBase { @@ -167,7 +232,8 @@ export default class BattleScene extends SceneBase { public showTimeOfDayWidget: boolean = true; public timeOfDayAnimation: EaseType = EaseType.NONE; public showLevelUpStats: boolean = true; - public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; + public enableTutorials: boolean = + import.meta.env.VITE_BYPASS_TUTORIAL === "1"; public enableMoveInfo: boolean = true; public enableRetries: boolean = false; public hideIvs: boolean = false; @@ -201,17 +267,17 @@ export default class BattleScene extends SceneBase { public eggSkipPreference: number = 0; /** - * Defines the experience gain display mode. - * - * @remarks - * The `expParty` can have several modes: - * - `0` - Default: The normal experience gain display, nothing changed. - * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. - * - `2` - Skip: No level up frame nor message. - * - * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. - * @default 0 - Uses the default normal experience gain display. - */ + * Defines the experience gain display mode. + * + * @remarks + * The `expParty` can have several modes: + * - `0` - Default: The normal experience gain display, nothing changed. + * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. + * - `2` - Skip: No level up frame nor message. + * + * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. + * @default 0 - Uses the default normal experience gain display. + */ public expParty: ExpNotification = 0; public hpBarSpeed: number = 0; public fusionPaletteSwaps: boolean = true; @@ -227,9 +293,9 @@ export default class BattleScene extends SceneBase { public battleStyle: number = BattleStyle.SWITCH; /** - * Defines whether or not to show type effectiveness hints - * - true: No hints - * - false: Show hints for moves + * Defines whether or not to show type effectiveness hints + * - true: No hints + * - false: Show hints for moves */ public typeHints: boolean = false; @@ -276,7 +342,8 @@ export default class BattleScene extends SceneBase { public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; /** Session save data that pertains to Mystery Encounters */ - public mysteryEncounterSaveData: MysteryEncounterSaveData = new MysteryEncounterSaveData(); + public mysteryEncounterSaveData: MysteryEncounterSaveData = + new MysteryEncounterSaveData(); /** If the previous wave was a MysteryEncounter, tracks the object with this variable. Mostly used for visual object cleanup */ public lastMysteryEncounter?: MysteryEncounter; /** Combined Biome and Wave count text */ @@ -292,7 +359,7 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; private shopOverlayShown: boolean = false; - private shopOverlayOpacity: number = .8; + private shopOverlayOpacity: number = 0.8; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; @@ -358,19 +425,30 @@ export default class BattleScene extends SceneBase { if (variant) { atlasPath = atlasPath.replace("variant/", ""); } - this.load.atlas(key, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`); + this.load.atlas( + key, + `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, + `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`, + ); } /** * Load the variant assets for the given sprite and stores them in {@linkcode variantColorCache} */ - public async loadPokemonVariantAssets(spriteKey: string, fileRoot: string, variant?: Variant): Promise { - const useExpSprite = this.experimentalSprites && this.hasExpSprite(spriteKey); + public async loadPokemonVariantAssets( + spriteKey: string, + fileRoot: string, + variant?: Variant, + ): Promise { + const useExpSprite = + this.experimentalSprites && this.hasExpSprite(spriteKey); if (useExpSprite) { fileRoot = `exp/${fileRoot}`; } let variantConfig = variantData; - fileRoot.split("/").map((p) => (variantConfig ? (variantConfig = variantConfig[p]) : null)); + fileRoot + .split("/") + .map((p) => (variantConfig ? (variantConfig = variantConfig[p]) : null)); const variantSet = variantConfig as VariantSet; return new Promise((resolve) => { @@ -393,10 +471,20 @@ export default class BattleScene extends SceneBase { async preload() { if (DEBUG_RNG) { const originalRealInRange = Phaser.Math.RND.realInRange; - Phaser.Math.RND.realInRange = function (min: number, max: number): number { + Phaser.Math.RND.realInRange = function ( + min: number, + max: number, + ): number { const ret = originalRealInRange.apply(this, [ min, max ]); - const args = [ "RNG", ++this.rngCounter, ret / (max - min), `min: ${min} / max: ${max}` ]; - args.push(`seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`); + const args = [ + "RNG", + ++this.rngCounter, + ret / (max - min), + `min: ${min} / max: ${max}`, + ]; + args.push( + `seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`, + ); if (this.rngOffset) { args.push(`offset: ${this.rngOffset}`); } @@ -423,10 +511,16 @@ export default class BattleScene extends SceneBase { this.load.setBaseURL(); this.spritePipeline = new SpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("Sprite", this.spritePipeline); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( + "Sprite", + this.spritePipeline, + ); this.fieldSpritePipeline = new FieldSpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( + "FieldSprite", + this.fieldSpritePipeline, + ); this.launchBattle(); } @@ -441,7 +535,7 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); this.arenaBgTransition.setName("sprite-arena-bg-transition"); - [ this.arenaBgTransition, this.arenaBg ].forEach(a => { + [ this.arenaBgTransition, this.arenaBg ].forEach((a) => { a.setPipeline(this.fieldSpritePipeline); a.setScale(6); a.setOrigin(0); @@ -461,13 +555,16 @@ export default class BattleScene extends SceneBase { this.fieldUI = fieldUI; - const transition = this.make.rexTransitionImagePack({ - x: 0, - y: 0, - scale: 6, - key: "loading_bg", - origin: { x: 0, y: 0 } - }, true); + const transition = this.make.rexTransitionImagePack( + { + x: 0, + y: 0, + scale: 6, + key: "loading_bg", + origin: { x: 0, y: 0 }, + }, + true, + ); //@ts-ignore (the defined types in the package are incromplete...) transition.transit({ @@ -489,14 +586,26 @@ export default class BattleScene extends SceneBase { this.uiContainer = uiContainer; const overlayWidth = this.game.canvas.width / 6; - const overlayHeight = (this.game.canvas.height / 6) - 48; - this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); + const overlayHeight = this.game.canvas.height / 6 - 48; + this.fieldOverlay = this.add.rectangle( + 0, + overlayHeight * -1 - 48, + overlayWidth, + overlayHeight, + 0x424242, + ); this.fieldOverlay.setName("rect-field-overlay"); this.fieldOverlay.setOrigin(0, 0); this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); - this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); + this.shopOverlay = this.add.rectangle( + 0, + overlayHeight * -1 - 48, + overlayWidth, + overlayHeight, + 0x070707, + ); this.shopOverlay.setName("rect-shop-overlay"); this.shopOverlay.setOrigin(0, 0); this.shopOverlay.setAlpha(0); @@ -547,28 +656,56 @@ export default 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.game.canvas.width / 6 - 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.game.canvas.width / 6 - 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.game.canvas.width / 6 - 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.game.canvas.width / 6 - 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, 0, i18next.t("common:luckIndicator"), TextStyle.PARTY, { fontSize: "54px" }); + this.luckLabelText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + i18next.t("common:luckIndicator"), + TextStyle.PARTY, + { fontSize: "54px" }, + ); this.luckLabelText.setName("text-luck-label"); this.luckLabelText.setOrigin(1, 0.5); this.luckLabelText.setVisible(false); @@ -576,7 +713,10 @@ export default class BattleScene extends SceneBase { this.arenaFlyout = new ArenaFlyout(); this.fieldUI.add(this.arenaFlyout); - this.fieldUI.moveBelow(this.arenaFlyout, this.fieldOverlay); + this.fieldUI.moveBelow( + this.arenaFlyout, + this.fieldOverlay, + ); this.updateUIPositions(); @@ -585,7 +725,10 @@ export default 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.game.canvas.width / 6 + 52, + -(this.game.canvas.height / 6) + 66, + ); this.pokemonInfoContainer.setup(); this.fieldUI.add(this.pokemonInfoContainer); @@ -607,14 +750,23 @@ export default class BattleScene extends SceneBase { this.arenaPlayerTransition.setVisible(false); this.arenaNextEnemy.setVisible(false); - [ this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy ].forEach(a => { + [ + this.arenaPlayer, + this.arenaPlayerTransition, + this.arenaEnemy, + this.arenaNextEnemy, + ].forEach((a) => { if (a instanceof Phaser.GameObjects.Sprite) { a.setOrigin(0, 0); } field.add(a); }); - const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + const trainer = this.addFieldSprite( + 0, + 0, + `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); trainer.setOrigin(0.5, 1); trainer.setName("sprite-trainer"); @@ -627,16 +779,19 @@ export default class BattleScene extends SceneBase { frames: this.anims.generateFrameNumbers("prompt", { start: 1, end: 4 }), frameRate: 6, repeat: -1, - showOnStart: true + showOnStart: true, }); this.anims.create({ key: "tera_sparkle", - frames: this.anims.generateFrameNumbers("tera_sparkle", { start: 0, end: 12 }), + frames: this.anims.generateFrameNumbers("tera_sparkle", { + start: 0, + end: 12, + }), frameRate: 18, repeat: 0, showOnStart: true, - hideOnComplete: true + hideOnComplete: true, }); this.reset(false, false, true); @@ -648,13 +803,22 @@ export default class BattleScene extends SceneBase { ui.setup(); - const defaultMoves = [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ]; + const defaultMoves = [ + Moves.TACKLE, + Moves.TAIL_WHIP, + Moves.FOCUS_ENERGY, + Moves.STRUGGLE, + ]; Promise.all([ Promise.all(loadPokemonAssets), initCommonAnims().then(() => loadCommonAnimAssets(true)), - Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(m))).then(() => loadMoveAnimAssets(defaultMoves, true)), - this.initStarterColors() + Promise.all( + [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map( + (m) => initMoveAnim(m), + ), + ).then(() => loadMoveAnimAssets(defaultMoves, true)), + this.initStarterColors(), ]).then(() => { this.pushPhase(new LoginPhase()); this.pushPhase(new TitlePhase()); @@ -688,7 +852,7 @@ export default class BattleScene extends SceneBase { if (this.lastSavePlayTime !== null) { this.lastSavePlayTime++; } - } + }, }); this.updateBiomeWaveText(); @@ -700,19 +864,22 @@ export default class BattleScene extends SceneBase { if (expSpriteKeys.length) { return; } - this.cachedFetch("./exp-sprites.json").then(res => res.json()).then(keys => { - if (Array.isArray(keys)) { - expSpriteKeys.push(...keys); - } - Promise.resolve(); - }); + this.cachedFetch("./exp-sprites.json") + .then((res) => res.json()) + .then((keys) => { + if (Array.isArray(keys)) { + expSpriteKeys.push(...keys); + } + Promise.resolve(); + }); } async initVariantData(): Promise { - Object.keys(variantData).forEach(key => delete variantData[key]); - await this.cachedFetch("./images/pokemon/variant/_masterlist.json").then(res => res.json()) - .then(v => { - Object.keys(v).forEach(k => variantData[k] = v[k]); + Object.keys(variantData).forEach((key) => delete variantData[key]); + await this.cachedFetch("./images/pokemon/variant/_masterlist.json") + .then((res) => res.json()) + .then((v) => { + Object.keys(v).forEach((k) => (variantData[k] = v[k])); if (this.experimentalSprites) { const expVariantData = variantData["exp"]; const traverseVariantData = (keys: string[]) => { @@ -722,7 +889,10 @@ export default class BattleScene extends SceneBase { if (i < keys.length - 1) { variantTree = variantTree[k]; expTree = expTree[k]; - } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { + } else if ( + variantTree.hasOwnProperty(k) && + expTree.hasOwnProperty(k) + ) { if ([ "back", "female" ].includes(k)) { traverseVariantData(keys.concat(k)); } else { @@ -731,7 +901,9 @@ export default class BattleScene extends SceneBase { } }); }; - Object.keys(expVariantData).forEach(ek => traverseVariantData([ ek ])); + Object.keys(expVariantData).forEach((ek) => + traverseVariantData([ ek ]), + ); } Promise.resolve(); }); @@ -749,18 +921,20 @@ export default class BattleScene extends SceneBase { } initStarterColors(): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { if (starterColors) { return resolve(); } - this.cachedFetch("./starter-colors.json").then(res => res.json()).then(sc => { - starterColors = {}; - Object.keys(sc).forEach(key => { - starterColors[key] = sc[key]; - }); + this.cachedFetch("./starter-colors.json") + .then((res) => res.json()) + .then((sc) => { + starterColors = {}; + Object.keys(sc).forEach((key) => { + starterColors[key] = sc[key]; + }); - /*const loadPokemonAssets: Promise[] = []; + /*const loadPokemonAssets: Promise[] = []; for (let s of Object.keys(speciesStarters)) { const species = getPokemonSpecies(parseInt(s)); @@ -782,13 +956,16 @@ export default class BattleScene extends SceneBase { resolve(); });*/ - resolve(); - }); + resolve(); + }); }); } hasExpSprite(key: string): boolean { - const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); + const keyMatch = + /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec( + key, + ); if (!keyMatch) { return false; } @@ -821,7 +998,7 @@ export default class BattleScene extends SceneBase { * that are {@linkcode Pokemon.isAllowedInBattle | allowed in battle}. */ public getPokemonAllowedInBattle(): PlayerPokemon[] { - return this.getPlayerParty().filter(p => p.isAllowedInBattle()); + return this.getPlayerParty().filter((p) => p.isAllowedInBattle()); } /** @@ -831,8 +1008,12 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getPlayerPokemon(includeSwitching: boolean = true): PlayerPokemon | undefined { - return this.getPlayerField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); + public getPlayerPokemon( + includeSwitching: boolean = true, + ): PlayerPokemon | undefined { + return this.getPlayerField().find( + (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), + ); } /** @@ -842,7 +1023,10 @@ export default class BattleScene extends SceneBase { */ public getPlayerField(): PlayerPokemon[] { const party = this.getPlayerParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + return party.slice( + 0, + Math.min(party.length, this.currentBattle?.double ? 2 : 1), + ); } public getEnemyParty(): EnemyPokemon[] { @@ -856,8 +1040,12 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getEnemyPokemon(includeSwitching: boolean = true): EnemyPokemon | undefined { - return this.getEnemyField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); + public getEnemyPokemon( + includeSwitching: boolean = true, + ): EnemyPokemon | undefined { + return this.getEnemyField().find( + (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), + ); } /** @@ -867,7 +1055,10 @@ export default class BattleScene extends SceneBase { */ public getEnemyField(): EnemyPokemon[] { const party = this.getEnemyParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + return party.slice( + 0, + Math.min(party.length, this.currentBattle?.double ? 2 : 1), + ); } /** @@ -882,9 +1073,7 @@ export default class BattleScene extends SceneBase { const enemyField = this.getEnemyField(); ret.splice(0, playerField.length, ...playerField); ret.splice(2, enemyField.length, ...enemyField); - return activeOnly - ? ret.filter(p => p?.isActive()) - : ret; + return activeOnly ? ret.filter((p) => p?.isActive()) : ret; } /** @@ -900,8 +1089,17 @@ export default class BattleScene extends SceneBase { if (allyPokemon?.isActive(true)) { let targetingMovePhase: MovePhase; do { - targetingMovePhase = this.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === removedPokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; - if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { + targetingMovePhase = this.findPhase( + (mp) => + mp instanceof MovePhase && + mp.targets.length === 1 && + mp.targets[0] === removedPokemon.getBattlerIndex() && + mp.pokemon.isPlayer() !== allyPokemon.isPlayer(), + ) as MovePhase; + if ( + targetingMovePhase && + targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex() + ) { targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); } } while (targetingMovePhase); @@ -924,16 +1122,46 @@ export default class BattleScene extends SceneBase { // return the stored info toggles; used by ui-inputs getInfoToggles(activeOnly: boolean = false): InfoToggle[] { - return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; + return activeOnly + ? this.infoToggles.filter((t) => t?.isActive()) + : this.infoToggles; } getPokemonById(pokemonId: number): Pokemon | null { - const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); - return (findInParty(this.getPlayerParty()) || findInParty(this.getEnemyParty())) ?? null; + const findInParty = (party: Pokemon[]) => + party.find((p) => p.id === pokemonId); + return ( + (findInParty(this.getPlayerParty()) || + findInParty(this.getEnemyParty())) ?? + null + ); } - addPlayerPokemon(species: PokemonSpecies, level: number, abilityIndex?: number, formIndex?: number, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: number[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { - const pokemon = new PlayerPokemon(species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + addPlayerPokemon( + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + postProcess?: (playerPokemon: PlayerPokemon) => void, + ): PlayerPokemon { + const pokemon = new PlayerPokemon( + species, + level, + abilityIndex, + formIndex, + gender, + shiny, + variant, + ivs, + nature, + dataSource, + ); if (postProcess) { postProcess(pokemon); } @@ -941,17 +1169,37 @@ export default class BattleScene extends SceneBase { return pokemon; } - addEnemyPokemon(species: PokemonSpecies, level: number, trainerSlot: TrainerSlot, boss: boolean = false, shinyLock: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { + addEnemyPokemon( + species: PokemonSpecies, + level: number, + trainerSlot: TrainerSlot, + boss: boolean = false, + shinyLock: boolean = false, + dataSource?: PokemonData, + postProcess?: (enemyPokemon: EnemyPokemon) => void, + ): EnemyPokemon { if (Overrides.OPP_LEVEL_OVERRIDE > 0) { level = Overrides.OPP_LEVEL_OVERRIDE; } if (Overrides.OPP_SPECIES_OVERRIDE) { species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); // The fact that a Pokemon is a boss or not can change based on its Species and level - boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1; + boss = + this.getEncounterBossSegments( + this.currentBattle.waveIndex, + level, + species, + ) > 1; } - const pokemon = new EnemyPokemon(species, level, trainerSlot, boss, shinyLock, dataSource); + const pokemon = new EnemyPokemon( + species, + level, + trainerSlot, + boss, + shinyLock, + dataSource, + ); if (Overrides.OPP_FUSION_OVERRIDE) { pokemon.generateFusionSpecies(); } @@ -960,7 +1208,13 @@ export default class BattleScene extends SceneBase { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); for (let s = 0; s < pokemon.ivs.length; s++) { - pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); + pokemon.ivs[s] = Math.round( + Phaser.Math.Linear( + Math.min(pokemon.ivs[s], secondaryIvs[s]), + Math.max(pokemon.ivs[s], secondaryIvs[s]), + 0.75, + ), + ); } } if (postProcess) { @@ -983,7 +1237,10 @@ export default class BattleScene extends SceneBase { * @param pokemon * @param destroy Default true. If true, will destroy the {@linkcode PlayerPokemon} after removing */ - removePokemonFromPlayerParty(pokemon: PlayerPokemon, destroy: boolean = true) { + removePokemonFromPlayerParty( + pokemon: PlayerPokemon, + destroy: boolean = true, + ) { if (!pokemon) { return; } @@ -997,7 +1254,14 @@ export default class BattleScene extends SceneBase { this.updateModifiers(true); } - addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { + addPokemonIcon( + pokemon: Pokemon, + x: number, + y: number, + originX: number = 0.5, + originY: number = 0.5, + ignoreOverride: boolean = false, + ): Phaser.GameObjects.Container { const container = this.add.container(x, y); container.setName(`${pokemon.name}-icon`); @@ -1006,7 +1270,9 @@ export default class BattleScene extends SceneBase { icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist if (icon.frame.name !== pokemon.getIconId(true)) { - console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`); + console.log( + `${pokemon.name}'s variant icon does not exist. Replacing with default.`, + ); const temp = pokemon.shiny; pokemon.shiny = false; icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride)); @@ -1018,7 +1284,11 @@ export default class BattleScene extends SceneBase { container.add(icon); if (pokemon.isFusion()) { - const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + const fusionIcon = this.add.sprite( + 0, + 0, + pokemon.getFusionIconAtlasKey(ignoreOverride), + ); fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1027,13 +1297,24 @@ export default class BattleScene extends SceneBase { const originalHeight = icon.height; const originalFrame = icon.frame; - const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); + const iconHeight = ( + icon.frame.cutHeight <= fusionIcon.frame.cutHeight + ? Math.ceil + : Math.floor + )((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); // Inefficient, but for some reason didn't work with only the unique properties as part of the name const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; if (!icon.frame.texture.has(iconFrameId)) { - icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight); + icon.frame.texture.add( + iconFrameId, + icon.frame.sourceIndex, + icon.frame.cutX, + icon.frame.cutY, + icon.frame.cutWidth, + iconHeight, + ); } icon.setFrame(iconFrameId); @@ -1043,13 +1324,21 @@ export default class BattleScene extends SceneBase { const originalFusionFrame = fusionIcon.frame; const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight; - const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight; + const fusionIconHeight = + fusionIcon.frame.cutHeight - icon.frame.cutHeight; // Inefficient, but for some reason didn't work with only the unique properties as part of the name const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; if (!fusionIcon.frame.texture.has(fusionIconFrameId)) { - fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight); + fusionIcon.frame.texture.add( + fusionIconFrameId, + fusionIcon.frame.sourceIndex, + fusionIcon.frame.cutX, + fusionIconY, + fusionIcon.frame.cutWidth, + fusionIconHeight, + ); } fusionIcon.setFrame(fusionIconFrameId); @@ -1062,7 +1351,7 @@ export default class BattleScene extends SceneBase { container.x -= originalWidth * (originX - 0.5); } if (originY !== 0) { - container.y -= (originalHeight) * originY; + container.y -= originalHeight * originY; } } else { if (originX !== 0.5) { @@ -1097,7 +1386,11 @@ export default class BattleScene extends SceneBase { return this.currentBattle?.randSeedInt(range, min); } - reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { + reset( + clearScene: boolean = false, + clearData: boolean = false, + reloadI18n: boolean = false, + ): void { if (clearData) { this.gameData = new GameData(); } @@ -1111,7 +1404,11 @@ export default class BattleScene extends SceneBase { this.lockModifierTiers = false; - this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); + this.pokeballCounts = Object.fromEntries( + Utils.getEnumValues(PokeballType) + .filter((p) => p <= PokeballType.MASTER_BALL) + .map((t) => [ t, 0 ]), + ); this.pokeballCounts[PokeballType.POKEBALL] += 5; if (Overrides.POKEBALL_OVERRIDE.active) { this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; @@ -1132,7 +1429,10 @@ export default class BattleScene extends SceneBase { // If this is a ME, clear any residual visual sprites before reloading if (this.currentBattle?.mysteryEncounter?.introVisuals) { - this.field.remove(this.currentBattle.mysteryEncounter?.introVisuals, true); + this.field.remove( + this.currentBattle.mysteryEncounter?.introVisuals, + true, + ); } //@ts-ignore - allowing `null` for currentBattle causes a lot of trouble @@ -1153,7 +1453,7 @@ export default class BattleScene extends SceneBase { this.updateScoreText(); this.scoreText.setVisible(false); - [ this.luckLabelText, this.luckText ].map(t => t.setVisible(false)); + [ this.luckLabelText, this.luckText ].map((t) => t.setVisible(false)); this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); @@ -1162,12 +1462,16 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition.setPosition(0, 0); this.arenaPlayer.setPosition(300, 0); this.arenaPlayerTransition.setPosition(0, 0); - [ this.arenaEnemy, this.arenaNextEnemy ].forEach(a => a.setPosition(-280, 0)); + [ this.arenaEnemy, this.arenaNextEnemy ].forEach((a) => + a.setPosition(-280, 0), + ); this.arenaNextEnemy.setVisible(false); this.arena.init(); - this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + this.trainer.setTexture( + `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); this.trainer.setPosition(406, 186); this.trainer.setVisible(true); @@ -1180,7 +1484,16 @@ export default class BattleScene extends SceneBase { ...allSpecies, ...allMoves, ...allAbilities, - ...Utils.getEnumValues(ModifierPoolType).map(mpt => getModifierPoolForType(mpt)).map(mp => Object.values(mp).flat().map(mt => mt.modifierType).filter(mt => "localize" in mt).map(lpb => lpb as unknown as Localizable)).flat() + ...Utils.getEnumValues(ModifierPoolType) + .map((mpt) => getModifierPoolForType(mpt)) + .map((mp) => + Object.values(mp) + .flat() + .map((mt) => mt.modifierType) + .filter((mt) => "localize" in mt) + .map((lpb) => lpb as unknown as Localizable), + ) + .flat(), ]; for (const item of localizable) { item.localize(); @@ -1206,21 +1519,32 @@ export default class BattleScene extends SceneBase { this.children.removeAll(true); this.game.domContainer.innerHTML = ""; this.launchBattle(); - } + }, }); } } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.NumberHolder(newWaveIndex % 10 === 0 ? 32 : 8); + const doubleChance = new Utils.NumberHolder( + newWaveIndex % 10 === 0 ? 32 : 8, + ); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); + playerField.forEach((p) => + applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance), + ); return Math.max(doubleChance.value, 1); } - newBattle(waveIndex?: number, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounterType?: MysteryEncounterType): Battle | null { + newBattle( + waveIndex?: number, + battleType?: BattleType, + trainerData?: TrainerData, + double?: boolean, + mysteryEncounterType?: MysteryEncounterType, + ): Battle | null { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; - const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); + const newWaveIndex = + waveIndex || (this.currentBattle?.waveIndex || _startingWave - 1) + 1; let newDouble: boolean | undefined; let newBattleType: BattleType; let newTrainer: Trainer | undefined; @@ -1231,11 +1555,17 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); - if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { + if ( + this.gameMode.isFixedBattle(newWaveIndex) && + trainerData === undefined + ) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; newBattleType = battleConfig.battleType; - this.executeWithSeedOffset(() => newTrainer = battleConfig?.getTrainer(), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); + this.executeWithSeedOffset( + () => (newTrainer = battleConfig?.getTrainer()), + (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8, + ); if (newTrainer) { this.field.add(newTrainer); } @@ -1243,7 +1573,9 @@ export default class BattleScene extends SceneBase { if (!this.gameMode.hasTrainers) { newBattleType = BattleType.WILD; } else if (battleType === undefined) { - newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; + newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) + ? BattleType.TRAINER + : BattleType.WILD; } else { newBattleType = battleType; } @@ -1254,29 +1586,50 @@ export default class BattleScene extends SceneBase { if (trainerConfigs[trainerType].doubleOnly) { doubleTrainer = true; } else if (trainerConfigs[trainerType].hasDouble) { - doubleTrainer = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); + doubleTrainer = !Utils.randSeedInt( + this.getDoubleBattleChance(newWaveIndex, playerField), + ); // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance - if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { + if ( + trainerConfigs[trainerType].trainerTypeDouble && + ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType) + ) { doubleTrainer = false; } } - const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); - newTrainer = trainerData !== undefined ? trainerData.toTrainer() : new Trainer(trainerType, variant); + const variant = doubleTrainer + ? TrainerVariant.DOUBLE + : Utils.randSeedInt(2) + ? TrainerVariant.FEMALE + : TrainerVariant.DEFAULT; + newTrainer = + trainerData !== undefined + ? trainerData.toTrainer() + : new Trainer(trainerType, variant); this.field.add(newTrainer); } // Check for mystery encounter // Can only occur in place of a standard (non-boss) wild battle, waves 10-180 - if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { + if ( + this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || + newBattleType === BattleType.MYSTERY_ENCOUNTER + ) { newBattleType = BattleType.MYSTERY_ENCOUNTER; // Reset to base spawn weight - this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; + this.mysteryEncounterSaveData.encounterSpawnChance = + BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; } } if (double === undefined && newWaveIndex > 1) { - if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { - newDouble = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); + if ( + newBattleType === BattleType.WILD && + !this.gameMode.isWaveFinal(newWaveIndex) + ) { + newDouble = !Utils.randSeedInt( + this.getDoubleBattleChance(newWaveIndex, playerField), + ); } else if (newBattleType === BattleType.TRAINER) { newDouble = newTrainer?.variant === TrainerVariant.DOUBLE; } @@ -1300,10 +1653,10 @@ export default class BattleScene extends SceneBase { doubleOverrideForWave = "single"; break; case "even-doubles": - doubleOverrideForWave = (newWaveIndex % 2) ? "single" : "double"; + doubleOverrideForWave = newWaveIndex % 2 ? "single" : "double"; break; case "odd-doubles": - doubleOverrideForWave = (newWaveIndex % 2) ? "double" : "single"; + doubleOverrideForWave = newWaveIndex % 2 ? "double" : "single"; break; } @@ -1314,7 +1667,10 @@ export default class BattleScene extends SceneBase { * Override battles into single only if not fighting with trainers. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 | GitHub Issue #1948} */ - if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") { + if ( + newBattleType !== BattleType.TRAINER && + doubleOverrideForWave === "single" + ) { newDouble = false; } } @@ -1332,13 +1688,25 @@ export default class BattleScene extends SceneBase { } if (lastBattle?.double && !newDouble) { - this.tryRemovePhase(p => p instanceof SwitchPhase); - this.getPlayerField().forEach(p => p.lapseTag(BattlerTagType.COMMANDED)); + this.tryRemovePhase((p) => p instanceof SwitchPhase); + this.getPlayerField().forEach((p) => + p.lapseTag(BattlerTagType.COMMANDED), + ); } - this.executeWithSeedOffset(() => { - this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); - }, newWaveIndex << 3, this.waveSeed); + this.executeWithSeedOffset( + () => { + this.currentBattle = new Battle( + this.gameMode, + newWaveIndex, + newBattleType, + newTrainer, + newDouble, + ); + }, + newWaveIndex << 3, + this.waveSeed, + ); this.currentBattle.incrementTurn(); if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { @@ -1350,20 +1718,33 @@ export default class BattleScene extends SceneBase { if (!waveIndex && lastBattle) { const isWaveIndexMultipleOfTen = !(lastBattle.waveIndex % 10); - const isEndlessOrDaily = this.gameMode.hasShortBiomes || this.gameMode.isDaily; - const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0; - const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49; - const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); - const resetArenaState = isNewBiome || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; - this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); + const isEndlessOrDaily = + this.gameMode.hasShortBiomes || this.gameMode.isDaily; + const isEndlessFifthWave = + this.gameMode.hasShortBiomes && lastBattle.waveIndex % 5 === 0; + const isWaveIndexMultipleOfFiftyMinusOne = + lastBattle.waveIndex % 50 === 49; + const isNewBiome = + isWaveIndexMultipleOfTen || + isEndlessFifthWave || + (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); + const resetArenaState = + isNewBiome || + [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes( + this.currentBattle.battleType, + ) || + this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; + this.getEnemyParty().forEach((enemyPokemon) => enemyPokemon.destroy()); this.trySpreadPokerus(); - if (!isNewBiome && (newWaveIndex % 10) === 5) { + if (!isNewBiome && newWaveIndex % 10 === 5) { this.arena.updatePoolsForTimeOfDay(); } if (resetArenaState) { this.arena.resetArenaEffects(); - playerField.forEach((pokemon) => pokemon.lapseTag(BattlerTagType.COMMANDED)); + playerField.forEach((pokemon) => + pokemon.lapseTag(BattlerTagType.COMMANDED), + ); playerField.forEach((pokemon, p) => { if (pokemon.isOnField()) { @@ -1375,7 +1756,12 @@ export default class BattleScene extends SceneBase { pokemon.resetBattleData(); pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); - if (pokemon.hasSpecies(Species.TERAPAGOS) || (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)) { + if ( + pokemon.hasSpecies(Species.TERAPAGOS) || + (this.gameMode.isClassic && + this.currentBattle.waveIndex > 180 && + this.currentBattle.waveIndex <= 190) + ) { this.arena.playerTerasUsed = 0; } } @@ -1386,7 +1772,10 @@ export default class BattleScene extends SceneBase { } for (const pokemon of this.getPlayerParty()) { - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); + this.triggerPokemonFormChange( + pokemon, + SpeciesFormChangeTimeOfDayTrigger, + ); } if (!this.gameMode.hasRandomBiomes && !isNewBiome) { @@ -1409,23 +1798,35 @@ export default class BattleScene extends SceneBase { this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints); this.eventTarget.dispatchEvent(new NewArenaEvent()); - this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; + this.arenaBg.pipelineData = { + terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome(), + }; return this.arena; } updateFieldScale(): Promise { - return new Promise(resolve => { - const fieldScale = Math.floor(Math.pow(1 / this.getField(true) - .map(p => p.getSpriteScale()) - .reduce((highestScale: number, scale: number) => highestScale = Math.max(scale, highestScale), 0), 0.7) * 40 - ) / 40; + return new Promise((resolve) => { + const fieldScale = + Math.floor( + Math.pow( + 1 / + this.getField(true) + .map((p) => p.getSpriteScale()) + .reduce( + (highestScale: number, scale: number) => + (highestScale = Math.max(scale, highestScale)), + 0, + ), + 0.7, + ) * 40, + ) / 40; this.setFieldScale(fieldScale).then(() => resolve()); }); } setFieldScale(scale: number, instant: boolean = false): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { scale *= 6; if (this.field.scale === scale) { return resolve(); @@ -1441,19 +1842,28 @@ export default class BattleScene extends SceneBase { scale: scale, x: (defaultWidth - scaledWidth) / 2, y: defaultHeight - scaledHeight, - duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, + duration: !instant + ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) + : 0, ease: "Sine.easeInOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): number { + getSpeciesFormIndex( + species: PokemonSpecies, + gender?: Gender, + nature?: Nature, + ignoreArena?: boolean, + ): number { if (!species.forms?.length) { return 0; } - const isEggPhase: boolean = [ "EggLapsePhase", "EggHatchPhase" ].includes(this.getCurrentPhase()?.constructor.name ?? ""); + const isEggPhase: boolean = [ "EggLapsePhase", "EggHatchPhase" ].includes( + this.getCurrentPhase()?.constructor.name ?? "", + ); switch (species.speciesId) { case Species.UNOWN: @@ -1481,12 +1891,19 @@ export default class BattleScene extends SceneBase { case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); case Species.PIKACHU: - if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) { + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + this.currentBattle?.waveIndex < 30 + ) { return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30 } return Utils.randSeedInt(8); case Species.EEVEE: - if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30 && !isEggPhase) { + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + this.currentBattle?.waveIndex < 30 && + !isEggPhase + ) { return 0; // No Partner Eevee for Wave 12 Preschoolers } return Utils.randSeedInt(2); @@ -1509,13 +1926,26 @@ export default class BattleScene extends SceneBase { case Species.OINKOLOGNE: return gender === Gender.FEMALE ? 1 : 0; case Species.TOXTRICITY: - const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + const lowkeyNatures = [ + Nature.LONELY, + Nature.BOLD, + Nature.RELAXED, + Nature.TIMID, + Nature.SERIOUS, + Nature.MODEST, + Nature.MILD, + Nature.QUIET, + Nature.BASHFUL, + Nature.CALM, + Nature.GENTLE, + Nature.CAREFUL, + ]; if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { return 1; } return 0; case Species.GIMMIGHOUL: - // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs + // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs if (this.gameMode.hasMysteryEncounters && !isEggPhase) { return 1; // Wandering form } else { @@ -1539,21 +1969,34 @@ export default class BattleScene extends SceneBase { private getGeneratedOffsetGym(): boolean { let ret = false; - this.executeWithSeedOffset(() => { - ret = !Utils.randSeedInt(2); - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = !Utils.randSeedInt(2); + }, + 0, + this.seed.toString(), + ); return ret; } private getGeneratedWaveCycleOffset(): number { let ret = 0; - this.executeWithSeedOffset(() => { - ret = Utils.randSeedInt(8) * 5; - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = Utils.randSeedInt(8) * 5; + }, + 0, + this.seed.toString(), + ); return ret; } - getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss: boolean = false): number { + getEncounterBossSegments( + waveIndex: number, + level: number, + species?: PokemonSpecies, + forceBoss: boolean = false, + ): number { if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) { return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE; } else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { @@ -1566,11 +2009,19 @@ export default class BattleScene extends SceneBase { } let isBoss: boolean | undefined; - if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) { + if ( + forceBoss || + (species && + (species.subLegendary || species.legendary || species.mythical)) + ) { isBoss = true; } else { this.executeWithSeedOffset(() => { - isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); + isBoss = + waveIndex % 10 === 0 || + (this.gameMode.hasRandomBosses && + Utils.randSeedInt(100) < + Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); }, waveIndex << 2); } if (!isBoss) { @@ -1607,14 +2058,17 @@ export default class BattleScene extends SceneBase { return; } - this.executeWithSeedOffset(() => { - if (p) { - spread(p, -1); - } - if (p < party.length - 1) { - spread(p, 1); - } - }, this.currentBattle.waveIndex + (p << 8)); + this.executeWithSeedOffset( + () => { + if (p) { + spread(p, -1); + } + if (p < party.length - 1) { + spread(p, 1); + } + }, + this.currentBattle.waveIndex + (p << 8), + ); }); } @@ -1626,7 +2080,11 @@ export default class BattleScene extends SceneBase { this.rngCounter = 0; } - executeWithSeedOffset(func: Function, offset: number, seedOverride?: string): void { + executeWithSeedOffset( + func: Function, + offset: number, + seedOverride?: string, + ): void { if (!func) { return; } @@ -1634,7 +2092,9 @@ export default class BattleScene extends SceneBase { const tempRngOffset = this.rngOffset; const tempRngSeedOverride = this.rngSeedOverride; const state = Phaser.Math.RND.state(); - Phaser.Math.RND.sow([ Utils.shiftCharCodes(seedOverride || this.seed, offset) ]); + Phaser.Math.RND.sow([ + Utils.shiftCharCodes(seedOverride || this.seed, offset), + ]); this.rngCounter = 0; this.rngOffset = offset; this.rngSeedOverride = seedOverride || ""; @@ -1645,7 +2105,13 @@ export default class BattleScene extends SceneBase { this.rngSeedOverride = tempRngSeedOverride; } - addFieldSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, terrainColorRatio: number = 0): Phaser.GameObjects.Sprite { + addFieldSprite( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + terrainColorRatio: number = 0, + ): Phaser.GameObjects.Sprite { const ret = this.add.sprite(x, y, texture, frame); ret.setPipeline(this.fieldSpritePipeline); if (terrainColorRatio) { @@ -1655,14 +2121,33 @@ export default class BattleScene extends SceneBase { return ret; } - addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + addPokemonSprite( + pokemon: Pokemon, + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + hasShadow: boolean = false, + ignoreOverride: boolean = false, + ): Phaser.GameObjects.Sprite { const ret = this.addFieldSprite(x, y, texture, frame); this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); return ret; } - initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, isTerastallized: pokemon ? pokemon.isTerastallized : false }); + initPokemonSprite( + sprite: Phaser.GameObjects.Sprite, + pokemon?: Pokemon, + hasShadow: boolean = false, + ignoreOverride: boolean = false, + ): Phaser.GameObjects.Sprite { + sprite.setPipeline(this.spritePipeline, { + tone: [ 0.0, 0.0, 0.0, 0.0 ], + hasShadow: hasShadow, + ignoreOverride: ignoreOverride, + teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, + isTerastallized: pokemon ? pokemon.isTerastallized : false, + }); this.spriteSparkleHandler.add(sprite); return sprite; } @@ -1675,25 +2160,25 @@ export default class BattleScene extends SceneBase { } showFieldOverlay(duration: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0.5, ease: "Sine.easeOut", duration: duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } hideFieldOverlay(duration: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1708,26 +2193,26 @@ export default class BattleScene extends SceneBase { showShopOverlay(duration: number): Promise { this.shopOverlayShown = true; - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.shopOverlay, alpha: this.shopOverlayOpacity, ease: "Sine.easeOut", duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } hideShopOverlay(duration: number): Promise { this.shopOverlayShown = false; - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.shopOverlay, alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1744,7 +2229,9 @@ export default class BattleScene extends SceneBase { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); - this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); + this.biomeWaveText.setText( + biomeString + " - " + this.currentBattle.waveIndex.toString(), + ); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); this.biomeWaveText.setVisible(true); @@ -1755,7 +2242,9 @@ export default class BattleScene extends SceneBase { return; } const formattedMoney = Utils.formatMoney(this.moneyFormat, this.money); - this.moneyText.setText(i18next.t("battleScene:moneyOwned", { formattedMoney })); + this.moneyText.setText( + i18next.t("battleScene:moneyOwned", { formattedMoney }), + ); this.fieldUI.moveAbove(this.moneyText, this.luckText); if (forceVisible) { this.moneyText.setVisible(true); @@ -1774,7 +2263,8 @@ export default class BattleScene extends SceneBase { scale: this.moneyText.scale + deltaScale, loop: 0, yoyo: true, - onComplete: (_) => this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), + onComplete: (_) => + this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), }); } @@ -1789,7 +2279,7 @@ export default class BattleScene extends SceneBase { */ updateAndShowText(duration: number): void { const labels = [ this.luckLabelText, this.luckText ]; - labels.forEach(t => t.setAlpha(0)); + labels.forEach((t) => t.setAlpha(0)); const luckValue = getPartyLuckValue(this.getPlayerParty()); this.luckText.setText(getLuckString(luckValue)); if (luckValue < 14) { @@ -1797,14 +2287,16 @@ export default 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.game.canvas.width / 6 - 2 - (this.luckText.displayWidth + 2), + ); this.tweens.add({ targets: labels, duration: duration, alpha: 1, onComplete: () => { - labels.forEach(t => t.setVisible(true)); - } + labels.forEach((t) => t.setVisible(true)); + }, }); } @@ -1818,21 +2310,29 @@ export default class BattleScene extends SceneBase { duration: duration, alpha: 0, onComplete: () => { - labels.forEach(l => l.setVisible(false)); - } + labels.forEach((l) => l.setVisible(false)); + }, }); } updateUIPositions(): void { - const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible()).length; - const biomeWaveTextHeight = this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; + 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) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0) + (biomeWaveTextHeight / 2) + -(this.game.canvas.height / 6) + + (enemyModifierCount ? (enemyModifierCount <= 12 ? 15 : 24) : 0) + + biomeWaveTextHeight / 2, ); this.moneyText.setY(this.biomeWaveText.y + 10); this.scoreText.setY(this.moneyText.y + 10); - [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); - const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; + [ this.luckLabelText, this.luckText ].map((l) => + l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10), + ); + 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); @@ -1848,8 +2348,20 @@ export default class BattleScene extends SceneBase { } addFaintedEnemyScore(enemy: EnemyPokemon): void { - let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * ((enemy.ivs.reduce((iv: number, total: number) => total += iv, 0) / 93) * 0.2 + 0.8); - this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map(m => scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()); + let scoreIncrease = + enemy.getSpeciesForm().getBaseExp() * + (enemy.level / this.getMaxExpLevel()) * + ((enemy.ivs.reduce((iv: number, total: number) => (total += iv), 0) / + 93) * + 0.2 + + 0.8); + this.findModifiers( + (m) => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, + false, + ).map( + (m) => + (scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()), + ); if (enemy.isBoss()) { scoreIncrease *= Math.sqrt(enemy.bossSegments); } @@ -1864,35 +2376,68 @@ export default class BattleScene extends SceneBase { } const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(waveIndex); - const baseLevel = (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * 1.2; + const baseLevel = + (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * + 1.2; return Math.ceil(baseLevel / 2) * 2 + 2; } - randomSpecies(waveIndex: number, level: number, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { + randomSpecies( + waveIndex: number, + level: number, + fromArenaPool?: boolean, + speciesFilter?: PokemonSpeciesFilter, + filterAllEvolutions?: boolean, + ): PokemonSpecies { if (fromArenaPool) { - return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party)); + return this.arena.randomSpecies( + waveIndex, + level, + undefined, + getPartyLuckValue(this.party), + ); } - const filteredSpecies = speciesFilter ? [ ...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { - if (!filterAllEvolutions) { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - } - } - return s; - })) ] : allSpecies.filter(s => s.isCatchable()); + const filteredSpecies = speciesFilter + ? [ + ...new Set( + allSpecies + .filter((s) => s.isCatchable()) + .filter(speciesFilter) + .map((s) => { + if (!filterAllEvolutions) { + while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { + s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + } + } + return s; + }), + ), + ] + : allSpecies.filter((s) => s.isCatchable()); return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; } generateRandomBiome(waveIndex: number): Biome { const relWave = waveIndex % 250; - const biomes = Utils.getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END); + const biomes = Utils.getEnumValues(Biome).filter( + (b) => b !== Biome.TOWN && b !== Biome.END, + ); const maxDepth = biomeDepths[Biome.END][0] - 2; - const depthWeights = new Array(maxDepth + 1).fill(null) - .map((_, i: number) => ((1 - Math.min(Math.abs((i / (maxDepth - 1)) - (relWave / 250)) + 0.25, 1)) / 0.75) * 250); + const depthWeights = new Array(maxDepth + 1) + .fill(null) + .map( + (_, i: number) => + ((1 - + Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / + 0.75) * + 250, + ); const biomeThresholds: number[] = []; let totalWeight = 0; for (const biome of biomes) { - totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); + totalWeight += Math.ceil( + depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1], + ); biomeThresholds.push(totalWeight); } @@ -1918,7 +2463,7 @@ export default class BattleScene extends SceneBase { if (this.bgm && bgmName === this.bgm.key) { if (!this.bgm.isPlaying) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); } return; @@ -1929,15 +2474,16 @@ export default class BattleScene extends SceneBase { this.bgmCache.add(bgmName); this.loadBgm(bgmName); let loopPoint = 0; - loopPoint = bgmName === this.arena.bgm - ? this.arena.getBgmLoopPoint() - : this.getBgmLoopPoint(bgmName); + loopPoint = + bgmName === this.arena.bgm + ? this.arena.getBgmLoopPoint() + : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); return; } @@ -1946,7 +2492,7 @@ export default class BattleScene extends SceneBase { } this.bgm = this.sound.add(bgmName, { loop: true }); this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); if (loopPoint) { this.bgm.on("looped", () => this.bgm.play({ seek: loopPoint })); @@ -1995,7 +2541,6 @@ export default class BattleScene extends SceneBase { } else { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { - case "battle_anims": case "cry": if (soundDetails[1].startsWith("PRSFX- ")) { @@ -2017,7 +2562,9 @@ export default class BattleScene extends SceneBase { if (!this.bgm) { return false; } - const bgm = this.sound.getAllPlaying().find(bgm => bgm.key === this.bgm.key); + const bgm = this.sound + .getAllPlaying() + .find((bgm) => bgm.key === this.bgm.key); if (bgm) { SoundFade.fadeOut(this, this.bgm, duration, destroy); return true; @@ -2032,7 +2579,11 @@ export default class BattleScene extends SceneBase { * @param destroy * @param delay */ - fadeAndSwitchBgm(newBgmKey: string, destroy: boolean = false, delay: number = 2000) { + fadeAndSwitchBgm( + newBgmKey: string, + destroy: boolean = false, + delay: number = 2000, + ) { this.fadeOutBgm(delay, destroy); this.time.delayedCall(delay, () => { this.playBgm(newBgmKey); @@ -2052,24 +2603,24 @@ export default class BattleScene extends SceneBase { case "heal": case "evolution": case "evolution_fanfare": - // These sounds are loaded in as BGM, but played as sound effects - // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() - config["volume"] *= (this.masterVolume * this.bgmVolume); + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] *= this.masterVolume * this.bgmVolume; break; case "battle_anims": case "cry": - config["volume"] *= (this.masterVolume * this.fieldVolume); + config["volume"] *= this.masterVolume * this.fieldVolume; //PRSFX sound files are unusually loud if (keyDetails[1].startsWith("PRSFX- ")) { config["volume"] *= 0.5; } break; case "ui": - //As of, right now this applies to the "select", "menu_open", "error" sound effects - config["volume"] *= (this.masterVolume * this.uiVolume); + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] *= this.masterVolume * this.uiVolume; break; case "se": - config["volume"] *= (this.masterVolume * this.seVolume); + config["volume"] *= this.masterVolume * this.seVolume; break; } this.sound.play(key, config); @@ -2089,10 +2640,13 @@ export default class BattleScene extends SceneBase { this.bgmResumeTimer.destroy(); } if (resumeBgm) { - this.bgmResumeTimer = this.time.delayedCall((pauseDuration || Utils.fixedInt(sound.totalDuration * 1000)), () => { - this.resumeBgm(); - this.bgmResumeTimer = null; - }); + this.bgmResumeTimer = this.time.delayedCall( + pauseDuration || Utils.fixedInt(sound.totalDuration * 1000), + () => { + this.resumeBgm(); + this.bgmResumeTimer = null; + }, + ); } return sound; } @@ -2101,9 +2655,9 @@ export default class BattleScene extends SceneBase { getBgmLoopPoint(bgmName: string): number { switch (bgmName) { case "title": //Firel PokéRogue Title - return 46.500; + return 46.5; case "battle_kanto_champion": //B2W2 Kanto Champion Battle - return 13.950; + return 13.95; case "battle_johto_champion": //B2W2 Johto Champion Battle return 23.498; case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle @@ -2117,7 +2671,7 @@ export default class BattleScene extends SceneBase { case "battle_champion_iris": //B2W2 Unova Champion Battle return 10.145; case "battle_kalos_champion": //XY Kalos Champion Battle - return 10.380; + return 10.38; case "battle_champion_kukui": //SM Kukui Battle return 15.784; case "battle_alola_champion": //USUM Alola Champion Battle @@ -2133,17 +2687,17 @@ export default class BattleScene extends SceneBase { case "battle_champion_kieran": //SV Champion Kieran Battle return 7.206; case "battle_hoenn_elite": //ORAS Elite Four Battle - return 11.350; + return 11.35; case "battle_unova_elite": //BW Elite Four Battle - return 17.730; + return 17.73; case "battle_kalos_elite": //XY Elite Four Battle - return 12.340; + return 12.34; case "battle_alola_elite": //SM Elite Four Battle return 19.212; case "battle_galar_elite": //SWSH League Tournament Battle return 164.069; case "battle_paldea_elite": //SV Elite Four Battle - return 12.770; + return 12.77; case "battle_bb_elite": //SV BB League Elite Four Battle return 19.434; case "battle_final_encounter": //PMD RTDX Rayquaza's Domain @@ -2161,7 +2715,7 @@ export default class BattleScene extends SceneBase { case "battle_unova_gym": //BW Unova Gym Battle return 19.145; case "battle_kalos_gym": //XY Kalos Gym Battle - return 44.810; + return 44.81; case "battle_galar_gym": //SWSH Galar Gym Battle return 171.262; case "battle_paldea_gym": //SV Paldea Gym Battle @@ -2175,13 +2729,13 @@ export default class BattleScene extends SceneBase { case "battle_legendary_suicune": //HGSS Suicune Battle return 12.636; case "battle_legendary_lugia": //HGSS Lugia Battle - return 19.770; + return 19.77; case "battle_legendary_ho_oh": //HGSS Ho-oh Battle return 17.668; case "battle_legendary_regis_g5": //B2W2 Legendary Titan Battle - return 49.500; + return 49.5; case "battle_legendary_regis_g6": //ORAS Legendary Titan Battle - return 21.130; + return 21.13; case "battle_legendary_gro_kyo": //ORAS Groudon & Kyogre Battle return 10.547; case "battle_legendary_rayquaza": //ORAS Rayquaza Battle @@ -2191,7 +2745,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_lake_trio": //ORAS Lake Guardians Battle return 16.887; case "battle_legendary_sinnoh": //ORAS Sinnoh Legendary Battle - return 22.770; + return 22.77; case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle return 16.009; case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle @@ -2209,7 +2763,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_xern_yvel": //XY Xerneas & Yveltal Battle return 26.468; case "battle_legendary_tapu": //SM Tapu Battle - return 0.000; + return 0.0; case "battle_legendary_sol_lun": //SM Solgaleo & Lunala Battle return 6.525; case "battle_legendary_ub": //SM Ultra Beast Battle @@ -2233,7 +2787,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_kor_mir": //SV Depths of Area Zero Battle return 6.442; case "battle_legendary_loyal_three": //SV Loyal Three Battle - return 6.500; + return 6.5; case "battle_legendary_ogerpon": //SV Ogerpon Battle return 14.335; case "battle_legendary_terapagos": //SV Terapagos Battle @@ -2241,7 +2795,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_pecharunt": //SV Pecharunt Battle return 6.508; case "battle_rival": //BW Rival Battle - return 14.110; + return 14.11; case "battle_rival_2": //BW N Battle return 17.714; case "battle_rival_3": //BW Final N Battle @@ -2251,7 +2805,7 @@ export default class BattleScene extends SceneBase { case "battle_wild": //BW Wild Battle return 12.703; case "battle_wild_strong": //BW Strong Wild Battle - return 13.940; + return 13.94; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; case "battle_rocket_grunt": //HGSS Team Rocket Battle @@ -2265,7 +2819,7 @@ export default class BattleScene extends SceneBase { case "battle_flare_grunt": //XY Team Flare Battle return 4.228; case "battle_aether_grunt": // SM Aether Foundation Battle - return 16.00; + return 16.0; case "battle_skull_grunt": // SM Team Skull Battle return 20.87; case "battle_macro_grunt": // SWSH Trainer Battle @@ -2279,7 +2833,7 @@ export default class BattleScene extends SceneBase { case "battle_skull_admin": //SM Team Skull Admin Battle return 15.463; case "battle_oleana": //SWSH Oleana Battle - return 14.110; + return 14.11; case "battle_star_admin": //SV Team Star Boss Battle return 9.493; case "battle_rocket_boss": //USUM Giovanni Battle @@ -2332,7 +2886,6 @@ export default class BattleScene extends SceneBase { return this.standbyPhase; } - /** * Adds a phase to the conditional queue and ensures it is executed only when the specified condition is met. * @@ -2364,7 +2917,11 @@ export default class BattleScene extends SceneBase { if (this.phaseQueuePrependSpliceIndex === -1) { this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); + this.phaseQueuePrepend.splice( + this.phaseQueuePrependSpliceIndex, + 0, + ...phases, + ); } } @@ -2437,7 +2994,10 @@ export default class BattleScene extends SceneBase { } if (this.currentPhase) { - console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;"); + console.log( + `%cStart Phase ${this.currentPhase.constructor.name}`, + "color:green;", + ); this.currentPhase.start(); } } @@ -2461,11 +3021,16 @@ export default class BattleScene extends SceneBase { * @param phaseFilter filter function to use to find the wanted phase * @returns the found phase or undefined if none found */ - findPhase

    (phaseFilter: (phase: P) => boolean): P | undefined { + findPhase

    ( + phaseFilter: (phase: P) => boolean, + ): P | undefined { return this.phaseQueue.find(phaseFilter) as P; } - tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { + tryReplacePhase( + phaseFilter: (phase: Phase) => boolean, + phase: Phase, + ): boolean { const phaseIndex = this.phaseQueue.findIndex(phaseFilter); if (phaseIndex > -1) { this.phaseQueue[phaseIndex] = phase; @@ -2502,11 +3067,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase | Phase [], targetPhase: Constructor): boolean { + prependToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1) { this.phaseQueue.splice(targetIndex, 0, ...phase); @@ -2523,11 +3093,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + appendToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { this.phaseQueue.splice(targetIndex + 1, 0, ...phase); @@ -2546,7 +3121,13 @@ export default class BattleScene extends SceneBase { * @param promptDelay optional param for MessagePhase constructor * @param defer boolean for which queue to add it to, false -> add to PhaseQueuePrepend, true -> nextCommandPhaseQueue */ - queueMessage(message: string, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null, defer?: boolean | null) { + queueMessage( + message: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + defer?: boolean | null, + ) { const phase = new MessagePhase(message, callbackDelay, prompt, promptDelay); if (!defer) { // adds to the end of PhaseQueuePrepend @@ -2578,98 +3159,126 @@ export default class BattleScene extends SceneBase { getWaveMoneyAmount(moneyMultiplier: number): number { const waveIndex = this.currentBattle.waveIndex; const waveSetIndex = Math.ceil(waveIndex / 10) - 1; - const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; + const moneyValue = + Math.pow( + (waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, + 1 + 0.005 * waveSetIndex, + ) * moneyMultiplier; return Math.floor(moneyValue / 10) * 10; } - addModifier(modifier: Modifier | null, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean, cost?: number): Promise { + addModifier( + modifier: Modifier | null, + ignoreUpdate?: boolean, + playSound?: boolean, + virtual?: boolean, + instant?: boolean, + cost?: number, + ): boolean { if (!modifier) { - return Promise.resolve(false); + return false; } - return new Promise(resolve => { - let success = false; - const soundName = modifier.type.soundName; - this.validateAchvs(ModifierAchv, modifier); - const modifiersToRemove: PersistentModifier[] = []; - const modifierPromises: Promise[] = []; - if (modifier instanceof PersistentModifier) { - if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { - if (modifier instanceof PokemonFormChangeItemModifier) { - const pokemon = this.getPokemonById(modifier.pokemonId); - if (pokemon) { - success = modifier.apply(pokemon, true); - } + let success = false; + const soundName = modifier.type.soundName; + this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof PersistentModifier) { + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { + if (modifier instanceof PokemonFormChangeItemModifier) { + const pokemon = this.getPokemonById(modifier.pokemonId); + if (pokemon) { + success = modifier.apply(pokemon, true); } - if (playSound && !this.sound.get(soundName)) { - this.playSound(soundName); - } - } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, false, 3000); - return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } - - for (const rm of modifiersToRemove) { - this.removeModifier(rm); - } - - if (!ignoreUpdate && !virtual) { - return this.updateModifiers(true, instant).then(() => resolve(success)); - } - } else if (modifier instanceof ConsumableModifier) { if (playSound && !this.sound.get(soundName)) { this.playSound(soundName); } - - if (modifier instanceof ConsumablePokemonModifier) { - for (const p in this.party) { - const pokemon = this.party[p]; - - const args: unknown[] = []; - if (modifier instanceof PokemonHpRestoreModifier) { - if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.NumberHolder(1); - this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); - args.push(hpRestoreMultiplier.value); - } else { - args.push(1); - } - } else if (modifier instanceof FusePokemonModifier) { - args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); - } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { - args.push(cost); - } - - if (modifier.shouldApply(pokemon, ...args)) { - const result = modifier.apply(pokemon, ...args); - if (result instanceof Promise) { - modifierPromises.push(result.then(s => success ||= s)); - } else { - success ||= result; - } - } - } - - return Promise.allSettled([ this.party.map(p => p.updateInfo(instant)), ...modifierPromises ]).then(() => resolve(success)); - } else { - const args = [ this ]; - if (modifier.shouldApply(...args)) { - const result = modifier.apply(...args); - if (result instanceof Promise) { - return result.then(success => resolve(success)); - } else { - success ||= result; - } - } - } + } else if (!virtual) { + const defaultModifierType = getDefaultModifierTypeForTier( + modifier.type.tier, + ); + this.queueMessage( + i18next.t("battle:itemStackFull", { + fullItemName: modifier.type.name, + itemName: defaultModifierType.name, + }), + undefined, + false, + 3000, + ); + return this.addModifier( + defaultModifierType.newModifier(), + ignoreUpdate, + playSound, + false, + instant, + ); } - resolve(success); - }); + for (const rm of modifiersToRemove) { + this.removeModifier(rm); + } + + if (!ignoreUpdate && !virtual) { + this.updateModifiers(true, instant); + } + } else if (modifier instanceof ConsumableModifier) { + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + + if (modifier instanceof ConsumablePokemonModifier) { + for (const p in this.party) { + const pokemon = this.party[p]; + + const args: unknown[] = []; + if (modifier instanceof PokemonHpRestoreModifier) { + if (!(modifier as PokemonHpRestoreModifier).fainted) { + const hpRestoreMultiplier = new Utils.NumberHolder(1); + this.applyModifiers( + HealingBoosterModifier, + true, + hpRestoreMultiplier, + ); + args.push(hpRestoreMultiplier.value); + } else { + args.push(1); + } + } else if (modifier instanceof FusePokemonModifier) { + args.push( + this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon, + ); + } else if ( + modifier instanceof RememberMoveModifier && + !Utils.isNullOrUndefined(cost) + ) { + args.push(cost); + } + + if (modifier.shouldApply(pokemon, ...args)) { + const result = modifier.apply(pokemon, ...args); + success ||= result; + } + } + + this.party.map((p) => p.updateInfo(instant)); + } else { + const args = [ this ]; + if (modifier.shouldApply(...args)) { + const result = modifier.apply(...args); + success ||= result; + } + } + } + return success; } - addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { - return new Promise(resolve => { + addEnemyModifier( + modifier: PersistentModifier, + ignoreUpdate?: boolean, + instant?: boolean, + ): Promise { + return new Promise((resolve) => { const modifiersToRemove: PersistentModifier[] = []; if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { if (modifier instanceof PokemonFormChangeItemModifier) { @@ -2683,7 +3292,8 @@ export default class BattleScene extends SceneBase { } } if (!ignoreUpdate) { - this.updateModifiers(false, instant).then(() => resolve()); + this.updateModifiers(false, instant); + resolve(); } else { resolve(); } @@ -2704,86 +3314,128 @@ export default class BattleScene extends SceneBase { * @param itemLost If `true`, treat the item's current holder as losing the item (for now, this simply enables Unburden). Default is `true`. * @returns `true` if the transfer was successful */ - tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, playSound: boolean, transferQuantity: number = 1, instant?: boolean, ignoreUpdate?: boolean, itemLost: boolean = true): Promise { - return new Promise(resolve => { - const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; - const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(!!source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source! /* checked in condition*/, cancelled)).then(() => { - if (cancelled.value) { - return resolve(false); - } - const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; - newItemModifier.pokemonId = target.id; - const matchingModifier = this.findModifier(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier; - let removeOld = true; - if (matchingModifier) { - const maxStackCount = matchingModifier.getMaxStackCount(); - if (matchingModifier.stackCount >= maxStackCount) { - return resolve(false); - } - const countTaken = Math.min(transferQuantity, itemModifier.stackCount, maxStackCount - matchingModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = matchingModifier.stackCount + countTaken; - removeOld = !itemModifier.stackCount; - } else { - const countTaken = Math.min(transferQuantity, itemModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = countTaken; - } - removeOld = !itemModifier.stackCount; - if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { - const addModifier = () => { - if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { - if (target.isPlayer()) { - this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } else { - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } - } else { - resolve(false); + tryTransferHeldItemModifier( + itemModifier: PokemonHeldItemModifier, + target: Pokemon, + playSound: boolean, + transferQuantity: number = 1, + instant?: boolean, + ignoreUpdate?: boolean, + itemLost: boolean = true, + ): boolean { + const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; + newItemModifier.pokemonId = target.id; + const matchingModifier = this.findModifier( + (m) => + m instanceof PokemonHeldItemModifier && + m.matchType(itemModifier) && + m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min( + transferQuantity, + itemModifier.stackCount, + maxStackCount - matchingModifier.stackCount, + ); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = matchingModifier.stackCount + countTaken; + } else { + const countTaken = Math.min(transferQuantity, itemModifier.stackCount); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = countTaken; + } + + const removeOld = itemModifier.stackCount === 0; + + if ( + !removeOld || + !source || + this.removeModifier(itemModifier, !source.isPlayer()) + ) { + const addModifier = () => { + if ( + !matchingModifier || + this.removeModifier(matchingModifier, !target.isPlayer()) + ) { + if (target.isPlayer()) { + this.addModifier( + newItemModifier, + ignoreUpdate, + playSound, + false, + instant, + ); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); } - }; - if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { - this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); + return true; } else { - addModifier(); + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); + } + return true; } - return; } - resolve(false); - }); - }); + return false; + }; + if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { + this.updateModifiers(source.isPlayer(), instant); + addModifier(); + } else { + addModifier(); + } + return true; + } + return false; } removePartyMemberModifiers(partyMemberIndex: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { const pokemonId = this.getPlayerParty()[partyMemberIndex].id; - const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); + const modifiersToRemove = this.modifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).pokemonId === pokemonId, + ); for (const m of modifiersToRemove) { this.modifiers.splice(this.modifiers.indexOf(m), 1); } - this.updateModifiers().then(() => resolve()); + this.updateModifiers(); + resolve(); }); } - generateEnemyModifiers(heldModifiersConfigs?: HeldModifierConfig[][]): Promise { - return new Promise(resolve => { + generateEnemyModifiers( + heldModifiersConfigs?: HeldModifierConfig[][], + ): Promise { + return new Promise((resolve) => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); } - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); - const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty( + this.currentBattle.waveIndex, + ); + const isFinalBoss = this.gameMode.isWaveFinal( + this.currentBattle.waveIndex, + ); let chances = Math.ceil(difficultyWaveIndex / 10); if (isFinalBoss) { chances = Math.ceil(chances * 2.5); @@ -2801,8 +3453,12 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { - if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i]) { - heldModifiersConfigs[i].forEach(mt => { + if ( + heldModifiersConfigs && + i < heldModifiersConfigs.length && + heldModifiersConfigs[i] + ) { + heldModifiersConfigs[i].forEach((mt) => { let modifier: PokemonHeldItemModifier; if (mt.modifier instanceof PokemonHeldItemModifierType) { modifier = mt.modifier.newModifier(enemyPokemon); @@ -2811,11 +3467,15 @@ export default class BattleScene extends SceneBase { modifier.pokemonId = enemyPokemon.id; } modifier.stackCount = mt.stackCount ?? 1; - modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable; + modifier.isTransferable = + mt.isTransferable ?? modifier.isTransferable; this.addEnemyModifier(modifier, true); }); } else { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); + const isBoss = + enemyPokemon.isBoss() || + (this.currentBattle.battleType === BattleType.TRAINER && + !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -2823,96 +3483,115 @@ export default class BattleScene extends SceneBase { if (isFinalBoss) { upgradeChance /= 8; } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line let count = 0; for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { + if (!Utils.randSeedInt(this.gameMode.getEnemyModifierChance(isBoss))) { count++; } } if (isBoss) { count = Math.max(count, Math.floor(chances / 2)); } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false)); + getEnemyModifierTypesForWave( + difficultyWaveIndex, + count, + [ enemyPokemon ], + this.currentBattle.battleType === BattleType.TRAINER + ? ModifierPoolType.TRAINER + : ModifierPoolType.WILD, + upgradeChance, + ).map((mt) => + mt.newModifier(enemyPokemon).add(this.enemyModifiers, false), + ); } return true; }); - this.updateModifiers(false).then(() => resolve()); + this.updateModifiers(false); + resolve(); }); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type - */ + * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type + */ clearEnemyModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => m instanceof PersistentModifier, + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type - * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} - */ + * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type + * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} + */ clearEnemyHeldItemModifiers(pokemon?: Pokemon): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon() === pokemon)); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (!pokemon || m.getPokemon() === pokemon), + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); + [ this.modifierBar, this.enemyModifierBar ].map((m) => m.setVisible(visible)); } - updateModifiers(player?: boolean, instant?: boolean): Promise { - if (player === undefined) { - player = true; + updateModifiers(player: boolean = true, instant?: boolean): void { + const modifiers = player + ? this.modifiers + : (this.enemyModifiers as PersistentModifier[]); + for (let m = 0; m < modifiers.length; m++) { + const modifier = modifiers[m]; + if ( + modifier instanceof PokemonHeldItemModifier && + !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId) + ) { + modifiers.splice(m--, 1); + } } - return new Promise(resolve => { - const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; - for (let m = 0; m < modifiers.length; m++) { - const modifier = modifiers[m]; - if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) { - modifiers.splice(m--, 1); - } - } - for (const modifier of modifiers) { - if (modifier instanceof PersistentModifier) { - (modifier as PersistentModifier).virtualStackCount = 0; - } + for (const modifier of modifiers) { + if (modifier instanceof PersistentModifier) { + (modifier as PersistentModifier).virtualStackCount = 0; } + } - const modifiersClone = modifiers.slice(0); - for (const modifier of modifiersClone) { - if (!modifier.getStackCount()) { - modifiers.splice(modifiers.indexOf(modifier), 1); - } + const modifiersClone = modifiers.slice(0); + for (const modifier of modifiersClone) { + if (!modifier.getStackCount()) { + modifiers.splice(modifiers.indexOf(modifier), 1); } + } - this.updatePartyForModifiers(player ? this.getPlayerParty() : this.getEnemyParty(), instant).then(() => { - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); - if (!player) { - this.updateUIPositions(); - } - resolve(); - }); - }); + this.updatePartyForModifiers( + player ? this.getPlayerParty() : this.getEnemyParty(), + instant, + ); + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers( + modifiers, + ); + if (!player) { + this.updateUIPositions(); + } } updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { - return new Promise(resolve => { - Promise.allSettled(party.map(p => { - p.calculateStats(); - return p.updateInfo(instant); - })).then(() => resolve()); + return new Promise((resolve) => { + Promise.allSettled( + party.map((p) => { + p.calculateStats(); + return p.updateInfo(instant); + }), + ).then(() => resolve()); }); } @@ -2924,7 +3603,10 @@ export default class BattleScene extends SceneBase { * @param enemy If `true`, remove an item owned by the enemy. If `false`, remove an item owned by the player. Default is `false`. * @returns `true` if the item exists and was successfully removed, `false` otherwise. */ - removeModifier(modifier: PersistentModifier, enemy: boolean = false): boolean { + removeModifier( + modifier: PersistentModifier, + enemy: boolean = false, + ): boolean { const modifiers = !enemy ? this.modifiers : this.enemyModifiers; const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { @@ -2947,8 +3629,13 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that matched `modifierType`. */ - getModifiers(modifierType: Constructor, player: boolean = true): T[] { - return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); + getModifiers( + modifierType: Constructor, + player: boolean = true, + ): T[] { + return (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType, + ); } /** @@ -2957,8 +3644,13 @@ export default class BattleScene extends SceneBase { * @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that passed the `modifierFilter` function */ - findModifiers(modifierFilter: ModifierPredicate, isPlayer: boolean = true): PersistentModifier[] { - return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter); + findModifiers( + modifierFilter: ModifierPredicate, + isPlayer: boolean = true, + ): PersistentModifier[] { + return (isPlayer ? this.modifiers : this.enemyModifiers).filter( + modifierFilter, + ); } /** @@ -2967,7 +3659,10 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed */ - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined { + findModifier( + modifierFilter: ModifierPredicate, + player: boolean = true, + ): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter); } @@ -2978,18 +3673,31 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyShuffledModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - let modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); - this.executeWithSeedOffset(() => { - const shuffleModifiers = mods => { - if (mods.length < 1) { - return mods; - } - const rand = Utils.randSeedInt(mods.length); - return [ mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand)) ]; - }; - modifiers = shuffleModifiers(modifiers); - }, this.currentBattle.turn << 4, this.waveSeed); + applyShuffledModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + let modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); + this.executeWithSeedOffset( + () => { + const shuffleModifiers = (mods) => { + if (mods.length < 1) { + return mods; + } + const rand = Utils.randSeedInt(mods.length); + return [ + mods[rand], + ...shuffleModifiers(mods.filter((_, i) => i !== rand)), + ]; + }; + modifiers = shuffleModifiers(modifiers); + }, + this.currentBattle.turn << 4, + this.waveSeed, + ); return this.applyModifiersInternal(modifiers, player, args); } @@ -3000,13 +3708,23 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); return this.applyModifiersInternal(modifiers, player, args); } /** Helper function to apply all passed modifiers */ - applyModifiersInternal(modifiers: T[], player: boolean, args: Parameters): T[] { + applyModifiersInternal( + modifiers: T[], + player: boolean, + args: Parameters, + ): T[] { const appliedModifiers: T[] = []; for (const modifier of modifiers) { if (modifier.apply(...args)) { @@ -3025,8 +3743,14 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the first modifier that matches `modifierType` and was applied; return `null` if none matched */ - applyModifier(modifierType: Constructor, player: boolean = true, ...args: Parameters): T | null { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifier( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T | null { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); for (const modifier of modifiers) { if (modifier.apply(...args)) { console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); @@ -3037,22 +3761,42 @@ export default class BattleScene extends SceneBase { return null; } - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, delayed: boolean = false, modal: boolean = false): boolean { + triggerPokemonFormChange( + pokemon: Pokemon, + formChangeTriggerType: Constructor, + delayed: boolean = false, + modal: boolean = false, + ): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - // in case this is NECROZMA, determine which forms this - const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + const matchingFormChangeOpts = pokemonFormChanges[ + pokemon.species.speciesId + ].filter( + (fc) => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), + ); let matchingFormChange: SpeciesFormChange | null; - if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { + if ( + pokemon.species.speciesId === Species.NECROZMA && + matchingFormChangeOpts.length > 1 + ) { // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. - const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem); + const formChangeItemModifiers = ( + this.findModifiers( + (m) => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[] + ) + .filter((m) => m.active) + .map((m) => m.formChangeItem); - - matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? - matchingFormChangeOpts[0] : - formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? - matchingFormChangeOpts[1] : - null; + matchingFormChange = formChangeItemModifiers.includes( + FormChangeItem.N_LUNARIZER, + ) + ? matchingFormChangeOpts[0] + : formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) + ? matchingFormChangeOpts[1] + : null; } else { matchingFormChange = matchingFormChangeOpts[0]; } @@ -3063,7 +3807,11 @@ export default class BattleScene extends SceneBase { } else { phase = new QuietFormChangePhase(pokemon, matchingFormChange); } - if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { + if ( + pokemon instanceof PlayerPokemon && + !matchingFormChange.quiet && + modal + ) { this.overridePhase(phase); } else if (delayed) { this.pushPhase(phase); @@ -3077,8 +3825,17 @@ export default class BattleScene extends SceneBase { return false; } - triggerPokemonBattleAnim(pokemon: Pokemon, battleAnimType: PokemonAnimType, fieldAssets?: Phaser.GameObjects.Sprite[], delayed: boolean = false): boolean { - const phase: Phase = new PokemonAnimPhase(battleAnimType, pokemon, fieldAssets); + triggerPokemonBattleAnim( + pokemon: Pokemon, + battleAnimType: PokemonAnimType, + fieldAssets?: Phaser.GameObjects.Sprite[], + delayed: boolean = false, + ): boolean { + const phase: Phase = new PokemonAnimPhase( + battleAnimType, + pokemon, + fieldAssets, + ); if (delayed) { this.pushPhase(phase); } else { @@ -3088,15 +3845,20 @@ export default class BattleScene extends SceneBase { } validateAchvs(achvType: Constructor, ...args: unknown[]): void { - const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); + const filteredAchvs = Object.values(achvs).filter( + (a) => a instanceof achvType, + ); for (const achv of filteredAchvs) { this.validateAchv(achv, args); } } validateAchv(achv: Achv, args?: unknown[]): boolean { - if ((!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) - && achv.validate(args)) { + if ( + (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || + Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && + achv.validate(args) + ) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { @@ -3109,7 +3871,10 @@ export default class BattleScene extends SceneBase { } validateVoucher(voucher: Voucher, args?: unknown[]): boolean { - if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { + if ( + !this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && + voucher.validate(args) + ) { this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; @@ -3125,19 +3890,21 @@ export default class BattleScene extends SceneBase { gameMode: this.currentBattle ? this.gameMode.getName() : "Title", biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", wave: this.currentBattle?.waveIndex ?? 0, - party: this.party ? this.party.map((p) => { - return { - name: p.name, - form: p.getFormKey(), - types: p.getTypes().map((type) => Type[type]), - teraType: Type[p.getTeraType()], - isTerastallized: p.isTerastallized, - level: p.level, - currentHP: p.hp, - maxHP: p.getMaxHp(), - status: p.status?.effect ? StatusEffect[p.status.effect] : "" - }; - }) : [], + party: this.party + ? this.party.map((p) => { + return { + name: p.name, + form: p.getFormKey(), + types: p.getTypes().map((type) => Type[type]), + teraType: Type[p.getTeraType()], + isTerastallized: p.isTerastallized, + level: p.level, + currentHP: p.hp, + maxHP: p.getMaxHp(), + status: p.status?.effect ? StatusEffect[p.status.effect] : "", + }; + }) + : [], modeChain: this.ui?.getModeChain() ?? [], }; (window as any).gameInfo = gameInfo; @@ -3171,26 +3938,44 @@ export default class BattleScene extends SceneBase { * @param pokemon The (enemy) pokemon */ initFinalBossPhaseTwo(pokemon: Pokemon): void { - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { + if ( + pokemon instanceof EnemyPokemon && + pokemon.isBoss() && + !pokemon.formIndex && + pokemon.bossSegmentIndex < 1 + ) { this.fadeOutBgm(Utils.fixedInt(2000), false); - this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { - const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier; - finalBossMBH.setTransferrableFalse(); - this.addEnemyModifier(finalBossMBH, false, true); - pokemon.generateAndPopulateMoveset(1); - this.setFieldScale(0.75); - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.currentBattle.double = true; - const availablePartyMembers = this.getPlayerParty().filter((p) => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.pushPhase(new ToggleDoublePositionPhase(true)); - if (!availablePartyMembers[1].isOnField()) { - this.pushPhase(new SummonPhase(1)); + this.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, + pokemon.species.name, + undefined, + () => { + const finalBossMBH = getModifierType( + modifierTypes.MINI_BLACK_HOLE, + ).newModifier(pokemon) as TurnHeldItemTransferModifier; + finalBossMBH.setTransferrableFalse(); + this.addEnemyModifier(finalBossMBH, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange( + pokemon, + SpeciesFormChangeManualTrigger, + false, + ); + this.currentBattle.double = true; + const availablePartyMembers = this.getPlayerParty().filter((p) => + p.isAllowedInBattle(), + ); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(1)); + } } - } - this.shiftPhase(); - }); + this.shiftPhase(); + }, + ); return; } @@ -3204,33 +3989,62 @@ export default class BattleScene extends SceneBase { * @param useWaveIndexMultiplier Default false. If true, will multiply expValue by a scaling waveIndex multiplier. Not needed if expValue is already scaled by level/wave * @param pokemonParticipantIds Participants. If none are defined, no exp will be given. To spread evenly among the party, should pass all ids of party members. */ - applyPartyExp(expValue: number, pokemonDefeated: boolean, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set): void { - const participantIds = pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; + applyPartyExp( + expValue: number, + pokemonDefeated: boolean, + useWaveIndexMultiplier?: boolean, + pokemonParticipantIds?: Set, + ): void { + const participantIds = + pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; const party = this.getPlayerParty(); - const expShareModifier = this.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; - const expBalanceModifier = this.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const multipleParticipantExpBonusModifier = this.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; - const nonFaintedPartyMembers = party.filter(p => p.hp); - const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.getMaxExpLevel()); + const expShareModifier = this.findModifier( + (m) => m instanceof ExpShareModifier, + ) as ExpShareModifier; + const expBalanceModifier = this.findModifier( + (m) => m instanceof ExpBalanceModifier, + ) as ExpBalanceModifier; + const multipleParticipantExpBonusModifier = this.findModifier( + (m) => m instanceof MultipleParticipantExpBonusModifier, + ) as MultipleParticipantExpBonusModifier; + const nonFaintedPartyMembers = party.filter((p) => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter( + (p) => p.level < this.getMaxExpLevel(), + ); const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue if (useWaveIndexMultiplier) { - expValue = Math.floor(expValue * this.currentBattle.waveIndex / 5 + 1); + expValue = Math.floor((expValue * this.currentBattle.waveIndex) / 5 + 1); } if (participantIds.size > 0) { - if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + if ( + this.currentBattle.battleType === BattleType.TRAINER || + this.currentBattle.mysteryEncounter?.encounterMode === + MysteryEncounterMode.TRAINER_BATTLE + ) { expValue = Math.floor(expValue * 1.5); - } else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) { - expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier); + } else if ( + this.currentBattle.isBattleMysteryEncounter() && + this.currentBattle.mysteryEncounter + ) { + expValue = Math.floor( + expValue * this.currentBattle.mysteryEncounter.expMultiplier, + ); } for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; const participated = participantIds.has(pId); if (participated && pokemonDefeated) { partyMember.addFriendship(FRIENDSHIP_GAIN_FROM_BATTLE); - const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); - if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount()) { + const machoBraceModifier = partyMember + .getHeldItems() + .find((m) => m instanceof PokemonIncrementingStatModifier); + if ( + machoBraceModifier && + machoBraceModifier.stackCount < + machoBraceModifier.getMaxStackCount() + ) { machoBraceModifier.stackCount++; this.updateModifiers(true, true); partyMember.updateInfo(); @@ -3245,12 +4059,14 @@ export default class BattleScene extends SceneBase { } let expMultiplier = 0; if (participated) { - expMultiplier += (1 / participantIds.size); + expMultiplier += 1 / participantIds.size; if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { - expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; + expMultiplier += + multipleParticipantExpBonusModifier.getStackCount() * 0.2; } } else if (expShareModifier) { - expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; + expMultiplier += + (expShareModifier.getStackCount() * 0.2) / participantIds.size; } if (partyMember.pokerus) { expMultiplier *= 1.5; @@ -3259,7 +4075,12 @@ export default class BattleScene extends SceneBase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + this.applyModifiers( + PokemonExpBoosterModifier, + true, + partyMember, + pokemonExp, + ); partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -3280,10 +4101,16 @@ export default class BattleScene extends SceneBase { } }); - const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + const splitExp = Math.floor( + totalExp / recipientExpPartyMemberIndexes.length, + ); expPartyMembers.forEach((_partyMember, pm) => { - partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + partyMemberExp[pm] = Phaser.Math.Linear( + partyMemberExp[pm], + recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, + 0.2 * expBalanceModifier.getStackCount(), + ); }); } @@ -3292,7 +4119,11 @@ export default class BattleScene extends SceneBase { if (exp) { const partyMemberIndex = party.indexOf(expPartyMembers[pm]); - this.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(partyMemberIndex, exp) : new ShowPartyExpBarPhase(partyMemberIndex, exp)); + this.unshiftPhase( + expPartyMembers[pm].isOnField() + ? new ExpPhase(partyMemberIndex, exp) + : new ShowPartyExpBarPhase(partyMemberIndex, exp), + ); } } } @@ -3303,9 +4134,19 @@ export default class BattleScene extends SceneBase { * Even if returns `true`, does not guarantee that a wave will actually be a ME. * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. */ - isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); - return this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave; + isMysteryEncounterValidForWave( + battleType: BattleType, + waveIndex: number, + ): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = + this.gameMode.getMysteryEncounterLegalWaves(); + return ( + this.gameMode.hasMysteryEncounters && + battleType === BattleType.WILD && + !this.gameMode.isBoss(waveIndex) && + waveIndex < highestMysteryEncounterWave && + waveIndex > lowestMysteryEncounterWave + ); } /** @@ -3315,31 +4156,56 @@ export default class BattleScene extends SceneBase { * @param newBattleType * @param waveIndex */ - private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + private isWaveMysteryEncounter( + newBattleType: BattleType, + waveIndex: number, + ): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = + this.gameMode.getMysteryEncounterLegalWaves(); if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor - const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; + const sessionEncounterRate = + this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well) // Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET // Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256 - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave); - const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length; - const favoredEncounterRate = sessionEncounterRate + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); + const expectedEncountersByFloor = + (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / + (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * + (waveIndex - lowestMysteryEncounterWave); + const currentRunDiffFromAvg = + expectedEncountersByFloor - encounteredEvents.length; + const favoredEncounterRate = + sessionEncounterRate + + Math.min( + currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, + MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2, + ); - const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; + const successRate = isNullOrUndefined( + Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE, + ) + ? favoredEncounterRate + : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = encounteredEvents.length === 0 || (waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex) > 3 || !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); + const canSpawn = + encounteredEvents.length === 0 || + waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > + 3 || + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); if (canSpawn) { let roll = MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT; // Always rolls the check on the same offset to ensure no RNG changes from reloading session - this.executeWithSeedOffset(() => { - roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); - }, waveIndex * 3 * 1000); + this.executeWithSeedOffset( + () => { + roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); + }, + waveIndex * 3 * 1000, + ); return roll < successRate; } } @@ -3353,10 +4219,16 @@ export default class BattleScene extends SceneBase { * @param canBypass optional boolean to indicate that the request is coming from a function that needs to access a Mystery Encounter outside of gameplay requirements * @returns */ - getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter { + getMysteryEncounter( + encounterType?: MysteryEncounterType, + canBypass?: boolean, + ): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter | null; - if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + if ( + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && + allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) + ) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; if (canBypass) { return encounter; @@ -3365,13 +4237,22 @@ export default class BattleScene extends SceneBase { encounter = allMysteryEncounters[encounterType ?? -1]; return encounter; } else { - encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null; + encounter = !isNullOrUndefined(encounterType) + ? allMysteryEncounters[encounterType] + : null; } // Check for queued encounters first - if (!encounter && this.mysteryEncounterSaveData?.queuedEncounters && this.mysteryEncounterSaveData.queuedEncounters.length > 0) { + if ( + !encounter && + this.mysteryEncounterSaveData?.queuedEncounters && + this.mysteryEncounterSaveData.queuedEncounters.length > 0 + ) { let i = 0; - while (i < this.mysteryEncounterSaveData.queuedEncounters.length && !!encounter) { + while ( + i < this.mysteryEncounterSaveData.queuedEncounters.length && + !!encounter + ) { const candidate = this.mysteryEncounterSaveData.queuedEncounters[i]; const forcedChance = candidate.spawnPercent; if (Utils.randSeedInt(100) < forcedChance) { @@ -3389,34 +4270,56 @@ export default class BattleScene extends SceneBase { } // See Enum values for base tier weights - const tierWeights = [ MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE ]; + const tierWeights = [ + MysteryEncounterTier.COMMON, + MysteryEncounterTier.GREAT, + MysteryEncounterTier.ULTRA, + MysteryEncounterTier.ROGUE, + ]; // Adjust tier weights by previously encountered events to lower odds of only Common/Great in run - this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => { - if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { - tierWeights[0] = tierWeights[0] - 6; - } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { - tierWeights[1] = tierWeights[1] - 4; - } - }); + this.mysteryEncounterSaveData.encounteredEvents.forEach( + (seenEncounterData) => { + if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { + tierWeights[0] = tierWeights[0] - 6; + } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { + tierWeights[1] = tierWeights[1] - 4; + } + }, + ); const totalWeight = tierWeights.reduce((a, b) => a + b); const tierValue = Utils.randSeedInt(totalWeight); const commonThreshold = totalWeight - tierWeights[0]; const greatThreshold = totalWeight - tierWeights[0] - tierWeights[1]; - const ultraThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; - let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE; + const ultraThreshold = + totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; + let tier: MysteryEncounterTier | null = + tierValue > commonThreshold + ? MysteryEncounterTier.COMMON + : tierValue > greatThreshold + ? MysteryEncounterTier.GREAT + : tierValue > ultraThreshold + ? MysteryEncounterTier.ULTRA + : MysteryEncounterTier.ROGUE; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } let availableEncounters: MysteryEncounter[] = []; - const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.length > 0 ? - this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1].type - : null; - const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); - const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; + const previousEncounter = + this.mysteryEncounterSaveData.encounteredEvents.length > 0 + ? this.mysteryEncounterSaveData.encounteredEvents[ + this.mysteryEncounterSaveData.encounteredEvents.length - 1 + ].type + : null; + const disabledEncounters = + this.eventManager.getEventMysteryEncountersDisabled(); + const biomeMysteryEncounters = + mysteryEncountersByBiome + .get(this.arena.biomeType) + ?.filter((enc) => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters @@ -3425,34 +4328,57 @@ export default class BattleScene extends SceneBase { if (!encounterCandidate) { return false; } - if (this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier) { + if ( + this.eventManager.getMysteryEncounterTierForEvent( + encounterType, + encounterCandidate.encounterTier, + ) !== tier + ) { return false; } const disallowedGameModes = encounterCandidate.disallowedGameModes; - if (disallowedGameModes && disallowedGameModes.length > 0 - && disallowedGameModes.includes(this.gameMode.modeId)) { + if ( + disallowedGameModes && + disallowedGameModes.length > 0 && + disallowedGameModes.includes(this.gameMode.modeId) + ) { return false; } if (this.gameMode.modeId === GameModes.CHALLENGE) { - const disallowedChallenges = encounterCandidate.disallowedChallenges; - if (disallowedChallenges && disallowedChallenges.length > 0 && this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id))) { + const disallowedChallenges = + encounterCandidate.disallowedChallenges; + if ( + disallowedChallenges && + disallowedChallenges.length > 0 && + this.gameMode.challenges.some((challenge) => + disallowedChallenges.includes(challenge.id), + ) + ) { return false; } } if (!encounterCandidate.meetsRequirements()) { return false; } - if (previousEncounter !== null && encounterType === previousEncounter) { + if ( + previousEncounter !== null && + encounterType === previousEncounter + ) { return false; } - if (this.mysteryEncounterSaveData.encounteredEvents.length > 0 && - (encounterCandidate.maxAllowedEncounters && encounterCandidate.maxAllowedEncounters > 0) - && this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= encounterCandidate.maxAllowedEncounters) { + if ( + this.mysteryEncounterSaveData.encounteredEvents.length > 0 && + encounterCandidate.maxAllowedEncounters && + encounterCandidate.maxAllowedEncounters > 0 && + this.mysteryEncounterSaveData.encounteredEvents.filter( + (e) => e.type === encounterType, + ).length >= encounterCandidate.maxAllowedEncounters + ) { return false; } return true; }) - .map((m) => (allMysteryEncounters[m])); + .map((m) => allMysteryEncounters[m]); // Decrement tier if (tier === MysteryEncounterTier.ROGUE) { tier = MysteryEncounterTier.ULTRA; @@ -3467,10 +4393,13 @@ export default class BattleScene extends SceneBase { // If absolutely no encounters are available, spawn 0th encounter if (availableEncounters.length === 0) { - console.log("No Mystery Encounters found, falling back to Mysterious Challengers."); + console.log( + "No Mystery Encounters found, falling back to Mysterious Challengers.", + ); return allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS]; } - encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; + encounter = + availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(); diff --git a/src/data/ability.ts b/src/data/ability.ts index 95601dc2010..65da3753cde 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,6 +1,6 @@ -import type { EnemyPokemon } from "../field/pokemon"; +import type { EnemyPokemon, PokemonMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; -import { HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import { HitResult, MoveResult, PlayerPokemon } from "../field/pokemon"; import { Type } from "#enums/type"; import type { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -44,6 +44,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; export class Ability implements Localizable { public id: Abilities; @@ -143,7 +144,7 @@ export class Ability implements Localizable { } } -type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean | Promise; +type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean; type AbAttrCondition = (pokemon: Pokemon) => boolean; // TODO: Can this be improved? @@ -159,7 +160,7 @@ export abstract class AbAttr { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { return false; } @@ -215,7 +216,7 @@ export class DoubleBattleChanceAbAttr extends AbAttr { } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -250,7 +251,7 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { @@ -268,7 +269,15 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { return false; } } @@ -546,7 +555,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { * @param args `[0]` a container for the move's current type effectiveness multiplier * @returns `true` if the move's effectiveness is reduced; `false` otherwise */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + override applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { const typeMultiplier = args[0]; if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) { return false; @@ -572,7 +589,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { } export class PostDefendAbAttr extends AbAttr { - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -593,7 +618,14 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { } export class PostStatStageChangeAbAttr extends AbAttr { - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean | Promise { + applyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: integer, + selfTarget: boolean, + args: any[], + ): boolean { return false; } } @@ -1142,7 +1174,14 @@ export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChang } export class PreAttackAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean | Promise { + applyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[], + ): boolean { return false; } } @@ -1208,7 +1247,13 @@ export class VariableMovePowerAbAttr extends PreAttackAbAttr { } export class FieldPreventExplosiveMovesAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { cancelled.value = true; return true; } @@ -1562,8 +1607,15 @@ export class StatMultiplierAbAttr extends AbAttr { this.condition = condition ?? null; } - applyStatStage(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { - const move = (args[0] as Move); + applyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[], + ): boolean { + const move = args[0] as Move; if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) { statValue.value *= this.multiplier; return true; @@ -1588,7 +1640,15 @@ export class PostAttackAbAttr extends AbAttr { * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} * for an example of an effect that does not require a damaging move. */ - applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. // If attackRequired is false, we always defer to the secondary requirements. if (this.attackCondition(pokemon, defender, move)) { @@ -1601,7 +1661,15 @@ export class PostAttackAbAttr extends AbAttr { /** * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -1626,7 +1694,15 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { * @param args n/a * @returns `true` if the ability is applied */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { if (simulated) { return simulated; } @@ -1649,23 +1725,36 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { this.stealCondition = stealCondition ?? null; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.stealCondition || this.stealCondition(pokemon, defender, move)) + ) { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postAttackStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + defenderName: defender.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1742,23 +1831,37 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move)) && !move.hitsSubstitute(attacker, pokemon)) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostDefend( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult, + _args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.condition || this.condition(pokemon, attacker, move)) && + !move.hitsSubstitute(attacker, pokemon) + ) { + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postDefendStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + attackerName: attacker.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1781,7 +1884,14 @@ export class PostSetStatusAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute. * @returns `true` if application of the ability succeeds. */ - applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]) : boolean | Promise { + applyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -1823,7 +1933,7 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -1839,10 +1949,8 @@ class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { this.stages = stages; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1859,7 +1967,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -1873,7 +1981,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { return false; } } @@ -1889,10 +1997,8 @@ export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { this.stages = stages; } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1905,7 +2011,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { if (!simulated) { globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); @@ -2015,7 +2121,7 @@ export class PostSummonAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2035,7 +2141,7 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!simulated) { for (const arenaTag of this.arenaTags) { globalScene.arena.removeTag(arenaTag); @@ -2383,9 +2489,9 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt * @param pokemon - The Pokémon that triggered the ability. * @param passive - n/a * @param args - n/a - * @returns A boolean or a promise that resolves to a boolean indicating the result of the ability application. + * @returns A boolean that resolves to a boolean indicating the result of the ability application. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); const allowedParty = party.filter(p => p.isAllowedInBattle()); @@ -2445,12 +2551,11 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true, false); } - async applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): Promise { + override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): boolean { const targets = pokemon.getOpponents(); if (simulated || !targets.length) { return simulated; } - const promises: Promise[] = []; let target: Pokemon; if (targets.length > 1) { @@ -2476,41 +2581,14 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { return false; } - pokemon.summonData.speciesForm = target.getSpeciesForm(); - pokemon.summonData.gender = target.getGender(); + globalScene.unshiftPhase(new PokemonTransformPhase(pokemon.getBattlerIndex(), target.getBattlerIndex(), true)); - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - pokemon.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - pokemon.setStatStage(s, target.getStatStage(s)); - } - - pokemon.summonData.moveset = target.getMoveset().map((m) => { - if (m) { - // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. - return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); - } else { - console.warn(`Imposter: somehow iterating over a ${m} value when copying moveset!`); - return new PokemonMove(Moves.NONE); - } - }); - pokemon.summonData.types = target.getTypes(); - promises.push(pokemon.updateInfo()); - - globalScene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); - globalScene.playSound("battle_anims/PRSFX- Transform"); - promises.push(pokemon.loadAssets(false).then(() => { - pokemon.playAnim(); - pokemon.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - pokemon.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); + globalScene.queueMessage( + i18next.t("abilityTriggers:postSummonTransform", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + targetName: target.name, + }), + ); return true; } @@ -2627,13 +2705,13 @@ export class PreSwitchOutAbAttr extends AbAttr { super(true); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status) { if (!simulated) { pokemon.resetStatus(); @@ -2647,9 +2725,72 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { } } +/** + * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. + */ +export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { + /** + * @param pokemon The {@linkcode Pokemon} with the ability + * @param passive N/A + * @param args N/A + * @returns {boolean} Returns true if the weather clears, otherwise false. + */ + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; + let turnOffWeather = false; + + // Clear weather only if user's ability matches the weather and no other pokemon has the ability. + switch (weatherType) { + case WeatherType.HARSH_SUN: + if ( + pokemon.hasAbility(Abilities.DESOLATE_LAND) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.HEAVY_RAIN: + if ( + pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.STRONG_WINDS: + if ( + pokemon.hasAbility(Abilities.DELTA_STREAM) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DELTA_STREAM)).length === 0 + ) { + turnOffWeather = true; + } + break; + } + + if (simulated) { + return turnOffWeather; + } + + if (turnOffWeather) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + return true; + } + + return false; + } +} export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!pokemon.isFullHp()) { if (!simulated) { const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); @@ -2685,7 +2826,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { * @param args N/A * @returns true if the form change was successful */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -2700,7 +2841,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { } export class PreLeaveFieldAbAttr extends AbAttr { - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2715,7 +2856,7 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { * @param args N/A * @returns Returns `true` if the weather clears, otherwise `false`. */ - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const weatherType = globalScene.arena.weather?.weatherType; let turnOffWeather = false; @@ -2755,7 +2896,14 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { } export class PreStatStageChangeAbAttr extends AbAttr { - applyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2878,7 +3026,14 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { } export class PreSetStatusAbAttr extends AbAttr { - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2944,7 +3099,14 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3139,7 +3301,14 @@ export class ChangeMovePriorityAbAttr extends AbAttr { export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { - applyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreWeatherEffect( + pokemon: Pokemon, + passive: Boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3420,7 +3589,13 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean | Promise { + applyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[], + ): boolean { return false; } @@ -3516,7 +3691,7 @@ function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -3542,7 +3717,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { * @param {any[]} args N/A * @returns Returns true if healed from status, false if not */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status && this.effects.includes(pokemon.status.effect)) { if (!pokemon.isFullHp()) { if (!simulated) { @@ -3776,7 +3951,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { * @param args N/A * @returns `true` if any opponents are sleeping */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { @@ -3870,7 +4045,14 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { - applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + applyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -3891,7 +4073,14 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * * @return true if the Dancer ability was resolved */ - applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + override applyPostMoveUsed( + dancer: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { // List of tags that prevent the Dancer from replicating the move const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; @@ -3933,7 +4122,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @extends AbAttr */ export class PostItemLostAbAttr extends AbAttr { - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { return false; } } @@ -3954,7 +4143,7 @@ export class PostItemLostApplyBattlerTagAbAttr extends PostItemLostAbAttr { * @param args N/A * @returns true if BattlerTag was applied */ - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { if (!pokemon.getTag(this.tagType) && !simulated) { pokemon.addTag(this.tagType); return true; @@ -3980,7 +4169,13 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { } export class StatStageChangeCopyAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); } @@ -4096,7 +4291,14 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { + applyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[], + ): boolean { return false; } } @@ -4170,7 +4372,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { if (!simulated && postBattleLoot.length && args[0]) { const randItem = Utils.randSeedItem(postBattleLoot); //@ts-ignore - TODO see below - if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { // TODO: fix. This is a promise!? + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); return true; @@ -4841,7 +5043,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { * Checks if the Pokemon should change types if summoned into an active terrain * @returns `true` if there is an active terrain requiring a type change | `false` if not */ - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (globalScene.arena.getTerrainType() !== TerrainType.NONE) { return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); } @@ -4860,27 +5062,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } } -async function applyAbAttrsInternal( - attrType: Constructor, - pokemon: Pokemon | null, - applyFunc: AbAttrApplyFunc, - args: any[], - showAbilityInstant: boolean = false, - simulated: boolean = false, - messages: string[] = [], - gainedMidTurn: boolean = false -) { - for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; - } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); - } -} - -async function applySingleAbAttrs( +function applySingleAbAttrs( pokemon: Pokemon, passive: boolean, attrType: Constructor, @@ -4903,13 +5085,7 @@ async function applySingleAbAttrs( } globalScene.setPhaseQueueSplice(); - - let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked - if (result instanceof Promise) { - result = await result; - } - if (result) { + if (applyFunc(attr, passive)) { if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { pokemon.summonData.abilitiesApplied.push(ability.id); } @@ -5074,7 +5250,14 @@ function calculateShellBellRecovery(pokemon: Pokemon): number { * @extends AbAttr */ export class PostDamageAbAttr extends AbAttr { - public applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { return false; } } @@ -5111,7 +5294,14 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { * @param source The Pokemon that dealt damage * @returns `true` if the switch-out logic was successfully applied */ - public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public override applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { const moveHistory = pokemon.getMoveHistory(); // Will not activate when the Pokémon's HP is lowered by cutting its own HP const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; @@ -5165,44 +5355,164 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { return this.helper.getFailedText(target); } } +function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon | null, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + simulated: boolean = false, + messages: string[] = [], + gainedMidTurn: boolean = false +) { + for (const passive of [ false, true ]) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + continue; + } - -export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); + } } -export function applyPostBattleInitAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), args, false, simulated); +export function applyAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); +export function applyPostBattleInitAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPreDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostMoveUsedAbAttrs(attrType: Constructor, - pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, false, simulated); +export function applyPostDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args); -} -export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated); +export function applyPostMoveUsedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDamageAbAttrs(attrType: Constructor, - pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean = false, args: any[], source?: Pokemon): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), args); +export function applyStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: BattleStat, + statValue: Utils.NumberHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), + args, + ); +} +export function applyPostSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect, + sourcePokemon?: Pokemon | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), + args, + false, + simulated, + ); +} + +export function applyPostDamageAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean = false, + args: any[], + source?: Pokemon, +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), + args, + ); } /** @@ -5215,109 +5525,369 @@ export function applyPostDamageAbAttrs(attrType: Constructor, * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat * @param args unused */ -export function applyFieldStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args); +export function applyFieldStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: Stat, + statValue: Utils.NumberHolder, + checkedPokemon: Pokemon, + hasApplied: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), + args, + ); } -export function applyPreAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon | null, move: Move, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), args, false, simulated); +export function applyPreAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon | null, + move: Move, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), + args, + false, + simulated, + ); } -export function applyPostAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, false, simulated); +export function applyPostAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostKnockOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, knockedOut: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, false, simulated); +export function applyPostKnockOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + knockedOut: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + args, + false, + simulated, + ); } -export function applyPostVictoryAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostVictoryAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostSummonAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostSummonAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPreSwitchOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreSwitchOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), + args, + true, + simulated, + ); } -export function applyPreLeaveFieldAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreLeaveFieldAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + return applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyPreLeaveField(pokemon, passive, simulated, args), + args, + true, + simulated + ); } -export function applyPreStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated); +export function applyPreStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon | null, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, stats: BattleStat[], stages: number, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, false, simulated); +export function applyPostStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stats: BattleStat[], + stages: integer, + selfTarget: boolean, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), + args, + false, + simulated, + ); } -export function applyPreSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, false, simulated); +export function applyPreSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, - pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, false, simulated); +export function applyPreApplyBattlerTagAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreWeatherEffectAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, true, simulated); +export function applyPreWeatherEffectAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), + args, + true, + simulated, + ); } -export function applyPostTurnAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostTurnAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostWeatherChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: WeatherType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: WeatherType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostWeatherLapseAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherLapseAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostTerrainChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, terrain: TerrainType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, false, simulated); +export function applyPostTerrainChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + terrain: TerrainType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), + args, + false, + simulated, + ); } -export function applyCheckTrappedAbAttrs(attrType: Constructor, - pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, false, simulated, messages); +export function applyCheckTrappedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + messages: string[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), + args, + false, + simulated, + messages, + ); } -export function applyPostBattleAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostBattleAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPostFaintAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker?: Pokemon, + move?: Move, + hitResult?: HitResult, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostItemLostAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), args); +export function applyPostItemLostAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), + args, + ); } /** diff --git a/src/data/move.ts b/src/data/move.ts index acc68eb6a26..658534eb48f 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,5 +1,16 @@ -import { ChargeAnim, initMoveAnim, loadMoveAnimAssets, MoveChargeAnim } from "./battle-anims"; -import { CommandedTag, EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, SubstituteTag, TrappedTag, TypeBoostTag } from "./battler-tags"; +import { ChargeAnim, MoveChargeAnim } from "./battle-anims"; +import { + CommandedTag, + EncoreTag, + GulpMissileTag, + HelpingHandTag, + SemiInvulnerableTag, + ShellTrapTag, + StockpilingTag, + SubstituteTag, + TrappedTag, + TypeBoostTag, +} from "./battler-tags"; import { getPokemonNameWithAffix } from "../messages"; import type { AttackMoveResult, TurnMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; @@ -30,7 +41,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, EFFECTIVE_STATS, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { BATTLE_STATS, type BattleStat, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -46,6 +57,10 @@ import { applyChallenges, ChallengeType } from "./challenge"; import { SwitchType } from "#enums/switch-type"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; +import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; +import { MoveAnimPhase } from "#app/phases/move-anim-phase"; export enum MoveCategory { PHYSICAL, @@ -1057,7 +1072,7 @@ export abstract class MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean { return true; } @@ -1200,7 +1215,7 @@ export class MoveEffectAttr extends MoveAttr { } /** Applies move effects so long as they are able based on {@linkcode canApply} */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { return this.canApply(user, target, move, args); } @@ -1866,7 +1881,7 @@ export class FlameBurstAttr extends MoveEffectAttr { * @param args - n/a * @returns A boolean indicating whether the effect was successfully applied. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const targetAlly = target.getAlly(); const cancelled = new Utils.BooleanHolder(false); @@ -2406,32 +2421,27 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { this.chance = chance; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (move.hitsSubstitute(user, target)) { - return resolve(false); - } - const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) { - return resolve(false); - } - const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferable); - if (heldItems.length) { - const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? - const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); - } - resolve(success); - }); - return; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (move.hitsSubstitute(user, target)) { + return false; + } - resolve(false); - }); + const rand = Phaser.Math.RND.realInRange(0, 1); + if (rand >= this.chance) { + return false; + } + const heldItems = this.getTargetHeldItems(target).filter((i) => i.isTransferable); + if (heldItems.length) { + const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const highestItemTier = heldItems.map((m) => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? + const tierHeldItems = heldItems.filter((m) => m.type.getOrInferTier(poolType) === highestItemTier); + const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, user, false)) { + globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); + return true; + } + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -2875,9 +2885,7 @@ export class WeatherInstantChargeAttr extends InstantChargeAttr { } export class OverrideMoveEffectAttr extends MoveAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - //const overridden = args[0] as Utils.BooleanHolder; - //const virtual = arg[1] as boolean; + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return true; } } @@ -2903,26 +2911,27 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { this.chargeText = chargeText; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + 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 Promise.resolve(true); + return true; } - const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - return new Promise(resolve => { - if (args.length < 2 || !args[1]) { - new MoveChargeAnim(this.chargeAnim, move.id, user).play(false, () => { - (args[0] as Utils.BooleanHolder).value = true; - globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); - globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); - resolve(true); - }); - } else { - globalScene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name }), null, () => resolve(true)); - } - }); + const overridden = args[0] as Utils.BooleanHolder; + const virtual = args[1] as boolean; + + if (!virtual) { + overridden.value = true; + globalScene.unshiftPhase(new MoveAnimPhase(new MoveChargeAnim(this.chargeAnim, move.id, user))); + globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); + user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); + const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); + } else { + globalScene.queueMessage(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name })); + } + + return true; } } @@ -3053,7 +3062,7 @@ export class StatStageChangeAttr extends MoveEffectAttr { * @param args unused * @returns whether stat stages were changed */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; } @@ -3131,7 +3140,7 @@ export class SecretPowerAttr extends MoveEffectAttr { * Used to apply the secondary effect to the target Pokemon * @returns `true` if a secondary effect is successfully applied */ - override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } @@ -3286,8 +3295,8 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr { super(); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const randStats = BATTLE_STATS.filter((s) => target.getStatStage(s) < 6); if (randStats.length > 0) { const boostStat = [ randStats[user.randSeedInt(randStats.length)] ]; globalScene.unshiftPhase(new StatStageChangePhase(target.getBattlerIndex(), this.selfTarget, boostStat, 2)); @@ -3324,17 +3333,14 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { this.messageCallback = messageCallback; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - if (this.messageCallback) { - this.messageCallback(user); - } - resolve(ret); - }); - }); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); + user.updateInfo(); + const ret = super.apply(user, target, move, args); + if (this.messageCallback) { + this.messageCallback(user); + } + return ret; } getCondition(): MoveConditionFunc { @@ -3426,28 +3432,27 @@ export class ResetStatsAttr extends MoveEffectAttr { super(); this.targetAllPokemon = targetAllPokemon; } - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - const promises: Promise[] = []; - if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used + + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (this.targetAllPokemon) { + // Target all pokemon on the field when Freezy Frost or Haze are used const activePokemon = globalScene.getField(true); - activePokemon.forEach(p => promises.push(this.resetStats(p))); + activePokemon.forEach((p) => this.resetStats(p)); globalScene.queueMessage(i18next.t("moveTriggers:statEliminated")); } else { // Affects only the single target when Clear Smog is used if (!move.hitsSubstitute(user, target)) { - promises.push(this.resetStats(target)); + this.resetStats(target); globalScene.queueMessage(i18next.t("moveTriggers:resetStats", { pokemonName: getPokemonNameWithAffix(target) })); } } - - await Promise.all(promises); return true; } - async resetStats(pokemon: Pokemon): Promise { + private resetStats(pokemon: Pokemon): void { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, 0); } - return pokemon.updateInfo(); + pokemon.updateInfo(); } } @@ -3503,43 +3508,28 @@ export class SwapStatStagesAttr extends MoveEffectAttr { } export class HpSplitAttr extends MoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) { - return resolve(false); - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } - const infoUpdates: Promise[] = []; - - const hpValue = Math.floor((target.hp + user.hp) / 2); - if (user.hp < hpValue) { - const healing = user.heal(hpValue - user.hp); + const hpValue = Math.floor((target.hp + user.hp) / 2); + [ user, target ].forEach((p) => { + if (p.hp < hpValue) { + const healing = p.heal(hpValue - p.hp); if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); + globalScene.damageNumberHandler.add(p, healing, HitResult.HEAL); } - } else if (user.hp > hpValue) { - const damage = user.damage(user.hp - hpValue, true); + } else if (p.hp > hpValue) { + const damage = p.damage(p.hp - hpValue, true); if (damage) { - globalScene.damageNumberHandler.add(user, damage); + globalScene.damageNumberHandler.add(p, damage); } } - infoUpdates.push(user.updateInfo()); - - if (target.hp < hpValue) { - const healing = target.heal(hpValue - target.hp); - if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); - } - } else if (target.hp > hpValue) { - const damage = target.damage(target.hp - hpValue, true); - if (damage) { - globalScene.damageNumberHandler.add(target, damage); - } - } - infoUpdates.push(target.updateInfo()); - - return Promise.all(infoUpdates).then(() => resolve(true)); + p.updateInfo(); }); + + return true; } } @@ -6024,44 +6014,44 @@ export class RevivalBlessingAttr extends MoveEffectAttr { * @param args N/A * @returns Promise, true if function succeeds. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - // If user is player, checks if the user has fainted pokemon - if (user instanceof PlayerPokemon - && globalScene.getPlayerParty().findIndex(p => p.isFainted()) > -1) { - (user as PlayerPokemon).revivalBlessing().then(() => { - resolve(true); - }); - // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party - } else if (user instanceof EnemyPokemon - && user.hasTrainer() - && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { - // Selects a random fainted pokemon - const faintedPokemon = globalScene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); - const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; - const slotIndex = globalScene.getEnemyParty().findIndex(p => pokemon.id === p.id); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // If user is player, checks if the user has fainted pokemon + if (user instanceof PlayerPokemon) { + globalScene.unshiftPhase(new RevivalBlessingPhase(user)); + return true; + } else if (user instanceof EnemyPokemon && user.hasTrainer() && globalScene.getEnemyParty().findIndex((p) => p.isFainted() && !p.isBoss()) > -1) { + // If used by an enemy trainer with at least one fainted non-boss Pokemon, this + // revives one of said Pokemon selected at random. + const faintedPokemon = globalScene.getEnemyParty().filter((p) => p.isFainted() && !p.isBoss()); + const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; + const slotIndex = globalScene.getEnemyParty().findIndex((p) => pokemon.id === p.id); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); - if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { - const allyPokemon = user.getAlly(); - if (slotIndex <= 1) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); - } else if (allyPokemon.isFainted()) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); - } + if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { + const allyPokemon = user.getAlly(); + if (slotIndex <= 1) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); + } else if (allyPokemon.isFainted()) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } - resolve(true); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - resolve(false); } - }); + return true; + } + return false; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - if (user.hasTrainer() && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { + getCondition(): MoveConditionFunc { + return (user, target, move) => + (user instanceof PlayerPokemon && globalScene.getPlayerParty().some((p) => p.isFainted())) || + (user instanceof EnemyPokemon && + user.hasTrainer() && + globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())); + } + + override getUserBenefitScore(user: Pokemon, _target: Pokemon, _move: Move): number { + if (user.hasTrainer() && globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())) { return 20; } @@ -6579,7 +6569,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { class CallMoveAttr extends OverrideMoveEffectAttr { protected invalidMoves: Moves[]; protected hasTarget: boolean; - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined; const moveTargets = getMoveTargets(user, move.id, replaceMoveTarget); if (moveTargets.targets.length === 0) { @@ -6589,11 +6579,8 @@ class CallMoveAttr extends OverrideMoveEffectAttr { ? moveTargets.targets : [ this.hasTarget ? target.getBattlerIndex() : moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; // account for Mirror Move having a target already user.getMoveQueue().push({ move: move.id, targets: targets, virtual: true, ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(move.id)); globalScene.unshiftPhase(new MovePhase(user, targets, new PokemonMove(move.id, 0, 0, true), true, true)); - - await Promise.resolve(initMoveAnim(move.id).then(() => { - loadMoveAnimAssets([ move.id ], true); - })); return true; } } @@ -6626,7 +6613,7 @@ export class RandomMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); let moveId: Moves = Moves.NONE; do { @@ -6663,7 +6650,7 @@ export class RandomMovesetMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return super.apply(user, target, allMoves[this.moveId], args); } @@ -6965,145 +6952,141 @@ const invalidCopycatMoves = [ ]; export class NaturePowerAttr extends OverrideMoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - let moveId; - switch (globalScene.arena.getTerrainType()) { - // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (globalScene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; - break; - case Biome.METROPOLIS: - moveId = Moves.TRI_ATTACK; - break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } - break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; - break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; - break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; - break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; - break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; - break; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + let moveId; + switch (globalScene.arena.getTerrainType()) { + // this allows terrains to 'override' the biome move + case TerrainType.NONE: + switch (globalScene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; + break; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; + break; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; + break; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; + break; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; + break; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; + break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } + break; + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match + moveId = Moves.TRI_ATTACK; + break; + } - user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); - globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(moveId).then(() => { - loadMoveAnimAssets([ moveId ], true) - .then(() => resolve(true)); - }); - }); + user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(moveId)); + globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); + return true; } } @@ -7121,7 +7104,7 @@ export class CopyMoveAttr extends CallMoveAttr { this.invalidMoves = invalidMoves; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { this.hasTarget = this.mirrorMove; const lastMove = this.mirrorMove ? target.getLastXMoves()[0].move : globalScene.currentBattle.lastMove; return super.apply(user, target, allMoves[lastMove], args); @@ -7682,50 +7665,15 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * Used by Transform */ export class TransformAttr extends MoveEffectAttr { - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - const promises: Promise[] = []; - user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.gender = target.getGender(); - - // Power Trick's effect will not preserved after using Transform - user.removeTag(BattlerTagType.POWER_TRICK); - - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - user.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - user.setStatStage(s, target.getStatStage(s)); - } - - user.summonData.moveset = target.getMoveset().map((m) => { - if (m) { - // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. - return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); - } else { - console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); - return new PokemonMove(Moves.NONE); - } - }); - user.summonData.types = target.getTypes(); - promises.push(user.updateInfo()); + globalScene.unshiftPhase(new PokemonTransformPhase(user.getBattlerIndex(), target.getBattlerIndex())); globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - promises.push(user.loadAssets(false).then(() => { - user.playAnim(); - user.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - user.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); return true; } } @@ -8128,44 +8076,54 @@ const attackedByItemMessageFunc = (user: Pokemon, target: Pokemon, move: Move) = export type MoveAttrFilter = (attr: MoveAttr) => boolean; -function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const attrPromises: Promise[] = []; - const moveAttrs = move.attrs.filter(a => attrFilter(a)); - for (const attr of moveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - attrPromises.push(result); - } - } - Promise.allSettled(attrPromises).then(() => resolve()); - }); +function applyMoveAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + args: any[], +): void { + move.attrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -function applyMoveChargeAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, args: any[]): Promise { - return new Promise(resolve => { - const chargeAttrPromises: Promise[] = []; - const chargeMoveAttrs = move.chargeAttrs.filter(a => attrFilter(a)); - for (const attr of chargeMoveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - chargeAttrPromises.push(result); - } - } - Promise.allSettled(chargeAttrPromises).then(() => resolve()); - }); +function applyMoveChargeAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + args: any[], +): void { + move.chargeAttrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } -export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal(attrFilter, user, target, move, args); +export function applyFilteredMoveAttrs( + attrFilter: MoveAttrFilter, + user: Pokemon, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal(attrFilter, user, target, move, args); } -export function applyMoveChargeAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, ...args: any[]): Promise { - return applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveChargeAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + ...args: any[] +): void { + applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } export class MoveCondition { diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index ca6b384cfbb..7d3f6f4c5bc 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -151,7 +151,7 @@ async function spawnNextTrainerOrEndEncounter() { // Give 10x Voucher const newModifier = modifierTypes.VOUCHER_PREMIUM().newModifier(); - await globalScene.addModifier(newModifier); + globalScene.addModifier(newModifier); globalScene.playSound("item_fanfare"); await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index f7c70cb7052..454d179c003 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -406,7 +406,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { // Copy old items to new pokemon for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; - await globalScene.addModifier(item, false, false, false, true); + globalScene.addModifier(item, false, false, false, true); } // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats if (shouldGetOldGateau(newPokemon)) { @@ -416,7 +416,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 580aaaf2cc6..be7d11d6cf1 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -326,7 +326,7 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE); const modifier = modType?.newModifier(pokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); pokemon.calculateStats(); } } @@ -359,7 +359,7 @@ export async function applyModifierTypeToPlayerPokemon(pokemon: PlayerPokemon, m return applyModifierTypeToPlayerPokemon(pokemon, fallbackModifierType); } - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 246f82b8164..214c667f1c1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -104,7 +104,6 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; @@ -4510,43 +4509,6 @@ export class PlayerPokemon extends Pokemon { this.friendship = Math.max(this.friendship + friendship, 0); } } - /** - * Handles Revival Blessing when used by player. - * @returns Promise to revive a pokemon. - * @see {@linkcode RevivalBlessingAttr} - */ - revivalBlessing(): Promise { - return new Promise(resolve => { - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:number, option: PartyOption) => { - if (slotIndex >= 0 && slotIndex < 6) { - const pokemon = globalScene.getPlayerParty()[slotIndex]; - if (!pokemon || !pokemon.isFainted()) { - resolve(); - } - - pokemon.resetTurnData(); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); - - if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { - const allyPokemon = this.getAlly(); - if (slotIndex <= 1) { - // Revived ally pokemon - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } else if (allyPokemon.isFainted()) { - // Revived party pokemon, and ally pokemon is fainted - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } - } - - } - globalScene.ui.setMode(Mode.MESSAGE).then(() => resolve()); - }, PartyUiHandler.FilterFainted); - }); - } getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { if (!evolution) { @@ -4728,70 +4690,62 @@ export class PlayerPokemon extends Pokemon { } /** - * Returns a Promise to fuse two PlayerPokemon together - * @param pokemon The PlayerPokemon to fuse to this one - */ - fuse(pokemon: PlayerPokemon): Promise { - return new Promise(resolve => { - this.fusionSpecies = pokemon.species; - this.fusionFormIndex = pokemon.formIndex; - this.fusionAbilityIndex = pokemon.abilityIndex; - this.fusionShiny = pokemon.shiny; - this.fusionVariant = pokemon.variant; - this.fusionGender = pokemon.gender; - this.fusionLuck = pokemon.luck; - this.fusionCustomPokemonData = pokemon.customPokemonData; - if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { - this.pauseEvolutions = true; - } + * Returns a Promise to fuse two PlayerPokemon together + * @param pokemon The PlayerPokemon to fuse to this one + */ + fuse(pokemon: PlayerPokemon): void { + this.fusionSpecies = pokemon.species; + this.fusionFormIndex = pokemon.formIndex; + this.fusionAbilityIndex = pokemon.abilityIndex; + this.fusionShiny = pokemon.shiny; + this.fusionVariant = pokemon.variant; + this.fusionGender = pokemon.gender; + this.fusionLuck = pokemon.luck; + this.fusionCustomPokemonData = pokemon.customPokemonData; + if (pokemon.pauseEvolutions || this.pauseEvolutions) { + this.pauseEvolutions = true; + } - globalScene.validateAchv(achvs.SPLICE); - globalScene.gameData.gameStats.pokemonFused++; + globalScene.validateAchv(achvs.SPLICE); + globalScene.gameData.gameStats.pokemonFused++; - // Store the average HP% that each Pokemon has - const maxHp = this.getMaxHp(); - const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2; + // Store the average HP% that each Pokemon has + const maxHp = this.getMaxHp(); + const newHpPercent = (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; - this.generateName(); - this.calculateStats(); + this.generateName(); + this.calculateStats(); - // Set this Pokemon's HP to the average % of both fusion components - this.hp = Math.round(maxHp * newHpPercent); - if (!this.isFainted()) { - // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum - this.hp = Math.min(this.hp, maxHp); - this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two - } else if (!pokemon.isFainted()) { - // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero - this.hp = Math.max(this.hp, 1); - this.status = pokemon.status; // Inherit the other Pokemon's status - } + // Set this Pokemon's HP to the average % of both fusion components + this.hp = Math.round(maxHp * newHpPercent); + if (!this.isFainted()) { + // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum + this.hp = Math.min(this.hp, maxHp); + this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two + } else if (!pokemon.isFainted()) { + // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero + this.hp = Math.max(this.hp, 1); + this.status = pokemon.status; // Inherit the other Pokemon's status + } - this.generateCompatibleTms(); - this.updateInfo(true); - const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); - let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); - if (partyMemberIndex > fusedPartyMemberIndex) { - partyMemberIndex--; - } - const fusedPartyMemberHeldModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; - const transferModifiers: Promise[] = []; - for (const modifier of fusedPartyMemberHeldModifiers) { - transferModifiers.push(globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false)); - } - Promise.allSettled(transferModifiers).then(() => { - globalScene.updateModifiers(true, true).then(() => { - globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); - globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; - const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); - pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); - pokemon.destroy(); - this.updateFusionPalette(); - resolve(); - }); - }); - }); + this.generateCompatibleTms(); + this.updateInfo(true); + const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); + let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); + if (partyMemberIndex > fusedPartyMemberIndex) { + partyMemberIndex--; + } + const fusedPartyMemberHeldModifiers = globalScene.findModifiers((m) => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + for (const modifier of fusedPartyMemberHeldModifiers) { + globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false); + } + globalScene.updateModifiers(true, true); + globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); + globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; + const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); + pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); + pokemon.destroy(); + this.updateFusionPalette(); } unfuse(): Promise { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 3af2aa2144f..f6a69fcca2d 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -158,7 +158,7 @@ export abstract class Modifier { * Handles applying of {@linkcode Modifier} * @param args collection of all passed parameters */ - abstract apply(...args: unknown[]): boolean | Promise; + abstract apply(...args: unknown[]): boolean; } export abstract class PersistentModifier extends Modifier { @@ -1949,7 +1949,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item * @param args Additional arguments passed to {@linkcode ConsumablePokemonModifier.apply} */ - abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean | Promise; + abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean; getPokemon() { return globalScene.getPlayerParty().find(p => p.id === this.pokemonId); @@ -2288,8 +2288,8 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @param playerPokemon2 {@linkcode PlayerPokemon} that should be fused with {@linkcode playerPokemon} * @returns always Promise */ - override async apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): Promise { - await playerPokemon.fuse(playerPokemon2); + override apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): boolean { + playerPokemon.fuse(playerPokemon2); return true; } } @@ -3136,8 +3136,6 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const heldItemTransferPromises: Promise[] = []; - for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { while (highestItemTier-- && !tierItemModifiers.length) { @@ -3149,19 +3147,15 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; - heldItemTransferPromises.push(globalScene.tryTransferHeldItemModifier(randItem, pokemon, false).then(success => { - if (success) { - transferredModifierTypes.push(randItem.type); - itemModifiers.splice(randItemIndex, 1); - } - })); + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, false)) { + transferredModifierTypes.push(randItem.type); + itemModifiers.splice(randItemIndex, 1); + } } - Promise.all(heldItemTransferPromises).then(() => { - for (const mt of transferredModifierTypes) { - globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); - } - }); + for (const mt of transferredModifierTypes) { + globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); + } return !!transferredModifierTypes.length; } diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index d79b4f6eca5..f504fd0aaa2 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -21,6 +21,7 @@ export class AddEnemyBuffModifierPhase extends Phase { for (let i = 0; i < count; i++) { globalScene.addEnemyModifier(getEnemyBuffModifierForWave(tier, globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false)), true, true); } - globalScene.updateModifiers(false, true).then(() => this.end()); + globalScene.updateModifiers(false, true); + this.end(); } } diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index edffd8498d6..c0922b91809 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -63,6 +63,7 @@ export class BattleEndPhase extends BattlePhase { } } - globalScene.updateModifiers().then(() => this.end()); + globalScene.updateModifiers(); + this.end(); } } diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index c98bb5fff04..93f53bf38c0 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -12,16 +12,22 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - // Sound loaded into game as is - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.fadeIn(250).then(() => { - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => { + globalScene.addModifier(newModifier); + // Sound loaded into game as is + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.fadeIn(250).then(() => { + globalScene.ui.showText( + i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), + null, + () => { globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); resolve(); - }, null, true, 1500); - }); + }, + null, + true, + 1500, + ); }); }); } diff --git a/src/phases/load-move-anim-phase.ts b/src/phases/load-move-anim-phase.ts new file mode 100644 index 00000000000..66cb90744e0 --- /dev/null +++ b/src/phases/load-move-anim-phase.ts @@ -0,0 +1,20 @@ +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import type { Moves } from "#enums/moves"; +import { Phase } from "#app/phase"; + +/** + * Phase for synchronous move animation loading. + * Should be used when a move invokes another move that + * isn't already loaded (e.g. for Metronome) + */ +export class LoadMoveAnimPhase extends Phase { + constructor(protected moveId: Moves) { + super(); + } + + public override start(): void { + initMoveAnim(this.moveId) + .then(() => loadMoveAnimAssets([ this.moveId ], true)) + .then(() => this.end()); + } +} diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 1cdfd6b2721..e4fac33767f 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -22,10 +22,9 @@ export class ModifierRewardPhase extends BattlePhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("item_fanfare"); - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("item_fanfare"); + globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); }); } } diff --git a/src/phases/move-anim-phase.ts b/src/phases/move-anim-phase.ts new file mode 100644 index 00000000000..005445924a0 --- /dev/null +++ b/src/phases/move-anim-phase.ts @@ -0,0 +1,20 @@ +import type { MoveAnim } from "#app/data/battle-anims"; +import { Phase } from "#app/phase"; + +/** + * Plays the given {@linkcode MoveAnim} sequentially. + */ +export class MoveAnimPhase extends Phase { + constructor( + protected anim: Anim, + protected onSubstitute: boolean = false, + ) { + super(); + } + + public override start(): void { + super.start(); + + this.anim.play(this.onSubstitute, () => this.end()); + } +} diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index b0925f1f6cb..6eccdd20254 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -44,10 +44,9 @@ export class MoveChargePhase extends PokemonPhase { new MoveChargeAnim(move.chargeAnim, move.id, user).play(false, () => { move.showChargeText(user, target); - applyMoveChargeAttrs(MoveEffectAttr, user, target, move).then(() => { - user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); - this.end(); - }); + applyMoveChargeAttrs(MoveEffectAttr, user, target, move); + user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); + this.end(); }); } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 65d8d95cde6..f878cb40e2e 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -61,7 +61,7 @@ import { PokemonMultiHitModifier, } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; -import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; +import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils"; import { type nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; @@ -143,86 +143,86 @@ export class MoveEffectPhase extends PokemonPhase { const move = this.move.getMove(); // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual).then(() => { - // If other effects were overriden, stop this phase before they can be applied - if (overridden.value) { - return this.end(); + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual); + + // If other effects were overriden, stop this phase before they can be applied + if (overridden.value) { + return this.end(); + } + + user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + + // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that + // the move executes correctly (ensures all hits of a multi-hit are properly calculated) + if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { + user.turnData.hitsLeft = -1; + user.turnData.hitCount = 0; + user.turnData.extraTurns--; + } + + /** + * If this phase is for the first hit of the invoked move, + * resolve the move's total hit count. This block combines the + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ + if (user.turnData.hitsLeft === -1) { + const hitCount = new NumberHolder(1); + // Assume single target for multi hit + applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); + // If Parental Bond is applicable, add another hit + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); + // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses + globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); + // Set the user's relevant turnData fields to reflect the final hit count + user.turnData.hitCount = hitCount.value; + user.turnData.hitsLeft = hitCount.value; + } + + /** + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ + const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; + + /** + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ + const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); + const hasActiveTargets = targets.some(t => t.isActive(true)); + + /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ + const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) + && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) + && !targets[0]?.getTag(SemiInvulnerableTag); + + const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + + /** + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ + if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + this.stopMultiHit(); + if (hasActiveTargets) { + globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); + moveHistoryEntry.result = MoveResult.MISS; + applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); + } else { + globalScene.queueMessage(i18next.t("battle:attackFailed")); + moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); + return this.end(); + } - user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - - // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that - // the move executes correctly (ensures all hits of a multi-hit are properly calculated) - if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { - user.turnData.hitsLeft = -1; - user.turnData.hitCount = 0; - user.turnData.extraTurns--; - } - - /** - * If this phase is for the first hit of the invoked move, - * resolve the move's total hit count. This block combines the - * effects of the move itself, Parental Bond, and Multi-Lens to do so. - */ - if (user.turnData.hitsLeft === -1) { - const hitCount = new NumberHolder(1); - // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); - // If Parental Bond is applicable, add another hit - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); - // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses - globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); - // Set the user's relevant turnData fields to reflect the final hit count - user.turnData.hitCount = hitCount.value; - user.turnData.hitsLeft = hitCount.value; - } - - /** - * Log to be entered into the user's move history once the move result is resolved. - * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully - * used in the sense of "Does it have an effect on the user?". - */ - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - - /** - * Stores results of hit checks of the invoked move against all targets, organized by battler index. - * @see {@linkcode hitCheck} - */ - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); - const hasActiveTargets = targets.some(t => t.isActive(true)); - - /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) - && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0]?.getTag(SemiInvulnerableTag); - - const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); - - /** - * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target - * (and not random target) and failed the hit check against its target (MISS), log the move - * as FAILed or MISSed (depending on the conditions above) and end this phase. - */ - if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { - this.stopMultiHit(); - if (hasActiveTargets) { - globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); - moveHistoryEntry.result = MoveResult.MISS; - applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - moveHistoryEntry.result = MoveResult.FAIL; - } - user.pushMoveHistory(moveHistoryEntry); - return this.end(); - } - - /** All move effect attributes are chained together in this array to be applied asynchronously. */ - const applyAttrs: Promise[] = []; - - const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; - // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => { + const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; + // Move animation only needs one target + new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play( + move.hitsSubstitute(user, this.getFirstTarget()!), + () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; @@ -313,7 +313,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's first strike? */ - const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstHit = user.turnData.hitsLeft === user.turnData.hitCount; // Only log the move's result on the first strike if (firstHit) { @@ -363,7 +363,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's last strike? */ - const lastHit = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()); + const lastHit = user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive(); /** * If the user can change forms by using the invoked move, @@ -381,43 +381,29 @@ export class MoveEffectPhase extends PokemonPhase { } } - /** - * Create a Promise that applies *all* effects from the invoked move's MoveEffectAttrs. - * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger - * type requires different conditions to be met with respect to the move's hit result. - */ - const k = new Promise((resolve) => { - //Start promise chain and apply PRE_APPLY move attributes - let promiseChain: Promise = applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.PRE_APPLY - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit) - && hitResult !== HitResult.NO_EFFECT, user, target, move); + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.PRE_APPLY && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + hitResult !== HitResult.NO_EFFECT, + user, + target, + move, + ); - /** Don't complete if the move failed */ - if (hitResult === HitResult.FAIL) { - return resolve(); - } - - /** Apply Move/Ability Effects in correct order */ - promiseChain = promiseChain - .then(this.applySelfTargetEffects(user, target, firstHit, lastHit)); + if (hitResult !== HitResult.FAIL) { + this.applySelfTargetEffects(user, target, firstHit, lastHit); if (hitResult !== HitResult.NO_EFFECT) { - promiseChain - .then(this.applyPostApplyEffects(user, target, firstHit, lastHit)) - .then(this.applyHeldItemFlinchCheck(user, target, dealsDamage)) - .then(this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget)) - .then(() => resolve()); + this.applyPostApplyEffects(user, target, firstHit, lastHit); + this.applyHeldItemFlinchCheck(user, target, dealsDamage); + this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget); } else { - promiseChain - .then(() => applyMoveAttrs(NoEffectAttr, user, null, move)) - .then(resolve); + applyMoveAttrs(NoEffectAttr, user, null, move); } - }); - - applyAttrs.push(k); + } } // Apply queued phases @@ -425,41 +411,35 @@ export class MoveEffectPhase extends PokemonPhase { globalScene.appendToPhase(queuedPhases, MoveEndPhase); } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved - const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : - null; - - if (postTarget) { - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1].then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); - } + if (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) { + applyFilteredMoveAttrs( + (attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, + user, + null, + move, + ); } - // Wait for all move effects to finish applying, then end this phase - Promise.allSettled(applyAttrs).then(() => { - /** - * Remove the target's substitute (if it exists and has expired) - * after all targeted effects have applied. - * This prevents blocked effects from applying until after this hit resolves. - */ - targets.forEach(target => { - const substitute = target.getTag(SubstituteTag); - if (substitute && substitute.hp <= 0) { - target.lapseTag(BattlerTagType.SUBSTITUTE); - } - }); - - const moveType = user.getMoveType(move, true); - if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { - user.stellarTypesBoosted.push(moveType); + /** + * Remove the target's substitute (if it exists and has expired) + * after all targeted effects have applied. + * This prevents blocked effects from applying until after this hit resolves. + */ + targets.forEach((target) => { + const substitute = target.getTag(SubstituteTag); + if (substitute && substitute.hp <= 0) { + target.lapseTag(BattlerTagType.SUBSTITUTE); } - - this.end(); }); - }); - }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + + this.end(); + }, + ); } public override end(): void { @@ -500,8 +480,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && attr.selfTarget @@ -518,8 +498,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && !attr.selfTarget @@ -537,8 +517,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): Promise { - return applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit) @@ -554,21 +534,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param hitResult - The {@linkcode HitResult} of the attempted move * @returns a `Promise` intended to be passed into a `then()` call. */ - protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): Promise { - return executeIf(!target.isFainted() || target.canApplyAbility(), () => - applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult) - .then(() => { + protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): void { + if (!target.isFainted() || target.canApplyAbility()) { + applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult); - if (!this.move.getMove().hitsSubstitute(user, target)) { - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); - } + if (!this.move.getMove().hitsSubstitute(user, target)) { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); + } - target.lapseTags(BattlerTagLapseType.AFTER_HIT); - } - - }) - ); + target.lapseTags(BattlerTagLapseType.AFTER_HIT); + } + } } /** @@ -583,17 +560,15 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, isProtected : boolean, hitResult: HitResult, firstTarget: boolean) : () => Promise { - return () => executeIf(!isProtected, () => - this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget).then(() => - this.applyOnGetHitAbEffects(user, target, hitResult)).then(() => - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult)).then(() => { // Item Stealing Effects - - if (this.move.getMove() instanceof AttackMove) { - globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - }) - ); + protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean, isProtected: boolean, hitResult: HitResult, firstTarget: boolean): void { + if (!isProtected) { + this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); + this.applyOnGetHitAbEffects(user, target, hitResult); + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult); + if (this.move.getMove() instanceof AttackMove) { + globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + } } /** @@ -603,20 +578,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param dealsDamage - `true` if the attempted move successfully dealt damage * @returns a function intended to be passed into a `then()` call. */ - protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : () => void { - return () => { - if (this.move.getMove().hasAttr(FlinchAttr)) { - return; - } + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : void { + if (this.move.getMove().hasAttr(FlinchAttr)) { + return; + } - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { - const flinched = new BooleanHolder(false); - globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) { - target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); - } + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { + const flinched = new BooleanHolder(false); + globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); } - }; + } } /** diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index 6a982646b50..5b89548b663 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -22,9 +22,8 @@ export class MoveHeaderPhase extends BattlePhase { super.start(); if (this.canMove()) { - applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()).then(() => this.end()); - } else { - this.end(); + applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()); } + this.end(); } } diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts new file mode 100644 index 00000000000..d67f758b1fd --- /dev/null +++ b/src/phases/pokemon-transform-phase.ts @@ -0,0 +1,77 @@ +import type { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat"; +import { PokemonMove } from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import { PokemonPhase } from "./pokemon-phase"; + +/** + * Transforms a Pokemon into another Pokemon on the field. + * Used for Transform (move) and Imposter (ability) + */ +export class PokemonTransformPhase extends PokemonPhase { + protected targetIndex: BattlerIndex; + private playSound: boolean; + + constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound: boolean = false) { + super(userIndex); + + this.targetIndex = targetIndex; + this.playSound = playSound; + } + + public override start(): void { + const user = this.getPokemon(); + const target = globalScene.getField(true).find((p) => p.getBattlerIndex() === this.targetIndex); + + if (!target) { + return this.end(); + } + + user.summonData.speciesForm = target.getSpeciesForm(); + user.summonData.ability = target.getAbility().id; + user.summonData.gender = target.getGender(); + + // Power Trick's effect is removed after using Transform + user.removeTag(BattlerTagType.POWER_TRICK); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + user.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + } + }); + user.summonData.types = target.getTypes(); + + const promises = [ user.updateInfo() ]; + + if (this.playSound) { + globalScene.playSound("battle_anims/PRSFX- Transform"); + } + + promises.push( + user.loadAssets(false).then(() => { + user.playAnim(); + user.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + user.setTempAbility(target.getAbility()); + }), + ); + + Promise.allSettled(promises).then(() => this.end()); + } +} diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index d76708b7050..b92d79501d4 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -27,12 +27,10 @@ export class PostSummonPhase extends PokemonPhase { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon) - .then(() => { - const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon); + const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); + field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); - this.end(); - }); + this.end(); } } diff --git a/src/phases/revival-blessing-phase.ts b/src/phases/revival-blessing-phase.ts new file mode 100644 index 00000000000..a063e325a31 --- /dev/null +++ b/src/phases/revival-blessing-phase.ts @@ -0,0 +1,61 @@ +import { SwitchType } from "#enums/switch-type"; +import { globalScene } from "#app/global-scene"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import type { PlayerPokemon } from "#app/field/pokemon"; + +/** + * Sets the Party UI and handles the effect of Revival Blessing + * when used by one of the player's Pokemon. + */ +export class RevivalBlessingPhase extends BattlePhase { + constructor(protected user: PlayerPokemon) { + super(); + } + + public override start(): void { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.REVIVAL_BLESSING, + this.user.getFieldIndex(), + (slotIndex: integer, option: PartyOption) => { + if (slotIndex >= 0 && slotIndex < 6) { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + if (!pokemon || !pokemon.isFainted()) { + return this.end(); + } + + pokemon.resetTurnData(); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); + + if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { + const allyPokemon = this.user.getAlly(); + if (slotIndex <= 1) { + // Revived ally pokemon + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } else if (allyPokemon.isFainted()) { + // Revived party pokemon, and ally pokemon is fainted + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } + } + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => this.end()); + }, + PartyUiHandler.FilterFainted, + ); + } +} diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index 8cf15ba8f2c..72a8f4bf37c 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -17,17 +17,16 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { - speciesName: this.species.name, - gameMode: globalScene.gameMode.getName(), - newModifier: newModifier?.type.name - }), null, () => { - resolve(); - }, null, true, 1500); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: globalScene.gameMode.getName(), + newModifier: newModifier?.type.name, + }), null, () => { + resolve(); + }, null, true, 1500); }); } } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index a3a2fa1aa24..36f18a8d64d 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -171,30 +171,21 @@ export class SelectModifierPhase extends BattlePhase { } if (cost && !(modifier.type instanceof RememberMoveModifierType)) { - result.then(success => { - if (success) { - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - globalScene.money -= cost; - globalScene.updateMoneyText(); - globalScene.animateMoneyChanged(false); - } - globalScene.playSound("se/buy"); - (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - globalScene.ui.playError(); + if (result) { + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= cost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); } - }); - } else { - const doEnd = () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); + globalScene.playSound("se/buy"); + (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { - doEnd(); + globalScene.ui.playError(); } + } else { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); } }; @@ -304,7 +295,7 @@ export class SelectModifierPhase extends BattlePhase { ); } - addModifier(modifier: Modifier): Promise { + addModifier(modifier: Modifier): boolean { return globalScene.addModifier(modifier, false, true); } } diff --git a/src/test/abilities/unburden.test.ts b/src/test/abilities/unburden.test.ts index a652f55d591..9c5f6c2d185 100644 --- a/src/test/abilities/unburden.test.ts +++ b/src/test/abilities/unburden.test.ts @@ -391,7 +391,7 @@ describe("Abilities - Unburden", () => { await game.forceEnemyMove(Moves.THIEF, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); - game.doSelectPartyPokemon(0, "MoveEffectPhase"); + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); await game.toNextTurn(); expect(game.scene.getPlayerField()[0]).toBe(treecko); diff --git a/src/test/moves/revival_blessing.test.ts b/src/test/moves/revival_blessing.test.ts new file mode 100644 index 00000000000..cdde3941d30 --- /dev/null +++ b/src/test/moves/revival_blessing.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Revival Blessing", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.REVIVAL_BLESSING, Moves.MEMENTO ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should revive a selected fainted Pokemon when used by the player", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.MEMENTO); + game.doSelectPartyPokemon(1, "SwitchPhase"); + await game.toNextTurn(); + + const player = game.scene.getPlayerPokemon()!; + + expect(player.species.speciesId).toBe(Species.MAGIKARP); + game.move.select(Moves.REVIVAL_BLESSING); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1, "RevivalBlessingPhase"); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getPlayerParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should revive a random fainted enemy when used by an enemy Trainer", async () => { + game.override.enemyMoveset(Moves.REVIVAL_BLESSING).startingWave(8); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getEnemyParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should fail when there are no fainted Pokemon to target", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.REVIVAL_BLESSING); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase", false); + + const player = game.scene.getPlayerPokemon()!; + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should revive a player pokemon and immediately send it back out if used in the same turn it fainted in doubles", async () => { + game.override + .battleType("double") + .enemyMoveset([ Moves.SPLASH, Moves.FISSURE ]) + .enemyAbility(Abilities.NO_GUARD) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC, Species.GYARADOS ]); + + const feebas = game.scene.getPlayerField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REVIVAL_BLESSING, 1); + await game.forceEnemyMove(Moves.FISSURE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(feebas.isFainted()).toBe(true); + + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); + await game.toNextTurn(); + + expect(feebas.isFainted()).toBe(false); + expect(feebas.hp).toBe(toDmgValue(0.5 * feebas.getMaxHp())); + expect(game.scene.getPlayerField()[0]).toBe(feebas); + }); +}); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f105678e71f..f95450bbf44 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -375,6 +375,6 @@ describe("Clowning Around - Mystery Encounter", () => { async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: number, itemType: PokemonHeldItemModifierType) { const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; itemMod.stackCount = stackCount; - await scene.addModifier(itemMod, true, false, false, true); + scene.addModifier(itemMod, true, false, false, true); await scene.updateModifiers(true); } diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 795e6b6650b..ceb457666d7 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -123,8 +123,6 @@ describe("Dancing Lessons - Mystery Encounter", () => { partyLead.level = 1000; partyLead.calculateStats(); await runMysteryEncounterToEnd(game, 1, undefined, true); - // For some reason updateModifiers breaks in this test and does not resolve promise - vi.spyOn(game.scene, "updateModifiers").mockImplementation(() => new Promise(resolve => resolve())); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index f99aa24805e..8121916a4d7 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -123,7 +123,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const amuletCoin = generateModifierType(modifierTypes.AMULET_COIN)!.newModifier() as MoneyMultiplierModifier; amuletCoin.stackCount = 5; - await scene.addModifier(amuletCoin, true, false, false, true); + scene.addModifier(amuletCoin, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 1); @@ -193,7 +193,7 @@ describe("Delibird-y - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -214,7 +214,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -234,13 +234,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const candyJar = generateModifierType(modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; - await scene.addModifier(candyJar, true, false, false, true); + scene.addModifier(candyJar, true, false, false, true); const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; // Sitrus berries on party const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -263,13 +263,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; healingCharm.stackCount = 3; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -292,7 +292,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -321,7 +321,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -355,7 +355,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -376,7 +376,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -396,13 +396,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; healingCharm.stackCount = 5; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -425,7 +425,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -455,7 +455,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index fb5801c941a..60780984014 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -224,7 +224,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -249,7 +249,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 39904c030a3..06bd382879f 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -216,11 +216,11 @@ describe("Uncommon Breed - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); const ganlon = generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ])!; const ganlonMod = ganlon.newModifier(scene.getPlayerParty()[0]) as BerryModifier; ganlonMod.stackCount = 3; - await scene.addModifier(ganlonMod, true, false, false, true); + scene.addModifier(ganlonMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index ca5a67f901a..3ba9cae3c8d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -91,6 +91,7 @@ export default class GameWrapper { Pokemon.prototype.updateFusionPalette = () => null; Pokemon.prototype.cry = () => null; Pokemon.prototype.faintCry = (cb) => { if (cb) cb(); }; + BattleScene.prototype.addPokemonIcon = () => new Phaser.GameObjects.Container(this.scene); } setScene(scene: BattleScene) { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index d60e0e78373..91f98e89ec3 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -60,6 +60,7 @@ import { RibbonModifierRewardPhase } from "#app/phases/ribbon-modifier-reward-ph import { GameOverModifierRewardPhase } from "#app/phases/game-over-modifier-reward-phase"; import { UnlockPhase } from "#app/phases/unlock-phase"; import { PostGameOverPhase } from "#app/phases/post-game-over-phase"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; export interface PromptHandler { phaseTarget?: string; @@ -126,7 +127,8 @@ type PhaseClass = | typeof EncounterPhase | typeof GameOverPhase | typeof UnlockPhase - | typeof PostGameOverPhase; + | typeof PostGameOverPhase + | typeof RevivalBlessingPhase; type PhaseString = | "LoginPhase" @@ -185,7 +187,8 @@ type PhaseString = | "EncounterPhase" | "GameOverPhase" | "UnlockPhase" - | "PostGameOverPhase"; + | "PostGameOverPhase" + | "RevivalBlessingPhase"; type PhaseInterceptorPhase = PhaseClass | PhaseString; @@ -269,6 +272,7 @@ export default class PhaseInterceptor { [ GameOverPhase, this.startPhase ], [ UnlockPhase, this.startPhase ], [ PostGameOverPhase, this.startPhase ], + [ RevivalBlessingPhase, this.startPhase ], ]; private endBySetMode = [ @@ -511,11 +515,11 @@ export default class PhaseInterceptor { if (expireFn) { this.prompts.shift(); } else if ( - currentMode === actionForNextPrompt.mode - && currentPhase === actionForNextPrompt.phaseTarget - && currentHandler.active - && (!actionForNextPrompt.awaitingActionInput - || (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) + currentMode === actionForNextPrompt.mode && + currentPhase === actionForNextPrompt.phaseTarget && + currentHandler.active && + (!actionForNextPrompt.awaitingActionInput || + (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) ) { const prompt = this.prompts.shift(); if (prompt?.callback) { From 39f2fdf4ff323efbed0b8baa62336b0d05b80743 Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 21 Feb 2025 03:43:45 -0500 Subject: [PATCH 075/171] [Bug] Giratina no longer loses its' Hidden Ability going from Origin back to Altered Form #5326 --- src/data/pokemon-species.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 4349cee2cbf..ff9fbdf0bc8 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1848,7 +1848,7 @@ export function initSpecies() { new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), + new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), ), new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), From 180a9cc054d4d3e76a2b43401be7aa5aaf851f88 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:09:00 +0100 Subject: [PATCH 076/171] [UI/UX] Pokedex - Separate shiny icons (#5371) * Separate shiny icons * Added forgotten access modifier --- src/ui/pokedex-page-ui-handler.ts | 83 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 4d30609a020..a086762bb57 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -164,7 +164,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private pokemonFormText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; - private pokemonShinyIcon: Phaser.GameObjects.Sprite; + private pokemonShinyIcons: Phaser.GameObjects.Sprite[]; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -245,6 +245,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private availableVariants: number; + private unlockedVariants: boolean[]; + constructor() { super(Mode.POKEDEX_PAGE); } @@ -381,10 +384,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons"); - this.pokemonShinyIcon.setOrigin(0.15, 0.2); - this.pokemonShinyIcon.setScale(1); - this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); + this.pokemonShinyIcons = []; + for (let i = 0; i < 3; i++) { + const pokemonShinyIcon = globalScene.add.sprite(153 + i * 13, 160, "shiny_icons"); + pokemonShinyIcon.setOrigin(0.15, 0.2); + pokemonShinyIcon.setScale(1); + pokemonShinyIcon.setFrame(getVariantIcon(i as Variant)); + pokemonShinyIcon.setVisible(false); + this.pokemonCaughtHatchedContainer.add(pokemonShinyIcon); + this.pokemonShinyIcons.push(pokemonShinyIcon); + } this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); @@ -672,6 +681,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ) ); } + + this.availableVariants = species.getFullUnlocksData() & DexAttr.VARIANT_3 ? 3 : 1; } // Function to ensure that forms appear in the appropriate biome and tod @@ -795,17 +806,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = 0; } - const unlockedVariants = [ - hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, - hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + this.unlockedVariants = [ + !!(hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_2), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_3) ]; if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { starterAttributes.variant = 0; - } else if (!unlockedVariants[starterAttributes.variant]) { + } else if (!this.unlockedVariants[starterAttributes.variant]) { let highestValidIndex = -1; - for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { - if (unlockedVariants[i] !== 0n) { + for (let i = 0; i <= starterAttributes.variant && i < this.unlockedVariants.length; i++) { + if (this.unlockedVariants[i]) { highestValidIndex = i; } } @@ -1530,11 +1541,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.setSpeciesDetails(this.species, { shiny: true, variant: newVariant }); globalScene.playSound("se/sparkle"); - // Set the variant label to the shiny tint - const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(true); starterAttributes.shiny = true; this.savedStarterAttributes.shiny = starterAttributes.shiny; @@ -1561,14 +1567,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.variant = starterAttributes.variant; if (newVariant > props.variant) { this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); - // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); success = true; } else { this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); - this.pokemonShinyIcon.setVisible(false); success = true; starterAttributes.shiny = false; @@ -2005,7 +2006,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(true); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCandyContainer.setVisible(false); @@ -2031,7 +2034,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(!!species); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); @@ -2232,13 +2237,26 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); 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.pokemonCaughtHatchedContainer.setVisible(true); + const variant = defaultProps.variant; + for (let v = 0; v < 3; v++) { + const icon = this.pokemonShinyIcons[v]; + if (v < this.availableVariants) { + if (!this.unlockedVariants[v]) { + icon.setTint(0x000000); + } else if (shiny && v === variant) { + const tint = getVariantTint(v as Variant); + icon.setTint(tint); + } else { + icon.setTint(0x808080); + } + icon.setVisible(true); + } else { + icon.setVisible(false); + } + } + + this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); @@ -2246,7 +2264,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonHatchedIcon.setVisible(false); this.pokemonHatchedCountText.setVisible(false); this.pokemonFormText.setY(36); @@ -2273,7 +2290,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } } // Setting type icons and form text From 7a015e094fef5d39ed3e2659ab4b2e28a7c1af2c Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 12:33:32 -0600 Subject: [PATCH 077/171] [Bug] [Move] Add focus punch lost focus message (#5341) * Add focus punch lost focus message * Rename attribute * Added automated test * Fix failedToTerrain being undefined * Update src/test/moves/focus_punch.test.ts Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 2 +- src/data/move.ts | 84 ++++++++++++++++++++++++------ src/phases/move-phase.ts | 40 +++++++++----- src/test/moves/focus_punch.test.ts | 22 ++++++-- 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 65da3753cde..131b7d0ff7a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6633,7 +6633,7 @@ export function initAbilities() { .bypassFaint(), new Ability(Abilities.CORROSION, 7) .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ]) - .edgeCase(), // Should interact correctly with magic coat/bounce (not yet implemented) + fling with toxic orb (not implemented yet) + .edgeCase(), // Should poison itself with toxic orb. new Ability(Abilities.COMATOSE, 7) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/data/move.ts b/src/data/move.ts index 658534eb48f..30c5ef75491 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -692,19 +692,17 @@ export default class Move implements Localizable { /** * Sees if a move has a custom failure text (by looking at each {@linkcode MoveAttr} of this move) * @param user {@linkcode Pokemon} using the move - * @param target {@linkcode Pokemon} receiving the move - * @param move {@linkcode Move} using the move - * @param cancelled {@linkcode Utils.BooleanHolder} to hold boolean value + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute * @returns string of the custom failure text, or `null` if it uses the default text ("But it failed!") */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { for (const attr of this.attrs) { - const failedText = attr.getFailedText(user, target, move, cancelled); - if (failedText !== null) { + const failedText = attr.getFailedText(user, target, move); + if (failedText) { return failedText; } } - return null; } /** @@ -1089,11 +1087,10 @@ export abstract class MoveAttr { * @param user {@linkcode Pokemon} using the move * @param target {@linkcode Pokemon} target of the move * @param move {@linkcode Move} with this attribute - * @param cancelled {@linkcode Utils.BooleanHolder} which stores if the move should fail * @returns the string representing failure of this {@linkcode Move} */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - return null; + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + return; } /** @@ -1335,6 +1332,54 @@ export class PreMoveMessageAttr extends MoveAttr { } } +/** + * Attribute for moves that can be conditionally interrupted to be considered to + * have failed before their "useMove" message is displayed. Currently used by + * Focus Punch. + * @extends MoveAttr + */ +export class PreUseInterruptAttr extends MoveAttr { + protected message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string); + protected overridesFailedMessage: boolean; + protected conditionFunc: MoveConditionFunc; + + /** + * Create a new MoveInterruptedMessageAttr. + * @param message The message to display when the move is interrupted, or a function that formats the message based on the user, target, and move. + */ + constructor(message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string), conditionFunc?: MoveConditionFunc) { + super(); + this.message = message; + this.conditionFunc = conditionFunc ?? (() => true); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override apply(user: Pokemon, target: Pokemon, move: Move): boolean { + return this.conditionFunc(user, target, move); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + if (this.message && this.conditionFunc(user, target, move)) { + const message = + typeof this.message === "string" + ? (this.message as string) + : this.message(user, target, move); + return message; + } + } +} + /** * Attribute for Status moves that take attack type effectiveness * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) @@ -1754,13 +1799,16 @@ export class AddSubstituteAttr extends MoveEffectAttr { return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + /** + * Get the substitute-specific failure message if one should be displayed. + * @param user The pokemon using the move. + * @returns The substitute-specific failure message if the conditions apply, otherwise `undefined` + */ + getFailedText(user: Pokemon, _target: Pokemon, _move: Move): string | undefined { if (user.getTag(SubstituteTag)) { return i18next.t("moveTriggers:substituteOnOverlap", { pokemonName: getPokemonNameWithAffix(user) }); } else if (user.hp <= Math.floor(user.getMaxHp() / 4) || user.getMaxHp() === 1) { return i18next.t("moveTriggers:substituteNotEnoughHp"); - } else { - return i18next.t("battle:attackFailed"); } } } @@ -6230,10 +6278,12 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move)); } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(_user: Pokemon, target: Pokemon, _move: Move): string | undefined { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + if (blockedByAbility.value) { + return i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }); + } } getSwitchOutCondition(): MoveConditionFunc { @@ -9185,8 +9235,8 @@ export function initMoves() { .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .punchingMove() - .condition((user, target, move) => !user.turnData.attacksReceived.find(r => r.damage)), + .attr(PreUseInterruptAttr, i18next.t("moveTriggers:lostFocus"), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .punchingMove(), new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index c1e4aeaf497..d58c052812f 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -9,7 +9,7 @@ import { PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr, - ReduceStatusEffectDurationAbAttr + ReduceStatusEffectDurationAbAttr, } from "#app/data/ability"; import type { DelayedAttackTag } from "#app/data/arena-tag"; import { CommonAnim } from "#app/data/battle-anims"; @@ -24,7 +24,8 @@ import { frenzyMissFunc, HealStatusEffectAttr, MoveFlags, - PreMoveMessageAttr + PreMoveMessageAttr, + PreUseInterruptAttr, } from "#app/data/move"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; @@ -42,7 +43,7 @@ import { MoveChargePhase } from "#app/phases/move-charge-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { BooleanHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -293,7 +294,18 @@ export class MovePhase extends BattlePhase { } } - this.showMoveText(); + let success: boolean = true; + // Check if there are any attributes that can interrupt the move, overriding the fail message. + for (const move of this.move.getMove().getAttrs(PreUseInterruptAttr)) { + if (move.apply(this.pokemon, targets[0], this.move.getMove())) { + success = false; + break; + } + } + + if (success) { + this.showMoveText(); + } if (moveQueue.length > 0) { // Using .shift here clears out two turn moves once they've been used @@ -329,11 +341,14 @@ export class MovePhase extends BattlePhase { * Move conditions assume the move has a single target * TODO: is this sustainable? */ - const passesConditions = move.applyConditions(this.pokemon, targets[0], move); - const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); - const failedDueToTerrain: boolean = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + let failedDueToTerrain: boolean = false; + if (success) { + const passesConditions = move.applyConditions(this.pokemon, targets[0], move); + const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); + failedDueToTerrain = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + success = passesConditions && !failedDueToWeather && !failedDueToTerrain; + } - const success = passesConditions && !failedDueToWeather && !failedDueToTerrain; // Update the battle's "last move" pointer, unless we're currently mimicking a move. if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { @@ -360,9 +375,8 @@ export class MovePhase extends BattlePhase { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); let failedText: string | undefined; - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); - if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { @@ -398,7 +412,7 @@ export class MovePhase extends BattlePhase { } else { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); this.showMoveText(); this.showFailedText(failureMessage ?? undefined); @@ -566,7 +580,7 @@ export class MovePhase extends BattlePhase { applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } - public showFailedText(failedText?: string): void { - globalScene.queueMessage(failedText ?? i18next.t("battle:attackFailed")); + public showFailedText(failedText: string = i18next.t("battle:attackFailed")): void { + globalScene.queueMessage(failedText); } } diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts index 352e3b60aa4..44d9c92cac1 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/src/test/moves/focus_punch.test.ts @@ -7,8 +7,9 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; +import i18next from "i18next"; 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 - Focus Punch", () => { @@ -41,7 +42,7 @@ describe("Moves - Focus Punch", () => { it( "should deal damage at the end of turn if uninterrupted", async () => { - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -68,7 +69,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -95,7 +96,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.SPORE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -119,7 +120,7 @@ describe("Moves - Focus Punch", () => { /** Guarantee a Trainer battle with multiple enemy Pokemon */ game.override.startingWave(25); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); game.forceEnemyToSwitch(); game.move.select(Moves.FOCUS_PUNCH); @@ -130,4 +131,15 @@ describe("Moves - Focus Punch", () => { expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); } ); + it("should replace the 'but it failed' text when the user gets hit", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + game.move.select(Moves.FOCUS_PUNCH); + await game.phaseInterceptor.to("MoveEndPhase", true); + await game.phaseInterceptor.to("MessagePhase", false); + const consoleSpy = vi.spyOn(console, "log"); + await game.phaseInterceptor.to("MoveEndPhase", true); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus")); + }); }); From b1b71dbd6d222fa3fce7e76d3b05c0a7636741a7 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:37:52 -0600 Subject: [PATCH 078/171] [Test] Fix annoying BBCodeText error messages in tests (#5395) --- src/test/utils/gameWrapper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index 3ba9cae3c8d..e8addcfc1d9 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -15,6 +15,7 @@ import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { vi } from "vitest"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import InputManager = Phaser.Input.InputManager; @@ -33,7 +34,8 @@ Object.defineProperty(window, "console", { value: mockConsoleLog(false), }); - +BBCodeText.prototype.destroy = () => null; +BBCodeText.prototype.resize = () => null; InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; Phaser.GameObjects.Image = MockImage; From bd288ad8627a6b3a38547058b0752178de719818 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 23 Feb 2025 00:38:11 +0100 Subject: [PATCH 079/171] [UI] Adding container to set transparency of optionSelectText (#5396) --- src/ui/abstact-option-select-ui-handler.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 10dbedd7b2f..07e43a344dd 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -35,6 +35,7 @@ const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; + protected optionSelectTextContainer: Phaser.GameObjects.Container; protected optionSelectBg: Phaser.GameObjects.NineSlice; protected optionSelectText: BBCodeText; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; @@ -53,6 +54,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected unskippedIndices: number[] = []; protected defaultTextStyle: TextStyle = TextStyle.WINDOW; + protected textContent: string; constructor(mode: Mode | null) { @@ -78,6 +80,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); + this.optionSelectTextContainer = globalScene.add.container(0, 0); + this.optionSelectContainer.add(this.optionSelectTextContainer); + this.optionSelectIcons = []; this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; @@ -123,19 +128,18 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { ); this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); - this.optionSelectContainer.add(this.optionSelectText); + this.optionSelectTextContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); this.optionSelectBg.height = this.getWindowHeight(); - this.optionSelectText.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); + this.optionSelectTextContainer.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); // Now that the container and background widths are established, we can set up the proper text restricted to visible options - this.optionSelectText.setText(optionsWithScroll.map(o => o.item + this.textContent = optionsWithScroll.map(o => o.item ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` - ).join("\n") - - ); + ).join("\n"); + this.optionSelectText.setText(this.textContent); options.forEach((option: OptionSelectItem, i: number) => { if (option.item) { @@ -184,7 +188,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { if (this.config.delay) { this.blockInput = true; - this.optionSelectText.setAlpha(0.5); + this.optionSelectTextContainer.setAlpha(0.5); this.cursorObj?.setAlpha(0.8); globalScene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); } @@ -278,7 +282,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.blockInput = false; - this.optionSelectText.setAlpha(1); + this.optionSelectTextContainer.setAlpha(1); this.cursorObj?.setAlpha(1); } From a51a504155f7e506203a4a5aafc51f2ce5c4a897 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:52:07 -0600 Subject: [PATCH 080/171] [Test] Move test folder out of src (#5398) * move test folder * Update vitest files * rename test/utils to test/testUtils * Remove stray utils/gameManager Got put back from a rebase --- .dependency-cruiser.cjs | 2 +- create-test-boilerplate.js | 8 +++--- eslint.config.js | 4 +-- .../abilities/ability_duplication.test.ts | 2 +- .../abilities/ability_timing.test.ts | 2 +- {src/test => test}/abilities/analytic.test.ts | 2 +- .../abilities/arena_trap.test.ts | 2 +- .../abilities/aroma_veil.test.ts | 2 +- .../abilities/aura_break.test.ts | 2 +- {src/test => test}/abilities/battery.test.ts | 2 +- .../abilities/battle_bond.test.ts | 2 +- .../abilities/beast_boost.test.ts | 2 +- .../test => test}/abilities/commander.test.ts | 2 +- .../abilities/competitive.test.ts | 2 +- {src/test => test}/abilities/contrary.test.ts | 2 +- .../test => test}/abilities/corrosion.test.ts | 2 +- {src/test => test}/abilities/costar.test.ts | 2 +- {src/test => test}/abilities/dancer.test.ts | 2 +- {src/test => test}/abilities/defiant.test.ts | 2 +- .../abilities/desolate-land.test.ts | 2 +- {src/test => test}/abilities/disguise.test.ts | 2 +- {src/test => test}/abilities/dry_skin.test.ts | 2 +- .../abilities/early_bird.test.ts | 2 +- .../abilities/flash_fire.test.ts | 2 +- .../abilities/flower_gift.test.ts | 2 +- {src/test => test}/abilities/forecast.test.ts | 2 +- .../abilities/friend_guard.test.ts | 2 +- .../test => test}/abilities/galvanize.test.ts | 2 +- .../abilities/good_as_gold.test.ts | 2 +- .../abilities/gorilla_tactics.test.ts | 2 +- .../abilities/gulp_missile.test.ts | 2 +- .../test => test}/abilities/heatproof.test.ts | 2 +- .../abilities/honey_gather.test.ts | 2 +- {src/test => test}/abilities/hustle.test.ts | 2 +- .../abilities/hyper_cutter.test.ts | 2 +- {src/test => test}/abilities/ice_face.test.ts | 2 +- .../abilities/illuminate.test.ts | 2 +- {src/test => test}/abilities/imposter.test.ts | 2 +- .../abilities/infiltrator.test.ts | 2 +- .../abilities/intimidate.test.ts | 4 +-- .../abilities/intrepid_sword.test.ts | 2 +- {src/test => test}/abilities/libero.test.ts | 2 +- .../abilities/magic_bounce.test.ts | 2 +- .../abilities/magic_guard.test.ts | 2 +- {src/test => test}/abilities/mimicry.test.ts | 2 +- .../abilities/mirror_armor.test.ts | 2 +- {src/test => test}/abilities/moody.test.ts | 2 +- {src/test => test}/abilities/moxie.test.ts | 2 +- {src/test => test}/abilities/mummy.test.ts | 2 +- .../abilities/mycelium_might.test.ts | 2 +- {src/test => test}/abilities/no_guard.test.ts | 2 +- .../abilities/parental_bond.test.ts | 2 +- .../abilities/pastel_veil.test.ts | 2 +- .../abilities/perish_body.test.ts | 2 +- .../abilities/power_construct.test.ts | 2 +- .../abilities/power_spot.test.ts | 2 +- {src/test => test}/abilities/protean.test.ts | 2 +- .../abilities/protosynthesis.test.ts | 2 +- .../abilities/quick_draw.test.ts | 2 +- .../test => test}/abilities/sand_spit.test.ts | 2 +- .../test => test}/abilities/sand_veil.test.ts | 2 +- .../abilities/sap_sipper.test.ts | 2 +- .../test => test}/abilities/schooling.test.ts | 2 +- .../abilities/screen_cleaner.test.ts | 2 +- .../abilities/seed_sower.test.ts | 2 +- .../abilities/serene_grace.test.ts | 2 +- .../abilities/sheer_force.test.ts | 2 +- .../abilities/shield_dust.test.ts | 2 +- .../abilities/shields_down.test.ts | 2 +- {src/test => test}/abilities/simple.test.ts | 2 +- .../abilities/speed_boost.test.ts | 2 +- {src/test => test}/abilities/stakeout.test.ts | 2 +- {src/test => test}/abilities/stall.test.ts | 2 +- .../abilities/steely_spirit.test.ts | 2 +- {src/test => test}/abilities/sturdy.test.ts | 2 +- .../abilities/supreme_overlord.test.ts | 2 +- .../abilities/sweet_veil.test.ts | 2 +- .../abilities/synchronize.test.ts | 2 +- .../abilities/tera_shell.test.ts | 2 +- {src/test => test}/abilities/trace.test.ts | 2 +- {src/test => test}/abilities/unburden.test.ts | 2 +- .../abilities/unseen_fist.test.ts | 2 +- .../abilities/volt_absorb.test.ts | 2 +- .../abilities/wandering_spirit.test.ts | 2 +- {src/test => test}/abilities/wimp_out.test.ts | 2 +- .../abilities/wind_power.test.ts | 2 +- .../abilities/wind_rider.test.ts | 2 +- .../abilities/wonder_skin.test.ts | 2 +- {src/test => test}/abilities/zen_mode.test.ts | 2 +- .../abilities/zero_to_hero.test.ts | 2 +- {src/test => test}/account.test.ts | 2 +- .../achievements/achievement.test.ts | 4 +-- .../test => test}/arena/arena_gravity.test.ts | 2 +- .../arena/grassy_terrain.test.ts | 2 +- {src/test => test}/arena/weather_fog.test.ts | 2 +- {src/test => test}/arena/weather_hail.test.ts | 2 +- .../arena/weather_sandstorm.test.ts | 2 +- .../arena/weather_strong_winds.test.ts | 2 +- {src/test => test}/battle-scene.test.ts | 2 +- .../test => test}/battle/ability_swap.test.ts | 2 +- .../test => test}/battle/battle-order.test.ts | 2 +- {src/test => test}/battle/battle.test.ts | 6 ++-- .../battle/damage_calculation.test.ts | 2 +- .../battle/double_battle.test.ts | 2 +- .../battle/inverse_battle.test.ts | 2 +- .../battle/special_battle.test.ts | 2 +- .../battlerTags/octolock.test.ts | 2 +- .../battlerTags/stockpiling.test.ts | 2 +- .../battlerTags/substitute.test.ts | 0 {src/test => test}/boss-pokemon.test.ts | 2 +- {src/test => test}/daily_mode.test.ts | 2 +- .../data/splash_messages.test.ts | 0 {src/test => test}/data/status_effect.test.ts | 4 +-- {src/test => test}/eggs/egg.test.ts | 4 +-- {src/test => test}/eggs/manaphy-egg.test.ts | 4 +-- {src/test => test}/endless_boss.test.ts | 2 +- {src/test => test}/enemy_command.test.ts | 2 +- .../test => test}/escape-calculations.test.ts | 2 +- {src/test => test}/evolution.test.ts | 2 +- {src/test => test}/field/pokemon.test.ts | 2 +- {src/test => test}/final_boss.test.ts | 2 +- {src/test => test}/fontFace.setup.ts | 0 {src/test => test}/game-mode.test.ts | 4 +-- {src/test => test}/imports.test.ts | 0 {src/test => test}/inputs/inputs.test.ts | 4 +-- {src/test => test}/internals.test.ts | 2 +- {src/test => test}/items/dire_hit.test.ts | 2 +- .../double_battle_chance_booster.test.ts | 2 +- {src/test => test}/items/eviolite.test.ts | 2 +- {src/test => test}/items/exp_booster.test.ts | 2 +- {src/test => test}/items/grip_claw.test.ts | 2 +- {src/test => test}/items/leek.test.ts | 2 +- {src/test => test}/items/leftovers.test.ts | 2 +- {src/test => test}/items/light_ball.test.ts | 2 +- {src/test => test}/items/lock_capsule.test.ts | 2 +- {src/test => test}/items/metal_powder.test.ts | 2 +- {src/test => test}/items/multi_lens.test.ts | 2 +- {src/test => test}/items/quick_powder.test.ts | 2 +- {src/test => test}/items/scope_lens.test.ts | 2 +- .../items/temp_stat_stage_booster.test.ts | 2 +- {src/test => test}/items/thick_club.test.ts | 2 +- {src/test => test}/items/toxic_orb.test.ts | 2 +- {src/test => test}/misc.test.ts | 4 +-- {src/test => test}/moves/after_you.test.ts | 2 +- .../moves/alluring_voice.test.ts | 2 +- {src/test => test}/moves/aromatherapy.test.ts | 2 +- {src/test => test}/moves/assist.test.ts | 2 +- {src/test => test}/moves/astonish.test.ts | 2 +- {src/test => test}/moves/aurora_veil.test.ts | 2 +- {src/test => test}/moves/autotomize.test.ts | 2 +- {src/test => test}/moves/baddy_bad.test.ts | 2 +- .../moves/baneful_bunker.test.ts | 2 +- {src/test => test}/moves/baton_pass.test.ts | 2 +- {src/test => test}/moves/beak_blast.test.ts | 2 +- {src/test => test}/moves/beat_up.test.ts | 2 +- {src/test => test}/moves/belly_drum.test.ts | 2 +- .../moves/burning_jealousy.test.ts | 2 +- {src/test => test}/moves/camouflage.test.ts | 2 +- .../moves/ceaseless_edge.test.ts | 2 +- .../moves/chilly_reception.test.ts | 2 +- {src/test => test}/moves/chloroblast.test.ts | 2 +- .../moves/clangorous_soul.test.ts | 2 +- {src/test => test}/moves/copycat.test.ts | 2 +- .../test => test}/moves/crafty_shield.test.ts | 2 +- {src/test => test}/moves/defog.test.ts | 2 +- {src/test => test}/moves/destiny_bond.test.ts | 2 +- .../test => test}/moves/diamond_storm.test.ts | 2 +- {src/test => test}/moves/dig.test.ts | 2 +- {src/test => test}/moves/disable.test.ts | 2 +- {src/test => test}/moves/dive.test.ts | 2 +- {src/test => test}/moves/doodle.test.ts | 2 +- {src/test => test}/moves/double_team.test.ts | 2 +- {src/test => test}/moves/dragon_cheer.test.ts | 2 +- {src/test => test}/moves/dragon_rage.test.ts | 2 +- {src/test => test}/moves/dragon_tail.test.ts | 2 +- .../moves/dynamax_cannon.test.ts | 2 +- .../test => test}/moves/effectiveness.test.ts | 2 +- {src/test => test}/moves/electrify.test.ts | 2 +- {src/test => test}/moves/electro_shot.test.ts | 2 +- {src/test => test}/moves/encore.test.ts | 2 +- {src/test => test}/moves/endure.test.ts | 2 +- {src/test => test}/moves/entrainment.test.ts | 2 +- {src/test => test}/moves/fairy_lock.test.ts | 2 +- {src/test => test}/moves/fake_out.test.ts | 2 +- {src/test => test}/moves/fell_stinger.test.ts | 2 +- {src/test => test}/moves/fillet_away.test.ts | 2 +- {src/test => test}/moves/fissure.test.ts | 2 +- {src/test => test}/moves/flame_burst.test.ts | 2 +- .../test => test}/moves/flower_shield.test.ts | 2 +- {src/test => test}/moves/fly.test.ts | 2 +- {src/test => test}/moves/focus_punch.test.ts | 2 +- {src/test => test}/moves/follow_me.test.ts | 2 +- {src/test => test}/moves/foresight.test.ts | 2 +- .../test => test}/moves/forests_curse.test.ts | 2 +- {src/test => test}/moves/freeze_dry.test.ts | 2 +- {src/test => test}/moves/freezy_frost.test.ts | 2 +- {src/test => test}/moves/fusion_bolt.test.ts | 2 +- {src/test => test}/moves/fusion_flare.test.ts | 2 +- .../moves/fusion_flare_bolt.test.ts | 2 +- {src/test => test}/moves/future_sight.test.ts | 2 +- {src/test => test}/moves/gastro_acid.test.ts | 2 +- {src/test => test}/moves/geomancy.test.ts | 2 +- .../moves/gigaton_hammer.test.ts | 2 +- {src/test => test}/moves/glaive_rush.test.ts | 2 +- {src/test => test}/moves/growth.test.ts | 2 +- {src/test => test}/moves/grudge.test.ts | 2 +- {src/test => test}/moves/guard_split.test.ts | 2 +- {src/test => test}/moves/guard_swap.test.ts | 2 +- {src/test => test}/moves/hard_press.test.ts | 2 +- {src/test => test}/moves/haze.test.ts | 2 +- {src/test => test}/moves/heal_bell.test.ts | 2 +- {src/test => test}/moves/heal_block.test.ts | 2 +- {src/test => test}/moves/heart_swap.test.ts | 2 +- {src/test => test}/moves/hyper_beam.test.ts | 2 +- {src/test => test}/moves/imprison.test.ts | 2 +- {src/test => test}/moves/instruct.test.ts | 2 +- {src/test => test}/moves/jaw_lock.test.ts | 2 +- {src/test => test}/moves/lash_out.test.ts | 2 +- .../test => test}/moves/last_respects.test.ts | 2 +- {src/test => test}/moves/light_screen.test.ts | 2 +- {src/test => test}/moves/lucky_chant.test.ts | 2 +- .../moves/lunar_blessing.test.ts | 2 +- {src/test => test}/moves/lunar_dance.test.ts | 2 +- {src/test => test}/moves/magic_coat.test.ts | 2 +- {src/test => test}/moves/magnet_rise.test.ts | 2 +- {src/test => test}/moves/make_it_rain.test.ts | 2 +- {src/test => test}/moves/mat_block.test.ts | 2 +- {src/test => test}/moves/metal_burst.test.ts | 2 +- {src/test => test}/moves/metronome.test.ts | 2 +- {src/test => test}/moves/miracle_eye.test.ts | 2 +- {src/test => test}/moves/mirror_move.test.ts | 2 +- {src/test => test}/moves/mist.test.ts | 2 +- .../moves/moongeist_beam.test.ts | 2 +- {src/test => test}/moves/multi_target.test.ts | 2 +- {src/test => test}/moves/nightmare.test.ts | 2 +- {src/test => test}/moves/obstruct.test.ts | 2 +- {src/test => test}/moves/octolock.test.ts | 2 +- {src/test => test}/moves/order_up.test.ts | 2 +- {src/test => test}/moves/parting_shot.test.ts | 2 +- {src/test => test}/moves/plasma_fists.test.ts | 2 +- {src/test => test}/moves/pledge_moves.test.ts | 2 +- {src/test => test}/moves/powder.test.ts | 2 +- {src/test => test}/moves/power_shift.test.ts | 2 +- {src/test => test}/moves/power_split.test.ts | 2 +- {src/test => test}/moves/power_swap.test.ts | 2 +- {src/test => test}/moves/power_trick.test.ts | 2 +- {src/test => test}/moves/protect.test.ts | 2 +- {src/test => test}/moves/psycho_shift.test.ts | 2 +- {src/test => test}/moves/purify.test.ts | 2 +- {src/test => test}/moves/quash.test.ts | 2 +- {src/test => test}/moves/quick_guard.test.ts | 2 +- {src/test => test}/moves/rage_fist.test.ts | 2 +- {src/test => test}/moves/rage_powder.test.ts | 2 +- {src/test => test}/moves/reflect.test.ts | 2 +- {src/test => test}/moves/reflect_type.test.ts | 2 +- {src/test => test}/moves/relic_song.test.ts | 2 +- {src/test => test}/moves/retaliate.test.ts | 2 +- .../moves/revival_blessing.test.ts | 2 +- {src/test => test}/moves/role_play.test.ts | 2 +- {src/test => test}/moves/rollout.test.ts | 2 +- {src/test => test}/moves/roost.test.ts | 2 +- {src/test => test}/moves/round.test.ts | 2 +- {src/test => test}/moves/safeguard.test.ts | 2 +- {src/test => test}/moves/scale_shot.test.ts | 2 +- {src/test => test}/moves/secret_power.test.ts | 2 +- {src/test => test}/moves/shed_tail.test.ts | 2 +- .../moves/shell_side_arm.test.ts | 2 +- {src/test => test}/moves/shell_trap.test.ts | 2 +- {src/test => test}/moves/simple_beam.test.ts | 2 +- {src/test => test}/moves/sketch.test.ts | 2 +- {src/test => test}/moves/skill_swap.test.ts | 2 +- {src/test => test}/moves/sleep_talk.test.ts | 2 +- {src/test => test}/moves/solar_beam.test.ts | 2 +- .../test => test}/moves/sparkly_swirl.test.ts | 2 +- .../moves/spectral_thief.test.ts | 2 +- {src/test => test}/moves/speed_swap.test.ts | 2 +- {src/test => test}/moves/spikes.test.ts | 2 +- {src/test => test}/moves/spit_up.test.ts | 2 +- {src/test => test}/moves/spotlight.test.ts | 2 +- {src/test => test}/moves/steamroller.test.ts | 2 +- {src/test => test}/moves/stockpile.test.ts | 2 +- {src/test => test}/moves/substitute.test.ts | 2 +- {src/test => test}/moves/swallow.test.ts | 2 +- {src/test => test}/moves/syrup_bomb.test.ts | 2 +- {src/test => test}/moves/tackle.test.ts | 2 +- {src/test => test}/moves/tail_whip.test.ts | 2 +- {src/test => test}/moves/tailwind.test.ts | 2 +- {src/test => test}/moves/tar_shot.test.ts | 2 +- {src/test => test}/moves/taunt.test.ts | 2 +- {src/test => test}/moves/telekinesis.test.ts | 2 +- {src/test => test}/moves/tera_blast.test.ts | 2 +- .../moves/tera_starstorm.test.ts | 2 +- .../moves/thousand_arrows.test.ts | 2 +- {src/test => test}/moves/throat_chop.test.ts | 2 +- {src/test => test}/moves/thunder_wave.test.ts | 2 +- {src/test => test}/moves/tidy_up.test.ts | 2 +- {src/test => test}/moves/torment.test.ts | 2 +- {src/test => test}/moves/toxic.test.ts | 2 +- {src/test => test}/moves/toxic_spikes.test.ts | 2 +- {src/test => test}/moves/transform.test.ts | 2 +- .../moves/trick_or_treat.test.ts | 2 +- .../test => test}/moves/triple_arrows.test.ts | 2 +- {src/test => test}/moves/u_turn.test.ts | 2 +- {src/test => test}/moves/upper_hand.test.ts | 2 +- {src/test => test}/moves/whirlwind.test.ts | 2 +- {src/test => test}/moves/wide_guard.test.ts | 2 +- {src/test => test}/moves/will_o_wisp.test.ts | 2 +- .../mystery-encounter/encounter-test-utils.ts | 2 +- .../a-trainers-test-encounter.test.ts | 4 +-- .../absolute-avarice-encounter.test.ts | 2 +- ...an-offer-you-cant-refuse-encounter.test.ts | 4 +-- .../berries-abound-encounter.test.ts | 4 +-- .../bug-type-superfan-encounter.test.ts | 4 +-- .../clowning-around-encounter.test.ts | 4 +-- .../dancing-lessons-encounter.test.ts | 2 +- .../encounters/delibirdy-encounter.test.ts | 2 +- .../department-store-sale-encounter.test.ts | 2 +- .../encounters/field-trip-encounter.test.ts | 2 +- .../fiery-fallout-encounter.test.ts | 4 +-- .../fight-or-flight-encounter.test.ts | 4 +-- .../fun-and-games-encounter.test.ts | 4 +-- .../global-trade-system-encounter.test.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 4 +-- .../mysterious-challengers-encounter.test.ts | 4 +-- .../encounters/part-timer-encounter.test.ts | 2 +- .../encounters/safari-zone.test.ts | 4 +-- .../teleporting-hijinks-encounter.test.ts | 4 +-- .../the-expert-breeder-encounter.test.ts | 4 +-- .../the-pokemon-salesman-encounter.test.ts | 4 +-- .../the-strong-stuff-encounter.test.ts | 4 +-- .../the-winstrate-challenge-encounter.test.ts | 4 +-- .../trash-to-treasure-encounter.test.ts | 4 +-- .../uncommon-breed-encounter.test.ts | 4 +-- .../encounters/weird-dream-encounter.test.ts | 4 +-- .../mystery-encounter-utils.test.ts | 4 +-- .../mystery-encounter.test.ts | 2 +- .../phases/form-change-phase.test.ts | 2 +- .../phases/frenzy-move-reset.test.ts | 2 +- .../phases/game-over-phase.test.ts | 2 +- .../phases/learn-move-phase.test.ts | 2 +- .../phases/mystery-encounter-phase.test.ts | 2 +- {src/test => test}/phases/phases.test.ts | 2 +- .../phases/select-modifier-phase.test.ts | 4 +-- .../plugins/api/pokerogue-account-api.test.ts | 2 +- .../plugins/api/pokerogue-admin-api.test.ts | 2 +- .../plugins/api/pokerogue-api.test.ts | 2 +- .../plugins/api/pokerogue-daily-api.test.ts | 2 +- .../api/pokerogue-savedata-api.test.ts | 2 +- .../pokerogue-session-savedata-api.test.ts | 2 +- .../api/pokerogue-system-savedata-api.test.ts | 2 +- {src/test => test}/pre.test.ts | 0 {src/test => test}/reload.test.ts | 4 +-- .../settingMenu/helpers/inGameManip.ts | 0 .../settingMenu/helpers/menuManip.ts | 13 ++++++++- .../settingMenu/rebinding_setting.test.ts | 0 .../sprites/pokemonSprite.test.ts | 2 +- {src/test => test}/sprites/spritesUtils.ts | 0 {src/test => test}/system/game_data.test.ts | 4 +-- .../testUtils}/TextInterceptor.ts | 0 .../testUtils}/errorInterceptor.ts | 0 .../utils => test/testUtils}/fakeMobile.html | 0 .../utils => test/testUtils}/gameManager.ts | 28 +++++++++---------- .../testUtils}/gameManagerUtils.ts | 0 .../utils => test/testUtils}/gameWrapper.ts | 18 ++++++------ .../testUtils}/helpers/challengeModeHelper.ts | 0 .../testUtils}/helpers/classicModeHelper.ts | 0 .../testUtils}/helpers/dailyModeHelper.ts | 0 .../testUtils}/helpers/gameManagerHelper.ts | 0 .../testUtils}/helpers/modifiersHelper.ts | 0 .../testUtils}/helpers/moveHelper.ts | 4 +-- .../testUtils}/helpers/overridesHelper.ts | 0 .../testUtils}/helpers/reloadHelper.ts | 0 .../testUtils}/helpers/settingsHelper.ts | 0 .../utils => test/testUtils}/inputsHandler.ts | 4 +-- .../testUtils}/mocks/mockClock.ts | 0 .../testUtils}/mocks/mockConsoleLog.ts | 0 .../testUtils}/mocks/mockFetch.ts | 0 .../testUtils}/mocks/mockGameObject.ts | 0 .../testUtils}/mocks/mockGameObjectCreator.ts | 0 .../testUtils}/mocks/mockLoader.ts | 0 .../testUtils}/mocks/mockLocalStorage.ts | 0 .../testUtils}/mocks/mockTextureManager.ts | 16 +++++------ .../testUtils}/mocks/mockTimedEventManager.ts | 0 .../testUtils}/mocks/mockVideoGameObject.ts | 0 .../mocks/mocksContainer/mockContainer.ts | 2 +- .../mocks/mocksContainer/mockGraphics.ts | 0 .../mocks/mocksContainer/mockImage.ts | 2 +- .../mocks/mocksContainer/mockNineslice.ts | 2 +- .../mocks/mocksContainer/mockPolygon.ts | 2 +- .../mocks/mocksContainer/mockRectangle.ts | 0 .../mocks/mocksContainer/mockSprite.ts | 0 .../mocks/mocksContainer/mockText.ts | 0 .../mocks/mocksContainer/mockTexture.ts | 2 +- .../testUtils}/phaseInterceptor.ts | 2 +- .../testUtils}/saves/data_new.prsv | 0 .../testUtils}/saves/everything.prsv | 0 .../utils => test/testUtils}/testUtils.ts | 0 {src/test => test}/ui/battle_info.test.ts | 2 +- {src/test => test}/ui/starter-select.test.ts | 20 ++++++------- {src/test => test}/ui/transfer-item.test.ts | 2 +- {src/test => test}/ui/type-hints.test.ts | 4 +-- {src/test => test}/vitest.setup.ts | 2 +- tsconfig.json | 6 ++-- vitest.config.ts | 6 ++-- vitest.workspace.ts | 2 +- 405 files changed, 461 insertions(+), 450 deletions(-) rename {src/test => test}/abilities/ability_duplication.test.ts (96%) rename {src/test => test}/abilities/ability_timing.test.ts (96%) rename {src/test => test}/abilities/analytic.test.ts (98%) rename {src/test => test}/abilities/arena_trap.test.ts (98%) rename {src/test => test}/abilities/aroma_veil.test.ts (97%) rename {src/test => test}/abilities/aura_break.test.ts (97%) rename {src/test => test}/abilities/battery.test.ts (97%) rename {src/test => test}/abilities/battle_bond.test.ts (98%) rename {src/test => test}/abilities/beast_boost.test.ts (98%) rename {src/test => test}/abilities/commander.test.ts (99%) rename {src/test => test}/abilities/competitive.test.ts (97%) rename {src/test => test}/abilities/contrary.test.ts (97%) rename {src/test => test}/abilities/corrosion.test.ts (96%) rename {src/test => test}/abilities/costar.test.ts (97%) rename {src/test => test}/abilities/dancer.test.ts (98%) rename {src/test => test}/abilities/defiant.test.ts (97%) rename {src/test => test}/abilities/desolate-land.test.ts (98%) rename {src/test => test}/abilities/disguise.test.ts (99%) rename {src/test => test}/abilities/dry_skin.test.ts (98%) rename {src/test => test}/abilities/early_bird.test.ts (98%) rename {src/test => test}/abilities/flash_fire.test.ts (99%) rename {src/test => test}/abilities/flower_gift.test.ts (99%) rename {src/test => test}/abilities/forecast.test.ts (99%) rename {src/test => test}/abilities/friend_guard.test.ts (98%) rename {src/test => test}/abilities/galvanize.test.ts (98%) rename {src/test => test}/abilities/good_as_gold.test.ts (99%) rename {src/test => test}/abilities/gorilla_tactics.test.ts (98%) rename {src/test => test}/abilities/gulp_missile.test.ts (99%) rename {src/test => test}/abilities/heatproof.test.ts (97%) rename {src/test => test}/abilities/honey_gather.test.ts (97%) rename {src/test => test}/abilities/hustle.test.ts (98%) rename {src/test => test}/abilities/hyper_cutter.test.ts (96%) rename {src/test => test}/abilities/ice_face.test.ts (99%) rename {src/test => test}/abilities/illuminate.test.ts (96%) rename {src/test => test}/abilities/imposter.test.ts (98%) rename {src/test => test}/abilities/infiltrator.test.ts (98%) rename {src/test => test}/abilities/intimidate.test.ts (97%) rename {src/test => test}/abilities/intrepid_sword.test.ts (95%) rename {src/test => test}/abilities/libero.test.ts (99%) rename {src/test => test}/abilities/magic_bounce.test.ts (99%) rename {src/test => test}/abilities/magic_guard.test.ts (99%) rename {src/test => test}/abilities/mimicry.test.ts (98%) rename {src/test => test}/abilities/mirror_armor.test.ts (99%) rename {src/test => test}/abilities/moody.test.ts (98%) rename {src/test => test}/abilities/moxie.test.ts (97%) rename {src/test => test}/abilities/mummy.test.ts (96%) rename {src/test => test}/abilities/mycelium_might.test.ts (98%) rename {src/test => test}/abilities/no_guard.test.ts (97%) rename {src/test => test}/abilities/parental_bond.test.ts (99%) rename {src/test => test}/abilities/pastel_veil.test.ts (97%) rename {src/test => test}/abilities/perish_body.test.ts (98%) rename {src/test => test}/abilities/power_construct.test.ts (98%) rename {src/test => test}/abilities/power_spot.test.ts (97%) rename {src/test => test}/abilities/protean.test.ts (99%) rename {src/test => test}/abilities/protosynthesis.test.ts (97%) rename {src/test => test}/abilities/quick_draw.test.ts (98%) rename {src/test => test}/abilities/sand_spit.test.ts (97%) rename {src/test => test}/abilities/sand_veil.test.ts (97%) rename {src/test => test}/abilities/sap_sipper.test.ts (98%) rename {src/test => test}/abilities/schooling.test.ts (97%) rename {src/test => test}/abilities/screen_cleaner.test.ts (97%) rename {src/test => test}/abilities/seed_sower.test.ts (97%) rename {src/test => test}/abilities/serene_grace.test.ts (96%) rename {src/test => test}/abilities/sheer_force.test.ts (99%) rename {src/test => test}/abilities/shield_dust.test.ts (97%) rename {src/test => test}/abilities/shields_down.test.ts (99%) rename {src/test => test}/abilities/simple.test.ts (95%) rename {src/test => test}/abilities/speed_boost.test.ts (98%) rename {src/test => test}/abilities/stakeout.test.ts (97%) rename {src/test => test}/abilities/stall.test.ts (98%) rename {src/test => test}/abilities/steely_spirit.test.ts (98%) rename {src/test => test}/abilities/sturdy.test.ts (97%) rename {src/test => test}/abilities/supreme_overlord.test.ts (99%) rename {src/test => test}/abilities/sweet_veil.test.ts (98%) rename {src/test => test}/abilities/synchronize.test.ts (98%) rename {src/test => test}/abilities/tera_shell.test.ts (98%) rename {src/test => test}/abilities/trace.test.ts (96%) rename {src/test => test}/abilities/unburden.test.ts (99%) rename {src/test => test}/abilities/unseen_fist.test.ts (98%) rename {src/test => test}/abilities/volt_absorb.test.ts (98%) rename {src/test => test}/abilities/wandering_spirit.test.ts (97%) rename {src/test => test}/abilities/wimp_out.test.ts (99%) rename {src/test => test}/abilities/wind_power.test.ts (98%) rename {src/test => test}/abilities/wind_rider.test.ts (98%) rename {src/test => test}/abilities/wonder_skin.test.ts (97%) rename {src/test => test}/abilities/zen_mode.test.ts (98%) rename {src/test => test}/abilities/zero_to_hero.test.ts (98%) rename {src/test => test}/account.test.ts (99%) rename {src/test => test}/achievements/achievement.test.ts (99%) rename {src/test => test}/arena/arena_gravity.test.ts (98%) rename {src/test => test}/arena/grassy_terrain.test.ts (97%) rename {src/test => test}/arena/weather_fog.test.ts (96%) rename {src/test => test}/arena/weather_hail.test.ts (97%) rename {src/test => test}/arena/weather_sandstorm.test.ts (98%) rename {src/test => test}/arena/weather_strong_winds.test.ts (98%) rename {src/test => test}/battle-scene.test.ts (93%) rename {src/test => test}/battle/ability_swap.test.ts (97%) rename {src/test => test}/battle/battle-order.test.ts (99%) rename {src/test => test}/battle/battle.test.ts (98%) rename {src/test => test}/battle/damage_calculation.test.ts (98%) rename {src/test => test}/battle/double_battle.test.ts (98%) rename {src/test => test}/battle/inverse_battle.test.ts (99%) rename {src/test => test}/battle/special_battle.test.ts (98%) rename {src/test => test}/battlerTags/octolock.test.ts (96%) rename {src/test => test}/battlerTags/stockpiling.test.ts (99%) rename {src/test => test}/battlerTags/substitute.test.ts (100%) rename {src/test => test}/boss-pokemon.test.ts (99%) rename {src/test => test}/daily_mode.test.ts (98%) rename {src/test => test}/data/splash_messages.test.ts (100%) rename {src/test => test}/data/status_effect.test.ts (99%) rename {src/test => test}/eggs/egg.test.ts (99%) rename {src/test => test}/eggs/manaphy-egg.test.ts (96%) rename {src/test => test}/endless_boss.test.ts (98%) rename {src/test => test}/enemy_command.test.ts (98%) rename {src/test => test}/escape-calculations.test.ts (99%) rename {src/test => test}/evolution.test.ts (99%) rename {src/test => test}/field/pokemon.test.ts (99%) rename {src/test => test}/final_boss.test.ts (99%) rename {src/test => test}/fontFace.setup.ts (100%) rename {src/test => test}/game-mode.test.ts (95%) rename {src/test => test}/imports.test.ts (100%) rename {src/test => test}/inputs/inputs.test.ts (96%) rename {src/test => test}/internals.test.ts (95%) rename {src/test => test}/items/dire_hit.test.ts (98%) rename {src/test => test}/items/double_battle_chance_booster.test.ts (98%) rename {src/test => test}/items/eviolite.test.ts (99%) rename {src/test => test}/items/exp_booster.test.ts (95%) rename {src/test => test}/items/grip_claw.test.ts (98%) rename {src/test => test}/items/leek.test.ts (98%) rename {src/test => test}/items/leftovers.test.ts (97%) rename {src/test => test}/items/light_ball.test.ts (99%) rename {src/test => test}/items/lock_capsule.test.ts (96%) rename {src/test => test}/items/metal_powder.test.ts (99%) rename {src/test => test}/items/multi_lens.test.ts (99%) rename {src/test => test}/items/quick_powder.test.ts (99%) rename {src/test => test}/items/scope_lens.test.ts (95%) rename {src/test => test}/items/temp_stat_stage_booster.test.ts (99%) rename {src/test => test}/items/thick_club.test.ts (99%) rename {src/test => test}/items/toxic_orb.test.ts (96%) rename {src/test => test}/misc.test.ts (95%) rename {src/test => test}/moves/after_you.test.ts (97%) rename {src/test => test}/moves/alluring_voice.test.ts (96%) rename {src/test => test}/moves/aromatherapy.test.ts (98%) rename {src/test => test}/moves/assist.test.ts (98%) rename {src/test => test}/moves/astonish.test.ts (97%) rename {src/test => test}/moves/aurora_veil.test.ts (98%) rename {src/test => test}/moves/autotomize.test.ts (98%) rename {src/test => test}/moves/baddy_bad.test.ts (95%) rename {src/test => test}/moves/baneful_bunker.test.ts (98%) rename {src/test => test}/moves/baton_pass.test.ts (98%) rename {src/test => test}/moves/beak_blast.test.ts (98%) rename {src/test => test}/moves/beat_up.test.ts (97%) rename {src/test => test}/moves/belly_drum.test.ts (98%) rename {src/test => test}/moves/burning_jealousy.test.ts (98%) rename {src/test => test}/moves/camouflage.test.ts (96%) rename {src/test => test}/moves/ceaseless_edge.test.ts (98%) rename {src/test => test}/moves/chilly_reception.test.ts (98%) rename {src/test => test}/moves/chloroblast.test.ts (95%) rename {src/test => test}/moves/clangorous_soul.test.ts (98%) rename {src/test => test}/moves/copycat.test.ts (98%) rename {src/test => test}/moves/crafty_shield.test.ts (98%) rename {src/test => test}/moves/defog.test.ts (97%) rename {src/test => test}/moves/destiny_bond.test.ts (99%) rename {src/test => test}/moves/diamond_storm.test.ts (96%) rename {src/test => test}/moves/dig.test.ts (98%) rename {src/test => test}/moves/disable.test.ts (98%) rename {src/test => test}/moves/dive.test.ts (98%) rename {src/test => test}/moves/doodle.test.ts (97%) rename {src/test => test}/moves/double_team.test.ts (96%) rename {src/test => test}/moves/dragon_cheer.test.ts (98%) rename {src/test => test}/moves/dragon_rage.test.ts (98%) rename {src/test => test}/moves/dragon_tail.test.ts (99%) rename {src/test => test}/moves/dynamax_cannon.test.ts (99%) rename {src/test => test}/moves/effectiveness.test.ts (98%) rename {src/test => test}/moves/electrify.test.ts (97%) rename {src/test => test}/moves/electro_shot.test.ts (98%) rename {src/test => test}/moves/encore.test.ts (98%) rename {src/test => test}/moves/endure.test.ts (97%) rename {src/test => test}/moves/entrainment.test.ts (96%) rename {src/test => test}/moves/fairy_lock.test.ts (99%) rename {src/test => test}/moves/fake_out.test.ts (98%) rename {src/test => test}/moves/fell_stinger.test.ts (99%) rename {src/test => test}/moves/fillet_away.test.ts (98%) rename {src/test => test}/moves/fissure.test.ts (97%) rename {src/test => test}/moves/flame_burst.test.ts (98%) rename {src/test => test}/moves/flower_shield.test.ts (98%) rename {src/test => test}/moves/fly.test.ts (98%) rename {src/test => test}/moves/focus_punch.test.ts (98%) rename {src/test => test}/moves/follow_me.test.ts (98%) rename {src/test => test}/moves/foresight.test.ts (97%) rename {src/test => test}/moves/forests_curse.test.ts (96%) rename {src/test => test}/moves/freeze_dry.test.ts (99%) rename {src/test => test}/moves/freezy_frost.test.ts (98%) rename {src/test => test}/moves/fusion_bolt.test.ts (96%) rename {src/test => test}/moves/fusion_flare.test.ts (96%) rename {src/test => test}/moves/fusion_flare_bolt.test.ts (99%) rename {src/test => test}/moves/future_sight.test.ts (95%) rename {src/test => test}/moves/gastro_acid.test.ts (97%) rename {src/test => test}/moves/geomancy.test.ts (97%) rename {src/test => test}/moves/gigaton_hammer.test.ts (97%) rename {src/test => test}/moves/glaive_rush.test.ts (98%) rename {src/test => test}/moves/growth.test.ts (96%) rename {src/test => test}/moves/grudge.test.ts (98%) rename {src/test => test}/moves/guard_split.test.ts (97%) rename {src/test => test}/moves/guard_swap.test.ts (97%) rename {src/test => test}/moves/hard_press.test.ts (97%) rename {src/test => test}/moves/haze.test.ts (97%) rename {src/test => test}/moves/heal_bell.test.ts (98%) rename {src/test => test}/moves/heal_block.test.ts (98%) rename {src/test => test}/moves/heart_swap.test.ts (96%) rename {src/test => test}/moves/hyper_beam.test.ts (97%) rename {src/test => test}/moves/imprison.test.ts (98%) rename {src/test => test}/moves/instruct.test.ts (99%) rename {src/test => test}/moves/jaw_lock.test.ts (99%) rename {src/test => test}/moves/lash_out.test.ts (96%) rename {src/test => test}/moves/last_respects.test.ts (99%) rename {src/test => test}/moves/light_screen.test.ts (98%) rename {src/test => test}/moves/lucky_chant.test.ts (98%) rename {src/test => test}/moves/lunar_blessing.test.ts (97%) rename {src/test => test}/moves/lunar_dance.test.ts (98%) rename {src/test => test}/moves/magic_coat.test.ts (99%) rename {src/test => test}/moves/magnet_rise.test.ts (97%) rename {src/test => test}/moves/make_it_rain.test.ts (98%) rename {src/test => test}/moves/mat_block.test.ts (98%) rename {src/test => test}/moves/metal_burst.test.ts (98%) rename {src/test => test}/moves/metronome.test.ts (98%) rename {src/test => test}/moves/miracle_eye.test.ts (96%) rename {src/test => test}/moves/mirror_move.test.ts (98%) rename {src/test => test}/moves/mist.test.ts (96%) rename {src/test => test}/moves/moongeist_beam.test.ts (97%) rename {src/test => test}/moves/multi_target.test.ts (98%) rename {src/test => test}/moves/nightmare.test.ts (96%) rename {src/test => test}/moves/obstruct.test.ts (98%) rename {src/test => test}/moves/octolock.test.ts (98%) rename {src/test => test}/moves/order_up.test.ts (98%) rename {src/test => test}/moves/parting_shot.test.ts (99%) rename {src/test => test}/moves/plasma_fists.test.ts (98%) rename {src/test => test}/moves/pledge_moves.test.ts (99%) rename {src/test => test}/moves/powder.test.ts (99%) rename {src/test => test}/moves/power_shift.test.ts (97%) rename {src/test => test}/moves/power_split.test.ts (97%) rename {src/test => test}/moves/power_swap.test.ts (97%) rename {src/test => test}/moves/power_trick.test.ts (98%) rename {src/test => test}/moves/protect.test.ts (98%) rename {src/test => test}/moves/psycho_shift.test.ts (96%) rename {src/test => test}/moves/purify.test.ts (97%) rename {src/test => test}/moves/quash.test.ts (98%) rename {src/test => test}/moves/quick_guard.test.ts (98%) rename {src/test => test}/moves/rage_fist.test.ts (98%) rename {src/test => test}/moves/rage_powder.test.ts (97%) rename {src/test => test}/moves/reflect.test.ts (98%) rename {src/test => test}/moves/reflect_type.test.ts (97%) rename {src/test => test}/moves/relic_song.test.ts (97%) rename {src/test => test}/moves/retaliate.test.ts (96%) rename {src/test => test}/moves/revival_blessing.test.ts (98%) rename {src/test => test}/moves/role_play.test.ts (96%) rename {src/test => test}/moves/rollout.test.ts (98%) rename {src/test => test}/moves/roost.test.ts (99%) rename {src/test => test}/moves/round.test.ts (97%) rename {src/test => test}/moves/safeguard.test.ts (98%) rename {src/test => test}/moves/scale_shot.test.ts (98%) rename {src/test => test}/moves/secret_power.test.ts (98%) rename {src/test => test}/moves/shed_tail.test.ts (97%) rename {src/test => test}/moves/shell_side_arm.test.ts (97%) rename {src/test => test}/moves/shell_trap.test.ts (98%) rename {src/test => test}/moves/simple_beam.test.ts (95%) rename {src/test => test}/moves/sketch.test.ts (98%) rename {src/test => test}/moves/skill_swap.test.ts (96%) rename {src/test => test}/moves/sleep_talk.test.ts (97%) rename {src/test => test}/moves/solar_beam.test.ts (98%) rename {src/test => test}/moves/sparkly_swirl.test.ts (98%) rename {src/test => test}/moves/spectral_thief.test.ts (99%) rename {src/test => test}/moves/speed_swap.test.ts (96%) rename {src/test => test}/moves/spikes.test.ts (97%) rename {src/test => test}/moves/spit_up.test.ts (99%) rename {src/test => test}/moves/spotlight.test.ts (97%) rename {src/test => test}/moves/steamroller.test.ts (97%) rename {src/test => test}/moves/stockpile.test.ts (98%) rename {src/test => test}/moves/substitute.test.ts (99%) rename {src/test => test}/moves/swallow.test.ts (99%) rename {src/test => test}/moves/syrup_bomb.test.ts (98%) rename {src/test => test}/moves/tackle.test.ts (97%) rename {src/test => test}/moves/tail_whip.test.ts (96%) rename {src/test => test}/moves/tailwind.test.ts (98%) rename {src/test => test}/moves/tar_shot.test.ts (98%) rename {src/test => test}/moves/taunt.test.ts (96%) rename {src/test => test}/moves/telekinesis.test.ts (99%) rename {src/test => test}/moves/tera_blast.test.ts (96%) rename {src/test => test}/moves/tera_starstorm.test.ts (98%) rename {src/test => test}/moves/thousand_arrows.test.ts (98%) rename {src/test => test}/moves/throat_chop.test.ts (96%) rename {src/test => test}/moves/thunder_wave.test.ts (98%) rename {src/test => test}/moves/tidy_up.test.ts (98%) rename {src/test => test}/moves/torment.test.ts (97%) rename {src/test => test}/moves/toxic.test.ts (98%) rename {src/test => test}/moves/toxic_spikes.test.ts (98%) rename {src/test => test}/moves/transform.test.ts (98%) rename {src/test => test}/moves/trick_or_treat.test.ts (96%) rename {src/test => test}/moves/triple_arrows.test.ts (97%) rename {src/test => test}/moves/u_turn.test.ts (98%) rename {src/test => test}/moves/upper_hand.test.ts (98%) rename {src/test => test}/moves/whirlwind.test.ts (99%) rename {src/test => test}/moves/wide_guard.test.ts (98%) rename {src/test => test}/moves/will_o_wisp.test.ts (96%) rename {src/test => test}/mystery-encounter/encounter-test-utils.ts (99%) rename {src/test => test}/mystery-encounter/encounters/a-trainers-test-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/absolute-avarice-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/berries-abound-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/clowning-around-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/dancing-lessons-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/delibirdy-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/department-store-sale-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/field-trip-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/fiery-fallout-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fight-or-flight-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fun-and-games-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/global-trade-system-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/lost-at-sea-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/part-timer-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/safari-zone.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/uncommon-breed-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/weird-dream-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter-utils.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter.test.ts (96%) rename {src/test => test}/phases/form-change-phase.test.ts (97%) rename {src/test => test}/phases/frenzy-move-reset.test.ts (97%) rename {src/test => test}/phases/game-over-phase.test.ts (98%) rename {src/test => test}/phases/learn-move-phase.test.ts (99%) rename {src/test => test}/phases/mystery-encounter-phase.test.ts (98%) rename {src/test => test}/phases/phases.test.ts (96%) rename {src/test => test}/phases/select-modifier-phase.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-account-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-admin-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-daily-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-savedata-api.test.ts (96%) rename {src/test => test}/plugins/api/pokerogue-session-savedata-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-system-savedata-api.test.ts (98%) rename {src/test => test}/pre.test.ts (100%) rename {src/test => test}/reload.test.ts (97%) rename {src/test => test}/settingMenu/helpers/inGameManip.ts (100%) rename {src/test => test}/settingMenu/helpers/menuManip.ts (92%) rename {src/test => test}/settingMenu/rebinding_setting.test.ts (100%) rename {src/test => test}/sprites/pokemonSprite.test.ts (99%) rename {src/test => test}/sprites/spritesUtils.ts (100%) rename {src/test => test}/system/game_data.test.ts (96%) rename {src/test/utils => test/testUtils}/TextInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/errorInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/fakeMobile.html (100%) rename {src/test/utils => test/testUtils}/gameManager.ts (95%) rename {src/test/utils => test/testUtils}/gameManagerUtils.ts (100%) rename {src/test/utils => test/testUtils}/gameWrapper.ts (93%) rename {src/test/utils => test/testUtils}/helpers/challengeModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/classicModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/dailyModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/gameManagerHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/modifiersHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/moveHelper.ts (97%) rename {src/test/utils => test/testUtils}/helpers/overridesHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/reloadHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/settingsHelper.ts (100%) rename {src/test/utils => test/testUtils}/inputsHandler.ts (94%) rename {src/test/utils => test/testUtils}/mocks/mockClock.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockConsoleLog.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockFetch.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObjectCreator.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLoader.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLocalStorage.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockTextureManager.ts (80%) rename {src/test/utils => test/testUtils}/mocks/mockTimedEventManager.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockVideoGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockContainer.ts (98%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockGraphics.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockImage.ts (70%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockNineslice.ts (86%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockPolygon.ts (67%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockRectangle.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockSprite.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockText.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockTexture.ts (92%) rename {src/test/utils => test/testUtils}/phaseInterceptor.ts (99%) rename {src/test/utils => test/testUtils}/saves/data_new.prsv (100%) rename {src/test/utils => test/testUtils}/saves/everything.prsv (100%) rename {src/test/utils => test/testUtils}/testUtils.ts (100%) rename {src/test => test}/ui/battle_info.test.ts (96%) rename {src/test => test}/ui/starter-select.test.ts (97%) rename {src/test => test}/ui/transfer-item.test.ts (98%) rename {src/test => test}/ui/type-hints.test.ts (95%) rename {src/test => test}/vitest.setup.ts (97%) diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index 25f7b64ce85..8c6dff55c8c 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -156,7 +156,7 @@ module.exports = { path: '^(src)', pathNot: [ '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', - 'src/test' + './test' ] }, to: { diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index a365999c623..04e1a29cb5f 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -84,19 +84,19 @@ async function runInteractive() { let description; switch (type) { case "move": - dir = path.join(__dirname, "src", "test", "moves"); + dir = path.join(__dirname, "test", "moves"); description = `Moves - ${formattedName}`; break; case "ability": - dir = path.join(__dirname, "src", "test", "abilities"); + dir = path.join(__dirname, "test", "abilities"); description = `Abilities - ${formattedName}`; break; case "item": - dir = path.join(__dirname, "src", "test", "items"); + dir = path.join(__dirname, "test", "items"); description = `Items - ${formattedName}`; break; case "mystery encounter": - dir = path.join(__dirname, "src", "test", "mystery-encounter", "encounters"); + dir = path.join(__dirname, "test", "mystery-encounter", "encounters"); description = `Mystery Encounter - ${formattedName}`; break; default: diff --git a/eslint.config.js b/eslint.config.js index 0da9cc604bf..e79395e1900 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -6,7 +6,7 @@ import importX from 'eslint-plugin-import-x'; export default [ { name: "eslint-config", - files: ["src/**/*.{ts,tsx,js,jsx}"], + files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], languageOptions: { parser: parser @@ -52,7 +52,7 @@ export default [ }, { name: "eslint-tests", - files: ["src/test/**/**.test.ts"], + files: ["test/**/**.test.ts"], languageOptions: { parser: parser, parserOptions: { diff --git a/src/test/abilities/ability_duplication.test.ts b/test/abilities/ability_duplication.test.ts similarity index 96% rename from src/test/abilities/ability_duplication.test.ts rename to test/abilities/ability_duplication.test.ts index f9122b3259c..73092b41ce6 100644 --- a/src/test/abilities/ability_duplication.test.ts +++ b/test/abilities/ability_duplication.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/ability_timing.test.ts b/test/abilities/ability_timing.test.ts similarity index 96% rename from src/test/abilities/ability_timing.test.ts rename to test/abilities/ability_timing.test.ts index e3264c2c1a8..85332b9cd82 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/test/abilities/ability_timing.test.ts @@ -5,7 +5,7 @@ import i18next from "#app/plugins/i18n"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts similarity index 98% rename from src/test/abilities/analytic.test.ts rename to test/abilities/analytic.test.ts index 12777c545f0..45f7bc55006 100644 --- a/src/test/abilities/analytic.test.ts +++ b/test/abilities/analytic.test.ts @@ -3,7 +3,7 @@ import { isBetween, toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/arena_trap.test.ts b/test/abilities/arena_trap.test.ts similarity index 98% rename from src/test/abilities/arena_trap.test.ts rename to test/abilities/arena_trap.test.ts index 12b9673080d..dda6e60e886 100644 --- a/src/test/abilities/arena_trap.test.ts +++ b/test/abilities/arena_trap.test.ts @@ -2,7 +2,7 @@ import { allAbilities } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/aroma_veil.test.ts b/test/abilities/aroma_veil.test.ts similarity index 97% rename from src/test/abilities/aroma_veil.test.ts rename to test/abilities/aroma_veil.test.ts index 4ba4d16504b..111d682aabe 100644 --- a/src/test/abilities/aroma_veil.test.ts +++ b/test/abilities/aroma_veil.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts similarity index 97% rename from src/test/abilities/aura_break.test.ts rename to test/abilities/aura_break.test.ts index 137688d1f22..230835a887e 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battery.test.ts b/test/abilities/battery.test.ts similarity index 97% rename from src/test/abilities/battery.test.ts rename to test/abilities/battery.test.ts index 8abeca287f7..b82ffaeea7b 100644 --- a/src/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts similarity index 98% rename from src/test/abilities/battle_bond.test.ts rename to test/abilities/battle_bond.test.ts index db7ed01e7d9..38d25fa3800 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/beast_boost.test.ts b/test/abilities/beast_boost.test.ts similarity index 98% rename from src/test/abilities/beast_boost.test.ts rename to test/abilities/beast_boost.test.ts index de31b979e32..c9877709467 100644 --- a/src/test/abilities/beast_boost.test.ts +++ b/test/abilities/beast_boost.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/commander.test.ts b/test/abilities/commander.test.ts similarity index 99% rename from src/test/abilities/commander.test.ts rename to test/abilities/commander.test.ts index 70568639b61..1b054bbd5ea 100644 --- a/src/test/abilities/commander.test.ts +++ b/test/abilities/commander.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts similarity index 97% rename from src/test/abilities/competitive.test.ts rename to test/abilities/competitive.test.ts index ecb276a1b8d..e4baf9b9855 100644 --- a/src/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts similarity index 97% rename from src/test/abilities/contrary.test.ts rename to test/abilities/contrary.test.ts index c838a5a098e..eaf8d885a83 100644 --- a/src/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/corrosion.test.ts b/test/abilities/corrosion.test.ts similarity index 96% rename from src/test/abilities/corrosion.test.ts rename to test/abilities/corrosion.test.ts index e607e85defb..2829c3c3b41 100644 --- a/src/test/abilities/corrosion.test.ts +++ b/test/abilities/corrosion.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/costar.test.ts b/test/abilities/costar.test.ts similarity index 97% rename from src/test/abilities/costar.test.ts rename to test/abilities/costar.test.ts index 3be29ea2dcf..09b724a07ec 100644 --- a/src/test/abilities/costar.test.ts +++ b/test/abilities/costar.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts similarity index 98% rename from src/test/abilities/dancer.test.ts rename to test/abilities/dancer.test.ts index 3a480316c96..99d8a6d588d 100644 --- a/src/test/abilities/dancer.test.ts +++ b/test/abilities/dancer.test.ts @@ -3,7 +3,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts similarity index 97% rename from src/test/abilities/defiant.test.ts rename to test/abilities/defiant.test.ts index aa8d250dad7..ce8c7bac8b3 100644 --- a/src/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts similarity index 98% rename from src/test/abilities/desolate-land.test.ts rename to test/abilities/desolate-land.test.ts index 75576d7a8f6..4aa44c97404 100644 --- a/src/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -3,7 +3,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts similarity index 99% rename from src/test/abilities/disguise.test.ts rename to test/abilities/disguise.test.ts index 07a84bd7a5a..cb875e23019 100644 --- a/src/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/dry_skin.test.ts b/test/abilities/dry_skin.test.ts similarity index 98% rename from src/test/abilities/dry_skin.test.ts rename to test/abilities/dry_skin.test.ts index 314564df15c..f3a67f0c1fd 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/test/abilities/dry_skin.test.ts @@ -1,7 +1,7 @@ import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/early_bird.test.ts b/test/abilities/early_bird.test.ts similarity index 98% rename from src/test/abilities/early_bird.test.ts rename to test/abilities/early_bird.test.ts index a69290fa1e4..5889cfe2f89 100644 --- a/src/test/abilities/early_bird.test.ts +++ b/test/abilities/early_bird.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flash_fire.test.ts b/test/abilities/flash_fire.test.ts similarity index 99% rename from src/test/abilities/flash_fire.test.ts rename to test/abilities/flash_fire.test.ts index 0ca55227ea4..1c94c694b29 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/test/abilities/flash_fire.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts similarity index 99% rename from src/test/abilities/flower_gift.test.ts rename to test/abilities/flower_gift.test.ts index 04ada598f22..99f4211eeaa 100644 --- a/src/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -4,7 +4,7 @@ import { Stat } from "#app/enums/stat"; import { WeatherType } from "#app/enums/weather-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts similarity index 99% rename from src/test/abilities/forecast.test.ts rename to test/abilities/forecast.test.ts index 6d1f776da16..31c9942cd98 100644 --- a/src/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -9,7 +9,7 @@ import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts similarity index 98% rename from src/test/abilities/friend_guard.test.ts rename to test/abilities/friend_guard.test.ts index 4ce64468c43..986bd8e7925 100644 --- a/src/test/abilities/friend_guard.test.ts +++ b/test/abilities/friend_guard.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts similarity index 98% rename from src/test/abilities/galvanize.test.ts rename to test/abilities/galvanize.test.ts index 80e767866ea..f0230be3b31 100644 --- a/src/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/good_as_gold.test.ts b/test/abilities/good_as_gold.test.ts similarity index 99% rename from src/test/abilities/good_as_gold.test.ts rename to test/abilities/good_as_gold.test.ts index ecda1a0e031..e3367d5b7f8 100644 --- a/src/test/abilities/good_as_gold.test.ts +++ b/test/abilities/good_as_gold.test.ts @@ -9,7 +9,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/gorilla_tactics.test.ts b/test/abilities/gorilla_tactics.test.ts similarity index 98% rename from src/test/abilities/gorilla_tactics.test.ts rename to test/abilities/gorilla_tactics.test.ts index 8aee365eb8f..e97bca6a725 100644 --- a/src/test/abilities/gorilla_tactics.test.ts +++ b/test/abilities/gorilla_tactics.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/gulp_missile.test.ts b/test/abilities/gulp_missile.test.ts similarity index 99% rename from src/test/abilities/gulp_missile.test.ts rename to test/abilities/gulp_missile.test.ts index bbb103c63e6..d34e86ddc08 100644 --- a/src/test/abilities/gulp_missile.test.ts +++ b/test/abilities/gulp_missile.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts similarity index 97% rename from src/test/abilities/heatproof.test.ts rename to test/abilities/heatproof.test.ts index bf4e99ce467..6c41460535f 100644 --- a/src/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/honey_gather.test.ts b/test/abilities/honey_gather.test.ts similarity index 97% rename from src/test/abilities/honey_gather.test.ts rename to test/abilities/honey_gather.test.ts index fc9d6cdd150..a1cad453843 100644 --- a/src/test/abilities/honey_gather.test.ts +++ b/test/abilities/honey_gather.test.ts @@ -3,7 +3,7 @@ import { Command } from "#app/ui/command-ui-handler"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts similarity index 98% rename from src/test/abilities/hustle.test.ts rename to test/abilities/hustle.test.ts index 08a441315fb..c92bc5cbbd3 100644 --- a/src/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hyper_cutter.test.ts b/test/abilities/hyper_cutter.test.ts similarity index 96% rename from src/test/abilities/hyper_cutter.test.ts rename to test/abilities/hyper_cutter.test.ts index e51fef6bd49..c8c4c21c98f 100644 --- a/src/test/abilities/hyper_cutter.test.ts +++ b/test/abilities/hyper_cutter.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/ice_face.test.ts b/test/abilities/ice_face.test.ts similarity index 99% rename from src/test/abilities/ice_face.test.ts rename to test/abilities/ice_face.test.ts index e31bee1c721..e4339cb8a28 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/test/abilities/ice_face.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts similarity index 96% rename from src/test/abilities/illuminate.test.ts rename to test/abilities/illuminate.test.ts index 4f7d3d83b51..c4fbcd2c7a4 100644 --- a/src/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts similarity index 98% rename from src/test/abilities/imposter.test.ts rename to test/abilities/imposter.test.ts index 98f30c60505..d73b77feda9 100644 --- a/src/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts similarity index 98% rename from src/test/abilities/infiltrator.test.ts rename to test/abilities/infiltrator.test.ts index 8ea72b55b0c..c614bbe4474 100644 --- a/src/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -7,7 +7,7 @@ import { StatusEffect } from "#enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts similarity index 97% rename from src/test/abilities/intimidate.test.ts rename to test/abilities/intimidate.test.ts index d5a37d06593..eab59e7c1a2 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Mode } from "#app/ui/ui"; import { Stat } from "#enums/stat"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/intrepid_sword.test.ts b/test/abilities/intrepid_sword.test.ts similarity index 95% rename from src/test/abilities/intrepid_sword.test.ts rename to test/abilities/intrepid_sword.test.ts index 7bf0654276c..0f4305d38b4 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/test/abilities/intrepid_sword.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/libero.test.ts b/test/abilities/libero.test.ts similarity index 99% rename from src/test/abilities/libero.test.ts rename to test/abilities/libero.test.ts index f6e85979c69..46093019daa 100644 --- a/src/test/abilities/libero.test.ts +++ b/test/abilities/libero.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts similarity index 99% rename from src/test/abilities/magic_bounce.test.ts rename to test/abilities/magic_bounce.test.ts index 2fc460662ca..9bb7b55bc72 100644 --- a/src/test/abilities/magic_bounce.test.ts +++ b/test/abilities/magic_bounce.test.ts @@ -9,7 +9,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Magic Bounce", () => { diff --git a/src/test/abilities/magic_guard.test.ts b/test/abilities/magic_guard.test.ts similarity index 99% rename from src/test/abilities/magic_guard.test.ts rename to test/abilities/magic_guard.test.ts index 7c038354748..a2a88915419 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/test/abilities/magic_guard.test.ts @@ -8,7 +8,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts similarity index 98% rename from src/test/abilities/mimicry.test.ts rename to test/abilities/mimicry.test.ts index 29aa1d649d3..75990c89707 100644 --- a/src/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mirror_armor.test.ts b/test/abilities/mirror_armor.test.ts similarity index 99% rename from src/test/abilities/mirror_armor.test.ts rename to test/abilities/mirror_armor.test.ts index 070428a8ee7..1d103c45be1 100644 --- a/src/test/abilities/mirror_armor.test.ts +++ b/test/abilities/mirror_armor.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/moody.test.ts b/test/abilities/moody.test.ts similarity index 98% rename from src/test/abilities/moody.test.ts rename to test/abilities/moody.test.ts index 166f69b0fe3..64c2c7d8a07 100644 --- a/src/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -2,7 +2,7 @@ import { BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts similarity index 97% rename from src/test/abilities/moxie.test.ts rename to test/abilities/moxie.test.ts index 5f337fedabb..c518c55671f 100644 --- a/src/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts similarity index 96% rename from src/test/abilities/mummy.test.ts rename to test/abilities/mummy.test.ts index bf93cdcf61d..96b5e170c14 100644 --- a/src/test/abilities/mummy.test.ts +++ b/test/abilities/mummy.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts similarity index 98% rename from src/test/abilities/mycelium_might.test.ts rename to test/abilities/mycelium_might.test.ts index 0c8e7b5a703..2c0bd39b32a 100644 --- a/src/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -1,6 +1,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Stat } from "#enums/stat"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/no_guard.test.ts b/test/abilities/no_guard.test.ts similarity index 97% rename from src/test/abilities/no_guard.test.ts rename to test/abilities/no_guard.test.ts index b0b454dd560..1a319eb2611 100644 --- a/src/test/abilities/no_guard.test.ts +++ b/test/abilities/no_guard.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts similarity index 99% rename from src/test/abilities/parental_bond.test.ts rename to test/abilities/parental_bond.test.ts index c2f54fa4cfc..d22c5615df2 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/pastel_veil.test.ts b/test/abilities/pastel_veil.test.ts similarity index 97% rename from src/test/abilities/pastel_veil.test.ts rename to test/abilities/pastel_veil.test.ts index dd8360493a1..cb73a79bae4 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/test/abilities/pastel_veil.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/perish_body.test.ts b/test/abilities/perish_body.test.ts similarity index 98% rename from src/test/abilities/perish_body.test.ts rename to test/abilities/perish_body.test.ts index 70ba6d8d684..7084076713a 100644 --- a/src/test/abilities/perish_body.test.ts +++ b/test/abilities/perish_body.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/power_construct.test.ts b/test/abilities/power_construct.test.ts similarity index 98% rename from src/test/abilities/power_construct.test.ts rename to test/abilities/power_construct.test.ts index aaab5ddb5c4..b6b7be33753 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/test/abilities/power_construct.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts similarity index 97% rename from src/test/abilities/power_spot.test.ts rename to test/abilities/power_spot.test.ts index a566c2277c3..dbc3799d48d 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/protean.test.ts b/test/abilities/protean.test.ts similarity index 99% rename from src/test/abilities/protean.test.ts rename to test/abilities/protean.test.ts index c7d04b9e1c8..a20fa61d75f 100644 --- a/src/test/abilities/protean.test.ts +++ b/test/abilities/protean.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts similarity index 97% rename from src/test/abilities/protosynthesis.test.ts rename to test/abilities/protosynthesis.test.ts index 67786c3ae9e..a122fbad797 100644 --- a/src/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Nature } from "#enums/nature"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/quick_draw.test.ts b/test/abilities/quick_draw.test.ts similarity index 98% rename from src/test/abilities/quick_draw.test.ts rename to test/abilities/quick_draw.test.ts index 4979152f4d6..c451218a56c 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/test/abilities/quick_draw.test.ts @@ -3,7 +3,7 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sand_spit.test.ts b/test/abilities/sand_spit.test.ts similarity index 97% rename from src/test/abilities/sand_spit.test.ts rename to test/abilities/sand_spit.test.ts index 092c3e66105..dafae695d3b 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/test/abilities/sand_spit.test.ts @@ -2,7 +2,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/sand_veil.test.ts b/test/abilities/sand_veil.test.ts similarity index 97% rename from src/test/abilities/sand_veil.test.ts rename to test/abilities/sand_veil.test.ts index ee8ca450df9..0128276075b 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/test/abilities/sand_veil.test.ts @@ -7,7 +7,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts similarity index 98% rename from src/test/abilities/sap_sipper.test.ts rename to test/abilities/sap_sipper.test.ts index dc254a54b54..836219fcbcb 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, RandomMoveAttr } from "#app/data/move"; diff --git a/src/test/abilities/schooling.test.ts b/test/abilities/schooling.test.ts similarity index 97% rename from src/test/abilities/schooling.test.ts rename to test/abilities/schooling.test.ts index e1ec58f517e..a52c6a06f12 100644 --- a/src/test/abilities/schooling.test.ts +++ b/test/abilities/schooling.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/screen_cleaner.test.ts b/test/abilities/screen_cleaner.test.ts similarity index 97% rename from src/test/abilities/screen_cleaner.test.ts rename to test/abilities/screen_cleaner.test.ts index c036aa90a77..9c182398765 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/test/abilities/screen_cleaner.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/seed_sower.test.ts b/test/abilities/seed_sower.test.ts similarity index 97% rename from src/test/abilities/seed_sower.test.ts rename to test/abilities/seed_sower.test.ts index 71b76e24d2e..6e3acdf6093 100644 --- a/src/test/abilities/seed_sower.test.ts +++ b/test/abilities/seed_sower.test.ts @@ -2,7 +2,7 @@ import { TerrainType } from "#app/data/terrain"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts similarity index 96% rename from src/test/abilities/serene_grace.test.ts rename to test/abilities/serene_grace.test.ts index 6f9b2195a9c..cb21121743b 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/test/abilities/serene_grace.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { allMoves } from "#app/data/move"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts similarity index 99% rename from src/test/abilities/sheer_force.test.ts rename to test/abilities/sheer_force.test.ts index a0ddf5bb9c6..a65334cbfa0 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/test/abilities/sheer_force.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, FlinchAttr } from "#app/data/move"; diff --git a/src/test/abilities/shield_dust.test.ts b/test/abilities/shield_dust.test.ts similarity index 97% rename from src/test/abilities/shield_dust.test.ts rename to test/abilities/shield_dust.test.ts index 329f52cc4c6..a63898b0c63 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/test/abilities/shield_dust.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/shields_down.test.ts b/test/abilities/shields_down.test.ts similarity index 99% rename from src/test/abilities/shields_down.test.ts rename to test/abilities/shields_down.test.ts index ca6d945824e..4e47a018471 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/test/abilities/shields_down.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/simple.test.ts b/test/abilities/simple.test.ts similarity index 95% rename from src/test/abilities/simple.test.ts rename to test/abilities/simple.test.ts index e5ca474d7c3..e8d478655ab 100644 --- a/src/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/speed_boost.test.ts b/test/abilities/speed_boost.test.ts similarity index 98% rename from src/test/abilities/speed_boost.test.ts rename to test/abilities/speed_boost.test.ts index 74ee6a8cb92..912bb62bca4 100644 --- a/src/test/abilities/speed_boost.test.ts +++ b/test/abilities/speed_boost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import type { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/abilities/stakeout.test.ts b/test/abilities/stakeout.test.ts similarity index 97% rename from src/test/abilities/stakeout.test.ts rename to test/abilities/stakeout.test.ts index 885169b284e..67442ae1822 100644 --- a/src/test/abilities/stakeout.test.ts +++ b/test/abilities/stakeout.test.ts @@ -3,7 +3,7 @@ import { isBetween } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/stall.test.ts b/test/abilities/stall.test.ts similarity index 98% rename from src/test/abilities/stall.test.ts rename to test/abilities/stall.test.ts index b51c56dbe1f..c0b71221071 100644 --- a/src/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; diff --git a/src/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts similarity index 98% rename from src/test/abilities/steely_spirit.test.ts rename to test/abilities/steely_spirit.test.ts index 61e76989060..e1f6a04c0fa 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sturdy.test.ts b/test/abilities/sturdy.test.ts similarity index 97% rename from src/test/abilities/sturdy.test.ts rename to test/abilities/sturdy.test.ts index 8f134338f12..36b098ab69e 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/test/abilities/sturdy.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts similarity index 99% rename from src/test/abilities/supreme_overlord.test.ts rename to test/abilities/supreme_overlord.test.ts index ecd595cb6bb..6de17bc3c7a 100644 --- a/src/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/abilities/sweet_veil.test.ts b/test/abilities/sweet_veil.test.ts similarity index 98% rename from src/test/abilities/sweet_veil.test.ts rename to test/abilities/sweet_veil.test.ts index ef66cb1c68a..14f4f79c3f0 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/test/abilities/sweet_veil.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts similarity index 98% rename from src/test/abilities/synchronize.test.ts rename to test/abilities/synchronize.test.ts index 2ae80ae9c7a..19b5560f61a 100644 --- a/src/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/tera_shell.test.ts b/test/abilities/tera_shell.test.ts similarity index 98% rename from src/test/abilities/tera_shell.test.ts rename to test/abilities/tera_shell.test.ts index 01382d0fd9a..38be70f511b 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/test/abilities/tera_shell.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/trace.test.ts b/test/abilities/trace.test.ts similarity index 96% rename from src/test/abilities/trace.test.ts rename to test/abilities/trace.test.ts index ffa76f59769..e7059d2b0f1 100644 --- a/src/test/abilities/trace.test.ts +++ b/test/abilities/trace.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts similarity index 99% rename from src/test/abilities/unburden.test.ts rename to test/abilities/unburden.test.ts index 9c5f6c2d185..67cf83870b3 100644 --- a/src/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -9,7 +9,7 @@ import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts similarity index 98% rename from src/test/abilities/unseen_fist.test.ts rename to test/abilities/unseen_fist.test.ts index 584f997aa55..de93aef0988 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/test/abilities/unseen_fist.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#app/enums/battler-tag-type"; diff --git a/src/test/abilities/volt_absorb.test.ts b/test/abilities/volt_absorb.test.ts similarity index 98% rename from src/test/abilities/volt_absorb.test.ts rename to test/abilities/volt_absorb.test.ts index 4fee7653b99..2221619af07 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/test/abilities/volt_absorb.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/wandering_spirit.test.ts b/test/abilities/wandering_spirit.test.ts similarity index 97% rename from src/test/abilities/wandering_spirit.test.ts rename to test/abilities/wandering_spirit.test.ts index 4bc9298353f..48c7afa5751 100644 --- a/src/test/abilities/wandering_spirit.test.ts +++ b/test/abilities/wandering_spirit.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts similarity index 99% rename from src/test/abilities/wimp_out.test.ts rename to test/abilities/wimp_out.test.ts index 90cd3d62af5..5aff05d4c20 100644 --- a/src/test/abilities/wimp_out.test.ts +++ b/test/abilities/wimp_out.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; import { allMoves } from "#app/data/move"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; diff --git a/src/test/abilities/wind_power.test.ts b/test/abilities/wind_power.test.ts similarity index 98% rename from src/test/abilities/wind_power.test.ts rename to test/abilities/wind_power.test.ts index 538b65f898b..f9be5393d15 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/test/abilities/wind_power.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wind_rider.test.ts b/test/abilities/wind_rider.test.ts similarity index 98% rename from src/test/abilities/wind_rider.test.ts rename to test/abilities/wind_rider.test.ts index cd7094fb0a9..7cebd70a11a 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/test/abilities/wind_rider.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts similarity index 97% rename from src/test/abilities/wonder_skin.test.ts rename to test/abilities/wonder_skin.test.ts index 6b25701e36a..4f6e45d8fe0 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/zen_mode.test.ts b/test/abilities/zen_mode.test.ts similarity index 98% rename from src/test/abilities/zen_mode.test.ts rename to test/abilities/zen_mode.test.ts index e0cc457c4d5..cb4c82e00dc 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/test/abilities/zen_mode.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/zero_to_hero.test.ts b/test/abilities/zero_to_hero.test.ts similarity index 98% rename from src/test/abilities/zero_to_hero.test.ts rename to test/abilities/zero_to_hero.test.ts index 5702f73e6c4..338ebd6344f 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/test/abilities/zero_to_hero.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/account.test.ts b/test/account.test.ts similarity index 99% rename from src/test/account.test.ts rename to test/account.test.ts index 0f49014c377..099564ce7a8 100644 --- a/src/test/account.test.ts +++ b/test/account.test.ts @@ -1,7 +1,7 @@ import * as battleScene from "#app/battle-scene"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { describe, expect, it, vi } from "vitest"; -import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; +import { initLoggedInUser, loggedInUser, updateUserInfo } from "#app/account"; describe("account", () => { describe("initLoggedInUser", () => { diff --git a/src/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts similarity index 99% rename from src/test/achievements/achievement.test.ts rename to test/achievements/achievement.test.ts index 2d1cc50603e..3c6dc8aefe8 100644 --- a/src/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -1,10 +1,10 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; import { NumberHolder } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import BattleScene from "../../battle-scene"; +import BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { diff --git a/src/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts similarity index 98% rename from src/test/arena/arena_gravity.test.ts rename to test/arena/arena_gravity.test.ts index 13e9c23a35c..75197a4341c 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -5,7 +5,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts similarity index 97% rename from src/test/arena/grassy_terrain.test.ts rename to test/arena/grassy_terrain.test.ts index ead4467925b..f493242a9d8 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts similarity index 96% rename from src/test/arena/weather_fog.test.ts rename to test/arena/weather_fog.test.ts index 8c1fcb1e3a4..8b4ffff3a64 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_hail.test.ts b/test/arena/weather_hail.test.ts similarity index 97% rename from src/test/arena/weather_hail.test.ts rename to test/arena/weather_hail.test.ts index 0b267550d75..137c7622517 100644 --- a/src/test/arena/weather_hail.test.ts +++ b/test/arena/weather_hail.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_sandstorm.test.ts b/test/arena/weather_sandstorm.test.ts similarity index 98% rename from src/test/arena/weather_sandstorm.test.ts rename to test/arena/weather_sandstorm.test.ts index 17ccfdee94b..6420117d107 100644 --- a/src/test/arena/weather_sandstorm.test.ts +++ b/test/arena/weather_sandstorm.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts similarity index 98% rename from src/test/arena/weather_strong_winds.test.ts rename to test/arena/weather_strong_winds.test.ts index 557de93d644..2685a9149ae 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle-scene.test.ts b/test/battle-scene.test.ts similarity index 93% rename from src/test/battle-scene.test.ts rename to test/battle-scene.test.ts index 4da75cea197..44f1364441b 100644 --- a/src/test/battle-scene.test.ts +++ b/test/battle-scene.test.ts @@ -1,6 +1,6 @@ import { LoadingScene } from "#app/loading-scene"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattleScene", () => { let phaserGame: Phaser.Game; diff --git a/src/test/battle/ability_swap.test.ts b/test/battle/ability_swap.test.ts similarity index 97% rename from src/test/battle/ability_swap.test.ts rename to test/battle/ability_swap.test.ts index 9ce7a36c16e..ff3f7c002bc 100644 --- a/src/test/battle/ability_swap.test.ts +++ b/test/battle/ability_swap.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts similarity index 99% rename from src/test/battle/battle-order.test.ts rename to test/battle/battle-order.test.ts index d4e9950dec9..165a2fc916c 100644 --- a/src/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/battle.test.ts b/test/battle/battle.test.ts similarity index 98% rename from src/test/battle/battle.test.ts rename to test/battle/battle.test.ts index bd84cb2fd3b..edd04cf8ed0 100644 --- a/src/test/battle/battle.test.ts +++ b/test/battle/battle.test.ts @@ -16,8 +16,8 @@ import { SwitchPhase } from "#app/phases/switch-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { generateStarter } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { generateStarter } from "#test/testUtils/gameManagerUtils"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -122,7 +122,7 @@ describe("Test Battle Phase", () => { }, 20000); it("load 100% data file", async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts similarity index 98% rename from src/test/battle/damage_calculation.test.ts rename to test/battle/damage_calculation.test.ts index 22d072f313c..0a954b624c0 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/double_battle.test.ts b/test/battle/double_battle.test.ts similarity index 98% rename from src/test/battle/double_battle.test.ts rename to test/battle/double_battle.test.ts index b48f2a96a5b..de65245698e 100644 --- a/src/test/battle/double_battle.test.ts +++ b/test/battle/double_battle.test.ts @@ -6,7 +6,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts similarity index 99% rename from src/test/battle/inverse_battle.test.ts rename to test/battle/inverse_battle.test.ts index 0bda678bbd3..ce44824e772 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -6,7 +6,7 @@ import { Challenges } from "#enums/challenges"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/special_battle.test.ts b/test/battle/special_battle.test.ts similarity index 98% rename from src/test/battle/special_battle.test.ts rename to test/battle/special_battle.test.ts index af9e3dddbec..df24626766c 100644 --- a/src/test/battle/special_battle.test.ts +++ b/test/battle/special_battle.test.ts @@ -3,7 +3,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battlerTags/octolock.test.ts b/test/battlerTags/octolock.test.ts similarity index 96% rename from src/test/battlerTags/octolock.test.ts rename to test/battlerTags/octolock.test.ts index 4bf0257af8f..f161d90d466 100644 --- a/src/test/battlerTags/octolock.test.ts +++ b/test/battlerTags/octolock.test.ts @@ -3,7 +3,7 @@ import type Pokemon from "#app/field/pokemon"; import { BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattlerTag - OctolockTag", () => { describe("lapse behavior", () => { diff --git a/src/test/battlerTags/stockpiling.test.ts b/test/battlerTags/stockpiling.test.ts similarity index 99% rename from src/test/battlerTags/stockpiling.test.ts rename to test/battlerTags/stockpiling.test.ts index 13a4227853d..5970b5abbc6 100644 --- a/src/test/battlerTags/stockpiling.test.ts +++ b/test/battlerTags/stockpiling.test.ts @@ -4,7 +4,7 @@ import { PokemonSummonData } from "#app/field/pokemon"; import * as messages from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { diff --git a/src/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts similarity index 100% rename from src/test/battlerTags/substitute.test.ts rename to test/battlerTags/substitute.test.ts diff --git a/src/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts similarity index 99% rename from src/test/boss-pokemon.test.ts rename to test/boss-pokemon.test.ts index 389b42a2963..ea5a9000000 100644 --- a/src/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#app/enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/daily_mode.test.ts b/test/daily_mode.test.ts similarity index 98% rename from src/test/daily_mode.test.ts rename to test/daily_mode.test.ts index 3e70cc2d8a7..95c01b51434 100644 --- a/src/test/daily_mode.test.ts +++ b/test/daily_mode.test.ts @@ -6,7 +6,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Species } from "#enums/species"; import { Mode } from "#app/ui/ui"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; //const TIMEOUT = 20 * 1000; diff --git a/src/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts similarity index 100% rename from src/test/data/splash_messages.test.ts rename to test/data/splash_messages.test.ts diff --git a/src/test/data/status_effect.test.ts b/test/data/status_effect.test.ts similarity index 99% rename from src/test/data/status_effect.test.ts rename to test/data/status_effect.test.ts index 071dea989a9..e94cb193f0a 100644 --- a/src/test/data/status_effect.test.ts +++ b/test/data/status_effect.test.ts @@ -11,8 +11,8 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; -import { mockI18next } from "#test/utils/testUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { mockI18next } from "#test/testUtils/testUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/eggs/egg.test.ts b/test/eggs/egg.test.ts similarity index 99% rename from src/test/eggs/egg.test.ts rename to test/eggs/egg.test.ts index d7ed07dd151..e4a7cc31709 100644 --- a/src/test/eggs/egg.test.ts +++ b/test/eggs/egg.test.ts @@ -7,7 +7,7 @@ import { VariantTier } from "#app/enums/variant-tier"; import EggData from "#app/system/egg-data"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +29,7 @@ describe("Egg Generation Tests", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); }); it("should return Kyogre for the 10th of June", () => { diff --git a/src/test/eggs/manaphy-egg.test.ts b/test/eggs/manaphy-egg.test.ts similarity index 96% rename from src/test/eggs/manaphy-egg.test.ts rename to test/eggs/manaphy-egg.test.ts index 5bb5b790201..c63dbae7780 100644 --- a/src/test/eggs/manaphy-egg.test.ts +++ b/test/eggs/manaphy-egg.test.ts @@ -2,7 +2,7 @@ import { Egg } from "#app/data/egg"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Manaphy Eggs", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); /** * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress diff --git a/src/test/endless_boss.test.ts b/test/endless_boss.test.ts similarity index 98% rename from src/test/endless_boss.test.ts rename to test/endless_boss.test.ts index c9f3afc3936..ab7df412c12 100644 --- a/src/test/endless_boss.test.ts +++ b/test/endless_boss.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#app/enums/biome"; import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; const EndlessBossWave = { Minor: 250, diff --git a/src/test/enemy_command.test.ts b/test/enemy_command.test.ts similarity index 98% rename from src/test/enemy_command.test.ts rename to test/enemy_command.test.ts index 647c0be279a..b8e0c38b9e8 100644 --- a/src/test/enemy_command.test.ts +++ b/test/enemy_command.test.ts @@ -6,7 +6,7 @@ import { Species } from "#app/enums/species"; import type { EnemyPokemon } from "#app/field/pokemon"; import { AiType } from "#app/field/pokemon"; import { randSeedInt } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/escape-calculations.test.ts b/test/escape-calculations.test.ts similarity index 99% rename from src/test/escape-calculations.test.ts rename to test/escape-calculations.test.ts index 419a6b4c19a..6c5c8777d01 100644 --- a/src/test/escape-calculations.test.ts +++ b/test/escape-calculations.test.ts @@ -4,7 +4,7 @@ import { Command } from "#app/ui/command-ui-handler"; import * as Utils from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/evolution.test.ts b/test/evolution.test.ts similarity index 99% rename from src/test/evolution.test.ts rename to test/evolution.test.ts index 8dc19a548ca..dbd4ef3a0d7 100644 --- a/src/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/field/pokemon.test.ts b/test/field/pokemon.test.ts similarity index 99% rename from src/test/field/pokemon.test.ts rename to test/field/pokemon.test.ts index 0c282b44f49..b327fe0c137 100644 --- a/src/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -1,6 +1,6 @@ import { Species } from "#app/enums/species"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { PokeballType } from "#enums/pokeball"; import type BattleScene from "#app/battle-scene"; import { Moves } from "#app/enums/moves"; diff --git a/src/test/final_boss.test.ts b/test/final_boss.test.ts similarity index 99% rename from src/test/final_boss.test.ts rename to test/final_boss.test.ts index 5540d9511e4..f7675c17005 100644 --- a/src/test/final_boss.test.ts +++ b/test/final_boss.test.ts @@ -5,7 +5,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const FinalWave = { diff --git a/src/test/fontFace.setup.ts b/test/fontFace.setup.ts similarity index 100% rename from src/test/fontFace.setup.ts rename to test/fontFace.setup.ts diff --git a/src/test/game-mode.test.ts b/test/game-mode.test.ts similarity index 95% rename from src/test/game-mode.test.ts rename to test/game-mode.test.ts index 2c8184a30ef..3f5819f9a38 100644 --- a/src/test/game-mode.test.ts +++ b/test/game-mode.test.ts @@ -1,8 +1,8 @@ import type { GameMode } from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as Utils from "../utils"; -import GameManager from "./utils/gameManager"; +import * as Utils from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; describe("game-mode", () => { let phaserGame: Phaser.Game; diff --git a/src/test/imports.test.ts b/test/imports.test.ts similarity index 100% rename from src/test/imports.test.ts rename to test/imports.test.ts diff --git a/src/test/inputs/inputs.test.ts b/test/inputs/inputs.test.ts similarity index 96% rename from src/test/inputs/inputs.test.ts rename to test/inputs/inputs.test.ts index 6306c1b9da6..2cdab4b3eb2 100644 --- a/src/test/inputs/inputs.test.ts +++ b/test/inputs/inputs.test.ts @@ -1,7 +1,7 @@ import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import GameManager from "#test/utils/gameManager"; -import InputsHandler from "#test/utils/inputsHandler"; +import GameManager from "#test/testUtils/gameManager"; +import InputsHandler from "#test/testUtils/inputsHandler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/internals.test.ts b/test/internals.test.ts similarity index 95% rename from src/test/internals.test.ts rename to test/internals.test.ts index ce2cd55dbc6..2cc827a8906 100644 --- a/src/test/internals.test.ts +++ b/test/internals.test.ts @@ -1,6 +1,6 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/dire_hit.test.ts b/test/items/dire_hit.test.ts similarity index 98% rename from src/test/items/dire_hit.test.ts rename to test/items/dire_hit.test.ts index 3c82ebd3a47..4a94030ab93 100644 --- a/src/test/items/dire_hit.test.ts +++ b/test/items/dire_hit.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; diff --git a/src/test/items/double_battle_chance_booster.test.ts b/test/items/double_battle_chance_booster.test.ts similarity index 98% rename from src/test/items/double_battle_chance_booster.test.ts rename to test/items/double_battle_chance_booster.test.ts index cccd8d4765e..2a86a151685 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/test/items/double_battle_chance_booster.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; diff --git a/src/test/items/eviolite.test.ts b/test/items/eviolite.test.ts similarity index 99% rename from src/test/items/eviolite.test.ts rename to test/items/eviolite.test.ts index a97c287da29..64038cc9b82 100644 --- a/src/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -2,7 +2,7 @@ import { StatBoosterModifier } from "#app/modifier/modifier"; import { NumberHolder, randItem } from "#app/utils"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/exp_booster.test.ts b/test/items/exp_booster.test.ts similarity index 95% rename from src/test/items/exp_booster.test.ts rename to test/items/exp_booster.test.ts index 7441dcaeb73..4519df29b01 100644 --- a/src/test/items/exp_booster.test.ts +++ b/test/items/exp_booster.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#app/enums/abilities"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts similarity index 98% rename from src/test/items/grip_claw.test.ts rename to test/items/grip_claw.test.ts index e0cbeb95b6f..854e0998d3b 100644 --- a/src/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leek.test.ts b/test/items/leek.test.ts similarity index 98% rename from src/test/items/leek.test.ts rename to test/items/leek.test.ts index 901b353b3d3..a3c509d19dd 100644 --- a/src/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leftovers.test.ts b/test/items/leftovers.test.ts similarity index 97% rename from src/test/items/leftovers.test.ts rename to test/items/leftovers.test.ts index 672151d97cb..8d74301968f 100644 --- a/src/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/light_ball.test.ts b/test/items/light_ball.test.ts similarity index 99% rename from src/test/items/light_ball.test.ts rename to test/items/light_ball.test.ts index aae1d806a28..8dff8001ffc 100644 --- a/src/test/items/light_ball.test.ts +++ b/test/items/light_ball.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/lock_capsule.test.ts b/test/items/lock_capsule.test.ts similarity index 96% rename from src/test/items/lock_capsule.test.ts rename to test/items/lock_capsule.test.ts index 2d95cea5847..4cdd3b8a8a0 100644 --- a/src/test/items/lock_capsule.test.ts +++ b/test/items/lock_capsule.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/metal_powder.test.ts b/test/items/metal_powder.test.ts similarity index 99% rename from src/test/items/metal_powder.test.ts rename to test/items/metal_powder.test.ts index 68c3107af08..c1345af35df 100644 --- a/src/test/items/metal_powder.test.ts +++ b/test/items/metal_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts similarity index 99% rename from src/test/items/multi_lens.test.ts rename to test/items/multi_lens.test.ts index bd586878fce..01447a29544 100644 --- a/src/test/items/multi_lens.test.ts +++ b/test/items/multi_lens.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/quick_powder.test.ts b/test/items/quick_powder.test.ts similarity index 99% rename from src/test/items/quick_powder.test.ts rename to test/items/quick_powder.test.ts index ae16daf17ff..80ff0d7ba33 100644 --- a/src/test/items/quick_powder.test.ts +++ b/test/items/quick_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/scope_lens.test.ts b/test/items/scope_lens.test.ts similarity index 95% rename from src/test/items/scope_lens.test.ts rename to test/items/scope_lens.test.ts index e39517ceae9..98e374b6969 100644 --- a/src/test/items/scope_lens.test.ts +++ b/test/items/scope_lens.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/test/items/temp_stat_stage_booster.test.ts similarity index 99% rename from src/test/items/temp_stat_stage_booster.test.ts rename to test/items/temp_stat_stage_booster.test.ts index 3e496d1bbf8..8bbd9f4f29d 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/test/items/temp_stat_stage_booster.test.ts @@ -1,5 +1,5 @@ import { BATTLE_STATS, Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/thick_club.test.ts b/test/items/thick_club.test.ts similarity index 99% rename from src/test/items/thick_club.test.ts rename to test/items/thick_club.test.ts index d32c213e506..f18c0bd073e 100644 --- a/src/test/items/thick_club.test.ts +++ b/test/items/thick_club.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/toxic_orb.test.ts b/test/items/toxic_orb.test.ts similarity index 96% rename from src/test/items/toxic_orb.test.ts rename to test/items/toxic_orb.test.ts index 6918d7f34f0..8201036b927 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/test/items/toxic_orb.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/misc.test.ts b/test/misc.test.ts similarity index 95% rename from src/test/misc.test.ts rename to test/misc.test.ts index ae91a5014d9..f2b89418ef5 100644 --- a/src/test/misc.test.ts +++ b/test/misc.test.ts @@ -1,6 +1,6 @@ // import { apiFetch } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; -import { waitUntil } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { waitUntil } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/after_you.test.ts b/test/moves/after_you.test.ts similarity index 97% rename from src/test/moves/after_you.test.ts rename to test/moves/after_you.test.ts index 99f383194aa..bf030027436 100644 --- a/src/test/moves/after_you.test.ts +++ b/test/moves/after_you.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/alluring_voice.test.ts b/test/moves/alluring_voice.test.ts similarity index 96% rename from src/test/moves/alluring_voice.test.ts rename to test/moves/alluring_voice.test.ts index 2980f102735..bf5a9f90f82 100644 --- a/src/test/moves/alluring_voice.test.ts +++ b/test/moves/alluring_voice.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/aromatherapy.test.ts b/test/moves/aromatherapy.test.ts similarity index 98% rename from src/test/moves/aromatherapy.test.ts rename to test/moves/aromatherapy.test.ts index 874dadc0a1f..e70384355a0 100644 --- a/src/test/moves/aromatherapy.test.ts +++ b/test/moves/aromatherapy.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/assist.test.ts b/test/moves/assist.test.ts similarity index 98% rename from src/test/moves/assist.test.ts rename to test/moves/assist.test.ts index 81633d9a277..4168ec6295a 100644 --- a/src/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/astonish.test.ts b/test/moves/astonish.test.ts similarity index 97% rename from src/test/moves/astonish.test.ts rename to test/moves/astonish.test.ts index d94e50fc9f9..87af0db737b 100644 --- a/src/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -7,7 +7,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts similarity index 98% rename from src/test/moves/aurora_veil.test.ts rename to test/moves/aurora_veil.test.ts index 721f682f778..c8da3e03db5 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -10,7 +10,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts similarity index 98% rename from src/test/moves/autotomize.test.ts rename to test/moves/autotomize.test.ts index e15642b7ce5..29d2edbcf4e 100644 --- a/src/test/moves/autotomize.test.ts +++ b/test/moves/autotomize.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/baddy_bad.test.ts b/test/moves/baddy_bad.test.ts similarity index 95% rename from src/test/moves/baddy_bad.test.ts rename to test/moves/baddy_bad.test.ts index 1be25704393..78e7c63d49f 100644 --- a/src/test/moves/baddy_bad.test.ts +++ b/test/moves/baddy_bad.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/baneful_bunker.test.ts b/test/moves/baneful_bunker.test.ts similarity index 98% rename from src/test/moves/baneful_bunker.test.ts rename to test/moves/baneful_bunker.test.ts index a0fc0f21ee2..55b4b7d985e 100644 --- a/src/test/moves/baneful_bunker.test.ts +++ b/test/moves/baneful_bunker.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/baton_pass.test.ts b/test/moves/baton_pass.test.ts similarity index 98% rename from src/test/moves/baton_pass.test.ts rename to test/moves/baton_pass.test.ts index 52e4c3ec016..6abd2d95f7b 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/test/moves/baton_pass.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/beak_blast.test.ts b/test/moves/beak_blast.test.ts similarity index 98% rename from src/test/moves/beak_blast.test.ts rename to test/moves/beak_blast.test.ts index 0c1e7bbeed9..177610182b0 100644 --- a/src/test/moves/beak_blast.test.ts +++ b/test/moves/beak_blast.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/beat_up.test.ts b/test/moves/beat_up.test.ts similarity index 97% rename from src/test/moves/beat_up.test.ts rename to test/moves/beat_up.test.ts index 41e5b63471f..1ac2ae238b8 100644 --- a/src/test/moves/beat_up.test.ts +++ b/test/moves/beat_up.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { StatusEffect } from "#app/enums/status-effect"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/belly_drum.test.ts b/test/moves/belly_drum.test.ts similarity index 98% rename from src/test/moves/belly_drum.test.ts rename to test/moves/belly_drum.test.ts index 0bed1248e7e..7d8b17262d7 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/test/moves/belly_drum.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts similarity index 98% rename from src/test/moves/burning_jealousy.test.ts rename to test/moves/burning_jealousy.test.ts index abe2c09bb72..bfa9af600a2 100644 --- a/src/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts similarity index 96% rename from src/test/moves/camouflage.test.ts rename to test/moves/camouflage.test.ts index 5773afffcc3..8995e2d00bb 100644 --- a/src/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -4,7 +4,7 @@ import { Species } from "#enums/species"; import { TerrainType } from "#app/data/terrain"; import { Type } from "#enums/type"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts similarity index 98% rename from src/test/moves/ceaseless_edge.test.ts rename to test/moves/ceaseless_edge.test.ts index 3fbbb7b0aaf..22cf310bc80 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/test/moves/ceaseless_edge.test.ts @@ -6,7 +6,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts similarity index 98% rename from src/test/moves/chilly_reception.test.ts rename to test/moves/chilly_reception.test.ts index 664ca242b20..0d99175a9bc 100644 --- a/src/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; //import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/chloroblast.test.ts b/test/moves/chloroblast.test.ts similarity index 95% rename from src/test/moves/chloroblast.test.ts rename to test/moves/chloroblast.test.ts index 5e55bf46958..ee01935291a 100644 --- a/src/test/moves/chloroblast.test.ts +++ b/test/moves/chloroblast.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/clangorous_soul.test.ts b/test/moves/clangorous_soul.test.ts similarity index 98% rename from src/test/moves/clangorous_soul.test.ts rename to test/moves/clangorous_soul.test.ts index 52e980cc4fa..6bb50b9ba59 100644 --- a/src/test/moves/clangorous_soul.test.ts +++ b/test/moves/clangorous_soul.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/copycat.test.ts b/test/moves/copycat.test.ts similarity index 98% rename from src/test/moves/copycat.test.ts rename to test/moves/copycat.test.ts index d9e64289481..9b111c7b342 100644 --- a/src/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/crafty_shield.test.ts b/test/moves/crafty_shield.test.ts similarity index 98% rename from src/test/moves/crafty_shield.test.ts rename to test/moves/crafty_shield.test.ts index 93dd4a02538..054d19debf8 100644 --- a/src/test/moves/crafty_shield.test.ts +++ b/test/moves/crafty_shield.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/defog.test.ts b/test/moves/defog.test.ts similarity index 97% rename from src/test/moves/defog.test.ts rename to test/moves/defog.test.ts index c83cdc192bf..52c51df657a 100644 --- a/src/test/moves/defog.test.ts +++ b/test/moves/defog.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts similarity index 99% rename from src/test/moves/destiny_bond.test.ts rename to test/moves/destiny_bond.test.ts index e668aee2191..9ae37ef5b9b 100644 --- a/src/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/diamond_storm.test.ts b/test/moves/diamond_storm.test.ts similarity index 96% rename from src/test/moves/diamond_storm.test.ts rename to test/moves/diamond_storm.test.ts index 6e5be2a790d..7a30f73a113 100644 --- a/src/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dig.test.ts b/test/moves/dig.test.ts similarity index 98% rename from src/test/moves/dig.test.ts rename to test/moves/dig.test.ts index 4c6b5d3b75d..53104f13b20 100644 --- a/src/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -7,7 +7,7 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { MoveResult } from "#app/field/pokemon"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Dig", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/disable.test.ts b/test/moves/disable.test.ts similarity index 98% rename from src/test/moves/disable.test.ts rename to test/moves/disable.test.ts index bd56201ad33..044cfc762cd 100644 --- a/src/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Disable", () => { diff --git a/src/test/moves/dive.test.ts b/test/moves/dive.test.ts similarity index 98% rename from src/test/moves/dive.test.ts rename to test/moves/dive.test.ts index b60416d7740..e8febaa72f6 100644 --- a/src/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; import { WeatherType } from "#enums/weather-type"; diff --git a/src/test/moves/doodle.test.ts b/test/moves/doodle.test.ts similarity index 97% rename from src/test/moves/doodle.test.ts rename to test/moves/doodle.test.ts index 258abda392a..6272a822094 100644 --- a/src/test/moves/doodle.test.ts +++ b/test/moves/doodle.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/double_team.test.ts b/test/moves/double_team.test.ts similarity index 96% rename from src/test/moves/double_team.test.ts rename to test/moves/double_team.test.ts index 62848553e06..9145265bf93 100644 --- a/src/test/moves/double_team.test.ts +++ b/test/moves/double_team.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts similarity index 98% rename from src/test/moves/dragon_cheer.test.ts rename to test/moves/dragon_cheer.test.ts index 750f09214ca..44bedeaa03a 100644 --- a/src/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts similarity index 98% rename from src/test/moves/dragon_rage.test.ts rename to test/moves/dragon_rage.test.ts index 61630ede326..0a5202825f5 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts similarity index 99% rename from src/test/moves/dragon_tail.test.ts rename to test/moves/dragon_tail.test.ts index 96db67279d3..8415251c24c 100644 --- a/src/test/moves/dragon_tail.test.ts +++ b/test/moves/dragon_tail.test.ts @@ -7,7 +7,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts similarity index 99% rename from src/test/moves/dynamax_cannon.test.ts rename to test/moves/dynamax_cannon.test.ts index 033d8960bad..0deb12b2737 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -4,7 +4,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts similarity index 98% rename from src/test/moves/effectiveness.test.ts rename to test/moves/effectiveness.test.ts index 09c94c740cc..d9974fd1980 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/electrify.test.ts b/test/moves/electrify.test.ts similarity index 97% rename from src/test/moves/electrify.test.ts rename to test/moves/electrify.test.ts index 8015dd0a74d..f7d78a2f4d0 100644 --- a/src/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/electro_shot.test.ts b/test/moves/electro_shot.test.ts similarity index 98% rename from src/test/moves/electro_shot.test.ts rename to test/moves/electro_shot.test.ts index 283154b3408..7cc7e793f4a 100644 --- a/src/test/moves/electro_shot.test.ts +++ b/test/moves/electro_shot.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/encore.test.ts b/test/moves/encore.test.ts similarity index 98% rename from src/test/moves/encore.test.ts rename to test/moves/encore.test.ts index 7d8dc9658bf..4cf466a7f2a 100644 --- a/src/test/moves/encore.test.ts +++ b/test/moves/encore.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/endure.test.ts b/test/moves/endure.test.ts similarity index 97% rename from src/test/moves/endure.test.ts rename to test/moves/endure.test.ts index bde5a26f68e..8514470d59c 100644 --- a/src/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts similarity index 96% rename from src/test/moves/entrainment.test.ts rename to test/moves/entrainment.test.ts index 5d0991c8dfd..608c6ef3676 100644 --- a/src/test/moves/entrainment.test.ts +++ b/test/moves/entrainment.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fairy_lock.test.ts b/test/moves/fairy_lock.test.ts similarity index 99% rename from src/test/moves/fairy_lock.test.ts rename to test/moves/fairy_lock.test.ts index ceb298ed0fe..627eac401cc 100644 --- a/src/test/moves/fairy_lock.test.ts +++ b/test/moves/fairy_lock.test.ts @@ -3,7 +3,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fake_out.test.ts b/test/moves/fake_out.test.ts similarity index 98% rename from src/test/moves/fake_out.test.ts rename to test/moves/fake_out.test.ts index f20b6db3a13..21a129b6410 100644 --- a/src/test/moves/fake_out.test.ts +++ b/test/moves/fake_out.test.ts @@ -1,4 +1,4 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts similarity index 99% rename from src/test/moves/fell_stinger.test.ts rename to test/moves/fell_stinger.test.ts index a901ddced44..fdcba624e22 100644 --- a/src/test/moves/fell_stinger.test.ts +++ b/test/moves/fell_stinger.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/fillet_away.test.ts b/test/moves/fillet_away.test.ts similarity index 98% rename from src/test/moves/fillet_away.test.ts rename to test/moves/fillet_away.test.ts index aa3243270cb..076a3011afa 100644 --- a/src/test/moves/fillet_away.test.ts +++ b/test/moves/fillet_away.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/fissure.test.ts b/test/moves/fissure.test.ts similarity index 97% rename from src/test/moves/fissure.test.ts rename to test/moves/fissure.test.ts index 65719df0205..07f2a3bfacb 100644 --- a/src/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -5,7 +5,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flame_burst.test.ts b/test/moves/flame_burst.test.ts similarity index 98% rename from src/test/moves/flame_burst.test.ts rename to test/moves/flame_burst.test.ts index 9dea930d7e8..7bcf06d92ae 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/test/moves/flame_burst.test.ts @@ -4,7 +4,7 @@ import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts similarity index 98% rename from src/test/moves/flower_shield.test.ts rename to test/moves/flower_shield.test.ts index 4c03df5212b..d6f79c40533 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fly.test.ts b/test/moves/fly.test.ts similarity index 98% rename from src/test/moves/fly.test.ts rename to test/moves/fly.test.ts index 6ae758fe3dc..b0abf96e128 100644 --- a/src/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts similarity index 98% rename from src/test/moves/focus_punch.test.ts rename to test/moves/focus_punch.test.ts index 44d9c92cac1..9bf858dfda5 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -6,7 +6,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/follow_me.test.ts b/test/moves/follow_me.test.ts similarity index 98% rename from src/test/moves/follow_me.test.ts rename to test/moves/follow_me.test.ts index fba7937f812..bef9b9ddb01 100644 --- a/src/test/moves/follow_me.test.ts +++ b/test/moves/follow_me.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/foresight.test.ts b/test/moves/foresight.test.ts similarity index 97% rename from src/test/moves/foresight.test.ts rename to test/moves/foresight.test.ts index 1195cd0b71b..7dccd0fefca 100644 --- a/src/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts similarity index 96% rename from src/test/moves/forests_curse.test.ts rename to test/moves/forests_curse.test.ts index 010b00599a5..c9977190c9d 100644 --- a/src/test/moves/forests_curse.test.ts +++ b/test/moves/forests_curse.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/freeze_dry.test.ts b/test/moves/freeze_dry.test.ts similarity index 99% rename from src/test/moves/freeze_dry.test.ts rename to test/moves/freeze_dry.test.ts index f207e297191..f07105882c2 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/test/moves/freeze_dry.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Type } from "#enums/type"; import { Challenges } from "#enums/challenges"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts similarity index 98% rename from src/test/moves/freezy_frost.test.ts rename to test/moves/freezy_frost.test.ts index 09d7779474f..26c7d06961f 100644 --- a/src/test/moves/freezy_frost.test.ts +++ b/test/moves/freezy_frost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/fusion_bolt.test.ts b/test/moves/fusion_bolt.test.ts similarity index 96% rename from src/test/moves/fusion_bolt.test.ts rename to test/moves/fusion_bolt.test.ts index 4e35b939abf..9bb53ef8fb0 100644 --- a/src/test/moves/fusion_bolt.test.ts +++ b/test/moves/fusion_bolt.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare.test.ts b/test/moves/fusion_flare.test.ts similarity index 96% rename from src/test/moves/fusion_flare.test.ts rename to test/moves/fusion_flare.test.ts index 75641c04d02..02f5b19d97f 100644 --- a/src/test/moves/fusion_flare.test.ts +++ b/test/moves/fusion_flare.test.ts @@ -2,7 +2,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts similarity index 99% rename from src/test/moves/fusion_flare_bolt.test.ts rename to test/moves/fusion_flare_bolt.test.ts index dbd4479dff8..340020c85b7 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -7,7 +7,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/future_sight.test.ts b/test/moves/future_sight.test.ts similarity index 95% rename from src/test/moves/future_sight.test.ts rename to test/moves/future_sight.test.ts index d0110a87202..e0a9a1efd04 100644 --- a/src/test/moves/future_sight.test.ts +++ b/test/moves/future_sight.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/gastro_acid.test.ts b/test/moves/gastro_acid.test.ts similarity index 97% rename from src/test/moves/gastro_acid.test.ts rename to test/moves/gastro_acid.test.ts index ec9246c855c..2e4f7938306 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/test/moves/gastro_acid.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts similarity index 97% rename from src/test/moves/geomancy.test.ts rename to test/moves/geomancy.test.ts index 9ff3a1e7a7d..914e4f7188a 100644 --- a/src/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/gigaton_hammer.test.ts b/test/moves/gigaton_hammer.test.ts similarity index 97% rename from src/test/moves/gigaton_hammer.test.ts rename to test/moves/gigaton_hammer.test.ts index f54700fe660..37735b29a3b 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/test/moves/gigaton_hammer.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts similarity index 98% rename from src/test/moves/glaive_rush.test.ts rename to test/moves/glaive_rush.test.ts index 9cfbfdd8727..557d003e541 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/growth.test.ts b/test/moves/growth.test.ts similarity index 96% rename from src/test/moves/growth.test.ts rename to test/moves/growth.test.ts index a66e4ec6719..dfc41acd757 100644 --- a/src/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/grudge.test.ts b/test/moves/grudge.test.ts similarity index 98% rename from src/test/moves/grudge.test.ts rename to test/moves/grudge.test.ts index 340808929ab..4b9683dd417 100644 --- a/src/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/guard_split.test.ts b/test/moves/guard_split.test.ts similarity index 97% rename from src/test/moves/guard_split.test.ts rename to test/moves/guard_split.test.ts index 519f347b920..af5023608d3 100644 --- a/src/test/moves/guard_split.test.ts +++ b/test/moves/guard_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/guard_swap.test.ts b/test/moves/guard_swap.test.ts similarity index 97% rename from src/test/moves/guard_swap.test.ts rename to test/moves/guard_swap.test.ts index 99769b32899..592307ff168 100644 --- a/src/test/moves/guard_swap.test.ts +++ b/test/moves/guard_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts similarity index 97% rename from src/test/moves/hard_press.test.ts rename to test/moves/hard_press.test.ts index 0fa4181491c..29a386207ad 100644 --- a/src/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -3,7 +3,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/haze.test.ts b/test/moves/haze.test.ts similarity index 97% rename from src/test/moves/haze.test.ts rename to test/moves/haze.test.ts index 30aab8bd98c..11071bdc07d 100644 --- a/src/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/heal_bell.test.ts b/test/moves/heal_bell.test.ts similarity index 98% rename from src/test/moves/heal_bell.test.ts rename to test/moves/heal_bell.test.ts index b180588d3a3..72957ee21e7 100644 --- a/src/test/moves/heal_bell.test.ts +++ b/test/moves/heal_bell.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/heal_block.test.ts b/test/moves/heal_block.test.ts similarity index 98% rename from src/test/moves/heal_block.test.ts rename to test/moves/heal_block.test.ts index 25f2076ff3e..a0e8eaf541c 100644 --- a/src/test/moves/heal_block.test.ts +++ b/test/moves/heal_block.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/heart_swap.test.ts b/test/moves/heart_swap.test.ts similarity index 96% rename from src/test/moves/heart_swap.test.ts rename to test/moves/heart_swap.test.ts index a128549c459..43569a32a69 100644 --- a/src/test/moves/heart_swap.test.ts +++ b/test/moves/heart_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts similarity index 97% rename from src/test/moves/hyper_beam.test.ts rename to test/moves/hyper_beam.test.ts index af8440a0911..5869655948c 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/test/moves/hyper_beam.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/imprison.test.ts b/test/moves/imprison.test.ts similarity index 98% rename from src/test/moves/imprison.test.ts rename to test/moves/imprison.test.ts index f10e20dab63..85d529d7a74 100644 --- a/src/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/instruct.test.ts b/test/moves/instruct.test.ts similarity index 99% rename from src/test/moves/instruct.test.ts rename to test/moves/instruct.test.ts index b26f9c9669f..db9801932cc 100644 --- a/src/test/moves/instruct.test.ts +++ b/test/moves/instruct.test.ts @@ -5,7 +5,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/jaw_lock.test.ts b/test/moves/jaw_lock.test.ts similarity index 99% rename from src/test/moves/jaw_lock.test.ts rename to test/moves/jaw_lock.test.ts index 30dbcac64a8..4f9c6481a9a 100644 --- a/src/test/moves/jaw_lock.test.ts +++ b/test/moves/jaw_lock.test.ts @@ -5,7 +5,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts similarity index 96% rename from src/test/moves/lash_out.test.ts rename to test/moves/lash_out.test.ts index 014c0ae8fe5..3fe5c56dd3e 100644 --- a/src/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts similarity index 99% rename from src/test/moves/last_respects.test.ts rename to test/moves/last_respects.test.ts index 71a76e3fa1a..54e4bc5a0bc 100644 --- a/src/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { allMoves } from "#app/data/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import Phaser from "phaser"; diff --git a/src/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts similarity index 98% rename from src/test/moves/light_screen.test.ts rename to test/moves/light_screen.test.ts index 424f43e155c..8eee58c8e17 100644 --- a/src/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/lucky_chant.test.ts b/test/moves/lucky_chant.test.ts similarity index 98% rename from src/test/moves/lucky_chant.test.ts rename to test/moves/lucky_chant.test.ts index 02e9dd24465..7f943732192 100644 --- a/src/test/moves/lucky_chant.test.ts +++ b/test/moves/lucky_chant.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Lucky Chant", () => { diff --git a/src/test/moves/lunar_blessing.test.ts b/test/moves/lunar_blessing.test.ts similarity index 97% rename from src/test/moves/lunar_blessing.test.ts rename to test/moves/lunar_blessing.test.ts index 52c41a30e11..a81e967a6d9 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/test/moves/lunar_blessing.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/lunar_dance.test.ts b/test/moves/lunar_dance.test.ts similarity index 98% rename from src/test/moves/lunar_dance.test.ts rename to test/moves/lunar_dance.test.ts index 603247298ac..37e96e0dc3e 100644 --- a/src/test/moves/lunar_dance.test.ts +++ b/test/moves/lunar_dance.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts similarity index 99% rename from src/test/moves/magic_coat.test.ts rename to test/moves/magic_coat.test.ts index 7371c89d4ac..6ecbea435b6 100644 --- a/src/test/moves/magic_coat.test.ts +++ b/test/moves/magic_coat.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Magic Coat", () => { diff --git a/src/test/moves/magnet_rise.test.ts b/test/moves/magnet_rise.test.ts similarity index 97% rename from src/test/moves/magnet_rise.test.ts rename to test/moves/magnet_rise.test.ts index b26bbf42ed0..e4ceeaea929 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/test/moves/magnet_rise.test.ts @@ -2,7 +2,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/make_it_rain.test.ts b/test/moves/make_it_rain.test.ts similarity index 98% rename from src/test/moves/make_it_rain.test.ts rename to test/moves/make_it_rain.test.ts index 08021227e9c..8de6777bddf 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/test/moves/make_it_rain.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveEndPhase } from "#app/phases/move-end-phase"; diff --git a/src/test/moves/mat_block.test.ts b/test/moves/mat_block.test.ts similarity index 98% rename from src/test/moves/mat_block.test.ts rename to test/moves/mat_block.test.ts index a4d9177cbdc..b9e66253058 100644 --- a/src/test/moves/mat_block.test.ts +++ b/test/moves/mat_block.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/metal_burst.test.ts b/test/moves/metal_burst.test.ts similarity index 98% rename from src/test/moves/metal_burst.test.ts rename to test/moves/metal_burst.test.ts index 3b32dd322a3..7f7cfa841da 100644 --- a/src/test/moves/metal_burst.test.ts +++ b/test/moves/metal_burst.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/metronome.test.ts b/test/moves/metronome.test.ts similarity index 98% rename from src/test/moves/metronome.test.ts rename to test/moves/metronome.test.ts index 946dc92de0f..85c027b62e3 100644 --- a/src/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -5,7 +5,7 @@ import { Stat } from "#app/enums/stat"; import { CommandPhase } from "#app/phases/command-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/miracle_eye.test.ts b/test/moves/miracle_eye.test.ts similarity index 96% rename from src/test/moves/miracle_eye.test.ts rename to test/moves/miracle_eye.test.ts index 70f487de942..068f4f70493 100644 --- a/src/test/moves/miracle_eye.test.ts +++ b/test/moves/miracle_eye.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mirror_move.test.ts b/test/moves/mirror_move.test.ts similarity index 98% rename from src/test/moves/mirror_move.test.ts rename to test/moves/mirror_move.test.ts index e55c55038ae..a6fe90548be 100644 --- a/src/test/moves/mirror_move.test.ts +++ b/test/moves/mirror_move.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mist.test.ts b/test/moves/mist.test.ts similarity index 96% rename from src/test/moves/mist.test.ts rename to test/moves/mist.test.ts index cd338f79412..a9b69bccc6c 100644 --- a/src/test/moves/mist.test.ts +++ b/test/moves/mist.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts similarity index 97% rename from src/test/moves/moongeist_beam.test.ts rename to test/moves/moongeist_beam.test.ts index 216eee482fb..15a5787be41 100644 --- a/src/test/moves/moongeist_beam.test.ts +++ b/test/moves/moongeist_beam.test.ts @@ -2,7 +2,7 @@ import { allMoves, RandomMoveAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/multi_target.test.ts b/test/moves/multi_target.test.ts similarity index 98% rename from src/test/moves/multi_target.test.ts rename to test/moves/multi_target.test.ts index 965876d3445..a2379524c73 100644 --- a/src/test/moves/multi_target.test.ts +++ b/test/moves/multi_target.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts similarity index 96% rename from src/test/moves/nightmare.test.ts rename to test/moves/nightmare.test.ts index 850b0793b1e..0a2392fe833 100644 --- a/src/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts similarity index 98% rename from src/test/moves/obstruct.test.ts rename to test/moves/obstruct.test.ts index 1649c199e32..e2c469e21f0 100644 --- a/src/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/octolock.test.ts b/test/moves/octolock.test.ts similarity index 98% rename from src/test/moves/octolock.test.ts rename to test/moves/octolock.test.ts index 6ca96eeb464..882a2357e1a 100644 --- a/src/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/order_up.test.ts b/test/moves/order_up.test.ts similarity index 98% rename from src/test/moves/order_up.test.ts rename to test/moves/order_up.test.ts index a9281b121b2..339f3f31584 100644 --- a/src/test/moves/order_up.test.ts +++ b/test/moves/order_up.test.ts @@ -6,7 +6,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/parting_shot.test.ts b/test/moves/parting_shot.test.ts similarity index 99% rename from src/test/moves/parting_shot.test.ts rename to test/moves/parting_shot.test.ts index 30ad3660a32..43a6d833949 100644 --- a/src/test/moves/parting_shot.test.ts +++ b/test/moves/parting_shot.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Stat } from "#enums/stat"; import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; diff --git a/src/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts similarity index 98% rename from src/test/moves/plasma_fists.test.ts rename to test/moves/plasma_fists.test.ts index 4075c1ab988..5a2ec90f60b 100644 --- a/src/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts similarity index 99% rename from src/test/moves/pledge_moves.test.ts rename to test/moves/pledge_moves.test.ts index 64d586e7ba4..24fff05a25d 100644 --- a/src/test/moves/pledge_moves.test.ts +++ b/test/moves/pledge_moves.test.ts @@ -9,7 +9,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/powder.test.ts b/test/moves/powder.test.ts similarity index 99% rename from src/test/moves/powder.test.ts rename to test/moves/powder.test.ts index a1db2bced3a..24162825230 100644 --- a/src/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/power_shift.test.ts b/test/moves/power_shift.test.ts similarity index 97% rename from src/test/moves/power_shift.test.ts rename to test/moves/power_shift.test.ts index e389f77bedf..bb98d8cf3ed 100644 --- a/src/test/moves/power_shift.test.ts +++ b/test/moves/power_shift.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/power_split.test.ts b/test/moves/power_split.test.ts similarity index 97% rename from src/test/moves/power_split.test.ts rename to test/moves/power_split.test.ts index 914fa86e491..69ea92c69ef 100644 --- a/src/test/moves/power_split.test.ts +++ b/test/moves/power_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_swap.test.ts b/test/moves/power_swap.test.ts similarity index 97% rename from src/test/moves/power_swap.test.ts rename to test/moves/power_swap.test.ts index e9a4b569c92..637714f1277 100644 --- a/src/test/moves/power_swap.test.ts +++ b/test/moves/power_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_trick.test.ts b/test/moves/power_trick.test.ts similarity index 98% rename from src/test/moves/power_trick.test.ts rename to test/moves/power_trick.test.ts index a064a43dec4..e60172b5304 100644 --- a/src/test/moves/power_trick.test.ts +++ b/test/moves/power_trick.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Species } from "#enums/species"; diff --git a/src/test/moves/protect.test.ts b/test/moves/protect.test.ts similarity index 98% rename from src/test/moves/protect.test.ts rename to test/moves/protect.test.ts index e639969ddf0..d502e997483 100644 --- a/src/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/psycho_shift.test.ts b/test/moves/psycho_shift.test.ts similarity index 96% rename from src/test/moves/psycho_shift.test.ts rename to test/moves/psycho_shift.test.ts index 448a8c99ef0..d5890a3af0b 100644 --- a/src/test/moves/psycho_shift.test.ts +++ b/test/moves/psycho_shift.test.ts @@ -2,7 +2,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/purify.test.ts b/test/moves/purify.test.ts similarity index 97% rename from src/test/moves/purify.test.ts rename to test/moves/purify.test.ts index d72b4a87d2a..eba8e9d851f 100644 --- a/src/test/moves/purify.test.ts +++ b/test/moves/purify.test.ts @@ -5,7 +5,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/quash.test.ts b/test/moves/quash.test.ts similarity index 98% rename from src/test/moves/quash.test.ts rename to test/moves/quash.test.ts index 3cbe79d7bfe..dd91820a8db 100644 --- a/src/test/moves/quash.test.ts +++ b/test/moves/quash.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { BattlerIndex } from "#app/battle"; import { WeatherType } from "#enums/weather-type"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; diff --git a/src/test/moves/quick_guard.test.ts b/test/moves/quick_guard.test.ts similarity index 98% rename from src/test/moves/quick_guard.test.ts rename to test/moves/quick_guard.test.ts index 7bda71782aa..c326e77d057 100644 --- a/src/test/moves/quick_guard.test.ts +++ b/test/moves/quick_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts similarity index 98% rename from src/test/moves/rage_fist.test.ts rename to test/moves/rage_fist.test.ts index a85be5a88d9..4d17cf990f7 100644 --- a/src/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { allMoves } from "#app/data/move"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/rage_powder.test.ts b/test/moves/rage_powder.test.ts similarity index 97% rename from src/test/moves/rage_powder.test.ts rename to test/moves/rage_powder.test.ts index 1b73a7f0f5f..15a9bfd951c 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/test/moves/rage_powder.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/reflect.test.ts b/test/moves/reflect.test.ts similarity index 98% rename from src/test/moves/reflect.test.ts rename to test/moves/reflect.test.ts index aa9f2095c89..edc3f1ab8aa 100644 --- a/src/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts similarity index 97% rename from src/test/moves/reflect_type.test.ts rename to test/moves/reflect_type.test.ts index 50e0fc2fbe6..575f4b88f86 100644 --- a/src/test/moves/reflect_type.test.ts +++ b/test/moves/reflect_type.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts similarity index 97% rename from src/test/moves/relic_song.test.ts rename to test/moves/relic_song.test.ts index c09514850eb..f28047bb90e 100644 --- a/src/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -3,7 +3,7 @@ import { Challenges } from "#app/enums/challenges"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts similarity index 96% rename from src/test/moves/retaliate.test.ts rename to test/moves/retaliate.test.ts index e00b9da6010..32d5379f05e 100644 --- a/src/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts similarity index 98% rename from src/test/moves/revival_blessing.test.ts rename to test/moves/revival_blessing.test.ts index cdde3941d30..647771fa23b 100644 --- a/src/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -4,7 +4,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/role_play.test.ts b/test/moves/role_play.test.ts similarity index 96% rename from src/test/moves/role_play.test.ts rename to test/moves/role_play.test.ts index a37f4faac9b..edc41de5c68 100644 --- a/src/test/moves/role_play.test.ts +++ b/test/moves/role_play.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/rollout.test.ts b/test/moves/rollout.test.ts similarity index 98% rename from src/test/moves/rollout.test.ts rename to test/moves/rollout.test.ts index 199f4e1dcf2..c58ab3e6a18 100644 --- a/src/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/roost.test.ts b/test/moves/roost.test.ts similarity index 99% rename from src/test/moves/roost.test.ts rename to test/moves/roost.test.ts index 69301dc86cf..b9424747f5e 100644 --- a/src/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/round.test.ts b/test/moves/round.test.ts similarity index 97% rename from src/test/moves/round.test.ts rename to test/moves/round.test.ts index 1d7c91bcbd4..5d26e242aff 100644 --- a/src/test/moves/round.test.ts +++ b/test/moves/round.test.ts @@ -4,7 +4,7 @@ import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts similarity index 98% rename from src/test/moves/safeguard.test.ts rename to test/moves/safeguard.test.ts index 6505162fd04..9768b24f170 100644 --- a/src/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities, PostDefendContactApplyStatusEffectAbAttr } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts similarity index 98% rename from src/test/moves/scale_shot.test.ts rename to test/moves/scale_shot.test.ts index cbaa6611f3e..76954ba2413 100644 --- a/src/test/moves/scale_shot.test.ts +++ b/test/moves/scale_shot.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts similarity index 98% rename from src/test/moves/secret_power.test.ts rename to test/moves/secret_power.test.ts index 09fe5faa50b..f155633d545 100644 --- a/src/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { allMoves } from "#app/data/move"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts similarity index 97% rename from src/test/moves/shed_tail.test.ts rename to test/moves/shed_tail.test.ts index 33a7d81e460..37f046ba2fa 100644 --- a/src/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts similarity index 97% rename from src/test/moves/shell_side_arm.test.ts rename to test/moves/shell_side_arm.test.ts index 41cbefb186b..3a658d53a83 100644 --- a/src/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -3,7 +3,7 @@ import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts similarity index 98% rename from src/test/moves/shell_trap.test.ts rename to test/moves/shell_trap.test.ts index 04d3cf998b1..aa94d0cab1b 100644 --- a/src/test/moves/shell_trap.test.ts +++ b/test/moves/shell_trap.test.ts @@ -6,7 +6,7 @@ import { MoveResult } from "#app/field/pokemon"; import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/simple_beam.test.ts b/test/moves/simple_beam.test.ts similarity index 95% rename from src/test/moves/simple_beam.test.ts rename to test/moves/simple_beam.test.ts index b4566669e8d..1fb8b54e8aa 100644 --- a/src/test/moves/simple_beam.test.ts +++ b/test/moves/simple_beam.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sketch.test.ts b/test/moves/sketch.test.ts similarity index 98% rename from src/test/moves/sketch.test.ts rename to test/moves/sketch.test.ts index f531f44ef0c..e736893b0aa 100644 --- a/src/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult, PokemonMove } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#app/enums/status-effect"; diff --git a/src/test/moves/skill_swap.test.ts b/test/moves/skill_swap.test.ts similarity index 96% rename from src/test/moves/skill_swap.test.ts rename to test/moves/skill_swap.test.ts index 9c0f0b75ade..e39dac8bb01 100644 --- a/src/test/moves/skill_swap.test.ts +++ b/test/moves/skill_swap.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sleep_talk.test.ts b/test/moves/sleep_talk.test.ts similarity index 97% rename from src/test/moves/sleep_talk.test.ts rename to test/moves/sleep_talk.test.ts index 9ad2d23f903..b9c98f4fb65 100644 --- a/src/test/moves/sleep_talk.test.ts +++ b/test/moves/sleep_talk.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts similarity index 98% rename from src/test/moves/solar_beam.test.ts rename to test/moves/solar_beam.test.ts index ebec338932a..7f18cebff6d 100644 --- a/src/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts similarity index 98% rename from src/test/moves/sparkly_swirl.test.ts rename to test/moves/sparkly_swirl.test.ts index a83f1c3a437..53851cb77d3 100644 --- a/src/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -4,7 +4,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts similarity index 99% rename from src/test/moves/spectral_thief.test.ts rename to test/moves/spectral_thief.test.ts index 8913b7f3683..883f280da08 100644 --- a/src/test/moves/spectral_thief.test.ts +++ b/test/moves/spectral_thief.test.ts @@ -5,7 +5,7 @@ import { allMoves } from "#app/data/move"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/speed_swap.test.ts b/test/moves/speed_swap.test.ts similarity index 96% rename from src/test/moves/speed_swap.test.ts rename to test/moves/speed_swap.test.ts index 179f1212394..5cdea223296 100644 --- a/src/test/moves/speed_swap.test.ts +++ b/test/moves/speed_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/spikes.test.ts b/test/moves/spikes.test.ts similarity index 97% rename from src/test/moves/spikes.test.ts rename to test/moves/spikes.test.ts index 35e89c8caf7..11ef295a62f 100644 --- a/src/test/moves/spikes.test.ts +++ b/test/moves/spikes.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts similarity index 99% rename from src/test/moves/spit_up.test.ts rename to test/moves/spit_up.test.ts index 7f9dfaad38b..125b17891ed 100644 --- a/src/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -4,7 +4,7 @@ import { allMoves } from "#app/data/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import type { TurnMove } from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/spotlight.test.ts b/test/moves/spotlight.test.ts similarity index 97% rename from src/test/moves/spotlight.test.ts rename to test/moves/spotlight.test.ts index 095f7d80bfe..2a883d403a7 100644 --- a/src/test/moves/spotlight.test.ts +++ b/test/moves/spotlight.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts similarity index 97% rename from src/test/moves/steamroller.test.ts rename to test/moves/steamroller.test.ts index f641c58c2d1..2aed941fd92 100644 --- a/src/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -5,7 +5,7 @@ import type { DamageCalculationResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts similarity index 98% rename from src/test/moves/stockpile.test.ts rename to test/moves/stockpile.test.ts index f83459cd09d..0d0a1de4840 100644 --- a/src/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -7,7 +7,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/substitute.test.ts b/test/moves/substitute.test.ts similarity index 99% rename from src/test/moves/substitute.test.ts rename to test/moves/substitute.test.ts index 18b0c6ea536..5acbb6c0a44 100644 --- a/src/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -4,7 +4,7 @@ import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; import { MoveResult } from "#app/field/pokemon"; import type { CommandPhase } from "#app/phases/command-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/moves/swallow.test.ts b/test/moves/swallow.test.ts similarity index 99% rename from src/test/moves/swallow.test.ts rename to test/moves/swallow.test.ts index b2435ba77b3..1ede5808d82 100644 --- a/src/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -8,7 +8,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/syrup_bomb.test.ts b/test/moves/syrup_bomb.test.ts similarity index 98% rename from src/test/moves/syrup_bomb.test.ts rename to test/moves/syrup_bomb.test.ts index ea2f8b6bab3..a284e6fa669 100644 --- a/src/test/moves/syrup_bomb.test.ts +++ b/test/moves/syrup_bomb.test.ts @@ -3,7 +3,7 @@ import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tackle.test.ts b/test/moves/tackle.test.ts similarity index 97% rename from src/test/moves/tackle.test.ts rename to test/moves/tackle.test.ts index ff50f027f87..2ee811d3137 100644 --- a/src/test/moves/tackle.test.ts +++ b/test/moves/tackle.test.ts @@ -3,7 +3,7 @@ import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tail_whip.test.ts b/test/moves/tail_whip.test.ts similarity index 96% rename from src/test/moves/tail_whip.test.ts rename to test/moves/tail_whip.test.ts index 5c83feb8a4e..fea334e4708 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/test/moves/tail_whip.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts similarity index 98% rename from src/test/moves/tailwind.test.ts rename to test/moves/tailwind.test.ts index a26dde82824..56cf85749cd 100644 --- a/src/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -4,7 +4,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts similarity index 98% rename from src/test/moves/tar_shot.test.ts rename to test/moves/tar_shot.test.ts index 66f540e4f9f..1a259206e48 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/taunt.test.ts b/test/moves/taunt.test.ts similarity index 96% rename from src/test/moves/taunt.test.ts rename to test/moves/taunt.test.ts index a425a048a2c..c5cdd512704 100644 --- a/src/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts similarity index 99% rename from src/test/moves/telekinesis.test.ts rename to test/moves/telekinesis.test.ts index ba2bc40a189..441c70fff34 100644 --- a/src/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts similarity index 96% rename from src/test/moves/tera_blast.test.ts rename to test/moves/tera_blast.test.ts index 08e401ef9d1..22231ec6e46 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts similarity index 98% rename from src/test/moves/tera_starstorm.test.ts rename to test/moves/tera_starstorm.test.ts index 1e934b88c86..219a64b4ecc 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/thousand_arrows.test.ts b/test/moves/thousand_arrows.test.ts similarity index 98% rename from src/test/moves/thousand_arrows.test.ts rename to test/moves/thousand_arrows.test.ts index 976b4352ee4..563f99c030d 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/test/moves/thousand_arrows.test.ts @@ -4,7 +4,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/throat_chop.test.ts b/test/moves/throat_chop.test.ts similarity index 96% rename from src/test/moves/throat_chop.test.ts rename to test/moves/throat_chop.test.ts index 24293f8d086..d69205aadf3 100644 --- a/src/test/moves/throat_chop.test.ts +++ b/test/moves/throat_chop.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/thunder_wave.test.ts b/test/moves/thunder_wave.test.ts similarity index 98% rename from src/test/moves/thunder_wave.test.ts rename to test/moves/thunder_wave.test.ts index 21e215a51f2..34ab64e081a 100644 --- a/src/test/moves/thunder_wave.test.ts +++ b/test/moves/thunder_wave.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tidy_up.test.ts b/test/moves/tidy_up.test.ts similarity index 98% rename from src/test/moves/tidy_up.test.ts rename to test/moves/tidy_up.test.ts index 255967b40ac..5b5b67847ce 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/test/moves/tidy_up.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SubstituteTag } from "#app/data/battler-tags"; diff --git a/src/test/moves/torment.test.ts b/test/moves/torment.test.ts similarity index 97% rename from src/test/moves/torment.test.ts rename to test/moves/torment.test.ts index b4c9a059db1..8cc835aad48 100644 --- a/src/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/toxic.test.ts b/test/moves/toxic.test.ts similarity index 98% rename from src/test/moves/toxic.test.ts rename to test/moves/toxic.test.ts index b146134ae51..8e66fefe6ff 100644 --- a/src/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -1,6 +1,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/toxic_spikes.test.ts b/test/moves/toxic_spikes.test.ts similarity index 98% rename from src/test/moves/toxic_spikes.test.ts rename to test/moves/toxic_spikes.test.ts index 8969289c2f2..2bddbc2eccb 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/test/moves/toxic_spikes.test.ts @@ -7,7 +7,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/transform.test.ts b/test/moves/transform.test.ts similarity index 98% rename from src/test/moves/transform.test.ts rename to test/moves/transform.test.ts index ffe935aa61b..781e83b7e89 100644 --- a/src/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts similarity index 96% rename from src/test/moves/trick_or_treat.test.ts rename to test/moves/trick_or_treat.test.ts index 5c85cac05e2..2efd1b76d1a 100644 --- a/src/test/moves/trick_or_treat.test.ts +++ b/test/moves/trick_or_treat.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts similarity index 97% rename from src/test/moves/triple_arrows.test.ts rename to test/moves/triple_arrows.test.ts index 98ad29997df..9aa08d7b670 100644 --- a/src/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -2,7 +2,7 @@ import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/u_turn.test.ts b/test/moves/u_turn.test.ts similarity index 98% rename from src/test/moves/u_turn.test.ts rename to test/moves/u_turn.test.ts index c6e255e01b2..f57dec2e39f 100644 --- a/src/test/moves/u_turn.test.ts +++ b/test/moves/u_turn.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/upper_hand.test.ts b/test/moves/upper_hand.test.ts similarity index 98% rename from src/test/moves/upper_hand.test.ts rename to test/moves/upper_hand.test.ts index f94197d3fbd..c7556c1fa91 100644 --- a/src/test/moves/upper_hand.test.ts +++ b/test/moves/upper_hand.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts similarity index 99% rename from src/test/moves/whirlwind.test.ts rename to test/moves/whirlwind.test.ts index 69232bee43a..8637b6ec02c 100644 --- a/src/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { Status } from "#app/data/status-effect"; diff --git a/src/test/moves/wide_guard.test.ts b/test/moves/wide_guard.test.ts similarity index 98% rename from src/test/moves/wide_guard.test.ts rename to test/moves/wide_guard.test.ts index c25a700c981..1f0579e24ee 100644 --- a/src/test/moves/wide_guard.test.ts +++ b/test/moves/wide_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/will_o_wisp.test.ts b/test/moves/will_o_wisp.test.ts similarity index 96% rename from src/test/moves/will_o_wisp.test.ts rename to test/moves/will_o_wisp.test.ts index 39729d331ad..473f0d4d0a8 100644 --- a/src/test/moves/will_o_wisp.test.ts +++ b/test/moves/will_o_wisp.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts similarity index 99% rename from src/test/mystery-encounter/encounter-test-utils.ts rename to test/mystery-encounter/encounter-test-utils.ts index 69fa9b5465f..97f292ef6b1 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import { isNullOrUndefined } from "#app/utils"; import { Button } from "#enums/buttons"; import { StatusEffect } from "#enums/status-effect"; -import type GameManager from "#test/utils/gameManager"; +import type GameManager from "#test/testUtils/gameManager"; import { expect, vi } from "vitest"; /** diff --git a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts rename to test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 5a01b8a7379..d7f0ed6e20e 100644 --- a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { EggTier } from "#enums/egg-type"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts rename to test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 797c062dafe..0503a60cf1b 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts rename to test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index 9a6dae53901..b88e02be6ab 100644 --- a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -3,7 +3,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { ShinyRateBoosterModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts rename to test/mystery-encounter/encounters/berries-abound-encounter.test.ts index f980b0cb20a..d623d1ce7a8 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; @@ -11,7 +11,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts rename to test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 1ff523909da..6827ea5a463 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -11,7 +11,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts rename to test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f95450bbf44..799e26ea271 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; import { TrainerType } from "#enums/trainer-type"; diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts rename to test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index ceb457666d7..46217cca5e2 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts rename to test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 8121916a4d7..baea430fdaf 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts rename to test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index e30aaadbf85..224a4403942 100644 --- a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts b/test/mystery-encounter/encounters/field-trip-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/field-trip-encounter.test.ts rename to test/mystery-encounter/encounters/field-trip-encounter.test.ts index bc9be246e10..b831a52f116 100644 --- a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts +++ b/test/mystery-encounter/encounters/field-trip-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts rename to test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 2f668dd7f50..96fac78d872 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { Gender } from "#app/data/gender"; @@ -18,7 +18,7 @@ import { Status } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts rename to test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index 8c869812f39..116c45c1faf 100644 --- a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts rename to test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index 44ddbb8f7ba..de351e48c76 100644 --- a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { Nature } from "#enums/nature"; diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts rename to test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index 60780984014..f898b1f574f 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts rename to test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 17e324f29f0..09ecbc6c31a 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -5,12 +5,12 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounter-test-utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts rename to test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 7729fa40599..e42cd321cde 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/part-timer-encounter.test.ts rename to test/mystery-encounter/encounters/part-timer-encounter.test.ts index e8f2af0de5f..0cd7bc9bc76 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/safari-zone.test.ts rename to test/mystery-encounter/encounters/safari-zone.test.ts index a807805b81c..068e28547f4 100644 --- a/src/test/mystery-encounter/encounters/safari-zone.test.ts +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -2,13 +2,13 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { getSafariSpeciesSpawn, SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; diff --git a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts rename to test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index a00cca5083c..c7fcc1e967f 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -8,13 +8,13 @@ import { Species } from "#enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts rename to test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index e6f8127b776..7b10adc9680 100644 --- a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -3,13 +3,13 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts rename to test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 4fd96f8d5bc..3a3d94dbc44 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { getSalesmanSpeciesOffer, ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts rename to test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 3c0e75a2195..1a075ffaff2 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -20,7 +20,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; diff --git a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts rename to test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index e087bc5c180..85dbb4e23ff 100644 --- a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts rename to test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 395e33e818a..90a13c75dc3 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { HitHealModifier, HealShopCostModifier, TurnHealModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts rename to test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 06bd382879f..ab50666ab3d 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -10,7 +10,7 @@ import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts rename to test/mystery-encounter/encounters/weird-dream-encounter.test.ts index 669a99b92cd..073893f340d 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; @@ -11,7 +11,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts similarity index 98% rename from src/test/mystery-encounter/mystery-encounter-utils.test.ts rename to test/mystery-encounter/mystery-encounter-utils.test.ts index 7c924b86e0d..dacfb5cc96e 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -6,10 +6,10 @@ import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPla import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#enums/type"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts similarity index 96% rename from src/test/mystery-encounter/mystery-encounter.test.ts rename to test/mystery-encounter/mystery-encounter.test.ts index 7958fc1cd46..c70193a5d56 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts similarity index 97% rename from src/test/phases/form-change-phase.test.ts rename to test/phases/form-change-phase.test.ts index 07e59cafe1c..10287cd2046 100644 --- a/src/test/phases/form-change-phase.test.ts +++ b/test/phases/form-change-phase.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { Type } from "#enums/type"; diff --git a/src/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts similarity index 97% rename from src/test/phases/frenzy-move-reset.test.ts rename to test/phases/frenzy-move-reset.test.ts index db9ec2bfe66..0bea8e87f47 100644 --- a/src/test/phases/frenzy-move-reset.test.ts +++ b/test/phases/frenzy-move-reset.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { StatusEffect } from "#enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/phases/game-over-phase.test.ts b/test/phases/game-over-phase.test.ts similarity index 98% rename from src/test/phases/game-over-phase.test.ts rename to test/phases/game-over-phase.test.ts index 2e19d5fe954..4f5e215959a 100644 --- a/src/test/phases/game-over-phase.test.ts +++ b/test/phases/game-over-phase.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#enums/biome"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { achvs } from "#app/system/achv"; diff --git a/src/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts similarity index 99% rename from src/test/phases/learn-move-phase.test.ts rename to test/phases/learn-move-phase.test.ts index 3a3d111f551..6eb86620877 100644 --- a/src/test/phases/learn-move-phase.test.ts +++ b/test/phases/learn-move-phase.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts similarity index 98% rename from src/test/phases/mystery-encounter-phase.test.ts rename to test/phases/mystery-encounter-phase.test.ts index 507862534af..aa4e1683aae 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/phases.test.ts b/test/phases/phases.test.ts similarity index 96% rename from src/test/phases/phases.test.ts rename to test/phases/phases.test.ts index 36a405b8d15..4aabeb55b9e 100644 --- a/src/test/phases/phases.test.ts +++ b/test/phases/phases.test.ts @@ -3,7 +3,7 @@ import { LoginPhase } from "#app/phases/login-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { UnavailablePhase } from "#app/phases/unavailable-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts similarity index 98% rename from src/test/phases/select-modifier-phase.test.ts rename to test/phases/select-modifier-phase.test.ts index 23fab729838..0949eeec955 100644 --- a/src/test/phases/select-modifier-phase.test.ts +++ b/test/phases/select-modifier-phase.test.ts @@ -12,8 +12,8 @@ import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-account-api.test.ts rename to test/plugins/api/pokerogue-account-api.test.ts index 90a7d3639ad..e9033c859de 100644 --- a/src/test/plugins/api/pokerogue-account-api.test.ts +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -1,7 +1,7 @@ import type { AccountInfoResponse } from "#app/@types/PokerogueAccountApi"; import { SESSION_ID_COOKIE_NAME } from "#app/constants"; import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import * as Utils from "#app/utils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-admin-api.test.ts rename to test/plugins/api/pokerogue-admin-api.test.ts index 5ae46abfcc8..5af55967ae2 100644 --- a/src/test/plugins/api/pokerogue-admin-api.test.ts +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -7,7 +7,7 @@ import type { UnlinkAccountFromGoogledIdRequest, } from "#app/@types/PokerogueAdminApi"; import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-api.test.ts b/test/plugins/api/pokerogue-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-api.test.ts rename to test/plugins/api/pokerogue-api.test.ts index a62174c226d..241453866a5 100644 --- a/src/test/plugins/api/pokerogue-api.test.ts +++ b/test/plugins/api/pokerogue-api.test.ts @@ -1,6 +1,6 @@ import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-daily-api.test.ts b/test/plugins/api/pokerogue-daily-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-daily-api.test.ts rename to test/plugins/api/pokerogue-daily-api.test.ts index 569e7cbb15d..95d938e6625 100644 --- a/src/test/plugins/api/pokerogue-daily-api.test.ts +++ b/test/plugins/api/pokerogue-daily-api.test.ts @@ -1,6 +1,6 @@ import type { GetDailyRankingsPageCountRequest, GetDailyRankingsRequest } from "#app/@types/PokerogueDailyApi"; import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { ScoreboardCategory, type RankingEntry } from "#app/ui/daily-run-scoreboard"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-savedata-api.test.ts b/test/plugins/api/pokerogue-savedata-api.test.ts similarity index 96% rename from src/test/plugins/api/pokerogue-savedata-api.test.ts rename to test/plugins/api/pokerogue-savedata-api.test.ts index 6dd402206e5..47eafa0a933 100644 --- a/src/test/plugins/api/pokerogue-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-savedata-api.test.ts @@ -1,6 +1,6 @@ import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi"; import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-session-savedata-api.test.ts rename to test/plugins/api/pokerogue-session-savedata-api.test.ts index f453c5edd88..d8103428d59 100644 --- a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -8,7 +8,7 @@ import type { } from "#app/@types/PokerogueSessionSavedataApi"; import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session-savedata-api"; import type { SessionSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-system-savedata-api.test.ts rename to test/plugins/api/pokerogue-system-savedata-api.test.ts index af377762b77..f108e22ee2c 100644 --- a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -6,7 +6,7 @@ import type { } from "#app/@types/PokerogueSystemSavedataApi"; import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; import type { SystemSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/pre.test.ts b/test/pre.test.ts similarity index 100% rename from src/test/pre.test.ts rename to test/pre.test.ts diff --git a/src/test/reload.test.ts b/test/reload.test.ts similarity index 97% rename from src/test/reload.test.ts rename to test/reload.test.ts index b5f66630606..019da0a4c2a 100644 --- a/src/test/reload.test.ts +++ b/test/reload.test.ts @@ -6,8 +6,8 @@ import { Biome } from "#enums/biome"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import type { MockClock } from "#test/utils/mocks/mockClock"; +import GameManager from "#test/testUtils/gameManager"; +import type { MockClock } from "#test/testUtils/mocks/mockClock"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Reload", () => { diff --git a/src/test/settingMenu/helpers/inGameManip.ts b/test/settingMenu/helpers/inGameManip.ts similarity index 100% rename from src/test/settingMenu/helpers/inGameManip.ts rename to test/settingMenu/helpers/inGameManip.ts diff --git a/src/test/settingMenu/helpers/menuManip.ts b/test/settingMenu/helpers/menuManip.ts similarity index 92% rename from src/test/settingMenu/helpers/menuManip.ts rename to test/settingMenu/helpers/menuManip.ts index 0b1f48525f1..1d53b845047 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/test/settingMenu/helpers/menuManip.ts @@ -1,4 +1,15 @@ -import { assign, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting, deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { + assign, + canIAssignThisKey, + canIDeleteThisKey, + canIOverrideThisSetting, + deleteBind, + getIconWithKeycode, + getIconWithSettingName, + getKeyWithKeycode, + getKeyWithSettingName, + getSettingNameWithKeycode, +} from "#app/configs/inputs/configHandler"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { expect } from "vitest"; diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/test/settingMenu/rebinding_setting.test.ts similarity index 100% rename from src/test/settingMenu/rebinding_setting.test.ts rename to test/settingMenu/rebinding_setting.test.ts diff --git a/src/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts similarity index 99% rename from src/test/sprites/pokemonSprite.test.ts rename to test/sprites/pokemonSprite.test.ts index 2bfdbe9ce39..43749015e1c 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,7 +2,7 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; type PokemonVariantMasterlist = typeof _masterlist; diff --git a/src/test/sprites/spritesUtils.ts b/test/sprites/spritesUtils.ts similarity index 100% rename from src/test/sprites/spritesUtils.ts rename to test/sprites/spritesUtils.ts diff --git a/src/test/system/game_data.test.ts b/test/system/game_data.test.ts similarity index 96% rename from src/test/system/game_data.test.ts rename to test/system/game_data.test.ts index ad24c40f445..f7940567746 100644 --- a/src/test/system/game_data.test.ts +++ b/test/system/game_data.test.ts @@ -3,10 +3,10 @@ import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import type { SessionSaveData } from "#app/system/game-data"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as account from "../../account"; +import * as account from "#app/account"; describe("System - Game Data", () => { let phaserGame: Phaser.Game; diff --git a/src/test/utils/TextInterceptor.ts b/test/testUtils/TextInterceptor.ts similarity index 100% rename from src/test/utils/TextInterceptor.ts rename to test/testUtils/TextInterceptor.ts diff --git a/src/test/utils/errorInterceptor.ts b/test/testUtils/errorInterceptor.ts similarity index 100% rename from src/test/utils/errorInterceptor.ts rename to test/testUtils/errorInterceptor.ts diff --git a/src/test/utils/fakeMobile.html b/test/testUtils/fakeMobile.html similarity index 100% rename from src/test/utils/fakeMobile.html rename to test/testUtils/fakeMobile.html diff --git a/src/test/utils/gameManager.ts b/test/testUtils/gameManager.ts similarity index 95% rename from src/test/utils/gameManager.ts rename to test/testUtils/gameManager.ts index b2015700c9b..436c97a6967 100644 --- a/src/test/utils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -22,8 +22,8 @@ import { TitlePhase } from "#app/phases/title-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import type InputsHandler from "#app/test/utils/inputsHandler"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; +import type InputsHandler from "#test/testUtils/inputsHandler"; import type BallUiHandler from "#app/ui/ball-ui-handler"; import type BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import type CommandUiHandler from "#app/ui/command-ui-handler"; @@ -40,18 +40,18 @@ import type { Moves } from "#enums/moves"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PlayerGender } from "#enums/player-gender"; import type { Species } from "#enums/species"; -import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; -import GameWrapper from "#test/utils/gameWrapper"; -import { ChallengeModeHelper } from "#test/utils/helpers/challengeModeHelper"; -import { ClassicModeHelper } from "#test/utils/helpers/classicModeHelper"; -import { DailyModeHelper } from "#test/utils/helpers/dailyModeHelper"; -import { ModifierHelper } from "#test/utils/helpers/modifiersHelper"; -import { MoveHelper } from "#test/utils/helpers/moveHelper"; -import { OverridesHelper } from "#test/utils/helpers/overridesHelper"; -import { ReloadHelper } from "#test/utils/helpers/reloadHelper"; -import { SettingsHelper } from "#test/utils/helpers/settingsHelper"; -import PhaseInterceptor from "#test/utils/phaseInterceptor"; -import TextInterceptor from "#test/utils/TextInterceptor"; +import { generateStarter, waitUntil } from "#test/testUtils/gameManagerUtils"; +import GameWrapper from "#test/testUtils/gameWrapper"; +import { ChallengeModeHelper } from "#test/testUtils/helpers/challengeModeHelper"; +import { ClassicModeHelper } from "#test/testUtils/helpers/classicModeHelper"; +import { DailyModeHelper } from "#test/testUtils/helpers/dailyModeHelper"; +import { ModifierHelper } from "#test/testUtils/helpers/modifiersHelper"; +import { MoveHelper } from "#test/testUtils/helpers/moveHelper"; +import { OverridesHelper } from "#test/testUtils/helpers/overridesHelper"; +import { ReloadHelper } from "#test/testUtils/helpers/reloadHelper"; +import { SettingsHelper } from "#test/testUtils/helpers/settingsHelper"; +import PhaseInterceptor from "#test/testUtils/phaseInterceptor"; +import TextInterceptor from "#test/testUtils/TextInterceptor"; import { AES, enc } from "crypto-js"; import fs from "fs"; import { expect, vi } from "vitest"; diff --git a/src/test/utils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts similarity index 100% rename from src/test/utils/gameManagerUtils.ts rename to test/testUtils/gameManagerUtils.ts diff --git a/src/test/utils/gameWrapper.ts b/test/testUtils/gameWrapper.ts similarity index 93% rename from src/test/utils/gameWrapper.ts rename to test/testUtils/gameWrapper.ts index e8addcfc1d9..c2614b2b61d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -4,14 +4,14 @@ import BattleScene, * as battleScene from "#app/battle-scene"; import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { blobToString } from "#test/utils/gameManagerUtils"; -import { MockClock } from "#test/utils/mocks/mockClock"; -import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; -import { MockFetch } from "#test/utils/mocks/mockFetch"; -import MockLoader from "#test/utils/mocks/mockLoader"; -import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import { blobToString } from "#test/testUtils/gameManagerUtils"; +import { MockClock } from "#test/testUtils/mocks/mockClock"; +import mockConsoleLog from "#test/testUtils/mocks/mockConsoleLog"; +import { MockFetch } from "#test/testUtils/mocks/mockFetch"; +import MockLoader from "#test/testUtils/mocks/mockLoader"; +import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; @@ -24,7 +24,7 @@ import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import { version } from "../../../package.json"; +import { version } from "../../package.json"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; Object.defineProperty(window, "localStorage", { diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/test/testUtils/helpers/challengeModeHelper.ts similarity index 100% rename from src/test/utils/helpers/challengeModeHelper.ts rename to test/testUtils/helpers/challengeModeHelper.ts diff --git a/src/test/utils/helpers/classicModeHelper.ts b/test/testUtils/helpers/classicModeHelper.ts similarity index 100% rename from src/test/utils/helpers/classicModeHelper.ts rename to test/testUtils/helpers/classicModeHelper.ts diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/test/testUtils/helpers/dailyModeHelper.ts similarity index 100% rename from src/test/utils/helpers/dailyModeHelper.ts rename to test/testUtils/helpers/dailyModeHelper.ts diff --git a/src/test/utils/helpers/gameManagerHelper.ts b/test/testUtils/helpers/gameManagerHelper.ts similarity index 100% rename from src/test/utils/helpers/gameManagerHelper.ts rename to test/testUtils/helpers/gameManagerHelper.ts diff --git a/src/test/utils/helpers/modifiersHelper.ts b/test/testUtils/helpers/modifiersHelper.ts similarity index 100% rename from src/test/utils/helpers/modifiersHelper.ts rename to test/testUtils/helpers/modifiersHelper.ts diff --git a/src/test/utils/helpers/moveHelper.ts b/test/testUtils/helpers/moveHelper.ts similarity index 97% rename from src/test/utils/helpers/moveHelper.ts rename to test/testUtils/helpers/moveHelper.ts index ee026c06a8d..535537b34a2 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/test/testUtils/helpers/moveHelper.ts @@ -9,8 +9,8 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import { GameManagerHelper } from "#test/utils/helpers/gameManagerHelper"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; +import { GameManagerHelper } from "#test/testUtils/helpers/gameManagerHelper"; import { vi } from "vitest"; /** diff --git a/src/test/utils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts similarity index 100% rename from src/test/utils/helpers/overridesHelper.ts rename to test/testUtils/helpers/overridesHelper.ts diff --git a/src/test/utils/helpers/reloadHelper.ts b/test/testUtils/helpers/reloadHelper.ts similarity index 100% rename from src/test/utils/helpers/reloadHelper.ts rename to test/testUtils/helpers/reloadHelper.ts diff --git a/src/test/utils/helpers/settingsHelper.ts b/test/testUtils/helpers/settingsHelper.ts similarity index 100% rename from src/test/utils/helpers/settingsHelper.ts rename to test/testUtils/helpers/settingsHelper.ts diff --git a/src/test/utils/inputsHandler.ts b/test/testUtils/inputsHandler.ts similarity index 94% rename from src/test/utils/inputsHandler.ts rename to test/testUtils/inputsHandler.ts index e2591def447..c526300a75a 100644 --- a/src/test/utils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -2,7 +2,7 @@ import type BattleScene from "#app/battle-scene"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import type { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; -import { holdOn } from "#test/utils/gameManagerUtils"; +import { holdOn } from "#test/testUtils/gameManagerUtils"; import fs from "fs"; import { JSDOM } from "jsdom"; import Phaser from "phaser"; @@ -90,7 +90,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { class FakeMobile { constructor() { - const fakeMobilePage = fs.readFileSync("./src/test/utils/fakeMobile.html", { encoding: "utf8", flag: "r" }); + const fakeMobilePage = fs.readFileSync("././test/testUtils/fakeMobile.html", { encoding: "utf8", flag: "r" }); const dom = new JSDOM(fakeMobilePage); Object.defineProperty(window, "document", { value: dom.window.document, diff --git a/src/test/utils/mocks/mockClock.ts b/test/testUtils/mocks/mockClock.ts similarity index 100% rename from src/test/utils/mocks/mockClock.ts rename to test/testUtils/mocks/mockClock.ts diff --git a/src/test/utils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts similarity index 100% rename from src/test/utils/mocks/mockConsoleLog.ts rename to test/testUtils/mocks/mockConsoleLog.ts diff --git a/src/test/utils/mocks/mockFetch.ts b/test/testUtils/mocks/mockFetch.ts similarity index 100% rename from src/test/utils/mocks/mockFetch.ts rename to test/testUtils/mocks/mockFetch.ts diff --git a/src/test/utils/mocks/mockGameObject.ts b/test/testUtils/mocks/mockGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockGameObject.ts rename to test/testUtils/mocks/mockGameObject.ts diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/test/testUtils/mocks/mockGameObjectCreator.ts similarity index 100% rename from src/test/utils/mocks/mockGameObjectCreator.ts rename to test/testUtils/mocks/mockGameObjectCreator.ts diff --git a/src/test/utils/mocks/mockLoader.ts b/test/testUtils/mocks/mockLoader.ts similarity index 100% rename from src/test/utils/mocks/mockLoader.ts rename to test/testUtils/mocks/mockLoader.ts diff --git a/src/test/utils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts similarity index 100% rename from src/test/utils/mocks/mockLocalStorage.ts rename to test/testUtils/mocks/mockLocalStorage.ts diff --git a/src/test/utils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts similarity index 80% rename from src/test/utils/mocks/mockTextureManager.ts rename to test/testUtils/mocks/mockTextureManager.ts index 39066561f25..44d33cf8910 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -1,11 +1,11 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; -import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; -import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; -import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite"; -import MockText from "#test/utils/mocks/mocksContainer/mockText"; -import MockTexture from "#test/utils/mocks/mocksContainer/mockTexture"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockNineslice from "#test/testUtils/mocks/mocksContainer/mockNineslice"; +import MockPolygon from "#test/testUtils/mocks/mocksContainer/mockPolygon"; +import MockRectangle from "#test/testUtils/mocks/mocksContainer/mockRectangle"; +import MockSprite from "#test/testUtils/mocks/mocksContainer/mockSprite"; +import MockText from "#test/testUtils/mocks/mocksContainer/mockText"; +import MockTexture from "#test/testUtils/mocks/mocksContainer/mockTexture"; import type { MockGameObject } from "./mockGameObject"; import { MockVideoGameObject } from "./mockVideoGameObject"; diff --git a/src/test/utils/mocks/mockTimedEventManager.ts b/test/testUtils/mocks/mockTimedEventManager.ts similarity index 100% rename from src/test/utils/mocks/mockTimedEventManager.ts rename to test/testUtils/mocks/mockTimedEventManager.ts diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/test/testUtils/mocks/mockVideoGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockVideoGameObject.ts rename to test/testUtils/mocks/mockVideoGameObject.ts diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts similarity index 98% rename from src/test/utils/mocks/mocksContainer/mockContainer.ts rename to test/testUtils/mocks/mocksContainer/mockContainer.ts index f0198535e7b..6c03ff7460d 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; export default class MockContainer implements MockGameObject { diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/test/testUtils/mocks/mocksContainer/mockGraphics.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockGraphics.ts rename to test/testUtils/mocks/mocksContainer/mockGraphics.ts diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts similarity index 70% rename from src/test/utils/mocks/mocksContainer/mockImage.ts rename to test/testUtils/mocks/mocksContainer/mockImage.ts index be183a0dd89..3badde4f8ab 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/test/testUtils/mocks/mocksContainer/mockNineslice.ts similarity index 86% rename from src/test/utils/mocks/mocksContainer/mockNineslice.ts rename to test/testUtils/mocks/mocksContainer/mockNineslice.ts index a8e10036a72..4f6b8a5d21d 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/test/testUtils/mocks/mocksContainer/mockNineslice.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/test/testUtils/mocks/mocksContainer/mockPolygon.ts similarity index 67% rename from src/test/utils/mocks/mocksContainer/mockPolygon.ts rename to test/testUtils/mocks/mocksContainer/mockPolygon.ts index 12b60904a96..43e9c5460d0 100644 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ b/test/testUtils/mocks/mocksContainer/mockPolygon.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockPolygon extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockRectangle.ts rename to test/testUtils/mocks/mocksContainer/mockRectangle.ts diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockSprite.ts rename to test/testUtils/mocks/mocksContainer/mockSprite.ts diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/test/testUtils/mocks/mocksContainer/mockText.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockText.ts rename to test/testUtils/mocks/mocksContainer/mockText.ts diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/test/testUtils/mocks/mocksContainer/mockTexture.ts similarity index 92% rename from src/test/utils/mocks/mocksContainer/mockTexture.ts rename to test/testUtils/mocks/mocksContainer/mockTexture.ts index 57c87df23be..a9186783d46 100644 --- a/src/test/utils/mocks/mocksContainer/mockTexture.ts +++ b/test/testUtils/mocks/mocksContainer/mockTexture.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; diff --git a/src/test/utils/phaseInterceptor.ts b/test/testUtils/phaseInterceptor.ts similarity index 99% rename from src/test/utils/phaseInterceptor.ts rename to test/testUtils/phaseInterceptor.ts index 91f98e89ec3..fe0fbf82e29 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/test/testUtils/phaseInterceptor.ts @@ -1,5 +1,5 @@ import { Phase } from "#app/phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { BerryPhase } from "#app/phases/berry-phase"; diff --git a/src/test/utils/saves/data_new.prsv b/test/testUtils/saves/data_new.prsv similarity index 100% rename from src/test/utils/saves/data_new.prsv rename to test/testUtils/saves/data_new.prsv diff --git a/src/test/utils/saves/everything.prsv b/test/testUtils/saves/everything.prsv similarity index 100% rename from src/test/utils/saves/everything.prsv rename to test/testUtils/saves/everything.prsv diff --git a/src/test/utils/testUtils.ts b/test/testUtils/testUtils.ts similarity index 100% rename from src/test/utils/testUtils.ts rename to test/testUtils/testUtils.ts diff --git a/src/test/ui/battle_info.test.ts b/test/ui/battle_info.test.ts similarity index 96% rename from src/test/ui/battle_info.test.ts rename to test/ui/battle_info.test.ts index 3100372f091..6209312c451 100644 --- a/src/test/ui/battle_info.test.ts +++ b/test/ui/battle_info.test.ts @@ -3,7 +3,7 @@ import { Species } from "#app/enums/species"; import { ExpPhase } from "#app/phases/exp-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts similarity index 97% rename from src/test/ui/starter-select.test.ts rename to test/ui/starter-select.test.ts index 15b5f643539..685debf098d 100644 --- a/src/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -13,7 +13,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,7 +38,7 @@ describe("UI - Starter select", () => { }); it("Bulbasaur - shiny - variant 2 male", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -98,7 +98,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female hardy overgrow", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -160,7 +160,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -225,7 +225,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -286,7 +286,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - not shiny", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -346,7 +346,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 1", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -408,7 +408,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 0", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -469,7 +469,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -533,7 +533,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/ui/transfer-item.test.ts b/test/ui/transfer-item.test.ts similarity index 98% rename from src/test/ui/transfer-item.test.ts rename to test/ui/transfer-item.test.ts index b08b056f60e..83c2eb2ef79 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/test/ui/transfer-item.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/ui/type-hints.test.ts b/test/ui/type-hints.test.ts similarity index 95% rename from src/test/ui/type-hints.test.ts rename to test/ui/type-hints.test.ts index 9046d82c1df..0838ab01f51 100644 --- a/src/test/ui/type-hints.test.ts +++ b/test/ui/type-hints.test.ts @@ -4,10 +4,10 @@ import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import FightUiHandler from "#app/ui/fight-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import type MockText from "#test/utils/mocks/mocksContainer/mockText"; +import type MockText from "#test/testUtils/mocks/mocksContainer/mockText"; import i18next from "i18next"; describe("UI - Type Hints", () => { diff --git a/src/test/vitest.setup.ts b/test/vitest.setup.ts similarity index 97% rename from src/test/vitest.setup.ts rename to test/vitest.setup.ts index eb2c1e4b9cf..bc7db8ea591 100644 --- a/src/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -45,7 +45,7 @@ vi.mock("i18next", async (importOriginal) => { const filename = req.params[0]; try { - const json = await import(`../../public/locales/en/${req.params[0]}`); + const json = await import(`../public/locales/en/${req.params[0]}`); console.log("Loaded locale", filename); return HttpResponse.json(json); } catch (err) { diff --git a/tsconfig.json b/tsconfig.json index 0ec945df4ee..6bb0ae51c1b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,12 +8,12 @@ "strictNullChecks": true, "sourceMap": false, "strict": false, - "rootDir": "./src", + "rootDir": ".", "baseUrl": "./src", "paths": { "#enums/*": ["./enums/*.ts"], "#app/*": ["*.ts"], - "#test/*": ["./test/*.ts"] + "#test/*": ["../test/*.ts"] }, "outDir": "./build", "noEmit": true @@ -31,4 +31,4 @@ "vitest.config.ts", "vitest.workspace.ts", ] -} \ No newline at end of file +} diff --git a/vitest.config.ts b/vitest.config.ts index 9f9245687a1..b52c16ec00c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineProject(({ mode }) => ({ ...defaultConfig, test: { testTimeout: 20000, - setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"], + setupFiles: ["./test/fontFace.setup.ts", "./test/vitest.setup.ts"], server: { deps: { inline: ["vitest-canvas-mock"], @@ -33,8 +33,8 @@ export default defineProject(({ mode }) => ({ reporters: ["text-summary", "html"], }, name: "main", - include: ["./src/test/**/*.{test,spec}.ts"], - exclude: ["./src/test/pre.test.ts"], + include: ["./test/**/*.{test,spec}.ts"], + exclude: ["./test/pre.test.ts"], }, esbuild: { pure: mode === "production" ? ["console.log"] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 38121942004..2f5d1f1e2c8 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -6,7 +6,7 @@ export default defineWorkspace([ ...defaultConfig, test: { name: "pre", - include: ["src/test/pre.test.ts"], + include: ["./test/pre.test.ts"], environment: "jsdom", }, }, From eeeb4171b18b55f9ba252f58b4632a82f32e684c Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 22 Feb 2025 23:35:49 -0600 Subject: [PATCH 081/171] [Move] Add flavor text for Splash and Celebrate (#5392) * Add flavor text for Splash and Celebrate * Remove unnecessary constructors * Use Splash move text from move triggers --- src/data/move.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 30c5ef75491..332a3302fdd 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -61,6 +61,7 @@ import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; import { MoveAnimPhase } from "#app/phases/move-anim-phase"; +import { loggedInUser } from "#app/account"; export enum MoveCategory { PHYSICAL, @@ -1584,6 +1585,20 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { } } +export class SplashAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:splash")); + return true; + } +} + +export class CelebrateAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username })); + return true; + } +} + export class RecoilAttr extends MoveEffectAttr { private useHp: boolean; private damageRatio: number; @@ -8852,6 +8867,7 @@ export function initMoves() { new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) + .attr(SplashAttr) .condition(failOnGravityCondition), new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), @@ -10294,7 +10310,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new AttackMove(Moves.DAZZLING_GLEAM, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6), + new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6) + .attr(CelebrateAttr), new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), From cefd92bee8fbbba5db5d0f8b299a0ac1590335a7 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:06:27 -0800 Subject: [PATCH 082/171] [Misc] Update Encounter Phase logging nature display and passive check (#5397) --- src/phases/encounter-phase.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index ce85460a481..b868c3f8952 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -38,7 +38,7 @@ import { Species } from "#enums/species"; import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; -import { Nature } from "#enums/nature"; +import { getNatureName } from "#app/data/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -173,12 +173,12 @@ export class EncounterPhase extends BattlePhase { console.log( `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `| Species ID: ${enemyPokemon.species.speciesId}`, - `| Nature: ${Nature[enemyPokemon.getNature()]}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, ); console.log(`Stats (IVs): ${stats}`); console.log( `Ability: ${enemyPokemon.getAbility().name}`, - `| Passive Ability${enemyPokemon.isBoss() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` ); console.log("Moveset:", moveset); From 095634fe6d1661bfcaef0d4b51ecd523dba19e7a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:21:24 -0500 Subject: [PATCH 083/171] [Bug] Fix Gym Leaders fought on wave 20 not evolving mons when fought later in the run (#5370) * Fix repeat Plains GLs not evolving first mons * Add null check --- src/data/pokemon-species.ts | 6 +++++- src/data/trainer-config.ts | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ff9fbdf0bc8..06704666153 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -830,7 +830,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) { + if ( // If evolutions shouldn't happen, add more cases here :) + !allowEvolving + || !pokemonEvolutions.hasOwnProperty(this.speciesId) + || globalScene.currentBattle?.waveIndex === 20 && globalScene.gameMode.isClassic && globalScene.currentBattle.trainer + ) { return this.speciesId; } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index d9aab528e72..1b646fc6478 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1247,9 +1247,6 @@ function getGymLeaderPartyTemplate() { export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { return (level: number, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); - if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 20) { - ignoreEvolution = true; - } if (!ignoreEvolution) { species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex); } From 3ab75b297b0e221df68d7270d47d4910a741ae9b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:27:40 -0800 Subject: [PATCH 084/171] [Misc] Copy Encounter Phase logging to MEs (#5405) --- .../utils/encounter-phase-utils.ts | 28 ++++++++++++++++++- src/phases/encounter-phase.ts | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index d745da5ecb3..1f740763148 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -47,6 +47,8 @@ import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#app/enums/type"; +import { getNatureName } from "#app/data/nature"; +import { getPokemonNameWithAffix } from "#app/messages"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -357,7 +359,31 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${enemyPokemon.name}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach((move) => { + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + ); + console.log("Moveset:", moveset); }); globalScene.pushPhase(new MysteryEncounterBattlePhase(partyConfig.disableSwitch)); diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index b868c3f8952..9485e77e5aa 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -167,7 +167,7 @@ export class EncounterPhase extends BattlePhase { ]; const moveset: string[] = []; enemyPokemon.getMoveset().forEach((move) => { - moveset.push(move!.getName()); + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR }); console.log( From 9d03004dd34e629d94cea0b86b50f08ab50834cd Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:17:37 -0800 Subject: [PATCH 085/171] [Test] Fix import in `create-test` script (#5403) --- create-test-boilerplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 04e1a29cb5f..1ea61e0dc48 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -108,7 +108,7 @@ async function runInteractive() { const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; From 1c192d434b4547543dd75b2066c2401be353d10d Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:44:41 +0100 Subject: [PATCH 086/171] [Sprite] 666-Vivillion back exp change and scuff fix (#5382) * [Sprite] Vivillion back exp change and scuff fix scuff is the incorrect labeling in the exp-sprite.json. fully updated meadow pattern. all incorrect labeled back sprites are no more a thing. * fix the last issues with Shiny exp backs * Last adjustment for the future variant Pr added 1 color --- public/exp-sprites.json | 58 +- public/images/pokemon/666-continental.png | Bin 948 -> 982 bytes public/images/pokemon/666-fancy.png | Bin 1069 -> 1111 bytes public/images/pokemon/666-river.png | Bin 952 -> 1005 bytes public/images/pokemon/back/666-fancy.png | Bin 994 -> 1035 bytes public/images/pokemon/back/666-river.png | Bin 906 -> 953 bytes public/images/pokemon/exp/666-fancy.png | Bin 6381 -> 7162 bytes public/images/pokemon/exp/666-meadow.json | 863 +++++++++++------- public/images/pokemon/exp/666-meadow.png | Bin 5195 -> 5634 bytes public/images/pokemon/exp/666-poke-ball.png | Bin 6270 -> 7178 bytes public/images/pokemon/exp/666-river.png | Bin 6155 -> 7043 bytes .../pokemon/exp/back/666-archipelago.json | 221 ++--- .../pokemon/exp/back/666-archipelago.png | Bin 2861 -> 2776 bytes .../pokemon/exp/back/666-continental.json | 221 ++--- .../pokemon/exp/back/666-continental.png | Bin 3067 -> 2795 bytes .../images/pokemon/exp/back/666-elegant.json | 221 ++--- .../images/pokemon/exp/back/666-elegant.png | Bin 2775 -> 2799 bytes public/images/pokemon/exp/back/666-fancy.json | 221 ++--- public/images/pokemon/exp/back/666-fancy.png | Bin 3284 -> 2977 bytes .../images/pokemon/exp/back/666-garden.json | 221 ++--- public/images/pokemon/exp/back/666-garden.png | Bin 2534 -> 2753 bytes .../pokemon/exp/back/666-high-plains.json | 221 ++--- .../pokemon/exp/back/666-high-plains.png | Bin 3287 -> 2810 bytes .../images/pokemon/exp/back/666-icy-snow.json | 221 ++--- .../images/pokemon/exp/back/666-icy-snow.png | Bin 2613 -> 2769 bytes .../images/pokemon/exp/back/666-jungle.json | 221 ++--- public/images/pokemon/exp/back/666-jungle.png | Bin 2873 -> 2764 bytes .../images/pokemon/exp/back/666-marine.json | 221 ++--- public/images/pokemon/exp/back/666-marine.png | Bin 2654 -> 7088 bytes .../images/pokemon/exp/back/666-meadow.json | 640 +++---------- public/images/pokemon/exp/back/666-meadow.png | Bin 4909 -> 2869 bytes .../images/pokemon/exp/back/666-modern.json | 221 ++--- public/images/pokemon/exp/back/666-modern.png | Bin 3013 -> 2755 bytes .../images/pokemon/exp/back/666-monsoon.json | 221 ++--- .../images/pokemon/exp/back/666-monsoon.png | Bin 3169 -> 2768 bytes public/images/pokemon/exp/back/666-ocean.json | 221 ++--- public/images/pokemon/exp/back/666-ocean.png | Bin 2784 -> 2894 bytes .../pokemon/exp/back/666-poke-ball.json | 221 ++--- .../images/pokemon/exp/back/666-poke-ball.png | Bin 3532 -> 2983 bytes public/images/pokemon/exp/back/666-polar.json | 221 ++--- public/images/pokemon/exp/back/666-polar.png | Bin 2584 -> 2766 bytes public/images/pokemon/exp/back/666-river.json | 221 ++--- public/images/pokemon/exp/back/666-river.png | Bin 2696 -> 2805 bytes .../pokemon/exp/back/666-sandstorm.json | 221 ++--- .../images/pokemon/exp/back/666-sandstorm.png | Bin 2866 -> 2821 bytes .../images/pokemon/exp/back/666-savanna.json | 221 ++--- .../images/pokemon/exp/back/666-savanna.png | Bin 3302 -> 2850 bytes public/images/pokemon/exp/back/666-sun.json | 221 ++--- public/images/pokemon/exp/back/666-sun.png | Bin 3541 -> 2859 bytes .../images/pokemon/exp/back/666-tundra.json | 221 ++--- public/images/pokemon/exp/back/666-tundra.png | Bin 2813 -> 2777 bytes .../exp/back/shiny/666-archipelago.json | 221 ++--- .../exp/back/shiny/666-archipelago.png | Bin 3018 -> 2776 bytes .../exp/back/shiny/666-continental.json | 221 ++--- .../exp/back/shiny/666-continental.png | Bin 3174 -> 2795 bytes .../pokemon/exp/back/shiny/666-elegant.json | 221 ++--- .../pokemon/exp/back/shiny/666-elegant.png | Bin 2960 -> 2799 bytes .../pokemon/exp/back/shiny/666-fancy.json | 221 ++--- .../pokemon/exp/back/shiny/666-fancy.png | Bin 3067 -> 2967 bytes .../pokemon/exp/back/shiny/666-garden.json | 221 ++--- .../pokemon/exp/back/shiny/666-garden.png | Bin 2688 -> 2753 bytes .../exp/back/shiny/666-high-plains.json | 221 ++--- .../exp/back/shiny/666-high-plains.png | Bin 3203 -> 2803 bytes .../pokemon/exp/back/shiny/666-icy-snow.json | 221 ++--- .../pokemon/exp/back/shiny/666-icy-snow.png | Bin 2803 -> 2769 bytes .../pokemon/exp/back/shiny/666-jungle.json | 221 ++--- .../pokemon/exp/back/shiny/666-jungle.png | Bin 2856 -> 2764 bytes .../pokemon/exp/back/shiny/666-marine.json | 221 ++--- .../pokemon/exp/back/shiny/666-marine.png | Bin 2808 -> 2810 bytes .../pokemon/exp/back/shiny/666-meadow.json | 641 +++---------- .../pokemon/exp/back/shiny/666-meadow.png | Bin 4941 -> 2869 bytes .../pokemon/exp/back/shiny/666-modern.json | 221 ++--- .../pokemon/exp/back/shiny/666-modern.png | Bin 2794 -> 2755 bytes .../pokemon/exp/back/shiny/666-monsoon.json | 221 ++--- .../pokemon/exp/back/shiny/666-monsoon.png | Bin 3127 -> 2768 bytes .../pokemon/exp/back/shiny/666-ocean.json | 221 ++--- .../pokemon/exp/back/shiny/666-ocean.png | Bin 2749 -> 2894 bytes .../pokemon/exp/back/shiny/666-poke-ball.json | 221 ++--- .../pokemon/exp/back/shiny/666-poke-ball.png | Bin 3495 -> 2983 bytes .../pokemon/exp/back/shiny/666-polar.json | 221 ++--- .../pokemon/exp/back/shiny/666-polar.png | Bin 2794 -> 2766 bytes .../pokemon/exp/back/shiny/666-savanna.json | 221 ++--- .../pokemon/exp/back/shiny/666-savanna.png | Bin 3165 -> 2850 bytes .../pokemon/exp/back/shiny/666-sun.json | 221 ++--- .../images/pokemon/exp/back/shiny/666-sun.png | Bin 3365 -> 2859 bytes .../pokemon/exp/back/shiny/666-tundra.json | 221 ++--- .../pokemon/exp/back/shiny/666-tundra.png | Bin 2984 -> 2777 bytes 87 files changed, 5062 insertions(+), 5096 deletions(-) diff --git a/public/exp-sprites.json b/public/exp-sprites.json index a340d02a65a..c3b79d0cb38 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -261,10 +261,10 @@ "666-fancy", "666-garden", "666-garden", - "666-high", - "666-high", - "666-icy", - "666-icy", + "666-high-plains", + "666-high-plains", + "666-icy-snow", + "666-icy-snow", "666-jungle", "666-jungle", "666-marine", @@ -277,8 +277,8 @@ "666-monsoon", "666-ocean", "666-ocean", - "666-poke", - "666-poke", + "666-poke-ball", + "666-poke-ball", "666-polar", "666-polar", "666-river", @@ -1379,10 +1379,10 @@ "666b-fancy", "666b-garden", "666b-garden", - "666b-high", - "666b-high", - "666b-icy", - "666b-icy", + "666b-high-plains", + "666b-high-plains", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle", "666b-jungle", "666b-marine", @@ -1395,8 +1395,8 @@ "666b-monsoon", "666b-ocean", "666b-ocean", - "666b-poke", - "666b-poke", + "666b-poke-ball", + "666b-poke-ball", "666b-polar", "666b-polar", "666b-river", @@ -2499,10 +2499,10 @@ "666sb-fancy", "666sb-garden", "666sb-garden", - "666sb-high", - "666sb-high", - "666sb-icy", - "666sb-icy", + "666sb-high-plains", + "666sb-high-plains", + "666sb-icy-snow", + "666sb-icy-snow", "666sb-jungle", "666sb-jungle", "666sb-marine", @@ -2515,8 +2515,8 @@ "666sb-monsoon", "666sb-ocean", "666sb-ocean", - "666sb-poke", - "666sb-poke", + "666sb-poke-ball", + "666sb-poke-ball", "666sb-polar", "666sb-polar", "666sb-river", @@ -3624,10 +3624,10 @@ "666s-fancy", "666s-garden", "666s-garden", - "666s-high", - "666s-high", - "666s-icy", - "666s-icy", + "666s-high-plains", + "666s-high-plains", + "666s-icy-snow", + "666s-icy-snow", "666s-jungle", "666s-jungle", "666s-marine", @@ -3640,8 +3640,8 @@ "666s-monsoon", "666s-ocean", "666s-ocean", - "666s-poke", - "666s-poke", + "666s-poke-ball", + "666s-poke-ball", "666s-polar", "666s-polar", "666s-river", @@ -4551,7 +4551,7 @@ "666-fancy_3", "666-garden", "666-high", - "666-icy", + "666-icy-snow", "666-jungle", "666-marine", "666-meadow_2", @@ -4841,10 +4841,10 @@ "666b-high", "666b-high", "666b-high", - "666b-icy", - "666b-icy", - "666b-icy", - "666b-icy", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle_2", "666b-jungle_2", "666b-jungle_3", diff --git a/public/images/pokemon/666-continental.png b/public/images/pokemon/666-continental.png index 1bd15dbb70db5166998f29f3c36a737414ef5959..b45f5c4e76d1dc94eaba1a58d446005feafe4c23 100644 GIT binary patch delta 927 zcmV;Q17Q5L2i6CWBq0HFQb$4nuFf3k0000pP)t-s0000G5D+jhFi=WLRZ~-uH6(vL zj7rY{000qmQchC<|NsC0|NsC0|NsC0|NsC05EVe70009tNkl39nnTDZrddE=0p3_wM14#rmg#OW{8^;Yq z8eP|MAaXj5!kM6HVACuJaa}mhiLNZ_5DkLbDoPN-;fZj5oY**_$U_{VLS7$f6eS{p z_nrtpAR0zAuGaWKmLlOj8$A*Y?-}u-LUis`VnPfQ$Pb1PjL@Y*ppwKO1fPFTZpu?v zkQ_!DBO6d(gBBtPk*sawi4sRbU_wNs3M3ko22~;xb3+NuWi%M(dJGwvg`snL9j4(k zGBJeE1rB-hF_I0h+2lZ=CtL_b$O_YSG!8L*9Y}Aukcv#2VZ@cGkZkmX7SlL5L=M(v zqY9%ZBGMbF(rF;@HH>H=6>5J<*Vc%EPzBe`!U)p87{XN5+yh}<>9ZhOgrhDSm14** zu0e2JR{pTk6O=taPlK`1`Q)l$)>0NUfQeBlu+{|)pfM7n_oD(!jscg1G(a)rIjRDQ z3P?{OcK%VOwFT5b+h7H#t7ajEs8Og>>5`EGG@y>W zVFUvEf@&}@B}y1pAh_4XBDyfF8KGqM_xsI)n-O&wCc+9Ev@tB=8i*0$=SkL;GLbhY zXAt8nNI_`-#dLN-RE;}55yMMNR2WIkXn5T9(nJu?jM>W$a4=_V3(3s0u+ZE4K$I)pkC=9LRqMeunk$6Ga|Aw47^?| z#O3Y`3(?gr#_L7M>ywO<&`pDh&qs|!q)-wuF;X(r7C!VI1_V`xC_K*8NP*CU=45H< zL6R4`8o6YL&r(SS*YnC!Pd@eKrLYj(dEB#oGE|>79~*My)`oK`Gb06(4Ee*MM{apG zw&pCJ1tOD@jC5S)Rn5qB!;qm1%&XJ<(-4K9M4k~r&c-;4@Rg{LttAxM?hrN7Z*C~U zcR~@g3`M>kVx?(RtZz8(2~}IO=KeP&f7ABy_yamdXkl&=KK%dy002ovPDHLkV1gic BnBM>Z delta 893 zcmV-@1A_e42eb!}BoQ!BOjJbx000mW5HK(>P)bUXMI?Xl&4RiB0004WQchCx65*%HCX~IIdFOx5QR- zozrv?<_LeP2>sLsfPDgyO4qgTh}@k<;hvyrU{mcB;=1sj6CGL9TQmr2tti2H?tusw z?um^FMZU#;R>=D!m7+w%8A2c;+z<^T8dqz4AWM-5fsG!CMhJ|AvqCiYDls7j3KVXJ z5RA~FLZFhwAOxMn!Ko`q4kO(o8&DrlEy&G+^xA(m97-GsfdLVbDv)SUH|Ps8F*cOY zzT6Fl`2?OB8HJ%ay>`qukP20$V{61f0Fkea!Z@XUF@&iu za|?fjb*0aOXb}z(H!8)DKU{<0x~%+Rr6;KOJfCjH#`Cng&05NW1~4!x1=hNt0W?NJ z^n6rc$uZ!PkOnA*%%duhsDQK-!t+;2YYV7>w!sQeQ|*NmqV7W7m98^Vz$2zGI1rE5 zH8SE{?gP01(Jz_}7W~M_VHkmcUr-GO{BwU8Rv_r>Vi8>!Rz?uL|M~f0!HtMI3=?66 z4TpG*!)Tt)J;L)z#?^b&=Yc`oUqK3j=wf%gAgacdo(Qns&q-k)~qqD5-?u zj{!hD()dOL{CdmCaU9za*|y^-^9(#6))o6~urWZmGugNR(0kxrfZ}j>1L4u2R%w4D zLK&!zunifRBO)>~47}ef#NqA?3(?Un#`{gk`;&~)p-F>@&qocYW?oGUjMN#b3!l#i zfS}3{h3_*oQXn+ZoD40%OJ3-pnPZz49F0q?fIPC)l6QT1DXbStemIQ`y`B~y8?xp0 zYkq8`K$0O34&8Fg+}O5$_pt(zq$FV@ZI^jeGcsH-Wat3%=rlhXqVP!Mj0kcx#!-Z? zM1^cEp~yBv)JVU$p$Pc&n+=l!F9Z3yi8VVbD=@e+_kWI9*WN9s|F`g$y06zS|HNQR TIqGlt00000NkvXXu0mjf;wP6Z diff --git a/public/images/pokemon/666-fancy.png b/public/images/pokemon/666-fancy.png index ec5e8a5f6e871f80d59fe6dbdc5ac71564367e99..9e40deb3568d4da2579ce7060b37cdf3a041d5dc 100644 GIT binary patch delta 1041 zcmV+s1n&E-2-gUZBn|;{Qb$4nuFf3k0000pktH;L>eA!!R5K6&000qmQchC<|NsC0 z|NsC0|NsC0|NsC05EVe7000BENklFG|NqxsUc3}r?~d7V zb|iiVi0JO)@lOrl&Z+N&bH^(tr+yKqE8u+UC-Hv<_z5A1zl(tPes)W6)Nv1CVutWo zZW<7Of)LaBxQ7ry$km*Z5q=|LY*%x-ZQ-{89JOuRbQ!6WdVe7tr48U%+H_*Ofk;qF z+lCl;G<`6QB%mPM!N4KR3y~7?q>OXIGa4A-TMP(llu1+>LO4$NfN&brkoyPZ`IaD) zxVZQ}PDdU3BGEL$CPwmu@rEiXL5S0-8!D}T7=mnlrRm(O#PumF;&fsB(GY^VlXSL0 zb`lp?=9qow(0%Wbnugt@RV(yICURzi5I*b&gUY-btw^9Fa%Lh6v8VljsNr`>&}|ev zH-zv)q-4Zs?ADyb!kowwD9cBoab~27To|0MPulhvTO!pE-M2(wN?0C|+rfz1$7ip9 z4C?T0K4wOYyBZa#MkR9AWs%u98GJ@2#Cwfaqf0}_D2Oh=%&>(i;ZTh(4MBWwATw5A5Ns8y3Ig0Qaivmo|_B2)r&2`^4FBJEA+D#6#_x~%-e zN>5~+glG#q7%66&muleJ+JYTHQ7+Se#b+b(3GTN*So?+pK<#LhMA)bbEHwvQ3gYT5 z)Zmp-qApCm6%lf!5Rrey+~p`n&>F+J!O=jM>L{cU)eF2m91KHrqq6CsyO%ULkvPn1 zF|@?2mf4`KtRZwJE;<`5#DfvU@Ld`O2@Qd`pc;!jl;KU^VL(tb_`A}TVxAi% z5#Ie1uPPOie9%D=crvi&aj`B|$@GOtfWGYHqtJw;7k^2k4925OD>XKFWXnyB2>du) z8)Y!)6_FQ*Zn;&E2QJ_xVTtJG`cb27mr~vZ`I3evVg$9}kA@EUN?0N?@z=(8qN@=? z#xS@`49Ib(Yr=Oz5u6!{eBH!as427maNHBR*lExG|CIbq?BnqV65UylEUane00000 LNkvXXu0mjfp4smO delta 999 zcmV2of3}$BHF%Q|J4AVeDs-c4!(c%jkufv?pKHse=~sG zES?d9#{|*rlHj-l9uqS}#`4er@0FO&$1{WpM%=yO;hC}D&FQ}T?*@NJ)V}Z2W#mro z{f0=CHGp$z1Hk?O(V!Uj9ns5ZU>u1@MfQ_{Ll`L$Bg&+Vb0Rb91(8b(2wGH@fJg}^ z37-&2gBwc!fV?*i%90e9T*uj{eP1M&hTqkQG#DFH$p}WAP2Esw#ZYALE6wKKB&knb z5oZfSXG00@j@sD<*-3v=TuEY%Lqd+Vy#=@LP8mP<1pGFt zN;p)bOG6Rr4dlk5e9Q(ZQ4-+}=^N6JDIr5bz}(E>7OZMgMG)4N{}#laFoa705oK|j z5n@Dim5_6AT~_%Mr6-b2LdXj|7%?R0s2aGowqQqaluLZ_)d=!|^yffW`-TI+?QE1p z#Hb1^H3wV@;_81T%#f8aqApCm6cc);5<&jO)a9s#w;IE_A<=*VZ4}y=>IK;zPDVy- zqsr3}5K9`8NEl|d7*=Armc=0Q4FSZk*ldUpPKH;5x-<&n8vWPvF zwL~!V?L;IKMx!Dv7pa+_pC1w2WgtY==$>d-gq0+QL!5t(<3d~!sVBP^1L~WTyBI87 zUO^gy=<;xaBKa1wRt%WEpRBT)gE2$S#{134dn<;drq9Ah1|vdjn;FpUEcz(S#EoGHMHdrn+Xlc;GvvL} zm13S7B@rTWQC1b;r7v_)1epx1dEBf^u4Ign0ejf#OJNqGo%|t!1nv?K>M51!mtVKW<{f&MFGr^gR2WBgf8n%g4Vh{3iDG`UmG` VS%OXE0($@e002ovPDHLkV1h^5%{%}A diff --git a/public/images/pokemon/666-river.png b/public/images/pokemon/666-river.png index eeabeecb0699cc4a67635e4e7bbf513f12a919c7..ca93fd612b7645b262d7890d24a6c33bf173d4bf 100644 GIT binary patch delta 935 zcmV;Y16cgH2ki%tBn|;{Qb$4nuFf3k0000vktH;LV@)8^sA5V%ED8R!DF6Tf6LeBe zQvm<}|NsC0|NsC0|NsC0|NsC0K0n+o0009+Nkl&)U?GAqF&S3`2~pt4uo=RW5eEnB*M9gW@86a zIUIL}!f;R}CXBo$L`)MQVO=xC$taaz4N?purjQ}vxfPLh&5-%SgH!_S3@4GTj-lr$KXn4p#$PCv5k{+JKQDoJ5L<$g`qtnF00_ zZ?l)ggAozPi2X_=#2R@bSED4VhD93Es2jU~FfK$yY6c_FK-7&hkr`&$LwvW1~rh&HTGhDn1T2Sdp4%m}e{N{K+3M#{q&4g-hcr#9+3=92`QWEr_Yh(t7-Scia zV{kV>#V`siHrx%6j0}ki3@HaUMC1a9!TZP>q5xmX#74hzS+77!qcq+t?i##QX2F4! z_v`z?D3CWUGT_}~8kERJOMheNUM`J)6k-7cL%Z?$)9GxCh^kL|G%kl2Rrp)ixqcjxz%$7vA897z*!TL*xI63sCDUVnkO6AI zwzx!$eT?oF>AF4{c(aW@aK~#kGUEmTr-mT-)NDX+0nEb}1RAc2SYyPi;)}@fLXCME zbpsQRMnC#djd@;xCxS|!88w8Bh~RDK8Ik!T24&%YXZU`^Gn5#Sz*cXG8zW8z$HE8C zVSvyKW5irer$4V_HKx8fj! zU%7o2H0sXKL^_uUHF89CR z!Xo9v4X5x-2;ypnAdfGxbEqn{zi_k(W^A>m{VyfI8T)$u1M4?lTa*b7QSkr(002ov JPDHLkV1hRhv~mCd delta 881 zcmV-%1CIRd2e=22BmppyGBkgj%Vd850004WQchC#bB_g_4 ztgbL1f2Z4AHSuCZ1PXuRdJ+lAjWUp@Q4>ugM+U-Z8<%@A9z;Z1h9EFNw2eEE+9-P2 z3aJdOq{SAIWI)^{Aqlo*E5nu$FIbn1EDYHW8KK<^BgEP*1p;*#DUQrQD%6$Ut=a|? zG!SawHVcDyL&}C22U<~sN`xgbj3Degy%xShJtg6Ah#08chWvk1&M@xF&M#JKf;YOA z!l06`dED=^UIZ4SzTX zbg7O)3Q^7-{>7*ePm>HMVhn==IeF?khOOn=IH=}aG#f0OV!Va%K)i=@K{XgSzlZV2 z2sfU2L2~nq`DcF^O@x%6pC1-n+2ps)Kf|~YUn*?4Quq2n*&qz@TMCoclgulPM4p^n zZg?f0k06NNnh~81=M+R$+v(AO*7G?j@~MkBuPYJG;i+$FBm19}MW$&^1|ppNw(n@!D2xsQXoezy=LviYP#k}*BFI4aW~_8oJcv*xYAwTP z8-N&%d3CE9-tQm-A!RO%79vJO=(gSy;x9Eg3img|&8xpIH6lT^E+;xh91QgZc^W3j z!@8zin9?<}K-|o;3h^(BO0+6MV$L#*kC5Pl@vDQ$eoMA zy?TZPGGS#R%qS6!qC;39IAumWE(_u%3=QO-;NnZeC=oMaNW+-E5*ad;gd)=jkt6ly zhFidI-`OxK@M$2ghgfm4vI3o!vEMnYZ~L?y{%zqeeLtUHhRa=SIYQ5c00000NkvXX Hu0mjf_TPg0 diff --git a/public/images/pokemon/back/666-fancy.png b/public/images/pokemon/back/666-fancy.png index 35ed4317d8e9b2fae2fdeec76277277598cdf15f..b56daf08a527082a6ac159b88c0e6d9f9f7193a5 100644 GIT binary patch delta 968 zcmV;(12_EQ2a5=hBn|;{Qb$4nuFf3k0000mktH#I>eAyVwV00V7FL_t(og{9XG)0-d+0N{qghDGrI|J&t*KoGR{#@*bt z!qWr-`o3Ph0lfaVf%iWm(~lzYBQpOe8^0j1=*~!Zj;sv&GK9wngiGQn0@(8+l@MZl zgrG5h=OS~8#3MwAbs*`P0dZ{*k`f{*eMNwJEyBQ-w0%L4h;uKXOrmos<@^Pk#lqY?W~gZG_~QcF!ogC#H- z{-K_X8auT_7oSQgtzJh2E40Ph0vU)s^VJtZN-@KA?&`#gq5ICHf<$H{Fmhp(l02uq zhqJK>K}b+zLV&;Zdu`QdVQiZaIn$?$K%fzMVQkb|918?`7(tU>7=1nh_PjEvxBS+B zwlsDzcJAAeYBYk39S6*YOp_87X@OJ&zoaFkCLk20tB2 z83K{}pkXi)sv$RI{Fd=QFGeXN@>g0Xid5v*a5b=PGBssHjG?7Rhf!jtlyLH2{swBpip{wkZ~Lr zZ;n8jQl%P0pE0ys2Mn+31i{f*r#O;J&`S6rf1?063WKn$G3~QnV zBG+6Mel?UwoV-x#Zn!b1kYh)(9Jpx6N9+);Q>iCW)U7K@J#Q%*A%eR}MFVLB6~3O8 zVjOaW-h|PRiIAHIZ4*JR2~#5%1~1!f7!xvfgrk+$9ij6o?fi$dIp9u^~DdekLOpF>-Q&m=SeNP>x!!ZM2^}h%pP{ zjZPc~4?Ye?YAZDx4W56XWaNiNGG-jyG9NJ4T6?|D2&C9!?SV|hQRIk~ky_nwm`bA= zcHOyDh$wC zPJuuRgZ|p8%mz0#DL8YU+$Q z!%B}4455_$YV3O@rY;c|1{u_ghpY|m=^1oJ|C&4SkX;Qyq9VIrVFB@5Gvp#FhN7Q z(UG_?bR-#WRg_4c7zQh~t`w+q*+>-Luo-E}fsZx`Em_ z44qPZBJ_r4M%xTrSwhQ&LK?*K@gCYW*Ew5#F4;6hFVDZ1g3p&zM3yicX=M9D5)RoZ^b(I^qa zLn;kncLxhGtW+!(TKk6~Ppxg*qGUg7x#DGUX!?@n(B z+san&mS947@zyEIVxNL0ynBOQ?{x59_}bpKe31{TEj?4_YcpR4zIF`g! z1XARGVk(!BWQ=o>nqEbO_){W0lXXomA!JNy3aK5(H3X(nKr`9Bzl7wmpxNwPi#@d| z0=_elLwr*ZCXkF>N`etgZwL(nF%sfaa7A=QDuOWzBE2Cz|20I6Ob`MMk=nlF!T&`? zq&GZ!1B;4kbSPbvw)MyRd`$V9mvFB*C1~n#PnJDJR4{qsZiV}lP2-Jyx z^JBv|s6VEb{)E_6Rm%rI(m*a~2qhwe8-v=g%)T|6RpoA@F)|eaI{eIYDiO?>3 zvEtzuJPQQRjCYA}Tq?*fm6R{OrbLr}$az}jrJ)BLvtf*36FK+&oCL!xQA=2ae=g5H z)c4ap2ZDZzB<8dRoh;nf1Lfh%&N$B$(i8H7mJK}&LdgR`=OWJ;1)WKly`zAhCHMQb znW-SAWkEr=1HyTm__)P{QV%(iu5Z)MnifBdB z<06I<$r#F6j3$vSRDui)+Xo|+(=~~NkV}${Ehs_84CxITbSnfIDX~H<4TFRr(;?#N zACDhEnn<{Agiva-ZRw4SmQrdF%2eJIgb;5F3-VeAQqJ%$jhcur1R?xtNT*V}dlF4s}`AX;{Rq4CmfeqeEOr zFybx{wXW3q4=s0%$Vb_PP{V&FiZVH;K!s~x(DRdSWq;Kc_U-l`$;euX1)_nH00000 LNkvXXu0mjfgSd|} delta 838 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 M5SH+d=UpEDAD$SgS^xk5 diff --git a/public/images/pokemon/exp/666-meadow.json b/public/images/pokemon/exp/666-meadow.json index ee4f6d31bc0..77158992e59 100644 --- a/public/images/pokemon/exp/666-meadow.json +++ b/public/images/pokemon/exp/666-meadow.json @@ -1,314 +1,551 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 243, - "h": 243 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 84, - "h": 88 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 41, - "h": 85 - }, - "frame": { - "x": 202, - "y": 0, - "w": 41, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 2, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 278, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 71, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 155, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 140, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 206, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 209, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 257, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 278, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 308, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 2, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 209, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 53, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 278, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 104, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 398, "h": 347 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/666-meadow.png b/public/images/pokemon/exp/666-meadow.png index 3f9f758ad1f4bc4cb5084167f39a2be12a475e4a..6912a8d81740b6ecbb74f1fe451fc11ae3235807 100644 GIT binary patch literal 5634 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 FV1l9R6bt|W diff --git a/public/images/pokemon/exp/666-poke-ball.png b/public/images/pokemon/exp/666-poke-ball.png index e33fe6e8c5a091dad51a0d57d62cbb9bfd7c0dfe..58cae8e2aaac62b691b79d25432136ce2bbd9667 100644 GIT binary patch literal 7178 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

    (Ou8 zj|&q(fsabXZ!OluM#C}UayEIofEGqiG`l9~u;w+f&xq;wBjPU}Jq0FexFuUqToLCQ zxK1T`bmoQzph`lpnGt9EFud06Ph{3gQNz)LKl!wW{zddhUu z!}QN_gpP6Jy{WJnZ^?)p0c%lAkonI~?yu^Zx`qTAnr7@dO&d-i7m=e>Sjv=?3i-Lt zj)o4t*^L>=%}-4N=yM8?RX6B8-gID~9L_ z=?d0)2P^dtW@g^yLe2vfdK#SN^SkDL7u9z;Q+xwDiVoB<4vCIuXE6r&V{8RLGh`Jc zhyGP$W14A36IuG7Rf9&*k}!o_(BkXPLIcF}cTf#=9ob^?QxlFE)7?lPmGtS^IYMs< z4cQrwGVQxwE=-IaqPq?%=nMN-=CyvPmydsu^#jJ@+?({r?L`w-sJ1`h8@9;MyKE*v zxq(p_D3mv7!~xX7BG8DfNM_^L98204PtLXLC4s4@#7l`H0NU)IDQVgHosCXMeejnt z&b17!|B4AW0%YBc8?De?IhUTOye*V^g6ELo6-r9+6d0diTF{Xlw*t_%f)VbdLLYK_ z`+vS$kr?oIK~|Q+!|<~74HSXw>Bf?%$?()_W*1;&`|C?Yd{U&4WUH{mmRS@O@fx5T zf|X%`xzIhmIJPcTS<2nyM8~T9USZ_%X^NvxLWDeWW)??--{5lxAGNM{ftzBN?km!E z83;5mn6ZBQp{m}F-AuZO-D#4c2qHsgUT8n%U`H#(ek+otG@)_)60alpk*F_5{OV65 zv$S`! z)93Z~PQ;sn`)^pUeV`HI>q_C^C3M>ZMqg+?rMpRs4i!bca4bzYIAabAedFv1Fb4)4l+5z(AdO#W)*YsLIvL$&yp45i8o zF0Iw#qH(PuCd*QLmk)d-o=f~+hSx@~JL?B^0?RJ=#=2j4cxnMB%Ayk;BY8W*;6yTt zczLNCdrRWE9$VLJ5&}*v{OoeHV`!TDwHwRi4zD2@fRE1V`u~2EziNh!I8L9P&A1MX zg#+=NUj%vK?u-32VKk9?9V*Y$#TWhiF2jD9R0rvcYUD*Es@;g+fuOr(&TNpOBybBQly`mmm?M~0nPn!AczT?T7(hJj7TCSc`a{$}A$+wp!Vg3I_g-jS#X-W_p*|hg8W{MDQK^n@)n~v{L59K$ zhw}q7l;bf&tbZb~mWSa`M2`c;4Z@QVMrVu?f`2;W(=_2+i=#y?ZtOD%oJr%wi$9&I zJc$-hiQYTt-nRbB z&ib!0I_hHob&Z7w+~~io?VPefW3=@N%RUNXN-l_ykbIlDm$aYbY2VQA= zWt8Lo^G)e`8>;L$gLz1Usq$3)c4@r7TY*1MNA9&Xr&YEb%f*F**>p(T+hm$>_KK}F zlYE;Bzu(wgrl{WP|Enq07cRs>=O~>y(~0G%*qSoQt=PKS%ggL?C^GKN(tKHf%mjJJ zPwv)}YV8fJ5kj_np*PHK?57`goL-$Fh(Nh7_*P(Yi&MSe@*L!@`Xlc}bnYXUIFV_W z3*tQO^^ZJMYd^3x8>3ky!fn~O8xou~uOeHVLwHjzF>lp8n<&SGoQ{$NS@SJN5<) z7#D$To(=7v=Io_5epNceO%@PG92mOtN@4{=ieSeQ;m!d0DnUSoB5xkDQlVMhnSZVq zG-7F$;M5%jkZKbXN`)1GzOH=Z_JafsVzZGQA(4~c0@1cK}m z6Ut|w)!Bm3fAwj*fV5+VuHhrhL-;#v7QR!}7`tW%={E&JGKo~RD_yEd>_dVf;^&)= zffitAQaE9dp}dH5hkoS$X3=Hx+e%OE^jOKqB0P?W-*q`<;&| zts!b}#So?F|KrG&8L7aMxQ?{Vydf^ykU=Bpn4&CrD+aH6X^4MWlT z6+cbBBG}YDNi*e3(=f1wJ-6u~F2PSZPOdmZ5;QK0}i#{7T)%N^^{}tzpmU#o+3(s8Zpr?s})RKVU w49K{Ts`mp;+2#?v4SzAfold|2OJ5|%gWZ~{KYJ+Pg&as1W}y91)8WPc0G*f!z5oCK literal 6270 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 literal 2861 zcmb7`dpr~BAICS5HP_i(vK?$@TjVx#zs(Gr6OUzJb21N^ffc z-TqR3xT2DR3Pe#uS-JOs7s1fL-oVJ-!X(qim+%0eiQZyWRb^&iP^G_(3z@8;g+RlUFF2C+M(!co;jfzDMU}pOK|W`N zjm^4x2g7`a1bZ+@m9~y<^_@!QcBV!KCiIwye*OV=u>WW}Gd7m(7rB?sKy`O_lna`m z>Z;~e=Gg|IpT#7=c$x>{c1S*1^MJze!9(;7iISvrg@TG&jDqW_V?~%9Lj%G~RiAru zKkqHV)Fq#0HIJ^H*$R>Bcr^KjAG_MNUGrkVg4g6Hlda>}^=kfB$Od4_x4mz1z5keH z%R?2^k=z>_mP;GcZO=A)x3*PCB(3VI5Dkr}_{%Rs<%_>{YDg2edM>!&W1sp`f2){% zk~w1iwF%#DkC06!woVA@a?PFbv>x;z0dP;WBg^a@p38=J*-3@-Y-*jRA~tGGLSUg0 z*)f!Uh{L0#wb}Z_Tr7Ta_F_|U(iZ#heuMEafm@$U$~$TQML^2%o|$3-KCGeGW$N23 z@Rt-K^fLFNH>LLZR^#*;o=qymKR>vvW_2kgC(5U`f;MUgh*X_ntdZ(pInOU(YpcOote1Q06kbFj;%i!^kpbjl|Ss5xx-qxzjC=brFusVK0~xF)0b zwGQd6qKHs;ybuM?ph|K*^sD4QY7S-#sd(%(4VpVn)2m}ⅇcT;gSQdtM=6TKfje=~8Xj?4z^A#el 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 literal 3067 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 PcMGtwa6~>b^Go~}g$u5n diff --git a/public/images/pokemon/exp/back/666-elegant.json b/public/images/pokemon/exp/back/666-elegant.json index c44ea10f7dd..35c20315153 100644 --- a/public/images/pokemon/exp/back/666-elegant.json +++ b/public/images/pokemon/exp/back/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-elegant.png b/public/images/pokemon/exp/back/666-elegant.png index 3187d681140b974b8a75638c399d68acda24d089..2a75c09b505d982b3547030a4252820f3557f556 100644 GIT binary patch literal 2799 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 diff --git a/public/images/pokemon/exp/back/666-fancy.json b/public/images/pokemon/exp/back/666-fancy.json index 657c29e99ee..54113df4b51 100644 --- a/public/images/pokemon/exp/back/666-fancy.json +++ b/public/images/pokemon/exp/back/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-fancy.png b/public/images/pokemon/exp/back/666-fancy.png index 9f9f9c42e801687f62565a72d132688034ca5b50..f7da62d06377646563c2d28e88e861ab309d3ea7 100644 GIT binary patch literal 2977 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 literal 3284 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 B0zm)( diff --git a/public/images/pokemon/exp/back/666-garden.json b/public/images/pokemon/exp/back/666-garden.json index 763dd125a5c..4fcc5ab0ad1 100644 --- a/public/images/pokemon/exp/back/666-garden.json +++ b/public/images/pokemon/exp/back/666-garden.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-garden.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-garden.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-garden.png b/public/images/pokemon/exp/back/666-garden.png index 47a9a27e7903dacde7c59d3f3080cdd4940d6633..35e0dd02087d8b543e6a8e48a8d65ec1fde65104 100644 GIT binary patch literal 2753 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 wRdocfqh?iYOCT%uR&d{oFs{f~ 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 diff --git a/public/images/pokemon/exp/back/666-icy-snow.json b/public/images/pokemon/exp/back/666-icy-snow.json index 17e6e3be8ef..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/666-icy-snow.json +++ b/public/images/pokemon/exp/back/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-icy-snow.png b/public/images/pokemon/exp/back/666-icy-snow.png index b34659ded515f99013e75a6a45216bfcbabf06f6..332e96a6d6158d0b6ab422f14312387610ec0514 100644 GIT binary patch literal 2769 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 X1i1sT_?<2NU;>B^ZuSptsm%WXhK~*W literal 2613 zcmb7`X*3jU8^>oR%OLy6J~3%Xh8g>oEF&{^#ya+$>LH>mm8D{kWyV%CVj{9Ub|OnL zk3_Zy`+prx5QJvB>T`l7C9kXw)om64)S zX9mXy-cB!yii+SIao@i0sGw9XM@9*Yh!vETYw2n|@9WXm){~Z%8>7-rtDw#Yop-@I zBbC+OycrJ+@^W`}adP*3*4Hl~E|i*b`W}K7}BQ$0RS#5EZWE++H<{dDPk4FcW$oz-pz=}4xLwD zx(|jBV+$mqlR5ZH^r;)472R4RuN^hC%IC2;a1)FBU9=(ggw*)E=oL`kBj@D=)``E+ zM$JclTQ->&ZLL~_&ZKWT5GOd@V>&1f04F-qRj%45!Z*x+57?FoBV%hX`i%&m;R{5y z=j5G#p`!9TeWpgiX-qRA1CsrPX>I5 z3tH~D$@HmBj4Q&=#A??VQ8TrILL{o8;!bfDT0?;{NpJ=##Bv1CxrGr(ymY6eZ3l3Q+Ne*+I2oTpAWbBz-_8Z zA;Py{y0 zUX!!r=LXTfmL{YJgUCByL=3L`lFeKxX1we%BUy_<_zc)H51HnUlDvR!tL!D0GmVABuuoO%{efOnaY9GHK zPSG9$#RD2Q)V*mR#dYlDpg}vJCjQK5phK&d5Ir=drdK{@UFvw|$iU0eEhx9syNQuw zb^|XLPD4UwHBpmznJx3AtlZ^-TkT1?3M9_Ig12V}5;-oVjGS@!N7hxsu$0i(3B2_^ zzYWxw3LP(tbe4|eaB+Li31Q>>L^C3{wg%3%9#8w$8WqfsFb~G0KUT5?lLU@HR7ec{ zDPP1Jjw)#!K7O)*HdN>Ji;(_4ES`y z#A@?Y(&}BZ`y1B2Gg$BYZg`-@qOv^i5sJohtn3;>FT?PCCWMVK=M@u4&O^$nJVNJl zmDJv(&L8zKcR;l?;|Mxx%sB zF$(F;|C-bzaikLSQ3_D1wT(QD3|Bno^jNiid@{_<*a$_x8VOCRjT95%@iut@82C;WI$KufmPuSgyxJN;@ z_p_}7Dr8TgFW$zG(B%rZzb=f@3Zl}y6lK-V*SuSOaRxRM-Ucu&`}JzF8sZ{>WrUOG zLZ8mTFO)i)0!Q83%WMVr5j#rRc97uIMlLr4EB*xG29N>>H)3$)s4b@BIc-^cR>qz! zLnA-w;6sQ&co@UqxuL?0(o&)OF|7$=`if+hjjA1yXOe4vqA-Lh#4A}`7|VAUDMSzlsxbP_Uc*_>n=XV{#2lVPHq zlfJ?nnxBmaMW;mb=xlBkl2LVBcwq*o zAr#N^Jb~`|JAa^K!ti7mskdjo+sR9n32?ZY@++J0LYKZWakU>ncb%0D5|4XWo{5M$ z__Vv_^{wvN;OMg5*?DpF2|JiD!O#z^7b^fr?)qM!%_P9Z_q8@IZ07#uWTYBNC*HgT zbmdtm(wu)%HNoRoO(%8FqjMnf@3;Ck9-A+gNAL256F4G1J+df4nVCSA+B#?Df~gF0 zozmr{p7gN=YdW#s3H@ng0%Wc?Rxg)Q%9)Ic2NH(G=LM{~6DJetcHvGbC);ZVLNB#{ zgKJl1-A*U0O)x(U>*-q{J66&eL_KQA$;Y7Dr&uYi@x7!-6AHWa%0n)9>5zTFrLEx@ zAqR@ttBvnX7o*v?`;J!b$k82>q0^FYFuGYUteD3Op*@yLcAx7zqmC?TK(`3;SNS_k zCdE>XLg(j8IO-V}RKbhaq%@Qi)ZgF0#Ofc47)U`?&je;a!z{Rf*o%g6u# diff --git a/public/images/pokemon/exp/back/666-jungle.json b/public/images/pokemon/exp/back/666-jungle.json index b2ffdb768e6..51876d649da 100644 --- a/public/images/pokemon/exp/back/666-jungle.json +++ b/public/images/pokemon/exp/back/666-jungle.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-jungle.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-jungle.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-jungle.png b/public/images/pokemon/exp/back/666-jungle.png index 8e72fdd3af620769005e926961c628184cccdd81..291c6bce18cd69f25877fdbe7b4da7ab14c50165 100644 GIT binary patch literal 2764 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 Ao&W#< literal 2873 zcmaKudpy(a8^?z{p=9PzHqV?kCWpnySz2sHIgA{$a+vceq>)pxSjl0S$0I3+DaR-! z=OQdqNit;>8fi(+I>^s>`u(22et&$w_v^l{>wSH$&;9-5dsFOeu%aSh5dZ)ninBDw zZ>|*HBP6i-Mti23#n(Qhc!31>g=(#J?3!S z!RZ7+O=JHFXBTf@Vq(-8sJtv|opdB40VX5p|4AT@yI@W#z~Fo*L^L zeVzYtNFN22lClo!QbTG*MxC*H`344sxcd2Kf1SH^vlJ`?^7T8}*x1li;5^Kl3^?T$ z=oe^is(nx&ql458a8&FmJ1H#=G{xF!X{xvrLr$L#@M&pNR*;@$EeUQ8%@>8YaR8W2 zv3vmlk%Kt%!;U1v@N2)EG5tM%y#FIP!f9G(&>*b&>qa7r4>p`zEmP||&4Rm~4+ zh5~YZ$Chg`k6E9J?c-_7&?K34BsZCeSA3jlN^cTF9ilMZkg=xJ0|f@d%nFNw5q6gs zuCPB?F+1a+HY1K+H1hLB&0aLLxp&62VQdhi+2)In%J0Wpz4K@eD2|VxArKGwCIr

    9Xu ztX4zsp6$XM@jN>J3i$xnM$$51i@!ZCKt%as?y!M7=JMEL{hzAOJxH~=^@CIAT)QJP z_Hdku_HFe9PrVqwV(&omqLsZbDZ)>%Bwn8OqNe72{Mu6gvzBokKEgD8_~@%BTI`xk zhccm;I5lrmI+3|jx%=X3al$&W9U>W7z`e1gJ>6Y_47xlL?loC7us0p%46?3w=GZ{q zcK98d!-QNInc~nmjfPdPQ13Nbk5HJSC2~8#P45`WH+%cr=_PtP0&fb55tSxz3Dp?FxqX6kjtkovakH& zPo?9J%+*UZiIzhqts{bT{$_(@DR;B9$oVK7LnRBdAEyjann`P_C*>AmD{n>I^EW6u z!gus!s!xdniD!ADhE8U>q}J;W37^zijUZJ*nh}Tk79s(Qrlr~c*dHB zdud51Wfgk)hD4)^gma>m?}~(`J`xXoIm}N9?#aC$Rxel|8ZR1wL>=Cr?`~&;;=9UWKimPH3fZk3o+q&?k$c$54L+1|1eFn(E6iVWiH6n>}<_ z_rIP@FF~GtT?IQU8U{+)r;WuC;c1;+okl;UhN$h6`X%L5#H9osI(z|RVYkp%ZO?ejn*kIeiE$UwKD$BQ7#sk1sIo< z-YJI_QpJHhO82~J*X09?A+Y-Lh0m>FcqjMj#mx9XtYXTV;*PtR7b5n_z%n>vZW{G{ zr|_AGoKphnU)un7U+LV5eFK+aEwkgd*_>|)9f>-?N;d}~enlF;wJ6+FDNcnWpAGuK zs<1+f-h~CsG%c)Wd?Hf$;VvzembNp$Vuyi8v_J|%B^MjsO(U>4Q>tt+_s@i511yAZCZ5c&&B{)6+Wb*vrDm^9~W*S*V#EF`KG$04?V_J z^+)76q6%CBNf-v|W%3*;)@plnfHLYggj~J#U^2h9M4%Kob^qWI+oaLDJ+< z^Zk?&yE5pLZmO9uZgwpOfLF}q$p+v0k`-bb!y|xXL4!0M5868p8~0>BlSgcj+1%iML%V z>7>x_D+A{L$PiG6D(*V%5U%d(sTm^Z`=}BG7ViHD{ZxoQ4#v9))u`lutkNj9=*cLh zXOrR5EN6w0w_Kh6;n8EPkcw$jw{b`X&bDMOh3+FLmyEs*b6RZP8SJf(u;Yhe z*LwQvy|}aYZj|=Ud*xOlmGQs_MImT5USHcidl&>}I0Wtl5UBye zE2OdjT}#3<*yp3vAx2WMy<(^3Q>Ha2UJen^+_48Z-&+xeD}iT~*{Wz5bSTGYXP(1= z_}w6|6}U4Zl0F_WV=ig?7KALl()QNMSX(r&nUUf*Y4qC+-uh)2V-7 zwRVCpXaDsF@R{T~;)@tJf}^6Ul(gQha2-3z?(!WDy4IdCAd`>Ezbd%9!o3@{Xr}j( z5Q8t-d1qe>q)ksYG$dR*+UMxnt3R^JxN6 z=N#xQ0U8o;8c4101b_0Y346^I#5_IMTV%7nqygyO20;^FC!MErh&Vvvr3R)vjPFhX)j$)RUYAeH9REeTIp^0W zof2_ix=8MdkM6nm>l&XqeqDyLx$SbJ-g{w3KjvNWjLu6uE55$b^h<%Xku`YIB)T}u zp2X}wPEaWQ`d5C-&m)*|t-6?R^PG7gXa7Hn+hA4e7Kq&jZ7A42g#PAF zl$4Tw!J82J|F?`Ph0+0aA4%E82UyR7ys%^T1E;dL>ZnxeVG?=_K_Ps~EPlc>} uzFkk^)$`OY$BtaknF1Y&>U*zU>5`eR?F|S3Ry6_*0Y(H-R diff --git a/public/images/pokemon/exp/back/666-marine.json b/public/images/pokemon/exp/back/666-marine.json index 6f4be700dfc..18edbc78ec0 100644 --- a/public/images/pokemon/exp/back/666-marine.json +++ b/public/images/pokemon/exp/back/666-marine.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-marine.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-marine.png", + "format": "RGBA8888", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-marine.png b/public/images/pokemon/exp/back/666-marine.png index 91c5b1be983735aa5b94badbf059664d8f02412b..9e644f0cdaa5f2de94c0965eac2e1cffe27f4820 100644 GIT binary patch literal 7088 zcmZvhbyQSu)bEFu2I&qFkQjQ%p#%h^Q&0vFkdRR6AteL}LAn{b1f@f11VL)(l!h4^ z9a7>w_`C1A_m8{QteIJ}=IpbdeV)Dd_p_h(dOD9ti5Q7MAP}jBx{3h^goO`$kGXUE zp5sUW0Y0$Y4IU|js)m`-AP|$2hKiDrPu5^I^sL&sgEQ znS81Kf~}0r!s%lzgwLZC^MP{*H{=M`bN9|b{`hKV5C5ojE8Uh=B*mu~1;zdl!nRMg zQHt=;TS+oMb1>ZhfpwX(Ke8GK(9=3IxQx_*L8ycSVI5*Yh_!p0#| zQPclK$id`-Q3(`Sm-AC@rN7VS(K#SvL&0#rnmaPKfheEHE}w@dCWM@O?i2RIjN;hr z?Ch}}sz$E}u-6k6-2oNdi&rqMg*g@j$HD4hdX+qa@t2@i5I(3zLX644@Gx1SY3(V1VHQ(PvNO@rj{dZ9sH)*R!?>4YZX~{nK z_m$aa7LCNbDZ2M$pO1Skp9e`rbgYcAPGhw)an0_dX}-eGbTPK?xpw zp;d>M?$2!3bM)NdpXUK;{lrWGo!o2>QeOylt-{<2;W%L_joa@bnwa%Vc$c<3C#sV@ z&n_NabC=(Qo$f7o2qtiO)xDq+|87$`fopaZMt*&TQbo7^y6}&GqpEwhgb2#D*Da;X zC!Yu{KXzyMsF|s+q{p1CCzA#X?e$^;fofi|fOt(IqA{9%18O~*2bCjRHwOj{*6;)_ zjVWiy%K4wIskg1*oKm?jM09@Iz-h6jQ zo}c!iZ&xL_Q2y1ci-(O^6OZa&wV)!3VP#s!YSS` z?>iDcV|2kTmscv+S(t`iRyK+E2@CwWWTb&i{41l-emUoDzb{)!%k6xE3e3PBzE;=w)g@e zC?1PD@Z9$VmkUaBX3#rQqAuM;1CegL9sjOJV6_?T=q%|y~o1!^WR zHQn!?O#W-qet+$gZ$h!-!y;&yBseDxACG0Vf3O}4)1k^^N> zO)%-Q0jhZoT|;sQSz#!oByszpi>QSTLn!!u4a=i#9ndrt&T>yoZ|uBU?y(sa+Z+{T zm44HO0i7=Bat_~4FDLScT)g9{w1US4N~E_((jSghO#x2cH$axdI#Try!&1Iu8i%8K zAVzzHSMw0R)#bX(9JV%@N-_M*_k|Sbd~!%@FgY?&G!)b0ee`THC(XyYTtOp2YvO0? zCfvWr&%21cudlDyEL6aNTO)ymjV<*9w3LcnTvQh{7$B{illI00O8L`y48P~pLVWWr zhb>%PI^)~0TE+Z9xCMuHT&l~bF66rBfsNX2z7L?lh8Z2`Q{;yw&q;@5kr`Or^~T>^ zkRl8X@-hpJoFR@>TRkxCXNO{q{(Zv=#o|3lcmDCSTB&XyRCW)YjOi|=$EwJ*3QMdl<) zALK;x)RwvGzx+DnHYJ)j)^WJs$Cd=!@sR1oYiRb6-cF7MoIHa+?>0M9DY2L)^Y?61 zy^)fW6KIp&^IypFR=DnP@OSt3Cs|uto2#Q&lg zt-vi%yxe*AMS^Q%rcm1ZoGc3HgM!~-7jI!RXNt!_Mxl%0Xm1nCfk)Z-kaCT5kx1&3 zQk)LzbaqjiE2N~tX1*shgsiH@*p{in*JGV;BpgNPJ_uA)*%DaOg;hnmQ!<_c$(_>J zaXT7%O$9~TH#3nY#uw-(noKm!HUk|D`=MxwV8`I?$y*@$7X8g#yR?LHe}6|ICx6Wy;RdI_ zUEhP%)re9{m5CuV%|}OZ8Wvr<*O9jd9aT+L|MjrA zXu2$~r;DZI$z9A3BgKz~2ER>_2nZ9EVC!81y&^CzGk7+g!KbdBJle0-K&T^N3EvnV zsiK?DQ=HR*&cHS_`WMgdOz|&ik6WB*rj;Cc*lG*@7VS*P{2IjM{wgTj*SVr z+~)VGt23g=b@`;sG_d;Fe=I0UNHA2x%o#|7_c_!e$2dWjH0&yiMt>~B5sLNsIywa( z#`IR}B;$iR$Lb`-{v5t|!5SF!sLg5D3QkH^Jk37;WJoo7?V-~^CniIbGlSlGjF|nu zjW4R8^-T{==V>@(BvfKtLklwRo3e|T_TzGomFK4F{wb~BOjd|6J!>L8AtgOm5Ur7x|Af0$~iWWK` zu77t6yPzB(CfXiOb$*Ic4XCLnrY@+g0D+`%v<+2LHAq2vME&DM_L*O5YjHq4r$;59 z?@1LKsP^gcfbRcyz3V4sA!q-1M};&Pze7$_{nN8=nicf)MsuHXoI`JJh8MQZce0+$ z+O%Qmc%_&12Js#Oaf9#h^cB;918MK^oFa6pYD6-==75s^$t<>EVkAL2K@Gu(4s>3? zp|?YENdc%c0lD~iR4z(z0?Nb^^c#c&DEQZfoSe@gC?zGuYIVwW1xn`hrAeb_f`siq zk#Ol`tGe+W)x49E{z_uTHa_G4ljvAk}jf_8p~!|`NV|Fe~d zc%`G?`o^(r?C>s1DEi(nje#iwy2aAk>P4`F_@sS37bCwcH4wl*yy~hpDuv5417SS6 zIf^!Kq;;3@Ut@=H!VNYB{8o4HN-~|M&_#?c7zTTi8lxXH76Yey)0PD1*)M7d7hR`O ztZy6slX+)wj`98S*>!!K$UheO=o*84cr^**l{9?kkFcy*cbok<6G`Z8So#SY_;9O}dTXw_1`#%b>}?6Dzp3FRB0Ne|{n8$`dEJ zcu}J9@#dknB)mQ(I<&9O3PZi!VDEHqE^9qX7!xdZs0Y^>pV2%v&?emI2c*Q|;qV)b z%CbOXB7d&4j4xtbt3FD`MS{_eq!QO#K4jv^mo`_;HT-?#0vh?mFw|q?}_|`e3_jjY$X*Rv(a-CFp^Lxs*vlH?Qm~TGH0Z0+e z9Ciq+UMmRUjAK+0r*n{pYZ4e4a8|M!Yv0g!;*G_fI{OzyB4$U1CR9{-+`(XH+$|-P z1H!QFUR<945nFp7M_$5^USp$Jx!^Wul_e7C$QgT?uiipp5-wmt8!l{m12Itt zU57XZDEfx=+IvDS5B9@<)EB|1Hj^^F`Dd6o3v^Z*p`2S)mqaXWWaE&CiD&)#dX9;` zdzYc&u;(@n^na_+(%W6Q)Q_(rAf~afzk^s4$vSyVkDT#%G!j-$43H`^AG#u)YnJ4= zkW_8{$i%?rroTp@B&gz5@m$c~y>`*yeAvXcyCvb4%XEt-L41h@&>p8~hN02%na>D4 z*C?Oh$)7Npw*&Pcki>JNQ);*gO zVDd_xH9tkdP=a6-{TyXGPEK0hJuumZHeU{`X6Uu)r2fl0w2LCwQW@bp#Dyvb- zHU?HUoXL|HqV*risRJ560qu33O}CAD$ReS-`{ft^M=p(qFJC~!#KiV3SmAeEQQu3? zmko1doT6rIuAUM4??OOXv&$5mP5MG={RFvGUq57Uy87%@;nG*)+lJ6DD2ouuhfSG0 z(xw#qhj66+17N$=sr^x=QN+qO3N~T*RB1tRB-0c_=#0-{pr<{D)Tm1{2qY^j3!C;w zdm|&P;fnRm+vUKYpu>rApbgpi4{u%}lsY%@3tMcW`j}D(o|!4LY<+qeHM1sh{sT(; zGAR@%WP?oNoc9*^z6i7>#(5&CUw8ZcJ`%ts$PhF-*6Oy-Q7;v$YXFv!Mrr%|brR(k zjk1U)ENsja@KiEHTiyU*v9Ry0ztrtW?+CilB*xu=3#&UYDC@{`+8Z18u<{ptr^=4r z2EdN?`r6v{d8s#;$wMV%;;!P;8Kt9hpXgEoL)))vvg(<5w&{U0|<$!iPUfmx9xS8XH(wgR8K($*omi zb?p`zqgFai!yXnFD+DQiCkFg=>g}#M0pq+2x}RX#>rI{chTq=bPay>xFP$5$SEs;D z0@0fTiUG^<=;`dsN)uv_PAsJWqfBiI(jpCk_HAf3giV`L0f4iY!V6hl6W(zg^G`?( z*e{2KQkGHzd+T^;n#KJn0sB9yJc&MMLZp!7$mp^I)*Ui^W$%z>oWSOqNJdo`?w0aV z70P<##nsY{#$!9eya%gs;=*b8;d13mO_d~M5HlS7@RK*SnDbk^IRZ~yXK`l%&>@N) ze6bR-2o&s|WLS9us8&gUKD`pMkpfk*2EAjeViya#vj zA;L5Gc!pXb4>L~K+`$jMYSP&GYs+~=p>I82k><*3Xvr-v4{$KSjmrpsjwsb%tyxPu zM9w%wg?0PBr82c{`GnOWCk4y~D456~d}g6zcEoLtA`z(2VVt91{xyjzn{Rzc)|YGf zPr_4|3kdZmX>gob&daYVK2JX&Iy8W7DK3+iY0_umU?LB0kb)XlA1msvA z_zl{HF1*mo)Gntu}h56MWStMC6&ELt@F ztg|F6fi*MDaGeq*g=Hof-m#o1sHd!>W&q4ldSaB41|T7qsLFxvE6Q8J8hu& z=+FZU_9^vsKVwsKxYt+G>|qo*kA|sDOS17W!pWuaJXX8A!-$G>yP)cU!D}m@(=~F< z&wzl|Wb7;@!0R#n%eyU(EF8e7>5u!CP|%Z+lM~-4ci<6_CFZIx? zc3kkfa%?-l8c0%W-^a%<9EGkw&BHiO|=OVZ|#qV zykhttyIM&=R#9498IZ!bwsR3T^_D>;0y=7=TkeYM&ZdAM=&IyroQlouI>~ieCtg(C zdgkh*Ezhd;dE=%gcJeZp42~V0_z__8FZG^rS2<~dKR!GN*#HJevdtFh@r37H=j@>= zh7*Ea=nap}Uj!4kwcGuZC_YV7h^uoD9oYN?BJQqNlnCNMZ|kCDsjcgt@-dTQEJ z_!kLDefnHifU3M#&>P>&89n=I77C8QajlzNK~gdGDaEkI`)Tft31^C8jFHNY$sn?z*hbusN(O)G0}n zVf3cLot+)$a$;U*b!6K2(b4yxgIQavNymix9D0{*gL{3!_550CA zsa2{V2zB*;AZ{1H(2)IV!RlJZO#7*$h72I)fQ2XpIUex{O>lLNH%4j8g7W0Tr8 zC}HIV8dVF>d2T&!5X9um&+lA%PEZquPB|=qqfPlx@m-$z>XTBxsWG$MySuxfj{ZNa zsGU0>42_{WkqE`S%=l4aCN|qS^5SWt3?A1#TKUgod^su&b3n*fBaGKNZ-VUi|6F=j zVfC|Slf9~O*Okx>j@|rUz5y2!wMxuA#=OtCDhdA zPF4$Eo&uo{Fu2P93s-cSw*~-ZrIO60aRNZ!;hEbNQA7IK8p14uf5rh2yUX3=3SlHs zsq5tqR;$^C&H=BGu`*2adm+8?N_nmsoF`8N-}fRYqJZG}jwmzTJrSj5{+w~R-cRMA z1>Sn_+E}Txk61@?^3(WZiFYJKp5uV_k+O*|O07b@!(R%#@{C_{gk+BHdDS;&H+D`F zr+b+WaW_s%N~S^Pkk8=o;Fp70Thh?3DS~vbEJOjxW4GHS z2oKOJ+Y)nZQXc-TdB^**C$AQtPUzWjCW<8QGq5-JaleKp5-ong(zhdqjIz2>j{;&2 z>KqF^SF{Z@2@xIU@u0+YMiE^((%milbM)%ibk81men~Iy zs=;#vFt+aJGF)x5`Qtk)Qa-kB&?^-~4~FUHufp#-%jue$4}2HlR#L))daa4SRK#E0 z`GH-a)n4fZXPz*r@4c11Yn}?&AkSBb(IKgZSYC|;lE&RA(!>wi)u~JqtbzOT_>m~A zZOO^&dAFNnEb8O@DT>qNczqzCep!tcJ0Up1a>vYUY>i|j3+@!ngcVAX!ZKzKce%9d z+u_IM!rXNACJdKA_C1f79@5kb!BMQ{n8nAt@S|t86`Scsc{+=g64Qa{lQoJOx2Z~j z{o;kY^s$79;%4!0w0qG`11`B3jRa`|(QtG7K2_A?;3MV7JVms+=8PpaSf3&X2d}Tv-a& aY(m;j5&W_bq<|whkcO&`N|mxz$o~LS0J8!B literal 2654 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 A1ONa4 diff --git a/public/images/pokemon/exp/back/666-meadow.json b/public/images/pokemon/exp/back/666-meadow.json index 737ccd7c848..0f24040bd0d 100644 --- a/public/images/pokemon/exp/back/666-meadow.json +++ b/public/images/pokemon/exp/back/666-meadow.json @@ -1,524 +1,118 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-meadow.png b/public/images/pokemon/exp/back/666-meadow.png index d7d63b3098f745a00c2133cdd2a082078fc146e8..fabeb9730db35220698c0e8e8028a9491d9da21e 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/666-modern.json b/public/images/pokemon/exp/back/666-modern.json index a57b695d10b..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/666-modern.json +++ b/public/images/pokemon/exp/back/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-modern.png b/public/images/pokemon/exp/back/666-modern.png index 689876c3d6d7ded05a01b8a56a741fbe5a25e725..01a3981dd9740fe7cf20654e8e49a1db20e4ee25 100644 GIT binary patch literal 2755 zcmY*bdpy(YA73srY%Y__HpI-WR%S+#Bomv4C9=wKR*YQcQo1R{M1?V-Tz{=a1*}`MjUc<$1k6@6Ypku2DT)VM<6P5C{Y# zlbpRkpbcQDo(7SX?sscG%SpwClU}Y)po$LNX{oW5O7Y$+m1=5gI2kMCavx$Ub@xvzAy-!S}LcIE&xuCGfuhx<<~FEi4Q1K@49(> zd&#|-gSoFpRS6{JwIp%B2pNr;|FY~O8JdY_lwx1z=vRqK^?!rVw?pOa6>L_cCJ=4iF&lTE5 zhkgxGOwW1jo@^|UE4(5FK2gIcy&8keFaDE>ykTz_xGyUE@Wa@d zL`~le=02@AX&8Pp3_f8(WaUBSbS9Z+b!g{yts3u0*KojSm^F5i+Z3xf20SG);l*$$ zeA6dY+53a@f)<|<@M2jE=<@T#!d3iV0PXUl{`p)q7% zlQg#kTSM+}frks^Howwsut|KcIhcGUZWQ+=Wjvf3{h$?bm5Z^#VR&eG*^6ZMV}LL= zQ{am~RhJ(6cd&uycz79CCnei3f(rt6k0#&VXk3wYJ&XyiC+ES;?Zct5!3Ix{I+UaJ zB@v3@#SGsGD&{uq554;dM=o4+vYFakB|EII@TXiwUabR8pX_pU5J>P%+evLrj(e@W zmV0o$CUJ&GYHx0qu_ z@Pc=L`^ADs$TITiu6Ly>p}LX8ipr}Ik6v6yd@|m%QN6MbHY%^YV6%gMD}8YdZNN0u z`(43^Y-T^215xZMEV&kTrIEy5|Mm?$OqqZ-8$Q1oa~v`-<{v^V`a`^VTy_tqf3OMK zY+!EJ2J#jdP8TVzIHp*ndijrxUw2Z-Tq0otU7x(GjAX;Q^q8;<7B1)HEvWpMM{-7) z;z^%3T?({y%1CPD*p}2Wh)Q%?2IelG$f5cs5rtcTl5M@(fO?=Z#{zJ~o2Tz@@dlNjZtg`+MKoUbis8sVP!(6ZZ(y&VXZb=SgjU5vey$ z@2^bodNs#AXRAV>%k?zpKxO;EQnfw49c&lPIc*_;SHr(Ksg%!U?_+6KqZcN^t4c?J#n2@&T zkZN(#2c-{pYDe~uEwYTucNcu=@T5bz!=xUq%BeRS0;}G64KHS2)aq>Hr%Ru(LXr;F zFR>U_cQ%3%?r>CXXo#2B zBDoE(4W2l_!-!65t~iUYn$xk}bw`c}s=sLsNQ9|F5=&ic?urFR7rS5#_e?lE-Qbb+ z_-N&9r&f+b`uonbeU6m^#0|C~OugnVmo+<$Mc-GIz za(!Xh5)OfOgV&f&g041XqpI`g;Bwg8g>~<|IM4*?Lw82za(Zk~R3LHhaOjoX>+4s$ zhUTl-%@qM`jCjllGgm&p9K}uQXmo{Dty=Z#6GZhM;IR1~v=fs4Q7+p|%RF7zp5xBtz5+3ufXtlH#GW)_yWEbI7ZFOkuX^LWeXNGb_$@{o9icRFbld)9O0oLgPyr0p$jTmxJ;5o10rF^C^K81q zbIwrfIp_lPg&VS0eFtJaFWhH{w7C3)ay7}C-cb? zRn6{1ghF`0>`kx~yXd>kvEW343NN9yy&i%6d#DJ)yPJ4l*&Ep&9Bz=vh~l+A1Mp-X zB$&A2<8u@P$*zNi3)1}C%?ZNu0KPk!{V+jB9#x$&NZ&N`gpLR!9ubHMO{cap#~d9K z9Ri46A*psKB#V&;J13xMki_6MMnVeg1b}}KLO5YFwR%=S2}82;VCOUF{C)!R5K4Tb zd^ZByljC9(NwmcP-_e|m0nScC?H@dNEBqt)lIE^U=pPLggJ&`(CKDNlrOaS1Ul34E zBH6#G-iD0>cy|LbYG4Y|P3N0%%2X*kv9|zxdkEo}%{&>+0`Rj^)nR^C&?+ygD(xn% zHk`$YeyFX>U0Y~xU65>!dK`-pai<$%n@M^7%s~JDG|c%)!|%07i%Pr@PigP{e*O$G8p1yEVmW>Upw0KZ!H z<@1nKG)XbOi|pv~VQKn47NZ0O;A6eC+=g1>EBo3+d1t5Qraq57NLIWlE=GlPYh;y?Et;%A$h&;=Cv6K(U+jKM5l5^>D6m HqO<-7t*ZF* literal 3013 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 diff --git a/public/images/pokemon/exp/back/666-monsoon.json b/public/images/pokemon/exp/back/666-monsoon.json index 3afda85f798..117fad03b83 100644 --- a/public/images/pokemon/exp/back/666-monsoon.json +++ b/public/images/pokemon/exp/back/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-monsoon.png b/public/images/pokemon/exp/back/666-monsoon.png index e3cb4d2dca70ee4a40833a7cfb76116441d9417e..32cf2331411f50af3e4925a3f44a94820f3571ba 100644 GIT binary patch literal 2768 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 literal 3169 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 diff --git a/public/images/pokemon/exp/back/666-ocean.json b/public/images/pokemon/exp/back/666-ocean.json index f0785703906..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/666-ocean.json +++ b/public/images/pokemon/exp/back/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-ocean.png b/public/images/pokemon/exp/back/666-ocean.png index f60844a9b87d3834c5f16440f36338fa1065d7de..65665ea56c359a73ee8e5a910f0205d1d3299fd5 100644 GIT binary patch literal 2894 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 B{9^zB diff --git a/public/images/pokemon/exp/back/666-poke-ball.json b/public/images/pokemon/exp/back/666-poke-ball.json index ed04a06e7ab..45564e59a32 100644 --- a/public/images/pokemon/exp/back/666-poke-ball.json +++ b/public/images/pokemon/exp/back/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-poke-ball.png b/public/images/pokemon/exp/back/666-poke-ball.png index eb3053e94340735bcd1e9ecbfb775b7a9658a52b..895a2bf680f23119a89ac0460bdb939c4798ca33 100644 GIT binary patch literal 2983 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 U78e~1{xd^ttQ;+$m;>bh0Q*UK>Hq)$ literal 3532 zcmY*cc{r3|`$Y&5#x4z`5!uETBFl_1j3K*0ldU0J%1&e%Bx=MYOUaTYYgB|8OUO1R zhHOm;S+iA^MDbaEzwf%fKi>Dgo^zga?)%)=`_G$TcEx~$O_+_2j*bIq2)8(>35O5M ziGw#}XKDAK{53PS(m$wXuvovk|{$@b4U1sn)bz-nm00X(w;XwA&L+Md1W;XwfAiu!a@K8INSuGP7PoGWTa(kYGP}T zp3>B@bFjvsZ3P7Q`~w0fjLoXv)SLx@&x80atu1TG;fnH-DiC>cf0y(H;XVy5s=Atv zy7F~5SGOCEW1ZR)C_@h?dryq}%)|}2w$k#n%dK1;8Hi#@asK94kL{mmARk|^p@9v? zVGePnE)#uOUDMas11KgEKPaj}$#ga~UZq$vAjy(bihgyX=4AEx&X1V}OP68}>DMAzqds|ib)W5H@ z+2t0s#0n1-jV9{vFCNtTI&IU{reyG&`Wcj~-5DK&kN4W_Kv6~e>v-F?ewI|14OjB* z?IPlRESr&}&Ih5Stu*kkyGj`9CZC6|%JZu6F+y*E3MOr`XOl41C9Sm5$okf9qGb6^ zcfh+lZ@YI?i}GERo!{M@&q`$4$bL&>x$gD(u}9w7U1x^Go=5)p4{nb+%QS9fKS$ zS|n`^J@E(*P^PTBkG?b&oYT|4u58}a#I#5Un>gzg8YnAzbE8McZ!JBqm!uH(=~R;3 zz@~$PPkzJ)jUGxz=}e^|lo-Ca>6Dk!*YDq)vl>m}E?F0?jLIGIf`o)7Wi&n$yq!MG zRv^Mu%PqFr9`O1`yydFjn#A|FyxO$2-z1R*43~%mBmJJ{c-&MJiha2KWu# zURTIjikQy%5GXnJX~N`(aKtIqyI$G9Ig%K%);Y!Kq75>oOZ!QFs7b@fR`ydXr zn2vt`pHNXBb-sSX=C#e;hY}$ilB)3^$eM)s7Jl~GipP#WqVBne1b0u$o*f&dPF$=L zB!~B{=J9#XFl*Jl<-2^n4>JBsn`)DkVl2rh^hn1?|LQkIsl3!WlLoIECtp-ZuH(0j8-ayDXN^?V4yAO(Hz=_9vG2v`m?^Yy{^`OQ~e#j(#e@vgbR#TV)B z->g6~X`x@R=PL5)rQHO|0!snZKuBB?NMCqg1Ju>cc$S|(eX-kX`V zhU)vqrsi$WVlOxCY;(JW6@bGQn3U@q;5>B{Q?Mg_bIVgG2Qs_;wH*=@O8+F@CbOt( zMDHhS$Uor9zJRj237ChZ0c50q$~E{NCr+nBA9lIQz>W|CE>zuPymKD@nO8=yA7G#> zd7krx@fsk@)&);RB?$lY-i5u0j)OC317q&m!!2m7+N|!4q8YsKlmW+-?P^s4iW}Gd zl4n`sT>#3PWP;CSWv%=^=HjZv5 zaD%JOsc@;uz-q>TXja@cX;+jm-i>Mf)jQO6!lWvi4fpK4o;e{H7eaOJB-ECI+x{3+ zyJ9>UzD|4nO-c>yW{zp;40`5j{e+M{$_1Qt1NaQdJ#AHlh(V3;=X>P{o+?P7P7bKYK*cpl6C z^r@jZNHvGXa!R@Smu*Z5HyF9P^S_Z40F za>FUtLoNlL690Ne!2xoiO-G@AsZR@19P#P`(u+jXe0JJfvj8_D*}%z*<=mRwC_zVG z>NFOE(t~>q=G~FxSX>^(z#@m|^9&}nVX{djJ=Mq^OSY97l5Nu?h>$f}_UTCT^w0Hh zjlq=?T=#b_-WlNy^k>({GnS8{&Q3#e_gFpcsta zwi^}ZhXsuK@aTFzeA7h)vLVFj`%mMHCfCZEfebK0DIs>6_^N6%83B+cmgmH;h|y_S z!X7Eg(6^x^?uH=+Z3lO{sEembnhfto^X8efG~G)PUJJ88d@M*7hWrZ=fC1piq`Q&( zOCYgK0`qh46~dAqL5eb+ZTt8<*yIk7=VY}l$|gZ#Ax_x*OXjcz(}N zqX58y+%Pm8a93hZz+hrqwyRF9Fl*KpIG42=7Z^)fn1=BrfBa+0A;Fe}1sB_&sL&-` z{tHu?Eiz`dP3XS_#9l?e@e&Yb|J-VNPdxJ^lwipN@N9qb^x)gD$1T%LJPrNKfikjb zToO%^e6*$Pp>jmJ>O)MllQ?+xN+1AQmPX4nr~E##vM zKu>=erY}8*P48q5iG@kA0@esw{5R0%bvjlZ!mS{i{hDTO1NWePa;%9ks-+`T1Cc}Z%M(0CD8 z)dSt6&_ELT8id8=!{4*{5<7)FjF^C{q_gt|cq?hGl3<>Vv|NV<;3VY&w*HagFZ7MfeOe1v?#Y7`{$3fjA&{@jNqCf& zHQr(f4;_tzlOfqbS0itP-gft;Nn=4>_x3d-V&?CgxeR{ItdNqcF&O{^OpTYdXWH>E zPpDn32VH2m++YDRg`O4ss-VtwA@3moW~EKqVbd$wPsw0VQ+eNlzqM@CtYCznk3(>LqNv^fjNp4HU& z7b1N>J&iN$NV4{D1neBb%fX%V5Cfmpo_e9nvedyyEOxTcV< zg`9W+R-w$!2Bp%FuCB{-PhPoz&aG#l5qzA7=zujCiv_NeOQ(-eB3s-;%5?`JYn4OP zC>`3>rEnm@9g#t<@yDdtk)-(VvC-_2k&<-qk-fP-3^AuzxoItXc*)-J_*h$NcF1lb z_*jl+0f*`#+!QOlk$cH0z7!cff({nTzfMk@Iq+(4cq8#g57D7m$$m&XQ)DdPsA6Xd zV2FE)m9og_9l4sE;_-im2eFcQkFpP=UmvQx?(&^FygfWj zOYXOn#$pB6$+&V3A+18#al4cw?|i@GoKMt_a~`KBCLW=SN(Tu(Gz_?MDJeY&EtHYL zT75h~IvNOvMEfz37+TnKuq58&4NA>Dk&j7EK~iL{34!v1OO7(-vmM)!S%mBk5W9on zGLLqT6gn>dd-{LyNJOOQ9qbq){po1j3+spFupj@r(!u^Z8X|ChS<^}T^jd%YP9?ND R9sZutA@#4oU%{Mk{{e7VnnC~o diff --git a/public/images/pokemon/exp/back/666-polar.json b/public/images/pokemon/exp/back/666-polar.json index 4618d891d3f..abb6d0286f4 100644 --- a/public/images/pokemon/exp/back/666-polar.json +++ b/public/images/pokemon/exp/back/666-polar.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-polar.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-polar.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-polar.png b/public/images/pokemon/exp/back/666-polar.png index 5d09b57833ca1bc49ef895cb4e91b68644b17ff6..c7ec3ec550a55bd5253347d342460f573b2f58f4 100644 GIT binary patch literal 2766 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 diff --git a/public/images/pokemon/exp/back/666-river.json b/public/images/pokemon/exp/back/666-river.json index c4e5274ab6d..28912532d76 100644 --- a/public/images/pokemon/exp/back/666-river.json +++ b/public/images/pokemon/exp/back/666-river.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-river.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-river.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-river.png b/public/images/pokemon/exp/back/666-river.png index 2910340b676644fd2c12823a123a41b4c30531ec..4e0493b8de555ff66a6fd3ee2b9be54d72051233 100644 GIT binary patch literal 2805 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 literal 2696 zcmb7`X*d*W8^;HO$ɯ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 Cw%|+v diff --git a/public/images/pokemon/exp/back/666-sandstorm.json b/public/images/pokemon/exp/back/666-sandstorm.json index cc96c2a2805..99df25242ff 100644 --- a/public/images/pokemon/exp/back/666-sandstorm.json +++ b/public/images/pokemon/exp/back/666-sandstorm.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sandstorm.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sandstorm.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sandstorm.png b/public/images/pokemon/exp/back/666-sandstorm.png index 96d7084eb3014feb7b7d6e7b15fb57c77232602a..d95ab4413a553f4e0f9e3eb9b77db5548e8d8b9d 100644 GIT binary patch literal 2821 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 diff --git a/public/images/pokemon/exp/back/666-savanna.json b/public/images/pokemon/exp/back/666-savanna.json index 8f85dfdeb13..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/666-savanna.json +++ b/public/images/pokemon/exp/back/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-savanna.png b/public/images/pokemon/exp/back/666-savanna.png index 7254d0f1f61843b357b47402cc9fbea74c812d0f..4169b1325a6a3cc410d3cb6a2d3abc119e66b793 100644 GIT binary patch literal 2850 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

    RgGf7y($HbNjM7 zY5ya|X|_2wPcBmEp?sJL)oI?6Po6Ir()p2X-p6UZ8k0(BnoGkWC;WFN534@TC3LS4TZVXi_u>F;HH99rHUd z?v}WnY>Pw^AiKEjK1E?mx5N5;FwYygrYiTc!J`9U#(%`c7z9Jz_6=C<=)ccH4Oj#*BlQL+--Mm2e(G|f0%f5mzK71))QnW zAo{VdwchT?f$)?|YK~?^`Q3&d2n?@JDnIeR~AP5W_L`{H|05&xdc z%(^;s7tJFryO-~D-vMK~t5M@#b?6;s$9-VBUM_Utwt$yAw8=IY7)kD>3Y-xPMUNnJ>Mx^=zl8z zP-NL1Qpo;Gp?rv+o^yyV@dsbWj^_YBto$&Hh5rxZ-%Mml<;VA<`L{wIT+O^(P;)dj z%8v-qjK(D&q#LCS7S-RUbk(TQgVE9?>kp5qtCucIPCoZ1zjOVSAN??<(Hb?eRfjV! z`x{#=`*Fy{T;%3qMk@CXCCl>=8K?5+Eb)U-@#Mo9yWIohV|dh`)`^1_nU;3xtmk1P fuWg?tW!G>%Hs}~72jsc`M-RZ8SYhvDys7^OfL-%^ diff --git a/public/images/pokemon/exp/back/666-sun.json b/public/images/pokemon/exp/back/666-sun.json index df795f0ef0c..d41f22f541c 100644 --- a/public/images/pokemon/exp/back/666-sun.json +++ b/public/images/pokemon/exp/back/666-sun.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sun.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sun.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sun.png b/public/images/pokemon/exp/back/666-sun.png index 84b9d76ef88708c273f2b1c838dc2e8487b4abbe..5cc814e82d7e6bfe3f5dfcf57e7fa6ae21d8ad62 100644 GIT binary patch literal 2859 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 O1(2M`j`jA`LvKtL5HI?jy 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 literal 2813 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 diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.json b/public/images/pokemon/exp/back/shiny/666-archipelago.json index 5207ba45af5..817696f70a1 100644 --- a/public/images/pokemon/exp/back/shiny/666-archipelago.json +++ b/public/images/pokemon/exp/back/shiny/666-archipelago.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-archipelago.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d3b3934e858033f670ae2a24ec4d347a:f014942f9212da6fadbc8a0c94f2dc11:80cdb6dd219378a41ccf5c2acc7e7786$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-archipelago.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.png b/public/images/pokemon/exp/back/shiny/666-archipelago.png index cfc3f0012b64540f3020984dd70e449303bde79e..ada5bd02bdbb22fb49ffa566c98ce2df3a2be43d 100644 GIT binary patch literal 2776 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 literal 3018 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 diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.json b/public/images/pokemon/exp/back/shiny/666-elegant.json index e4372fe6e79..35c20315153 100644 --- a/public/images/pokemon/exp/back/shiny/666-elegant.json +++ b/public/images/pokemon/exp/back/shiny/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2f5780697c633c5f2db2d90012b0bfaa:3df5d06e71f1f48664b1d3f70b589ce5:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.png b/public/images/pokemon/exp/back/shiny/666-elegant.png index a63ccd8a4fd657ac946588a31fdd1100311ff7a4..f14933548315719f7b6af7750b3b6678803130b7 100644 GIT binary patch literal 2799 zcmai0dpy(YAD@{qHin|Jx%=iQON>TYE}P3%5-OHk(-}r4N<(tnTsDWAtuWn0hD6iN z<#3p!n7isMmo83JI{cCpUHDC%e|~@cob~HACm(vaZRM8ae8RCFa?@MAc!wL7I~-NHDUlA@ zWYkyb7&AcsZi$e{qhu?x^v&wG&)%95U*2>mfXHiK;87pIa7$kJ+8FZYqD2sp4&MT9 z(*E8R?>BM8pV{!0%o3ac^ZY!cntYEH)bt1AoG<>Mpa*9D2-#1aeOQ}Nd>I!&vs;rcV>oUKsM z?>SR*NwbS%Dd%<86?L`k!`S!J1l4?`0{)Oc>C`$HCw2F@*OM0en7gSBx(mVm zr39_{*sRX^SdI=ANn}PFq_81wgWGY_Wr9U1QIFTLn zoHRkJ2()P|%JgwR& zZRMN76HgZhp~N0&5^%E9xAnI4W)o6y0~`&AnOPM%YgZ};8qmhlMlgY%48 z)#Mo)s>Sf{D>qR^ojz8IcpB7M=Rbrg!BY^|JaS;+&z%Et<}3dE(aJwOj598@Q>>ES z1Xa<;+TwZ-Za1@Z9H_a|)?p2Y(coRl8@61pYxm1dc6j+(dAcgbDd526_6(cfR_ zn6 zU)rp9NejpGEH8hsgu-?A}G`4jFB5r;ui3*JS zJcJtXIp1y%4CS1=H)dDusqf@p%(+pO(k{RC1nec(LBY&e$?9L)&TrW;II+XwTKgsM zUzfl2)z6MYvW>Z3AM(Q-UV>X^P3g)kVs0o2luxQN&ornmZ~3TWyvxvws;6Z>z?yAo zNep0kn+nb*+K+H|vcDLbE~CG+Ek3XQgB8{_Gc50$N9g-!>ZrmMThzH`3(7PBmA`9Z zJ?6M^zI(--YT;Y2a-TKu|AX!M2|FogyLQft*o{3EbQB_muyWR6Of!bf(c9&8C7O1Q z2ceX?``uKbm1a-&CUzLan@1=vb}#qsqyAD#6N*IVJCD=$?Pfg4|1-DJGt8WPo6p`otBvXnRRZ11^Fo)E0B5k8^*Y_V2d!lI8t=bsv z`Y^GlqO19)eD}Vra;lKmI;e@!jy7k71sM6B9j4nd>{SXC!tVu2utOaiH3}m$9=3q5 zGKe-5Gu++U23FYNQ@nNTF!{4N9wyFZhKM~AQ28Yq)d;S3t_0hMF%sYG<^FCO8*KUj|MON6C5xQ+kRU-A{4>SH$<4>{iH9te7LA%O*j+qD@n@SBZBNydzNKpE* z(W77qb|TVt^9lbSRBOWg;cocX&G^?HDE8DP)y_z;xGsYA+PVE7Q-wLn!=~tGh{F1A zY#&vqs#0Rq8U>Nc%9j?#B-l^)!^L^U?uxWi7IK9JNU&$rBv_`e!R9f4g^T2$VwPw8 zqcqfhX3(4Uvqa?d6gwqp&>HGIE3EG7P}QS75^T}194(>>cdw!Miu2s%g_MG)Oxxv8 dH^fw>Da^@6JuJLb7UX|V5ZTSkwT?h#{TE;m2Sfk> literal 2960 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 diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.json b/public/images/pokemon/exp/back/shiny/666-fancy.json index da0238946be..54113df4b51 100644 --- a/public/images/pokemon/exp/back/shiny/666-fancy.json +++ b/public/images/pokemon/exp/back/shiny/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 133, - "h": 133 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 65, - "y": 0, - "w": 41, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 41, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 41, - "y": 67, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6d28d4fec94007c70d1812b69e8c9a4:cff02079419826e1cb2148e331588d89:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.png b/public/images/pokemon/exp/back/shiny/666-fancy.png index c84443bbe4ec54e7ff0f04b6c7b2b7892f183835..6a50c5817a842a41fba63eb330cdfaf1b1d2503b 100644 GIT binary patch literal 2967 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 bbZ@<&FSpxO(`+8*KQe&RGu16VizogM;Tv+= literal 3067 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 htsg8_&O{yo_L-ns&mUxo{`eCEFlha2~l}mCx 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 literal 2688 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 literal 3203 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 diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.json b/public/images/pokemon/exp/back/shiny/666-icy-snow.json index 4922c7c1fb6..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/shiny/666-icy-snow.json +++ b/public/images/pokemon/exp/back/shiny/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a19b20c8ff121729b5b9dfb470e1e166:abf786c03cda88b39336d9172fd788ec:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.png b/public/images/pokemon/exp/back/shiny/666-icy-snow.png index 2ba96cc9ac348994622c1f86249d267298de482c..1fe8305f068cda4f7edc4c8eb461dad5571be44e 100644 GIT binary patch literal 2769 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 X7!GY;F7Xt8FhK-sXR9X`Wcq&q9DWR^ literal 2803 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 Vy^7RH`{k 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 r>q91gTzs literal 2808 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 diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.json b/public/images/pokemon/exp/back/shiny/666-meadow.json index 54e872aee05..2c4a73b80cf 100644 --- a/public/images/pokemon/exp/back/shiny/666-meadow.json +++ b/public/images/pokemon/exp/back/shiny/666-meadow.json @@ -1,524 +1,119 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:217e1d90eca71c8b95407de1c156a5e6:e2b23be3d14960d78059a46f5b83304a:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.png b/public/images/pokemon/exp/back/shiny/666-meadow.png index 2e8a64be5d458e872f3b0ee23596ae7bf4d31b2b..1148fa5a620b3cac609015bea44c2c5a0a5f2a34 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/shiny/666-modern.json b/public/images/pokemon/exp/back/shiny/666-modern.json index c60078bd8ce..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/shiny/666-modern.json +++ b/public/images/pokemon/exp/back/shiny/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 132, - "h": 132 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:854759536c0175b34e9ed7b2513e55dd:9fbbae33832e3b62152c5bae85714a7a:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-modern.png b/public/images/pokemon/exp/back/shiny/666-modern.png index f9654fbeb0237647d00251316ff580a71490c749..d9f109c8ef942541584424629da41a6ce5cd8659 100644 GIT binary patch literal 2755 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 IPBiBK0G0>*K>z>% literal 2794 zcmb7GX*3iJ7gj>{8QEe?GxlXL6UB_Oj-AOEVzQKd7*S0mypnY=GBIRVW69QJj3vFi zvXnJa5@k!akg`*j&v$yy`QAU@`Of#_-sjwVp8MQ;&$&Ntf(^!$pGSg+jg5`p+zf4d zh%x`RTZ~xfe-~6V1WVH45%*>2FvC+fZOUt_gXOF9`tsb|salGU(Yl2zF zShut_k6W6_3X52HGfl6R>jnQgJ?`_O?bU?~){9dYm!{mSs%y7b8~^}-pS?pc$x##t zSR1qgi-`PO_3kq>B{^RZD+Mjv`|`b zIQ(=(jkAMeUxoWQZ5?l)%XmEA#}?w`b#-IHS49FO3zlq&D;hl9^TmQ3PG-LLpNCiepl7H9&KKpexBazeHfeN(u50cyz zi6f&5sK?SD-6UsefxvN584w|U|Kg{{wz`^?Vq;F|fF)Ue6R!0hCztoGg`lRjsb z{Hw$jE>1ia%3_wY?LX?^ZW1?^X}xF|Yja1Sr}F4MS|{LAihx(`S58S--IsR1S`^X- zW51H{pqAv1;CTe34D%b*`@oNh6i}lm;>W(RBlWKnv|On05l?s8aB7?0w+jOL55f`L zul;!F1nz8WH>YVx$005hq;J>z>pZ|0eJnOb4n>U> z#8QM1$62#%UQ5xk>vS}C!x%@Y;goJGz$=6r`TU*^@Ka}U9=P^wnj+z>#{49cFB!z!$Yu}sg~IW!zPh(Kd1v;`v(U;6&C58Ob&@} z#Lb%Ta)2p?lyW_r*03uHB{I?zLHLV|{y4WBR%OH@F1_3ff3Vk4FvieXQjkT-YkVN{ z**VMUCVt*ZZF80VDDE-&%wGvCCTg0dy{gR>e`BYi(Cn%PbbtpB?vJG4E}rh4Q>#lh zJFYqn?N>j4b9csE3iF&2$b+A~(Z4)KLyN^OR`zPnXPTA$h@}ET(Gf;f_k=4TX-WWwyL6+~O#IuQl;9&GmZ0=Aal#}DLZBc>& zywR&V%BT)zALYBa>hv8V>>l@oi{^Y-X=JHWhrsv?*G3;gi-Q{Q_McXBQpMW zIl;7~b*mxB>BRl7sG&S;T-49Fx(LhaDjakIEkx$^Q`)W$-Iy?Ihh^IgN zSu|ZfWnVI#7V!?W9DzhrfJJ~b6<4o9MAwO+50MPk<%kHgCLK`)pI>;s^Ih?CG0ZGr zlU_cE6{8vVD3l4f%d&=&dd9@=SMi@1r4zr;#vc0>d@#ee_WY%o3@9)}F9^*=TGPl~{1*_P@yO)Y>x=4=N zo`={)srmypD6B`Gu5;rCcFK2eXK9ht;K>*|L&|d4f-rjBO9+bmB!uWoCCGS0YahSh z)>4LUq!FHvw+gC2Q3VnE^Kvm$;;qr-!M^(ha>GyGK83rnx!3?tq1OgOMvT|>w-iM5 z_I7u^%*4uR2b>Il;zZ9<04jxMvEwjDPtcwcXDR+XU2PbV-p^$R6ZrQR|UsGP$u969>$N_S$bsX!`k3}3@H}zn@y7@#AUEb8B^}{{0eJsuF zcD~=iX_A&oSTLmNX+B>@7&Q4>_H4e$dbJ}t4pquw8UDb-USlz9=}EwBN$Jc$Zp*68 ziSr!@jLa)+e;J{wjoQ5v3+4;WBkA%t;ufUEnX9}ez>_}H40y8f-Uj=8MQK@~fcvJR z@K4T)r-6+`-i^Q55~9Eb-i&CeJGMp4n4;Y4NqN4`*OXb3m{c^oR01`k>mVIe~G2_{dcax_&1M~^t;iV=xF+dAC>=y z-aqAs@Bt_Po-d2R64qFNnf*T_|Cjydn#)~Fbt&f)VU3=W?;HgjVPnqhb)>R)7Z BGIsy~ diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.json b/public/images/pokemon/exp/back/shiny/666-monsoon.json index 78130a47159..117fad03b83 100644 --- a/public/images/pokemon/exp/back/shiny/666-monsoon.json +++ b/public/images/pokemon/exp/back/shiny/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dcde8c849851ea64b2ceed92a82153e1:5a97106b9193dc2cda01b0448d9f2637:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.png b/public/images/pokemon/exp/back/shiny/666-monsoon.png index 5d87fc101a8f6e5fec9961c8a871145322ad1a1f..cc5279545d553ffd260e24db46860e2076fb06f7 100644 GIT binary patch literal 2768 zcmY+Gdpr~BAIE2A85^6FW^&yRNo>QY5Odp3&Pd9T+L5`F%ZfF zJZ^&AH&R$wc=s;<*|Ue-&!4BKrzMg#7K5@W4N#8pARh&6{@<9+y3Pjx6!0WRd(Zfi z`4gFOm90vSnncTD* z4x4lTJ#;5m=-w%NK_y&mPb{ev-8d>RK;Mky#16 zftD$k#|Ov)ShNKM=7_;s!-vp8a_}6Q2sp*$r+}8e`sRVo>Xm5#NRqv9&IPrVrT3G2 zOSsz12h6?r6S`RQ5pa8jH@8|%av=(?fO?eYWOTiHyESg#V12)KF>vyo5@(td60c(T z4YG`QYlC=2z28#jncf5XOG51Ug#e1m3)nN`!KGwh)qb!EX*=&3=y1$tRc0{uk&~4k ziBC^KpS?%m`XIl+XJm5i2HC#4{a|6F+k4oD@(|2pf$8v-t z@=wR?#9yFu=ohiy*=T-E-qm%`W59>4!*;K*^d>|mvWW=n-OZg=fDDnB01TyVs8+Id z%{)B9gm~|f1-I`KnL7=Hob#pObCS|vLAF;9!$;n#KpMyO_oE;!f23NluQ5M@SsNR> zNf>;WxEoqYQb8G^nU4?y@2`n2{ng=P`F(`CBAoE|O;v6U>fab37h!z*wVH(EaGI? zM~}e7ZGH>gRl4?imS_qh0@g$v4J?B3m00DiX^Vo^6`w>)sFn4(HXE!KDKv$-xN({J z)oeyxk$`eN`1L-!sU_+4zx_mq>Zzm3{#;oX3nZsP5CkCyXLTP{;=Pm%-bzl~M&HMO zcL5!#S#C8e3P)!XHW{Gb_ci@yK};W(53d2(0+a8jIiMw~YN0*#WoxOm1cBI)~l*JuoQC8u_y(7;ZMAplo5c<;q` z=+e2TPSY>+u^-l$?Q&z0`L^`|DLA`ix6~`2!X{Hk=QPh~J9THrcF+NDwSJ|P!{Xf?(-W=c`UYs4I((uKzreXhx~d>rsmoj z5l4(P0u7`&J`d_R$ok(?gQcdnB5lZRIFt4y(tUjl0y3cA<{Tx)Mw9h3+>CeCR91jJ$S4L$w>ByacvK)4FwDtBxs`-eV?4Z^WrqneB2d_Z&Ov znHq-={%|MKp;FUkNLZlT(YSyQ!ffLx*ybq8A79MGqup90tF-I+ai0H_uIWI&!?+*y zbWr7}4B->8F!T45n|oUV(EgsH5w!z1%3yuIkRNZ`0eXNch|SnSdX@iXm4(QPkro0EU?%Gxf7Ds-e1 zFcCVr;1q8(Um(1=p~YD|mVJP8@Y^nkA-^EzIdjq`4u%xMUkZGSi_NOZZ|zmy`cdHC z7l+-w+-#r7+u}#)n%u7RD1`2zBk#LkX$<9bLDOJQo&FlW=N41{D^;CaSSCE_?o}H% zRzx=B>p*N(QN3*k9;@95EBlP>Hb=kBGF+(c*(iJ*t%W#0I|S)-08SqhoGJ)1y#osk zdpA>)UIz7C5@8rv%h43tazGKL z;=YXTo|e_Ao9W@yM9Jo~mV#P8i#8Zss7v7k6+ASE!)b9wiUS4DQfTtN;ND?-)vibU z=R|ST^K`cq8n7A43t_;!Z#`$X4=C`;KBZ+-k&QYUZ~E=4DU8YpVvh%!0~m$AN~0E0 zb#}jLj)q_JVx&e83o3bL!wBQ;E$7sYhk)Izv|GkEv1omvCJAQYX|QmCt3U_0sOpHX)J{OT=PL5( z_|I~^#vcefjfcQ8%ICW-g$gdWl$la`#O~nU7-m;ECfS&g*=U0_9+FeJFB-Q0JHe2` zS44-Vv|$sytksN%ik?_4W*}xBEQx6RE@gvy)m!z!JSnioW3_7X?#@1 zemmMLi;9dMIn>NFx&i7fOnFL0; zZvE$NW}KyUvJ`l2xj!jyw_{ltQfA0o)un2lR83*gBBg)~-=r4#ZUyO6oOPuwXe#r* fkSf01mRU8G{Q9BGQwh-^{agY_PGrY=0+sb2SU3Fd literal 3127 zcmai$c{CJk8^*_0jBI0Nl_`IFzH9tvT#WS6*&dxVpT;MRcwQrTcd`G zw3c@f$|g zqhF0~8{O_6Ft)TdH8-)&+++qZ>FevQ?u8y4`yKxByClw|A2s0K-{F}(NuGA$yKk5r9b7F&)JqmHWl|x6-=dO9C?Y#C?{!hV|6J4Y3=q}UWa-er&P#K z4hL^DG%4Q#Jt%&1Ty72F4wWv=uF}nR;CnU}q=zGH-@fYPI6@{M zQoBHq?bK?sGK`c{Nf5T%>GAfnOef#lBH4x=NmL~EskwdY+f0+!Efgx6)O+j1KzTuR z>89mRnI`RDMGEG*_JQq*DW)r{5Nva$QUu`1c2=RnQGdHVUw<&pu&o{^$A!CB8mxWw zvf`1i2g9gcn^mo$n~1T1b=M{B#trzmk=NrO|PHFv_|D}Y*@Geaz`cy?89u?ay75!+9-?m_}fA`-tGU~x<{$eM(D zFaZ&?=zha5W=l|pw{jW~X+ygJb~SwPl4K!4R(D$rv6!*&mI=RO#oSZA%Lo}1TRS*k z@M+i5{wXY%4XnCLRio9{q9hSH-xy6Z-H^%}vs4NuBzE<8jFzz}l~oQ152f*R@pL>r zdc;$Hoe$NR#|132N}G?U`b{;ay8AsPQWLk!EeuOwN^y*joGWT;xts}-NjJ>r9T)AY zEfoaJS2AcPHTt-}xDdZA0mj^P8z%`o2>$W{OGPvgh1;sopYpm4Qx8XjjvT@T;oB zU`cTHYwFgo2GAh%>*|hao~|>!!JMPLSR(nAhBX=K{*WdWN`WnD${&i~U=4{k3Li%t zVKxu3hg}CxWpob`aZILa!+~jqsR}>WvO{O z%eD0}d%l2yOx@21vYzX6Vli*uv9~bmJgb~OTBx$9)ld4C)6cUv^&SCoIkECm241hZ z$kZGLLwJ8cF0nvaG;S0D?Vdyx<#SqT`QBfID-Yf>yQo!>2Ej#`mrU(hkvjQ|j z1Pb4}brPWHk+z2`(`p_@YvaelfcqDHG3J+N?my5Ee?EhrhzXg&=ulQ=i8fUF{C+?P z*59Ok99|nHI=Rp3(1nN6zx=_Co-=z*oz7cPR{YExK*Xn_0@%JJ(n|5SReOQ&_If@A z4;3dvhC{u46p5l3x{9HSWyVQ6-628px#fThJ<~haf7mJaeaHHllo}V0sE+b!jWC=q za($h=1J1%sbj#@l-XPI3e9Y<0q0Q6pt9(Dkh)ORFVg!b^!+NH%&jCP6s-w=#*Up0e z`mN8jQY89D1nK=X*Nv5e8v@&hnW9max%CbKOB_r07DOYs6RynPx|gwN_M+M$451ow z(zvWRa>0SE+7Such|R9QRtRYNLZO6zuoBoHqTCyoO2`ye`bi(x<*MrCZW;e3tQ|y) zUxAE$Mnta_?G7F}8b0G&4|8-k(#2+Mak~}>e7V4zw3R#*Fjoj`uhlH$4F%VA)lgr@ z8WCcL%|jF)y_Vmtl3Mm4y=yNk`JoMF3mu2mQ7&ghYPm|hUZSAPuf#q|x8S;YQfJ5# z_UqkHZ^k^;LmkG6nr|j5nqem4BYYHsdulqs6}saI7}!4-k-#72$rjV4I?!<5gD9-5 z!`*ya!#k>Ch*~%NVx^LL0p24}Gekqd*-ZJ`dSRXijqK2xbi9uarQvjD!fdB){U$|s z(>K@V@=j8EX*Fen!$x(I>HZ~&R^tQH*-EObq+gQE;G3rqtd@g}~;!)B7cpuYbM7OT?vh)8B)WM+C$XTx!(IbFn)VOA5<#@I(p;j z)vyG@QGx2$-OQKS@yr3_a5bKBD-TTftZljST{=8;y8(M=IFH@`QVvzhJ|kdnU^G)X z=n9>+2P``9JY6Hp^^WKgUJ# zW+(O&9GUI`XyqiQKo7ANkbnzNgjjXuew*z_s_vc1Sb;qTeq*hzo)Jy9*`MyHY+9(+ zcTQR+zTj6PJVYwAvuNUB3%MNu-h<6;$`AlNH7W|r{kDoPMWm1Y(jhIPxT}tnl*CM$ z9dfE-5HsLLC%lvzl)EK2-n$0Jr`wiN6H;L<1)+|<+ns{wiTuV!M109AiV+r;G!gn1 zE?*FDH5lKv)h`!5W9FdTi2k%Nb_vn{;kkRZ?48OV7R?Bh`vl?*lZ9Ni zqfc7%?)*MN4%CBz&dJrnZL&HJ9BPDGc53drb_Xs+Q?59))WLhY15unh`R>{7eV|15cCWr|LTCxKwj`4 zo&VV8Kz}+ae{6HCU~U`?{x_Uu{u=OS^nc+W)6NFy*#`R1CB%u8Hxj8)NLEv8OQa4m z@o#w~&dsh5%|T1RC3A%TNOMwLuP9*{n#}oP_yoV0o9NuSXk?Z zLm_pifcgXK{}29|5w$$aJPhbTc?L?cppfc)u}pAo^y!5udr)@+H)e$)Zx%X`;6J5C zM`%qW@n3}D7vcE0$Yf3d>$9+BKu@79^vo9hBCb7|lQrzjw)Zarest4bDB-MhW;D0f z%{_bSO}q}$w=Y)cc^o;}M4-+QTH8oXzz=N_&dNIcbqnmNnLwUalGF;a`}9u?Kx^LA JC{?!&|2G>*wGIFP diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.json b/public/images/pokemon/exp/back/shiny/666-ocean.json index 1bf44996eef..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/shiny/666-ocean.json +++ b/public/images/pokemon/exp/back/shiny/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc3f54a39a4afa0ea28913252050d7c1:d856dfe44678a2ee4dc3d367a6658ad3:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.png b/public/images/pokemon/exp/back/shiny/666-ocean.png index 8c6aeca189acebd2799a77c99f1156f6a400bd8d..caabd9302eabf0f9321dcb29593762d0e08185e0 100644 GIT binary patch literal 2894 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 literal 2749 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 diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.json b/public/images/pokemon/exp/back/shiny/666-poke-ball.json index 5c8715a8a1e..45564e59a32 100644 --- a/public/images/pokemon/exp/back/shiny/666-poke-ball.json +++ b/public/images/pokemon/exp/back/shiny/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9df25dba5036e3cd48218e8de3a98074:4357b8b161f5f87776f4d39fcb3723f5:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.png b/public/images/pokemon/exp/back/shiny/666-poke-ball.png index 24907a5ef9fcecae2c775eb27e1f6dae1f64cb36..30e2cbf861543ff605d9111186643356896ae34f 100644 GIT binary patch literal 2983 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 literal 3495 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 TupB4<8Wd<jB-JDV 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 literal 2794 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 LTk}fO(>MMHK&B~< diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.json b/public/images/pokemon/exp/back/shiny/666-savanna.json index 24638119724..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/shiny/666-savanna.json +++ b/public/images/pokemon/exp/back/shiny/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c7fd4a8c1137a2566fabe2f53dac4c4:295a7bdde494b6106f9c73b649be6098:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.png b/public/images/pokemon/exp/back/shiny/666-savanna.png index 5fcf8bc6d281809a2e161892750b32a3dba1ad06..a69c0c18ae1540a6b426b99ccf7b9b2da68c8e69 100644 GIT binary patch literal 2850 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 O6+m|KaBQ%rGX4qKEgwe! literal 3365 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 diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.json b/public/images/pokemon/exp/back/shiny/666-tundra.json index 8361b7ca139..afa574f9e07 100644 --- a/public/images/pokemon/exp/back/shiny/666-tundra.json +++ b/public/images/pokemon/exp/back/shiny/666-tundra.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-tundra.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 46, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b87511ba7b272729aecbf5eb18fe65cc:383836b7b2902a470e150b17bdd9bcfc:9779ed3adebc298af537dd64dc25fe00$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-tundra.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.png b/public/images/pokemon/exp/back/shiny/666-tundra.png index c33fbf1fc6550a37aa9fcbd48e3b0b8a4ee180dc..78316df8a8fc721faceabe9e7f86dc6544ccead1 100644 GIT binary patch literal 2777 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 Yb?f>0jXI;cz(W&6bS1geI#F2v1A3tVssI20 literal 2984 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 Vo3bKqt^dFZ5$#F1hjza4{{pdUc6a~) From 8f15788b39930906d1c451a51c5731cec10d5f2f Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:43:38 +0100 Subject: [PATCH 087/171] [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. (#5330) * [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. * [Misc] Changed Daily Run Seed Override to string | null Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: damocleas --- src/overrides.ts | 1 + src/phases/title-phase.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/overrides.ts b/src/overrides.ts index e53d3b766c4..d15370259fc 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -47,6 +47,7 @@ class DefaultOverrides { // ----------------- /** a specific seed (default: a random string of 24 characters) */ readonly SEED_OVERRIDE: string = ""; + readonly DAILY_RUN_SEED_OVERRIDE: string | null = null; readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; /** * If `null`, ignore this override. diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 0d486da1998..a560897037e 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -21,6 +21,7 @@ import { SelectChallengePhase } from "./select-challenge-phase"; import { SelectStarterPhase } from "./select-starter-phase"; import { SummonPhase } from "./summon-phase"; import { globalScene } from "#app/global-scene"; +import Overrides from "#app/overrides"; export class TitlePhase extends Phase { @@ -256,7 +257,11 @@ export class TitlePhase extends Phase { console.error("Failed to load daily run:\n", err); }); } else { - generateDaily(btoa(new Date().toISOString().substring(0, 10))); + let seed: string = btoa(new Date().toISOString().substring(0, 10)); + if (!Utils.isNullOrUndefined(Overrides.DAILY_RUN_SEED_OVERRIDE)) { + seed = Overrides.DAILY_RUN_SEED_OVERRIDE; + } + generateDaily(seed); } }); } From 9fb654ce736d5f670466fad858f90a9911619d6a Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 03:44:22 +1100 Subject: [PATCH 088/171] [Balance] Make dual STABs way more likely #5401 --- src/field/pokemon.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 214c667f1c1..ed27dd41f6a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2395,14 +2395,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { if (this.hasTrainer()) { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. - // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights double if STAB. + // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map((m) => { let ret: number; if (this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type)) { ret = Math.ceil(Math.sqrt(m[1])); } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { - ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)); + ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 20 : 1)); } else { ret = m[1]; } From 5996f8c6ebbe6063c87065f35df52db3796be702 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:46:54 -0800 Subject: [PATCH 089/171] [Move] Add Taunt Removal Message #5407 --- src/data/battler-tags.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8d5f21c0a42..7b16c718f07 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2752,6 +2752,12 @@ export class TauntTag extends MoveRestrictionBattlerTag { globalScene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); } + public override onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + globalScene.queueMessage(i18next.t("battlerTags:tauntOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } + /** * Checks if a move is a status move and determines its restriction status on that basis * @param {Moves} move the move under investigation From 0cb3a28dfa757b6d2e5b758923728ce006ef4335 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 04:33:39 +1100 Subject: [PATCH 090/171] Fix tera type access (#5364) --- src/field/pokemon.ts | 4 ++-- src/phases/tera-phase.ts | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ed27dd41f6a..61815ec649c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2848,7 +2848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value += 0.5; } - if (source.isTerastallized && source.teraType === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (source.isTerastallized && source.getTeraType() === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { if (matchesSourceType) { stabMultiplier.value += 0.5; } else { @@ -4632,7 +4632,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; - newPokemon.fusionTeraType = this.teraType; + newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; globalScene.getPlayerParty().push(newPokemon); diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index f4b72d39192..462a4e1882e 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -20,9 +20,7 @@ export class TeraPhase extends BattlePhase { start() { super.start(); - console.log(this.pokemon.name, "terastallized to", Type[this.pokemon.teraType].toString()); - - globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.teraType]}`) })); + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.getTeraType()]}`) })); new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { this.end(); }); @@ -41,7 +39,7 @@ export class TeraPhase extends BattlePhase { if (this.pokemon.isPlayer()) { globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.pokemon.teraType === Type.STELLAR) { + if (this.pokemon.getTeraType() === Type.STELLAR) { globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); } } From cc7e1af82760712fee4444967101abb7df4238fc Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:43:34 +0100 Subject: [PATCH 091/171] [BUG] Base forms are now counted as caught when catching a battle form (#5385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Base forms are counted as caught when catching a battle form * Ensuring that correct form shows up in Pokédex Index --- src/system/game-data.ts | 21 ++++++++++++++++++++- src/ui/pokedex-ui-handler.ts | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 6b25013795f..57e25325ba4 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -55,6 +55,7 @@ import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-e import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { Type } from "#enums/type"; export const defaultStarterSpecies: Species[] = [ @@ -1629,11 +1630,29 @@ export class GameData { const caughtAttr = dexEntry.caughtAttr; const formIndex = pokemon.formIndex; const dexAttr = pokemon.getDexAttr(); - pokemon.formIndex = formIndex; // Mark as caught dexEntry.caughtAttr |= dexAttr; + // If the caught form is a battleform, we want to also mark the base form as caught. + // This snippet assumes that the base form has formIndex equal to 0, which should be + // always true except for the case of Urshifu. + const formKey = pokemon.getFormKey(); + if (formIndex > 0) { + if (pokemon.species.speciesId === Species.URSHIFU) { + if (formIndex === 2) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } else if (formIndex === 3) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1); + } + } + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; + const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); + if (toCurrentFormChanges.length > 0) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } + } + // Unlock ability if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 1ba1b846224..6b8fdc41539 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1207,7 +1207,7 @@ export default class PokedexUiHandler extends MessageUiHandler { shiny: false, female: props.female, variant: 0, - formIndex: 0, + formIndex: props.formIndex, }; return sanitizedProps; } @@ -1906,7 +1906,7 @@ export default class PokedexUiHandler extends MessageUiHandler { const dexEntry = globalScene.gameData.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); - if (!caughtAttr) { + if (caughtAttr) { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); if (shiny === undefined) { From 6857cd459cb2f5457cecadd35bfcef85f49741ae Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:43:53 +0100 Subject: [PATCH 092/171] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Fix=20cand?= =?UTF-8?q?y=20filter=20(#5377)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Hardcoding Pikachu to show 0 candies * Looking at starterId to determine order in sort by candy --- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index a086762bb57..ad05b265a50 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -2260,7 +2260,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); - this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.starterId].candyCount}`); + this.pokemonCandyCountText.setText(`x${species.speciesId === Species.PIKACHU ? 0 : globalScene.gameData.starterData[this.starterId].candyCount}`); this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 6b8fdc41539..ed0c3e7ee33 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1534,8 +1534,8 @@ export default class PokedexUiHandler extends MessageUiHandler { case SortCriteria.COST: return (a.cost - b.cost) * -sort.dir; case SortCriteria.CANDY: - const candyCountA = globalScene.gameData.starterData[a.species.speciesId].candyCount; - const candyCountB = globalScene.gameData.starterData[b.species.speciesId].candyCount; + const candyCountA = globalScene.gameData.starterData[this.getStarterSpeciesId(a.species.speciesId)].candyCount; + const candyCountB = globalScene.gameData.starterData[this.getStarterSpeciesId(b.species.speciesId)].candyCount; return (candyCountA - candyCountB) * -sort.dir; case SortCriteria.IV: const avgIVsA = globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[a.species.speciesId].ivs.length; From 4128d09a1d908634c2130b3c719200031c589e32 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:44:13 +0100 Subject: [PATCH 093/171] [UI/UX] Pokedex - Page turning takes filters into account (#5372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introducing list of indices of filtered mons to be passed to the Pokédex Page for scrolling * Update pokedex-page-ui-handler.ts --- src/ui/pokedex-page-ui-handler.ts | 36 ++++++++++++++++++++++--------- src/ui/pokedex-ui-handler.ts | 7 ++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index ad05b265a50..ef7ee57cc17 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -16,7 +16,7 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { Type } from "#enums/type"; @@ -244,6 +244,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private filteredIndices: Species[] | null = null; private availableVariants: number; private unlockedVariants: boolean[]; @@ -560,6 +561,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.species = args[0]; this.formIndex = args[1] ?? 0; this.savedStarterAttributes = args[2] ?? { shiny:false, female:true, variant:0, form:0 }; + this.filteredIndices = args[3] ?? null; this.starterSetup(); } @@ -1447,7 +1449,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); return true; }, onHover: () => this.showText(conditionText) @@ -1752,31 +1754,45 @@ export default class PokedexPageUiHandler extends MessageUiHandler { case Button.LEFT: this.blockInput = true; ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { - const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); - const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; - const newSpecies = allSpecies[newIndex]; + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index <= 0 ? this.filteredIndices.length - 1 : index - 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; + newSpecies = allSpecies[newIndex]; + } const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); }); this.blockInput = false; break; case Button.RIGHT: ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { - const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); - const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; - const newSpecies = allSpecies[newIndex]; + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index >= this.filteredIndices.length - 1 ? 0 : index + 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; + newSpecies = allSpecies[newIndex]; + } const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); }); break; } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index ed0c3e7ee33..82208a5899d 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -215,6 +215,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private showFormTrayIconElement: Phaser.GameObjects.Sprite; private showFormTrayLabel: Phaser.GameObjects.Text; private canShowFormTray: boolean; + private filteredIndices: Species[]; constructor() { super(Mode.POKEDEX); @@ -1037,7 +1038,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else if (this.showingTray) { if (button === Button.ACTION) { const formIndex = this.trayForms[this.trayCursor].formIndex; - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }, this.filteredIndices); success = true; } else { const numberOfForms = this.trayContainers.length; @@ -1084,7 +1085,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } } else { if (button === Button.ACTION) { - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0, null, this.filteredIndices); success = true; } else { switch (button) { @@ -1551,6 +1552,8 @@ export default class PokedexUiHandler extends MessageUiHandler { return 0; }); + this.filteredIndices = this.filteredPokemonContainers.map(c => c.species.speciesId); + this.updateScroll(); }; From b95bedce7afeb10b4d7d9fbbab31b921571bcdbb Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:45:45 +0100 Subject: [PATCH 094/171] [UI/UX] Pokedex - Ensure gender forms loop correctly with either button (#5387) --- src/ui/pokedex-page-ui-handler.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index ef7ee57cc17..99b25c3c383 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -244,6 +244,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private isFormGender: boolean; private filteredIndices: Species[] | null = null; private availableVariants: number; @@ -633,6 +634,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; + this.isFormGender = formKey === "male" || formKey === "female"; + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; const passives = starterPassiveAbilities[passiveId]; @@ -1593,8 +1596,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.form = newFormIndex; // store the selected form this.savedStarterAttributes.form = starterAttributes.form; this.formIndex = newFormIndex; + // Some forms are tied to the gender and should change accordingly + let newFemale = props.female; + if (this.isFormGender) { + newFemale = !props.female; + } + starterAttributes.female = newFemale; + this.savedStarterAttributes.female = starterAttributes.female; this.starterSetup(); - this.setSpeciesDetails(this.species, { formIndex: newFormIndex }); + this.setSpeciesDetails(this.species, { formIndex: newFormIndex, female: newFemale }); success = this.setCursor(this.cursor); } break; @@ -1602,7 +1612,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.canCycleGender) { starterAttributes.female = !props.female; this.savedStarterAttributes.female = starterAttributes.female; - this.setSpeciesDetails(this.species, { female: !props.female }); + let newFormIndex = this.formIndex; + // Some forms are tied to the gender and should change accordingly + if (this.isFormGender) { + newFormIndex = this.formIndex === 0 ? 1 : 0; + } + starterAttributes.form = newFormIndex; // store the selected form + this.savedStarterAttributes.form = starterAttributes.form; + this.formIndex = newFormIndex; + this.starterSetup(); + this.setSpeciesDetails(this.species, { female: !props.female, formIndex: newFormIndex }); success = true; } break; From d14f71d27a6da203fd30843bfb1e42c95be6a15e Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:15:15 -0500 Subject: [PATCH 095/171] [Bug] Maintain Gimmighoul evo counter when fusing (#5411) --- src/field/pokemon.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 61815ec649c..4e3e53f994f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4634,6 +4634,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionLuck = this.fusionLuck; newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; + newPokemon.evoCounter = this.evoCounter; globalScene.getPlayerParty().push(newPokemon); newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); @@ -4702,6 +4703,7 @@ export class PlayerPokemon extends Pokemon { this.fusionGender = pokemon.gender; this.fusionLuck = pokemon.luck; this.fusionCustomPokemonData = pokemon.customPokemonData; + this.evoCounter = Math.max(pokemon.evoCounter, this.evoCounter); if (pokemon.pauseEvolutions || this.pauseEvolutions) { this.pauseEvolutions = true; } From 88a5c9d41651dcb2efc3e83ca64240144a36347c Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:46:07 -0600 Subject: [PATCH 096/171] [Ability] Implement Teraform Zero ability (#5359) * Partially implement Teraform Zero ability The functionality of the ability is all there, it just isn't limited to one use per Terastallization yet. * Add the once per battle condition This removes the partial from the ability. * Make attribute names more generic --------- Co-authored-by: damocleas --- src/data/ability.ts | 50 ++++++++++++++++++++++++++- src/phases/quiet-form-change-phase.ts | 4 ++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 131b7d0ff7a..8de0c68a8e7 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -266,6 +266,52 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { } } +/** + * Clears a specified weather whenever this attribute is called. + */ +export class ClearWeatherAbAttr extends AbAttr { + private weather: WeatherType[]; + + /** + * @param weather {@linkcode WeatherType[]} - the weather to be removed + */ + constructor(weather: WeatherType[]) { + super(true); + + this.weather = weather; + } + + apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + globalScene.arena.trySetWeather(WeatherType.NONE, true); + } + return true; + } +} + +/** + * Clears a specified terrain whenever this attribute is called. + */ +export class ClearTerrainAbAttr extends AbAttr { + private terrain: TerrainType[]; + + /** + * @param terrain {@linkcode TerrainType[]} - the terrain to be removed + */ + constructor(terrain: TerrainType[]) { + super(true); + + this.terrain = terrain; + } + + apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); + } + return true; + } +} + type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { @@ -6993,9 +7039,11 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.TERAFORM_ZERO, 9) + .attr(ClearWeatherAbAttr, [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN, WeatherType.STRONG_WINDS ]) + .attr(ClearTerrainAbAttr, [ TerrainType.MISTY, TerrainType.ELECTRIC, TerrainType.GRASSY, TerrainType.PSYCHIC ]) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .condition(getOncePerBattleCondition(Abilities.TERAFORM_ZERO)), new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 6cd1129d318..81a39f53a76 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -11,7 +11,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; -import { applyAbAttrs, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; +import { applyAbAttrs, ClearTerrainAbAttr, ClearWeatherAbAttr, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; @@ -148,6 +148,8 @@ export class QuietFormChangePhase extends BattlePhase { } if (this.formChange.trigger instanceof SpeciesFormChangeTeraTrigger) { applyAbAttrs(PostTeraFormChangeStatChangeAbAttr, this.pokemon, null); + applyAbAttrs(ClearWeatherAbAttr, this.pokemon, null); + applyAbAttrs(ClearTerrainAbAttr, this.pokemon, null); } super.end(); From c81d9b6a891f1338a266621653a039c4913f4173 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:22:25 -0600 Subject: [PATCH 097/171] [Balance] Update moveset gen to calculate expected power (#5390) * Make moveset gen consider multi hit moves fairly * Make getTargetBenefitScore consider effective power * Apply Kev's suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fix improper stat ratio. * Fix expected hit count for pop-bomb like moves Accuracy is now properly divided by 100 * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/move.ts | 206 +++++++++++++++++++++++++++++++++++-------- src/field/pokemon.ts | 4 +- 2 files changed, 169 insertions(+), 41 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 332a3302fdd..d9ceb0f3dce 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -14,8 +14,18 @@ import { import { getPokemonNameWithAffix } from "../messages"; import type { AttackMoveResult, TurnMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; -import { EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { getNonVolatileStatusEffects, getStatusEffectHealText, isNonVolatileStatusEffect } from "./status-effect"; +import { + EnemyPokemon, + HitResult, + MoveResult, + PlayerPokemon, + PokemonMove, +} from "../field/pokemon"; +import { + getNonVolatileStatusEffects, + getStatusEffectHealText, + isNonVolatileStatusEffect, +} from "./status-effect"; import { getTypeDamageMultiplier } from "./type"; import { Type } from "#enums/type"; import type { Constructor } from "#app/utils"; @@ -24,8 +34,50 @@ import * as Utils from "../utils"; import { WeatherType } from "#enums/weather-type"; import type { ArenaTrapTag } from "./arena-tag"; import { ArenaTagSide, WeakenMoveTypeTag } from "./arena-tag"; -import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, applyAbAttrs, applyPostAttackAbAttrs, applyPostItemLostAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BlockItemTheftAbAttr, BlockNonDirectDamageAbAttr, BlockOneHitKOAbAttr, BlockRecoilDamageAttr, ChangeMovePriorityAbAttr, ConfusionOnStatusEffectAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, HealFromBerryUseAbAttr, IgnoreContactAbAttr, IgnoreMoveEffectsAbAttr, IgnoreProtectOnContactAbAttr, InfiltratorAbAttr, MaxMultiHitAbAttr, MoveAbilityBypassAbAttr, MoveEffectChanceMultiplierAbAttr, MoveTypeChangeAbAttr, PostDamageForceSwitchAbAttr, PostItemLostAbAttr, ReverseDrainAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, UnswappableAbilityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "./ability"; -import { AttackTypeBoosterModifier, BerryModifier, PokemonHeldItemModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PreserveBerryModifier } from "../modifier/modifier"; +import { + allAbilities, + AllyMoveCategoryPowerBoostAbAttr, + applyAbAttrs, + applyPostAttackAbAttrs, + applyPostItemLostAbAttrs, + applyPreAttackAbAttrs, + applyPreDefendAbAttrs, + BlockItemTheftAbAttr, + BlockNonDirectDamageAbAttr, + BlockOneHitKOAbAttr, + BlockRecoilDamageAttr, + ChangeMovePriorityAbAttr, + ConfusionOnStatusEffectAbAttr, + FieldMoveTypePowerBoostAbAttr, + FieldPreventExplosiveMovesAbAttr, + ForceSwitchOutImmunityAbAttr, + HealFromBerryUseAbAttr, + IgnoreContactAbAttr, + IgnoreMoveEffectsAbAttr, + IgnoreProtectOnContactAbAttr, + InfiltratorAbAttr, + MaxMultiHitAbAttr, + MoveAbilityBypassAbAttr, + MoveEffectChanceMultiplierAbAttr, + MoveTypeChangeAbAttr, + PostDamageForceSwitchAbAttr, + PostItemLostAbAttr, + ReverseDrainAbAttr, + UncopiableAbilityAbAttr, + UnsuppressableAbilityAbAttr, + UnswappableAbilityAbAttr, + UserFieldMoveTypePowerBoostAbAttr, + VariableMovePowerAbAttr, + WonderSkinAbAttr, +} from "./ability"; +import { + AttackTypeBoosterModifier, + BerryModifier, + PokemonHeldItemModifier, + PokemonMoveAccuracyBoosterModifier, + PokemonMultiHitModifier, + PreserveBerryModifier, +} from "../modifier/modifier"; import type { BattlerIndex } from "../battle"; import { BattleType } from "../battle"; import { TerrainType } from "./terrain"; @@ -41,7 +93,13 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { + BATTLE_STATS, + type BattleStat, + type EffectiveStat, + getStatKey, + Stat, +} from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -860,6 +918,46 @@ export default class Move implements Localizable { return priority.value; } + /** + * Calculate the [Expected Power](https://en.wikipedia.org/wiki/Expected_value) per turn + * of this move, taking into account multi hit moves, accuracy, and the number of turns it + * takes to execute. + * + * Does not (yet) consider the current field effects or the user's abilities. + */ + calculateEffectivePower(): number { + let effectivePower: number; + // Triple axel and triple kick are easier to special case. + if (this.id === Moves.TRIPLE_AXEL) { + effectivePower = 94.14; + } else if (this.id === Moves.TRIPLE_KICK) { + effectivePower = 47.07; + } else { + const multiHitAttr = this.getAttrs(MultiHitAttr)[0]; + if (multiHitAttr) { + effectivePower = multiHitAttr.calculateExpectedHitCount(this) * this.power; + } else { + effectivePower = this.power * (this.accuracy === -1 ? 1 : this.accuracy / 100); + } + } + /** The number of turns the user must commit to for this move's damage */ + let numTurns = 1; + + // These are intentionally not else-if statements even though there are no + // pokemon moves that have more than one of these attributes. This allows + // the function to future proof new moves / custom move behaviors. + if (this.hasAttr(DelayedAttackAttr)) { + numTurns += 2; + } + if (this.hasAttr(RechargeAttr)) { + numTurns += 1; + } + if (this.isChargingMove()) { + numTurns += 1; + } + return effectivePower / numTurns; + } + /** * Returns `true` if this move can be given additional strikes * by enhancing effects. @@ -913,47 +1011,37 @@ export class AttackMove extends Move { } } + /** + * Compute the benefit score of this move based on the offensive stat used and the move's power. + * @param user The Pokemon using the move + * @param target The Pokemon targeted by the move + * @param move The move being used + * @returns The benefit score of using this move + */ getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - let ret = super.getTargetBenefitScore(user, target, move); - + // TODO: Properly handle foul play, body press, and opponent stat stages. + const ret = super.getTargetBenefitScore(user, target, move); let attackScore = 0; const effectiveness = target.getAttackTypeEffectiveness(this.type, user, undefined, undefined, this); - attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2; - if (attackScore) { - if (this.category === MoveCategory.PHYSICAL) { - const atk = new Utils.NumberHolder(user.getEffectiveStat(Stat.ATK, target)); - applyMoveAttrs(VariableAtkAttr, user, target, move, atk); - if (atk.value > user.getEffectiveStat(Stat.SPATK, target)) { - const statRatio = user.getEffectiveStat(Stat.SPATK, target) / atk.value; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } else { - const spAtk = new Utils.NumberHolder(user.getEffectiveStat(Stat.SPATK, target)); - applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk); - if (spAtk.value > user.getEffectiveStat(Stat.ATK, target)) { - const statRatio = user.getEffectiveStat(Stat.ATK, target) / spAtk.value; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } - - const power = new Utils.NumberHolder(this.power); - applyMoveAttrs(VariablePowerAttr, user, target, move, power); - - attackScore += Math.floor(power.value / 5); + attackScore = Math.pow(effectiveness - 1, 2) * (effectiveness < 1 ? -2 : 2); + const [ thisStat, offStat ]: EffectiveStat[] = this.category === MoveCategory.PHYSICAL ? [ Stat.ATK, Stat.SPATK ] : [ Stat.SPATK, Stat.ATK ]; + const statHolder = new Utils.NumberHolder(user.getEffectiveStat(thisStat, target)); + const offStatValue = user.getEffectiveStat(offStat, target); + applyMoveAttrs(VariableAtkAttr, user, target, move, statHolder); + const statRatio = offStatValue / statHolder.value; + if (statRatio <= 0.75) { + attackScore *= 2; + } else if (statRatio <= 0.875) { + attackScore *= 1.5; } - ret -= attackScore; + const power = new Utils.NumberHolder(this.calculateEffectivePower()); + applyMoveAttrs(VariablePowerAttr, user, target, move, power); - return ret; + attackScore += Math.floor(power.value / 5); + + return ret - attackScore; } } @@ -2343,6 +2431,46 @@ export class MultiHitAttr extends MoveAttr { }, 0); } } + + /** + * Calculate the expected number of hits given this attribute's {@linkcode MultiHitType}, + * the move's accuracy, and a number of situational parameters. + * + * @param move - The move that this attribtue is applied to + * @param partySize - The size of the user's party, used for {@linkcode Moves.BEAT_UP | Beat Up} (default: `1`) + * @param maxMultiHit - Whether the move should always hit the maximum number of times, e.g. due to {@linkcode Abilities.SKILL_LINK | Skill Link} (default: `false`) + * @param ignoreAcc - `true` if the move should ignore accuracy checks, e.g. due to {@linkcode Abilities.NO_GUARD | No Guard} (default: `false`) + */ + calculateExpectedHitCount(move: Move, { ignoreAcc = false, maxMultiHit = false, partySize = 1 }: {ignoreAcc?: boolean, maxMultiHit?: boolean, partySize?: number} = {}): number { + let expectedHits: number; + switch (this.multiHitType) { + case MultiHitType._2_TO_5: + expectedHits = maxMultiHit ? 5 : 3.1; + break; + case MultiHitType._2: + expectedHits = 2; + break; + case MultiHitType._3: + expectedHits = 3; + break; + case MultiHitType._10: + expectedHits = 10; + break; + case MultiHitType.BEAT_UP: + // Estimate that half of the party can contribute to beat up. + expectedHits = Math.max(1, partySize / 2); + break; + } + if (ignoreAcc || move.accuracy === -1) { + return expectedHits; + } + const acc = move.accuracy / 100; + if (move.hasFlag(MoveFlags.CHECK_ALL_HITS) && !maxMultiHit) { + // N.B. No moves should be the _2_TO_5 variant and have the CHECK_ALL_HITS flag. + return acc * (1 - Math.pow(acc, expectedHits)) / (1 - acc); + } + return expectedHits *= acc; + } } export class ChangeMultiHitTypeAttr extends MoveAttr { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 4e3e53f994f..17917ad9b40 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2344,8 +2344,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Weight towards higher power moves, by reducing the power of moves below the highest power. // Caps max power at 90 to avoid something like hyper beam ruining the stats. // This is a pretty soft weighting factor, although it is scaled with the weight multiplier. - const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].power, v), 40), 90); - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power / maxPower, 1), 0.5)) ]); + const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].calculateEffectivePower(), v), 40), 90); + movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].calculateEffectivePower() / maxPower, 1), 0.5)) ]); // Weight damaging moves against the lower stat. This uses a non-linear relationship. // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. From d11f02aa3d9b90084e3e2191fb770bfc7a1f3e49 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:54:24 +0100 Subject: [PATCH 098/171] [Sprite] Variant json and deletion of the pngs for Vivillon-666 (#5408) * Variant json and deletion of the pngs * Variant color adjustment adjusted some color that werent mapped correctly. adjusted some colors due to contrast issues * Fixing the reason sprite test kept failing. .....669 --- public/exp-sprites.json | 130 +- public/images/pokemon/666-high-plains.png | Bin 970 -> 1010 bytes .../images/pokemon/back/666-high-plains.png | Bin 910 -> 949 bytes public/images/pokemon/exp/666-high-plains.png | Bin 6204 -> 7104 bytes .../exp/back/shiny/666-high-plains.png | Bin 2803 -> 2810 bytes .../pokemon/variant/666-continental.json | 19 + .../pokemon/variant/666-continental_3.json | 41 - .../pokemon/variant/666-continental_3.png | Bin 1352 -> 0 bytes public/images/pokemon/variant/666-fancy.json | 38 + .../images/pokemon/variant/666-fancy_2.json | 41 - public/images/pokemon/variant/666-fancy_2.png | Bin 1490 -> 0 bytes .../images/pokemon/variant/666-fancy_3.json | 41 - public/images/pokemon/variant/666-fancy_3.png | Bin 1490 -> 0 bytes .../pokemon/variant/666-high-plains.json | 6 +- .../images/pokemon/variant/666-monsoon.json | 61 +- public/images/pokemon/variant/666-ocean.json | 2 +- .../images/pokemon/variant/666-poke-ball.json | 21 +- .../pokemon/variant/666-poke-ball_3.json | 41 - .../pokemon/variant/666-poke-ball_3.png | Bin 1417 -> 0 bytes public/images/pokemon/variant/666-river.json | 55 +- .../images/pokemon/variant/666-river_2.json | 41 - public/images/pokemon/variant/666-river_2.png | Bin 1388 -> 0 bytes public/images/pokemon/variant/669-red.json | 18 + public/images/pokemon/variant/669-red_2.json | 41 - public/images/pokemon/variant/669-red_2.png | Bin 631 -> 0 bytes .../images/pokemon/variant/_masterlist.json | 64 +- .../pokemon/variant/back/666-fancy.json | 36 + .../pokemon/variant/back/666-fancy_2.json | 41 - .../pokemon/variant/back/666-fancy_2.png | Bin 1410 -> 0 bytes .../pokemon/variant/back/666-fancy_3.json | 41 - .../pokemon/variant/back/666-fancy_3.png | Bin 1416 -> 0 bytes .../pokemon/variant/back/666-high-plains.json | 6 +- .../pokemon/variant/back/666-monsoon.json | 59 +- .../pokemon/variant/back/666-ocean.json | 2 +- .../pokemon/variant/back/666-river.json | 54 +- .../pokemon/variant/back/666-river_2.json | 41 - .../pokemon/variant/back/666-river_2.png | Bin 1332 -> 0 bytes .../images/pokemon/variant/exp/666-fancy.json | 38 + .../pokemon/variant/exp/666-fancy_2.json | 1280 ----------------- .../pokemon/variant/exp/666-fancy_2.png | Bin 7586 -> 0 bytes .../pokemon/variant/exp/666-fancy_3.json | 1280 ----------------- .../pokemon/variant/exp/666-fancy_3.png | Bin 7532 -> 0 bytes .../pokemon/variant/exp/666-high-plains.json | 6 +- .../pokemon/variant/exp/666-icy-snow.json | 10 +- .../pokemon/variant/exp/666-meadow.json | 36 + .../pokemon/variant/exp/666-meadow_2.json | 1280 ----------------- .../pokemon/variant/exp/666-meadow_2.png | Bin 7448 -> 0 bytes .../pokemon/variant/exp/666-meadow_3.json | 1280 ----------------- .../pokemon/variant/exp/666-meadow_3.png | Bin 7434 -> 0 bytes .../pokemon/variant/exp/666-monsoon.json | 61 +- .../images/pokemon/variant/exp/666-ocean.json | 2 +- .../pokemon/variant/exp/666-poke-ball.json | 27 +- .../pokemon/variant/exp/666-poke-ball_3.json | 1280 ----------------- .../pokemon/variant/exp/666-poke-ball_3.png | Bin 7549 -> 0 bytes .../images/pokemon/variant/exp/666-river.json | 55 +- .../pokemon/variant/exp/666-river_2.json | 1280 ----------------- .../pokemon/variant/exp/666-river_2.png | Bin 7425 -> 0 bytes .../variant/exp/back/666-archipelago.json | 35 + .../variant/exp/back/666-archipelago_2.json | 104 -- .../variant/exp/back/666-archipelago_2.png | Bin 2271 -> 0 bytes .../variant/exp/back/666-archipelago_3.json | 104 -- .../variant/exp/back/666-archipelago_3.png | Bin 2261 -> 0 bytes .../variant/exp/back/666-continental.json | 38 + .../variant/exp/back/666-continental_2.json | 104 -- .../variant/exp/back/666-continental_2.png | Bin 2328 -> 0 bytes .../variant/exp/back/666-continental_3.json | 104 -- .../variant/exp/back/666-continental_3.png | Bin 2319 -> 0 bytes .../pokemon/variant/exp/back/666-elegant.json | 34 + .../variant/exp/back/666-elegant_2.json | 104 -- .../variant/exp/back/666-elegant_2.png | Bin 2328 -> 0 bytes .../variant/exp/back/666-elegant_3.json | 104 -- .../variant/exp/back/666-elegant_3.png | Bin 2319 -> 0 bytes .../pokemon/variant/exp/back/666-fancy.json | 36 + .../pokemon/variant/exp/back/666-fancy_2.json | 104 -- .../pokemon/variant/exp/back/666-fancy_2.png | Bin 2632 -> 0 bytes .../pokemon/variant/exp/back/666-fancy_3.json | 104 -- .../pokemon/variant/exp/back/666-fancy_3.png | Bin 2623 -> 0 bytes .../pokemon/variant/exp/back/666-garden.json | 32 + .../variant/exp/back/666-garden_2.json | 104 -- .../pokemon/variant/exp/back/666-garden_2.png | Bin 2253 -> 0 bytes .../variant/exp/back/666-garden_3.json | 104 -- .../pokemon/variant/exp/back/666-garden_3.png | Bin 2243 -> 0 bytes .../variant/exp/back/666-high-plains.json | 38 + .../variant/exp/back/666-high-plains_2.json | 104 -- .../variant/exp/back/666-high-plains_2.png | Bin 2359 -> 0 bytes .../variant/exp/back/666-high-plains_3.json | 104 -- .../variant/exp/back/666-high-plains_3.png | Bin 2349 -> 0 bytes .../variant/exp/back/666-icy-snow.json | 32 + .../variant/exp/back/666-icy-snow_2.json | 104 -- .../variant/exp/back/666-icy-snow_2.png | Bin 2353 -> 0 bytes .../variant/exp/back/666-icy-snow_3.json | 104 -- .../variant/exp/back/666-icy-snow_3.png | Bin 2344 -> 0 bytes .../pokemon/variant/exp/back/666-jungle.json | 34 + .../variant/exp/back/666-jungle_2.json | 104 -- .../pokemon/variant/exp/back/666-jungle_2.png | Bin 2492 -> 0 bytes .../variant/exp/back/666-jungle_3.json | 104 -- .../pokemon/variant/exp/back/666-jungle_3.png | Bin 2483 -> 0 bytes .../pokemon/variant/exp/back/666-marine.json | 32 + .../variant/exp/back/666-marine_2.json | 104 -- .../pokemon/variant/exp/back/666-marine_2.png | Bin 2317 -> 0 bytes .../variant/exp/back/666-marine_3.json | 104 -- .../pokemon/variant/exp/back/666-marine_3.png | Bin 2301 -> 0 bytes .../pokemon/variant/exp/back/666-meadow.json | 34 + .../variant/exp/back/666-meadow_2.json | 524 ------- .../pokemon/variant/exp/back/666-meadow_2.png | Bin 2360 -> 0 bytes .../variant/exp/back/666-meadow_3.json | 524 ------- .../pokemon/variant/exp/back/666-meadow_3.png | Bin 2349 -> 0 bytes .../pokemon/variant/exp/back/666-modern.json | 32 + .../variant/exp/back/666-modern_2.json | 104 -- .../pokemon/variant/exp/back/666-modern_2.png | Bin 2237 -> 0 bytes .../variant/exp/back/666-modern_3.json | 104 -- .../pokemon/variant/exp/back/666-modern_3.png | Bin 2226 -> 0 bytes .../pokemon/variant/exp/back/666-monsoon.json | 33 + .../variant/exp/back/666-monsoon_2.json | 104 -- .../variant/exp/back/666-monsoon_2.png | Bin 2462 -> 0 bytes .../variant/exp/back/666-monsoon_3.json | 104 -- .../variant/exp/back/666-monsoon_3.png | Bin 2447 -> 0 bytes .../pokemon/variant/exp/back/666-ocean.json | 34 + .../pokemon/variant/exp/back/666-ocean_2.json | 104 -- .../pokemon/variant/exp/back/666-ocean_2.png | Bin 2607 -> 0 bytes .../pokemon/variant/exp/back/666-ocean_3.json | 104 -- .../pokemon/variant/exp/back/666-ocean_3.png | Bin 2596 -> 0 bytes .../variant/exp/back/666-poke-ball.json | 34 + .../variant/exp/back/666-poke-ball_2.json | 104 -- .../variant/exp/back/666-poke-ball_2.png | Bin 2616 -> 0 bytes .../variant/exp/back/666-poke-ball_3.json | 104 -- .../variant/exp/back/666-poke-ball_3.png | Bin 2606 -> 0 bytes .../pokemon/variant/exp/back/666-polar.json | 34 + .../pokemon/variant/exp/back/666-polar_2.json | 104 -- .../pokemon/variant/exp/back/666-polar_2.png | Bin 2356 -> 0 bytes .../pokemon/variant/exp/back/666-polar_3.json | 104 -- .../pokemon/variant/exp/back/666-polar_3.png | Bin 2346 -> 0 bytes .../pokemon/variant/exp/back/666-river.json | 40 + .../pokemon/variant/exp/back/666-river_2.json | 104 -- .../pokemon/variant/exp/back/666-river_2.png | Bin 2346 -> 0 bytes .../pokemon/variant/exp/back/666-river_3.json | 104 -- .../pokemon/variant/exp/back/666-river_3.png | Bin 2324 -> 0 bytes .../variant/exp/back/666-sandstorm.json | 34 + .../variant/exp/back/666-sandstorm_2.json | 104 -- .../variant/exp/back/666-sandstorm_2.png | Bin 2383 -> 0 bytes .../variant/exp/back/666-sandstorm_3.json | 104 -- .../variant/exp/back/666-sandstorm_3.png | Bin 2382 -> 0 bytes .../pokemon/variant/exp/back/666-savanna.json | 34 + .../variant/exp/back/666-savanna_2.json | 104 -- .../variant/exp/back/666-savanna_2.png | Bin 2505 -> 0 bytes .../variant/exp/back/666-savanna_3.json | 104 -- .../variant/exp/back/666-savanna_3.png | Bin 2495 -> 0 bytes .../pokemon/variant/exp/back/666-sun.json | 34 + .../pokemon/variant/exp/back/666-sun_2.json | 104 -- .../pokemon/variant/exp/back/666-sun_2.png | Bin 2559 -> 0 bytes .../pokemon/variant/exp/back/666-sun_3.json | 104 -- .../pokemon/variant/exp/back/666-sun_3.png | Bin 2550 -> 0 bytes .../pokemon/variant/exp/back/666-tundra.json | 32 + .../variant/exp/back/666-tundra_2.json | 104 -- .../pokemon/variant/exp/back/666-tundra_2.png | Bin 2429 -> 0 bytes .../variant/exp/back/666-tundra_3.json | 104 -- .../pokemon/variant/exp/back/666-tundra_3.png | Bin 2420 -> 0 bytes 157 files changed, 1210 insertions(+), 13331 deletions(-) delete mode 100644 public/images/pokemon/variant/666-continental_3.json delete mode 100644 public/images/pokemon/variant/666-continental_3.png create mode 100644 public/images/pokemon/variant/666-fancy.json delete mode 100644 public/images/pokemon/variant/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/666-fancy_3.png delete mode 100644 public/images/pokemon/variant/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/666-poke-ball_3.png delete mode 100644 public/images/pokemon/variant/666-river_2.json delete mode 100644 public/images/pokemon/variant/666-river_2.png delete mode 100644 public/images/pokemon/variant/669-red_2.json delete mode 100644 public/images/pokemon/variant/669-red_2.png create mode 100644 public/images/pokemon/variant/back/666-fancy.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/back/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_3.png delete mode 100644 public/images/pokemon/variant/back/666-river_2.json delete mode 100644 public/images/pokemon/variant/back/666-river_2.png create mode 100644 public/images/pokemon/variant/exp/666-fancy.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/exp/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_3.png create mode 100644 public/images/pokemon/variant/exp/666-meadow.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_2.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_2.png delete mode 100644 public/images/pokemon/variant/exp/666-meadow_3.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_3.png delete mode 100644 public/images/pokemon/variant/exp/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/exp/666-poke-ball_3.png delete mode 100644 public/images/pokemon/variant/exp/666-river_2.json delete mode 100644 public/images/pokemon/variant/exp/666-river_2.png create mode 100644 public/images/pokemon/variant/exp/back/666-archipelago.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-continental.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-elegant.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-fancy.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-garden.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-high-plains.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-jungle.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-marine.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-meadow.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-modern.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-monsoon.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-ocean.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-polar.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-river.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-river_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-savanna.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-sun.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-tundra.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_3.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index c3b79d0cb38..2bf8c2bf798 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -4545,19 +4545,15 @@ "666-archipelago", "666-continental", "666-elegant", - "666-fancy_2", - "666-fancy_2", - "666-fancy_3", - "666-fancy_3", + "666-fancy", + "666-fancy", "666-garden", "666-high", "666-icy-snow", "666-jungle", "666-marine", - "666-meadow_2", - "666-meadow_2", - "666-meadow_3", - "666-meadow_3", + "666-meadow", + "666-meadow", "666-modern", "666-monsoon", "666-ocean", @@ -4566,8 +4562,6 @@ "666-poke", "666-polar", "666-river", - "666-river_2", - "666-river_2", "666-sandstorm", "666-savanna", "666-sun", @@ -4817,86 +4811,46 @@ "665b", "665_2b", "665_2b", - "666b-archipelago_2", - "666b-archipelago_2", - "666b-archipelago_3", - "666b-archipelago_3", - "666b-continental_2", - "666b-continental_2", - "666b-continental_3", - "666b-continental_3", - "666b-elegant_2", - "666b-elegant_2", - "666b-elegant_3", - "666b-elegant_3", - "666b-fancy_2", - "666b-fancy_2", - "666b-fancy_3", - "666b-fancy_3", - "666b-garden_2", - "666b-garden_2", - "666b-garden_3", - "666b-garden_3", - "666b-high", - "666b-high", - "666b-high", - "666b-high", + "666b-archipelago", + "666b-archipelago", + "666b-continental", + "666b-continental", + "666b-elegant", + "666b-elegant", + "666b-fancy", + "666b-fancy", + "666b-garden", + "666b-garden", + "666b-high-plains", + "666b-high-plains", "666b-icy-snow", "666b-icy-snow", - "666b-icy-snow", - "666b-icy-snow", - "666b-jungle_2", - "666b-jungle_2", - "666b-jungle_3", - "666b-jungle_3", - "666b-marine_2", - "666b-marine_2", - "666b-marine_3", - "666b-marine_3", - "666b-meadow_2", - "666b-meadow_2", - "666b-meadow_3", - "666b-meadow_3", - "666b-modern_2", - "666b-modern_2", - "666b-modern_3", - "666b-modern_3", - "666b-monsoon_2", - "666b-monsoon_2", - "666b-monsoon_3", - "666b-monsoon_3", - "666b-ocean_2", - "666b-ocean_2", - "666b-ocean_3", - "666b-ocean_3", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-polar_2", - "666b-polar_2", - "666b-polar_3", - "666b-polar_3", - "666b-river_2", - "666b-river_2", - "666b-river_3", - "666b-river_3", - "666b-sandstorm_2", - "666b-sandstorm_2", - "666b-sandstorm_3", - "666b-sandstorm_3", - "666b-savanna_2", - "666b-savanna_2", - "666b-savanna_3", - "666b-savanna_3", - "666b-sun_2", - "666b-sun_2", - "666b-sun_3", - "666b-sun_3", - "666b-tundra_2", - "666b-tundra_2", - "666b-tundra_3", - "666b-tundra_3", + "666b-jungle", + "666b-jungle", + "666b-marine", + "666b-marine", + "666b-meadow", + "666b-meadow", + "666b-modern", + "666b-modern", + "666b-monsoon", + "666b-monsoon", + "666b-ocean", + "666b-ocean", + "666b-poke-ball", + "666b-poke-ball", + "666b-polar", + "666b-polar", + "666b-river", + "666b-river", + "666b-sandstorm", + "666b-sandstorm", + "666b-savanna", + "666b-savanna", + "666b-sun", + "666b-sun", + "666b-tundra", + "666b-tundra", "6705b", "6706_2b", "6706_2b", diff --git a/public/images/pokemon/666-high-plains.png b/public/images/pokemon/666-high-plains.png index c294984e4699a072f3b3c1f7f175eb3374a3f195..45cb22fc592e9234b5cb3d02878c0ebb35d60510 100644 GIT binary patch delta 959 zcmV;w13>)B2l5AyBqRZIQb$4nuFf3k0000pP)t-s0000G5D+jhFf(;SP)bU7Jt2`e zA%Dhz-Y5V701p*q@M{RcI{SM4Qv(?3dM2D}@91>>A})8pwd*JGe+HZ# zLXdM5f%80j9|?{I#tgs#j3Nv<4l#%=7HwsO*y~du(1wxXC=8@VQ|W5m zwwR!S&;XBF7hUUVT-ot>PWN-|m98X3Hr3kuoC4Q5i=T9*F|+HKB+fAxfk@+>nK5LJ{m4iab8V@>ElL|KS)Din-m9 h@&AGj&5yN=lJPA%7bq%cB4Q00DGTPE!Ct z=GbNc00T%#L_t(o!=>1Za;zW>0MJd8wW#R-|Lx6-r>OLn={POmF$7@Uem?(I07j~w z3FqLw>W#SE0q$3b5Pvh^biMwBoG?tBXYY~Vr~!tF9>QZ8G$PT>#~6}{8)E>u4MTG} zVkptiX>5csf`2+fyR@m|96%C*=y^2IqywcfGzLPK@KoxYFyTETVO=W(wU7xE9ARNCzF60Lnf-((J;gat+7Lrm{=u@GkD)jF&iNvp-8LdUL_$U3?6g1 z8dU44-ZgUrg#;lJsYFEgiq%yHlvjGp*%A*%M4%$hD}RxY(x?Nu8ZFT^N@O66zHzz- z<3dEFX9xlVMBm7Pv_{p-R!C!LW$->C$$+>^LLzL*Hij)BUa&41MHsRjVi0Rww3QKJ ztxthK8%BzwFpvs$rK?rjV1foh4cum7@NOuFLItg;K_$YH7)B75g??s!LOUg4b%+?K zWJCU_XMY%%dEp;cT7oyamCB$}u6bN?nehhb7=;2$S?~r(MukKL<`e_Y5xD?r$T}(w zRY2|(V&h*Wtydt0(Heer4(L`Lg%qNkTm6I4Af6@}HpCbP2eR?h-x#)*TVth~ZPskC zu!->$#s%>nwi(r6V0#bak`Zp)%7VNB%B)|*=zk)l{QUf|;OZvly}O2yk$MGgY`9vt z56TWPKtc$B2Lppgmbv* zB@cyK?971MF9U#hOhN=O1Gc3`s2s=PZxQd0Lx}*0u<>PCu-q%rxIuU@$p`?H3*b`# ztA81b2Ev;$(OvN%LS0yDN1|^4iXq74CNsX@1#G$%PeuKo1RK}5oN1{M{O(^0=h!SZxH)H|dzO%&x?{Yvu65hW% sngTa1WB=!{zWvj3_HGQo19a73KG94IdjJ3c07*qoM6N<$f|sR|!vFvP diff --git a/public/images/pokemon/back/666-high-plains.png b/public/images/pokemon/back/666-high-plains.png index 22f676d8f49d95897204fb63170752e2b5f15914..d6cca9c2413dc4c6b0ab535c8e173077aa62aefe 100644 GIT binary patch delta 900 zcmV-~1AF|A2ek)~BqRZIQb$4nuFf3k0000mP)t-s0000G5D+jhFf(;SP)bU7Jt2`e z9)CN3PKp2k01$LiPE!E?|NsC0|NsC0|NsC0|Np>Hi$eea0~bj|K~z|UrPt|}s~`*j z;0CI9uoHd%x4qebu(kFKKc;hP_zYpuJ|49JJpS5X-@inLn-cLQGTu~-ZxEP-3v%5@ zW(I$GUAGaqmc(5IC~`5B+XxxsShS{h5q~BAl!%OEUDI0#8wd=Zvz%&YYBq@Yj zNWK>|i(P7ws7(I7^@%`9BjsrH1~(!6U~K!r zgDz5(8hk>a4P3U3T;TpljXw6Hseh`K4}P?PeqkY;h~C^8+=gimt`x09~%1MZUe!OB8}O+!6%FK4ZwMXvNE=fLV7|UXxXsCU@v(f*jRL*anMG> z>>UN{EQvAtp&-(VxTh^i6^Hpe@}vxjVfpb;6+A7&NHP2 z5whV3{h;mA8$&sZ;Sl<}SAT*H+~WrWLSw{Ow|F)pAwsY*L%hMEdl?fG*@%|L(s0P` zh~Myh{s0!_j&X`mDobxmXVp=Q@p=NC;VFF aACLb)=w$Hx*$D>#0000Gj&5yN=lJP9)GU?sl5OI00DGTPE!Ct z=GbNc00R$6L_t(o!==~hma8BP0N^Ib9h^qr|8Xx_fUs!o8GiKi)bJU?qJ6zu19<(l zL5yD_(@it+B{JVsjBgNFgbQ-QpA7!-JRc))UJ_3c$dMOAd5mNuUexp{qQsvPk&(ok zf;>RjSkx49JAcn-2rQ$3N0Ja9A?04sEq19z%58}N4hBgGb_EfF*hpFu+QIdP*deg* zj9?CKh|NetXx|ml-VopaI%402UfNvU9*0O7LQ~$sY|_ntMs5Zois{8N9p67GX6I z_0;GMN@F5W(?}(nyunQfKN#D7@IpjDRD(|lD!Y=mja=aVlp7+(ofeY=KiWWlun!zxivctjtUV1SjQP-iW8v^ zv|`v{5NjR;HWuAy9260kulHbQNeICYg$RCu1j$zrQSP(;g8=C`jv&n!gPg%gI5>s% zdlIB#_&q~HWTPR+k`X%yn#$UU=su7%5Q3x!M5`+|n2v@=L^;Y9gc@Lc%Xe!cz!-Gp5zx?@tR00000NkvXXu0mjfprCvM diff --git a/public/images/pokemon/exp/666-high-plains.png b/public/images/pokemon/exp/666-high-plains.png index 9d6527bf091ee1c3b7b6fb40d1c5b09c76da7aad..a34b2fd825406e65727142da72e1d0581c2ccf1f 100644 GIT binary patch literal 7104 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 diff --git a/public/images/pokemon/exp/back/shiny/666-high-plains.png b/public/images/pokemon/exp/back/shiny/666-high-plains.png index 3f8840b8bf0fbf5264cb5378f466cc83e03fb01a..80e02eede1337b956938cb38f3a2553d83e073a8 100644 GIT binary patch literal 2810 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 literal 2803 zcmai$d0diN7smk+Qb7$-bKl5JF&rhbtXx2ZaZN4JY{CUYgIsc(vO-J=10^kuG&8r< zOwlx#7IVpR+%?Ox#U-0uGPH7=)WK%{c;CcfXk}O z0ssIwnM8000Dut5n72tv@+_%c1WP*LNp}Z3KzX<3q~yia&B@bV(km(|nwgm$bJw+q z!h3srU-Pjl#p6e#T|PZi?!N8+wb-w+vZ$x0abjY^PT*7{nV=Bq?&1Mh|F1T|&nW@` zWWC7*ThG|+&%PI<$BPk>7HPb3=e6~dnGRBL?52F%urEbDLez1OgKpJ=`Jq#L&ra7a zftIZGCxcjL))hNCqm>bKe`=f2XN5uGt8zP#Gc4PS_(LhmB}6&RaNBZ`MQ_agJ=06Z zsFlLS-Mj%eOym2mDe(?rJ(wG0spn>v(nYT=O;B$?>fGeFdqD#Qr6&3@@Um> zEU@4v@o`MvzN~*Oe zS9~7CBS)WWz*?P_<@&5=YR!MY^(!bve`G+$NVgfWc$w~&*>mgQqS!jH`qV%g0ZT(T z0FK5NCA5wX-ZJJsBwK3$uRZO>0U-!vct0IH-GZt8k% z!#O;slGd8!lI9>K!*ONkX1Wh1y@5u{O_@;RSdBIjI3;F!xH)Q+CsJ5iKKl_zo zhFpe`fReoB#*mGh5dN`G*0JH(DYgT1mGx(0mBehTQHmmM7Rxi&gh6ID?XRfXFLSyH z>kplc%NwK8qw6}oL||^dK;CuOc9^R+!k&-(?;q)Fk1`gC|wVb zbERnJbw%Fw;kCN8!tOg{-7h3)vWwvjRrmQ9p5$vFr|eBA?1IN53^8W?W*Rbd zw0SspR$mB@!-RyN!G}+&gr0at@O_TCvmM2Q%bsAI59JT`0ur8*tv+p2{Oi6B(3&a^ zB0fD^i(_=Tl*tsGXh_E8bol!m*p-bk5|7XetLb6e=p_oRBT3)L|pF>a5 zna(DZ_*N@!?AYjUH9!LD5pz_pn;ZJ;Tl(=i_KH4Ae@IdMBFPzVvL+qAFKkh(u;%(w z(&1hay9A~0>!qEl?GrfZ0%VtdA^hc-YgzizO9bJH_HP0G$rgKgro%A?pIud#RuBvE zZL_fGF%C++i}d=KzONNnbrpuJj)b|-VFX4heT1dIJ2P$6idwb{c z1R0Auz%@VDIUZ8G*W+>9EA`_ys3bD@$r<`pJKwmj-zmzZp@en6^XExD#jAQPXu}520A`}c7pr$t+A!dJ+B{WF{sZ-@QA<%DtRzI_lz|@5MyC^7 z0-May7dEYp+9Vu_Rb|u6wm^J4ollFLuA$Q*9b#P!EmeC5KS%_R6Txy)c1%npP=%K2 zhH@F(S!^U!{R>ECMb|^4S6XvG9X($8yU0oHLjpw-|1^WzAIw&`0qFoUw9y{G-N;Ph z$#gltE2FU&jx3=lZNoOpuC^|}NWBfl=b%7w7TM4au$+uo^FwEcjRoUbMA9BMjeh!z zb`&JyRs^JBAn}2g?w*hC8X-;Q34+(yu6tM2Sy77Qux}toUYRliMNXmWU9lST+u^W` zN$33fCrQt_;Z5dmgRw1ff?(-w5J<;2Nty5Zx%^b#!SN)HT=LaEN*!+zQ-wQvNg5x) z9g*=#D{ge?ZY-t9iXU_p?!l(5NLGD$gi*KiCq5#Dg~gc35RP=mw_AO@Iln`q&P41r zTVkh7M*U@?#WNWz<@rWVht>Z=CGoex-lXe)FjxIAnx;R)k(}i={_S>zh?i2iWea*h zTHWgjRml0he;S_A*KR&Y6@oT(OVaV&N+C85YoPOwmO(m1!B{H4;+BLUA5rJHorw3F zr^Fo~g#1sOjr2FzmJ7z>L;lJ3=T?xziVP(?U_+J8rj-{+=98PuGy5g#0;a?g+Qrl4H;&VW#N4E^r)Bc*|{s|!4yAaClsO-N1m8}fW diff --git a/public/images/pokemon/variant/666-continental.json b/public/images/pokemon/variant/666-continental.json index 67e25fc79b4..92614fb346c 100644 --- a/public/images/pokemon/variant/666-continental.json +++ b/public/images/pokemon/variant/666-continental.json @@ -2,6 +2,7 @@ "1": { "101010": "101010", "595959": "724b7a", + "555353": "724b7a", "d18257": "d18257", "f9bd55": "f9bd55", "303030": "402746", @@ -15,5 +16,23 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.json b/public/images/pokemon/variant/666-continental_3.json deleted file mode 100644 index ed0fee105bb..00000000000 --- a/public/images/pokemon/variant/666-continental_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:70eae64f87d7226958d0443e262bab16:5ea86607863e872365dc956f4d819752:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.png b/public/images/pokemon/variant/666-continental_3.png deleted file mode 100644 index 24e4c9ab37cf95d330d8eb9913524fc42905ba44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 zcmV-O1-JT%P)0{{R3@DxZv0004lX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$i(@I4u4i*#<$B zbKWNov$CWRpA%0QbV1@ruFEdJaV|M5@XWB0P0tgDiN#VE%U#UMhDtn598pw_@`aqs z3g<1(YPHVV_v9}O6||KM*J+L-fh8o7f(RLPR8WP57_Ay9CepMY_wbK6{uH@na#g^{ zv49#>NRA);4}N!R7N;iNq);5_d9m$}C=lEQS`FL&KDO=F3E+PQuC$K7)&yohNpEzt z$PqBG4P0DzGIO`ldWEcnkEcxxKabaryvcsjKB1;NTD# zFH!co$GdyGd;9lHyT2c(z;e9h6-iA1001gbOjJbx000mW5N$0DfgBuOYGfB*mh4s=pZQvm<}|NsC0|NsC0|NsA2O4}3w z00S^dL_t(og{9crmYpCB0MJPWQ563Fcbf}$!a26(!8H}wCPAn(KR^G}0N&jCOgJ~s zFm8P#mKm_#`bzwt0l^>y32zYyAy|(DM;-4FCM<+=d1(~Ftj9Z~5gX$LvJFFP`o>Vg zu4(D~f)s)V!u)E}jqn1ILC+HcBBwJboC%r+4#T1l&x31CbY)Q=F(9a;vIH>(PlWSp zVRJ!|9}!}Q9JdV05)sjRPlR6(4I>-RXxvbxOnA@6jAX-mMttlLt-VT2h=Bt6#SnrK zx^xJ1k{E>Gee+N*T|;UZfpXz7*XaoLzu3cXCTmC zyYB6KjFZkM*FENL?LY(A7@Y!l-_QUCqab=e zD{#~p@F>UtG(+B_E|9E%%oHN=k5bkVPy=m)6`-k_g*2j8p-*K>MjFu5OBftT!bKQT zF#>t$PCB$2ETo-L!!QDYbf6jxY>5_z6$qxjS;Q2ERS`-i{r>*4;C4hGhKaDk25k(B zcot$s_t5bh^l#~7h?H{$qFN77(E`7UWN$rnX&uW0S@NM zV<8)m?xiBvb)8$}Jg;id!xCTUji0N*#s=YJs_{@zDFL4X6o*?4G?BreS>+%?S*VGy z4Oy8hBeF8G?~WVta!-bZ=;}7(IFOIjVzh)_8ca|UVicl;QizRFlA*C&OyD!IGeqI% zY>g5Ky=YFBmR=S(J`;+dWhnCT5NkuTV*Q2VozRUnd*1)00{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrj{0|I9No)AwzYti;6gwDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR~rk=_!=HNNL?&0J6U5saW*ZnyLl%mN1pGX{Mx?vG-5YKK} zI_G`j2&+g6@j3CNK^G)`Lgn-op}ffw8U7zcv8K)Y$%-^aGyJ^}pCz?IhZ*IU5cC+W?u z7Ciz6w}Ff6t|spRmpj17lP(#OBl&3wr4sOdM&DEbhHioWHMeh_bDTZ^IqKE&4RCM> zOq3~m-Q(S%-oE`?)9K$2QA2W>Ezv&O0000mP)t-s0000G5D-8oMsiDffgBv(KtNxr zKDN?r>EKd-X_2XXyw85~m5hqn?bPzrOLZ5p92d z{;2^xIrW)vZoXo1>Kk#n0c+rz8k<%=XoxdkvggO8^TfA0Or!B6Xyd&f?_;R#K5EJgJ~oI z1vw`JhcGWhjL4HR&I!+GV1#cmAgEC$QDq3>IN=H5G^io>56J5+K_+o=@qL_*I`l=N zX@paZ=m+BsRZ@Zwr&BjnS}_DU`%2TfSBdLWR>bMT_}LJGx}$WqL3R=sSK^p$!Y?U=axt{ME5NbSQ3^;<~A8w`}pjgK^?x$$I8fgQ==l) zs6c(2iFbZO`q1cEp}ggi3%e;l*i2ro9PWCHNXV_Je;|>4~J1kZpknBj!Z& zQVl#>+p!}k$|bt^YGgja{T2vE-*5n^%|=OtjjF(2bHKeIuHHfoUKu6o!qi(4Ay*2K z`BzL`j$#C@FSoR*gOB#khRLm|_`58H;n6 z_0W$c+MaRuu>+h;4p9s+1M<-$^qfe6-F`8F^qN68%Y2}U?<&0-Hwe&RsWTcvPfZ5U zXWtD5M+ICWARk(0&{f#&AC`&|(v}9G8iL5mFz|XEwzIp*SRu3VdJ*z^7lTuici|(0 z5GLMlHK0zYbMh)Q;>J+KM;8;k={pPvY6gE-x>C$*qa?z+f88N+N5T^Ex^dqbpNXzU2pPlRDKQ}PPS=Fbgd(^y6#2M` swNO)5|KWHhbg|2x=l?1Bo7kV9KSOCzjeZa*xc~qF07*qoM6N<$g8$&PdjJ3c diff --git a/public/images/pokemon/variant/666-fancy_3.json b/public/images/pokemon/variant/666-fancy_3.json deleted file mode 100644 index be0625b1360..00000000000 --- a/public/images/pokemon/variant/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d5276d8c199bae070dbaa73293fd554:a099f55391d8e4bbae565d4a170574c9:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-fancy_3.png b/public/images/pokemon/variant/666-fancy_3.png deleted file mode 100644 index a8453d6cbce1ed7c6c8a7316cdb34ec3d5f4b1c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmV;@1ugoCP)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000mP)t-s0000G5D)-&8-W}g-atTKsy=U@ zLZ-iExxiYs(rxMBQqO+#(CLli>4NgqOLZ5p92d z{;2^xIrW+Fe!gOH>Kk#n0bxDz8k<%$8ju|kvggO8^TfA0Or!B6UPHYf?_-l#K5EJgJ~oI z1vw@IhcG8ZjL4HR&I!+GV1#cmAgEC$QDq3>IpGQ6G^io>56J5+K_+o=@qN6GI`l=N zX@obSVxY-bbx}$WqL3R=sSK^p$!P+T=axt{M0YI_SQ3^;<~A8w`}pjgK^?Bm$I8fgQ==l) zs6IH%ESbZO`q14~J1kZpknBj!Z& zQVl#?+p!}k$|t(`YGgja{T2vk-*5n^%|=OtjjF(2bHKeIzTQF&UKu6o!qi(4Ay*2K z`BzL`j$#C@FSoR*gOB#khRLm|_`58H@Lr z_0W$c+MaRuu>+h;4p9s+1M=A;^qfe6-F`8F^qN68%Y2}U?<&0-Hwe&RsWTcvPfZ5U zXWtJ7M+ICWARk(0&{f#&AC`&|(v}9G8iL5mFz|YvwzK=mSRu3VdJ*z^7lTuici|(0 z5GLMlHK0zY_wp(<;>J+KMIRHq={pPvY6gE-`clkmqa?z+f88N+N5T?ux^dqbpNXzU2pPlRDKQ}PPS=Fbgd(^y6#2M` swNO)5|KWHhbg|2x=l?1Bo7kV9KUa2F#yB+sJOBUy07*qoM6N<$g3ed0!vFvP diff --git a/public/images/pokemon/variant/666-high-plains.json b/public/images/pokemon/variant/666-high-plains.json index fd26a077f34..85a5eb24cc3 100644 --- a/public/images/pokemon/variant/666-high-plains.json +++ b/public/images/pokemon/variant/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-monsoon.json b/public/images/pokemon/variant/666-monsoon.json index 8aaedab67ca..915d471b2b1 100644 --- a/public/images/pokemon/variant/666-monsoon.json +++ b/public/images/pokemon/variant/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "675220": "958c8a", - "ceab62": "d9edd4", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "a97cbc", - "504a4a": "7f6991", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "675220": "2c3593", - "ceab62": "5857bc", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "5857bc", - "504a4a": "2c3593", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-ocean.json b/public/images/pokemon/variant/666-ocean.json index 975602c6f9e..23f8d48c681 100644 --- a/public/images/pokemon/variant/666-ocean.json +++ b/public/images/pokemon/variant/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f4ad61": "f4ad61", "f8ef6a": "f8ef6a", - "303030": "b56208", + "303030": "b54908", "675220": "bc601c", "ceab62": "ea8742", "707068": "ea8742", diff --git a/public/images/pokemon/variant/666-poke-ball.json b/public/images/pokemon/variant/666-poke-ball.json index e83072c51a5..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/666-poke-ball.json +++ b/public/images/pokemon/variant/666-poke-ball.json @@ -14,6 +14,25 @@ "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.json b/public/images/pokemon/variant/666-poke-ball_3.json deleted file mode 100644 index d506cef780e..00000000000 --- a/public/images/pokemon/variant/666-poke-ball_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ff5b539e59b71fa67f66f26bb0f2e9d:45bec6d118350401c25850e5f12a25af:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.png b/public/images/pokemon/variant/666-poke-ball_3.png deleted file mode 100644 index e6056246fce5aca66e7297d2940276c8905b6c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1417 zcmV;41$O$0P)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000jP)t-s0000G5D;bn00aO=002+`0A2t9 zZ5aT4fgBvJ02-$NINty^)i+u$AeHc@zvsx3ZU6uP4|GyaQvm<}|NsC0|NsC0|NsC0 z<&B=E000AQNklo%WKnP75LCk? zpz}hcXJM_N$mc`qko}OWO@gG2``r-@!;IvO1FBSrr1$bjG13Fk+NdEv4AH?ZZ=;{@#QPm?MtIw)jAtGi8FTK1k?|Hq`)ZOkpF%7cZ#AU1 z8Wu(@@|t0R#0b>@h=gG5iE1G7iUj)Xj6~OC6obyvISM1np+_8OO$}VF;gO(m?5G94RK*O zLsk(D!PPgZg)?%tk!}xDMl@Sliaf_i`ThN6L1t++a@TsIB61@RM8@)BL&mxpbD~FN zvS(gtvKG0X@+IFJ36EEh)(v&7a!~}45Xwp~ogObSrc{7)p|6*INEVt(jJ9XYUUqP#b{?% ziBb_m2FCW4=#b45ifk)HkK7kGG~qL$2#yRzK5k;It0|-ZaI6Vk-{G0{|CIbq-=Cj9 X?#WSr7pRkW00000NkvXXu0mjf21$75 diff --git a/public/images/pokemon/variant/666-river.json b/public/images/pokemon/variant/666-river.json index 818e1ee3989..c7e5e288d05 100644 --- a/public/images/pokemon/variant/666-river.json +++ b/public/images/pokemon/variant/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625841": "625841", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "707068": "d9a666", - "504a4a": "ae7f41", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "279ec2": "279ec2", - "59c9d3": "59c9d3", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.json b/public/images/pokemon/variant/666-river_2.json deleted file mode 100644 index 0da0f00b0be..00000000000 --- a/public/images/pokemon/variant/666-river_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:39f778a45b20cfcfded5a350ee1a02e9:5d7e7e891b7da588a2ebd23733da6c2d:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.png b/public/images/pokemon/variant/666-river_2.png deleted file mode 100644 index a5a65f4933b4357e8979aaa8976410144bfddd4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1388 zcmV-y1(W)TP)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$i(@I4u4t5Z6$WX+0Yt2!bCV&JIqBE>hzEl0u6Z503ls?%w0>9U!!7Of>^>K-DZG zlT3*D!m1d2MF1lZFo~$dOg)ud%)xVf-NVP%yBN>%KKJJsREj18d?In2>4rtTK|H%@ z>74h8!>l4H#OK6OgDyz?$aUG}H_l~;1)do;a+!JJFtJ$fVY!D{#ZZZ7h$D)sQNECO zS>e3JS*Lgn-od_eJ{5CF%ATGfp*ijzmILZeFFHOfh(=+ueX4?Ptu!R zEph}5Z37qAT}|EtE_Z;DCtWfmNAlAYN+sa^jJ~M=4Br9+Yi@6yeVjf3IqGWp1~@nb zCd!n(?(y#a-roK_)9LRA+HP{t3&zYp0000sP)t-s0000G5D;flAV4QZ9dc@7SV3}2 zdVw4qyn#QQkwea_Vt;9oseHUAp2Atl)0K>h+3nQ->i{W^dhh(Pf?M8oJnnrTQ)dki7!HI1ELkVxP_D7Q8?EFDN9oSSGib}*I0ac3wD2UTLi z$ZJBxG!YW!IYXR`QVHfD#UNq|83LYL5t-)xvX~}rBNEgjJpOem055g<^4Q77zHxmA_Lw% zra_6EwDb)__i|~>*mAz58YG--Jf(3%h5^pE6N7;Bdm6WjQ0HmGp=&EPT*UQdT0v0x z`S~Hi=Uu}z8N+;|DKg{=89vts`J${4iVRaqllBv@E6#*ZPTm@W5cea9bAxu{^QY4} z84*>V^l01;F{<#lu5;VIBY|g5K;-y{L0S0U8GhUG3?)V+u+>|lVZ_PcSoq*M3=leC-%~AAX&NRG zztO7VM&bh<*m61{>QgZWjzeJE>8;O)Lc6NC4clqxWJbOf2O0dz-LjxjEkhF-T_V)T z5y_%KXd-SjMtogn#6udA$hE-Pe;Rs;SP?}k#`u*m$e0s?j6H-!%7+^+;h7M`)eJ!% uUt-r#Rce3X=o8G?YES=PN`5o;_4)@Re^Tv_$t-XH0000Px#Gf+%aMF0Q*5D*X%2QpO#96kj{Y6(vXM?hIwS!ifzswO;~BVWx*N*#b#++vl# zzrW;@q4@atNpK1d0000HbW%=J0RR90|NsC0|NsC0|NsC0{}2^Gp#T5@)k#D_R7i=H zlnIuDAP_{Yp%KMMxc_OV7f?ib<5Xf4{8ctfoTi(I>-c&-0r0ozIGw#U1i8-y*9Qf9y?py3%H@y#o`|!Ur2?#fKvh z+{?yN{0JY8fd3o63P7OR>pcp#d=S!KE_1z(!TDm}wmV-b%wk0au?Mt976VuH6@tS#h(cpSh@M-?cckodXKYw21 z690LHbMUOcOzY(z_{TV|{8heC=6G37;os3bt7_nCo?q<`2K)n7y`S^}{tM+*C9>Hs R4;}yj002ovPDHLkV1gmzAvOR2 diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 5c09931ecf2..6d2da0ed0ee 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -526,9 +526,9 @@ "664": [0, 1, 1], "665": [0, 1, 1], "666-archipelago": [0, 1, 1], - "666-continental": [0, 1, 2], + "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], @@ -538,14 +538,14 @@ "666-modern": [0, 1, 1], "666-monsoon": [0, 1, 1], "666-ocean": [0, 1, 1], - "666-poke-ball": [0, 1, 2], + "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], "666-tundra": [0, 1, 1], - "669-red": [0, 2, 1], + "669-red": [0, 1, 1], "669-blue": [0, 2, 2], "669-white": [0, 1, 1], "669-yellow": [0, 2, 1], @@ -1438,7 +1438,7 @@ "666-archipelago": [0, 1, 1], "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], @@ -1450,7 +1450,7 @@ "666-ocean": [0, 1, 1], "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], @@ -1864,19 +1864,19 @@ "666-archipelago": [0, 1, 1], "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], "666-jungle": [0, 1, 1], "666-marine": [0, 1, 1], - "666-meadow": [0, 2, 2], + "666-meadow": [0, 1, 1], "666-modern": [0, 1, 1], "666-monsoon": [0, 1, 1], "666-ocean": [0, 1, 1], - "666-poke-ball": [0, 1, 2], + "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], @@ -2193,26 +2193,26 @@ "658-ash": [0, 1, 1], "664": [0, 1, 1], "665": [0, 1, 1], - "666-archipelago": [0, 2, 2], - "666-continental": [0, 2, 2], - "666-elegant": [0, 2, 2], - "666-fancy": [0, 2, 2], - "666-garden": [0, 2, 2], - "666-high-plains": [0, 2, 2], - "666-icy-snow": [0, 2, 2], - "666-jungle": [0, 2, 2], - "666-marine": [0, 2, 2], - "666-meadow": [0, 2, 2], - "666-modern": [0, 2, 2], - "666-monsoon": [0, 2, 2], - "666-ocean": [0, 2, 2], - "666-poke-ball": [0, 2, 2], - "666-polar": [0, 2, 2], - "666-river": [0, 2, 2], - "666-sandstorm": [0, 2, 2], - "666-savanna": [0, 2, 2], - "666-sun": [0, 2, 2], - "666-tundra": [0, 2, 2], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], "669-red": [0, 2, 2], "669-blue": [0, 2, 2], "669-white": [0, 2, 2], @@ -2478,4 +2478,4 @@ } } } -} +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy.json b/public/images/pokemon/variant/back/666-fancy.json new file mode 100644 index 00000000000..5d368667ae3 --- /dev/null +++ b/public/images/pokemon/variant/back/666-fancy.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "6f9f42", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.json b/public/images/pokemon/variant/back/666-fancy_2.json deleted file mode 100644 index 49478186fd7..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.png b/public/images/pokemon/variant/back/666-fancy_2.png deleted file mode 100644 index a1e23edd659530f500129a98e3b7fe418278d5bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 zcmV-|1%3L7P)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrj{0|I9No)AwzYti;6gwDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR~rk=_!=HNNL?&0J6U5saW*ZnyLl%mN1pGX{Mx?vG-5YKK} zI_G`j2&+g6@j3CNK^G)`Lgn-op}ffw8U7zcv8K)Y$%-^aGyJ^}pCz?IhZ*IU5cC+W?u z7Ciz6w}Ff6t|spRmpj17lP(#OBl&3wr4sOdM&DEbhHioWHMeh_bDTZ^IqKE&4RCM> zOq3~m-Q(S%-oE`?)9K$2QA2W>Ezv&O0000jP)t-s0000G5D-8oMsiDf-atTKsy?>T zZRy}re`%4ae7w(o^OcN>!^6Yb?bPzrVh8GEB@PEB}19<&! z1Mh!CmLEmpM`Zm`Hhw{1)18s<9N8K4WeATE2$#fD1hD5tDj~%92ti}bMdlQVM~D#n zK=LyK;@%)6XGC)TiU9T6gn=zv`+^`5*Iq!GMCWo&=_{f{hN;+jE@&!TN{mb^4DMuP zCR`k|X++GP5vvjz4c^TJ2kT-SW)<41qVDOwm70tO|M`0&QgYP48NIqP8+27fM#E<^ zLSiGwArLcytcmBV)T@pjCl9MDGcg*CI1U^<>OAsAanNTx)Ih zIwM%2E!GyuL>!5)z7kUFFx=)&CteJD?uJy5NQ?wVE{s~U=d_P-Hi{601Tz){_*;Ky zQ=^4ZiV!K$r;9+K5ou!-YAucp0zHgiNpFlk9|3z_8Pr>Tt89%!jD!1jM2$v}ao~W} zkZCePkrs#=_$4hNML~!d4%=u1BTj*UhJpWdRc3>l7<@X^It3#4!NOo9s3A9Gd`bA9 z7o*l0`6I0pRVuPH+zf0*rl!uwU|8u9;vMdJWi?8v$kZ(|gnOdX9`AjP^Bk zpdm#JMuH$}OpFCG5OR+VA#8DJwPQ0{PYLAxeuEKBZ_6?p^k6TFAB`c+!H{GaIT<#B z5FrKu`*vce)VLrr%0mS|2}IzKW;7&h3>k^Wuqr~tk>~~~i@^%ixokL!(Xbg&Wy5%w z(_mpDCS=XWQ(t_T?g=`IdN$4Q(kKj>Qh!Itfo6to218kb=7J%0V*7dzx|gIm6y2do9!1 z4Q__`PP}acVk2G{;7&%bOEVBLBChK?8GMEf4+jyC4MF%28y*h$I5Vm@;@;rn+7I)J zZ)CKTvM4?UC2l7K%ZH~#6_D3DkVWzOFzksIh+LB@{AwsioV-xl({N)@A;*p+*>KU2 zkJuqxr=mMiv`1GI-ES!xA%eR}#R6#rm9*`ZViegzZ^CHELdZ=yI~chph8nprc-d~l zSdh6RlvZAMgw3n8^B-Cd3ERpxgc|NU(Ui?T1u8uI3wpoPUD-di3;Xr@2b*|KJv%vV Q;Q#;t07*qoM6N<$g7QdwS^xk5 diff --git a/public/images/pokemon/variant/back/666-fancy_3.json b/public/images/pokemon/variant/back/666-fancy_3.json deleted file mode 100644 index f060b4b02c6..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_3.png b/public/images/pokemon/variant/back/666-fancy_3.png deleted file mode 100644 index 6d15bc3f68089577a429d1cd5463ac36769651c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 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 diff --git a/public/images/pokemon/variant/exp/666-high-plains.json b/public/images/pokemon/variant/exp/666-high-plains.json index 330d1c39772..f63bb4f81f3 100644 --- a/public/images/pokemon/variant/exp/666-high-plains.json +++ b/public/images/pokemon/variant/exp/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-icy-snow.json b/public/images/pokemon/variant/exp/666-icy-snow.json index 9cae71418ce..d69d48d89e9 100644 --- a/public/images/pokemon/variant/exp/666-icy-snow.json +++ b/public/images/pokemon/variant/exp/666-icy-snow.json @@ -6,12 +6,13 @@ "303030": "402746", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "d9edd4", "675220": "958c8a", - "504a4a": "7f6991", + "ceab62": "d9edd4", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" }, "2": { @@ -21,12 +22,13 @@ "303030": "364051", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "8c91a4", "675220": "666b7d", - "504a4a": "666b7d", + "ceab62": "8c91a4", "707068": "8c91a4", + "504a4a": "666b7d", "c3c3c3": "fefeff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow.json b/public/images/pokemon/variant/exp/666-meadow.json new file mode 100644 index 00000000000..c766325427b --- /dev/null +++ b/public/images/pokemon/variant/exp/666-meadow.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "d9edd4", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "ffeaff", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "770921", + "675220": "a2275e", + "504a4a": "a2275e", + "595959": "9e3941", + "707068": "ce5283", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "ce5283", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "f4c2ec", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow_2.json b/public/images/pokemon/variant/exp/666-meadow_2.json deleted file mode 100644 index 4d4d4d16147..00000000000 --- a/public/images/pokemon/variant/exp/666-meadow_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} diff --git a/public/images/pokemon/variant/exp/666-meadow_2.png b/public/images/pokemon/variant/exp/666-meadow_2.png deleted file mode 100644 index 8aada72636fca9bf42e78bb53711192e1d33050b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 diff --git a/public/images/pokemon/variant/exp/666-monsoon.json b/public/images/pokemon/variant/exp/666-monsoon.json index edc2e86427e..915d471b2b1 100644 --- a/public/images/pokemon/variant/exp/666-monsoon.json +++ b/public/images/pokemon/variant/exp/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "ceab62": "d9edd4", - "675220": "958c8a", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "7f6991", - "707068": "a97cbc", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "ceab62": "5857bc", - "675220": "2c3593", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "2c3593", - "707068": "5857bc", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-ocean.json b/public/images/pokemon/variant/exp/666-ocean.json index 26a38bad7a8..c468bbcbf1e 100644 --- a/public/images/pokemon/variant/exp/666-ocean.json +++ b/public/images/pokemon/variant/exp/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f3a861": "f3a861", "fcf372": "fcf372", - "303030": "b56208", + "303030": "b54908", "ceab62": "ea8742", "675220": "bc601c", "504a4a": "bc601c", diff --git a/public/images/pokemon/variant/exp/666-poke-ball.json b/public/images/pokemon/variant/exp/666-poke-ball.json index 36cd38b95f0..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/exp/666-poke-ball.json +++ b/public/images/pokemon/variant/exp/666-poke-ball.json @@ -3,17 +3,36 @@ "101010": "101010", "595959": "724b7a", "b72c2c": "b72c2c", - "303030": "402746", "dc4b4b": "dc4b4b", - "ceab62": "d9edd4", + "303030": "402746", "675220": "958c8a", + "ceab62": "d9edd4", "e97e7e": "e97e7e", "971d1d": "971d1d", "f8f8f8": "f8f8f8", - "504a4a": "7f6991", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.json b/public/images/pokemon/variant/exp/666-poke-ball_3.json deleted file mode 100644 index 3d133124358..00000000000 --- a/public/images/pokemon/variant/exp/666-poke-ball_3.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b0791af9130022168ad784a59e299ce:b180b141bed2ea965d6f07d9e2cd7ecc:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.png b/public/images/pokemon/variant/exp/666-poke-ball_3.png deleted file mode 100644 index 767a55ab8490f2848362cf11e0130300c84582f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7549 zcmY*;2|UyPAO94&mLqK~XXG|Qjxx6`B4?5#Y~%`?E95@sSmY{|Tq}{Q(U@B{lH?Y` zER`HNb5H6&eSiPQ|MB1Bv3=fqzh3Y6>-BoSp3m3&{oYb6%nVO*@N)nFfRk5^;8p+t zll{?~?Kq>y^MM2_z`)|Ffx$Vy0F1krj~f6Wof(;_Wkk`1U}-NOrCJLvTXc#V z+^yx3{c2lo%gk9)HCP_sQxZM+LiDP?|LI$tTz{Z8LbsmXz3T^J?hxVeV3k6gk=bZ| zF(~#9mL49u7Vf;-c09o*?UlQ;poMDhdvQLOHiGO4XWk&oB`JtVj<3>uE#hVF9(VZKmJrda!99Pm=MvL_Wet(HxZzj2Wg?%vPkcfGU^NqgG z)Zth}C9bTwPN53{e>}bz|D^wvN3LdXx!=SIGZ{?1?Yet2dpD+6=-jUtCfM&rQTF<; zm|F^m)Il+`4oGC*io?8MDYtHVSY5<%LBV6++&(z%hK59AXn(2}x7Jt_(E-)!T_i6? zTI4ORStA%v9v&Wd0Du{A1pu%B0Gt2--?Mmn`2tEzuiY?1|2jduK_tc(0*QA&k^2 zh~zb7Z}18>Wt1Gti+Gq^^2OU`k^krR8c9QI^5sqFEGZK9b4-(Nj@t=?Ma}p+TAo&yAHg?0U6+&m`98vV$Xio*w>c+F#|T&f z?g#8;$e*zG--8!T(Vs%)vVu*xqrRf1g}J?Uk2gqJ%RlRouQsfQSai+u^<+7YkW2yI zEgzSxx>AM5R{RGJm%tZF&?(2MF1jE?b8(zaJ9N8z*U3DLI<5pOsGnEW` zETV~Hx*@2Qsq)!#HyQLfesg5%9w|vkZNuBPfpT#DHVZG5;l?`r&X9I$R*d(LmxnWJ zc>G85-!gE*8;1D~z8-w!lxsjAw_st>)VHcLYd1+oKV9sAWnULkUi6f2KMcR69-{m= zv=luy@L3g_VB~WNe7yWpsMteK8q#gh-8nx}sG-BA4w{u3dL#&D2vFx^u2(MPH+9&k zLTmm1r{Cw9_T`W(s_0xR$4k5?Q?O)pSBxxIfe~!-#zwXE?cMB7-|fwD!IPYsCn<#g zJbUi=S~xDhhqm7pM|57=*y; zFV`I9YZ;#9IqnQ-?!F^&=K4_6SNh~+S=aCKg`6PVWAKpJgJ8#^d|s2ovW4w1}@HsOla0UGvAaCRjFfQRFHELuae(dM9P5r8jRC{D^te z;7Zyow^osVI>c`D_sB|_f*;5Kz)QQomq;oa&3yXhg=o90rG zDNcEkj9D3-6ro8|%Q1^wiXfPhynT0kIkixSW*#0iQn zzP^uNa|(unfBMyS#iUrs5BngjjV_jK&yx-*Dm{%!4`oI6`{cJwdrAFs);K1UQjtH6fI%BPskZj%$u5>V%~cr~J; z#A2LT9Ym400I{^YT^HJXSI(IPs%fes^$iO(#yVEK=p<`C)1fk^umumA^263jKZ5e3 zGU_{V>7L^a_f4Qq<U4|2&1Y(v|e=B1+7pX=v(OoFacD*bI z_-B;(N0^Db`ai0+q*yz+U68o>X)+-4xoFN5y-$?dq`DK^seg~PjX^WBJfl9ee~4e$ zO~Qq@-f4AqD_7jWV$&6bBOAjE8{ec3O^x=%x3ZvNRl$fST~#y&g*>i_?_QiD-H2V= zl8mZ1U+K>0W@w9?wPpDbG=&C$#CtpYroHxTtXS2;R#hIR5n`>Ui}O zabokpm|96Y^Ul|PnLcO!0j@F?oCg+&s&)4`RDAHM6wy0y)@Jn&^RSP-kATgE7rQga zJn#XQs`AxKDYr4gvvCG|?*@QwJE-pV{f{b@?uN)E6iK=jwEYmiBovh}ld9mVw?SAt z`yI@7{I{ZkEd3r>-e#}*IO?$y$nhVG1O=WTmsEg)wq{WivWpkt=&~kC>=+?NQ~rU}qZ(9bC<3`H%xv z-*TRtw4K^?c1gJZFm5AqQva{4M~!#-3ev9Ob=fM8OyB4DC~VV3Y1e%MqJzU+cX_G^18P^C$)Q)TdQ6o` zKbbZ|+~v%K2)bChB^nAe42|j0>N)IeilX(4g+g^EA1ICnCYd`d{Als6Tu*3jIZju* z(Qp%?9F(kPxgv2OiVa)x%R%&TBq_j(Fw`$3R-;Z&N+M$N#%-bqvTVNZ^1EYL=d@tX zE%{SR0Scz?qSi!s`9UT8T&(+$0GAQ4cJlB6BD%^;sVTWl0Doe z^wbL10t{Zky1^1ty#zW=)Y zw>J11BDW4nARn5{tv~c6WeZsku|Q98bJHJ*531j)ks$o0ZUj&(v zJseDaGeJmIK+eYYaBDA288&~|oYf;X-hoZk;=Pd*S8s%JcdKfJ(q$p`4jDWNIFW*(P+t|3xb0LIA0B<#v+t=y-d3 zW!Fz2?mY+T;=NP4H2rt3R=N$%9R|c4A3cNtWNFf1;jET9aj>U4?^z1?BpsaI&~n?? zKUd0eC>>eWi)i4=NAl{?endiwX-c6@54<3Srh_5LHmp4Qey*6UAi2p*;N3SXxLg8k zGZS2_MR(<=4|}z8s5)=)L{(hB!?(4B@Q5EN>;7H~>$CS_)n`dHY>1N{qa_k}#OIf$7O#E8qb5>k`j}1EvJ%l#t(q=VS z;NkH-t8KHFn()200EjB*Q7jKV+d~C>LlEON0Ac80$a^&{;d>HVpH~?`M(M~oym=ej zhCo0SwGM3=Dhn);&BwAH!p&=`AjfX8O8ZEb@h2{&sFr&dEAeu688%hP-sb4Aly?l2 z6mse6g#T{*?F|0GpiQWdh=Vr8qPr|0;Dkwn{X3NnG2q>V#1FSMiM#%$mEv_C7N^7S zCrUqeOG)>3*~shbYRmn_j-z__#gTSphKeLl1@1!(@)3(alGDBMnT|2V{rI3wxS^`$ zd_X(1LB83ddkU8izJ#|ZU|$6r`P0t&y#1qvGRddeA0!}4w~f`EgN*nh6+AAE+U20r z7aAmI1nakbuo}2w$J8(5Ui^5g@hPw-@3qW%0`ryCvXGR?oQxR;F>t%^MllDfa@ z5I>xs3JvD}@>;-itup1(s0L~ChGK-;Wm$&D0qw_)N&D}E;1AWMsjuD#w(515@`CF6 zms)g~=8${Ly22b?7mw^cv}_W3;Sh7%#5hDYpmRy(vsI2NZ<76da2p3U2@t@;Sx{^y z)_5idtzLe}bep{d2D+S5__khJjW^NWl?8Ke?PxpoZl+x_y7e^PxLyQ)|b6+G%V0v>{xtDiG$(Lh%q-$?LV~wu{MumI!p_pq03F85)E_2rpAz z|4IZ1SO`Dx$2K*h6LQcz*>|j(0(p~zufq))qyLHmVO?aWtmDQZ{J!zSec(*XpVR%( zY!tH^KN%+DkZF_asI$Ie$G-Wdy69LieC5kShGxF|rH5@Ym$7PkQ|*K3J=GP}NfCLK zQr5p4H|qdKz6=MSE74sHevYwd3bcftm9PqB#F5g9+;KvE zTM#RRLFu5(OM=GX<_QeQO}6KMv>10Al%c8)afWF`!uGBMk z8>^8&+{Y_44i~sjXHeyK$Mc{-xSh_QCx4SonXgarBqB%suo|DphXuL}7S%>|%Cehw zrXUsDj11AME@gb5e`)?Vv2UylfcmBPDqss;-y-8YBtr!bp-dC>7Xb^{7&GRg-P$?F z==VqbDwCvhAef8tG#sCZ=1M@Nu}xxc=AIl$2$J@q%taTxQzC)eirR_t1I0m`gEL90 zmNzdwE$&D5zLBPC;m<#13$#41xGczNzPM8s5HINzEKM~d?(nSl?ZR2rHh%Qr&6>(Q z&Sm5sdj-4;?xEseXqEp4#Z0a;Po(ek#&yZley5z?r*fwKBfzPSb#s`ylp3fLS&v^4 zZA{8hDZe!UHdx&8#6&JA?Rlko78i}#TtL7&#yyD9}lL4Wsq>pJmIYl16={$^hmPSZYFSxGTI^t)TA;~)PEHiu5I;tNJa?t*ASlXGy3;wIA zSy2t@CTynSLE3Cg04?o`gc_e=*Fc=WC;b3v>NU#+R$+#f-+h?CdF4^clMH=ErWu7) zZo>!L^u?m75g-2)lIWk!`Z~s1yVrtSsl?&;_!T2f2GF)XjGSGHGhh^6E^il$f_{r! z!6P)-^2Pu9S3mns35~%mzV!g_T86j8EJ|B45LjFv#iNsYRH6eJC7QRo`|+eF&fpQ{ z>7`ufmTN#*_pxs>lGuEdlG1YUA%4OY3O_4v!Wf66`6%qHJT|voc3Lw7!g^g?CZw?W zVoj#N@Dg$gst^+VtgDkSZtluQ`4inuI1g{7)9SXNDb>q4tV}74keX2 zohX~Kx^H-*6#?sJVa6MUHQ zSwoizCA{{dC=qOar^RcB45QU@ed}m<*XN4M&3K{+^q+)mfw8qPTD^;J3OQCA351z_ zKj1BYLDPv>Xhr#-&zSaxZwuOBa@9Hne!7vg1)w8PmQiv)c}}K&enl6yaYKnd4Wx z3D=EQl_YenS&cQZLKigfDXqY5EKA~dE-McBwuJ@@#f*2ujuG4XjI zjnfTam8nTy(t_-mtJVBZLB1H8=%4ps!HRu`ZHVpBpVyrPS2!ajm*aLj3GL4&*ylP4 z7oicxe3Y5gV3&#F_ihL4u<|}PmkCxCrO!T6*vO;2{=biWw_>dY#eduKByv#wy$TDuif_SJLo0OsJM9m>G#V7W% z0aY_tLUDAUn?Q;3!CgB1k`iN~4{R=&G$#{|U)nE79^!ua-bPyasEeCSNQ%l(Tuz8u zhhKT@I-#0!$XI-)XM$-csqJ{FCTf%nHh-Agi4Uc)bQ=guEBixXlp}1IdxvP_o0KIV zAS|hb7LS@&8s*~@?rFu9_4Cx&(pw?HCk(Vmp&LreaJ+^HrQc;S1T}Gwai$c<-%*2bh;nuCB9G|<>b`pp<>Sb8;$lb_E_9?nK##aCz36CZ!pZh*bxk1u#U#xn4!5m#g*7qZJ-3a&R}cOcYT8A?7NWHA<^ft z)CfJu&mosYb6|M9bNE_U8l$0l=AbJwr|X0q!;S!Oo40bkDtz|}v7MPRgA*u(?7Z^= zy4G}XFj`>>$Nj$XQJnfpj;{79{@!Us1SYa6DFncEtxGgKE$y&2kLuR@^6-dZuO8=5}s^n~!uPBI} zyEx2|(?xQjaq3q_dxj0wYqCsgTi52YYymc*1<-U58a16!h?5K*fgeJ44khcAme1L# zV6|$=*`B)$jN5@?0;)x9mi~E<2pHXxGBO?VF+OOL(m`bTCx;YYoN<+ z@2a$0NA&B4BD+~eLGpz6dL-f)yqHr?0IhEGQ3{@MeCrd=18FNQyD6;7QXHhY8` zD=s4|KJ(NCh@vK9ldMv^IL=U+F(kn_)B}gUN1kv65>w^6Q(TDg;0({U`i3nq{BgnD$vEgv&Bkigb zgaX-r`W0j+SwI~V#1{W7q%hug877oBq~Ssw()MD;;1_TM!&0g>AG-i~D;t0(oSqNb zB*&x%x0MGXvi0}sWfM_}u&QGJZ|pPTjAI9`#N5lJ0H>Y3IMA-Bw2W(<;`tDf@Gjyi zi<7fYE&1eq2k*YWLSmV#JS~^SgiQ*^_MvC8-9tH&K6YXDGeOlln(nl(c3CAo9J^DA zqUFuIB1LEsO8Obb21k?}3-rHmE|7gCwqfJLEt1`=^B;{a^Ct-?LtIu=&Zgi*XP82r zk2({vUMmCSgqp?-InA*{f`v^)X!~~*<{pO={DuaO%Fj#08M#~6fZ-ITP({00(U(D` z`;%-bQj9~n(`OutRan!e;W1>#^ntKV!!yWEebU8Ow>H=kIywn!dDh%E5D2kM%jq#B xm|lK&TM7UCDcktZ_j88wd=%~6#?CpN7VyF`%ADgC<8L^?RfHM5S|1tre*o%1dqV&K diff --git a/public/images/pokemon/variant/exp/666-river.json b/public/images/pokemon/variant/exp/666-river.json index df10a73d783..c7e5e288d05 100644 --- a/public/images/pokemon/variant/exp/666-river.json +++ b/public/images/pokemon/variant/exp/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625843": "625843", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "504a4a": "ae7f41", - "707068": "d9a666", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "59c9d3": "59c9d3", - "279ec2": "279ec2", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.json b/public/images/pokemon/variant/exp/666-river_2.json deleted file mode 100644 index f840b39ccfd..00000000000 --- a/public/images/pokemon/variant/exp/666-river_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3ecaf6e3ae563f3da9598e7b18b87b05:e4ece90a3e9880c6499c363b000de8dd:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.png b/public/images/pokemon/variant/exp/666-river_2.png deleted file mode 100644 index 863acbbdc7640037628ce703337443d045a120c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7425 zcmZ8mXH-+c)(t8a2p}RM^rC=3K%z83IuQ`5(tAP&snVMW5+I>S5fl{ZL=XwmA@nX% zg7jWQ1B9Z|>vwtY{ra-j&7GNh=Ik@~?0weEx-mLhsx(wAR3H$DMqN!s4+NqxJ-@DA z1V$Va>{NhGq?59;j=Hikmxq_Tz0)&05a>=~NTRG-n*v*h)ej60;}sd4lr64q9D!*6 zq+fOw^4Kif;7YPaQk%T>Z3K7!ke2vm_-flrH}0 z&&KT120NFS;1ltSx(Xw(TZ{=Y6VpZGCm0ZVzKgAs*M2o-8+AEzX^lg!aTej9x>qZ& z`Y}n8d7dFA_lYEIk!JCorp9lAHXDjpom-ASQ?HlkL|8%L(IF@BB z%3LM2L1*_p@+(h9E{h(i2R4*MCWM{3&M(%L^aM38(~9orX`p|qg{CWIg9smqlFMN) z&9eOZ)=MfAeq7;Fwh*2JU5RQoPW(D1J3I4ZVyel(^yCC|w&^wZCC0f0$cu!|6MY15 zzkdC?gC3Ux|08xUXOywBmqy@AHa5ab`S*#+{l%ykPKlp_3H+I@COtpi#9}7ahtF2e z(&lV7ftfeF^|YRX&i?<;vIQ*%0A#pd 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 MM`)>hQL+yIKQ`G;&Hw-a diff --git a/public/images/pokemon/variant/exp/back/666-archipelago.json b/public/images/pokemon/variant/exp/back/666-archipelago.json new file mode 100644 index 00000000000..6386464b74e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-archipelago.json @@ -0,0 +1,35 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "d9edd4", + "d2bf96": "d2bf96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "642703", + "675220": "741300", + "504a4a": "741300", + "595959": "824719", + "707068": "a22414", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "a22414", + "d2bf96": "d2bf96", + "c3c3c3": "e7caa5" + + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.json b/public/images/pokemon/variant/exp/back/666-archipelago_2.json deleted file mode 100644 index 8c6fd7bcb91..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.png b/public/images/pokemon/variant/exp/back/666-archipelago_2.png deleted file mode 100644 index 86e17e33f11d109bb5b6c2a0a6e333c89dc3fa24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2271 zcmV<52q5=~P)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVf=Q`8Sa^3`jujbTTx1j3#DkPjn-Hil=WTM{6uHR7&Hf|Wf&x+Uz;EY^!ybet^K zb?t+|u7ZTcx?aTYM@W#YD@ykLHXrtVT{VjpgHK~aP`gILg^+dMZzaJIAZxz^IQKNE zjscoRW4a{Ku|nq=AF?s|B$X;FQ}UKc5-*(6UVR}yzipE&q#(~E{u5Eb&po&w%~?d**OmC1D3mriVI?3zAPpa;(w8 zkR;(};J1d*9cFiZC80s`s`9>$quoI#L59%A-S=IT1SRnqxhhjZ_I?OQTTBHRM?*3h z!Uf4YmuA!ZRFd>e_c4SVeI3Rpj^cZX@GRM)F9L7jUrbx*J#OH0$2}zOz1e4O6 zMTYD`a#fPzh;B7RNMh2;km?NKo%^9A&^YcP@f6`)+d^Vc1)=4~8yD#ZNh)R@1~0%a z2qk;2h);1qzlmaw5Wo6#*(->2^g~LhfbgWbBgD%~NFszCsh)k?H$p@%&kX=a#gnx_ z_5*|^xg-%{dFJ8)poUmJuo)7fe1Vv7ofV`l38aF=s~3Xl6~ve7a*%-Fb%dmn@avEY zQbFj28wh60SdPnCJEoM1V5B*h{Nby11c*z*+lq)}8v{i};xH3r3D?15Ylv`oeyk6I z$t5yEQkZEfvhdYdili=xG0Wl<5J~ZJR3Ydb(ps#5Sjo^rGR1mP5JNc>0tZNCNhJ{u zW)S4o@p=_Vh|P18qLv7Gy>dyG=1LSS$@~4zbD9`^1wn`@*_;{jC@mMZf*d5Jlme0& zDo8D{5h4p4XYm}8C@29jghd40I^-hBk#8uDv_!7wraWiihn|#--h#9cEQUd2Uae6Q;=~l^l#eB03N+>DFG#amIk0jR$W2MYWx=-p)a^LV&9cb2v{a?! zLV>@~n3~e>!1OxWhB#Y-su+M1Nqk$zg5VHLy>+`CB$1g^;BqQ9G2y>-Nn)}f{wL3*3d$_*C}7d zRmpDwIex8%yQY$u;y_52d?L4Ma%fR{J#x63aORA&C)74uALr!9%S&N#OSvcWbUwoEbgD<+UH<3_^}UJU8^7 zx=06qpO+zQ)j4pnirf@u-07-M@4)q2C4I4opY_wyiB>HHkI)zkIgXMpAnnHi`hRS~ml#8iB*{PCZ$74+e{i~ZrCTC?F?5s` z&OZoV0sAG@9}$O3dkGv*doJvMfBjdAHM7}C>6q5+q=!sub{ddOYIagfPR{nryEV;D z1CBY(PD;nLW+y#lQnQm@GOO81E1A~pq+(2Lc2Y4WHalq?Q=6Rz98;Q|h8z=`os^Dw z%}zSV#AYXzV`8(D4l=RXN#&T??4*TEYj)B@CN(>$9g~`!^pHu-PJ@u=o1MlWUS7{M zJE|F9yvy&def2Vo8*=Y=Nw0zy{Gz@7i-!?nxBsHY6 zeBJD%g3N4oQbT4nJLx2+kY}2mbdZV7PD;r|NtOqiopg|i%}z?mbxD>lo1F$E7m9D2 zom7&k%}z?n#AYY8Wm>b7&M~psN#~f??4)wcY7m|mYodzY(H#-eW9&dIUkj!az tQcI>aI}K7MG&_w@<}^D!c8xSU{R7=~g6Ng8CQtwX002ovPDHLkV1kqqKU)9* diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.json b/public/images/pokemon/variant/exp/back/666-archipelago_3.json deleted file mode 100644 index 3f9c86ecd75..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.png b/public/images/pokemon/variant/exp/back/666-archipelago_3.png deleted file mode 100644 index 7028f550d4554e8836c3779f9125e986aae54724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2261 zcmV;`2rBo9P)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D;_|0Awcvq9hc^H#~wz z8KP1?Fz4}8Ol1c0Jnz;a`9vg~Q z-RzuFGA{p^+{6TjQZg?8e5Z3)h(-eAx8tp!UcBDz?6^b$d40O|0>OW=c31*dQ9lUD zcdywth8?342zQP{K8z6B7@nD7Nr0%|qC?BfpL+-_1G12m1s3`wG6 zhru&GWMgtCl`1P!@|H;wFP{O^JnqS1Mo$uo##rCRfyX&3DP`-Pv`$VRA^Z%uN&?=q zV{ilW=5-j`#$l2ek8qqU@lnFhfcty*9CoNA?4Zf?P{(mW^2tb!JvtbYB>W8g)eySF zoOY}vG)P`m-q&%oJLn|H5Zbusd5V&tBt9coWh%%y4&i8rsUYKMNG3zLAbID~Y;z^WJAkdMN!qhLB^dBoNbMtc=4b9y*4^m6{~> zMv~Sw{&RrPG+I1ezdxxr1WNyA*Ybsm83YL zTMZGCn6xvbIzxEpekchvj_;6oig2!LAu*_e(DLJri}Z^m6*CWm7vK_ZX-B_M{diGZ&Txkz&48;T<>k^8wR&pG%@wR28IN ztx*!<#1!Y0k0oIWH02mCNV8fwuyPd0my(3bfouP1*m0ekZIf|nsY=O>0)L?~HD%m^ z>206h0{#U^ksQbP*VAH*A~KKb=zRH#OS^@{-yPl>TFCG^<;&PA`7I#VuhnqZ zR1#Ah2+5M4AT-l?Tpb8+UjZp=D?!pI2%?fehVWFs;eJRhL@e=l3$fD>PI!NT2#MTk zee1+K+JtA=e;@}r) zzpzB@;6*}`G&b6O=H`UX5~ds#c2#gUGw{HVQMA@Tl9xg2LGTVZE~);A zI9=LX;C$M1VgL8nf2CL}o1K)7Wz9}{$f9Pa3CW^nC$*$=w%^{ZX?B`$tZ8;qI+is% z=^=}no%E7b%}!d$vSue0V_~zCim|ZSN#j`B>@?w6((E+lSkUaGbgXN3(m@tBJEMlXM}^G&|`a3!9yklADrj4>UXJAPbwFl#=_BY(F+TO-ODOzcxFmBukr}l$3?d zPHM}tW+$CvVY8FYv98%kL{30c?dGy}0Knw_)~%h!Tt zCnaQEvy&dOsM$#^S=H>MhOp!LW~Uz{4>vnaN}g|anwC7?>@*=+)9j>{ENga}q%3H5 jnxU*|c6#iZX?FS_AGD?=F6P0P00000NkvXXu0mjfq~9!_ diff --git a/public/images/pokemon/variant/exp/back/666-continental.json b/public/images/pokemon/variant/exp/back/666-continental.json new file mode 100644 index 00000000000..92614fb346c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-continental.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "595959": "724b7a", + "555353": "724b7a", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "402746", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "958c8a", + "ceab62": "d9edd4", + "707068": "a97cbc", + "504a4a": "7f6991", + "aa5844": "aa5844", + "c3c3c3": "ffeaff", + "811c1c": "811c1c", + "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.json b/public/images/pokemon/variant/exp/back/666-continental_2.json deleted file mode 100644 index 371e157ff8a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.png b/public/images/pokemon/variant/exp/back/666-continental_2.png deleted file mode 100644 index 3b9a31469afdccad71e1ac0f6cd2269ab464d3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 zcmY*adpHwp8y_}vh>gaSrA-?Oi=v!jm~3ca6eTn>rd~3KQc`Bj*;?e3`FhEmN;!2< zv=3pLPU00gEs2szMLB(QUGG2Nb6wBx{@wR|-M{O)f6pIJnmfr^MQOVd002-S67ZhV zn7Vltj5qXXgL8G4y1^^7MUA}gR(2hfN2E4tI?uDpDPI7Kp z`2sZ}bN6Tp9O#CPvw@5mxEY<`>4yLfGLv>@c!S{~r*`;(>?Lv?LjvM!CzsU#&rmh7 zAkuF1!=;g@ax7Y26)jNJ-Mp8eKS{y1?Md-h!vm5Et{RwntcHL1VZ>TZ4Z>2-+*bUfZ)MR85may6#GcPvfVRrB{2ja-w`Eo^<-&8Sq`sla(7F^Bg;jymf z4^}d(FQ4TNEDRPs`>H>am92S5_RoXFj4#=G^D_C?&t6@}ZsYFyO;_sFl_VS<%LU7a zCytswc<{@XwDYP_OjEoZ0wEiO5&AD(IDhnf#0HPPv?M2*X7u`BE&nEc7GrleFDGe) zLZLYQ!wlDpZ`^FFeemPS2CtdNe?RqJmiS+xU#p6Ll9!p@-rhbm*WVBk86+KmM0=9R zfQ|n0)h`0B;aC7Q?8n@g4Dj!IG^7+He(v=Yu1ZnSuOZz9)oN}I4{ju&P zFz0R`ef9(3F*~71`FUe@DO>m-yV*&uT0C(>hk*?D%fiz zXngQk4d&k90OZA~>fWAFs`DM-2rmyRd>X$5Yu`^cj^z9?XTZ}fLkLZ*9q%%JTERjd zKJ@v5G&5Dn__;3^VsOO+p`p$)Gajh%_VfuGZ@yf29d~;W958?RqFkunblg~ucwxVd zR@mJIpXoR|Vc|2=o>7~Ku?#EvQ-YdV-rp>RJTV7ZQ!a09?Hif*$_}kiU;kq z0vfcC%|&}%-$QZJ=qPP*?e3=+P~FsY$y?FEskblt`F=s!a~;mA)$gqLiEwdHb-g6X zt5edgS_g8>#?hGq&gXOaw*DgrF^S_odywncuzYtej3R{c68@l<0)R1)#8RYG7FfR{sO6N+$4+t%SATwSTJSzCY@EeD6ba)y<(mYEsoH` z>818&gpd$fP)8`K{mP^A&awJH-t=#Ibr)Gr=tj5->-t-~rJlq?k!7Nvx>vCc(u!1M zjXq4I3gk;c1}f32x5d3R!y`MN)3jaJCyZkPneb7ZfrSX9xLEg%QJ}++7*7~^K-cbG zI~vCd4EI!5-H!s3_jM1cW9ar0hsI-$*;=#fOgbuq;ldfAz&b(?Z^e^=>IhjBQHf~O ziWUmCFh{IRPJ+6$eG0Z+!7YBxk5%;$-$UEk*`4-0Bz}bSRM+TVTPWg~K!H_<$b z8QNqPb>>E>4IX~%7uL}Rg!$^8SyWh9LB6wF0)8WO5xyJw9JDN_7t{{}qM};=_^DQG z%M+8sU36jK`vc{5gBIVNbmOo`UY;X7GFF5n*CO&jyY2mWv7z0L#L&u~fNBOzQ!$)_ zZL(a)DWAufE+>9Vc`Y{RQ>oBUX0A-@Z_hIMo_iLMBPi#G=k2yG=H*#Vq9L*{OF|uXi4)n}Ue)<7H@RH}t$|i~vgx+yTdaf6v zcDT7jQ$h7LNBqw{t)H3n6EQ|Q#|efv-g!%a6NM~0Rdvj8^Ic=rS5P;BS=t`pMAklb zcZm2YD#`24TPPxE_eW>@KKtk{5?aqHv~nh;wm24NQ!C3l8URY0u4XR_fK~Y~)F|12 zTWu}nmMc67Fzw9N9lNP>tP9SpTBlTQr7L{3Pv^hHQygQRlY|!bxRddtHo^Q}-kn>d zefzUGF)FugMG{IcYTv==qlX%k+FmL{n-5ql8>JqPlhCm>4`rjLX|RaR8;7`bb+;?xZmkwhF15owN_!A0yXE_shi zDk`x;4`M7wH`m0%q?1LMc4^H(+IVafBu#geZGtpCvB@qX9sjNQJG7pO4P$Q!i=AcF zmL9Z@A;fDlZ6ime3@3H&r@g$?K4OZL;T!^T7;c-J5L?g2&gRFDeEo6wyVQwND!zft qrn)td?WUyLl7vzpAP)v;{I*c~ZPu;i6OW}oB!K8d!ryfWWd09?13n7? diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.json b/public/images/pokemon/variant/exp/back/666-continental_3.json deleted file mode 100644 index ec9c98e6312..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.png b/public/images/pokemon/variant/exp/back/666-continental_3.png deleted file mode 100644 index b61b16538eb9b72d08055ad2242ee796fa24530c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2319 zcmV+q3GnubP)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D;xG4UbhGoLm{wOg^eu zMBs%e(Sld$n?(7&Rrv5;`0{^Zg1F9kmj0dsady_wwCS49`rp#6jxU$XzJroFUZ`c2qCc>rkBG;$p3X(8M$>*2_>n zp!`K~R7eogv{moH8zTahZ7< zV30Z<-rk2M7^ZVp$@C^r{4F7aYGV)ez3blB8*XNtnZs;J_E1!x(mONn}u5PR_9` z2Wg+@hLSPYg<@io<{T81L#W^jUFfY1k}xVj;`}|AL?DL`1)YXbW?={<1@VrOBvg|s zVoVjppSw%Q)M=PxOc5ee6C`DbrF~pk>mfmsLTnMTAF^0)Nfg1due~ zB#gn3=x~=lUfee&f#6swApS0Dmr#-vV#*Mne)=T$UoL^9Ab94~LNHbba+(wba|#f< zSihMoh&Yzxag79sip(GjEwutfZAt=hR%K%NoN0up^9Ckg5Pvm_5Swo%KqiRGi)T(8 zjSxc+PQ!n>q{ZK|V4mms1`o3 zp9LrlbPlEC%d6YmAI4@IOMZDv9hl&SHxLR=b3wxVtGgVgha7xMI7<{nziZ@E9wC^U zl!U`f$ib8ha<)WCS`fStt<{hthPuCCTF9cD5+t`61u>e@1kn_M1cyLKl0p)TFNtz6 zgCMsK%vQni1{P+00r4br7H z#~*0nt|SIO(A_Y49L2f8v|>SU|NKOw5k{Vp4d5}D^wh0#WD?H9`o@c59^-xp^AdS3 zFk$ooQcNRvDGO{LwhwYXqUcY0X69rELij)bQ*4}o&J zD|$wU!iWGNRe3M^fF3F*P(h^*IJKJGDE;G&^-cMl?J1Nh%>t%}zZM`33M} zep9nkD`Ql%Q!B#^YIbUL`1SF5vs0(z^Jb@R$JfnH{f=*&ojM`kH#_w?1~fZ$L8#y# zH#_w>Ml?HhL%wcy>VphucItC{-|W;2v0pbky?}h%?DPhrw)f3Woe-OEubZ9PAOoA7 z+989Qo!TMt_1M?VPJIyijls9gPW_Ox=@PT)a)44?9}QQ)$G&*8Pe?3>=@PT^b+!2vr{`{P_t7fWc|F^sYBx15cG-j zzS*e*GN#$74>F+HsY^1X*{KH-`g)XOdfV*uPV!~5Q@`ZnW~VojZ=0R^BqN%gIwWJ7 po%$(XH#>DwMl?HpxV1Jr{Ri9Hz|asMQ0f2x002ovPDHLkV1lKQO1J<3 diff --git a/public/images/pokemon/variant/exp/back/666-elegant.json b/public/images/pokemon/variant/exp/back/666-elegant.json new file mode 100644 index 00000000000..1b7b9838005 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-elegant.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "d9edd4", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "c3c3c3", + "e6ddf8": "e6ddf8" + }, + "2": { + "101010": "101010", + "303030": "351262", + "675220": "7d1083", + "504a4a": "7d1083", + "595959": "612776", + "707068": "a73fab", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "a73fab", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "f0ecff", + "e6ddf8": "e6ddf8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.json b/public/images/pokemon/variant/exp/back/666-elegant_2.json deleted file mode 100644 index 0894ba3672b..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.png b/public/images/pokemon/variant/exp/back/666-elegant_2.png deleted file mode 100644 index 315b2fe859dee64bf111449f9db7decccbab222a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 zcmV+z3Fr2SP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVZ*km0000GbW%=J0RR90|NsC0|NsC0 z|NsC0z)*`r000K}Nkl*92b_)b3x4Ul)+B%E%IPi#lf13~cejJ9y8e{jp9~5&=Yb0(6IrjanBsyZi zF?@mn#rAf`9H{rjiE(a7B8~%wuJJMYaFp6j!Wi|!MhoOPlEmwe0Czgv@4WBOK_w+SjtBj3_g)_aTO|SS#XPcHfs!BbKi{N*ug9Yt50qdhW>uBHuw*(sM3OPcROm=ZrjOZpIB97B+Rxe{7K z{QhVmxB_XJzA6bhd|Du*kevs}bCc76lhRcn7X&Zc`&rV3kYgW$@WYls9t~uBv=BaL z`NYLT8VOVdk-N>iha-aU@chGXa!sH#DG24X5WmX_lO!F8IB=M6pVAV<=hzCu1KL9e zqBbRgGOIE%T)lBfi3CYY1&KKg#QRo~OOlos&)m+}wLyrEl&CNKM@*st5yZvq1tgaQ zq#*h2AqZyI5MHhTIZ8utYayv5{63_DXi1dXTflDTvbyBP18a2_!oNLXsL%SyD-qgBb*QNCUw@hiOjbq?8vW5lV!3@9Niw92nl52>wSoNn`9ce?N5V|q)}4OfnTxO1@f#R&*y=~urR)y%B87EY2C6yXdyff z_=%7rx%`FjatkFFQ!q`UIzhOk&Jg)*yf>U6gX=U6vCjQgkT!^}fR)4*2OXLu6Obg~ zi7vzHK=|}kkg~cGBppl;gM@2c0w517COOyaT|>&+L`Mw?vk;k?0tsD+lBkmneqDmF zWCG$Ck_wX7$SVk5)T%29{QlzEn(HJpV};-`5-4eo7uy*kb3^ykr*`n~c^Sf1i$l(X zkOwAdF{``k(;c|JS<(-S_^h9nj#%xGbmuE+{BakM^Wy-0aW4?ev)u18qzo^oU5+R} zM2Dkt5JV&yV!N{P@{<*k(n7x=Wp3z4J>~eKKM;eg^5Dz`Ne~JxX(4PEBdR1vaqydT zzOcmVP*?3VG(P#Z_ME9D@}p}7Im9th5GhG0ksw(Y5G4u6`R`L8j2TC|Hk3#>Uaz&X zV4FKVgn5U2;ZuM6g?DQnGNrjICdQ0Io{81dI%mB*m82V6Ztl$b3%37DwbnH|nH{T|ohBe_nw@4OOPZY~B%N#f<=%#7ry0kJW+$^_ zRkPCsWKFZvgk(*#lU=f^*~!LO*X(3tENgbMITkiMO*s}cJ54(7Z+4n>+}-SCg)D1! zGCGzuJ6R#inw^Y}bk<1Y}LKlU34%+|lf0g)D1!GD|K>^8C2j$qHH4>|~Z)m*n|bv(t>^svsXV zI~gSlo1M&*Wz9|#mQ~G8M#r*dC#z#wvy;uSuGz^BS=8)gbS!Ij`V4Yovy&OJs@Z7{ z67FwyvP)7Mf|~cLYId5Y+~4dpMOo79bl+xgcKQ#nOvWxiId|It0000R diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.json b/public/images/pokemon/variant/exp/back/666-elegant_3.json deleted file mode 100644 index 20501609416..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.png b/public/images/pokemon/variant/exp/back/666-elegant_3.png deleted file mode 100644 index 490bbb5951c51d7a74d3c38ccbf598e723430312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2319 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 diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.json b/public/images/pokemon/variant/exp/back/666-fancy_3.json deleted file mode 100644 index c1c35bf083a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-fancy_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.png b/public/images/pokemon/variant/exp/back/666-fancy_3.png deleted file mode 100644 index 7a54e9bb6cdd3f379e61853919e5f44212f95c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 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 diff --git a/public/images/pokemon/variant/exp/back/666-garden.json b/public/images/pokemon/variant/exp/back/666-garden.json new file mode 100644 index 00000000000..16fec8bc537 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-garden.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "398351": "398351", + "ceab62": "d9edd4", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "044553", + "675220": "055160", + "504a4a": "055160", + "595959": "006b55", + "707068": "227687", + "de4040": "de4040", + "398351": "398351", + "ceab62": "227687", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "72d0a3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.json b/public/images/pokemon/variant/exp/back/666-garden_2.json deleted file mode 100644 index 1c3840b900c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.png b/public/images/pokemon/variant/exp/back/666-garden_2.png deleted file mode 100644 index c56ff652c7da12a1b9474ff717683963edc75dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2253 zcmV;;2r~DHP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV$S20 zEDf8>mK#PJFlEvySCdZwo7|1aJ zNfRSltnLB=XGlKUx#PIaj}Yl%b;H;MY5yl|*>Nj@*~*pdlzWi`&7pB(jG2R5Ofuy@P%howW(ibdz%~+gOkTiv@!A;M z$K~46Dyba%Zm}XL!7*Te|BM`y>osNXdzzazE;$TC8b^Q}2TO1a{9Z%uB|wlE+Qt9(o4B5FN+hIRL z>?VZlT#*hE&*%b@23(bd9TBoGL4f1pU-^szYTHH&S}dKW71OyJIdCU1bC$$DRmYS)5`+k zxuKIf8c5vE5Go1o2O4|inx;EI+HnKH?2?Ibl$COf;flma(>h4dP+yB?J<2*Os*Kw7DB^QeLfyT5Hfg{aL8wjSInd(>=NWzE5 zEfyr6g0)>eCmoF>W~KsDSW^(BK=pN#HaY?8A=lCxQyhX<_aQsyrWBkSYeo(#O9dcD zn9?8cR1Je)cM=8`rOE}MEZ@APp=0Ay+G&AAKn?MJkHwHNUQi`lZ-Ao)LEz31TvPB9 zAVm@%%%l!il0y!kSBN^-!<-?xnBl9ThfJ?i+)RPQ%y$Jb{jrdrpesgkLd>168ygmQu7K0*4&0eqBXNPfF2oS6jS?^KR+W(cW% z;OvbfLHHcZN`SB?=lD#-^XS!Zc zB6d{wZ8|rf!-h#L$?ww|2)#60Dab2dHzgDHkGG>Dah)R#b?Xi+Nl2x?F>SC^i-ais z9nXE^$R#PEcXt6`%IStjj5SBDHvf5l@gZgW;B>KPUQ))wL}_9CAb16wm(+t{xwMzS z^|a^0{`cFzQY_78C!s^F*+~vjYIa(XC^b8YC4+nW<+Ai9@y7X~Ch=?6l<2Xm(n2Jm2gjgH%88o^Ey$IW(J{ zM3CC?bhDGhq1o&thbT2WEkmAec3O5k-0buP?Cq%HakfnYRyg}hhnqSH;_l0orDm*W~UX1(`a^*O7Ia{quEIa(Q9^+LzJ4G z#1gG$CozOyE>@1$1IT9ha>JFQ9{Z+2RcC^b7tC2Gx1ixh=srxl7$v(sbS bO0&~ng*~Rk+8IyF00000NkvXXu0mjfV~!mj diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.json b/public/images/pokemon/variant/exp/back/666-garden_3.json deleted file mode 100644 index 5fbdd2097fd..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.png b/public/images/pokemon/variant/exp/back/666-garden_3.png deleted file mode 100644 index 60c7f5b7d01a8c41f7b8af94779734a2de818da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2243 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 diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.json b/public/images/pokemon/variant/exp/back/666-high-plains_3.json deleted file mode 100644 index 4c91b8fb5a0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-high-plains_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-high-plains_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:410c759185f779797422e8f2ce55db4f:6afd0d04b6138fdd57d12681e967b48c:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.png b/public/images/pokemon/variant/exp/back/666-high-plains_3.png deleted file mode 100644 index d6c577be131a25ce9b37bf073fe558666b034366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 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 %jCE!w6~{uelbU0d z*-6W>%Iu`)SY&pZ0a;>pn&F5)`S};kPESByH9I}wc+>3k5ad0x(@P-F%}x(F-ZMKr z26@ZuGzH=on4M-omYAI;K-QR@6d-HOPD+q`cs#bi>@)$w&w^h!J57R|S)Q7m z=0RGPhh`@wiEGPiW+x@cIpnjl$ZcG83NIDVd+ot~0ZKTzbA zyEq^nl0L}tfSgF`-kzDAW=NKpo%AHD%ucf?@0*>bP?ngT-YXMkr~d%DBfZl(Au!qi O000069EP}CUeW%E`8>2|lz8A(^9U&2|G0&Qn5 zkr29~XtR;u`9J5c6X(R#{mk)KrNJYyac7h5dBl9K$y@~+u5h+7o3R5X7C+tazQR+@ zA^P9OqsHEI#(Srid0#(?)95vqXL%?$Dn1|x8-wDq?x9reY`jIQR;1mwS5`NbJE|D{ zds@5n*ltk1xo&4@tL!&;9`n!8kL)&KhYT3&7Aqu9+5Bf$7;{GRBajHrlTfXkBe8hj zIL&+1B|9^5EUAD!r| z8Q13c+252tygHKIv?xE9nkIVr#BS~VgIAnm#>NmY|*c*ALPzyK={Lg3iMo zc>kM5ZS9tx_1Sw$Vb#%`($Xh9fgZwkWQ0vb&_SNx_BLnV4`MIjUh(qbx2WK(u9zG~ zAt526HOfHV)FIS?Xn8yPhMs4NXG^;GT|a7BG$XPxF}f`|Jte8NwUxQ_Wsdr``$!Xt zx3&Wv{QqjgC1XG!o*b;P;g!hTzOSk8M&$&!|5mK@EZw@jd=SV(+o@7DzrUm~`gvL1 zfWRNj*kEs-*SP0)*DNkf1FyW{EXIPH_9UEK8rUtvdK5I3)U)3(N6nc5duUq6^#zl_ zoa_^$H;DStY4Hdb$lJWkZdZ|n?}OvJE-33tLc~j{(b=1ipD75`EkEuos4ZEv)16*? zR8U=pJ%h@@LNE4^wiJQ`YrFk+Y-J#Fd~a*W#bz8MGk5loT4wisLwJLM6X?+kTIE*U)G>Ny?$_)-!Z7>Ob)UGpjWf}H$456Rq@ z!-f-oZiP;<#Lf52keWRrc@(?}gtc=IKKZ_FEooXceb zKGJSfy8ON}wG?*d@r93?P`x$@6C?+*=C{fW+G1|ZIWpY|_ORY&`C=G(OeeCx=kz0d zY?loHOcP+dfL1-t3HAq#*BYqvZE?lgjwM%!c>!2hvDn}&2I;EEa;GZw65mY>8#86W ztLtpdw|7SO#3GdO^y^J*L)solY?q6OqE7J{6p5?c$T;uRw^Z4?P|Whfl(PE z``#wA_hPZImHunYeWzzpa$0H8sFf^@zdmhiU@OEw00~pdA(+o7N$BDNF%&RH7|>x^ zIJy8!I@z3;hRskpX(G!xYm&+Z#(Cgv_3~}9(q#(HTaHO5mwHWoT93pib5+SS z=7}Ifvk^{_MbUa{#)LVG!L_Tvo!~!IkmXZPFf^ns4r#3aw#qa%jO-+|zf+IpP)0Ud zbQ_7S6sVRtyuXPT1%}?gzC^Ziah0N7S6+=%Nma!LlL7->{_?*}GtThQ8vJeatU%-p z>uNH-+F)sui%j$Q@Zd&J-+{QMLRbF1?b@Cn6)A~m`2JMATKZigf+IFxWQJ=5zFkOZ z*l`9U_@_-)@;|J0f~R+f)$5{4*Q81oZ|;FVC3R?h0k8>mL4@rh9c}&&g}KI+tuS6U zY%Yit=J1ny?RMh?`_6?myv5euQm<{!+cB$x4&6Ax7FuqL4(I+Q>>ro9*_+Re#%32! z;E>jV>;=gtqn3U}V%V}>r=@i)rPyK7@%gi};`6iY9DvNqKQ+R&O1lwucbH;8=^9^Z zh0edy)8y&~HsEy^61;R|66CgMItdOD+qL1l8(@9!%QXmcPFjNzR!INF!Im7oSgsjP z?VIV?k$1{)YRK=%t$f<=wbR`HL-SKod6Z)%ySB7F1nPLkt!=kv-trs!-EyzQ$oC&S zGZhiazg^8uYO~9w>r+UXXTJr~yVfEh%S>DD{rNPT=?1l82WSRkd@vwd(|yk(*)tty zE94im1qy*4Y<#Sx$?)NSm-HfqS0ER*(=C1PJ#5qRdeN1#0kQOb49DalQB!wV;`Qb}(GVe?=6nW;t?t z@JjspkW`IW%k&*v6-Lw=vXd(Zh*HJVzf=1+Da0QI6_Ae(fU~cbJjsl*y>%!I@rj&Kmx#M-#R=z8q`0O!%Ik^lez diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.json b/public/images/pokemon/variant/exp/back/666-jungle_3.json deleted file mode 100644 index 8bbc5571373..00000000000 --- a/public/images/pokemon/variant/exp/back/666-jungle_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-jungle_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.png b/public/images/pokemon/variant/exp/back/666-jungle_3.png deleted file mode 100644 index 0f4ca358601c825eb5ebc69d8e74c83c89c6f95e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2483 zcmYjSc|6oxA0F94n8rwIQp0aDGDz2Uk(e2ppOIxOqcCF`TgoyKQO30-%eZ5ZX(G!I za#55eUb19Ku84Zwh>$||#HGeN{PmvC=bZ0(&i6Ub=X;*-A1BGy`n1HUuIR?~lXTf;ilXV0w^`{}pct1f6~>{Vbu~^ziNRhj)`55Z`P& zkhrjFnNyR_kDNuMiYwkcit8z6yeUG0At7*ADH%S->6mLySXi*UNb7N^uehqYg4#-B z(HrGXqqL}qr6}rRvv9lhr+B3UfEgdC|j3+hJ01vb6AWrq;BZlR;33Q-Jil233YfX=w$m!8!mAVvq?s_-?=a z~^n$hcL`KI-Ne?QcT+$*7O5*70z zefgMAF7EDq3oc&}C9j`k z`wU}Sy$s+==Gr&=iP6A}x63?3xD_n;svP*|zRKQTTOi%oa!7{iikE+hBalWHXR&FQ z>?RC`!V~My$CG44nus^YJ$d!KI0{Mal^JX-J+;dxd^`vUx5TWw?WfAJ}TvSgkw!CrM#pu>n?C~1J2Uf?0^V9<1PTnvhO3sp$;m+!wp?m$5 z!w@m!HeS{j2Yt`{oSa{mdg|HxG3y(D!9OIYBdbf{Npr;(yT2K;9ohLT#O5pgz0rG= zrnUK`n)R#W-A%o+LHd@o8^)p=-_XL0ur5_P^)N|Yf@l)xuh)G4adg4UCzhq?J5Nob zVhoZPkzZVT(nQLvrK^pN$n5p)Hk6JjeiBjbNVAAcKs^OnNE=vYNJ~hnTU$TTqnwbD z=s>-f8?J7W6%QQ#`@z>+^5azS<5Db4sXMkK2zC=Kan|g1jkujn=v%!8l8Ho{7CY|x z{9CciF&ZXwI}V{EBUh;S-wZ1=L0B(MKU;OwXw<3>v_%jHz$HB zKAT2CDMne9Ekgf3^#8UKyzRT($r_;k^<0CdgIK#vJaTKPEcpqCTvBebcc5qA?WZ#{ zyx4dVYZ0eia59 zLc2;2&ma8j=ov0_Ei&*fYapIOZUMNvF&kUBU$O7b4P7phrh}X*W{2V|e)FU-efCb( zPz$VqOis4hD&h?H;2H^AFV8mq=Qov^;=50=7WST$Ev^oBmwyQ~qUos2c&8gDruuX= zabaQIeipCGRqSr>LPMDM9@H9$--SBt=v_!uolV%wW;!bDs?RBy%kNe=2tG&h6t$~- z?Dw<`VOP8Tu&;?V#>uRKR8F=9yMGJ1%bUaWJFdcach&Nrf8TxWoZVo)b+@1K%y7Y1 zoJG5KRrJLnByWI27Wb4=WWH?T_8mHNB<+T-rKhB#beEt?+#cEQA!{J`b-C6+LTaZM zqrMUlYwh6{GE|n3>@cno1OsC+O^-Bux0u{p@s3cHeNWKQObtqvQB` bevmJG-(~8)SOc0S_`e~bxi!8L>mK_*_TQC7 diff --git a/public/images/pokemon/variant/exp/back/666-marine.json b/public/images/pokemon/variant/exp/back/666-marine.json new file mode 100644 index 00000000000..0bae2c2067e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-marine.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "c3c3c3", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "16244f", + "675220": "264c85", + "504a4a": "264c85", + "595959": "2a5894", + "707068": "3070af", + "ceab62": "3070af", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "3070af", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.json b/public/images/pokemon/variant/exp/back/666-marine_2.json deleted file mode 100644 index 7f85f0176f9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.png b/public/images/pokemon/variant/exp/back/666-marine_2.png deleted file mode 100644 index ffa21823012ed2fc4fb30349ba92134edc84922b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmV+o3G()dP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVDG;~%>-9rN~sAhsvb>$P$K zEDf8A7M-lMP%AlJFS#8$q0%D@o;Wu8qqO4Go0PttD|xy(_ar z3ZYzR;?jgTr7g&5anhLl>!3PkYHgsYND~*cTwI$|LC)Lc)k>f`W2z(sDTC@bh(E-b zK|#inw6C2M(i8+Ea~!xa#8rpBhiJD1(LE$C@i&M+OTgC!TY>l@@h;~C$Y^DpJLq@$ z0VIsphX7LVRZR7&Kzv@}8qzoplK5Hz?7-2-A%x^u%uI1WQC}fJ;>VESScYg{Ac~^C zLugQxLg%EqPf^y`4<6myi~6HPe6|8yhqN%9XL zox|}AzCtiNhw2!}TcqR^2tQsF%aJ4%MEkNZnug6mFgeXmdxdE#7ete^h18bgBx!dl zZb2h}L<(j4G%JeI)(jybU&k>AZ%!8>E*9iqh7=NV4+gMNVQvIs&@JlcO1Qt3Nk1O9Sq^O9neVrQAwS0 zRGTD*TJ1iHcYa=(Z0<@@AVdLrpXHwj3NnCLt>Ucmgi7_UO2U8C^sz$im@i1RNjM|? z7j*hly)s48Lei<4Z+iM%kV(h6Bp3*smLOFOz(AsP{4`4gPC?^lU2xELtuv{>AuJc9 zJsTiN;&Xw{V=Y0rIK?sl0XRm-TuPy(vG|!uyD)WG(#cg_!jgW#CKkSq4%s&d(B#IC zrYuGEL13!ASW0PINLXephKTWcnJQRY1vzRE1g3}Z?F~L3utkEG5}^YM1S9jjLR4Q5 z)kEU%4!4FgWOkqC>?ZhKLDb;nlSCKC8wzU?lCDS;nC3Nr@Y}b7=v;vW$+Pgot$uT; z4B@4I=RM-PDV-r@Z=$1xm}LkjybGkSZM?STyGwEWsRXfV9YPXaZ8-|Nf#5~0Vj$#C zrO%|T&MPB^U~Wu|ahg`93*xn*d#bG+{CQr6uvO;ZH$u)$aoU*f`d&(6>N^yD+8)*h z62wNV7=r(FiLsF5?jYyK0e+Os5R4Pu?+PT(FUJ`*gp`Nq>f#e0C9y6oM0#Z{_jbr} z3>jSFvm?KW(+7A7Lfb=LkbJeoj2wr1emtc{;%)nN4DbV*xg33epuBSa0_J4o;uM}%% zvy;%Vt=UNq+0^W`AlcOHB$n9uUJOyQ(}H79vy;%Vt=UNq+0^W`Aen?no1MfGa%^aJ z5-~P5JBb(@o1G+%oy|@wjxEhjOO6fAPK%D`o1GRQ@q5%t@?DUc*GaA*l4hqzAWt+qi5;7oo#c?l@m#ah&yc5@oqmTr)a>*d?DWqQB&Fmrxl3V(d;CZq&9^5jq^ye zlN7S8*=Yf?r`bs^+12bMhUCZQ%JF)j+35$#!_7{MlINS9mL-ojJ1t1|G&_kU+nSvg nDI1!dRw#R#ogO<@nw|aw9fGoUthRin00000NkvXXu0mjf$DCB0 diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.json b/public/images/pokemon/variant/exp/back/666-marine_3.json deleted file mode 100644 index f61b5ed14a9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.png b/public/images/pokemon/variant/exp/back/666-marine_3.png deleted file mode 100644 index ee4c51543ee2f650384df7399008c35adc84dea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 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 TTi8ko00000NkvXXu0mjf*y>fx diff --git a/public/images/pokemon/variant/exp/back/666-modern.json b/public/images/pokemon/variant/exp/back/666-modern.json new file mode 100644 index 00000000000..5572a58bfa9 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-modern.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "d9edd4", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "c3c3c3", + "cfc5d9": "cfc5d9" + }, + "2":{ + "101010": "101010", + "303030": "4e0000", + "675220": "801521", + "504a4a": "801521", + "595959": "830012", + "707068": "ad2640", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "ad2640", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "ffeae8", + "cfc5d9": "cfc5d9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.json b/public/images/pokemon/variant/exp/back/666-modern_2.json deleted file mode 100644 index 4b0ef1a8a59..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.png b/public/images/pokemon/variant/exp/back/666-modern_2.png deleted file mode 100644 index 4cd5d77088115c9749cd9e3d1f65573daf461c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmV;u2txOXP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV!X^G!F7B-}< zUay%0U~1S{hK>B?-*OJym$Td%D4(rI1KK4lJFS#s~}r~ ze3t}=i!I~aoLo$VM2FeYLrCJsfY z&LbhDg&>}0fY8xcu!Llejfagv){KGyf-&f9Agv`y%7QG5eXRhJQ?`6o6x4;(7R(@6 zFoY1B8xpgExF82{lCzZLmQa$+;Tc1Y*Nf6)YP>cfigT9b_3D+RC?%ET{eH)58W-!(hSilIi9wE0NGU-N$uF?KihansA_fUN5VMnG4jW%&yT~`#e=+9x zl&fo##vy#%$eb}+5Vu;3Y~1hz$&ny;CGiv}Mv4kjEfSX4ILv}V%56!Q0#!N23(|qC zSUMu)OG(^FtiLtvs22$xd0bekx#U7YZ@4TaW!%x01Z`Yrg|GxV68q+KP(f%4h-E!T z9r?|5rASxc5LOg~DUdz-+z}>#EBIPszV*j{0Z!3A*QM~KL4I6yasUcIaM(-wfi+Zv z&Y#`kUy73D0)(t=p=K{WkKKZC3BD?%?;wbIuPEz z86>T(012~j5RqhwkYx>!P?0*QhGa|pT|>@k2&cZkKr%_b)&7z@VZq-Y?bcW)e`UlF%JqppZlO7~L40l8Gj+`!{QJBJVXMr+8zJU~IR0j5*RZ5~ zLb+co(r5j!bi7pxpa_~vFUsxh`_n24BQ;q_1c*jgZ!oEqFaNORGlH{x$Zs|ZUmW2!6^Ht) z>(@t0bHfXaDMygRFTZa-ru08JU7Q(~OF6||7KJB@%|NG;A zrC6HHPC|!Tvy&X6)a*1NQEGM)OSGDuCLB7=PC|!Tvy&X6)a)deXf-=YC2Gx1B8FnK zlZc_%>?Cn$HapEYRGOWp916`&laA+`on#QjW+#zDvDrxmQEYY+IW(J{CLzx^JIzBL zZg!e>JlyOw4|%xRX%3>$>?DS0H9Jj0isO-Hr*VjKvy%*>*z6>OoO;bpatQyO=J95y zIY?{yx!GwNQd@p)c9Kb&R*46jokS4LW+yR3tJz5=xoBf~qS;9XQEYY+O0GM5er|S> zK@^*vgp%u$tUoq8O-L>jzcxFGB$~}mQi@))liZ@#>?Ct2Hap22dd*HEhhnpn7^2ne zBy%V>JN*KAwAo1r(Q9^^ft(u6PEtu|L&!JIBh5}yh+4DL1VpFVNiNZ9b`nFhnw@@- zJlyOwDS5uxXw diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.json b/public/images/pokemon/variant/exp/back/666-modern_3.json deleted file mode 100644 index 78c496fc208..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.png b/public/images/pokemon/variant/exp/back/666-modern_3.png deleted file mode 100644 index 5795174404f0956ffd52b0bfb4d281670a68228e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 zcmV;j2u=5iP)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D-oP0D}M$fE6LQJUp!? zK=e;f`0!jiY`Z{Llh4K3|LW+;u_reG000eiQchC<|NsC0|NsC0|NsC0Ed)WW000J^ zNkl~2TB7nT^fF=^`>WQT|F7{Ee81#tm`8<^{X6kEl) zq-?on4r2%G+ZH4|2Jr8lJ2vkaTd%x#{q)MX3Q{->?t7B(82GCoTY`L-1c!?)YBxk{sJ^7N0N#O8*?tRODP zL7e0)CAlS(By)JikmL2D^q3m2O^D*0WqG}NB`HctC3(N!@tOw41SAy2=5bmmYyoK` z>w;l*B}ihBV-!+K&_nVI?5|=UvaX0h!Vbjjm;+N5y^A2%{* zj26VL)*>4>{6KOf$X!W11&WcPf>euyB{mMTppbG~5~e^^j`4zYAS;%R2>DVHHxlb_ z4Lj;ZLPs7KmTE4!P|zDLOGz1bv?W0s*I6MffsVw!IUQ6GngU{3&rwHyb6qLY6*zojH;!S4*xE)d!^g=9$%f<(z2shcL%9I4!ED&6NKVK&$|SP^NVrk(w|ZM5S`t8{6|TuO9_$QS<|x}VjM%d zFZPbOiNhzj0CCGhUXXaVq>LD6!>|h}B}a1bNw;5EB6j$FL#bhIs}JiYMF~@m0&;lA zOhLlFNttlm-j0&wtQ>CWIqe9ylH&+pbJ}H6TCmO22+m&|;WibA`mF2MM@nBJ@vjt1v)M`LP-}LQ zLzJ4GCL~JDPGX5xv(tn_r`bv9P-}LQLzJ4G@){yEk8FqO+#wS zugy*}Nz*FvV6&45qS@>uhG;cA$s`wTEKf8$$smf&PD06bXV1^gPBMsMvy)JAU6S?3 zW~T|sh2qy{Cy_+6*-1*#Yj%=b)S8`S4#j3CnM1GHN#sy$b`nFhnw?}0#b&2pAdfaX z2_bsTPBV~GquEI+32g}Z#(AXKNeWSGcA9|bG&{*9TFp*kh*q=H50ZzQohBvEH#<#B z9&dJR07*qoM6N<$g4~Hq)$ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon.json b/public/images/pokemon/variant/exp/back/666-monsoon.json new file mode 100644 index 00000000000..915d471b2b1 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-monsoon.json @@ -0,0 +1,33 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "807676": "807676", + "ceab62": "d9edd4", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.json b/public/images/pokemon/variant/exp/back/666-monsoon_2.json deleted file mode 100644 index 344344ec0b2..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.png b/public/images/pokemon/variant/exp/back/666-monsoon_2.png deleted file mode 100644 index 8f091f4d1de0f6760297766e7c75d98a3ed166e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2462 zcmY*ac{mhW8=qn<6W5qrTb98LGht*)S{X~TxH3c8iZF4f#3c+@Wf|K{XpAxA63UWN zmL%29zVGEC%S2sd*Pt}Q<(qN8=X;*-JkL4jdEejfyvy(Xz?i8jGMG>sBpX4xU#qA!CRaRe-~>RP{UO#TEQ6sa^zHu86dZHe&m2aNC~5 zUuCBngU(EhM}DXkiSx~P?0fkq2h(nh&ZIZ0{&0eatTlj|8I3S>Jm)L_d_~2Rzp}cH zYI|Pu_8;?2R%|CA4|B3Tq*-$Unmbw*(zn$jdx0%Cd1Eq&io$GngpPhT>w_l(bCnD$ z=OZR1p1CY|zrN!->Od=|70^ovb&MOXf7i6SmcDo0%H59tJGPqn_wim?SVbI+2-YY_ z1(j5Q3(jk`T4#NqQrq!r&(q}Cm4Ot^)yafxDv!M8C0k z;>G>gUOj$%-}c*vjQ6X_p=-9ftx(4Haj}8lqBBxyln|OS)#=hr$MlwA!Gn4u4TXS>s=1e3!QqY-03dz~Yi;Qiey?}zPS_MeO6(KnMfUpfftp<|3X_y=h>00> z?6dQ`2l$~^G4ODADowdziefTyRI8}a;Dn60A@T65RBKbPOkPoq323B`G5o+iZdyNzKm`Ilih`QRXj0`5mUj zkP$v?bl{-5nh(#5PzJ}Ahv?84(8t=*CZgW_OS(wtOB>|yLk3C9FeM2-n#g=V`9T2~ zjB(4sF@G+aD`6!gp1sFvn#R;TxcjJ-rFr>U@h>rzg!!&Xyl1g?X#FAnpD&B4k&_ zYVPK|uC?Tb)wdDKQZ9bZWZTCHyW5`9fFWRS9&oH@#vzJz4Ndv6#feE7Z@wPfx%epG zKuP{;2lJA_k6`^lZR*l&b)HVsnGc^r#Ai{rw%M|pd9)~W!kV!Y`pc3!5tm!`dRL8n zl;4%Tm5tqgfCiMG96V!|B-bB`|zQwvq3fCms$RGZ_thdI3M@P76=G1*U754l`^Cy*0rZPa zs`X@vP#G>s6w9(DG*#Jao}Yc(%_O;B5X*5_S&J!jm8-VU!#siAj;LT9YgU&E`%>z1 z?<}P_Zc)5CiTC2j#dnGZ@%oFjoR4VM z(=MKtiCJNuoS090+r)$DPQMBTD#CFs z6mZSb@mlaYdu7l!$eBPT6|;fML0ZaeT6`j|a7m&FClfJmDs56m(`f zmzV34Ob&fj#*NjM*WbuZjabh@3LOg+v-o6fACK`bZF}?quDnr}0EH$n`fv6u*8PFD z{c2dA%7qwZ-HnjOL&l(_D(FlR1A(?Z;O&v)E2*TP6d?`kV)WB9or{(Byjs|!fjXor z&6z8V5VWnXkS3v2niP=&D`E6AGdVaTkkCZJslrzrbp9S13SSVK!xs5cLiE2ehaK|& zCBx`@WSr3+8k&7vn81`Zx0ew_(-xXT9}#1Fg?Q%wv{x7V>>(pJu%K&}M!}Cv&eaGx zjRK%yxg}vxXgk*<1YL&oTqE@-CO`D?(4uRQOq9MVoA`A6ikcbHr|n6$VB+5K>+zYP z3`Ml9KwkUj@j|Y$Aft);*9H7Hje>b$4+oTfX|MUSSD=$XJ-9%7|DJ2Gf8*Brf`s5E z^VpP+if~q;+5c*PR1n!{W+<@wf0KHh$w`37oaJ6e&6pOtpluxu%VmpPmRGHf4Gprd mo$R;nS&X`xmFYabBVus~yz}Z*iG|>k24HRMt;^7tWB&tl0-_55 diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.json b/public/images/pokemon/variant/exp/back/666-monsoon_3.json deleted file mode 100644 index 4f7304f6c0c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.png b/public/images/pokemon/variant/exp/back/666-monsoon_3.png deleted file mode 100644 index f216010ca9987d164d73f3b6b97a9bfc9b12cfba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2447 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 X=v7C*8ilj@Jwx!WUbq|1q1pcf#olJ# diff --git a/public/images/pokemon/variant/exp/back/666-ocean.json b/public/images/pokemon/variant/exp/back/666-ocean.json new file mode 100644 index 00000000000..70e7a51c21f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-ocean.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "d9edd4", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "b54908", + "675220": "bc601c", + "504a4a": "bc601c", + "595959": "e99a26", + "707068": "ea8742", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "ea8742", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "f3c86b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.json b/public/images/pokemon/variant/exp/back/666-ocean_2.json deleted file mode 100644 index d5bb27bf592..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.png b/public/images/pokemon/variant/exp/back/666-ocean_2.png deleted file mode 100644 index 6f4fefc99f81866fbdbda805bd252a3d7095ab93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 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 QXM7w$fW9%hT+b2zKe(sw)Bpeg diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.json b/public/images/pokemon/variant/exp/back/666-ocean_3.json deleted file mode 100644 index 4ca1832c359..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.png b/public/images/pokemon/variant/exp/back/666-ocean_3.png deleted file mode 100644 index 554fcb7b510509469c2e62f0167280969c20226d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2596 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 Ksa_4jIp%+;X5^Rv diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball.json b/public/images/pokemon/variant/exp/back/666-poke-ball.json new file mode 100644 index 00000000000..e21ba03fc1e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-poke-ball.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "971d1d": "971d1d", + "b72c2c": "b72c2c", + "dc4b4b": "dc4b4b", + "e97e7e": "e97e7e", + "ceab62": "d9edd4", + "a9a99e": "a9a99e", + "c3c3c3": "c3c3c3", + "f8f8f8": "f8f8f8" + }, + "2": { + "101010": "101010", + "303030": "ae001a", + "675220": "a70038", + "504a4a": "a70038", + "595959": "df0036", + "707068": "d5375a", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "ceab62": "d5375a", + "a9a99e": "000050", + "c3c3c3": "f0a6bf", + "f8f8f8": "00006d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json b/public/images/pokemon/variant/exp/back/666-poke-ball_2.json deleted file mode 100644 index 99da9b9ac29..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.png b/public/images/pokemon/variant/exp/back/666-poke-ball_2.png deleted file mode 100644 index a1bd953a1b3055ba17cb1df7f744a04120530351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2616 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 ns>5%7qIIcxF`G&~m diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json b/public/images/pokemon/variant/exp/back/666-poke-ball_3.json deleted file mode 100644 index de222894738..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.png b/public/images/pokemon/variant/exp/back/666-poke-ball_3.png deleted file mode 100644 index 9e7ff12912dfa61716bc28d1d53af8bf30e4a717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 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 BYu5k( diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json b/public/images/pokemon/variant/exp/back/666-sandstorm_3.json deleted file mode 100644 index d43381578cb..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sandstorm_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png b/public/images/pokemon/variant/exp/back/666-sandstorm_3.png deleted file mode 100644 index 649fa83e025d7f086dd5e9f8536e00d16a26a356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 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 AUH||9 diff --git a/public/images/pokemon/variant/exp/back/666-savanna.json b/public/images/pokemon/variant/exp/back/666-savanna.json new file mode 100644 index 00000000000..c261f52dced --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-savanna.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "dcc433": "dcc433", + "ceab62": "d9edd4", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "fffd77": "fffd77", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "183576", + "675220": "1d828b", + "504a4a": "1d828b", + "595959": "4168bb", + "707068": "4faab3", + "dcc433": "dcc433", + "ceab62": "4faab3", + "fffd77": "fffd77", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "c3c3c3": "81e7e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.json b/public/images/pokemon/variant/exp/back/666-savanna_2.json deleted file mode 100644 index c1f73f6efc7..00000000000 --- a/public/images/pokemon/variant/exp/back/666-savanna_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-savanna_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.png b/public/images/pokemon/variant/exp/back/666-savanna_2.png deleted file mode 100644 index b4b8ecedb9e42b956de448a6d63569da654bd077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 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 aXpJ`Q|F}nSNbn;Afyk!T#4`NZ*na^lMWd?# diff --git a/public/images/pokemon/variant/exp/back/666-sun.json b/public/images/pokemon/variant/exp/back/666-sun.json new file mode 100644 index 00000000000..21cf5787ba4 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-sun.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "d9edd4", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "640000", + "675220": "8c1850", + "504a4a": "8c1850", + "595959": "750500", + "707068": "b83b74", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "b83b74", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "fee3e7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.json b/public/images/pokemon/variant/exp/back/666-sun_2.json deleted file mode 100644 index d7c995a1bc0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sun_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sun_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.png b/public/images/pokemon/variant/exp/back/666-sun_2.png deleted file mode 100644 index c9168d5a1c5d2bcf09b21d39b5aafcfbb61150b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2559 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
    35lTqf6x>!lNoD{HQw z14^!h?Z2?{_VwioSDTW&kKQ!z9#&J6`A}(-}{pcHWjV~pDSgZ4@#hWu0WxScS3CD_x zin>7{VTU1^$MH|~Li@nr=|s#%xzGBb@h*eN49Q`J=CEfMcGma|IBen2%NACU{r_Kf z*w5k+2;T%~Y-Al-IPl58wLZkok?dqC=IF(Q?KKXnBhwL`6Qn3D-o)MXel>V>adE?n$+Wo@ zVe`(2S+>We#H)P43YVHMU_L^cOS>#?Y5oi|tLc#?o#Aza%^C|LlM0Q;w+&smKTcW- zk4G$frJLYpMW}zX@J4-DB{={TKi3tg`k&k$lrmYbUQy3VO+P$>l!Jp+R`Q@bv`!_D zT2XlTaa*vz_C#ozYeJ8K1^df#nhs}j5iahnmtpCbr=Y|%q*}gsURoL{fu}DWby4@} zbUmRkAKvTVnU|MrKwm*39Z&H*!#Pm!mx%hy%<@V_RcP!m8wiF{0m?0&I$1a^HIiPK zj3rjDAMuz05wc@ z#XZE@uzcV1+P4i;8(Zl!2Esa;K0(*NB*4hKI>l1wPwr-CAOW%%uI<$vC2Q5?HjuQe zuYwKQ)fQ>H>Lm)_Kt|NttK9!%x6Vx9dl}C>%-zgCt^kV{4|VL*Jl3j)D)${Z6>d zG{lYR0diIQ5JpRKOQ$lp&O7mY6+&#Gn&jV&Yv{-tp5g zaEHliRv9%FKtKG^-=qv85$Qs(JiS{zT0W?Yav3QG&V5FKqsR?GWWGw{!cEA2+q)BqK+1P53HL^9dn%?Bh{-CLEgWe6R^ z#}FIJ{Y+X%2M8}DJO^(f$<&zA!-*<(p5vA_X5P4m`^K(*9R)3iW<)4L3oe-va}wxX z_RZ=kncUd*O$LM16!TA`T$@J-*`&>!IIavzq~)>lD73yq)62)>^vIN%2!1*cdngpO zVVUR^`=z|QfaUUyHNlEM|5#}GfOU1X0|EP-rw4@l)hSrFRX9ae3N@&w3>UCw66Fcnv8qO`i)8;^@y;RFDW&XPD`NXaN@mkc} zv}71dM&gKyp9NzfRw1n zz0NV0bO42b?%y!M__)T6Q}fz149YaHr;P_@L|@D*$j4|LIdHwC9rYVpA4KA~#y$TX zDJex>=m1M&dJgi+Uu5#5OwV%ERIS#kqZ)VqiV{++(K;w(Nymilb$(u34XeMXcu=o2 zo>T9)g0Xs)P0D+>eqV@v7^32SfnCd^=alz;{WVT7j)2oG3LR}aqF!e)l9K7+>gWnS z2sQZKE-a@L966qofO&7*4fA6fce0~?AnzQAIi->g*b{dJqy{(xqJ}21q)3^k4_*X+ zzlfXDy)@=O1ae|I^w&)09ZVuWo+t$OmkLp@Lm=abvNB%E^V;R&p4ZkVV&&(nLb61( j#2CN+x&zGHw8TM>`ZINA(wcspF8~BIu`sShIVb)L_r19( diff --git a/public/images/pokemon/variant/exp/back/666-tundra.json b/public/images/pokemon/variant/exp/back/666-tundra.json new file mode 100644 index 00000000000..b098f776c00 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-tundra.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "c3c3c3", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "003d69", + "675220": "3a76a7", + "504a4a": "3a76a7", + "595959": "225b72", + "707068": "659dd0", + "ceab62": "659dd0", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "cbfbfb", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.json b/public/images/pokemon/variant/exp/back/666-tundra_2.json deleted file mode 100644 index 3d8ae45a641..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.png b/public/images/pokemon/variant/exp/back/666-tundra_2.png deleted file mode 100644 index 49325397d8a79ab63379881b75a624067a67d70a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2429 zcmV-@34->CP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV$i*n;A5Jl6|ct(su{QrNu^nE88w#83{U*I4 zUmx1FXFYk}yG>y4tsj^xDm3*Hk6sh-EjvXRd%>whWM;Ze2++MoE}(5;WwG{}h)4Hg zJ%{e?43CtACuU%=o7O^ zH~wfsWG7V5tZ7If_l~PX_lqSFCw<;xBAvke{4G3ah{)QXLX8)~7=-F_BL2Q;S#;ai2;e8_~Uq>fg1ZacMCPCy7{|Gx|YIv{Sw+!Hy(yLY{Nd+B9O@3p`a?cC);jWWPq9R5c(G{;xgl=5QG%Ug>U=(rmIs%CD z6vDT>C}QJ{7@~+4ga=6H1#u<9Mdpj;FyU5tec9a&BzcaQ>ukrOV6e%s9RE z(TNKY0!J+0`{YF`2p7ZgjSp4C`osTY-q~^u_rD!}%aN|gS~4dixD;Wqvk9rZ_*7~I zlZnvL>||4l6dPCH<)a8;b0887)7C|zR3fblMiZcC!vr+ayh|ik@joyuu#8Yzk=g}w zky@i$q^OFBN-u5$9!*II=y~5r zu&tVzvLyNYgkOAD*pFQMMFMqG9+ntL&7(+B`q&hXO7__!ZeZu~j&S0Uo49Hf$opYE zdt0YRC`k@wS_Z=W4{OkKTP{LRD*oNJ4gG2V|9A!2HlFJa4>i%{W*O*l{y(D=U~7#3 zBP@vMbAj39@LgHNA9AB(tnc6ZIgRXFENUJMawx z6i^ygKzYys2b?UaQiBM&h)nX(7a5Gr#)S}2hr=O{TEy`5z_%9(CbIHIJRlb#U>FvW z4(freh^`WUtBE4I1-jO00!JznUn0UJJZ!JKy(kBJkcdF;iAaHoX3j)F)?g}0&`2WM z*~-T1Hes+p%@##;X4(2!uuN1% zpJ}Ns@`}UJf>3{x_G3oFlj~7huF)hs!9@}3I#`gnNSqP_%{g;2qQ)d|1YzTPlQEC5 zZ(K%%z&ZxyCax6;X9f$BZOBaIdd(Lm)r}FRJz`0mi?0OKg?sE&y&KGX!~v#`A1?wB zRhmn0&=~iKCh3Kay(cQi4{#@EdQ70~2|bmC;|IYr!ETirb_4Zb@+2^BJ4D0vLfs>W3sOZJI#442s@2?tO+|!iL3}a&6#wH427L$Ov1$0%ZsK%G+}a55)C`yH_nBf#zj7a zop3VjG+~m;@Mzd++Qe0>z}^fy4Vx?rJ58u83Oh}?tO+{}d$_Z(6W$9uO?WH`JB@m* z3Omh$orXOw!cHPGnK8N{(uSRW-v~R6i!2H|&5Ar8cA78=F@${U+z&fV zh^z@a&50}sJ58A^2|LY*gw%|Rgb(ndh?@yJ-8U(|pomXR<6);;CQpW)Zkjw8cA7I; v5O$g|Src}eS9v<@G^w&8?DXI<8g}{*{W0Y00000NkvXXu0mjfQ{Z~; diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.json b/public/images/pokemon/variant/exp/back/666-tundra_3.json deleted file mode 100644 index 65be2910a02..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.png b/public/images/pokemon/variant/exp/back/666-tundra_3.png deleted file mode 100644 index 3284e1e637bcc09d36a3e05f4a248e30a82af681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2420 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 Date: Tue, 25 Feb 2025 15:54:48 +0100 Subject: [PATCH 099/171] =?UTF-8?q?[UI/UX]=20Reducing=20number=20of=20cont?= =?UTF-8?q?ainers=20in=20the=20Pok=C3=A9dex=20(#5400)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PokedexMonContainer now has a method to change species. * Not setting tint to 0 in the container * Using only 81 containers in Pokédex * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/ui/pokedex-mon-container.ts | 66 ++++--- src/ui/pokedex-ui-handler.ts | 305 +++++++++++++++++--------------- 2 files changed, 197 insertions(+), 174 deletions(-) diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts index 31a98c30d1c..1bcfafc0766 100644 --- a/src/ui/pokedex-mon-container.ts +++ b/src/ui/pokedex-mon-container.ts @@ -36,26 +36,7 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { super(globalScene, 0, 0); - this.species = species; - - const { shiny, formIndex, female, variant } = options; - - const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - - if (!isNullOrUndefined(formIndex)) { - defaultProps.formIndex = formIndex; - } - if (!isNullOrUndefined(shiny)) { - defaultProps.shiny = shiny; - } - if (!isNullOrUndefined(variant)) { - defaultProps.variant = variant; - } - if (!isNullOrUndefined(female)) { - defaultProps.female = female; - } - + this.setSpecies(species, options); // starter passive bg const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); @@ -65,15 +46,6 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.add(starterPassiveBg); this.starterPassiveBgs = starterPassiveBg; - // icon - this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.icon.setScale(0.5); - this.icon.setOrigin(0, 0); - this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); - this.icon.setTint(0); - this.add(this.icon); - // shiny icons for (let i = 0; i < 3; i++) { const shinyIcon = globalScene.add.image(i * -3 + 12, 2, "shiny_star_small"); @@ -196,6 +168,42 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.passive2OverlayIcon = passive2OverlayIcon; } + setSpecies(species: PokemonSpecies, options: SpeciesDetails = {}) { + + this.species = species; + + const { shiny, formIndex, female, variant } = options; + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + if (!isNullOrUndefined(formIndex)) { + defaultProps.formIndex = formIndex; + } + if (!isNullOrUndefined(shiny)) { + defaultProps.shiny = shiny; + } + if (!isNullOrUndefined(variant)) { + defaultProps.variant = variant; + } + if (!isNullOrUndefined(female)) { + defaultProps.female = female; + } + + if (this.icon) { + this.remove(this.icon); + this.icon.destroy(); // Properly removes the sprite from memory + } + + // icon + this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setScale(0.5); + this.icon.setOrigin(0, 0); + this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); + this.add(this.icon); + } + checkIconId(female, formIndex, shiny, variant) { if (this.icon.frame.name !== this.species.getIconId(female, formIndex, shiny, variant)) { console.log(`${this.species.name}'s variant icon does not exist. Replacing with default.`); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 82208a5899d..45809c40fb6 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -109,6 +109,17 @@ enum FilterTextOptions{ ABILITY_2, } +interface ContainerData { + species: PokemonSpecies, + cost: number, + props: DexAttrProps, + eggMove1?: boolean, + eggMove2?: boolean, + tmMove1?: boolean, + tmMove2?: boolean, + passive1?: boolean, + passive2?: boolean, +} const valueReductionMax = 2; @@ -121,11 +132,11 @@ const speciesContainerX = 143; * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { +function calcStarterPosition(index: number): {x: number, y: number} { const yOffset = 13; const height = 17; const x = (index % 9) * 18; - const y = yOffset + (Math.floor(index / 9) - scrollCursor) * height; + const y = yOffset + (Math.floor(index / 9)) * height; return { x: x, y: y }; } @@ -145,8 +156,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private filterBarContainer: Phaser.GameObjects.Container; private filterBar: FilterBar; private pokemonContainers: PokedexMonContainer[] = []; - private filteredPokemonContainers: PokedexMonContainer[] = []; - private validPokemonContainers: PokedexMonContainer[] = []; + private filteredPokemonData: ContainerData[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -160,6 +170,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private filterMode: boolean; private filterBarCursor: number = 0; private scrollCursor: number; + private oldCursor: number = -1; private allSpecies: PokemonSpecies[] = []; private lastSpecies: PokemonSpecies; @@ -447,8 +458,13 @@ export default class PokedexUiHandler extends MessageUiHandler { for (const species of allSpecies) { this.speciesLoaded.set(species.speciesId, false); this.allSpecies.push(species); + } - const pokemonContainer = new PokedexMonContainer(species).setVisible(false); + // Here code to declare 81 containers + for (let i = 0; i < 81; i++) { + const pokemonContainer = new PokedexMonContainer(this.allSpecies[i]).setVisible(false); + const pos = calcStarterPosition(i); + pokemonContainer.setPosition(pos.x, pos.y); this.iconAnimHandler.addOrUpdate(pokemonContainer.icon, PokemonIconAnimMode.NONE); this.pokemonContainers.push(pokemonContainer); starterBoxContainer.add(pokemonContainer); @@ -563,19 +579,12 @@ export default class PokedexUiHandler extends MessageUiHandler { this.getUi().bringToTop(this.starterSelectContainer); - // Making caught pokemon visible icons, etc - this.allSpecies.forEach((species, s) => { - const icon = this.pokemonContainers[s].icon; - const dexEntry = globalScene.gameData.dexData[species.speciesId]; + this.pokemonContainers.forEach(container => { + const icon = container.icon; + const species = container.species; this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); - if ((dexEntry.caughtAttr & species.getFullUnlocksData()) || globalScene.dexForDevs) { - icon.clearTint(); - } else if (dexEntry.seenAttr) { - icon.setTint(0x808080); - } - this.setUpgradeAnimation(icon, species); }); @@ -872,12 +881,11 @@ export default class PokedexUiHandler extends MessageUiHandler { } const maxColumns = 9; - const numberOfStarters = this.filteredPokemonContainers.length; + const numberOfStarters = this.filteredPokemonData.length; const numOfRows = Math.ceil(numberOfStarters / maxColumns); - const currentRow = Math.floor(this.cursor / maxColumns); const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first index on the screen - - // TODO: use the above to let the cursor go to the correct position when switching back. + // TODO: check if in some places we need to use one or the other + const currentRow = Math.floor((onScreenFirstIndex + this.cursor) / maxColumns); const ui = this.getUi(); @@ -966,9 +974,9 @@ export default class PokedexUiHandler extends MessageUiHandler { const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol - this.scrollCursor * 9); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9 - this.scrollCursor * 9, 0)); } success = true; } @@ -1003,7 +1011,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (numberOfStarters > 0) { this.setFilterTextMode(false); const rowIndex = this.filterTextCursor; - this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1)); + this.setCursor(rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1); success = true; } break; @@ -1012,7 +1020,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (numberOfStarters > 0) { this.setFilterTextMode(false); const rowIndex = this.filterTextCursor; - this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns)); + this.setCursor(rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns); success = true; } break; @@ -1043,10 +1051,10 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { const numberOfForms = this.trayContainers.length; const numOfRows = Math.ceil(numberOfForms / maxColumns); - const currentRow = Math.floor(this.trayCursor / maxColumns); + const currentTrayRow = Math.floor(this.trayCursor / maxColumns); switch (button) { case Button.UP: - if (currentRow > 0) { + if (currentTrayRow > 0) { success = this.setTrayCursor(this.trayCursor - 9); } else { const targetCol = this.trayCursor; @@ -1058,7 +1066,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if (currentRow < numOfRows - 1) { + if (currentTrayRow < numOfRows - 1) { success = this.setTrayCursor(this.trayCursor + 9); } else { success = this.setTrayCursor(this.trayCursor % 9); @@ -1068,14 +1076,14 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.trayCursor % 9 !== 0) { success = this.setTrayCursor(this.trayCursor - 1); } else { - success = this.setTrayCursor(currentRow < numOfRows - 1 ? (currentRow + 1) * maxColumns - 1 : numberOfForms - 1); + success = this.setTrayCursor(currentTrayRow < numOfRows - 1 ? (currentTrayRow + 1) * maxColumns - 1 : numberOfForms - 1); } break; case Button.RIGHT: - if (this.trayCursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { + if (this.trayCursor % 9 < (currentTrayRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { success = this.setTrayCursor(this.trayCursor + 1); } else { - success = this.setTrayCursor(currentRow * 9); + success = this.setTrayCursor(currentTrayRow * 9); } break; case Button.CYCLE_FORM: @@ -1094,10 +1102,12 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { this.scrollCursor--; this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor - 9); } - success = this.setCursor(this.cursor - 9); } else { - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterMode(true); success = true; } @@ -1106,9 +1116,11 @@ export default class PokedexUiHandler extends MessageUiHandler { if (currentRow < numOfRows - 1) { // not last row if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon this.scrollCursor++; + this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor + 9); } - success = this.setCursor(this.cursor + 9); - this.updateScroll(); } else if (numOfRows > 1) { // DOWN from last row of pokemon > Wrap around to first row this.scrollCursor = 0; @@ -1116,7 +1128,7 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor % 9); } else { // DOWN from single row of pokemon > Go to filters - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterMode(true); success = true; } @@ -1126,7 +1138,7 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor - 1); } else { // LEFT from filtered pokemon, on the left edge - this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; } @@ -1137,13 +1149,13 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor + 1); } else { // RIGHT from filtered pokemon, on the right edge - this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; } break; case Button.CYCLE_FORM: - const species = this.filteredPokemonContainers[this.cursor].species; + const species = this.pokemonContainers[this.cursor].species; if (this.canShowFormTray) { success = this.openFormTray(species); } @@ -1225,60 +1237,48 @@ export default class PokedexUiHandler extends MessageUiHandler { updateStarters = () => { this.scrollCursor = 0; - this.filteredPokemonContainers = []; - this.validPokemonContainers = []; + this.filteredPokemonData = []; this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); this.filterBar.updateFilterLabels(); this.filterText.updateFilterLabels(); - this.validPokemonContainers = this.pokemonContainers; + this.filteredPokemonData = []; - // this updates icons for previously saved pokemon - for (let i = 0; i < this.validPokemonContainers.length; i++) { - const currentFilteredContainer = this.validPokemonContainers[i]; - const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + this.allSpecies.forEach(species => { - const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); - const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr)); + const starterId = this.getStarterSpeciesId(species.speciesId); - starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); - currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); - } + const currentDexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr)); - // filter - this.validPokemonContainers.forEach(container => { - container.setVisible(false); - - const starterId = this.getStarterSpeciesId(container.species.speciesId); - - container.cost = globalScene.gameData.getSpeciesStarterValue(starterId); + const data: ContainerData = { species: species, cost: globalScene.gameData.getSpeciesStarterValue(starterId), props: props }; // First, ensure you have the caught attributes for the species else default to bigint 0 // TODO: This might be removed depending on how accessible we want the pokedex function to be - const caughtAttr = (globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0)) & - (globalScene.gameData.dexData[this.getStarterSpeciesId(container.species.speciesId)]?.caughtAttr || BigInt(0)) & - container.species.getFullUnlocksData(); + const caughtAttr = (globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]?.caughtAttr || BigInt(0)) & + species.getFullUnlocksData(); const starterData = globalScene.gameData.starterData[starterId]; const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); // Name filter const selectedName = this.filterText.getValue(FilterTextRow.NAME); - const fitsName = container.species.name === selectedName || selectedName === this.filterText.defaultText; + const fitsName = species.name === selectedName || selectedName === this.filterText.defaultText; // Move filter // TODO: There can be fringe cases where the two moves belong to mutually exclusive forms, these must be handled separately (Pikachu); // On the other hand, in some cases it is possible to switch between different forms and combine (Deoxys) - const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); + const levelMoves = pokemonSpeciesLevelMoves[species.speciesId].map(m => allMoves[m[1]].name); // This always gets egg moves from the starter const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); - const fitsFormMove1 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); - const fitsFormMove2 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); + const fitsFormMove1 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); + const fitsFormMove2 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); const fitsLevelMove1 = levelMoves.includes(selectedMove1) || fitsFormMove1; const fitsEggMove1 = eggMoves.includes(selectedMove1); const fitsTmMove1 = tmMoves.includes(selectedMove1); @@ -1289,44 +1289,38 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsMove2 = fitsLevelMove2 || fitsEggMove2 || fitsTmMove2 || selectedMove2 === this.filterText.defaultText; const fitsMoves = fitsMove1 && fitsMove2; - container.eggMove1Icon.setVisible(false); - container.tmMove1Icon.setVisible(false); - container.eggMove2Icon.setVisible(false); - container.tmMove2Icon.setVisible(false); if (fitsEggMove1 && !fitsLevelMove1) { - container.eggMove1Icon.setVisible(true); const em1 = eggMoves.findIndex(name => name === selectedMove1); if ((starterData.eggMoves & (1 << em1)) === 0) { - container.eggMove1Icon.setTint(0x808080); + data.eggMove1 = false; } else { - container.eggMove1Icon.clearTint(); + data.eggMove1 = true; } } else if (fitsTmMove1 && !fitsLevelMove1) { - container.tmMove1Icon.setVisible(true); + data.tmMove1 = true; } if (fitsEggMove2 && !fitsLevelMove2) { - container.eggMove2Icon.setVisible(true); const em2 = eggMoves.findIndex(name => name === selectedMove2); if ((starterData.eggMoves & (1 << em2)) === 0) { - container.eggMove2Icon.setTint(0x808080); + data.eggMove2 = false; } else { - container.eggMove2Icon.clearTint(); + data.eggMove2 = true; } } else if (fitsTmMove2 && !fitsLevelMove2) { - container.tmMove2Icon.setVisible(true); + data.tmMove2 = true; } // Ability filter - const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); + const abilities = [ species.ability1, species.ability2, species.abilityHidden ].map(a => allAbilities[a].name); const passives = starterPassiveAbilities[starterId] ?? {} as PassiveAbilities; const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); - const fitsFormAbility1 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); + const fitsFormAbility1 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); - const fitsFormAbility2 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); + const fitsFormAbility2 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); @@ -1334,35 +1328,27 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); - container.passive1Icon.setVisible(false); - container.passive2Icon.setVisible(false); if (fitsPassive1 || fitsPassive2) { if (fitsPassive1) { if (starterData.passiveAttr > 0) { - container.passive1Icon.clearTint(); - container.passive1OverlayIcon.clearTint(); + data.passive1 = true; } else { - container.passive1Icon.setTint(0x808080); - container.passive1OverlayIcon.setTint(0x808080); + data.passive1 = false; } - container.passive1Icon.setVisible(true); } else { if (starterData.passiveAttr > 0) { - container.passive2Icon.clearTint(); - container.passive2OverlayIcon.clearTint(); + data.passive2 = true; } else { - container.passive2Icon.setTint(0x808080); - container.passive2OverlayIcon.setTint(0x808080); + data.passive2 = false; } - container.passive2Icon.setVisible(true); } } // Gen filter - const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(species.generation); // Type filter - const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => species.isOfType((type as number) - 1)); // Biome filter const indexToBiome = new Map( @@ -1374,7 +1360,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // We get biomes for both the mon and its starters to ensure that evolutions get the correct filters. // TODO: We might also need to do it the other way around. - const biomes = catchableSpecies[container.species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); + const biomes = catchableSpecies[species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); if (biomes.length === 0) { biomes.push("Uncatchable"); } @@ -1405,7 +1391,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // Passive Filter const isPassiveUnlocked = starterData.passiveAttr > 0; - const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked; + const isPassiveUnlockable = this.isPassiveAvailable(species.speciesId) && !isPassiveUnlocked; const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; @@ -1421,7 +1407,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // Cost Reduction Filter const isCostReducedByOne = starterData.valueReduction === 1; const isCostReducedByTwo = starterData.valueReduction === 2; - const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId); + const isCostReductionUnlockable = this.isValueReductionAvailable(species.speciesId); const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { return isCostReducedByOne || isCostReducedByTwo; @@ -1439,7 +1425,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Starter Filter - const isStarter = this.getStarterSpeciesId(container.species.speciesId) === container.species.speciesId; + const isStarter = this.getStarterSpeciesId(species.speciesId) === species.speciesId; const fitsStarter = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "STARTER" && misc.state === DropDownState.ON) { return isStarter; @@ -1453,7 +1439,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Favorite Filter - const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false; + const isFavorite = this.starterPreferences[species.speciesId]?.favorite ?? false; const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) { return isFavorite; @@ -1481,7 +1467,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // HA Filter - const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const speciesHasHiddenAbility = species.abilityHidden !== species.ability1 && species.abilityHidden !== Abilities.NONE; const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { @@ -1494,7 +1480,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Egg Purchasable Filter - const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId); + const isEggPurchasable = this.isSameSpeciesEggAvailable(species.speciesId); const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "EGG" && misc.state === DropDownState.ON) { return isEggPurchasable; @@ -1508,25 +1494,25 @@ export default class PokedexUiHandler extends MessageUiHandler { // Pokerus Filter const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { - return this.pokerusSpecies.includes(container.species); + return this.pokerusSpecies.includes(species); } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { - return !this.pokerusSpecies.includes(container.species); + return !this.pokerusSpecies.includes(species); } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { return true; } }); if (fitsName && fitsAbilities && fitsMoves && fitsGen && fitsBiome && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsStarter && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { - this.filteredPokemonContainers.push(container); + this.filteredPokemonData.push(data); } }); - this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonContainers.length / 9), 1)); + this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonData.length / 9), 1)); this.starterSelectScrollBar.setScrollCursor(0); // sort const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; - this.filteredPokemonContainers.sort((a, b) => { + this.filteredPokemonData.sort((a, b) => { switch (sort.val) { default: break; @@ -1559,34 +1545,51 @@ export default class PokedexUiHandler extends MessageUiHandler { updateScroll = () => { const maxColumns = 9; - const maxRows = 9; const onScreenFirstIndex = this.scrollCursor * maxColumns; - const onScreenLastIndex = Math.min(this.filteredPokemonContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); this.pokerusCursorObjs.forEach(cursorObj => cursorObj.setVisible(false)); let pokerusCursorIndex = 0; - this.filteredPokemonContainers.forEach((container, i) => { - const pos = calcStarterPosition(i, this.scrollCursor); - container.setPosition(pos.x, pos.y); - if (i < onScreenFirstIndex || i > onScreenLastIndex) { + this.pokemonContainers.forEach((container, i) => { + + const i_data = i + onScreenFirstIndex; + + if (i_data >= this.filteredPokemonData.length) { container.setVisible(false); - return; } else { container.setVisible(true); + const data = this.filteredPokemonData[i_data]; + const props = data.props; + + container.setSpecies(data.species, props); + + const starterSprite = container.icon as Phaser.GameObjects.Sprite; + starterSprite.setTexture(data.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), container.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + container.checkIconId(props.female, props.formIndex, props.shiny, props.variant); + + const speciesId = data.species.speciesId; + const dexEntry = globalScene.gameData.dexData[speciesId]; + const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & data.species.getFullUnlocksData(); + + if ((caughtAttr & data.species.getFullUnlocksData()) || globalScene.dexForDevs) { + container.icon.clearTint(); + } else if (dexEntry.seenAttr) { + container.icon.setTint(0x808080); + } else { + container.icon.setTint(0); + } + if (this.showDecorations) { - if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + if (this.pokerusSpecies.includes(data.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(container.x - 1, container.y + 1); this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); pokerusCursorIndex++; } - const speciesId = container.species.speciesId; - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & container.species.getFullUnlocksData(); this.updateStarterValueLabel(container); container.label.setVisible(true); @@ -1641,6 +1644,7 @@ export default class PokedexUiHandler extends MessageUiHandler { setCursor(cursor: number): boolean { let changed = false; + this.oldCursor = this.cursor; if (this.filterMode) { changed = this.filterBarCursor !== cursor; @@ -1651,16 +1655,17 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterTextCursor = cursor; this.filterText.setCursor(cursor); } else { - cursor = Math.max(Math.min(this.filteredPokemonContainers.length - 1, cursor), 0); + cursor = Math.max(Math.min(this.pokemonContainers.length - 1, cursor), 0); changed = super.setCursor(cursor); - const pos = calcStarterPosition(cursor, this.scrollCursor); + const pos = calcStarterPosition(cursor); this.cursorObj.setPosition(pos.x - 1, pos.y + 1); - const species = this.filteredPokemonContainers[cursor]?.species; + const species = this.pokemonContainers[cursor]?.species; if (species) { this.setSpecies(species); + return true; } } @@ -1712,13 +1717,12 @@ export default class PokedexUiHandler extends MessageUiHandler { this.trayColumns = Math.min(this.trayNumIcons, 9); const maxColumns = 9; - const onScreenFirstIndex = this.scrollCursor * maxColumns; - const boxCursor = this.cursor - onScreenFirstIndex; + const boxCursor = this.cursor; const boxCursorY = Math.floor(boxCursor / maxColumns); const boxCursorX = boxCursor - boxCursorY * 9; const spaceBelow = 9 - 1 - boxCursorY; const spaceRight = 9 - boxCursorX; - const boxPos = calcStarterPosition(this.cursor, this.scrollCursor); + const boxPos = calcStarterPosition(this.cursor); const goUp = this.trayRows <= spaceBelow - 1 ? 0 : 1; const goLeft = this.trayColumns <= spaceRight ? 0 : 1; @@ -1745,6 +1749,8 @@ export default class PokedexUiHandler extends MessageUiHandler { formContainer.icon.clearTint(); } else if (isFormSeen) { formContainer.icon.setTint(0x808080); + } else { + formContainer.icon.setTint(0); } formContainer.setPosition(5 + (index % 9) * 18, 4 + Math.floor(index / 9) * 17); this.formTrayContainer.add(formContainer); @@ -1809,6 +1815,32 @@ export default class PokedexUiHandler extends MessageUiHandler { return { currentFriendship, friendshipCap }; } + startIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + const icon = container.icon; + if (this.isUpgradeAnimationEnabled()) { + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); + // Reset the position of the icon + icon.x = -2; + icon.y = 2; + } + // Initiates the small up and down idle animation + this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + } + + stopIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + if (container) { + const lastSpeciesIcon = container.icon; + const dexAttr = this.getCurrentDexProps(container.species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(container.species, dexAttr)); + this.checkIconId(lastSpeciesIcon, container.species, props.female, props.formIndex, props.shiny, props.variant); + this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); + // Resume the animation for the previously selected species + globalScene.tweens.getTweensOf(lastSpeciesIcon).forEach(tween => tween.resume()); + } + } + setSpecies(species: PokemonSpecies | null) { this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; @@ -1818,19 +1850,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (this.lastSpecies) { - const dexAttr = this.getCurrentDexProps(this.lastSpecies.speciesId); - const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); - const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); - const lastSpeciesIcon = this.pokemonContainers[speciesIndex].icon; - this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); - this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); - - // Resume the animation for the previously selected species - const icon = this.pokemonContainers[speciesIndex].icon; - globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); + this.stopIconAnimation(this.oldCursor); } - this.lastSpecies = species!; // TODO: is this bang correct? + if (species) { + this.lastSpecies = species; + } if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs)) { @@ -1840,19 +1865,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { - // Pause the animation when the species is selected - const speciesIndex = this.allSpecies.indexOf(species); - const icon = this.pokemonContainers[speciesIndex].icon; - - if (this.isUpgradeAnimationEnabled()) { - globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); - // Reset the position of the icon - icon.x = -2; - icon.y = 2; - } - - // Initiates the small up and down idle animation - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + this.startIconAnimation(this.cursor); const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); this.setTypeIcons(speciesForm.type1, speciesForm.type2); @@ -2115,6 +2128,7 @@ export default class PokedexUiHandler extends MessageUiHandler { override destroy(): void { this.pokemonContainers = []; + this.filteredPokemonData = []; } clearText() { @@ -2126,6 +2140,7 @@ export default class PokedexUiHandler extends MessageUiHandler { super.clear(); this.cursor = -1; + this.oldCursor = -1; globalScene.ui.hideTooltip(); this.starterSelectContainer.setVisible(false); From 7a9bede38df4e5360a5caa69f1baeb3e4325d1db Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 22:17:22 +0100 Subject: [PATCH 100/171] =?UTF-8?q?[UI/UX][Bug]=20Fixing=20obsolete=20refe?= =?UTF-8?q?rence=20in=20Pok=C3=A9dex=20to=20filteredPokemonContainers=20#5?= =?UTF-8?q?415?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 45809c40fb6..b3655d80fa1 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1538,7 +1538,7 @@ export default class PokedexUiHandler extends MessageUiHandler { return 0; }); - this.filteredIndices = this.filteredPokemonContainers.map(c => c.species.speciesId); + this.filteredIndices = this.filteredPokemonData.map(c => c.species.speciesId); this.updateScroll(); }; From 870bff0e6e2de1537a021d739d26543bf3ac8d6b Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:38:17 -0800 Subject: [PATCH 101/171] [Bug][Ability] Fix Neutralizing Gas interactions #5381 * Add neutralizing gas arena tag * Add PostSummonAddArenaTagAbAttr * Add PreLeaveField attr for neutralizing gas * Remove old SuppressFieldAbilitiesAttr * Fix ability suppression logic * Add basic tests * Reapply onGain abilities when neutralizing gas ends * Untodo ability remval test * Add more tests * Modify gastro acid to call onLose attributes when suppressing * Properly cancel abilities on switch in * Add documentation * Remove partial designation * Update locale key usage * Reactivate the last source's other abilities when it becomes the last remaining * Fix loop vars * Add access modifiers for SuppressAbilitiesTag * Minor changes * Move test to reflect new location * Remove promises from abattr function signatures --- src/data/ability.ts | 78 ++++++++++---- src/data/arena-tag.ts | 67 +++++++++++- src/data/move.ts | 7 +- src/enums/arena-tag-type.ts | 1 + src/field/arena.ts | 2 +- src/field/pokemon.ts | 33 +++--- test/abilities/neutralizing_gas.test.ts | 138 ++++++++++++++++++++++++ 7 files changed, 285 insertions(+), 41 deletions(-) create mode 100644 test/abilities/neutralizing_gas.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 8de0c68a8e7..5f19af8cea4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -12,7 +12,7 @@ import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffect import { Gender } from "./gender"; import type Move from "./move"; import { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; -import type { ArenaTrapTag } from "./arena-tag"; +import type { ArenaTrapTag, SuppressAbilitiesTag } from "./arena-tag"; import { ArenaTagSide } from "./arena-tag"; import { BerryModifier, HitHealModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { TerrainType } from "./terrain"; @@ -2197,6 +2197,34 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { } } +/** + * Generic class to add an arena tag upon switching in + */ +export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr { + private readonly tagType: ArenaTagType; + private readonly turnCount: number; + private readonly side?: ArenaTagSide; + private readonly quiet?: boolean; + private sourceId: number; + + + constructor(tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) { + super(false); + this.tagType = tagType; + this.turnCount = turnCount; + this.side = side; + this.quiet = quiet; + } + + public override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + this.sourceId = pokemon.id; + if (!simulated) { + globalScene.arena.addTag(this.tagType, this.turnCount, undefined, this.sourceId, this.side, this.quiet); + } + return true; + } +} + export class PostSummonMessageAbAttr extends PostSummonAbAttr { private messageFunc: (pokemon: Pokemon) => string; @@ -2941,6 +2969,26 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { } } +/** + * Updates the active {@linkcode SuppressAbilitiesTag} when a pokemon with {@linkcode Abilities.NEUTRALIZING_GAS} leaves the field + */ +export class PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr extends PreLeaveFieldAbAttr { + constructor() { + super(false); + } + + public override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + const suppressTag = globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + if (suppressTag) { + suppressTag.onSourceLeave(globalScene.arena); + return true; + } + } + return simulated; + } +} + export class PreStatStageChangeAbAttr extends AbAttr { applyPreStatStageChange( pokemon: Pokemon | null, @@ -4692,21 +4740,6 @@ export class MoveAbilityBypassAbAttr extends AbAttr { } } -export class SuppressFieldAbilitiesAbAttr extends AbAttr { - constructor() { - super(false); - } - - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ability = (args[0] as Ability); - if (!ability.hasAttr(UnsuppressableAbilityAbAttr) && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - cancelled.value = true; - return true; - } - return false; - } -} - export class AlwaysHitAbAttr extends AbAttr { } /** Attribute for abilities that allow moves that make contact to ignore protection (i.e. Unseen Fist) */ @@ -5946,10 +5979,10 @@ export function applyOnGainAbAttrs(pokemon: Pokemon, passive: boolean = false, s } /** - * Clears primal weather during the turn if {@linkcode pokemon}'s ability corresponds to one + * Clears primal weather/neutralizing gas during the turn if {@linkcode pokemon}'s ability corresponds to one */ -export function applyOnLoseClearWeatherAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { - applySingleAbAttrs(pokemon, passive, PreLeaveFieldClearWeatherAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); +export function applyOnLoseAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { + applySingleAbAttrs(pokemon, passive, PreLeaveFieldAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); } function queueShowAbility(pokemon: Pokemon, passive: boolean): void { globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); @@ -6838,12 +6871,11 @@ export function initAbilities() { new Ability(Abilities.GORILLA_TACTICS, 8) .attr(GorillaTacticsAbAttr), new Ability(Abilities.NEUTRALIZING_GAS, 8) - .attr(SuppressFieldAbilitiesAbAttr) + .attr(PostSummonAddArenaTagAbAttr, ArenaTagType.NEUTRALIZING_GAS, 0) + .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .partial(), // A bunch of weird interactions with other abilities being suppressed then unsuppressed + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.PASTEL_VEIL, 8) .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 2fa4593fd6c..d034ccf83b8 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -8,7 +8,7 @@ import type Pokemon from "#app/field/pokemon"; import { HitResult, PokemonMove } from "#app/field/pokemon"; import { StatusEffect } from "#enums/status-effect"; import type { BattlerIndex } from "#app/battle"; -import { BlockNonDirectDamageAbAttr, InfiltratorAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; +import { BlockNonDirectDamageAbAttr, InfiltratorAbAttr, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, ProtectStatAbAttr, applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#app/data/ability"; import { Stat } from "#enums/stat"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; @@ -1221,6 +1221,69 @@ export class FairyLockTag extends ArenaTag { } +/** + * Arena tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(Ability) Neutralizing Gas} + * + * Keeps track of the number of pokemon on the field with Neutralizing Gas - If it drops to zero, the effect is ended and abilities are reactivated + * + * Additionally ends onLose abilities when it is activated + */ +export class SuppressAbilitiesTag extends ArenaTag { + private sourceCount: number; + + constructor(sourceId: number) { + super(ArenaTagType.NEUTRALIZING_GAS, 0, undefined, sourceId); + this.sourceCount = 1; + } + + public override onAdd(arena: Arena): void { + const pokemon = this.getSourcePokemon(); + if (pokemon) { + globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + + for (const fieldPokemon of globalScene.getField()) { + if (fieldPokemon && fieldPokemon.id !== pokemon.id) { + [ true, false ].forEach((passive) => applyOnLoseAbAttrs(fieldPokemon, passive)); + } + } + } + } + + public override onOverlap(arena: Arena): void { + this.sourceCount++; + } + + public onSourceLeave(arena: Arena): void { + this.sourceCount--; + if (this.sourceCount <= 0) { + arena.removeTag(ArenaTagType.NEUTRALIZING_GAS); + } else if (this.sourceCount === 1) { + // With 1 source left, that pokemon's other abilities should reactivate + // This may be confusing for players but would be the most accurate gameplay-wise + // Could have a custom message that plays when a specific pokemon's NG ends? This entire thing exists due to passives after all + const setter = globalScene.getField().filter((p) => p && p.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false))[0]; + applyOnGainAbAttrs(setter, setter.getAbility().hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr)); + } + } + + public override onRemove(arena: Arena, quiet: boolean = false) { + if (!quiet) { + globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); + } + + for (const pokemon of globalScene.getField()) { + // There is only one pokemon with this attr on the field on removal, so its abilities are already active + if (pokemon && !pokemon.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false)) { + [ true, false ].forEach((passive) => applyOnGainAbAttrs(pokemon, passive)); + } + } + } + + public shouldApplyToSelf(): boolean { + return this.sourceCount > 1; + } +} + // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { switch (tagType) { @@ -1281,6 +1344,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove return new GrassWaterPledgeTag(sourceId, side); case ArenaTagType.FAIRY_LOCK: return new FairyLockTag(turnCount, sourceId); + case ArenaTagType.NEUTRALIZING_GAS: + return new SuppressAbilitiesTag(sourceId); default: return null; } diff --git a/src/data/move.ts b/src/data/move.ts index d9ceb0f3dce..26b182ec5db 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7811,11 +7811,12 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return false; } - target.summonData.abilitySuppressed = true; - globalScene.arena.triggerWeatherBasedFormChangesToNormal(); - globalScene.queueMessage(i18next.t("moveTriggers:suppressAbilities", { pokemonName: getPokemonNameWithAffix(target) })); + target.suppressAbility(); + + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); + return true; } diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 1c62ccb14a6..4180aa00ef5 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -29,4 +29,5 @@ export enum ArenaTagType { WATER_FIRE_PLEDGE = "WATER_FIRE_PLEDGE", GRASS_WATER_PLEDGE = "GRASS_WATER_PLEDGE", FAIRY_LOCK = "FAIRY_LOCK", + NEUTRALIZING_GAS = "NEUTRALIZING_GAS" } diff --git a/src/field/arena.ts b/src/field/arena.ts index 60ee4b5b03c..752eef81596 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -588,8 +588,8 @@ export class Arena { // creates a new tag object const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); if (newTag) { - this.tags.push(newTag); newTag.onAdd(this, quiet); + this.tags.push(newTag); const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 17917ad9b40..bc3b9b1403f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -63,8 +63,9 @@ import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag, PowerTrickTag } from "../data/battler-tags"; import { WeatherType } from "#enums/weather-type"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; +import type { SuppressAbilitiesTag } from "#app/data/arena-tag"; import type { Ability, AbAttr } from "#app/data/ability"; -import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseClearWeatherAbAttrs } from "#app/data/ability"; +import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseAbAttrs, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr } from "#app/data/ability"; import type PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; @@ -1487,7 +1488,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ability New Ability */ public setTempAbility(ability: Ability, passive: boolean = false): void { - applyOnLoseClearWeatherAbAttrs(this, passive); + applyOnLoseAbAttrs(this, passive); if (passive) { this.summonData.passiveAbility = ability.id; } else { @@ -1496,6 +1497,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyOnGainAbAttrs(this, passive); } + /** + * Suppresses an ability and calls its onlose attributes + */ + public suppressAbility() { + this.summonData.abilitySuppressed = true; + [ true, false ].forEach((passive) => applyOnLoseAbAttrs(this, passive)); + } + /** * Checks if a pokemon has a passive either from: * - bought with starter candy @@ -1553,17 +1562,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) { return false; } - if (this.isOnField() && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - const suppressed = new Utils.BooleanHolder(false); - globalScene.getField(true).filter(p => p !== this).map(p => { - if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) { - p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, false, suppressed, [ ability ])); - } - if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) { - p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, false, suppressed, [ ability ])); - } - }); - if (suppressed.value) { + const suppressAbilitiesTag = arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + if (this.isOnField() && suppressAbilitiesTag) { + const thisAbilitySuppressing = ability.hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr); + const hasSuppressingAbility = this.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false); + // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas + // (Balance decided that the other ability of a neutralizing gas pokemon should not be neutralized) + // If the ability itself is neutralizing gas, don't suppress it (handled through arena tag) + const unsuppressable = ability.hasAttr(UnsuppressableAbilityAbAttr) || thisAbilitySuppressing || (hasSuppressingAbility && !suppressAbilitiesTag.shouldApplyToSelf()); + if (!unsuppressable) { return false; } } diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts new file mode 100644 index 00000000000..8b9c374f1cc --- /dev/null +++ b/test/abilities/neutralizing_gas.test.ts @@ -0,0 +1,138 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Neutralizing Gas", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.NEUTRALIZING_GAS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should prevent other abilities from activating", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + 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); + }); + + it("should allow the user's passive to activate", async () => { + game.override.passiveAbility(Abilities.INTREPID_SWORD); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); + }); + + it.todo("should activate before other abilities", async () => { + game.override.enemySpecies(Species.ACCELGOR) + .enemyLevel(100) + .enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + 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); + }); + + it("should activate other abilities when removed", async () => { + game.override.enemyAbility(Abilities.INTREPID_SWORD) + .enemyPassiveAbility(Abilities.DAUNTLESS_SHIELD) + .enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(0); + + game.move.select(Moves.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); + }); + + it("should not activate the user's other ability when removed", async () => { + game.override.passiveAbility(Abilities.INTIMIDATE) + .enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + // Neutralising gas user's passive is still active + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + // Intimidate did not reactivate after neutralizing gas was removed + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only deactivate when all setters are off the field", async () => { + game.override.enemyMoveset([ Moves.ENTRAINMENT, Moves.SPLASH ]) + .battleType("double"); + + await game.classicMode.startBattle([ Species.ACCELGOR, Species.ACCELGOR ]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); // Now one neut gas user is left + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); // No neut gas users are left + }); + + it("should deactivate when suppressed by gastro acid", async () => { + game.override.enemyMoveset(Moves.GASTRO_ACID); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + +}); From 2cc0ac90f88ac6cc1e79a439a4cdf4392d1a650a Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:22:32 -0800 Subject: [PATCH 102/171] [Bug] Fix canApplyAbility check #5413 --- src/data/ability.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 5f19af8cea4..dcbaa4026f4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,6 +5152,10 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + return; + } + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5445,12 +5449,10 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; + if (pokemon) { + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); } } From aa3f92463344c1c1aff3081e4095095dba8394bb Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:05:18 -0600 Subject: [PATCH 103/171] Revert "[Bug] Fix canApplyAbility check #5413" (#5417) This reverts commit 2cc0ac90f88ac6cc1e79a439a4cdf4392d1a650a. --- src/data/ability.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index dcbaa4026f4..5f19af8cea4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,10 +5152,6 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - return; - } - const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5449,10 +5445,12 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (pokemon) { - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + continue; } + + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } } From ca5e578954f9907cc75044d368eb5d2ead0a42f3 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Wed, 26 Feb 2025 14:27:20 +1100 Subject: [PATCH 104/171] [Bug] Fix AI func save/loads. #5414 Co-authored-by: damocleas --- src/battle-scene.ts | 2 -- src/phases/encounter-phase.ts | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 962b9c8ca91..8205c1fcebc 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3448,8 +3448,6 @@ export default class BattleScene extends SceneBase { for (const modifier of modifiers) { this.addEnemyModifier(modifier, true, true); } - - this.currentBattle.trainer.genAI(party); } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 9485e77e5aa..ea8e43faeeb 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -253,7 +253,10 @@ export class EncounterPhase extends BattlePhase { globalScene.getEnemyField().forEach(enemy => { overrideHeldItems(enemy, false); }); + } + if (battle.battleType === BattleType.TRAINER) { + globalScene.currentBattle.trainer!.genAI(globalScene.getEnemyParty()); } globalScene.ui.setMode(Mode.MESSAGE).then(() => { From 92ee9d06caf8f68c24e85acc5c5dde81c31ce57a Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 25 Feb 2025 23:02:04 -0500 Subject: [PATCH 105/171] [Balance] February 2025 Passive/Egg Move/Cost Changes 2 #5416 * Update egg-moves.ts * Update starters.ts cost changes * Update passives.ts * Update mystery-encounter-utils.test.ts --- src/data/balance/egg-moves.ts | 34 +++++++++---------- src/data/balance/passives.ts | 6 ++-- src/data/balance/starters.ts | 4 +-- .../mystery-encounter-utils.test.ts | 6 ++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 35ec6f934a4..ae61acbd32e 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -46,7 +46,7 @@ export const speciesEggMoves = { [Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ], [Species.KRABBY]: [ Moves.DIRE_CLAW, Moves.DRAGON_HAMMER, Moves.IVY_CUDGEL, Moves.JET_PUNCH ], [Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.FUSION_FLARE, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ], - [Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ], + [Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ], [Species.LICKITUNG]: [ Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.SLACK_OFF, Moves.MAGICAL_TORQUE ], [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ], @@ -59,7 +59,7 @@ export const speciesEggMoves = { [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.GEAR_GRIND, Moves.STORM_THROW, Moves.BITTER_BLADE ], [Species.PINSIR]: [ Moves.HEADLONG_RUSH, Moves.LEECH_LIFE, Moves.CRUSH_GRIP, Moves.EXTREME_SPEED ], [Species.TAUROS]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.WICKED_TORQUE, Moves.COLLISION_COURSE ], - [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ], + [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.KNOCK_OFF, Moves.DRAGON_ASCENT ], [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SCALD, Moves.SHELL_SMASH ], [Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ], [Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ], @@ -76,7 +76,7 @@ export const speciesEggMoves = { [Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ], [Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ], - [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.SURGING_STRIKES ], + [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.PLAY_ROUGH, Moves.SURGING_STRIKES ], [Species.SENTRET]: [ Moves.TIDY_UP, Moves.FAKE_OUT, Moves.NUZZLE, Moves.EXTREME_SPEED ], [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ], [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.MAT_BLOCK, Moves.PARTING_SHOT, Moves.SPORE ], @@ -159,7 +159,7 @@ export const speciesEggMoves = { [Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.STICKY_WEB, Moves.DECORATE, Moves.VICTORY_DANCE ], [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ], [Species.GULPIN]: [ Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.STRENGTH_SAP ], - [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], + [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.GUNK_SHOT, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.SLACK_OFF, Moves.BLUE_FLARE ], [Species.TORKOAL]: [ Moves.MORNING_SUN, Moves.BURNING_BULWARK, Moves.BODY_PRESS, Moves.HYDRO_STEAM ], @@ -235,7 +235,7 @@ export const speciesEggMoves = { [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.SUNSTEEL_STRIKE ], [Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ], [Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ], - [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_SPINNER, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], + [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.SPLISHY_SPLASH, Moves.FREEZE_DRY, Moves.OBLIVION_WING ], [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], @@ -267,7 +267,7 @@ export const speciesEggMoves = { [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.ERUPTION ], [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.WATER_SPOUT ], [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.LUNAR_BLESSING, Moves.MYSTICAL_POWER ], - [Species.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], + [Species.PIDOVE]: [ Moves.SLASH, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.BLITZLE]: [ Moves.HORN_LEECH, Moves.SWORDS_DANCE, Moves.FLARE_BLITZ, Moves.BOLT_STRIKE ], [Species.ROGGENROLA]: [ Moves.BODY_PRESS, Moves.CURSE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.WOOBAT]: [ Moves.ESPER_WING, Moves.STORED_POWER, Moves.MYSTICAL_FIRE, Moves.OBLIVION_WING ], @@ -282,7 +282,7 @@ export const speciesEggMoves = { [Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ], [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ], - [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.WICKED_BLOW ], + [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.SUCKER_PUNCH, Moves.FIRE_LASH, Moves.HEADLONG_RUSH ], [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.HEADLONG_RUSH, Moves.PYRO_BALL ], [Species.MARACTUS]: [ Moves.EARTH_POWER, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ], [Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ], @@ -327,8 +327,8 @@ export const speciesEggMoves = { [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ], [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.DAZZLING_GLEAM, Moves.EARTH_POWER, Moves.HYDRO_STEAM ], [Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], + [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.KNOCK_OFF, Moves.VICTORY_DANCE ], + [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.STONE_AXE, Moves.VICTORY_DANCE ], [Species.TORNADUS]: [ Moves.SANDSEAR_STORM, Moves.PARTING_SHOT, Moves.SPLISHY_SPLASH, Moves.OBLIVION_WING ], [Species.THUNDURUS]: [ Moves.SANDSEAR_STORM, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], [Species.RESHIRAM]: [ Moves.ENERGY_BALL, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ], @@ -342,7 +342,7 @@ export const speciesEggMoves = { [Species.CHESPIN]: [ Moves.COMBAT_TORQUE, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], [Species.FENNEKIN]: [ Moves.TWIN_BEAM, Moves.FIERY_DANCE, Moves.THUNDERBOLT, Moves.SPARKLY_SWIRL ], [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.STEAM_ERUPTION ], - [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ], + [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.LANDS_WRATH, Moves.EXTREME_SPEED ], [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.BURNING_BULWARK, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], [Species.SCATTERBUG]: [ Moves.FOCUS_BLAST, Moves.AFTER_YOU, Moves.DECORATE, Moves.BLIZZARD ], [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.BURNING_BULWARK, Moves.BLUE_FLARE ], @@ -372,7 +372,7 @@ export const speciesEggMoves = { [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], [Species.XERNEAS]: [ Moves.EARTH_POWER, Moves.SPRINGTIDE_STORM, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], [Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], - [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ], + [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.V_CREATE, Moves.CLANGOROUS_SOUL, Moves.HEAL_ORDER ], [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.FIERY_DANCE, Moves.SHORE_UP, Moves.GEOMANCY ], [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.SEARING_SHOT, Moves.THUNDERCLAP ], @@ -415,7 +415,7 @@ export const speciesEggMoves = { [Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.BOLT_STRIKE ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], - [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], + [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.LANDS_WRATH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], [Species.TAPU_FINI]: [ Moves.SPRINGTIDE_STORM, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], [Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ], [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], @@ -505,7 +505,7 @@ export const speciesEggMoves = { [Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ], [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.FISHIOUS_REND ], [Species.HISUI_SNEASEL]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.PSYCHIC_FANGS, Moves.TRIPLE_AXEL ], - [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.HYPER_VOICE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], + [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.SECRET_SWORD, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], [Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ], @@ -538,7 +538,7 @@ export const speciesEggMoves = { [Species.CYCLIZAR]: [ Moves.PARTING_SHOT, Moves.FIRE_LASH, Moves.MAGICAL_TORQUE, Moves.GLAIVE_RUSH ], [Species.ORTHWORM]: [ Moves.SIZZLY_SLIDE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ], [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.GIGA_DRAIN, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], - [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], + [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.SIZZLY_SLIDE, Moves.SHORE_UP, Moves.COLLISION_COURSE ], [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], [Species.CETODDLE]: [ Moves.ZING_ZAP, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], [Species.VELUZA]: [ Moves.PSYBLADE, Moves.LEAF_BLADE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], @@ -550,7 +550,7 @@ export const speciesEggMoves = { [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.MOONGEIST_BEAM ], [Species.SLITHER_WING]: [ Moves.MIGHTY_CLEAVE, Moves.THUNDEROUS_KICK, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], - [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.BULK_UP, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], + [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.SHIFT_GEAR, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.SPLISHY_SPLASH, Moves.VOLT_SWITCH, Moves.NASTY_PLOT ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], @@ -562,7 +562,7 @@ export const speciesEggMoves = { [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.TRIPLE_AXEL, Moves.BITTER_BLADE ], [Species.TING_LU]: [ Moves.SHORE_UP, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED, Moves.PRECIPICE_BLADES ], [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ], - [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], + [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.METEOR_MASH, Moves.DRAGON_ASCENT ], [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.SOLAR_BLADE, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.CORE_ENFORCER, Moves.RISING_VOLTAGE ], @@ -577,7 +577,7 @@ export const speciesEggMoves = { [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ], [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ], - [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], + [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE, Moves.RECOVER ], [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.ASTRAL_BARRAGE ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], [Species.PALDEA_WOOPER]: [ Moves.STONE_AXE, Moves.RECOVER, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ], diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index df347909d49..c613be0137b 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -555,7 +555,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.FLUTTER_MANE]: { 0: Abilities.DAZZLING }, [Species.SLITHER_WING]: { 0: Abilities.SCRAPPY }, [Species.SANDY_SHOCKS]: { 0: Abilities.ELECTRIC_SURGE }, - [Species.IRON_TREADS]: { 0: Abilities.STEELY_SPIRIT }, + [Species.IRON_TREADS]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.IRON_BUNDLE]: { 0: Abilities.SNOW_WARNING }, [Species.IRON_HANDS]: { 0: Abilities.IRON_FIST }, [Species.IRON_JUGULIS]: { 0: Abilities.LIGHTNING_ROD }, @@ -567,7 +567,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.CHIEN_PAO]: { 0: Abilities.INTIMIDATE }, [Species.TING_LU]: { 0: Abilities.STAMINA }, [Species.CHI_YU]: { 0: Abilities.BERSERK }, - [Species.ROARING_MOON]: { 0: Abilities.TOUGH_CLAWS }, + [Species.ROARING_MOON]: { 0: Abilities.INTIMIDATE }, [Species.IRON_VALIANT]: { 0: Abilities.NEUROFORCE }, [Species.KORAIDON]: { 0: Abilities.OPPORTUNIST }, [Species.MIRAIDON]: { 0: Abilities.OPPORTUNIST }, @@ -582,7 +582,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.RAGING_BOLT]: { 0: Abilities.BEAST_BOOST }, [Species.IRON_BOULDER]: { 0: Abilities.SHARPNESS }, [Species.IRON_CROWN]: { 0: Abilities.SHARPNESS }, - [Species.TERAPAGOS]: { 0: Abilities.SOUL_HEART }, + [Species.TERAPAGOS]: { 0: Abilities.SHIELD_DUST }, [Species.PECHARUNT]: { 0: Abilities.TOXIC_CHAIN }, [Species.PALDEA_TAUROS]: { 0: Abilities.ADAPTABILITY }, [Species.PALDEA_WOOPER]: { 0: Abilities.THICK_FAT }, diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index dcf0766d005..10263f895b3 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -290,7 +290,7 @@ export const speciesStarterCosts = { [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, - [Species.VICTINI]: 7, + [Species.VICTINI]: 6, [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, @@ -611,7 +611,7 @@ export const speciesStarterCosts = { [Species.RAGING_BOLT]: 7, [Species.IRON_BOULDER]: 7, [Species.IRON_CROWN]: 7, - [Species.TERAPAGOS]: 8, + [Species.TERAPAGOS]: 9, [Species.PECHARUNT]: 6, [Species.PALDEA_TAUROS]: 5, [Species.PALDEA_WOOPER]: 3, diff --git a/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts index dacfb5cc96e..6b467b9fa81 100644 --- a/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -223,14 +223,14 @@ describe("Mystery Encounter Utils", () => { }); it("excludes species from search", () => { - // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian - const result = getRandomSpeciesByStarterCost(9, [ Species.KORAIDON, Species.MIRAIDON, Species.ARCEUS, Species.RAYQUAZA, Species.KYOGRE, Species.GROUDON ]); + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos + const result = getRandomSpeciesByStarterCost(9, [ Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ARCEUS, Species.KORAIDON, Species.MIRAIDON, Species.TERAPAGOS ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.ZACIAN); }); it("gets species of specified types", () => { - // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos const result = getRandomSpeciesByStarterCost(9, undefined, [ Type.GROUND ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); From b9a853ed2e61c7dddfb786e2b7249e81ca481422 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:48:44 -0800 Subject: [PATCH 106/171] [Bug] Fix canApplyAbility check but for real this time (#5418) * Move canApplyAbility check * Fix suppressed abilities not activated properly * Move canApplyAbility to applySingleAbAttrs --------- Co-authored-by: damocleas --- src/data/ability.ts | 12 +++++++----- src/data/arena-tag.ts | 7 +++++++ src/field/pokemon.ts | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 5f19af8cea4..dcbaa4026f4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,6 +5152,10 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + return; + } + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5445,12 +5449,10 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; + if (pokemon) { + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); } } diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index d034ccf83b8..580ede9596c 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1230,10 +1230,12 @@ export class FairyLockTag extends ArenaTag { */ export class SuppressAbilitiesTag extends ArenaTag { private sourceCount: number; + private beingRemoved: boolean; constructor(sourceId: number) { super(ArenaTagType.NEUTRALIZING_GAS, 0, undefined, sourceId); this.sourceCount = 1; + this.beingRemoved = false; } public override onAdd(arena: Arena): void { @@ -1267,6 +1269,7 @@ export class SuppressAbilitiesTag extends ArenaTag { } public override onRemove(arena: Arena, quiet: boolean = false) { + this.beingRemoved = true; if (!quiet) { globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); } @@ -1282,6 +1285,10 @@ export class SuppressAbilitiesTag extends ArenaTag { public shouldApplyToSelf(): boolean { return this.sourceCount > 1; } + + public isBeingRemoved() { + return this.beingRemoved; + } } // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index bc3b9b1403f..f0486a8f111 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1501,8 +1501,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Suppresses an ability and calls its onlose attributes */ public suppressAbility() { - this.summonData.abilitySuppressed = true; [ true, false ].forEach((passive) => applyOnLoseAbAttrs(this, passive)); + this.summonData.abilitySuppressed = true; } /** @@ -1563,7 +1563,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } const suppressAbilitiesTag = arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; - if (this.isOnField() && suppressAbilitiesTag) { + if (this.isOnField() && suppressAbilitiesTag && !suppressAbilitiesTag.isBeingRemoved()) { const thisAbilitySuppressing = ability.hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr); const hasSuppressingAbility = this.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false); // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas From 6e8a4b287c228d6978ce67a461929105c18d0327 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 26 Feb 2025 07:05:39 +0100 Subject: [PATCH 107/171] [UI/UX] Pressing B on filter bar resets filters (#5404) * Make dropdown update selection when reset to default * Function to resect selection in filter bar * Pressing B on filter now closes it or resets instead of going to top of starters * Filter changes to starter select screen * Method to get column at a given index in filter bar * Specific reset behavior for caught filter in starter select menu * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/ui/starter-select-ui-handler.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: damocleas Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/ui/dropdown.ts | 2 ++ src/ui/filter-bar.ts | 14 ++++++++++++++ src/ui/pokedex-ui-handler.ts | 13 ++++--------- src/ui/starter-select-ui-handler.ts | 29 ++++++++++++++++++----------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 718058c7f99..ec433a35733 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -629,6 +629,8 @@ export class DropDown extends Phaser.GameObjects.Container { } } } + + this.onChange(); } } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 1eba81247d4..8ef910f954a 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -86,6 +86,15 @@ export class FilterBar extends Phaser.GameObjects.Container { return this.dropDowns[this.columns.indexOf(col)]; } + /** + * Get the DropDownColumn associated to a given index + * @param index the index of the column to retrieve + * @returns the associated DropDownColumn if it exists, undefined otherwise + */ + public getColumn(index: number): DropDownColumn { + return this.columns[index]; + } + /** * Highlight the labels of the FilterBar if the filters are different from their default values */ @@ -185,6 +194,11 @@ export class FilterBar extends Phaser.GameObjects.Container { return this.getFilter(col).getVals(); } + public resetSelection(col: DropDownColumn): void { + this.dropDowns[col].resetToDefault(); + this.updateFilterLabels(); + } + setValsToDefault(): void { for (const dropDown of this.dropDowns) { dropDown.resetToDefault(); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index b3655d80fa1..a18f138e4f7 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -898,16 +898,11 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.filterMode && this.filterBar.openDropDown) { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); - - // if there are possible pokemon go the first one of the list - if (numberOfStarters > 0) { - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - this.setCursor(0); - } success = true; - + } else if (this.filterMode && !this.filterBar.getFilter(this.filterBarCursor).hasDefaultValues()) { + this.filterBar.resetSelection(this.filterBarCursor); + this.updateStarters(); + success = true; } else if (this.filterTextMode && !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText)) { this.filterText.resetSelection(this.filterTextCursor); success = true; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 80a2baf7f55..771554f18de 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1080,10 +1080,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /** * Set the selections for all filters to their default starting value */ - resetFilters() : void { + public resetFilters(): void { + this.filterBar.setValsToDefault(); + this.resetCaughtDropdown(); + } + + /** + * Set default value for the caught dropdown, which only shows caught mons + */ + public resetCaughtDropdown(): void { const caughtDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.CAUGHT); - this.filterBar.setValsToDefault(); + caughtDropDown.resetToDefault(); // initial setting, in caught filter, select the options excluding the uncaught option for (let i = 0; i < caughtDropDown.options.length; i++) { @@ -1323,16 +1331,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.filterMode && this.filterBar.openDropDown) { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); - - // if there are possible starters go the first one of the list - if (numberOfStarters > 0) { - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - this.setCursor(0); - } success = true; - + } else if (this.filterMode && !this.filterBar.getFilter(this.filterBar.getColumn(this.filterBarCursor)).hasDefaultValues()) { + if (this.filterBar.getColumn(this.filterBarCursor) === DropDownColumn.CAUGHT) { + this.resetCaughtDropdown(); + } else { + this.filterBar.resetSelection(this.filterBarCursor); + } + this.updateStarters(); + success = true; } else if (this.statsMode) { this.toggleStatsMode(false); success = true; From 883bf45bc02009c1bbfa02fa25cb3b1c6f4c3819 Mon Sep 17 00:00:00 2001 From: Esca Date: Wed, 26 Feb 2025 09:45:29 +0100 Subject: [PATCH 108/171] [Bug][Move] Shed Tail now rounds incurred damage up, not down (#5219) * Shed Tail rounds incurred damage up * Altered Substitute/Shed Tail success condition to account for rounding up * Altered the test to match correct functionality * Update src/data/move.ts Removed default value in constructor due to it having become redundant Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/data/move.ts | 14 +++++++++----- test/moves/shed_tail.test.ts | 7 ++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 26b182ec5db..18f4b220911 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1866,11 +1866,14 @@ export class HalfSacrificialAttr extends MoveEffectAttr { export class AddSubstituteAttr extends MoveEffectAttr { /** The ratio of the user's max HP that is required to apply this effect */ private hpCost: number; + /** Whether the damage taken should be rounded up (Shed Tail rounds up) */ + private roundUp: boolean; - constructor(hpCost: number = 0.25) { + constructor(hpCost: number, roundUp: boolean) { super(true); this.hpCost = hpCost; + this.roundUp = roundUp; } /** @@ -1886,7 +1889,8 @@ export class AddSubstituteAttr extends MoveEffectAttr { return false; } - user.damageAndUpdate(Math.floor(user.getMaxHp() * this.hpCost), HitResult.OTHER, false, true, true); + const damageTaken = this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost); + user.damageAndUpdate(damageTaken, HitResult.OTHER, false, true, true); user.addTag(BattlerTagType.SUBSTITUTE, 0, move.id, user.id); return true; } @@ -1899,7 +1903,7 @@ export class AddSubstituteAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; + return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > (this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost)) && user.getMaxHp() > 1; } /** @@ -9036,7 +9040,7 @@ export function initMoves() { .attr(HighCritAttr) .slicingMove(), new SelfStatusMove(Moves.SUBSTITUTE, Type.NORMAL, -1, 10, -1, 0, 1) - .attr(AddSubstituteAttr), + .attr(AddSubstituteAttr, 0.25, false), new AttackMove(Moves.STRUGGLE, Type.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) .attr(RecoilAttr, true, 0.25, true) .attr(TypelessAttr) @@ -11382,7 +11386,7 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1) .makesContact(), new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) - .attr(AddSubstituteAttr, 0.5) + .attr(AddSubstituteAttr, 0.5, true) .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL) .condition(failIfLastInPartyCondition), new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) diff --git a/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts index 37f046ba2fa..be746aacd78 100644 --- a/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -46,11 +46,8 @@ describe("Moves - Shed Tail", () => { expect(feebas).not.toBe(magikarp); expect(feebas.hp).toBe(feebas.getMaxHp()); - // Note: Shed Tail's HP cost is currently not accurate to mainline, as it - // should cost ceil(maxHP / 2) instead of max(floor(maxHp / 2), 1). The current - // implementation is consistent with Substitute's HP cost logic, but that's not - // the case in mainline for some reason :regiDespair:. - expect(magikarp.hp).toBe(Math.ceil(magikarp.getMaxHp() / 2)); + // Note: Altered the test to be consistent with the correct HP cost :yipeevee_static: + expect(magikarp.hp).toBe(Math.floor(magikarp.getMaxHp() / 2)); expect(substituteTag).toBeDefined(); expect(substituteTag?.hp).toBe(Math.floor(magikarp.getMaxHp() / 4)); }); From 71f644c453d2c73ce384900bc4885ff945f7538c Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Thu, 27 Feb 2025 04:03:22 +1100 Subject: [PATCH 109/171] [UI] Tera type on summary screen (#5419) --- src/ui/summary-ui-handler.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b952037a079..31dee6bb46c 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -28,6 +28,7 @@ import { modifierSortFunc } from "#app/modifier/modifier"; import { PlayerGender } from "#enums/player-gender"; import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat"; import { Nature } from "#enums/nature"; +import { achvs } from "#app/system/achv"; enum Page { PROFILE, @@ -783,9 +784,6 @@ export default class SummaryUiHandler extends UiHandler { if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon?.isTerastallized) { - profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); - } if (this.pokemon?.getLuck()) { const luckLabelText = addTextObject(141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); @@ -798,6 +796,13 @@ export default class SummaryUiHandler extends UiHandler { profileContainer.add(luckText); } + if (globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(this.pokemon)) { + const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); + teraIcon.setName("terrastallize-icon"); + teraIcon.setFrame(Type[this.pokemon.getTeraType()].toLowerCase()); + profileContainer.add(teraIcon); + } + this.abilityContainer = { labelImage: globalScene.add.image(0, 0, "summary_profile_ability"), ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? From 85f8c59036b9c7f0791fb4859d5746c7b648ff8c Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:11:46 -0500 Subject: [PATCH 110/171] [Balance] Paldean Gym Leader, E4, and other Tera-related trainer adjustments #5367 --- src/data/trainer-config.ts | 281 +++++++++++++++++++------------------ src/field/trainer.ts | 11 +- 2 files changed, 152 insertions(+), 140 deletions(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 1b646fc6478..b7d99ad7ef3 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -26,6 +26,9 @@ import { Gender } from "#app/data/gender"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; +/** The wave at which (non-Paldean) Gym Leaders start having Tera mons*/ +const GYM_LEADER_TERA_WAVE = 100; + export enum TrainerPoolTier { COMMON, UNCOMMON, @@ -211,8 +214,8 @@ export class TrainerAI { } /** - * Sets a pokemon on this AI to just instantly tera on first move used - * @param index The index of the pokemon to instantly tera + * Sets a pokemon on this AI to just instantly Tera on first move used + * @param index The index of the pokemon to instantly tera. */ public setInstantTera(index: number) { this.teraMode = TeraAIMode.INSTANT_TERA; @@ -251,7 +254,7 @@ export class TrainerConfig { public partyMemberFuncs: PartyMemberFuncs = {}; public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; - public specialtyTypes: Type[] = []; + public specialtyType: Type; public hasVoucher: boolean = false; public trainerAI: TrainerAI; @@ -583,8 +586,8 @@ export class TrainerConfig { return this; } - setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig { - this.specialtyTypes = specialtyTypes; + setSpecialtyType(specialtyType: Type): TrainerConfig { + this.specialtyType = specialtyType; return this; } @@ -594,18 +597,22 @@ export class TrainerConfig { } /** - * Sets random pokemon from the trainers team to instant tera. Uses their specialty types is they have one. - * @param count The amount of pokemon to have instant tera + * Sets random pokemon from the trainer's team to instant tera. Also sets Tera type to specialty type and checks for Shedinja as appropriate. + * @param count A callback (yucky) to see how many teras should be used + * @param slot Optional, a specified slot that should be terastallized. Wraps to match party size (-1 will get the last slot and so on). * @returns this */ - setRandomTeraModifiers(count: () => integer): TrainerConfig { + setRandomTeraModifiers(count: () => number, slot?: number): TrainerConfig { this.genAIFuncs.push((party: EnemyPokemon[]) => { - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === Type.BUG; // Better to check one time than 6 + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) + .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) + const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length - 1) : -1; // If we have a tera slot defined, wrap it to party size. for (let t = 0; t < Math.min(count(), party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); + const randomIndex = partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - if (this.specialtyTypes?.length) { - party[randomIndex].teraType = Utils.randSeedItem(this.specialtyTypes); + if (this.hasSpecialtyType()) { + party[randomIndex].teraType = this.specialtyType; } this.trainerAI.setInstantTera(randomIndex); } @@ -614,8 +621,8 @@ export class TrainerConfig { } /** - * Sets a specific pokemon to instant tera - * @param index The index within the team to have instant tera + * Sets a specific pokemon to instantly Tera + * @param index The index within the team to have instant Tera. * @returns this */ setInstantTera(index: number): TrainerConfig { @@ -779,12 +786,18 @@ export class TrainerConfig { * @param title The title of the evil team admin. * @param poolName The evil team the admin belongs to. * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param specialtyType The specialty Type of the admin, if they have one * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[],): TrainerConfig { + initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[], specialtyType?: Type): TrainerConfig { if (!getIsInitialized()) { initI18n(); } + + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpecialtyType(specialtyType); + } + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); // Set the species pools for the evil team admin. @@ -812,28 +825,16 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. - * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Stat Trainer. - * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param isMale Whether the stat trainer is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForStatTrainer(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForStatTrainer(isMale: boolean = false): TrainerConfig { if (!getIsInitialized()) { initI18n(); } this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); - signatureSpecies.forEach((speciesPool, s) => { - if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; - } - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setMoneyMultiplier(2); @@ -850,11 +851,11 @@ export class TrainerConfig { /** * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param {Type[]} specialtyTypes The specialty types for the evil team Leader. + * @param {Type} specialtyType The specialty type for the evil team Leader. * @param boolean Whether or not this is the rematch fight * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, specialtyType?: Type): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -869,9 +870,9 @@ export class TrainerConfig { } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); @@ -888,12 +889,14 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Gym Leader. - * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. - * @param {Type[]} specialtyTypes The specialty types for the Gym Leader. + * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). + * @param {Type} specialtyType The specialty type for the Gym Leader. + * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType: Type, ignoreMinTeraWave: boolean = false, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -912,11 +915,9 @@ export class TrainerConfig { this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // If specialty types are provided, set species filter and specialty types. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } + // If specialty type is provided, set species filter and specialty type. + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); @@ -935,7 +936,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setRandomTeraModifiers(() => globalScene.currentBattle.waveIndex >= 100 ? 1 : 0); + this.setRandomTeraModifiers(() => (ignoreMinTeraWave || globalScene.currentBattle.waveIndex >= GYM_LEADER_TERA_WAVE) ? 1 : 0, teraSlot); return this; } @@ -943,11 +944,12 @@ export class TrainerConfig { /** * Initializes the trainer configuration for an Elite Four member. * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Elite Four member. * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param specialtyType {Type} The specialty type for the Elite Four member. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType?: Type, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -966,10 +968,10 @@ export class TrainerConfig { this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // Set species filter and specialty types if provided, otherwise filter by base total. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); - this.setSpecialtyTypes(...specialtyTypes); + // Set species filter and specialty type if provided, otherwise filter by base total. + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); + this.setSpecialtyType(specialtyType); } else { this.setSpeciesFilter(p => p.baseTotal >= ELITE_FOUR_MINIMUM_BST); } @@ -991,7 +993,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_elite"); this.setVictoryBgm("victory_gym"); - this.setRandomTeraModifiers(() => 1); + this.setRandomTeraModifiers(() => 1, teraSlot); return this; } @@ -1142,6 +1144,14 @@ export class TrainerConfig { }); } + /** + * Helper function to check if a specialty type is set + * @returns true if specialtyType is defined and not Type.UNKNOWN + */ + hasSpecialtyType(): boolean { + return !Utils.isNullOrUndefined(this.specialtyType) && this.specialtyType !== Type.UNKNOWN; + } + /** * Creates a shallow copy of a trainer config so that it can be modified without affecting the {@link trainerConfigs} source map */ @@ -1183,9 +1193,7 @@ export class TrainerConfig { clone = this.speciesPools ? clone.setSpeciesPools(this.speciesPools) : clone; clone = this.speciesFilter ? clone.setSpeciesFilter(this.speciesFilter) : clone; - if (this.specialtyTypes) { - clone.specialtyTypes = this.specialtyTypes.slice(0); - } + clone.specialtyType = this.specialtyType; clone.encounterMessages = this.encounterMessages?.slice(0); clone.victoryMessages = this.victoryMessages?.slice(0); @@ -1352,28 +1360,28 @@ export const signatureSpecies: SignatureSpecies = { PIERS: [ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], MARNIE: [ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], RAIHAN: [ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], - KATY: [ Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS ], - BRASSIUS: [ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ], - IONO: [ Species.TADBULB, Species.WATTREL, Species.VOLTORB ], - KOFU: [ Species.VELUZA, Species.WIGLETT, Species.WINGULL ], - LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ], - RYME: [ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], - TULIP: [ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ], - GRUSHA: [ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ], - LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.ALOLA_SANDSLASH, Species.CLOYSTER ]], - BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.ALOLA_GOLEM, Species.GOLEM ]], + KATY: [ Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA ], // Tera Bug Teddiursa + BRASSIUS: [ Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV ], // Tera Grass Sudowoodo + IONO: [ Species.MISDREAVUS, Species.TADBULB, Species.WATTREL ], // Tera Ghost Misdreavus + KOFU: [ Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL ], // Tera Water Crabrawler + LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ], // Tera Normal Starly + RYME: [ Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], // Tera Ghost Toxel + TULIP: [ Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG ], // Tera Psychic Flabebe + GRUSHA: [ Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX ], // Tera Ice Swablu + LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.CLOYSTER, Species.ALOLA_SANDSLASH ]], + BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.GOLEM, Species.ALOLA_GOLEM ]], AGATHA: [ Species.GENGAR, [ Species.ARBOK, Species.WEEZING ], Species.CROBAT, Species.ALOLA_MAROWAK ], LANCE: [ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], WILL: [ Species.XATU, Species.JYNX, [ Species.SLOWBRO, Species.SLOWKING ], Species.EXEGGUTOR ], - KOGA: [[ Species.WEEZING, Species.MUK ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], + KOGA: [[ Species.MUK, Species.WEEZING ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], KAREN: [ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], SIDNEY: [[ Species.SHIFTRY, Species.CACTURNE ], [ Species.SHARPEDO, Species.CRAWDAUNT ], Species.ABSOL, Species.MIGHTYENA ], - PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.MISMAGIUS, Species.DRIFBLIM ]], + PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.DRIFBLIM, Species.MISMAGIUS ]], GLACIA: [ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], DRAKE: [ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], AARON: [[ Species.SCIZOR, Species.KLEAVOR ], Species.HERACROSS, [ Species.VESPIQUEN, Species.YANMEGA ], Species.DRAPION ], BERTHA: [ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], - FLINT: [[ Species.FLAREON, Species.RAPIDASH ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], + FLINT: [[ Species.RAPIDASH, Species.FLAREON ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], // Tera Fire Steelix or Lopunny LUCIAN: [ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [ Species.ALAKAZAM, Species.ESPEON ]], SHAUNTAL: [ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT ], MARSHAL: [ Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK ], @@ -1389,18 +1397,18 @@ export const signatureSpecies: SignatureSpecies = { ACEROLA: [[ Species.BANETTE, Species.DRIFBLIM ], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND ], KAHILI: [[ Species.BRAVIARY, Species.MANDIBUZZ ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, [ Species.TOXICROAK, Species.SCRAFTY ], Species.GRIMMSNARL ], - NESSA_ELITE: [ Species.GOLISOPOD, [ Species.PELIPPER, Species.QUAGSIRE ], Species.TOXAPEX, Species.DREDNAW ], + NESSA_ELITE: [ Species.GOLISOPOD, [ Species.QUAGSIRE, Species.PELIPPER ], Species.TOXAPEX, Species.DREDNAW ], BEA_ELITE: [ Species.HAWLUCHA, [ Species.GRAPPLOCT, Species.SIRFETCHD ], Species.FALINKS, Species.MACHAMP ], ALLISTER_ELITE: [ Species.DUSKNOIR, [ Species.POLTEAGEIST, Species.RUNERIGUS ], Species.CURSOLA, Species.GENGAR ], RAIHAN_ELITE: [ Species.GOODRA, [ Species.TORKOAL, Species.TURTONATOR ], Species.FLYGON, Species.ARCHALUDON ], - RIKA: [ Species.WHISCASH, [ Species.DONPHAN, Species.DUGTRIO ], Species.CAMERUPT, Species.CLODSIRE ], - POPPY: [ Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON ], - LARRY_ELITE: [ Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS ], - HASSEL: [ Species.NOIVERN, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.BAXCALIBUR ], - CRISPIN: [ Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN ], - AMARYS: [ Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS ], - LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.ALCREMIE, Species.GRANBULL ], Species.WHIMSICOTT ], - DRAYTON: [ Species.DRAGONITE, Species.ARCHALUDON, Species.HAXORUS, Species.SCEPTILE ], + RIKA: [ Species.CLODSIRE, [ Species.DUGTRIO, Species.DONPHAN ], Species.CAMERUPT, Species.WHISCASH ], // Tera Ground Clodsire + POPPY: [ Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH ], // Tera Steel Tinkaton + LARRY_ELITE: [ Species.FLAMIGO, Species.STARAPTOR, [ Species.ALTARIA, Species.TROPIUS ], Species.ORICORIO ], // Tera Flying Flamigo; random Oricorio + HASSEL: [ Species.BAXCALIBUR, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.NOIVERN ], // Tera Dragon Baxcalibur + CRISPIN: [ Species.BLAZIKEN, Species.MAGMORTAR, [ Species.CAMERUPT, Species.TALONFLAME ], Species.ROTOM ], // Tera Fire Blaziken; Heat Rotom + AMARYS: [ Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY ], // Tera Steel Metagross + LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.WHIMSICOTT, Species.ALCREMIE ], Species.GRANBULL ], // Tera Fairy Excadrill + DRAYTON: [ Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE ], // Tera Dragon Archaludon }; export const trainerConfigs: TrainerConfigs = { @@ -1421,7 +1429,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) + [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.FIGHTING) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], @@ -1461,7 +1469,7 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)), - [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER) + [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyType(Type.WATER) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], @@ -1469,7 +1477,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] }), - [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), + [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) @@ -1548,7 +1556,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), + [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyType(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) @@ -1654,27 +1662,27 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.MANKEY, Species.PAWNIARD, Species.CHARCADET, Species.FLITTLE, Species.VAROOM, Species.ORTHWORM ], [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.GIMMIGHOUL ] }), - [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ], Type.DARK).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Segin Starmobile p.moveset = [ new PokemonMove(Moves.WICKED_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ], Type.FIRE).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 2; // Schedar Starmobile p.moveset = [ new PokemonMove(Moves.BLAZING_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ], Type.POISON).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 3; // Navi Starmobile p.moveset = [ new PokemonMove(Moves.NOXIOUS_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ], Type.FAIRY).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 4; // Ruchbah Starmobile p.moveset = [ new PokemonMove(Moves.MAGICAL_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ], Type.FIGHTING).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 5; // Caph Starmobile p.moveset = [ new PokemonMove(Moves.COMBAT_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; @@ -1746,14 +1754,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE, true, -1).setMixedBattleBgm("battle_paldea_gym"), [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1768,7 +1776,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE, 3).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"), [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"), @@ -1788,14 +1796,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"), [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"), [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.NORMAL, Type.FLYING).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.FLYING, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_bb_elite"), [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ])) @@ -1815,7 +1823,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar [TrainerType.RED]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PIKACHU ], TrainerSlot.TRAINER, true, p => { p.formIndex = 8; // G-Max Pikachu @@ -1839,7 +1847,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.KINGDRA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AERODACTYL ])) @@ -1850,14 +1858,15 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.type1; + p.teraType = Type.DRAGON; + p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SKARMORY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CRADILY, Species.ARMALDO ])) @@ -1875,7 +1884,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.abilityIndex = 1; // Drizzle @@ -1898,7 +1907,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SPIRITOMB ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1921,7 +1930,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BOUFFALANT, Species.BRAVIARY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION ], TrainerSlot.TRAINER, true, p => { @@ -1944,7 +1953,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.DRUDDIGON ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ARCHEOPS ])) @@ -1966,7 +1975,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_kalos_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.HAWLUCHA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1979,7 +1988,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TYRANTRUM, Species.AURORUS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus - p.teraType = p.species.speciesId === Species.TYRANTRUM ? Type.DRAGON : Type.ICE; + p.teraType = p.species.type2!; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1991,7 +2000,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus [TrainerType.KUKUI]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kukui") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1999,7 +2008,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE, Species.ALOLA_NINETALES ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Therian Forms + p.formIndex = 1; // Therian Formes p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) @@ -2015,9 +2024,9 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.HISUI_DECIDUEYE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; - p.teraType = p.species.speciesId === Species.INCINEROAR ? Type.DARK : Type.FIGHTING; + p.teraType = p.species.type2!; })) - .setInstantTera(5), + .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2042,7 +2051,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2063,7 +2072,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragapult to Ghost or Dragon [TrainerType.MUSTARD]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_mustard") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2094,7 +2103,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; })) - .setInstantTera(2), + .setInstantTera(2), // Tera Psychic Galar-Slowbro / Galar-Slowking [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_geeta") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2113,7 +2122,7 @@ export const trainerConfigs: TrainerConfigs = { p.abilityIndex = 1; // Supreme Overlord p.teraType = Type.FLYING; })) - .setInstantTera(5), + .setInstantTera(5), // Tera Flying Kingambit [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_nemona") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.formIndex = 0; // Midday form @@ -2126,25 +2135,21 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GHOLDENGO ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.speciesId === Species.ARMAROUGE ? Type.PSYCHIC : Type.GHOST; + p.teraType = p.species.type2!; })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kieran") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.GRIMMSNARL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.INCINEROAR) { - p.abilityIndex = 2; // Intimidate - } else if (p.species.speciesId === Species.GRIMMSNARL) { - p.abilityIndex = 0; // Prankster - } + p.abilityIndex = p.species.speciesId === Species.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TERAPAGOS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2167,7 +2172,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Ogerpon [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) @@ -2198,7 +2203,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { @@ -2215,7 +2220,7 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; })) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { @@ -2240,7 +2245,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Rayquaza p.generateName(); })) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN ], TrainerSlot.TRAINER, true, p => { @@ -2638,7 +2643,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CRAWDAUNT, Species.HISUI_SAMUROTT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Sharpness Hisui Samurott, Adaptability Crawdaunt + p.abilityIndex = 2; // Sharpness Hisuian Samurott, Adaptability Crawdaunt })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2738,7 +2743,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.generateName(); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Fairy Sylveon [TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -2776,8 +2781,8 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setInstantTera(0), - [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) + .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2809,7 +2814,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer([], false) + [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BLISSEY ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2837,7 +2842,7 @@ export const trainerConfigs: TrainerConfigs = { } p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer([], false) + [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCANINE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2861,7 +2866,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer([], false) + [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2883,7 +2888,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer([], true) + [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUCARIO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 5bce08afae6..ab247716e15 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -416,14 +416,16 @@ export default class Trainer extends Phaser.GameObjects.Container { } } - if (!retry && this.config.specialtyTypes.length && !this.config.specialtyTypes.find(t => ret.isOfType(t))) { + // Prompts reroll of party member species if doesn't fit specialty type. + // Can be removed by adding a type parameter to getTrainerSpeciesForLevel and filtering the list of evolutions for that type. + if (!retry && this.config.hasSpecialtyType() && !ret.isOfType(this.config.specialtyType)) { retry = true; console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex)); console.log(ret.name); - if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { + if (ret.isOfType(this.config.specialtyType)) { retry = false; } } @@ -677,6 +679,11 @@ export default class Trainer extends Phaser.GameObjects.Container { }); } + /** + * Determines whether a Trainer should Terastallize their Pokemon + * @param pokemon {@linkcode EnemyPokemon} Trainer Pokemon in question + * @returns boolean Whether the EnemyPokemon should Terastalize this turn + */ shouldTera(pokemon: EnemyPokemon): boolean { if (this.config.trainerAI.teraMode === TeraAIMode.INSTANT_TERA) { if (!pokemon.isTerastallized && this.config.trainerAI.instantTeras.includes(pokemon.initialTeamIndex)) { From 035aed3e856c5811fe4397ece474c600f7fffeaa Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Thu, 27 Feb 2025 06:16:07 +1100 Subject: [PATCH 111/171] [Bug][UI] Fix arena flyout (#5421) --- src/ui-inputs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 951aec2a3b6..d5c4529470b 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -109,7 +109,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => undefined, [Button.CYCLE_ABILITY]: () => undefined, [Button.CYCLE_NATURE]: () => undefined, - [Button.CYCLE_TERA]: () => undefined, + [Button.CYCLE_TERA]: () => this.buttonInfo(false), [Button.SPEED_UP]: () => undefined, [Button.SLOW_DOWN]: () => undefined, }; From 905fec92e9655822d050b6062828237efb417245 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:39:08 -0800 Subject: [PATCH 112/171] [Bug] Fix Neutralizing Gas not Deactivating on Faint and Capture (#5423) --- src/data/ability.ts | 3 ++- test/abilities/neutralizing_gas.test.ts | 27 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index dcbaa4026f4..8c4b2ba380a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6877,7 +6877,8 @@ export function initAbilities() { .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr), + .attr(NoTransformAbilityAbAttr) + .bypassFaint(), new Ability(Abilities.PASTEL_VEIL, 8) .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index 8b9c374f1cc..a0612078e64 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -2,6 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; +import { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/testUtils/gameManager"; @@ -135,4 +136,30 @@ describe("Abilities - Neutralizing Gas", () => { expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); }); + it("should deactivate when the pokemon faints", async () => { + game.override.ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.NEUTRALIZING_GAS); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + game.move.select(Moves.SPLASH); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + await game.doKillOpponents(); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + + it("should deactivate upon catching a wild pokemon", async () => { + game.override + .battleType("single") + .enemyAbility(Abilities.NEUTRALIZING_GAS) + .ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + game.scene.pokeballCounts[PokeballType.MASTER_BALL] = 1; + game.doThrowPokeball(PokeballType.MASTER_BALL); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); }); From 13373a63912b35ab0f3bf830015a108c574eb108 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 26 Feb 2025 22:57:05 +0100 Subject: [PATCH 113/171] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20New=20loca?= =?UTF-8?q?les=20keys=20for=20standalone=20battle=20forms=20(#5386)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales | 2 +- src/data/pokemon-species.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales b/public/locales index ef43efffe5f..5e7fc5ef196 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit ef43efffe5fe454862c350f1b9393c3ad755bcc2 +Subproject commit 5e7fc5ef1968652f2335b17c354db62d8cbec314 diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 06704666153..c0ca9bf4b62 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -749,7 +749,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (this.speciesId === Species.ARCEUS) { ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); } else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) { - return i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: (append ? this.name : "") }); + return append ? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) : i18next.t(`pokemonForm:battleForm.${formKey}`); } else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here const i18key = `pokemonForm:${speciesName}${formText}`; if (i18next.exists(i18key)) { From de148277ea11aed28993675c7005e99a3e21409f Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 26 Feb 2025 19:14:15 -0500 Subject: [PATCH 114/171] [Balance] [Bug] Set trainer mons to forms matching specialty type (#5409) Co-authored-by: damocleas --- src/battle-scene.ts | 63 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 8205c1fcebc..996c3b0de87 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1865,6 +1865,58 @@ export default class BattleScene extends SceneBase { this.getCurrentPhase()?.constructor.name ?? "", ); + if ( // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. + !isEggPhase && + this.currentBattle?.battleType === BattleType.TRAINER && !isNullOrUndefined(this.currentBattle.trainer) && + this.currentBattle.trainer.config.hasSpecialtyType() + ) { + if (species.speciesId === Species.WORMADAM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.GROUND: + return 1; // Sandy Cloak + case Type.STEEL: + return 2; // Trash Cloak + case Type.GRASS: + return 0; // Plant Cloak + } + } else if (species.speciesId === Species.ROTOM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.FLYING: + return 4; // Fan Rotom + case Type.GHOST: + return 0; // Lightbulb Rotom + case Type.FIRE: + return 1; // Heat Rotom + case Type.GRASS: + return 5; // Mow Rotom + case Type.WATER: + return 2; // Wash Rotom + case Type.ICE: + return 3; // Frost Rotom + } + } else if (species.speciesId === Species.ORICORIO) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.GHOST: + return 3; // Sensu Style + case Type.FIRE: + return 0; // Baile Style + case Type.ELECTRIC: + return 1; // Pom-Pom Style + case Type.PSYCHIC: + return 2; // Pa'u Style + } + } else if (species.speciesId === Species.PALDEA_TAUROS) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.FIRE: + return 1; // Blaze Breed + case Type.WATER: + return 2; // Aqua Breed + } + } else if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { // Would probably never happen, but might as well + return this.currentBattle.trainer.config.specialtyType; + } + } + switch (species.speciesId) { case Species.UNOWN: case Species.SHELLOS: @@ -1872,8 +1924,6 @@ export default class BattleScene extends SceneBase { case Species.BASCULIN: case Species.DEERLING: case Species.SAWSBUCK: - case Species.FROAKIE: - case Species.FROGADIER: case Species.SCATTERBUG: case Species.SPEWPA: case Species.VIVILLON: @@ -1907,9 +1957,14 @@ export default class BattleScene extends SceneBase { return 0; // No Partner Eevee for Wave 12 Preschoolers } return Utils.randSeedInt(2); + case Species.FROAKIE: + case Species.FROGADIER: case Species.GRENINJA: - if (this.currentBattle?.battleType === BattleType.TRAINER) { - return 0; // Don't give trainers Battle Bond Greninja + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + !isEggPhase + ) { + return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier } return Utils.randSeedInt(2); case Species.URSHIFU: From d12aa635af223ce818c7b39e355dcb516b52730b Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 00:56:01 -0500 Subject: [PATCH 115/171] [Balance] Follow Cost Change from #5416 (#5430) --- src/data/balance/starters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index 10263f895b3..3468163c988 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -461,7 +461,7 @@ export const speciesStarterCosts = { [Species.GUZZLORD]: 6, [Species.NECROZMA]: 8, [Species.MAGEARNA]: 7, - [Species.MARSHADOW]: 7, + [Species.MARSHADOW]: 8, [Species.POIPOLE]: 8, [Species.STAKATAKA]: 6, [Species.BLACEPHALON]: 7, From 32ae72150f976b2c4f1e6affb9b2709c0e436587 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 27 Feb 2025 19:59:33 +0100 Subject: [PATCH 116/171] =?UTF-8?q?Pok=C3=A9mon=20Day=202025=20Event=20ban?= =?UTF-8?q?ners=20(#5432)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/events/pkmnday2025event-de.png | Bin 0 -> 24691 bytes public/images/events/pkmnday2025event-en.png | Bin 0 -> 21866 bytes public/images/events/pkmnday2025event-es-ES.png | Bin 0 -> 23815 bytes public/images/events/pkmnday2025event-fr.png | Bin 0 -> 24215 bytes public/images/events/pkmnday2025event-it.png | Bin 0 -> 24156 bytes public/images/events/pkmnday2025event-ja.png | Bin 0 -> 30374 bytes public/images/events/pkmnday2025event-ko.png | Bin 0 -> 25896 bytes public/images/events/pkmnday2025event-pt-BR.png | Bin 0 -> 24099 bytes public/images/events/pkmnday2025event-zh-CN.png | Bin 0 -> 29185 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/events/pkmnday2025event-de.png create mode 100644 public/images/events/pkmnday2025event-en.png create mode 100644 public/images/events/pkmnday2025event-es-ES.png create mode 100644 public/images/events/pkmnday2025event-fr.png create mode 100644 public/images/events/pkmnday2025event-it.png create mode 100644 public/images/events/pkmnday2025event-ja.png create mode 100644 public/images/events/pkmnday2025event-ko.png create mode 100644 public/images/events/pkmnday2025event-pt-BR.png create mode 100644 public/images/events/pkmnday2025event-zh-CN.png diff --git a/public/images/events/pkmnday2025event-de.png b/public/images/events/pkmnday2025event-de.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc535467528ae172ab8c7283afc1845c7f7c4b0 GIT binary patch literal 24691 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 H&QbpZqAcIM literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-ja.png b/public/images/events/pkmnday2025event-ja.png new file mode 100644 index 0000000000000000000000000000000000000000..94b02ad93a0d45cd764fc2d09f50a4ec93c7cfec GIT binary patch literal 30374 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 Sin{qG*~cnRl}i;Z-u@qa@nXmT literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-ko.png b/public/images/events/pkmnday2025event-ko.png new file mode 100644 index 0000000000000000000000000000000000000000..aed9ee3fb282f77ab92a3b4aec9807558d81ceb9 GIT binary patch literal 25896 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 z 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 D{DrZp literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-pt-BR.png b/public/images/events/pkmnday2025event-pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..2190bbac535875796c837a448fc419180d3e2e6e GIT binary patch literal 24099 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
    $1rX^xtfm-Xza89Sg$}!FitxkR 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 Date: Thu, 27 Feb 2025 20:05:37 +0100 Subject: [PATCH 117/171] [Sprite] Froakie static scuff (#5434) --- public/images/pokemon/656.png | Bin 507 -> 528 bytes public/images/pokemon/variant/656.json | 12 ++++++------ public/images/pokemon/variant/back/656.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png index 6acfe282dca78abc3dbe0bca782d1ef398c4fcb5..06a9cd58268d670587cbe7a090c7a3375d9110e8 100644 GIT binary patch delta 486 zcmVhOjJc$l+6$j5PQx4IckH=&E}k(#rXL6gM*a)>WIv}aLKYk z7e$i)|NkwS>^}ei01b3fPE-H?|NsC0|NsC0|Nj6z=pu#y00DbRL_t(IjfInqlEWYf zghAqO^Zw6!yP%0_uXjv46XM6J3z75Rko91Q^Veh{mJsu`34fl&-VjS7ive*b8zQaA zg$z&Rftd8xy12R%OqR?Mrjpejn+KRCfdBvh znVXTr0000BbW%=J|NsC0|NsC0|Nj6=PXY1(00C}EL_t(IjfIm7k^>56% z4d|%ZWS2@RqK}U)!TqmcE|hkEbS9z~ZEP#JhQ1+s0h1xIoPP~LYj}_z4h|%CJ0g3m z-I-|y;za8k(mo(vdI!YUTsG(BKw1-%iE!y@ej{}u^-o0P8`8ayLSC=eDAXZ#>cVzQ zQ4&CBsz_37&%!jNR{vaA+=xY?$zVQEuW8OiC;kLx0}+41Yaz^o*n(6W2nLgd9%DO| zOcWZ-Y4C<0w&XQT*)5lTy-*qS;kI;l8MpxC`5G#N%Gd|SFCV`Z7? z%&{RHr5Vg0m$sa56ay}1t_<^oH)L;mAbbOXTIg%u@a0#N6Y=|O2%OmwFN0))&`2Z4 zyj-pd#-2kE>KrAqcLi=^`R5ST&8zrG_r6%@oz zvTV)KVS73YxkqHGNZ$gg5tAb&`F)s(m{IGEPTQisA)EaG#Z4R++|&Y500000NkvXX Hu0mjf?_}7x diff --git a/public/images/pokemon/variant/656.json b/public/images/pokemon/variant/656.json index 68743a4c9f1..5037f86f22a 100644 --- a/public/images/pokemon/variant/656.json +++ b/public/images/pokemon/variant/656.json @@ -3,12 +3,12 @@ "838394": "4d7dc5", "62ace6": "8363af", "7bcdff": "9c75c2", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "7ab7ec", "c9b241": "97d6e2", - "dfcf77": "bae7e8", + "ccbd70": "bae7e8", "174592": "37408c", - "fdfdfd": "b1e5ff", + "f8f8f8": "b1e5ff", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", "396a83": "362864", @@ -18,12 +18,12 @@ "838394": "cc6845", "62ace6": "c44848", "7bcdff": "dd6155", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "f7c685", "c9b241": "97d6e2", - "dfcf77": "bae7e8", + "ccbd70": "bae7e8", "174592": "198158", - "fdfdfd": "fff4bd", + "f8f8f8": "fff4bd", "9c9cc5": "c96a48", "cdcde6": "f7b785", "396a83": "5c0d33", diff --git a/public/images/pokemon/variant/back/656.json b/public/images/pokemon/variant/back/656.json index 34b11bfab78..f41398f3154 100644 --- a/public/images/pokemon/variant/back/656.json +++ b/public/images/pokemon/variant/back/656.json @@ -1,17 +1,17 @@ { "1": { - "838394": "4d7dc5", + "848496": "4d7dc5", "7bcdff": "9c75c2", "62ace6": "8363af", "ffffff": "b1e5ff", "396a83": "362864", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", - "174592": "198158", + "174592": "37408c", "5a94cd": "7054a4" }, "2": { - "838394": "cc6845", + "848496": "cc6845", "7bcdff": "dd6155", "62ace6": "c44848", "ffffff": "fff4bd", From 02edfb673e6018adfe3c92fd175eb36fcac3a772 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 14:12:57 -0500 Subject: [PATCH 118/171] =?UTF-8?q?Data=20for=20possible=20Pok=C3=A9mon=20?= =?UTF-8?q?Day=202025=20Event=20(#5433)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modifier/modifier-type.ts | 2 +- src/timed-event-manager.ts | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 112a3c9aa35..ae8b9a45c0d 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2554,7 +2554,7 @@ export function getPartyLuckValue(party: Pokemon[]): number { return DailyLuck.value; } const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 3 : 0) : 0) + const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0) .reduce((total: number, value: number) => total += value, 0), 0, 14); return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index bebacf87ebc..c12f9d569c0 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -169,7 +169,7 @@ const timedEvents: TimedEvent[] = [ { species: Species.WOOBAT }, { species: Species.FRILLISH }, { species: Species.ALOMOMOLA }, - { species: Species.FURFROU, formIndex: 1 }, // Heart trim + { species: Species.FURFROU, formIndex: 1 }, // Heart Trim { species: Species.ESPURR }, { species: Species.SPRITZEE }, { species: Species.SWIRLIX }, @@ -180,6 +180,33 @@ const timedEvents: TimedEvent[] = [ { species: Species.ENAMORUS } ], luckBoostedSpecies: [ Species.LUVDISC ] + }, + { + name: "PKMNDAY2025", + eventType: EventType.LUCK, + startDate: new Date(Date.UTC(2025, 1, 27)), + endDate: new Date(Date.UTC(2025, 2, 4)), + classicFriendshipMultiplier: 4, + bannerKey: "pkmnday2025event-", + scale: 0.21, + availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + eventEncounters: [ + { species: Species.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.CHIKORITA }, + { species: Species.TOTODILE }, + { species: Species.TEPIG } + ], + luckBoostedSpecies: [ + Species.PICHU, Species.PIKACHU, Species.RAICHU, Species.ALOLA_RAICHU, + Species.PSYDUCK, Species.GOLDUCK, + Species.EEVEE, Species.FLAREON, Species.JOLTEON, Species.VAPOREON, Species.ESPEON, Species.UMBREON, Species.LEAFEON, Species.GLACEON, Species.SYLVEON, + Species.CHIKORITA, Species.BAYLEEF, Species.MEGANIUM, + Species.TOTODILE, Species.CROCONAW, Species.FERALIGATR, + Species.TEPIG, Species.PIGNITE, Species.EMBOAR, + Species.ZYGARDE, + Species.ETERNAL_FLOETTE + ] } ]; From 3124aeb810f7dd3bfe687b0b284c73ede304217a Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 14:59:24 -0500 Subject: [PATCH 119/171] [Misc] Event Banner Fix (#5435) --- src/loading-scene.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/loading-scene.ts b/src/loading-scene.ts index fc685fc2332..de1df784b2b 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -250,9 +250,9 @@ export class LoadingScene extends SceneBase { } const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; if (lang && availableLangs.includes(lang)) { - this.loadImage("valentines2025event-" + lang, "events"); + this.loadImage("pkmnday2025event-" + lang, "events"); } else { - this.loadImage("valentines2025event-en", "events"); + this.loadImage("pkmnday2025event-en", "events"); } this.loadAtlas("statuses", ""); From 922a17048c07b99c5b3d315c14f6ac68c7d4e936 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:50:46 +0100 Subject: [PATCH 120/171] [Bug] Save data migrator to fix starters with no selectable forms (#5425) Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- .../version_migration/versions/v1_7_0.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts index 2acb9d8151a..bdb9e6aab9f 100644 --- a/src/system/version_migration/versions/v1_7_0.ts +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -1,8 +1,29 @@ -import { getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import type { SessionSaveData } from "#app/system/game-data"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { globalScene } from "#app/global-scene"; +import { DexAttr, type SessionSaveData, type SystemSaveData } from "#app/system/game-data"; import * as Utils from "#app/utils"; -export const systemMigrators = [] as const; +export const systemMigrators = [ + /** + * If a starter is caught, but the only forms registered as caught are not starterSelectable, + * unlock the default form. + * @param data {@linkcode SystemSaveData} + */ + function migrateUnselectableForms(data: SystemSaveData) { + if (data.starterData && data.dexData) { + Object.keys(data.starterData).forEach(sd => { + const caughtAttr = data.dexData[sd]?.caughtAttr; + const species = getPokemonSpecies(Number(sd)); + if (caughtAttr && species.forms?.length > 1) { + const selectableForms = species.forms.filter((form, formIndex) => form.isStarterSelectable && (caughtAttr & globalScene.gameData.getFormAttr(formIndex))); + if (selectableForms.length === 0) { + data.dexData[sd].caughtAttr += DexAttr.DEFAULT_FORM; + } + } + }); + } + }, +] as const; export const settingsMigrators = [] as const; From 9ff20af8b7d86f6a6d656b78b67cbf7b38bd3e0c Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 09:13:35 +1100 Subject: [PATCH 121/171] [UI] Make fight cursor tera icon while tera-ing (#5402) Co-authored-by: damocleas Co-authored-by: Madmadness65 --- public/images/ui/cursor_tera.png | Bin 0 -> 253 bytes public/images/ui/legacy/cursor_tera.png | Bin 0 -> 262 bytes src/loading-scene.ts | 1 + src/ui/fight-ui-handler.ts | 4 +++- 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 public/images/ui/cursor_tera.png create mode 100644 public/images/ui/legacy/cursor_tera.png diff --git a/public/images/ui/cursor_tera.png b/public/images/ui/cursor_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..34cbe0958959da88b819c9b1f129e59b1d71810e GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uUY_j)~cCfr67fT^vI+g69S~3N^G+E}p8jB0L%+mh$DfK`n%1(6 z8&0lEvSho~cJJZ=ucAp$G?#8xSFMn`xN@(2xz6%U?4KTM?9f!$SbaIr^6>Y_w@Ys^ yq#8b-?eu)Tw@}d4UB-W>+i2fq+qs+V0PoflXZB9)_bvgtj=|H_&t;ucLK6UAH)56m literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/cursor_tera.png b/public/images/ui/legacy/cursor_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e77046137c64e4bb015ce419eecbb4ac00b246 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uLSEsD@VqP;j=Vi(`mJaPK5XzGed+mbo480}9^=e^Tj_ zsg!aLkqg;!QO{7b(@N+__RYwgME@mI_Wj;htC8}MmR`z(1D$~vkp-uLbJ{We{FYNkAQN}vatF}LW-V_#`_u;7S6_W)w z_#^M1F?eoxdchK%Z1bmoAK2UEx|jS{-9J}v?d`K?{N&~oew@^qbQ|bQ22WQ%mvv4F FO#q|#Vr>8b literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index de1df784b2b..183b38c49e5 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -101,6 +101,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_lock", "ui", "icon_lock.png"); this.loadImage("icon_stop", "ui", "icon_stop.png"); this.loadImage("icon_tera", "ui"); + this.loadImage("cursor_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); this.loadAtlas("button_tera", "ui"); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 1c1dceb24a5..8e8b197117c 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -226,7 +226,9 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } if (!this.cursorObj) { - this.cursorObj = globalScene.add.image(0, 0, "cursor"); + const isTera = this.fromCommand === Command.TERA; + this.cursorObj = globalScene.add.image(0, 0, isTera ? "cursor_tera" : "cursor"); + this.cursorObj.setScale(isTera ? 0.7 : 1); ui.add(this.cursorObj); } From 078c3d00ce4b800f33f632a426de85de3f9338e0 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 09:22:09 +1100 Subject: [PATCH 122/171] [UI][Enhancement] Implement keybind migrator (#5431) Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/inputs-controller.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index d382caf6cb6..392761cf8e4 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -564,6 +564,15 @@ export class InputsController { if (!this.configs[selectedDevice]) { this.configs[selectedDevice] = {}; } + // A proper way of handling migrating keybinds would be much better + const mappingOverrides = { + "BUTTON_CYCLE_VARIANT": "BUTTON_CYCLE_TERA", + }; + for (const key in mappingConfigs.custom) { + if (mappingConfigs.custom[key] in mappingOverrides) { + mappingConfigs.custom[key] = mappingOverrides[mappingConfigs.custom[key]]; + } + } this.configs[selectedDevice].custom = mappingConfigs.custom; } From 2b535622ac5c22377ce78beceb37ac063ee4f73a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 27 Feb 2025 15:33:01 -0800 Subject: [PATCH 123/171] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 5e7fc5ef196..b4534f03ba8 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 5e7fc5ef1968652f2335b17c354db62d8cbec314 +Subproject commit b4534f03ba8eb8709486ee967257b6f3725702dd From 9701f27c630e9a3cd5c111bc75562cc434519e25 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Thu, 27 Feb 2025 20:05:11 -0600 Subject: [PATCH 124/171] [Bug] [Hotfix] Remove Penny's Extra Zamazenta (#5439) Co-authored-by: damocleas --- package-lock.json | 4 ++-- package.json | 2 +- src/data/trainer-config.ts | 5 ----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 739ce18496d..4abfe1c0666 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.0", + "version": "1.7.1", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 5a191b3ec99..ca9cf8f2b27 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.0", + "version": "1.7.1", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index b7d99ad7ef3..a0158f28238 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2776,11 +2776,6 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) .setInstantTera(0), // Tera Fairy Sylveon [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { From 5941cfb001aa7f486184368612afd50ed39ae867 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Feb 2025 03:49:27 +0100 Subject: [PATCH 125/171] [Bug][Hotfix] Fix bug with transferring all items (#5440) --- package-lock.json | 4 ++-- package.json | 2 +- src/ui/party-ui-handler.ts | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4abfe1c0666..9e2c0d3a61b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.1", + "version": "1.7.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.1", + "version": "1.7.2", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index ca9cf8f2b27..418c22073c3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.1", + "version": "1.7.2", "type": "module", "scripts": { "start": "vite", diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 136f098df7e..0af94053ceb 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -422,7 +422,10 @@ export default class PartyUiHandler extends MessageUiHandler { if (option === PartyOption.TRANSFER) { if (this.transferCursor !== this.cursor) { if (this.transferAll) { - getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach((_, i) => (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, i, this.transferQuantitiesMax[i], this.cursor)); + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach((_, i, array) => { + const invertedIndex = array.length - 1 - i; + (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, invertedIndex, this.transferQuantitiesMax[invertedIndex], this.cursor); + }); } else { (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); } @@ -1187,7 +1190,6 @@ class PartySlot extends Phaser.GameObjects.Container { public slotHpText: Phaser.GameObjects.Text; public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them - private pokemonIcon: Phaser.GameObjects.Container; private iconAnimHandler: PokemonIconAnimHandler; @@ -1208,6 +1210,10 @@ class PartySlot extends Phaser.GameObjects.Container { } setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { + + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const offsetJa = currentLanguage === "ja"; + const battlerCount = globalScene.currentBattle.getBattlerCount(); const slotKey = `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`; @@ -1246,15 +1252,15 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY); - this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); + this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, (this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0)); this.slotName.setOrigin(0, 0); const slotLevelLabel = globalScene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(this.slotName, 8, 12); + slotLevelLabel.setPositionRelative(slotBg, (this.slotIndex >= battlerCount ? 21 : 24) + 8, (this.slotIndex >= battlerCount ? 2 : 10) + 12); slotLevelLabel.setOrigin(0, 0); const slotLevelText = addTextObject(0, 0, this.pokemon.level.toString(), this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); - slotLevelText.setPositionRelative(slotLevelLabel, 9, 0); + slotLevelText.setPositionRelative(slotLevelLabel, 9, offsetJa ? 1.5 : 0); slotLevelText.setOrigin(0, 0.25); slotInfoContainer.add([ this.slotName, slotLevelLabel, slotLevelText ]); @@ -1331,7 +1337,7 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotHpOverlay.setVisible(false); this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2); + this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2 + (offsetJa ? 2 : 0)); this.slotHpText.setOrigin(1, 0); this.slotHpText.setVisible(false); From b33ffb29b36a5bfa9d003a95daba7406314745a2 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 14:08:55 +1100 Subject: [PATCH 126/171] [Bug] Fix mycelium might softlock (#5441) --- package-lock.json | 4 ++-- package.json | 2 +- src/data/ability.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e2c0d3a61b..b74d12ecd35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.2", + "version": "1.7.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.2", + "version": "1.7.3", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 418c22073c3..de543ce2bf2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.2", + "version": "1.7.3", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/ability.ts b/src/data/ability.ts index 8c4b2ba380a..2b73fea60bc 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5054,7 +5054,7 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr { const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; const isCommandFight = turnCommand?.command === Command.FIGHT; const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - if (this.condition(pokemon, move!) && isCommandFight) { + if (isCommandFight && this.condition(pokemon, move!)) { bypassSpeed.value = false; canCheckHeldItems.value = false; return false; From 13429446d35dd42377b16ec76825ff3b6effc6f1 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 28 Feb 2025 01:18:58 -0500 Subject: [PATCH 127/171] [Bug] Fix tera slot wrapping (#5437) --- package-lock.json | 4 ++-- package.json | 2 +- src/data/trainer-config.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b74d12ecd35..c6dfdd7be04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.3", + "version": "1.7.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.3", + "version": "1.7.4", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index de543ce2bf2..19f64b56157 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.3", + "version": "1.7.4", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index a0158f28238..21b04c182e6 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -607,7 +607,7 @@ export class TrainerConfig { const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === Type.BUG; // Better to check one time than 6 const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) - const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length - 1) : -1; // If we have a tera slot defined, wrap it to party size. + const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length) : -1; // If we have a tera slot defined, wrap it to party size. for (let t = 0; t < Math.min(count(), party.length); t++) { const randomIndex = partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); From 942bcacb56a5e3d6364c408a124e09a16a6a4c23 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:22:22 +0100 Subject: [PATCH 128/171] =?UTF-8?q?[Bug][Hotfix]=20Restrict=20Use=20Candie?= =?UTF-8?q?s=20option=20in=20the=20Pok=C3=A9dex=20during=20Shop=20(#5446)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 4 ++-- package.json | 2 +- src/ui/pokedex-page-ui-handler.ts | 11 +++++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6dfdd7be04..d31469f4a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.4", + "version": "1.7.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.4", + "version": "1.7.5", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 19f64b56157..1953b886c80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.4", + "version": "1.7.5", "type": "module", "scripts": { "start": "vite", diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 99b25c3c383..49bb52dddbb 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -250,6 +250,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private availableVariants: number; private unlockedVariants: boolean[]; + private canUseCandies: boolean; + constructor() { super(Mode.POKEDEX_PAGE); } @@ -556,6 +558,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { show(args: any[]): boolean { + // Allow the use of candies if we are in one of the whitelisted phases + this.canUseCandies = [ "TitlePhase", "SelectStarterPhase", "CommandPhase" ].includes(globalScene.getCurrentPhase()?.constructor.name ?? ""); + if (args.length >= 1 && args[0] === "refresh") { return false; } else { @@ -1626,7 +1631,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } break; case Button.STATS: - if (!isCaught || !isFormCaught) { + if (!isCaught || !isFormCaught || !this.canUseCandies) { error = true; } else { const ui = this.getUi(); @@ -1888,7 +1893,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.isCaught()) { if (isFormCaught) { - this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + if (this.canUseCandies) { + this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + } if (this.canCycleShiny) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); } From 118bdcc49ea317785c8e67e7e62ee94fcbf7807a Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 01:15:11 +0100 Subject: [PATCH 129/171] =?UTF-8?q?[Bug][UI/UX]=20Never=20select=20invisib?= =?UTF-8?q?le=20containers=20in=20Pok=C3=A9dex=20(#5449)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index a18f138e4f7..02c19f11813 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -986,7 +986,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.updateScroll(); const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); - this.setCursor(Math.min(targetCol, numberOfStarters)); + this.setCursor(Math.min(targetCol, numberOfStarters - 1)); success = true; } break; @@ -1108,7 +1108,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if (currentRow < numOfRows - 1) { // not last row + if ((currentRow < numOfRows - 1) && (this.cursor + 9 < this.filteredPokemonData.length)) { // not last row if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon this.scrollCursor++; this.updateScroll(); From 7cc5f40af8f0b37fc2e790f8d23c9310b0f72907 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 01:55:22 +0100 Subject: [PATCH 130/171] =?UTF-8?q?[Bug][UI/UX]=20Restore=20egg/tm=20move?= =?UTF-8?q?=20and=20passive=20icons=20when=20using=20filters=20in=20Pok?= =?UTF-8?q?=C3=A9dex=20(#5450)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 02c19f11813..83739ba26a8 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1577,6 +1577,37 @@ export default class PokedexUiHandler extends MessageUiHandler { container.icon.setTint(0); } + if (data.eggMove1) { + container.eggMove1Icon.setVisible(true); + } else { + container.eggMove1Icon.setVisible(false); + } + if (data.eggMove2) { + container.eggMove2Icon.setVisible(true); + } else { + container.eggMove2Icon.setVisible(false); + } + if (data.tmMove1) { + container.tmMove1Icon.setVisible(true); + } else { + container.tmMove1Icon.setVisible(false); + } + if (data.tmMove2) { + container.tmMove2Icon.setVisible(true); + } else { + container.tmMove2Icon.setVisible(false); + } + if (data.passive1) { + container.passive1Icon.setVisible(true); + } else { + container.passive1Icon.setVisible(false); + } + if (data.passive2) { + container.passive2Icon.setVisible(true); + } else { + container.passive2Icon.setVisible(false); + } + if (this.showDecorations) { if (this.pokerusSpecies.includes(data.species)) { From b348626ec2257352dc758e5aecaf4dcdd153fff7 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 02:00:56 +0100 Subject: [PATCH 131/171] [Bug][UI/UX] Make candy icons show up again in starter select screen (#5451) --- src/ui/abstact-option-select-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 07e43a344dd..a462ed158cb 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -147,7 +147,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { itemIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemIcon); - this.optionSelectContainer.add(itemIcon); + this.optionSelectTextContainer.add(itemIcon); itemIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); @@ -156,7 +156,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { itemOverlayIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemOverlayIcon); - this.optionSelectContainer.add(itemOverlayIcon); + this.optionSelectTextContainer.add(itemOverlayIcon); itemOverlayIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); From d16197e950bbe59bf86976a5245a10a34c4c6af4 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 04:34:49 +0100 Subject: [PATCH 132/171] =?UTF-8?q?[Bug]=20Gendered=20forms=20display=20co?= =?UTF-8?q?rrect=20information=20in=20Pok=C3=A9dex=20(#5452)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 49bb52dddbb..e9060fb43b6 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -602,6 +602,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.battleForms = []; const species = this.species; + + let formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; + this.isFormGender = formKey === "male" || formKey === "female"; + if (this.isFormGender && ((this.savedStarterAttributes.female === true && formKey === "male") || (this.savedStarterAttributes.female === false && formKey === "female"))) { + this.formIndex = (this.formIndex + 1) % 2; + formKey = this.species.forms[this.formIndex].formKey; + } + const formIndex = this.formIndex ?? 0; this.starterId = this.getStarterSpeciesId(this.species.speciesId); @@ -635,12 +643,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.eggMoves = speciesEggMoves[this.starterId] ?? []; this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0); - const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; - this.isFormGender = formKey === "male" || formKey === "female"; - const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; const passives = starterPassiveAbilities[passiveId]; From 89e8085c39c4f193124b731b5ea26b12734a367d Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 05:22:51 +0100 Subject: [PATCH 133/171] =?UTF-8?q?[Bug]=20Display=20Pok=C3=A9mon=20name?= =?UTF-8?q?=20in=20Focus=20Punch=20lost=20focus=20message=20(#5448)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/move.ts | 2 +- test/moves/focus_punch.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 18f4b220911..11ce7069664 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -9384,7 +9384,7 @@ export function initMoves() { .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .attr(PreUseInterruptAttr, i18next.t("moveTriggers:lostFocus"), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .attr(PreUseInterruptAttr, (user, target, move) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => !!user.turnData.attacksReceived.find(r => r.damage)) .punchingMove(), new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) diff --git a/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts index 9bf858dfda5..1f14a19fbd7 100644 --- a/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -140,6 +140,6 @@ describe("Moves - Focus Punch", () => { await game.phaseInterceptor.to("MessagePhase", false); const consoleSpy = vi.spyOn(console, "log"); await game.phaseInterceptor.to("MoveEndPhase", true); - expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus")); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus", { pokemonName: "Charizard" })); }); }); From c7df847e661727c02bc0980337cd767f99dcb048 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 20:33:31 +0100 Subject: [PATCH 134/171] [Bug] Unlocking correct base form of Zygarde when captured (#5453) --- src/system/game-data.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 57e25325ba4..aefc583a98a 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1645,11 +1645,19 @@ export class GameData { } else if (formIndex === 3) { dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1); } - } - const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; - const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); - if (toCurrentFormChanges.length > 0) { - dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } else if (pokemon.species.speciesId === Species.ZYGARDE) { + if (formIndex === 4) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(2); + } else if (formIndex === 5) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(3); + } + } else { + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; + const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); + if (toCurrentFormChanges.length > 0) { + // Needs to do this or Castform can unlock the wrong form, etc. + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } } } From 5c73a1ea46033d011ef2f1884a2b41e9cd88d31b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:43:18 +0100 Subject: [PATCH 135/171] [Bug][UI/UX] Starter select screen now looks for and displays form-specific abilities (#5454) --- src/ui/starter-select-ui-handler.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 771554f18de..12dd668af39 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -8,6 +8,7 @@ import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { starterColors } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; +import type { Ability } from "#app/data/ability"; import { allAbilities } from "#app/data/ability"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; @@ -3364,7 +3365,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (dexEntry.caughtAttr) { - const ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + let ability: Ability; + if (this.lastSpecies.forms?.length > 1) { + ability = allAbilities[this.lastSpecies.forms[formIndex ?? 0].getAbility(abilityIndex!)]; + } 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); From 04ac5c376241b7026a244fff3faec429b1ade729 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:54:29 +0100 Subject: [PATCH 136/171] [Bug][UI/UX] Shiny button can cycle variants even if non-shiny form is uncaught (#5457) --- src/ui/pokedex-page-ui-handler.ts | 12 ++++++------ src/ui/starter-select-ui-handler.ts | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index e9060fb43b6..68df02c191d 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -1580,15 +1580,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = newVariant; // store the selected variant this.savedStarterAttributes.variant = starterAttributes.variant; - if (newVariant > props.variant) { - this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); - success = true; - } else { + if ((this.isCaught() & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); success = true; - starterAttributes.shiny = false; this.savedStarterAttributes.shiny = starterAttributes.shiny; + } else { + this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); + success = true; } } } @@ -2201,7 +2200,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - this.canCycleShiny = isNonShinyCaught && isShinyCaught; + const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 12dd668af39..543e24d3b97 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2068,20 +2068,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newVariant !== props.variant); starterAttributes.variant = newVariant; // store the selected variant - // If going to a higher variant, display that - if (newVariant > props.variant) { + if ((this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { + // If we have run out of variants, go back to non shiny + this.setSpeciesDetails(this.lastSpecies, { shiny: false, variant: 0 }); + this.pokemonShinyIcon.setVisible(false); + success = true; + starterAttributes.shiny = false; + } else { + // If going to a higher variant, or only shiny forms are caught, go to next variant this.setSpeciesDetails(this.lastSpecies, { variant: newVariant as Variant }); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant as Variant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); this.pokemonShinyIcon.setTint(tint); success = true; - // If we have run out of variants, go back to non shiny - } else { - this.setSpeciesDetails(this.lastSpecies, { shiny: false, variant: 0 }); - this.pokemonShinyIcon.setVisible(false); - success = true; - starterAttributes.shiny = false; } } } @@ -3328,7 +3328,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - this.canCycleShiny = isNonShinyCaught && isShinyCaught; + const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); From 8f280bec498568396662240231d487e64e61a9d4 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 22:11:05 +0100 Subject: [PATCH 137/171] [Bug][UI/UX] Restore V button in battle (#5459) --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 91367cf73ec..111464b5e5c 100644 --- a/index.html +++ b/index.html @@ -133,7 +133,7 @@ V

    -
    +
    V
    From b50d2c07834c0cab0b39ab90ca489fc3636f6677 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 22:24:15 +0100 Subject: [PATCH 138/171] =?UTF-8?q?[Bug][UI/UX]=20Fix=20bug=20in=20Pok?= =?UTF-8?q?=C3=A9dex=20for=20Mothim=20and=20other=20niche=20cases=20(#5458?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 68df02c191d..eee900d411e 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -789,6 +789,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; const caughtAttr = this.isCaught(species); + if (caughtAttr && (!species.forms.length || species.forms.length === 1)) { + return true; + } + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; return isFormCaught; } From 882b965da101c992e18752b22e77f203f8e9b9be Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 2 Mar 2025 02:46:38 +0100 Subject: [PATCH 139/171] [Bug] Pledge moves in summary do not break the game (#5461) --- src/data/move.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 11ce7069664..677ad9f0ebc 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5236,7 +5236,7 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { return false; } - const combinedPledgeMove = user.turnData.combiningPledge; + const combinedPledgeMove = user?.turnData?.combiningPledge; if (!combinedPledgeMove) { return false; } From 659bc82676ec23dd0193ce54ba459cff5c422084 Mon Sep 17 00:00:00 2001 From: damocleas Date: Sun, 2 Mar 2025 12:19:17 -0500 Subject: [PATCH 140/171] [i18n] Up version to 1.7.6, Update locales submodule --- package-lock.json | 4 ++-- package.json | 2 +- public/locales | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d31469f4a45..453a525581b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.5", + "version": "1.7.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.5", + "version": "1.7.6", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 1953b886c80..4c9204f60f9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.5", + "version": "1.7.6", "type": "module", "scripts": { "start": "vite", diff --git a/public/locales b/public/locales index b4534f03ba8..0e5c6096ba2 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit b4534f03ba8eb8709486ee967257b6f3725702dd +Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b From 73afb35c4d745d136287199225a04a6b8ea3db26 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 2 Mar 2025 12:40:40 -0600 Subject: [PATCH 141/171] [GitHub] Update CODEOWNERS to fix team ownership (#5465) --- .github/CODEOWNERS | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8e7606f0a48..79ab1bdc38a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,4 +4,19 @@ * @pagefaultgames/junior-dev-team # github actions/templates etc. - Dev Leads -/.github @pagefaultgames/dev-leads +/.github @pagefaultgames/senior-dev-team + +# Art Team +/public/**/*.png @pagefaultgames/art-team +/public/**/*.json @pagefaultgames/art-team +/public/images @pagefaultgames/art-team +/public/battle-anims @pagefaultgames/art-team + +# Audio files +*.mp3 @pagefaultgames/composer-team +*.wav @pagefaultgames/composer-team +*.ogg @pagefaultgames/composer-team +/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 From 6f686a05e39cb75c2ee110ab996b2b4ed0735cb0 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 2 Mar 2025 20:35:59 +0100 Subject: [PATCH 142/171] [UI/UX] [Bug] Hiding tera button when toggling on stats mode (#5466) --- src/ui/starter-select-ui-handler.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 543e24d3b97..34a29411de4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -3353,7 +3353,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; - this.canCycleTera = globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); + this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3858,12 +3858,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.showStats(); this.statsMode = true; this.pokemonSprite.setVisible(false); + this.teraIcon.setVisible(false); + this.canCycleTera = false; + this.updateInstructions(); } else { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(!!this.speciesStarterDexEntry?.caughtAttr); //@ts-ignore this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? + this.teraIcon.setVisible(globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); + const props = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const formIndex = props.formIndex; + this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(this.lastSpecies.speciesId, formIndex ?? 0).type2); + this.updateInstructions(); } } From 5e469620ef8ed098d22c79d279ecdfdbaed0ba22 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 2 Mar 2025 19:15:51 -0600 Subject: [PATCH 143/171] [Bug] Fix battle-anims crashing in certain cases (#5337) --- src/data/battle-anims.ts | 132 +++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 62 deletions(-) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index a179f3a3e9b..a42779563f2 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,7 +1,20 @@ import { globalScene } from "#app/global-scene"; -import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; +import { + AttackMove, + BeakBlastHeaderAttr, + DelayedAttackAttr, + MoveFlags, + SelfStatusMove, + allMoves, +} from "./move"; import type Pokemon from "../field/pokemon"; -import * as Utils from "../utils"; +import { + type nil, + getFrameMs, + getEnumKeys, + getEnumValues, + animationFileName, +} from "../utils"; import type { BattlerIndex } from "../battle"; import type { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; @@ -401,7 +414,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { if (Object.keys(tweenProps).length) { globalScene.tweens.add(Object.assign({ targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3) }, tweenProps)); } return this.duration * 2; @@ -437,7 +450,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { globalScene.tweens.add({ targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3) }); return this.duration * 2; @@ -455,8 +468,8 @@ export const encounterAnims = new Map(); export function initCommonAnims(): Promise { return new Promise(resolve => { - const commonAnimNames = Utils.getEnumKeys(CommonAnim); - const commonAnimIds = Utils.getEnumValues(CommonAnim); + const commonAnimNames = getEnumKeys(CommonAnim); + const commonAnimIds = getEnumValues(CommonAnim); const commonAnimFetches: Promise>[] = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; @@ -493,7 +506,7 @@ export function initMoveAnim(move: Moves): Promise { const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; const fetchAnimAndResolve = (move: Moves) => { - globalScene.cachedFetch(`./battle-anims/${Utils.animationFileName(move)}.json`) + globalScene.cachedFetch(`./battle-anims/${animationFileName(move)}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { @@ -550,7 +563,7 @@ function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) { * @remarks use {@linkcode useDefaultAnim} to use a default animation */ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { - const moveName = Utils.animationFileName(move); + const moveName = animationFileName(move); console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams); } @@ -560,7 +573,7 @@ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { */ export async function initEncounterAnims(encounterAnim: EncounterAnim | EncounterAnim[]): Promise { const anims = Array.isArray(encounterAnim) ? encounterAnim : [ encounterAnim ]; - const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); + const encounterAnimNames = getEnumKeys(EncounterAnim); const encounterAnimFetches: Promise>[] = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { @@ -922,7 +935,7 @@ export abstract class BattleAnim { let f = 0; globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(3), + duration: getFrameMs(3), repeat: anim?.frames.length ?? 0, onRepeat: () => { if (!f) { @@ -994,47 +1007,39 @@ export abstract class BattleAnim { const moveSprite = sprites[graphicIndex]; if (spritePriorities[graphicIndex] !== frame.priority) { spritePriorities[graphicIndex] = frame.priority; + /** Move the position that the moveSprite is rendered in based on the priority. + * @param priority The priority level to draw the sprite. + * - 0: Draw the sprite in front of the pokemon on the field. + * - 1: Draw the sprite in front of the user pokemon. + * - 2: Draw the sprite in front of its `bgSprite` (if it has one), or its + * `AnimFocus` (if that is user/target), otherwise behind everything. + * - 3: Draw the sprite behind its `AnimFocus` (if that is user/target), otherwise in front of everything. + */ const setSpritePriority = (priority: number) => { - switch (priority) { - case 0: - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, globalScene.getEnemyPokemon(false) ?? globalScene.getPlayerPokemon(false)!); // TODO: is this bang correct? - break; - case 1: - globalScene.field.moveTo(moveSprite, globalScene.field.getAll().length - 1); - break; - case 2: - switch (frame.focus) { - case AnimFocus.USER: - if (this.bgSprite) { - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); - } else { - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - } - break; - case AnimFocus.TARGET: - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - case 3: - switch (frame.focus) { - case AnimFocus.USER: - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - break; - case AnimFocus.TARGET: - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - default: - setSpritePriority(1); + /** The sprite we are moving the moveSprite in relation to */ + let targetSprite: Phaser.GameObjects.GameObject | nil; + /** The method that is being used to move the sprite.*/ + let moveFunc: ((sprite: Phaser.GameObjects.GameObject, target: Phaser.GameObjects.GameObject) => void) | + ((sprite: Phaser.GameObjects.GameObject) => void) = globalScene.field.bringToTop; + + if (priority === 0) { // Place the sprite in front of the pokemon on the field. + targetSprite = globalScene.getEnemyField().find(p => p) ?? globalScene.getPlayerField().find(p => p); + console.log(typeof targetSprite); + moveFunc = globalScene.field.moveBelow; + } else if (priority === 2 && this.bgSprite) { + moveFunc = globalScene.field.moveAbove; + targetSprite = this.bgSprite; + } else if (priority === 2 || priority === 3) { + moveFunc = priority === 2 ? globalScene.field.moveBelow : globalScene.field.moveAbove; + if (frame.focus === AnimFocus.USER) { + targetSprite = this.user; + } else if (frame.focus === AnimFocus.TARGET) { + targetSprite = this.target; + } } + // If target sprite is not undefined and exists in the field container, then move the sprite using the moveFunc. + // Otherwise, default to just bringing it to the top. + targetSprite && globalScene.field.exists(targetSprite) ? moveFunc.bind(globalScene.field)(moveSprite as Phaser.GameObjects.GameObject, targetSprite) : globalScene.field.bringToTop(moveSprite as Phaser.GameObjects.GameObject); }; setSpritePriority(frame.priority); } @@ -1052,11 +1057,13 @@ export abstract class BattleAnim { } } if (anim?.frameTimedEvents.has(f)) { - for (const event of anim.frameTimedEvents.get(f)!) { // TODO: is this bang correct? - r = Math.max((anim.frames.length - f) + event.execute(this), r); + const base = anim.frames.length - f; + // Bang is correct due to `has` check above, which cannot return true for an undefined / null `f` + for (const event of anim.frameTimedEvents.get(f)!) { + r = Math.max(base + event.execute(this), r); } } - const targets = Utils.getEnumValues(AnimFrameTarget); + const targets = getEnumValues(AnimFrameTarget); for (const i of targets) { const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; if (count < spriteCache[i].length) { @@ -1084,7 +1091,7 @@ export abstract class BattleAnim { } if (r) { globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(r), + duration: getFrameMs(r), onComplete: () => cleanUpAndComplete() }); } else { @@ -1166,7 +1173,7 @@ export abstract class BattleAnim { let existingFieldSprites = globalScene.field.getAll().slice(0); globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(3) * frameTimeMult, + duration: getFrameMs(3) * frameTimeMult, repeat: anim!.frames.length, onRepeat: () => { existingFieldSprites = globalScene.field.getAll().slice(0); @@ -1215,11 +1222,12 @@ export abstract class BattleAnim { } } if (anim?.frameTimedEvents.get(frameCount)) { + const base = anim.frames.length - frameCount; for (const event of anim.frameTimedEvents.get(frameCount)!) { - totalFrames = Math.max((anim.frames.length - frameCount) + event.execute(this, frameTimedEventPriority), totalFrames); + totalFrames = Math.max(base + event.execute(this, frameTimedEventPriority), totalFrames); } } - const targets = Utils.getEnumValues(AnimFrameTarget); + const targets = getEnumValues(AnimFrameTarget); for (const i of targets) { const count = graphicFrameCount; if (count < spriteCache[i].length) { @@ -1244,7 +1252,7 @@ export abstract class BattleAnim { } if (totalFrames) { globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(totalFrames), + duration: getFrameMs(totalFrames), onComplete: () => cleanUpAndComplete() }); } else { @@ -1342,15 +1350,15 @@ export class EncounterBattleAnim extends BattleAnim { } export async function populateAnims() { - const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); + const commonAnimNames = getEnumKeys(CommonAnim).map(k => k.toLowerCase()); const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); - const commonAnimIds = Utils.getEnumValues(CommonAnim) as CommonAnim[]; - const chargeAnimNames = Utils.getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); + const commonAnimIds = getEnumValues(CommonAnim) as CommonAnim[]; + const chargeAnimNames = getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, " ")); - const chargeAnimIds = Utils.getEnumValues(ChargeAnim) as ChargeAnim[]; + const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[]; const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; const moveNameToId = {}; - for (const move of Utils.getEnumValues(Moves).slice(1)) { + for (const move of getEnumValues(Moves).slice(1)) { const moveName = Moves[move].toUpperCase().replace(/\_/g, ""); moveNameToId[moveName] = move; } From cabcfcbd39968c01cb03e4e76288a716926687b1 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 3 Mar 2025 13:22:37 +1100 Subject: [PATCH 144/171] [Balance] Make megas/max player pokemon unable to tera (#5469) Co-authored-by: damocleas --- src/field/pokemon.ts | 14 ++++++++++++-- src/ui/command-ui-handler.ts | 5 ++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f0486a8f111..53d4b6c54d2 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1226,10 +1226,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it. * @param species the pokemon {@linkcode Species} to check + * @param formKey If provided, requires the species to be in that form * @returns `true` if the pokemon is the species or is fused with it, `false` otherwise */ - hasSpecies(species: Species): boolean { - return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + hasSpecies(species: Species, formKey?: string): boolean { + if (Utils.isNullOrUndefined(formKey)) { + return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + } + + return (this.species.speciesId === species && this.getFormKey() === formKey) || (this.fusionSpecies?.speciesId === species && this.getFusionFormKey() === formKey); } abstract isBoss(): boolean; @@ -3204,6 +3209,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return maxForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && maxForms.includes(this.getFusionFormKey()!)); } + isMega(): boolean { + const megaForms = [ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL ] as string[]; + return megaForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && megaForms.includes(this.getFusionFormKey()!)); + } + canAddTag(tagType: BattlerTagType): boolean { if (this.getTag(tagType)) { return false; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index f23cc78c9f7..20cffbbe30a 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -10,6 +10,7 @@ import { globalScene } from "#app/global-scene"; import { TerastallizeAccessModifier } from "#app/modifier/modifier"; import { Type } from "#app/enums/type"; import { getTypeRgb } from "#app/data/type"; +import { Species } from "#enums/species"; export enum Command { FIGHT = 0, @@ -180,9 +181,11 @@ export default class CommandUiHandler extends UiHandler { canTera(): boolean { const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; + const activePokemon = globalScene.getField()[this.fieldIndex]; + const isBlockedForm = activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra"); const currentTeras = globalScene.arena.playerTerasUsed; const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; - return hasTeraMod && (currentTeras + plannedTera) < 1; + return hasTeraMod && !isBlockedForm && (currentTeras + plannedTera) < 1; } toggleTeraButton() { From ff4184e23f99cd918ce867ea1577a040ea481e28 Mon Sep 17 00:00:00 2001 From: damocleas Date: Mon, 3 Mar 2025 19:33:53 -0500 Subject: [PATCH 145/171] [Balance] Make Pickup and Honey Gather Unsuppressable (#5476) --- src/data/ability.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 2b73fea60bc..37b97ffb5e6 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6186,7 +6186,8 @@ export function initAbilities() { .attr(ProtectStatAbAttr, Stat.ATK) .ignorable(), new Ability(Abilities.PICKUP, 3) - .attr(PostBattleLootAbAttr), + .attr(PostBattleLootAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) @@ -6378,7 +6379,8 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW), new Ability(Abilities.HONEY_GATHER, 4) - .attr(MoneyAbAttr), + .attr(MoneyAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.FRISK, 4) .attr(FriskAbAttr), new Ability(Abilities.RECKLESS, 4) From 6181afc6d2c311c569882306ed7c6478b69ebc85 Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 4 Mar 2025 08:40:04 +0800 Subject: [PATCH 146/171] [UI/UX] Make left button also go back to run history from run info (#5474) --- src/ui/run-info-ui-handler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index bf07374e21a..f1fe9ac8194 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -889,7 +889,7 @@ export default class RunInfoUiHandler extends UiHandler { /** * Takes input from the user to perform a desired action. * @param button - Button object to be processed - * Button.CANCEL - removes all containers related to RunInfo and returns the user to Run History + * Button.CANCEL, Button.LEFT - removes all containers related to RunInfo and returns the user to Run History * Button.CYCLE_FORM, Button.CYCLE_SHINY, Button.CYCLE_ABILITY - runs the function buttonCycleOption() */ override processInput(button: Button): boolean { @@ -900,6 +900,7 @@ export default class RunInfoUiHandler extends UiHandler { switch (button) { case Button.CANCEL: + case Button.LEFT: success = true; if (this.pageMode === RunInfoUiMode.MAIN) { this.runInfoContainer.removeAll(true); From c890b7ae46c36f2b97cff24e695482c693ea1b08 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:44:29 +0100 Subject: [PATCH 147/171] [Localization] [UI/UX] Added Spanish status icons (#5481) --- public/images/statuses_es-ES.png | Bin 441 -> 2321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/statuses_es-ES.png b/public/images/statuses_es-ES.png index d372b989be966007e5fccac5f54fe341457e598b..dc845d6fb1f2dcf09607bfce5af9f2b22a08a51f 100644 GIT binary patch literal 2321 zcmbVO3se+U7#>3t=~#&7I~WEE31(+zmwipFuCmBdt`cr8MX0kgv&+EFgPDN^(n`Zq zMo1nkGGB#{P-{&O2B`^|Cm%^#`GCyICwWQ@siZs|yUSybl|AR2nYnZCcmMzU|L?#5 znZ;StGloWtjesC%Xr|qk4c;TcZ4JL2JfrDnKLM{HlKoKyg6CtY4hn;B%%L^!pS1O|9krQlNDCn#j81?jO%f^l#fL*O2WT4+Hg2OYvWjx0D$ zlv!A>F`zV&qJ@oS4Pn5|+LUBiixWl+H)4bi#R(EOkUBHmcOk%=%y`Ib+tfZ^;LC#K ztExm|nBVW$_;ngl_F{zDY{qacrq!YVfhuK!N|mC564!6R#wxVTNh&7_aL^*<7K>F2 z0+{xOz)K;sg3^~JkT9&2k}yJp2Se%sGIR(h70bRJ=M0UpK9*+%RRLHcgq89|RaElD zzc3wI{+$DmT8AU#Tre7mOp{qk z6=kO=`uc^+>Zc5+rNI+ioWO{FCGjRWYok=wf@pEA9>ujNp?4BGQg0#&eNs?7ycg;a z8O~F7GZbj6cj7pyB}kp=cTi9;45d>42xe%~Bg#Al!sU3%%VLt?Mc_~p$u!X?%D^#T zr|V(iaFCgTqEZ6QX4)(Wh*-mM49S|!M!m^RqaFj3f@%#ZX4FlA+Vi*>#$d#0%Aoi3 z@3)C`aZuO({S4SonDhkeHtA5E(LUL&}-J8&jO== zBX=)M5k0D(lG({#kgb0xChV`MD^$tf6aRP8{h9bJi|@Y^?@KA2PYGTYG)W8zhJpp# zNv|N-AGPXPyQ%f`!$Cg_4nvI;e1uvtD*)3nXtaxWL~9`^EG*MD*_pHGJy)#sCLTE- ze{R1${_2KJQ4cSuH$7T*^`UbI4%Q?rO=z~wT3v5-!kfvL>`eR;tb0X!Mf{PqmsY&H z{2bfWmR#L1Zh-ZPf_<-#`~IHD<<=(;u6?fZLha*&8`uXJ*8ga;Yz2$6oVw7ucxMo;X#}~Z)z5uw5>h%1_yMVV6#548!xb)Ko9m34{CsHJ;Pj+NetO2|+m`#y>Di~V z423V+6N~xo&I#j2bv&~yyZWg^!Vu_-%7_Oae`iSLr>|u2PmF!(Ra<4OL&wW!7VZhOWbqrF26y5|W6F}6 zj{k6jP(B>_usqPZzUgx84tEW%9q{$KH@2SY=!_|UqZz- zjdySUW!L(T4=i%bnO$$2x+dfOfSg=h*K+jvVGHMf>9YQMPwQ~#n=85Xz7=mTyKrD_ zZEbmQI-9(rvD%d&#+Al&`5Nb5pk1E3{MB=wY} delta 406 zcmV;H0crk`61fAA8BPNL001eycjEv604-2VR7C&)0E9Mth_K+8!0@1;h_JAbxVRX= zV8FTQ>G}+I zIn7o0!+Dp;xZJZk++_QIf*BQ_vO9cL>_x7%KzeP1y+B2_I7G_xHE-s8-)5{aFy1?z zvW;$NS#fE(5J*QH>;TO#qj-;m3y@V^jDKUiXB4T~am+que5?h|bD2QvJlYc8%_G~a zG}z~@!Q2dSmt873PQXLUg+O|T!QM`p^A|K=@Suc&?b@)04>kGLv3=K17yh?|Mhx#G)+hhQwMYUUT0RT>1-XbQdPI;dWdHyG07*qoM6N<$f~F$9 Aw*UYD From 632caff2f3c286ec76c45adcf5f54d6bf7fc7684 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Thu, 6 Mar 2025 08:58:51 +1100 Subject: [PATCH 148/171] [Bug][Hotfix] Fix migration crash (#5482) --- package-lock.json | 4 ++-- package.json | 2 +- src/system/version_migration/versions/v1_7_0.ts | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 453a525581b..b1c7564a2ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.6", + "version": "1.7.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.6", + "version": "1.7.7", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 4c9204f60f9..4175ce899e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.6", + "version": "1.7.7", "type": "module", "scripts": { "start": "vite", diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts index bdb9e6aab9f..3dcff3af241 100644 --- a/src/system/version_migration/versions/v1_7_0.ts +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -13,7 +13,11 @@ export const systemMigrators = [ if (data.starterData && data.dexData) { Object.keys(data.starterData).forEach(sd => { const caughtAttr = data.dexData[sd]?.caughtAttr; - const species = getPokemonSpecies(Number(sd)); + const speciesNumber = Number(sd); + if (!speciesNumber) { // An unknown bug at some point in time caused some accounts to have starter data for pokedex number 0 which crashes + return; + } + const species = getPokemonSpecies(speciesNumber); if (caughtAttr && species.forms?.length > 1) { const selectableForms = species.forms.filter((form, formIndex) => form.isStarterSelectable && (caughtAttr & globalScene.gameData.getFormAttr(formIndex))); if (selectableForms.length === 0) { From 9544973f1f7edebab9bf993fb6424c17bb556514 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Wed, 5 Mar 2025 23:05:59 +0100 Subject: [PATCH 149/171] [Sprite] Gmax animation implementation + Palkia-Origin fix (#5468) --- public/exp-sprites.json | 48 +- public/images/pokemon/exp/484-origin.json | 2430 +++++------------ public/images/pokemon/exp/484-origin.png | Bin 17872 -> 8255 bytes public/images/pokemon/exp/569-gigantamax.json | 1478 ++++++++++ public/images/pokemon/exp/569-gigantamax.png | Bin 0 -> 11486 bytes public/images/pokemon/exp/815-gigantamax.json | 659 +++++ public/images/pokemon/exp/815-gigantamax.png | Bin 0 -> 32666 bytes public/images/pokemon/exp/839-gigantamax.json | 821 ++++++ public/images/pokemon/exp/839-gigantamax.png | Bin 0 -> 65284 bytes .../pokemon/exp/back/569-gigantamax.json | 1478 ++++++++++ .../pokemon/exp/back/569-gigantamax.png | Bin 0 -> 9183 bytes .../pokemon/exp/back/815-gigantamax.json | 659 +++++ .../pokemon/exp/back/815-gigantamax.png | Bin 0 -> 33861 bytes .../pokemon/exp/back/839-gigantamax.json | 821 ++++++ .../pokemon/exp/back/839-gigantamax.png | Bin 0 -> 49811 bytes .../exp/back/shiny/569-gigantamax.json | 1478 ++++++++++ .../pokemon/exp/back/shiny/569-gigantamax.png | Bin 0 -> 9188 bytes .../exp/back/shiny/815-gigantamax.json | 659 +++++ .../pokemon/exp/back/shiny/815-gigantamax.png | Bin 0 -> 33861 bytes .../exp/back/shiny/839-gigantamax.json | 821 ++++++ .../pokemon/exp/back/shiny/839-gigantamax.png | Bin 0 -> 49811 bytes .../images/pokemon/exp/shiny/484-origin.json | 2430 +++++------------ .../images/pokemon/exp/shiny/484-origin.png | Bin 17885 -> 8255 bytes .../pokemon/exp/shiny/569-gigantamax.json | 1478 ++++++++++ .../pokemon/exp/shiny/569-gigantamax.png | Bin 0 -> 11486 bytes .../pokemon/exp/shiny/815-gigantamax.json | 659 +++++ .../pokemon/exp/shiny/815-gigantamax.png | Bin 0 -> 32612 bytes .../pokemon/exp/shiny/839-gigantamax.json | 821 ++++++ .../pokemon/exp/shiny/839-gigantamax.png | Bin 0 -> 65284 bytes 29 files changed, 13278 insertions(+), 3462 deletions(-) create mode 100644 public/images/pokemon/exp/569-gigantamax.json create mode 100644 public/images/pokemon/exp/569-gigantamax.png create mode 100644 public/images/pokemon/exp/815-gigantamax.json create mode 100644 public/images/pokemon/exp/815-gigantamax.png create mode 100644 public/images/pokemon/exp/839-gigantamax.json create mode 100644 public/images/pokemon/exp/839-gigantamax.png create mode 100644 public/images/pokemon/exp/back/569-gigantamax.json create mode 100644 public/images/pokemon/exp/back/569-gigantamax.png create mode 100644 public/images/pokemon/exp/back/815-gigantamax.json create mode 100644 public/images/pokemon/exp/back/815-gigantamax.png create mode 100644 public/images/pokemon/exp/back/839-gigantamax.json create mode 100644 public/images/pokemon/exp/back/839-gigantamax.png create mode 100644 public/images/pokemon/exp/back/shiny/569-gigantamax.json create mode 100644 public/images/pokemon/exp/back/shiny/569-gigantamax.png create mode 100644 public/images/pokemon/exp/back/shiny/815-gigantamax.json create mode 100644 public/images/pokemon/exp/back/shiny/815-gigantamax.png create mode 100644 public/images/pokemon/exp/back/shiny/839-gigantamax.json create mode 100644 public/images/pokemon/exp/back/shiny/839-gigantamax.png create mode 100644 public/images/pokemon/exp/shiny/569-gigantamax.json create mode 100644 public/images/pokemon/exp/shiny/569-gigantamax.png create mode 100644 public/images/pokemon/exp/shiny/815-gigantamax.json create mode 100644 public/images/pokemon/exp/shiny/815-gigantamax.png create mode 100644 public/images/pokemon/exp/shiny/839-gigantamax.json create mode 100644 public/images/pokemon/exp/shiny/839-gigantamax.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 2bf8c2bf798..50e10a8822d 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -183,6 +183,8 @@ "487-origin", "531-mega", "531-mega", + "569-gigantamax", + "569-gigantamax", "6-mega", "6-mega", "6-mega-x", @@ -339,7 +341,6 @@ "6724", "673", "673", - "675", "675", "676", @@ -382,14 +383,12 @@ "692", "693", "693", - "695", "695", "696", "696", "697", "697", - "699", "699", "700", @@ -398,7 +397,6 @@ "701", "702", "702", - "704", "704", "705", @@ -697,6 +695,8 @@ "814", "815", "815", + "815-gigantamax", + "815-gigantamax", "816", "816", "817", @@ -747,6 +747,8 @@ "838", "839", "839", + "839-gigantamax", + "839-gigantamax", "840", "840", "841", @@ -1071,8 +1073,6 @@ "978-droopy", "978-stretchy", "978-stretchy", - "979", - "979", "980", "980", "981", @@ -1301,6 +1301,8 @@ "487b-origin", "531b-mega", "531b-mega", + "569b-gigantamax", + "569b-gigantamax", "6b-mega", "6b-mega", "6b-mega-x", @@ -1457,7 +1459,6 @@ "6724b", "673b", "673b", - "675b", "675b", "676b", @@ -1500,14 +1501,12 @@ "692b", "693b", "693b", - "695b", "695b", "696b", "696b", "697b", "697b", - "699b", "699b", "700b", @@ -1516,7 +1515,6 @@ "701b", "702b", "702b", - "704b", "704b", "705b", @@ -1815,6 +1813,8 @@ "814b", "815b", "815b", + "815b-gigantamax", + "815b-gigantamax", "816b", "816b", "817b", @@ -1865,6 +1865,8 @@ "838b", "839b", "839b", + "839b-gigantamax", + "839b-gigantamax", "840b", "840b", "841b", @@ -2191,8 +2193,6 @@ "978b-droopy", "978b-stretchy", "978b-stretchy", - "979b", - "979b", "980b", "980b", "981b", @@ -2421,6 +2421,8 @@ "487sb-origin", "531sb-mega", "531sb-mega", + "569sb-gigantamax", + "569sb-gigantamax", "6sb-mega", "6sb-mega", "6sb-mega-x", @@ -2577,7 +2579,6 @@ "6724sb", "673sb", "673sb", - "675sb", "675sb", "676sb", @@ -2620,14 +2621,12 @@ "692sb", "693sb", "693sb", - "695sb", "695sb", "696sb", "696sb", "697sb", "697sb", - "699sb", "699sb", "700sb", @@ -2636,7 +2635,6 @@ "701sb", "702sb", "702sb", - "704sb", "704sb", "705sb", @@ -2935,6 +2933,8 @@ "814sb", "815sb", "815sb", + "815sb-gigantamax", + "815sb-gigantamax", "816sb", "816sb", "817sb", @@ -2985,6 +2985,8 @@ "838sb", "839sb", "839sb", + "839sb-gigantamax", + "839sb-gigantamax", "840sb", "840sb", "841sb", @@ -3311,8 +3313,6 @@ "978sb-droopy", "978sb-stretchy", "978sb-stretchy", - "979sb", - "979sb", "980sb", "980sb", "981sb", @@ -3546,6 +3546,8 @@ "487s-origin", "531s-mega", "531s-mega", + "569s-gigantamax", + "569s-gigantamax", "6s-mega", "6s-mega", "6s-mega-x", @@ -3702,7 +3704,6 @@ "6724s", "673s", "673s", - "675s", "675s", "676s", @@ -3745,14 +3746,12 @@ "692s", "693s", "693s", - "695s", "695s", "696s", "696s", "697s", "697s", - "699s", "699s", "700s", @@ -3761,7 +3760,6 @@ "701s", "702s", "702s", - "704s", "704s", "705s", @@ -4060,6 +4058,8 @@ "814s", "815s", "815s", + "815s-gigantamax", + "815s-gigantamax", "816s", "816s", "817s", @@ -4110,6 +4110,8 @@ "838s", "839s", "839s", + "839s-gigantamax", + "839s-gigantamax", "840s", "840s", "841s", @@ -4436,8 +4438,6 @@ "978s-droopy", "978s-stretchy", "978s-stretchy", - "979s", - "979s", "980s", "980s", "981s", diff --git a/public/images/pokemon/exp/484-origin.json b/public/images/pokemon/exp/484-origin.json index f52359c264a..2b63fdd6785 100644 --- a/public/images/pokemon/exp/484-origin.json +++ b/public/images/pokemon/exp/484-origin.json @@ -4,8 +4,8 @@ "image": "484-origin.png", "format": "RGBA8888", "size": { - "w": 426, - "h": 426 + "w": 274, + "h": 274 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -35,20 +35,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -56,20 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -77,20 +77,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -98,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -119,146 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, "w": 91, - "h": 97 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 97 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 + "h": 95 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 + "h": 95 }, "frame": { "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 - }, - "frame": { - "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 + "h": 95 } }, { @@ -266,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -287,20 +161,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -308,20 +182,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -329,20 +203,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -350,20 +224,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -371,20 +245,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -392,20 +266,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -413,20 +287,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -434,20 +308,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -455,20 +329,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -476,20 +350,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -497,272 +371,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, + "w": 91, "h": 95 }, - "frame": { + "spriteSourceSize": { "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, - "h": 95 - }, - "frame": { - "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, "y": 1, - "w": 89, - "h": 95 + "w": 90, + "h": 94 }, "frame": { "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 89, - "h": 95 - }, - "frame": { - "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 + "y": 95, + "w": 90, + "h": 94 } }, { @@ -770,20 +392,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -791,20 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -812,20 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -833,20 +455,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -854,20 +476,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -875,20 +497,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -896,20 +518,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -917,20 +539,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -938,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -959,20 +581,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -980,20 +602,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -1001,272 +623,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, "w": 91, - "h": 92 + "h": 95 }, - "frame": { - "x": 275, - "y": 92, + "spriteSourceSize": { + "x": 0, + "y": 4, "w": 91, - "h": 92 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 + "h": 91 }, "frame": { "x": 90, - "y": 97, - "w": 89, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 90, - "y": 97, - "w": 89, - "h": 93 + "y": 0, + "w": 91, + "h": 91 } }, { @@ -1274,20 +644,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1295,20 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1316,20 +686,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1337,20 +707,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1358,20 +728,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1379,20 +749,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1400,20 +770,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1421,20 +791,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1442,20 +812,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1463,20 +833,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1484,20 +854,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1505,19 +875,229 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, + "h": 91 + }, + "frame": { + "x": 181, + "y": 0, + "w": 90, + "h": 91 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, "h": 92 }, "frame": { "x": 90, - "y": 190, - "w": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, "h": 92 } }, @@ -1526,20 +1106,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1547,20 +1127,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1568,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1589,20 +1169,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1610,20 +1190,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1631,20 +1211,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1652,20 +1232,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1673,20 +1253,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1694,20 +1274,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1715,20 +1295,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1736,20 +1316,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1757,62 +1337,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, + "w": 89, + "h": 91 + }, + "frame": { + "x": 90, + "y": 183, + "w": 89, + "h": 91 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, "w": 89, "h": 92 }, "frame": { - "x": 180, - "y": 182, + "x": 179, + "y": 91, "w": 89, "h": 92 } }, { - "filename": "0077.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 + "x": 2, + "y": 3, + "w": 89, + "h": 92 }, "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 - }, - "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 + "x": 179, + "y": 91, + "w": 89, + "h": 92 } }, { @@ -1820,20 +1400,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1841,20 +1421,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1862,20 +1442,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1883,20 +1463,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1904,20 +1484,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1925,608 +1505,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 79, - "h": 83 - }, - "frame": { - "x": 347, - "y": 274, - "w": 79, - "h": 83 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 0, - "y": 384, - "w": 27, - "h": 33 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 371, - "y": 54, - "w": 27, - "h": 33 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } } ] @@ -2535,6 +1527,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:52f94c22e7d6d2608638048866c1910a:045ab453153e084bad1f17ca61076c30:5ea3e660bc9c2624f846675d5196db82$" + "smartupdate": "$TexturePacker:SmartUpdate:4eec21f441df8c5ce7313596a1672a9e:bec666304c4bb8072e19fa13a830a7c8:5ea3e660bc9c2624f846675d5196db82$" } } diff --git a/public/images/pokemon/exp/484-origin.png b/public/images/pokemon/exp/484-origin.png index dbd6db55f7893e56a2975b67e3f0bc18d49764fa..2d8d0fde4724d585f802c03cf6f3f8329db2779f 100644 GIT binary patch literal 8255 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 Bi5dU^ diff --git a/public/images/pokemon/exp/569-gigantamax.json b/public/images/pokemon/exp/569-gigantamax.json new file mode 100644 index 00000000000..6cda2b0d79a --- /dev/null +++ b/public/images/pokemon/exp/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 419, "h": 261 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/569-gigantamax.png b/public/images/pokemon/exp/569-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..90decc0ad84dfc538489b5b630563f24da2364f7 GIT binary patch literal 11486 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/815-gigantamax.json b/public/images/pokemon/exp/815-gigantamax.json new file mode 100644 index 00000000000..d8fb9d62e57 --- /dev/null +++ b/public/images/pokemon/exp/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 258, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 267, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 268, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 426, "y": 389, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 82, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 341, "y": 389, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 84, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 167, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 195, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 265, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 1, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 353, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 510, "y": 389, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 169, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 355, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 443, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 174, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 388, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 335, "y": 483, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/815-gigantamax.png b/public/images/pokemon/exp/815-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..4720e564c092db71fd8aeec94a12e922a1889651 GIT binary patch literal 32666 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 JYGK2G{|AD@b5{TW literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/839-gigantamax.json b/public/images/pokemon/exp/839-gigantamax.json new file mode 100644 index 00000000000..15a7c122f5d --- /dev/null +++ b/public/images/pokemon/exp/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 454, "y": 470, "w": 86, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 379, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 573, "y": 285, "w": 91, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 91, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 93, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 390, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 585, "y": 96, "w": 94, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 94, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 293, "y": 95, "w": 97, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 97, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 484, "y": 190, "w": 96, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 96, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 92, "y": 286, "w": 92, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 92, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 177, "y": 471, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 89, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 379, "w": 91, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 91, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 184, "y": 286, "w": 91, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 91, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 480, "y": 282, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 281, "y": 281, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 293, "y": 188, "w": 95, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 587, "y": 0, "w": 95, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 95, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 491, "y": 95, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 190, "w": 93, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 93, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 388, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 285, "w": 92, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 92, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 374, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 374, "y": 286, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 365, "y": 380, "w": 89, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 89, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 553, "y": 380, "w": 89, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 89, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 540, "y": 473, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 268, "y": 468, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 87, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 355, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 475, "w": 85, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 85, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 692, "h": 664 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/839-gigantamax.png b/public/images/pokemon/exp/839-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..5a614b0c895bb237d0a38c374708a72ce216703d GIT binary patch literal 65284 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%0AOdMtk#fe0VOC^|N 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/569-gigantamax.json b/public/images/pokemon/exp/back/569-gigantamax.json new file mode 100644 index 00000000000..b266f5eb799 --- /dev/null +++ b/public/images/pokemon/exp/back/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 413, "h": 281 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/569-gigantamax.png b/public/images/pokemon/exp/back/569-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..13bbe97bee4d30fcf08215eccde867b3eb7a03ab GIT binary patch literal 9183 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/815-gigantamax.json b/public/images/pokemon/exp/back/815-gigantamax.json new file mode 100644 index 00000000000..952ea16b6b8 --- /dev/null +++ b/public/images/pokemon/exp/back/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 444, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 289, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 525, "y": 288, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 83, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 485, "w": 79, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 79, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 84, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 356, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 268, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 354, "y": 194, "w": 84, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 84, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 255, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 423, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 1, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 506, "y": 481, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 250, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 339, "y": 291, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 167, "y": 386, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 440, "y": 288, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 414, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/815-gigantamax.png b/public/images/pokemon/exp/back/815-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..0036d75cbfcd323c67f61ee70e6a73e3b1d1cba5 GIT binary patch literal 33861 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

    }-cD{Kp` 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 Mp00i_>zopr0Du-n3;+NC literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/shiny/569-gigantamax.json b/public/images/pokemon/exp/back/shiny/569-gigantamax.json new file mode 100644 index 00000000000..b266f5eb799 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 413, "h": 281 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/569-gigantamax.png b/public/images/pokemon/exp/back/shiny/569-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..2322fc2321e7e01ad0d153c27d2d63c243609b50 GIT binary patch literal 9188 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 mH!ZlGwgs}xlL literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/back/shiny/815-gigantamax.json b/public/images/pokemon/exp/back/shiny/815-gigantamax.json new file mode 100644 index 00000000000..952ea16b6b8 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 444, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 289, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 525, "y": 288, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 83, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 485, "w": 79, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 79, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 84, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 356, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 268, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 354, "y": 194, "w": 84, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 84, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 255, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 423, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 1, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 506, "y": 481, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 250, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 339, "y": 291, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 167, "y": 386, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 440, "y": 288, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 414, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/815-gigantamax.png b/public/images/pokemon/exp/back/shiny/815-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..0668fd3b0656c2f82f197f9ae6f4e2b9164ca8ed GIT binary patch literal 33861 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

    ( - phaseFilter: (phase: P) => boolean, - ): P | undefined { + findPhase

    (phaseFilter: (phase: P) => boolean): P | undefined { return this.phaseQueue.find(phaseFilter) as P; } - tryReplacePhase( - phaseFilter: (phase: Phase) => boolean, - phase: Phase, - ): boolean { + tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { const phaseIndex = this.phaseQueue.findIndex(phaseFilter); if (phaseIndex > -1) { this.phaseQueue[phaseIndex] = phase; @@ -3122,24 +2845,18 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase( - phase: Phase | Phase[], - targetPhase: Constructor, - ): boolean { + prependToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { if (!Array.isArray(phase)) { - phase = [ phase ]; + phase = [phase]; } - const targetIndex = this.phaseQueue.findIndex( - (ph) => ph instanceof targetPhase, - ); + const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1) { this.phaseQueue.splice(targetIndex, 0, ...phase); return true; - } else { - this.unshiftPhase(...phase); - return false; } + this.unshiftPhase(...phase); + return false; } /** @@ -3148,24 +2865,18 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase( - phase: Phase | Phase[], - targetPhase: Constructor, - ): boolean { + appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { if (!Array.isArray(phase)) { - phase = [ phase ]; + phase = [phase]; } - const targetIndex = this.phaseQueue.findIndex( - (ph) => ph instanceof targetPhase, - ); + const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { this.phaseQueue.splice(targetIndex + 1, 0, ...phase); return true; - } else { - this.unshiftPhase(...phase); - return false; } + this.unshiftPhase(...phase); + return false; } /** @@ -3215,10 +2926,8 @@ export default class BattleScene extends SceneBase { const waveIndex = this.currentBattle.waveIndex; const waveSetIndex = Math.ceil(waveIndex / 10) - 1; const moneyValue = - Math.pow( - (waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, - 1 + 0.005 * waveSetIndex, - ) * moneyMultiplier; + Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * + moneyMultiplier; return Math.floor(moneyValue / 10) * 10; } @@ -3249,9 +2958,7 @@ export default class BattleScene extends SceneBase { this.playSound(soundName); } } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier( - modifier.type.tier, - ); + const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); this.queueMessage( i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, @@ -3261,13 +2968,7 @@ export default class BattleScene extends SceneBase { false, 3000, ); - return this.addModifier( - defaultModifierType.newModifier(), - ignoreUpdate, - playSound, - false, - instant, - ); + return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant); } for (const rm of modifiersToRemove) { @@ -3290,23 +2991,14 @@ export default class BattleScene extends SceneBase { if (modifier instanceof PokemonHpRestoreModifier) { if (!(modifier as PokemonHpRestoreModifier).fainted) { const hpRestoreMultiplier = new Utils.NumberHolder(1); - this.applyModifiers( - HealingBoosterModifier, - true, - hpRestoreMultiplier, - ); + this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); args.push(hpRestoreMultiplier.value); } else { args.push(1); } } else if (modifier instanceof FusePokemonModifier) { - args.push( - this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon, - ); - } else if ( - modifier instanceof RememberMoveModifier && - !Utils.isNullOrUndefined(cost) - ) { + args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); + } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { args.push(cost); } @@ -3316,9 +3008,9 @@ export default class BattleScene extends SceneBase { } } - this.party.map((p) => p.updateInfo(instant)); + this.party.map(p => p.updateInfo(instant)); } else { - const args = [ this ]; + const args = [this]; if (modifier.shouldApply(...args)) { const result = modifier.apply(...args); success ||= result; @@ -3328,12 +3020,8 @@ export default class BattleScene extends SceneBase { return success; } - addEnemyModifier( - modifier: PersistentModifier, - ignoreUpdate?: boolean, - instant?: boolean, - ): Promise { - return new Promise((resolve) => { + addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { + return new Promise(resolve => { const modifiersToRemove: PersistentModifier[] = []; if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { if (modifier instanceof PokemonFormChangeItemModifier) { @@ -3373,10 +3061,10 @@ export default class BattleScene extends SceneBase { itemModifier: PokemonHeldItemModifier, target: Pokemon, playSound: boolean, - transferQuantity: number = 1, + transferQuantity = 1, instant?: boolean, ignoreUpdate?: boolean, - itemLost: boolean = true, + itemLost = true, ): boolean { const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; const cancelled = new Utils.BooleanHolder(false); @@ -3392,10 +3080,7 @@ export default class BattleScene extends SceneBase { const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; newItemModifier.pokemonId = target.id; const matchingModifier = this.findModifier( - (m) => - m instanceof PokemonHeldItemModifier && - m.matchType(itemModifier) && - m.pokemonId === target.id, + m => m instanceof PokemonHeldItemModifier && m.matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer(), ) as PokemonHeldItemModifier; @@ -3419,35 +3104,21 @@ export default class BattleScene extends SceneBase { const removeOld = itemModifier.stackCount === 0; - if ( - !removeOld || - !source || - this.removeModifier(itemModifier, !source.isPlayer()) - ) { + if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { const addModifier = () => { - if ( - !matchingModifier || - this.removeModifier(matchingModifier, !target.isPlayer()) - ) { + if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { if (target.isPlayer()) { - this.addModifier( - newItemModifier, - ignoreUpdate, - playSound, - false, - instant, - ); - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - return true; - } else { - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant); if (source && itemLost) { applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); } return true; } + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); + } + return true; } return false; }; @@ -3463,12 +3134,10 @@ export default class BattleScene extends SceneBase { } removePartyMemberModifiers(partyMemberIndex: number): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { const pokemonId = this.getPlayerParty()[partyMemberIndex].id; const modifiersToRemove = this.modifiers.filter( - (m) => - m instanceof PokemonHeldItemModifier && - (m as PokemonHeldItemModifier).pokemonId === pokemonId, + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId, ); for (const m of modifiersToRemove) { this.modifiers.splice(this.modifiers.indexOf(m), 1); @@ -3478,19 +3147,13 @@ export default class BattleScene extends SceneBase { }); } - generateEnemyModifiers( - heldModifiersConfigs?: HeldModifierConfig[][], - ): Promise { - return new Promise((resolve) => { + generateEnemyModifiers(heldModifiersConfigs?: HeldModifierConfig[][]): Promise { + return new Promise(resolve => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); } - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty( - this.currentBattle.waveIndex, - ); - const isFinalBoss = this.gameMode.isWaveFinal( - this.currentBattle.waveIndex, - ); + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); + const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); let chances = Math.ceil(difficultyWaveIndex / 10); if (isFinalBoss) { chances = Math.ceil(chances * 2.5); @@ -3506,12 +3169,8 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { - if ( - heldModifiersConfigs && - i < heldModifiersConfigs.length && - heldModifiersConfigs[i] - ) { - heldModifiersConfigs[i].forEach((mt) => { + if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i]) { + for (const mt of heldModifiersConfigs[i]) { let modifier: PokemonHeldItemModifier; if (mt.modifier instanceof PokemonHeldItemModifierType) { modifier = mt.modifier.newModifier(enemyPokemon); @@ -3520,15 +3179,13 @@ export default class BattleScene extends SceneBase { modifier.pokemonId = enemyPokemon.id; } modifier.stackCount = mt.stackCount ?? 1; - modifier.isTransferable = - mt.isTransferable ?? modifier.isTransferable; + modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable; this.addEnemyModifier(modifier, true); - }); + } } else { const isBoss = enemyPokemon.isBoss() || - (this.currentBattle.battleType === BattleType.TRAINER && - !!this.currentBattle.trainer?.config.isBoss); + (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -3548,14 +3205,10 @@ export default class BattleScene extends SceneBase { getEnemyModifierTypesForWave( difficultyWaveIndex, count, - [ enemyPokemon ], - this.currentBattle.battleType === BattleType.TRAINER - ? ModifierPoolType.TRAINER - : ModifierPoolType.WILD, + [enemyPokemon], + this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance, - ).map((mt) => - mt.newModifier(enemyPokemon).add(this.enemyModifiers, false), - ); + ).map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false)); } return true; }); @@ -3568,9 +3221,7 @@ export default class BattleScene extends SceneBase { * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type */ clearEnemyModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter( - (m) => m instanceof PersistentModifier, - ); + const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } @@ -3584,9 +3235,7 @@ export default class BattleScene extends SceneBase { */ clearEnemyHeldItemModifiers(pokemon?: Pokemon): void { const modifiersToRemove = this.enemyModifiers.filter( - (m) => - m instanceof PokemonHeldItemModifier && - (!pokemon || m.getPokemon() === pokemon), + m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon() === pokemon), ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); @@ -3596,13 +3245,11 @@ export default class BattleScene extends SceneBase { } setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map((m) => m.setVisible(visible)); + [this.modifierBar, this.enemyModifierBar].map(m => m.setVisible(visible)); } - updateModifiers(player: boolean = true, instant?: boolean): void { - const modifiers = player - ? this.modifiers - : (this.enemyModifiers as PersistentModifier[]); + updateModifiers(player = true, instant?: boolean): void { + const modifiers = player ? this.modifiers : (this.enemyModifiers as PersistentModifier[]); for (let m = 0; m < modifiers.length; m++) { const modifier = modifiers[m]; if ( @@ -3625,22 +3272,17 @@ export default class BattleScene extends SceneBase { } } - this.updatePartyForModifiers( - player ? this.getPlayerParty() : this.getEnemyParty(), - instant, - ); - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers( - modifiers, - ); + this.updatePartyForModifiers(player ? this.getPlayerParty() : this.getEnemyParty(), instant); + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); if (!player) { this.updateUIPositions(); } } updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { Promise.allSettled( - party.map((p) => { + party.map(p => { p.calculateStats(); return p.updateInfo(instant); }), @@ -3656,10 +3298,7 @@ export default class BattleScene extends SceneBase { * @param enemy If `true`, remove an item owned by the enemy. If `false`, remove an item owned by the player. Default is `false`. * @returns `true` if the item exists and was successfully removed, `false` otherwise. */ - removeModifier( - modifier: PersistentModifier, - enemy: boolean = false, - ): boolean { + removeModifier(modifier: PersistentModifier, enemy = false): boolean { const modifiers = !enemy ? this.modifiers : this.enemyModifiers; const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { @@ -3682,13 +3321,8 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that matched `modifierType`. */ - getModifiers( - modifierType: Constructor, - player: boolean = true, - ): T[] { - return (player ? this.modifiers : this.enemyModifiers).filter( - (m): m is T => m instanceof modifierType, - ); + getModifiers(modifierType: Constructor, player = true): T[] { + return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); } /** @@ -3697,13 +3331,8 @@ export default class BattleScene extends SceneBase { * @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that passed the `modifierFilter` function */ - findModifiers( - modifierFilter: ModifierPredicate, - isPlayer: boolean = true, - ): PersistentModifier[] { - return (isPlayer ? this.modifiers : this.enemyModifiers).filter( - modifierFilter, - ); + findModifiers(modifierFilter: ModifierPredicate, isPlayer = true): PersistentModifier[] { + return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter); } /** @@ -3712,10 +3341,7 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed */ - findModifier( - modifierFilter: ModifierPredicate, - player: boolean = true, - ): PersistentModifier | undefined { + findModifier(modifierFilter: ModifierPredicate, player = true): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter); } @@ -3728,7 +3354,7 @@ export default class BattleScene extends SceneBase { */ applyShuffledModifiers( modifierType: Constructor, - player: boolean = true, + player = true, ...args: Parameters ): T[] { let modifiers = (player ? this.modifiers : this.enemyModifiers).filter( @@ -3736,15 +3362,12 @@ export default class BattleScene extends SceneBase { ); this.executeWithSeedOffset( () => { - const shuffleModifiers = (mods) => { + const shuffleModifiers = mods => { if (mods.length < 1) { return mods; } const rand = Utils.randSeedInt(mods.length); - return [ - mods[rand], - ...shuffleModifiers(mods.filter((_, i) => i !== rand)), - ]; + return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; }; modifiers = shuffleModifiers(modifiers); }, @@ -3763,7 +3386,7 @@ export default class BattleScene extends SceneBase { */ applyModifiers( modifierType: Constructor, - player: boolean = true, + player = true, ...args: Parameters ): T[] { const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( @@ -3798,7 +3421,7 @@ export default class BattleScene extends SceneBase { */ applyModifier( modifierType: Constructor, - player: boolean = true, + player = true, ...args: Parameters ): T | null { const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( @@ -3817,35 +3440,26 @@ export default class BattleScene extends SceneBase { triggerPokemonFormChange( pokemon: Pokemon, formChangeTriggerType: Constructor, - delayed: boolean = false, - modal: boolean = false, + delayed = false, + modal = false, ): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { // in case this is NECROZMA, determine which forms this - const matchingFormChangeOpts = pokemonFormChanges[ - pokemon.species.speciesId - ].filter( - (fc) => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), + const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter( + fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), ); let matchingFormChange: SpeciesFormChange | null; - if ( - pokemon.species.speciesId === Species.NECROZMA && - matchingFormChangeOpts.length > 1 - ) { + if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. const formChangeItemModifiers = ( this.findModifiers( - (m) => - m instanceof PokemonFormChangeItemModifier && - m.pokemonId === pokemon.id, + m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id, ) as PokemonFormChangeItemModifier[] ) - .filter((m) => m.active) - .map((m) => m.formChangeItem); + .filter(m => m.active) + .map(m => m.formChangeItem); - matchingFormChange = formChangeItemModifiers.includes( - FormChangeItem.N_LUNARIZER, - ) + matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? matchingFormChangeOpts[0] : formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? matchingFormChangeOpts[1] @@ -3860,11 +3474,7 @@ export default class BattleScene extends SceneBase { } else { phase = new QuietFormChangePhase(pokemon, matchingFormChange); } - if ( - pokemon instanceof PlayerPokemon && - !matchingFormChange.quiet && - modal - ) { + if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { this.overridePhase(phase); } else if (delayed) { this.pushPhase(phase); @@ -3882,13 +3492,9 @@ export default class BattleScene extends SceneBase { pokemon: Pokemon, battleAnimType: PokemonAnimType, fieldAssets?: Phaser.GameObjects.Sprite[], - delayed: boolean = false, + delayed = false, ): boolean { - const phase: Phase = new PokemonAnimPhase( - battleAnimType, - pokemon, - fieldAssets, - ); + const phase: Phase = new PokemonAnimPhase(battleAnimType, pokemon, fieldAssets); if (delayed) { this.pushPhase(phase); } else { @@ -3898,9 +3504,7 @@ export default class BattleScene extends SceneBase { } validateAchvs(achvType: Constructor, ...args: unknown[]): void { - const filteredAchvs = Object.values(achvs).filter( - (a) => a instanceof achvType, - ); + const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); for (const achv of filteredAchvs) { this.validateAchv(achv, args); } @@ -3908,8 +3512,7 @@ export default class BattleScene extends SceneBase { validateAchv(achv: Achv, args?: unknown[]): boolean { if ( - (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || - Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && + (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && achv.validate(args) ) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); @@ -3924,10 +3527,7 @@ export default class BattleScene extends SceneBase { } validateVoucher(voucher: Voucher, args?: unknown[]): boolean { - if ( - !this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && - voucher.validate(args) - ) { + if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; @@ -3944,19 +3544,19 @@ export default class BattleScene extends SceneBase { biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", wave: this.currentBattle?.waveIndex ?? 0, party: this.party - ? this.party.map((p) => { - return { - name: p.name, - form: p.getFormKey(), - types: p.getTypes().map((type) => PokemonType[type]), - teraType: PokemonType[p.getTeraType()], - isTerastallized: p.isTerastallized, - level: p.level, - currentHP: p.hp, - maxHP: p.getMaxHp(), - status: p.status?.effect ? StatusEffect[p.status.effect] : "", - }; - }) + ? this.party.map(p => { + return { + name: p.name, + form: p.getFormKey(), + types: p.getTypes().map(type => PokemonType[type]), + teraType: PokemonType[p.getTeraType()], + isTerastallized: p.isTerastallized, + level: p.level, + currentHP: p.hp, + maxHP: p.getMaxHp(), + status: p.status?.effect ? StatusEffect[p.status.effect] : "", + }; + }) : [], modeChain: this.ui?.getModeChain() ?? [], }; @@ -3973,7 +3573,7 @@ export default class BattleScene extends SceneBase { const keys: string[] = []; let activePokemon: (PlayerPokemon | EnemyPokemon)[] = this.getPlayerParty(); activePokemon = activePokemon.concat(this.getEnemyParty()); - activePokemon.forEach((p) => { + for (const p of activePokemon) { keys.push(p.getSpriteKey(true)); if (p instanceof PlayerPokemon) { keys.push(p.getBattleSpriteKey(true, true)); @@ -3982,7 +3582,7 @@ export default class BattleScene extends SceneBase { if (p.fusionSpecies) { keys.push(p.fusionSpecies.getCryKey(p.fusionFormIndex)); } - }); + } return keys; } @@ -3991,34 +3591,23 @@ export default class BattleScene extends SceneBase { * @param pokemon The (enemy) pokemon */ initFinalBossPhaseTwo(pokemon: Pokemon): void { - if ( - pokemon instanceof EnemyPokemon && - pokemon.isBoss() && - !pokemon.formIndex && - pokemon.bossSegmentIndex < 1 - ) { + if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { this.fadeOutBgm(Utils.fixedInt(2000), false); this.ui.showDialogue( battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { - const finalBossMBH = getModifierType( - modifierTypes.MINI_BLACK_HOLE, - ).newModifier(pokemon) as TurnHeldItemTransferModifier; + const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier( + pokemon, + ) as TurnHeldItemTransferModifier; finalBossMBH.setTransferrableFalse(); this.addEnemyModifier(finalBossMBH, false, true); pokemon.generateAndPopulateMoveset(1); this.setFieldScale(0.75); - this.triggerPokemonFormChange( - pokemon, - SpeciesFormChangeManualTrigger, - false, - ); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); this.currentBattle.double = true; - const availablePartyMembers = this.getPlayerParty().filter((p) => - p.isAllowedInBattle(), - ); + const availablePartyMembers = this.getPlayerParty().filter(p => p.isAllowedInBattle()); if (availablePartyMembers.length > 1) { this.pushPhase(new ToggleDoublePositionPhase(true)); if (!availablePartyMembers[1].isOnField()) { @@ -4048,22 +3637,15 @@ export default class BattleScene extends SceneBase { useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set, ): void { - const participantIds = - pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; + const participantIds = pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; const party = this.getPlayerParty(); - const expShareModifier = this.findModifier( - (m) => m instanceof ExpShareModifier, - ) as ExpShareModifier; - const expBalanceModifier = this.findModifier( - (m) => m instanceof ExpBalanceModifier, - ) as ExpBalanceModifier; + const expShareModifier = this.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; + const expBalanceModifier = this.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; const multipleParticipantExpBonusModifier = this.findModifier( - (m) => m instanceof MultipleParticipantExpBonusModifier, + m => m instanceof MultipleParticipantExpBonusModifier, ) as MultipleParticipantExpBonusModifier; - const nonFaintedPartyMembers = party.filter((p) => p.hp); - const expPartyMembers = nonFaintedPartyMembers.filter( - (p) => p.level < this.getMaxExpLevel(), - ); + const nonFaintedPartyMembers = party.filter(p => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.getMaxExpLevel()); const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue if (useWaveIndexMultiplier) { @@ -4073,31 +3655,19 @@ export default class BattleScene extends SceneBase { if (participantIds.size > 0) { if ( this.currentBattle.battleType === BattleType.TRAINER || - this.currentBattle.mysteryEncounter?.encounterMode === - MysteryEncounterMode.TRAINER_BATTLE + this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE ) { expValue = Math.floor(expValue * 1.5); - } else if ( - this.currentBattle.isBattleMysteryEncounter() && - this.currentBattle.mysteryEncounter - ) { - expValue = Math.floor( - expValue * this.currentBattle.mysteryEncounter.expMultiplier, - ); + } else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) { + expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier); } for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; const participated = participantIds.has(pId); if (participated && pokemonDefeated) { partyMember.addFriendship(FRIENDSHIP_GAIN_FROM_BATTLE); - const machoBraceModifier = partyMember - .getHeldItems() - .find((m) => m instanceof PokemonIncrementingStatModifier); - if ( - machoBraceModifier && - machoBraceModifier.stackCount < - machoBraceModifier.getMaxStackCount() - ) { + const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); + if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount()) { machoBraceModifier.stackCount++; this.updateModifiers(true, true); partyMember.updateInfo(); @@ -4114,12 +3684,10 @@ export default class BattleScene extends SceneBase { if (participated) { expMultiplier += 1 / participantIds.size; if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { - expMultiplier += - multipleParticipantExpBonusModifier.getStackCount() * 0.2; + expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; } } else if (expShareModifier) { - expMultiplier += - (expShareModifier.getStackCount() * 0.2) / participantIds.size; + expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; } if (partyMember.pokerus) { expMultiplier *= 1.5; @@ -4128,12 +3696,7 @@ export default class BattleScene extends SceneBase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.applyModifiers( - PokemonExpBoosterModifier, - true, - partyMember, - pokemonExp, - ); + this.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -4154,9 +3717,7 @@ export default class BattleScene extends SceneBase { } }); - const splitExp = Math.floor( - totalExp / recipientExpPartyMemberIndexes.length, - ); + const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); expPartyMembers.forEach((_partyMember, pm) => { partyMemberExp[pm] = Phaser.Math.Linear( @@ -4187,12 +3748,8 @@ export default class BattleScene extends SceneBase { * Even if returns `true`, does not guarantee that a wave will actually be a ME. * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. */ - isMysteryEncounterValidForWave( - battleType: BattleType, - waveIndex: number, - ): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = - this.gameMode.getMysteryEncounterLegalWaves(); + isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { + const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves(); return ( this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && @@ -4209,45 +3766,32 @@ export default class BattleScene extends SceneBase { * @param newBattleType * @param waveIndex */ - private isWaveMysteryEncounter( - newBattleType: BattleType, - waveIndex: number, - ): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = - this.gameMode.getMysteryEncounterLegalWaves(); + private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { + const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves(); if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor - const sessionEncounterRate = - this.mysteryEncounterSaveData.encounterSpawnChance; + const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well) // Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET // Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256 const expectedEncountersByFloor = - (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / - (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * + (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * (waveIndex - lowestMysteryEncounterWave); - const currentRunDiffFromAvg = - expectedEncountersByFloor - encounteredEvents.length; + const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length; const favoredEncounterRate = sessionEncounterRate + - Math.min( - currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, - MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2, - ); + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); - const successRate = isNullOrUndefined( - Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE, - ) + const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME const canSpawn = encounteredEvents.length === 0 || - waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > - 3 || + waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > 3 || !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); if (canSpawn) { @@ -4272,10 +3816,7 @@ export default class BattleScene extends SceneBase { * @param canBypass optional boolean to indicate that the request is coming from a function that needs to access a Mystery Encounter outside of gameplay requirements * @returns */ - getMysteryEncounter( - encounterType?: MysteryEncounterType, - canBypass?: boolean, - ): MysteryEncounter { + getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter | null; if ( @@ -4290,9 +3831,7 @@ export default class BattleScene extends SceneBase { encounter = allMysteryEncounters[encounterType ?? -1]; return encounter; } else { - encounter = !isNullOrUndefined(encounterType) - ? allMysteryEncounters[encounterType] - : null; + encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null; } // Check for queued encounters first @@ -4302,10 +3841,7 @@ export default class BattleScene extends SceneBase { this.mysteryEncounterSaveData.queuedEncounters.length > 0 ) { let i = 0; - while ( - i < this.mysteryEncounterSaveData.queuedEncounters.length && - !!encounter - ) { + while (i < this.mysteryEncounterSaveData.queuedEncounters.length && !!encounter) { const candidate = this.mysteryEncounterSaveData.queuedEncounters[i]; const forcedChance = candidate.spawnPercent; if (Utils.randSeedInt(100) < forcedChance) { @@ -4331,22 +3867,20 @@ export default class BattleScene extends SceneBase { ]; // Adjust tier weights by previously encountered events to lower odds of only Common/Great in run - this.mysteryEncounterSaveData.encounteredEvents.forEach( - (seenEncounterData) => { - if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { - tierWeights[0] = tierWeights[0] - 6; - } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { - tierWeights[1] = tierWeights[1] - 4; - } - }, - ); + // biome-ignore format: biome sucks at formatting this line + for (const seenEncounterData of this.mysteryEncounterSaveData.encounteredEvents) { + if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { + tierWeights[0] = tierWeights[0] - 6; + } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { + tierWeights[1] = tierWeights[1] - 4; + } + } const totalWeight = tierWeights.reduce((a, b) => a + b); const tierValue = Utils.randSeedInt(totalWeight); const commonThreshold = totalWeight - tierWeights[0]; const greatThreshold = totalWeight - tierWeights[0] - tierWeights[1]; - const ultraThreshold = - totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; + const ultraThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON @@ -4363,29 +3897,22 @@ export default class BattleScene extends SceneBase { let availableEncounters: MysteryEncounter[] = []; const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.length > 0 - ? this.mysteryEncounterSaveData.encounteredEvents[ - this.mysteryEncounterSaveData.encounteredEvents.length - 1 - ].type + ? this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1] + .type : null; - const disabledEncounters = - this.eventManager.getEventMysteryEncountersDisabled(); + const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); const biomeMysteryEncounters = - mysteryEncountersByBiome - .get(this.arena.biomeType) - ?.filter((enc) => !disabledEncounters.includes(enc)) ?? []; + mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters - .filter((encounterType) => { + .filter(encounterType => { const encounterCandidate = allMysteryEncounters[encounterType]; if (!encounterCandidate) { return false; } if ( - this.eventManager.getMysteryEncounterTierForEvent( - encounterType, - encounterCandidate.encounterTier, - ) !== tier + this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier ) { return false; } @@ -4398,14 +3925,11 @@ export default class BattleScene extends SceneBase { return false; } if (this.gameMode.modeId === GameModes.CHALLENGE) { - const disallowedChallenges = - encounterCandidate.disallowedChallenges; + const disallowedChallenges = encounterCandidate.disallowedChallenges; if ( disallowedChallenges && disallowedChallenges.length > 0 && - this.gameMode.challenges.some((challenge) => - disallowedChallenges.includes(challenge.id), - ) + this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id)) ) { return false; } @@ -4413,25 +3937,21 @@ export default class BattleScene extends SceneBase { if (!encounterCandidate.meetsRequirements()) { return false; } - if ( - previousEncounter !== null && - encounterType === previousEncounter - ) { + if (previousEncounter !== null && encounterType === previousEncounter) { return false; } if ( this.mysteryEncounterSaveData.encounteredEvents.length > 0 && encounterCandidate.maxAllowedEncounters && encounterCandidate.maxAllowedEncounters > 0 && - this.mysteryEncounterSaveData.encounteredEvents.filter( - (e) => e.type === encounterType, - ).length >= encounterCandidate.maxAllowedEncounters + this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= + encounterCandidate.maxAllowedEncounters ) { return false; } return true; }) - .map((m) => allMysteryEncounters[m]); + .map(m => allMysteryEncounters[m]); // Decrement tier if (tier === MysteryEncounterTier.ROGUE) { tier = MysteryEncounterTier.ULTRA; @@ -4446,13 +3966,10 @@ export default class BattleScene extends SceneBase { // If absolutely no encounters are available, spawn 0th encounter if (availableEncounters.length === 0) { - console.log( - "No Mystery Encounters found, falling back to Mysterious Challengers.", - ); + console.log("No Mystery Encounters found, falling back to Mysterious Challengers."); return allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS]; } - encounter = - availableEncounters[Utils.randSeedInt(availableEncounters.length)]; + encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(); diff --git a/src/battle.ts b/src/battle.ts index 242954a3729..5ada921bf5a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -50,7 +50,7 @@ export enum BattleType { WILD, TRAINER, CLEAR, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, } export enum BattlerIndex { @@ -58,25 +58,25 @@ export enum BattlerIndex { PLAYER, PLAYER_2, ENEMY, - ENEMY_2 + ENEMY_2, } export interface TurnCommand { - command: Command; - cursor?: number; - move?: TurnMove; - targets?: BattlerIndex[]; - skip?: boolean; - args?: any[]; + command: Command; + cursor?: number; + move?: TurnMove; + targets?: BattlerIndex[]; + skip?: boolean; + args?: any[]; } export interface FaintLogEntry { - pokemon: Pokemon, - turn: number + pokemon: Pokemon; + turn: number; } interface TurnCommands { - [key: number]: TurnCommand | null + [key: number]: TurnCommand | null; } export default class Battle { @@ -89,19 +89,19 @@ export default class Battle { public enemyParty: EnemyPokemon[] = []; public seenEnemyPartyMemberIds: Set = new Set(); public double: boolean; - public started: boolean = false; - public enemySwitchCounter: number = 0; - public turn: number = 0; + public started = false; + public enemySwitchCounter = 0; + public turn = 0; public preTurnCommands: TurnCommands; public turnCommands: TurnCommands; public playerParticipantIds: Set = new Set(); - public battleScore: number = 0; + public battleScore = 0; public postBattleLoot: PokemonHeldItemModifier[] = []; - public escapeAttempts: number = 0; + public escapeAttempts = 0; public lastMove: Moves; public battleSeed: string = Utils.randomString(16, true); private battleSeedState: string | null = null; - public moneyScattered: number = 0; + public moneyScattered = 0; /** Primarily for double battles, keeps track of last enemy and player pokemon that triggered its ability or used a move */ public lastEnemyInvolved: number; public lastPlayerInvolved: number; @@ -111,7 +111,7 @@ export default class Battle { * This is saved here since we encounter a new enemy every wave. * {@linkcode globalScene.arena.playerFaints} is the corresponding faint counter for the player and needs to be save across waves (reset every arena encounter). */ - public enemyFaints: number = 0; + public enemyFaints = 0; public playerFaintsHistory: FaintLogEntry[] = []; public enemyFaintsHistory: FaintLogEntry[] = []; @@ -119,17 +119,18 @@ export default class Battle { /** If the current battle is a Mystery Encounter, this will always be defined */ public mysteryEncounter?: MysteryEncounter; - private rngCounter: number = 0; + private rngCounter = 0; - constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double: boolean = false) { + constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double = false) { this.gameMode = gameMode; this.waveIndex = waveIndex; this.battleType = battleType; this.trainer = trainer ?? null; this.initBattleSpec(); - this.enemyLevels = battleType !== BattleType.TRAINER - ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) - : trainer?.getPartyLevels(this.waveIndex); + this.enemyLevels = + battleType !== BattleType.TRAINER + ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) + : trainer?.getPartyLevels(this.waveIndex); this.double = double; } @@ -180,8 +181,8 @@ export default class Battle { incrementTurn(): void { this.turn++; - this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); - this.preTurnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); + this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [bt, null])); + this.preTurnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [bt, null])); this.battleSeedState = null; } @@ -194,12 +195,19 @@ export default class Battle { } addPostBattleLoot(enemyPokemon: EnemyPokemon): void { - this.postBattleLoot.push(...globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferable, false).map(i => { - const ret = i as PokemonHeldItemModifier; - //@ts-ignore - this is awful to fix/change - ret.pokemonId = null; - return ret; - })); + this.postBattleLoot.push( + ...globalScene + .findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferable, + false, + ) + .map(i => { + const ret = i as PokemonHeldItemModifier; + //@ts-ignore - this is awful to fix/change + ret.pokemonId = null; + return ret; + }), + ); } pickUpScatteredMoney(): void { @@ -214,7 +222,9 @@ export default class Battle { const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); - const message = i18next.t("battle:moneyPickedUp", { moneyAmount: formattedMoneyAmount }); + const message = i18next.t("battle:moneyPickedUp", { + moneyAmount: formattedMoneyAmount, + }); globalScene.queueMessage(message, undefined, true); globalScene.currentBattle.moneyScattered = 0; @@ -227,13 +237,17 @@ export default class Battle { } for (const p of globalScene.getEnemyParty()) { if (p.isBoss()) { - partyMemberTurnMultiplier *= (p.bossSegments / 1.5) / globalScene.getEnemyParty().length; + partyMemberTurnMultiplier *= p.bossSegments / 1.5 / globalScene.getEnemyParty().length; } } - const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier)); + const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")( + 1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier), + ); const finalBattleScore = Math.ceil(this.battleScore * turnMultiplier); globalScene.score += finalBattleScore; - console.log(`Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`); + console.log( + `Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`, + ); console.log(`Total Score: ${globalScene.score}`); globalScene.updateScoreText(); } @@ -243,16 +257,20 @@ export default class Battle { // Music is overridden for MEs during ME onInit() // Should not use any BGM overrides before swapping from DEFAULT mode return null; - } else if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + } + if ( + this.battleType === BattleType.TRAINER || + this.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { if (!this.started && this.trainer?.config.encounterBgm && this.trainer?.getEncounterMessages()?.length) { return `encounter_${this.trainer?.getEncounterBgm()}`; } if (globalScene.musicPreference === MusicPreference.GENFIVE) { return this.trainer?.getBattleBgm() ?? null; - } else { - return this.trainer?.getMixedBattleBgm() ?? null; } - } else if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { + return this.trainer?.getMixedBattleBgm() ?? null; + } + if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { return "end_summit"; } const wildOpponents = globalScene.getEnemyParty(); @@ -281,7 +299,8 @@ export default class Battle { } return "battle_legendary_unova"; } - } else if (globalScene.musicPreference === MusicPreference.ALLGENS) { + } + if (globalScene.musicPreference === MusicPreference.ALLGENS) { switch (pokemon.species.speciesId) { case Species.ARTICUNO: case Species.ZAPDOS: @@ -434,7 +453,7 @@ export default class Battle { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randSeedInt(range: number, min: number = 0): number { + randSeedInt(range: number, min = 0): number { if (range <= 1) { return min; } @@ -444,7 +463,7 @@ export default class Battle { if (this.battleSeedState) { Phaser.Math.RND.state(this.battleSeedState); } else { - Phaser.Math.RND.sow([ Utils.shiftCharCodes(this.battleSeed, this.turn << 6) ]); + Phaser.Math.RND.sow([Utils.shiftCharCodes(this.battleSeed, this.turn << 6)]); console.log("Battle Seed:", this.battleSeed); } globalScene.rngCounter = this.rngCounter++; @@ -467,7 +486,13 @@ export default class Battle { export class FixedBattle extends Battle { constructor(waveIndex: number, config: FixedBattleConfig) { - super(globalScene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer() : undefined, config.double); + super( + globalScene.gameMode, + waveIndex, + config.battleType, + config.battleType === BattleType.TRAINER ? config.getTrainer() : undefined, + config.double, + ); if (config.getEnemyParty) { this.enemyParty = config.getEnemyParty(); } @@ -516,7 +541,6 @@ export class FixedBattleConfig { } } - /** * Helper function to generate a random trainer for evil team trainers and the elite 4/champion * @param trainerPool The TrainerType or list of TrainerTypes that can possibly be generated @@ -524,31 +548,44 @@ export class FixedBattleConfig { * @param seedOffset the seed offset to use for the random generation of the trainer * @returns the generated trainer */ -export function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], randomGender: boolean = false, seedOffset: number = 0): GetTrainerFunc { +export function getRandomTrainerFunc( + trainerPool: (TrainerType | TrainerType[])[], + randomGender = false, + seedOffset = 0, +): GetTrainerFunc { return () => { const rand = Utils.randSeedInt(trainerPool.length); const trainerTypes: TrainerType[] = []; globalScene.executeWithSeedOffset(() => { for (const trainerPoolEntry of trainerPool) { - const trainerType = Array.isArray(trainerPoolEntry) - ? Utils.randSeedItem(trainerPoolEntry) - : trainerPoolEntry; + const trainerType = Array.isArray(trainerPoolEntry) ? Utils.randSeedItem(trainerPoolEntry) : trainerPoolEntry; trainerTypes.push(trainerType); } }, seedOffset); let trainerGender = TrainerVariant.DEFAULT; if (randomGender) { - trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; + trainerGender = Utils.randInt(2) === 0 ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; } /* 1/3 chance for evil team grunts to be double battles */ - const evilTeamGrunts = [ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ]; + const evilTeamGrunts = [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ]; const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]); if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) { - return new Trainer(trainerTypes[rand], (Utils.randInt(3) === 0) ? TrainerVariant.DOUBLE : trainerGender); + return new Trainer(trainerTypes[rand], Utils.randInt(3) === 0 ? TrainerVariant.DOUBLE : trainerGender); } return new Trainer(trainerTypes[rand], trainerGender); @@ -556,7 +593,7 @@ export function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[ } export interface FixedBattleConfigs { - [key: number]: FixedBattleConfig + [key: number]: FixedBattleConfig; } /** * Youngster/Lass on 5 @@ -568,51 +605,355 @@ export interface FixedBattleConfigs { * Champion on 190 */ export const classicFixedBattles: FixedBattleConfigs = { - [ClassicFixedBossWaves.TOWN_YOUNGSTER]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [ClassicFixedBossWaves.RIVAL_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [ClassicFixedBossWaves.RIVAL_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL_2, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.EVIL_GRUNT_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [ClassicFixedBossWaves.RIVAL_3]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL_3, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.EVIL_GRUNT_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [ClassicFixedBossWaves.EVIL_GRUNT_3]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [ClassicFixedBossWaves.EVIL_ADMIN_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.COLRESS ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true)), - [ClassicFixedBossWaves.RIVAL_4]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL_4, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.EVIL_GRUNT_4]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [ClassicFixedBossWaves.EVIL_ADMIN_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.COLRESS ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true, 1)), - [ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE, TrainerType.PENNY ])) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.RIVAL_5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL_5, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2, TrainerType.PENNY_2 ])) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.ELITE_FOUR_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), - [ClassicFixedBossWaves.ELITE_FOUR_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY, TrainerType.AMARYS ])), - [ClassicFixedBossWaves.ELITE_FOUR_3]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, [ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ], TrainerType.LARRY_ELITE, TrainerType.LACEY ])), - [ClassicFixedBossWaves.ELITE_FOUR_4]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL, TrainerType.DRAYTON ])), - [ClassicFixedBossWaves.CHAMPION]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, [ TrainerType.KUKUI, TrainerType.HAU ], [ TrainerType.LEON, TrainerType.MUSTARD ], [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN ])), - [ClassicFixedBossWaves.RIVAL_6]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(() => new Trainer(TrainerType.RIVAL_6, globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }) + [ClassicFixedBossWaves.TOWN_YOUNGSTER]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => new Trainer(TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT), + ), + [ClassicFixedBossWaves.RIVAL_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ), + [ClassicFixedBossWaves.RIVAL_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_2, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.RIVAL_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_3, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_GRUNT_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_ADMIN_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + TrainerType.FABA, + TrainerType.PLUMERIA, + TrainerType.OLEANA, + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ], + true, + ), + ), + [ClassicFixedBossWaves.RIVAL_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_4, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_ADMIN_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + TrainerType.FABA, + TrainerType.PLUMERIA, + TrainerType.OLEANA, + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ], + true, + 1, + ), + ), + [ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.ROCKET_BOSS_GIOVANNI_1, + TrainerType.MAXIE, + TrainerType.ARCHIE, + TrainerType.CYRUS, + TrainerType.GHETSIS, + TrainerType.LYSANDRE, + TrainerType.LUSAMINE, + TrainerType.GUZMA, + TrainerType.ROSE, + TrainerType.PENNY, + ]), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.RIVAL_5]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_5, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.ROCKET_BOSS_GIOVANNI_2, + TrainerType.MAXIE_2, + TrainerType.ARCHIE_2, + TrainerType.CYRUS_2, + TrainerType.GHETSIS_2, + TrainerType.LYSANDRE_2, + TrainerType.LUSAMINE_2, + TrainerType.GUZMA_2, + TrainerType.ROSE_2, + TrainerType.PENNY_2, + ]), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.ELITE_FOUR_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.LORELEI, + TrainerType.WILL, + TrainerType.SIDNEY, + TrainerType.AARON, + TrainerType.SHAUNTAL, + TrainerType.MALVA, + [TrainerType.HALA, TrainerType.MOLAYNE], + TrainerType.MARNIE_ELITE, + TrainerType.RIKA, + TrainerType.CRISPIN, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.BRUNO, + TrainerType.KOGA, + TrainerType.PHOEBE, + TrainerType.BERTHA, + TrainerType.MARSHAL, + TrainerType.SIEBOLD, + TrainerType.OLIVIA, + TrainerType.NESSA_ELITE, + TrainerType.POPPY, + TrainerType.AMARYS, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.AGATHA, + TrainerType.BRUNO, + TrainerType.GLACIA, + TrainerType.FLINT, + TrainerType.GRIMSLEY, + TrainerType.WIKSTROM, + TrainerType.ACEROLA, + [TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE], + TrainerType.LARRY_ELITE, + TrainerType.LACEY, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.LANCE, + TrainerType.KAREN, + TrainerType.DRAKE, + TrainerType.LUCIAN, + TrainerType.CAITLIN, + TrainerType.DRASNA, + TrainerType.KAHILI, + TrainerType.RAIHAN_ELITE, + TrainerType.HASSEL, + TrainerType.DRAYTON, + ]), + ), + [ClassicFixedBossWaves.CHAMPION]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.BLUE, + [TrainerType.RED, TrainerType.LANCE_CHAMPION], + [TrainerType.STEVEN, TrainerType.WALLACE], + TrainerType.CYNTHIA, + [TrainerType.ALDER, TrainerType.IRIS], + TrainerType.DIANTHA, + [TrainerType.KUKUI, TrainerType.HAU], + [TrainerType.LEON, TrainerType.MUSTARD], + [TrainerType.GEETA, TrainerType.NEMONA], + TrainerType.KIERAN, + ]), + ), + [ClassicFixedBossWaves.RIVAL_6]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_6, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.GREAT, + ModifierTier.GREAT, + ], + allowLuckUpgrades: false, + }), }; diff --git a/src/configs/inputs/cfg_keyboard_qwerty.ts b/src/configs/inputs/cfg_keyboard_qwerty.ts index c1b00a833c0..2ad04ab418d 100644 --- a/src/configs/inputs/cfg_keyboard_qwerty.ts +++ b/src/configs/inputs/cfg_keyboard_qwerty.ts @@ -77,7 +77,7 @@ const cfg_keyboard_qwerty = { KEY_RIGHT_BRACKET: Phaser.Input.Keyboard.KeyCodes.CLOSED_BRACKET, KEY_SEMICOLON: Phaser.Input.Keyboard.KeyCodes.SEMICOLON, KEY_BACKSPACE: Phaser.Input.Keyboard.KeyCodes.BACKSPACE, - KEY_ALT: Phaser.Input.Keyboard.KeyCodes.ALT + KEY_ALT: Phaser.Input.Keyboard.KeyCodes.ALT, }, icons: { KEY_A: "A.png", @@ -131,7 +131,6 @@ const cfg_keyboard_qwerty = { KEY_F11: "F11.png", KEY_F12: "F12.png", - KEY_PAGE_DOWN: "PAGE_DOWN.png", KEY_PAGE_UP: "PAGE_UP.png", @@ -163,7 +162,7 @@ const cfg_keyboard_qwerty = { KEY_SEMICOLON: "SEMICOLON.png", KEY_BACKSPACE: "BACK.png", - KEY_ALT: "ALT.png" + KEY_ALT: "ALT.png", }, settings: { [SettingKeyboard.Button_Up]: Button.UP, @@ -274,7 +273,7 @@ const cfg_keyboard_qwerty = { KEY_LEFT_BRACKET: -1, KEY_RIGHT_BRACKET: -1, KEY_SEMICOLON: -1, - KEY_ALT: -1 + KEY_ALT: -1, }, blacklist: [ "KEY_ENTER", @@ -287,7 +286,7 @@ const cfg_keyboard_qwerty = { "KEY_ARROW_RIGHT", "KEY_DEL", "KEY_HOME", - ] + ], }; export default cfg_keyboard_qwerty; diff --git a/src/configs/inputs/configHandler.ts b/src/configs/inputs/configHandler.ts index 50be692cbc3..b896f303cb3 100644 --- a/src/configs/inputs/configHandler.ts +++ b/src/configs/inputs/configHandler.ts @@ -93,7 +93,7 @@ export function getIconWithSettingName(config, settingName) { } export function getIconForLatestInput(configs, source, devices, settingName) { - let config; + let config: any; // TODO: refine type if (source === "gamepad") { config = configs[devices[Device.GAMEPAD]]; } else { @@ -102,7 +102,7 @@ export function getIconForLatestInput(configs, source, devices, settingName) { const icon = getIconWithSettingName(config, settingName); if (!icon) { const isAlt = settingName.includes("ALT_"); - let altSettingName; + let altSettingName: string; if (isAlt) { altSettingName = settingName.split("ALT_").splice(1)[0]; } else { @@ -115,7 +115,10 @@ export function getIconForLatestInput(configs, source, devices, settingName) { export function assign(config, settingNameTarget, keycode): boolean { // first, we need to check if this keycode is already used on another settingName - if (!canIAssignThisKey(config, getKeyWithKeycode(config, keycode)) || !canIOverrideThisSetting(config, settingNameTarget)) { + if ( + !canIAssignThisKey(config, getKeyWithKeycode(config, keycode)) || + !canIOverrideThisSetting(config, settingNameTarget) + ) { return false; } const previousSettingName = getSettingNameWithKeycode(config, keycode); diff --git a/src/configs/inputs/pad_dualshock.ts b/src/configs/inputs/pad_dualshock.ts index 265b39fdad5..51af1b2defd 100644 --- a/src/configs/inputs/pad_dualshock.ts +++ b/src/configs/inputs/pad_dualshock.ts @@ -24,7 +24,7 @@ const pad_dualshock = { LC_S: 13, LC_W: 14, LC_E: 15, - TOUCH: 17 + TOUCH: 17, }, icons: { RC_S: "CROSS.png", @@ -43,7 +43,7 @@ const pad_dualshock = { LC_S: "DOWN.png", LC_W: "LEFT.png", LC_E: "RIGHT.png", - TOUCH: "TOUCH.png" + TOUCH: "TOUCH.png", }, settings: { [SettingGamepad.Button_Up]: Button.UP, @@ -56,13 +56,13 @@ const pad_dualshock = { [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, - [SettingGamepad.Button_Submit]: Button.SUBMIT + [SettingGamepad.Button_Submit]: Button.SUBMIT, }, default: { LC_N: SettingGamepad.Button_Up, diff --git a/src/configs/inputs/pad_generic.ts b/src/configs/inputs/pad_generic.ts index cd91fcd8b17..e47b7ce1ace 100644 --- a/src/configs/inputs/pad_generic.ts +++ b/src/configs/inputs/pad_generic.ts @@ -23,7 +23,7 @@ const pad_generic = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -54,12 +54,12 @@ const pad_generic = { [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -77,14 +77,9 @@ const pad_generic = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, - blacklist: [ - "LC_N", - "LC_S", - "LC_W", - "LC_E", - ] + blacklist: ["LC_N", "LC_S", "LC_W", "LC_E"], }; export default pad_generic; diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index a7ae5383fbe..61558c7365e 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -55,12 +55,12 @@ const pad_procon = { [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -78,7 +78,7 @@ const pad_procon = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, }; diff --git a/src/configs/inputs/pad_unlicensedSNES.ts b/src/configs/inputs/pad_unlicensedSNES.ts index fbde98b3fa2..d0c4f41c8f5 100644 --- a/src/configs/inputs/pad_unlicensedSNES.ts +++ b/src/configs/inputs/pad_unlicensedSNES.ts @@ -7,7 +7,7 @@ import { Button } from "#enums/buttons"; const pad_unlicensedSNES = { padID: "081f-e401", padType: "xbox", - deviceMapping : { + deviceMapping: { RC_S: 2, RC_E: 1, RC_W: 3, @@ -19,7 +19,7 @@ const pad_unlicensedSNES = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -46,12 +46,12 @@ const pad_unlicensedSNES = { [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -69,7 +69,7 @@ const pad_unlicensedSNES = { LT: -1, RT: -1, LS: -1, - RS: -1 + RS: -1, }, }; diff --git a/src/configs/inputs/pad_xbox360.ts b/src/configs/inputs/pad_xbox360.ts index 88fee731d1d..60cbd9ab181 100644 --- a/src/configs/inputs/pad_xbox360.ts +++ b/src/configs/inputs/pad_xbox360.ts @@ -23,7 +23,7 @@ const pad_xbox360 = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -54,12 +54,12 @@ const pad_xbox360 = { [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -77,7 +77,7 @@ const pad_xbox360 = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, }; diff --git a/src/data/ability.ts b/src/data/ability.ts index de3ec840805..0b4e5ddb2c4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -159,7 +159,7 @@ export abstract class AbAttr { public showAbility: boolean; private extraCondition: AbAttrCondition; - constructor(showAbility: boolean = true) { + constructor(showAbility = true) { this.showAbility = showAbility; } @@ -775,7 +775,7 @@ export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr { private selfTarget: boolean; private allOthers: boolean; - constructor(condition: PokemonDefendCondition, stat: BattleStat, stages: number, selfTarget: boolean = true, allOthers: boolean = false) { + constructor(condition: PokemonDefendCondition, stat: BattleStat, stages: number, selfTarget = true, allOthers = false) { super(true); this.condition = condition; @@ -813,7 +813,7 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr { private stages: number; private selfTarget: boolean; - constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], stages: number, selfTarget: boolean = true) { + constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], stages: number, selfTarget = true) { super(true); this.condition = condition; @@ -1320,7 +1320,7 @@ export class FieldMultiplyStatAbAttr extends AbAttr { private multiplier: number; private canStack: boolean; - constructor(stat: Stat, multiplier: number, canStack: boolean = false) { + constructor(stat: Stat, multiplier: number, canStack = false) { super(false); this.stat = stat; @@ -1510,7 +1510,7 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { private condition: PokemonAttackCondition; private powerMultiplier: number; - constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = true) { + constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility = true) { super(showAbility); this.condition = condition; this.powerMultiplier = powerMultiplier; @@ -1555,7 +1555,7 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { * @param mult A function which takes the user, target, and move, and returns the power multiplier. 1 means no multiplier. * @param {boolean} showAbility Whether to show the ability when it activates. */ - constructor(mult: (user: Pokemon, target: Pokemon, move: Move) => number, showAbility: boolean = true) { + constructor(mult: (user: Pokemon, target: Pokemon, move: Move) => number, showAbility = true) { super(showAbility); this.mult = mult; } @@ -1678,7 +1678,7 @@ export class PostAttackAbAttr extends AbAttr { private attackCondition: PokemonAttackCondition; /** The default attackCondition requires that the selected move is a damaging move */ - constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility: boolean = true) { + constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility = true) { super(showAbility); this.attackCondition = attackCondition; @@ -2151,7 +2151,7 @@ export class PostSummonAbAttr extends AbAttr { /** Should the ability activate when gained in battle? This will almost always be true */ private activateOnGain: boolean; - constructor(showAbility: boolean = true, activateOnGain: boolean = true) { + constructor(showAbility = true, activateOnGain = true) { super(showAbility); this.activateOnGain = activateOnGain; } @@ -2334,7 +2334,7 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { private healRatio: number; private showAnim: boolean; - constructor(healRatio: number, showAnim: boolean = false) { + constructor(healRatio: number, showAnim = false) { super(); this.healRatio = healRatio || 4; @@ -3296,7 +3296,7 @@ export class MultCritAbAttr extends AbAttr { export class ConditionalCritAbAttr extends AbAttr { private condition: PokemonAttackCondition; - constructor(condition: PokemonAttackCondition, checkUser?: Boolean) { + constructor(condition: PokemonAttackCondition, checkUser?: boolean) { super(); this.condition = condition; @@ -3400,7 +3400,7 @@ export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { applyPreWeatherEffect( pokemon: Pokemon, - passive: Boolean, + passive: boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, @@ -3837,7 +3837,7 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { private allyTarget: boolean; private target: Pokemon; - constructor(allyTarget: boolean = false) { + constructor(allyTarget = false) { super(true); this.allyTarget = allyTarget; } @@ -4049,7 +4049,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { * @returns `true` if any opponents are sleeping */ override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - let hadEffect: boolean = false; + let hadEffect = false; for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { if (!simulated) { @@ -5150,9 +5150,9 @@ function applySingleAbAttrs( attrType: Constructor, applyFunc: AbAttrApplyFunc, args: any[], - gainedMidTurn: boolean = false, - simulated: boolean = false, - showAbilityInstant: boolean = false, + gainedMidTurn = false, + simulated = false, + showAbilityInstant = false, messages: string[] = [] ) { if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { @@ -5362,7 +5362,7 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { private helper: ForceSwitchOutHelper = new ForceSwitchOutHelper(SwitchType.SWITCH); private hpRatio: number; - constructor(hpRatio: number = 0.5) { + constructor(hpRatio = 0.5) { super(); this.hpRatio = hpRatio; } @@ -5446,10 +5446,10 @@ function applyAbAttrsInternal( pokemon: Pokemon | null, applyFunc: AbAttrApplyFunc, args: any[], - showAbilityInstant: boolean = false, - simulated: boolean = false, + showAbilityInstant = false, + simulated = false, messages: string[] = [], - gainedMidTurn: boolean = false + gainedMidTurn = false ) { for (const passive of [ false, true ]) { if (pokemon) { @@ -5463,7 +5463,7 @@ export function applyAbAttrs( attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5479,7 +5479,7 @@ export function applyAbAttrs( export function applyPostBattleInitAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5498,7 +5498,7 @@ export function applyPreDefendAbAttrs( attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5517,7 +5517,7 @@ export function applyPostDefendAbAttrs( attacker: Pokemon, move: Move, hitResult: HitResult | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5536,7 +5536,7 @@ export function applyPostMoveUsedAbAttrs( move: PokemonMove, source: Pokemon, targets: BattlerIndex[], - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5554,7 +5554,7 @@ export function applyStatMultiplierAbAttrs( pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5569,7 +5569,7 @@ export function applyPostSetStatusAbAttrs( pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5587,7 +5587,7 @@ export function applyPostDamageAbAttrs( pokemon: Pokemon, damage: number, passive: boolean, - simulated: boolean = false, + simulated = false, args: any[], source?: Pokemon, ): void { @@ -5616,7 +5616,7 @@ export function applyFieldStatMultiplierAbAttrs( statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5633,7 +5633,7 @@ export function applyPreAttackAbAttrs( pokemon: Pokemon, defender: Pokemon | null, move: Move, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5652,7 +5652,7 @@ export function applyPostAttackAbAttrs( defender: Pokemon, move: Move, hitResult: HitResult | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5669,7 +5669,7 @@ export function applyPostKnockOutAbAttrs( attrType: Constructor, pokemon: Pokemon, knockedOut: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5685,7 +5685,7 @@ export function applyPostKnockOutAbAttrs( export function applyPostVictoryAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5701,7 +5701,7 @@ export function applyPostVictoryAbAttrs( export function applyPostSummonAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5717,7 +5717,7 @@ export function applyPostSummonAbAttrs( export function applyPreSwitchOutAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5733,7 +5733,7 @@ export function applyPreSwitchOutAbAttrs( export function applyPreLeaveFieldAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { return applyAbAttrsInternal( @@ -5752,7 +5752,7 @@ export function applyPreStatStageChangeAbAttrs( pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5771,7 +5771,7 @@ export function applyPostStatStageChangeAbAttrs( stats: BattleStat[], stages: integer, selfTarget: boolean, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5789,7 +5789,7 @@ export function applyPreSetStatusAbAttrs( pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5807,7 +5807,7 @@ export function applyPreApplyBattlerTagAbAttrs( pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5825,7 +5825,7 @@ export function applyPreWeatherEffectAbAttrs( pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5841,7 +5841,7 @@ export function applyPreWeatherEffectAbAttrs( export function applyPostTurnAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5858,7 +5858,7 @@ export function applyPostWeatherChangeAbAttrs( attrType: Constructor, pokemon: Pokemon, weather: WeatherType, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5875,7 +5875,7 @@ export function applyPostWeatherLapseAbAttrs( attrType: Constructor, pokemon: Pokemon, weather: Weather | null, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5892,7 +5892,7 @@ export function applyPostTerrainChangeAbAttrs( attrType: Constructor, pokemon: Pokemon, terrain: TerrainType, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5911,7 +5911,7 @@ export function applyCheckTrappedAbAttrs( trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5928,7 +5928,7 @@ export function applyCheckTrappedAbAttrs( export function applyPostBattleAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5947,7 +5947,7 @@ export function applyPostFaintAbAttrs( attacker?: Pokemon, move?: Move, hitResult?: HitResult, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5963,7 +5963,7 @@ export function applyPostFaintAbAttrs( export function applyPostItemLostAbAttrs( attrType: Constructor, pokemon: Pokemon, - simulated: boolean = false, + simulated = false, ...args: any[] ): void { applyAbAttrsInternal( @@ -5979,14 +5979,14 @@ export function applyPostItemLostAbAttrs( * * Ignores passives as they don't change and shouldn't be reapplied when main abilities change */ -export function applyOnGainAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { +export function applyOnGainAbAttrs(pokemon: Pokemon, passive = false, simulated = false, ...args: any[]): void { applySingleAbAttrs(pokemon, passive, PostSummonAbAttr, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, true, simulated); } /** * Clears primal weather/neutralizing gas during the turn if {@linkcode pokemon}'s ability corresponds to one */ -export function applyOnLoseAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { +export function applyOnLoseAbAttrs(pokemon: Pokemon, passive = false, simulated = false, ...args: any[]): void { applySingleAbAttrs(pokemon, passive, PreLeaveFieldAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); } function queueShowAbility(pokemon: Pokemon, passive: boolean): void { diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 4e54c728f09..4219b9a3ba2 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -10,7 +10,15 @@ import type Pokemon from "#app/field/pokemon"; import { HitResult, PokemonMove } from "#app/field/pokemon"; import { StatusEffect } from "#enums/status-effect"; import type { BattlerIndex } from "#app/battle"; -import { BlockNonDirectDamageAbAttr, InfiltratorAbAttr, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, ProtectStatAbAttr, applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#app/data/ability"; +import { + BlockNonDirectDamageAbAttr, + InfiltratorAbAttr, + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + ProtectStatAbAttr, + applyAbAttrs, + applyOnGainAbAttrs, + applyOnLoseAbAttrs, +} from "#app/data/ability"; import { Stat } from "#enums/stat"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; @@ -27,7 +35,7 @@ import { CommonAnimPhase } from "#app/phases/common-anim-phase"; export enum ArenaTagSide { BOTH, PLAYER, - ENEMY + ENEMY, } export abstract class ArenaTag { @@ -36,31 +44,34 @@ export abstract class ArenaTag { public turnCount: number, public sourceMove?: Moves, public sourceId?: number, - public side: ArenaTagSide = ArenaTagSide.BOTH + public side: ArenaTagSide = ArenaTagSide.BOTH, ) {} - apply(arena: Arena, simulated: boolean, ...args: unknown[]): boolean { + apply(_arena: Arena, _simulated: boolean, ..._args: unknown[]): boolean { return true; } - onAdd(arena: Arena, quiet: boolean = false): void { } + onAdd(_arena: Arena, _quiet = false): void {} - onRemove(arena: Arena, quiet: boolean = false): void { + onRemove(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: this.getMoveName() })); + globalScene.queueMessage( + i18next.t( + `arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + { moveName: this.getMoveName() }, + ), + ); } } - onOverlap(arena: Arena): void { } + onOverlap(_arena: Arena): void {} - lapse(arena: Arena): boolean { - return this.turnCount < 1 || !!(--this.turnCount); + lapse(_arena: Arena): boolean { + return this.turnCount < 1 || !!--this.turnCount; } getMoveName(): string | null { - return this.sourceMove - ? allMoves[this.sourceMove].name - : null; + return this.sourceMove ? allMoves[this.sourceMove].name : null; } /** @@ -68,7 +79,7 @@ export abstract class ArenaTag { * This is meant to be inherited from by any arena tag with custom attributes * @param {ArenaTag | any} source An arena tag */ - loadTag(source : ArenaTag | any) : void { + loadTag(source: ArenaTag | any): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; this.sourceId = source.sourceId; @@ -109,14 +120,18 @@ export class MistTag extends ArenaTag { super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); if (this.sourceId) { const source = globalScene.getPokemonById(this.sourceId); if (!quiet && source) { - globalScene.queueMessage(i18next.t("arenaTag:mistOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:mistOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } else if (!quiet) { console.warn("Failed to get source for MistTag onAdd"); } @@ -125,14 +140,14 @@ export class MistTag extends ArenaTag { /** * Cancels the lowering of stats - * @param arena the {@linkcode Arena} containing this effect + * @param _arena the {@linkcode Arena} containing this effect * @param simulated `true` if the effect should be applied quietly * @param attacker the {@linkcode Pokemon} using a move into this effect. * @param cancelled a {@linkcode BooleanHolder} whose value is set to `true` * to flag the stat reduction as cancelled * @returns `true` if a stat reduction was cancelled; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, attacker: Pokemon, cancelled: BooleanHolder): boolean { + override apply(_arena: Arena, simulated: boolean, attacker: Pokemon, cancelled: BooleanHolder): boolean { // `StatStageChangePhase` currently doesn't have a reference to the source of stat drops, // so this code currently has no effect on gameplay. if (attacker) { @@ -171,7 +186,14 @@ export class WeakenMoveScreenTag extends ArenaTag { * @param side - The side (player or enemy) the tag affects. * @param weakenedCategories - The categories of moves that are weakened by this tag. */ - constructor(tagType: ArenaTagType, turnCount: number, sourceMove: Moves, sourceId: number, side: ArenaTagSide, weakenedCategories: MoveCategory[]) { + constructor( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves, + sourceId: number, + side: ArenaTagSide, + weakenedCategories: MoveCategory[], + ) { super(tagType, turnCount, sourceMove, sourceId, side); this.weakenedCategories = weakenedCategories; @@ -180,14 +202,20 @@ export class WeakenMoveScreenTag extends ArenaTag { /** * Applies the weakening effect to the move. * - * @param arena the {@linkcode Arena} where the move is applied. - * @param simulated n/a + * @param _arena the {@linkcode Arena} where the move is applied. + * @param _simulated n/a * @param attacker the attacking {@linkcode Pokemon} * @param moveCategory the attacking move's {@linkcode MoveCategory}. * @param damageMultiplier A {@linkcode NumberHolder} containing the damage multiplier * @returns `true` if the attacking move was weakened; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, attacker: Pokemon, moveCategory: MoveCategory, damageMultiplier: NumberHolder): boolean { + override apply( + _arena: Arena, + _simulated: boolean, + attacker: Pokemon, + moveCategory: MoveCategory, + damageMultiplier: NumberHolder, + ): boolean { if (this.weakenedCategories.includes(moveCategory)) { const bypassed = new BooleanHolder(false); applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); @@ -207,12 +235,16 @@ export class WeakenMoveScreenTag extends ArenaTag { */ class ReflectTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [ MoveCategory.PHYSICAL ]); + super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -223,12 +255,16 @@ class ReflectTag extends WeakenMoveScreenTag { */ class LightScreenTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [ MoveCategory.SPECIAL ]); + super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -239,12 +275,19 @@ class LightScreenTag extends WeakenMoveScreenTag { */ class AuroraVeilTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ]); + super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [ + MoveCategory.SPECIAL, + MoveCategory.PHYSICAL, + ]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -261,19 +304,31 @@ export class ConditionalProtectTag extends ArenaTag { /** Does this apply to all moves, including those that ignore other forms of protection? */ protected ignoresBypass: boolean; - constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: number, side: ArenaTagSide, condition: ProtectConditionFunc, ignoresBypass: boolean = false) { + constructor( + tagType: ArenaTagType, + sourceMove: Moves, + sourceId: number, + side: ArenaTagSide, + condition: ProtectConditionFunc, + ignoresBypass = false, + ) { super(tagType, 1, sourceMove, sourceId, side); this.protectConditionFunc = condition; this.ignoresBypass = ignoresBypass; } - onAdd(arena: Arena): void { - globalScene.queueMessage(i18next.t(`arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: super.getMoveName() })); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + { moveName: super.getMoveName() }, + ), + ); } // Removes default message for effect removal - onRemove(arena: Arena): void { } + onRemove(_arena: Arena): void {} /** * Checks incoming moves against the condition function @@ -287,18 +342,28 @@ export class ConditionalProtectTag extends ArenaTag { * @param ignoresProtectBypass a {@linkcode BooleanHolder} used to flag if a protection effect supercedes effects that ignore protection * @returns `true` if this tag protected against the attack; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, isProtected: BooleanHolder, attacker: Pokemon, defender: Pokemon, - moveId: Moves, ignoresProtectBypass: BooleanHolder): boolean { - - if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() - && this.protectConditionFunc(arena, moveId)) { + override apply( + arena: Arena, + simulated: boolean, + isProtected: BooleanHolder, + attacker: Pokemon, + defender: Pokemon, + moveId: Moves, + ignoresProtectBypass: BooleanHolder, + ): boolean { + if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) { if (!isProtected.value) { isProtected.value = true; if (!simulated) { attacker.stopMultiHit(defender); new CommonBattleAnim(CommonAnim.PROTECT, defender).play(); - globalScene.queueMessage(i18next.t("arenaTag:conditionalProtectApply", { moveName: super.getMoveName(), pokemonNameWithAffix: getPokemonNameWithAffix(defender) })); + globalScene.queueMessage( + i18next.t("arenaTag:conditionalProtectApply", { + moveName: super.getMoveName(), + pokemonNameWithAffix: getPokemonNameWithAffix(defender), + }), + ); } } @@ -312,12 +377,12 @@ export class ConditionalProtectTag extends ArenaTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition * @returns `true` if the incoming move's priority is greater than 0. * This includes moves with modified priorities from abilities (e.g. Prankster) */ -const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => { +const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => { const move = allMoves[moveId]; const effectPhase = globalScene.getCurrentPhase(); @@ -343,11 +408,11 @@ class QuickGuardTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition * @returns `true` if the incoming move is multi-targeted (even if it's only used against one Pokemon). */ -const WideGuardConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { +const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => { const move = allMoves[moveId]; switch (move.moveTarget) { @@ -374,11 +439,11 @@ class WideGuardTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect. + * @param _arena {@linkcode Arena} The arena containing the protection effect. * @param moveId {@linkcode Moves} The move to check against this condition. * @returns `true` if the incoming move is not a Status move. */ -const MatBlockConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { +const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => { const move = allMoves[moveId]; return move.category !== MoveCategory.STATUS; }; @@ -392,11 +457,15 @@ class MatBlockTag extends ConditionalProtectTag { super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc); } - onAdd(arena: Arena) { + onAdd(_arena: Arena) { if (this.sourceId) { const source = globalScene.getPokemonById(this.sourceId); if (source) { - globalScene.queueMessage(i18next.t("arenaTag:matBlockOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:matBlockOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } else { console.warn("Failed to get source for MatBlockTag onAdd"); } @@ -407,24 +476,26 @@ class MatBlockTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition * @returns `true` if the incoming move is a Status move, is not a hazard, and does not target all * Pokemon or sides of the field. */ -const CraftyShieldConditionFunc: ProtectConditionFunc = (arena, moveId) => { +const CraftyShieldConditionFunc: ProtectConditionFunc = (_arena, moveId) => { const move = allMoves[moveId]; - return move.category === MoveCategory.STATUS - && move.moveTarget !== MoveTarget.ENEMY_SIDE - && move.moveTarget !== MoveTarget.BOTH_SIDES - && move.moveTarget !== MoveTarget.ALL; + return ( + move.category === MoveCategory.STATUS && + move.moveTarget !== MoveTarget.ENEMY_SIDE && + move.moveTarget !== MoveTarget.BOTH_SIDES && + move.moveTarget !== MoveTarget.ALL + ); }; /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield} * Condition: The incoming move is a Status move, is not a hazard, and does * not target all Pokemon or sides of the field. -*/ + */ class CraftyShieldTag extends ConditionalProtectTag { constructor(sourceId: number, side: ArenaTagSide) { super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true); @@ -448,19 +519,23 @@ export class NoCritTag extends ArenaTag { } /** Queues a message upon adding this effect to the field */ - onAdd(arena: Arena): void { - globalScene.queueMessage(i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, { - moveName: this.getMoveName() - })); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, { + moveName: this.getMoveName(), + }), + ); } /** Queues a message upon removing this effect from the field */ - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { const source = globalScene.getPokemonById(this.sourceId!); // TODO: is this bang correct? - globalScene.queueMessage(i18next.t("arenaTag:noCritOnRemove", { - pokemonNameWithAffix: getPokemonNameWithAffix(source ?? undefined), - moveName: this.getMoveName() - })); + globalScene.queueMessage( + i18next.t("arenaTag:noCritOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(source ?? undefined), + moveName: this.getMoveName(), + }), + ); } } @@ -477,12 +552,14 @@ class WishTag extends ArenaTag { super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { if (this.sourceId) { const user = globalScene.getPokemonById(this.sourceId); if (user) { this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) }); + this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(user), + }); this.healHp = toDmgValue(user.getMaxHp() / 2); } else { console.warn("Failed to get source for WishTag onAdd"); @@ -490,7 +567,7 @@ class WishTag extends ArenaTag { } } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { const target = globalScene.getField()[this.battlerIndex]; if (target?.isActive(true)) { globalScene.queueMessage(this.triggerMessage); @@ -522,13 +599,13 @@ export class WeakenMoveTypeTag extends ArenaTag { /** * Reduces an attack's power by 0.33x if it matches this tag's weakened type. - * @param arena n/a - * @param simulated n/a + * @param _arena n/a + * @param _simulated n/a * @param type the attack's {@linkcode PokemonType} * @param power a {@linkcode NumberHolder} containing the attack's power * @returns `true` if the attack's power was reduced; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, type: PokemonType, power: NumberHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, type: PokemonType, power: NumberHolder): boolean { if (type === this.weakenedType) { power.value *= 0.33; return true; @@ -546,11 +623,11 @@ class MudSportTag extends WeakenMoveTypeTag { super(ArenaTagType.MUD_SPORT, turnCount, PokemonType.ELECTRIC, Moves.MUD_SPORT, sourceId); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:mudSportOnAdd")); } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:mudSportOnRemove")); } } @@ -564,11 +641,11 @@ class WaterSportTag extends WeakenMoveTypeTag { super(ArenaTagType.WATER_SPORT, turnCount, PokemonType.FIRE, Moves.WATER_SPORT, sourceId); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:waterSportOnAdd")); } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:waterSportOnRemove")); } } @@ -584,20 +661,20 @@ export class IonDelugeTag extends ArenaTag { } /** Queues an on-add message */ - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:plasmaFistsOnAdd")); } - onRemove(arena: Arena): void { } // Removes default on-remove message + onRemove(_arena: Arena): void {} // Removes default on-remove message /** * Converts Normal-type moves to Electric type - * @param arena n/a - * @param simulated n/a + * @param _arena n/a + * @param _simulated n/a * @param moveType a {@linkcode NumberHolder} containing a move's {@linkcode PokemonType} * @returns `true` if the given move type changed; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, moveType: NumberHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, moveType: NumberHolder): boolean { if (moveType.value === PokemonType.NORMAL) { moveType.value = PokemonType.ELECTRIC; return true; @@ -639,12 +716,12 @@ export class ArenaTrapTag extends ArenaTag { /** * Activates the hazard effect onto a Pokemon when it enters the field - * @param arena the {@linkcode Arena} containing this tag + * @param _arena the {@linkcode Arena} containing this tag * @param simulated if `true`, only checks if the hazard would activate. * @param pokemon the {@linkcode Pokemon} triggering this hazard * @returns `true` if this hazard affects the given Pokemon; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, pokemon: Pokemon): boolean { + override apply(_arena: Arena, simulated: boolean, pokemon: Pokemon): boolean { if ((this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) { return false; } @@ -652,12 +729,14 @@ export class ArenaTrapTag extends ArenaTag { return this.activateTrap(pokemon, simulated); } - activateTrap(pokemon: Pokemon, simulated: boolean): boolean { + activateTrap(_pokemon: Pokemon, _simulated: boolean): boolean { return false; } getMatchupScoreMultiplier(pokemon: Pokemon): number { - return pokemon.isGrounded() ? 1 : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2); + return pokemon.isGrounded() + ? 1 + : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2); } loadTag(source: any): void { @@ -677,12 +756,17 @@ class SpikesTag extends ArenaTrapTag { super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - globalScene.queueMessage(i18next.t("arenaTag:spikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:spikesOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -699,7 +783,11 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); const damage = toDmgValue(pokemon.getMaxHp() * damageHpRatio); - globalScene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("arenaTag:spikesActivateTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -726,12 +814,17 @@ class ToxicSpikesTag extends ArenaTrapTag { this.neutralized = false; } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - globalScene.queueMessage(i18next.t("arenaTag:toxicSpikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:toxicSpikesOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -749,12 +842,19 @@ class ToxicSpikesTag extends ArenaTrapTag { if (pokemon.isOfType(PokemonType.POISON)) { this.neutralized = true; if (globalScene.arena.removeTag(this.tagType)) { - globalScene.queueMessage(i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); + globalScene.queueMessage( + i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); return true; } } else if (!pokemon.status) { const toxic = this.layers > 1; - if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName())) { + if ( + pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName()) + ) { return true; } } @@ -782,7 +882,13 @@ class ToxicSpikesTag extends ArenaTrapTag { export class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; - constructor(tagType: ArenaTagType, sourceMove: Moves | undefined, sourceId: number, targetIndex: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH) { + constructor( + tagType: ArenaTagType, + sourceMove: Moves | undefined, + sourceId: number, + targetIndex: BattlerIndex, + side: ArenaTagSide = ArenaTagSide.BOTH, + ) { super(tagType, 3, sourceMove, sourceId, side); this.targetIndex = targetIndex; @@ -793,13 +899,15 @@ export class DelayedAttackTag extends ArenaTag { const ret = super.lapse(arena); if (!ret) { - globalScene.unshiftPhase(new MoveEffectPhase(this.sourceId!, [ this.targetIndex ], new PokemonMove(this.sourceMove!, 0, 0, true))); // TODO: are those bangs correct? + globalScene.unshiftPhase( + new MoveEffectPhase(this.sourceId!, [this.targetIndex], new PokemonMove(this.sourceMove!, 0, 0, true)), + ); // TODO: are those bangs correct? } return ret; } - onRemove(arena: Arena): void { } + onRemove(_arena: Arena): void {} } /** @@ -812,19 +920,23 @@ class StealthRockTag extends ArenaTrapTag { super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - globalScene.queueMessage(i18next.t("arenaTag:stealthRockOnAdd", { opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:stealthRockOnAdd", { + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } getDamageHpRatio(pokemon: Pokemon): number { const effectiveness = pokemon.getAttackTypeEffectiveness(PokemonType.ROCK, undefined, true); - let damageHpRatio: number = 0; + let damageHpRatio = 0; switch (effectiveness) { case 0: @@ -852,7 +964,7 @@ class StealthRockTag extends ArenaTrapTag { override activateTrap(pokemon: Pokemon, simulated: boolean): boolean { const cancelled = new BooleanHolder(false); - applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (cancelled.value) { return false; @@ -865,7 +977,11 @@ class StealthRockTag extends ArenaTrapTag { return true; } const damage = toDmgValue(pokemon.getMaxHp() * damageHpRatio); - globalScene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("arenaTag:stealthRockActivateTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -892,11 +1008,16 @@ class StickyWebTag extends ArenaTrapTag { super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - globalScene.queueMessage(i18next.t("arenaTag:stickyWebOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:stickyWebOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -910,16 +1031,32 @@ class StickyWebTag extends ArenaTrapTag { } if (!cancelled.value) { - globalScene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); + globalScene.queueMessage( + i18next.t("arenaTag:stickyWebActivateTrap", { + pokemonName: pokemon.getNameToRender(), + }), + ); const stages = new NumberHolder(-1); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value, true, false, true, null, false, true)); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + false, + [Stat.SPD], + stages.value, + true, + false, + true, + null, + false, + true, + ), + ); return true; } } return false; } - } /** @@ -934,25 +1071,29 @@ export class TrickRoomTag extends ArenaTag { /** * Reverses Speed-based turn order for all Pokemon on the field - * @param arena n/a - * @param simulated n/a + * @param _arena n/a + * @param _simulated n/a * @param speedReversed a {@linkcode BooleanHolder} used to flag if Speed-based * turn order should be reversed. * @returns `true` if turn order is successfully reversed; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, speedReversed: BooleanHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, speedReversed: BooleanHolder): boolean { speedReversed.value = !speedReversed.value; return true; } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (source) { - globalScene.queueMessage(i18next.t("arenaTag:trickRoomOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:trickRoomOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); } } @@ -967,9 +1108,9 @@ export class GravityTag extends ArenaTag { super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:gravityOnAdd")); - globalScene.getField(true).forEach((pokemon) => { + globalScene.getField(true).forEach(pokemon => { if (pokemon !== null) { pokemon.removeTag(BattlerTagType.FLOATING); pokemon.removeTag(BattlerTagType.TELEKINESIS); @@ -980,7 +1121,7 @@ export class GravityTag extends ArenaTag { }); } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:gravityOnRemove")); } } @@ -995,9 +1136,13 @@ class TailwindTag extends ArenaTag { super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } const source = globalScene.getPokemonById(this.sourceId!); //TODO: this bang is questionable! @@ -1007,19 +1152,28 @@ class TailwindTag extends ArenaTag { // Apply the CHARGED tag to party members with the WIND_POWER ability if (pokemon.hasAbility(Abilities.WIND_POWER) && !pokemon.getTag(BattlerTagType.CHARGED)) { pokemon.addTag(BattlerTagType.CHARGED); - globalScene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); + globalScene.queueMessage( + i18next.t("abilityTriggers:windPowerCharged", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); } // Raise attack by one stage if party member has WIND_RIDER ability if (pokemon.hasAbility(Abilities.WIND_RIDER)) { globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.getBattlerIndex())); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.ATK ], 1, true)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.ATK], 1, true)); } } } - onRemove(arena: Arena, quiet: boolean = false): void { + onRemove(_arena: Arena, quiet = false): void { if (!quiet) { - globalScene.queueMessage(i18next.t(`arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -1033,11 +1187,11 @@ class HappyHourTag extends ArenaTag { super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:happyHourOnAdd")); } - onRemove(arena: Arena): void { + onRemove(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:happyHourOnRemove")); } } @@ -1047,12 +1201,20 @@ class SafeguardTag extends ArenaTag { super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side); } - onAdd(arena: Arena): void { - globalScene.queueMessage(i18next.t(`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } - onRemove(arena: Arena): void { - globalScene.queueMessage(i18next.t(`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + onRemove(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } @@ -1079,12 +1241,16 @@ class ImprisonTag extends ArenaTrapTag { const source = this.getSourcePokemon(); if (source) { const party = this.getAffectedPokemon(); - party?.forEach((p: Pokemon ) => { + party?.forEach((p: Pokemon) => { if (p.isAllowedInBattle()) { p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); } }); - globalScene.queueMessage(i18next.t("battlerTags:imprisonOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("battlerTags:imprisonOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } } @@ -1105,7 +1271,7 @@ class ImprisonTag extends ArenaTrapTag { */ override activateTrap(pokemon: Pokemon): boolean { const source = this.getSourcePokemon(); - if (source && source.isActive(true) && pokemon.isAllowedInBattle()) { + if (source?.isActive(true) && pokemon.isAllowedInBattle()) { pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); } return true; @@ -1135,23 +1301,34 @@ class FireGrassPledgeTag extends ArenaTag { super(ArenaTagType.FIRE_GRASS_PLEDGE, 4, Moves.FIRE_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A sea of fire enveloped your/the opposing team!" - globalScene.queueMessage(i18next.t(`arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } override lapse(arena: Arena): boolean { - const field: Pokemon[] = (this.side === ArenaTagSide.PLAYER) - ? globalScene.getPlayerField() - : globalScene.getEnemyField(); + const field: Pokemon[] = + this.side === ArenaTagSide.PLAYER ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus).forEach(pokemon => { - // "{pokemonNameWithAffix} was hurt by the sea of fire!" - globalScene.queueMessage(i18next.t("arenaTag:fireGrassPledgeLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - // TODO: Replace this with a proper animation - globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM)); - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); - }); + field + .filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus) + .forEach(pokemon => { + // "{pokemonNameWithAffix} was hurt by the sea of fire!" + globalScene.queueMessage( + i18next.t("arenaTag:fireGrassPledgeLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + // TODO: Replace this with a proper animation + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM), + ); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); + }); return super.lapse(arena); } @@ -1169,20 +1346,24 @@ class WaterFirePledgeTag extends ArenaTag { super(ArenaTagType.WATER_FIRE_PLEDGE, 4, Moves.WATER_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A rainbow appeared in the sky on your/the opposing team's side!" - globalScene.queueMessage(i18next.t(`arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } /** * Doubles the chance for the given move's secondary effect(s) to trigger - * @param arena the {@linkcode Arena} containing this tag - * @param simulated n/a + * @param _arena the {@linkcode Arena} containing this tag + * @param _simulated n/a * @param moveChance a {@linkcode NumberHolder} containing * the move's current effect chance * @returns `true` if the move's effect chance was doubled (currently always `true`) */ - override apply(arena: Arena, simulated: boolean, moveChance: NumberHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, moveChance: NumberHolder): boolean { moveChance.value *= 2; return true; } @@ -1199,9 +1380,13 @@ class GrassWaterPledgeTag extends ArenaTag { super(ArenaTagType.GRASS_WATER_PLEDGE, 4, Moves.GRASS_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A swamp enveloped your/the opposing team!" - globalScene.queueMessage(i18next.t(`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } @@ -1217,10 +1402,9 @@ export class FairyLockTag extends ArenaTag { super(ArenaTagType.FAIRY_LOCK, turnCount, Moves.FAIRY_LOCK, sourceId); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { globalScene.queueMessage(i18next.t("arenaTag:fairyLockOnAdd")); } - } /** @@ -1240,20 +1424,24 @@ export class SuppressAbilitiesTag extends ArenaTag { this.beingRemoved = false; } - public override onAdd(arena: Arena): void { + public override onAdd(_arena: Arena): void { const pokemon = this.getSourcePokemon(); if (pokemon) { - globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("arenaTag:neutralizingGasOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); for (const fieldPokemon of globalScene.getField()) { if (fieldPokemon && fieldPokemon.id !== pokemon.id) { - [ true, false ].forEach((passive) => applyOnLoseAbAttrs(fieldPokemon, passive)); + [true, false].forEach(passive => applyOnLoseAbAttrs(fieldPokemon, passive)); } } } } - public override onOverlap(arena: Arena): void { + public override onOverlap(_arena: Arena): void { this.sourceCount++; } @@ -1265,12 +1453,14 @@ export class SuppressAbilitiesTag extends ArenaTag { // With 1 source left, that pokemon's other abilities should reactivate // This may be confusing for players but would be the most accurate gameplay-wise // Could have a custom message that plays when a specific pokemon's NG ends? This entire thing exists due to passives after all - const setter = globalScene.getField().filter((p) => p && p.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false))[0]; + const setter = globalScene + .getField() + .filter(p => p?.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false))[0]; applyOnGainAbAttrs(setter, setter.getAbility().hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr)); } } - public override onRemove(arena: Arena, quiet: boolean = false) { + public override onRemove(_arena: Arena, quiet = false) { this.beingRemoved = true; if (!quiet) { globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); @@ -1279,7 +1469,7 @@ export class SuppressAbilitiesTag extends ArenaTag { for (const pokemon of globalScene.getField()) { // There is only one pokemon with this attr on the field on removal, so its abilities are already active if (pokemon && !pokemon.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false)) { - [ true, false ].forEach((passive) => applyOnGainAbAttrs(pokemon, passive)); + [true, false].forEach(passive => applyOnGainAbAttrs(pokemon, passive)); } } } @@ -1294,7 +1484,14 @@ export class SuppressAbilitiesTag extends ArenaTag { } // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter -export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { +export function getArenaTag( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves | undefined, + sourceId: number, + targetIndex?: BattlerIndex, + side: ArenaTagSide = ArenaTagSide.BOTH, +): ArenaTag | null { switch (tagType) { case ArenaTagType.MIST: return new MistTag(turnCount, sourceId, side); @@ -1366,9 +1563,15 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove * @return {ArenaTag} The valid arena tag */ export function loadArenaTag(source: ArenaTag | any): ArenaTag { - const tag = getArenaTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId, source.targetIndex, source.side) - ?? new NoneTag(); + const tag = + getArenaTag( + source.tagType, + source.turnCount, + source.sourceMove, + source.sourceId, + source.targetIndex, + source.side, + ) ?? new NoneTag(); tag.loadTag(source); return tag; } - diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 8feaa5beb5e..71a48162e57 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -2022,6 +2022,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { } }; +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: init methods are expected to have many lines. export function initBiomes() { const pokemonBiomes = [ [ Species.BULBASAUR, PokemonType.GRASS, PokemonType.POISON, [ @@ -7677,7 +7678,7 @@ export function initBiomes() { const traverseBiome = (biome: Biome, depth: number) => { if (biome === Biome.END) { - const biomeList = Object.keys(Biome).filter(key => !isNaN(Number(key))); + const biomeList = Object.keys(Biome).filter(key => !Number.isNaN(Number(key))); biomeList.pop(); // Removes Biome.END from the list const randIndex = Utils.randSeedInt(biomeList.length, 1); // Will never be Biome.TOWN biome = Biome[biomeList[randIndex]]; @@ -7764,7 +7765,8 @@ export function initBiomes() { treeIndex = t; arrayIndex = es + 1; break; - } else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) { + } + if (speciesEvolutions?.find(se => se.speciesId === existingSpeciesId)) { treeIndex = t; arrayIndex = es; break; @@ -7786,7 +7788,7 @@ export function initBiomes() { for (const b of Object.keys(biomePokemonPools)) { for (const t of Object.keys(biomePokemonPools[b])) { - const tier = parseInt(t) as BiomePoolTier; + const tier = Number.parseInt(t) as BiomePoolTier; for (const tod of Object.keys(biomePokemonPools[b][t])) { const biomeTierTimePool = biomePokemonPools[b][t][tod]; for (let e = 0; e < biomeTierTimePool.length; e++) { @@ -7799,7 +7801,7 @@ export function initBiomes() { }; for (let s = 1; s < entry.length; s++) { const speciesId = entry[s]; - const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId); + const prevolution = entry.flatMap((s: string | number) => pokemonEvolutions[s]).find(e => e && e.speciesId === speciesId); const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0); if (!newEntry.hasOwnProperty(level)) { newEntry[level] = [ speciesId ]; diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 1bac63e9560..5829e3e10aa 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -591,7 +591,7 @@ function parseEggMoves(content: string): void { const speciesValues = Utils.getEnumValues(Species); const lines = content.split(/\n/g); - lines.forEach((line, l) => { + for (const line of lines) { const cols = line.split(",").slice(0, 5); const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, "").toLowerCase()); const enumSpeciesName = cols[0].toUpperCase().replace(/[ -]/g, "_"); @@ -612,7 +612,7 @@ function parseEggMoves(content: string): void { if (eggMoves.find(m => m !== Moves.NONE)) { output += `[Species.${Species[species]}]: [ ${eggMoves.map(m => `Moves.${Moves[m]}`).join(", ")} ],\n`; } - }); + } console.log(output); } diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index 6cf79bb45f1..c34bc229bd7 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -92,7 +92,7 @@ export class SpeciesFormEvolution { public item: EvolutionItem | null; public condition: SpeciesEvolutionCondition | null; public wildDelay: SpeciesWildEvolutionDelay; - public description: string = ""; + public description = ""; constructor(speciesId: Species, preFormKey: string | null, evoFormKey: string | null, level: number, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { this.speciesId = speciesId; @@ -206,7 +206,7 @@ class FriendshipTimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { super(p => p.friendship >= amount && (globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT)); this.timesOfDay = [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]; } else { - super(p => false); + super(_p => false); this.timesOfDay = []; } this.amount = amount; @@ -1898,7 +1898,7 @@ export function initPokemonPrevolutions(): void { if (ev.evoFormKey && megaFormKeys.indexOf(ev.evoFormKey) > -1) { continue; } - pokemonPrevolutions[ev.speciesId] = parseInt(pk) as Species; + pokemonPrevolutions[ev.speciesId] = Number.parseInt(pk) as Species; } }); } diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index d3c9f393209..86060ef4bfc 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,20 +1,8 @@ import { globalScene } from "#app/global-scene"; -import { - AttackMove, - BeakBlastHeaderAttr, - DelayedAttackAttr, - SelfStatusMove, - allMoves, -} from "./moves/move"; +import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, SelfStatusMove, allMoves } from "./moves/move"; import { MoveFlags } from "#enums/MoveFlags"; import type Pokemon from "../field/pokemon"; -import { - type nil, - getFrameMs, - getEnumKeys, - getEnumValues, - animationFileName, -} from "../utils"; +import { type nil, getFrameMs, getEnumKeys, getEnumValues, animationFileName } from "../utils"; import type { BattlerIndex } from "../battle"; import type { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; @@ -24,99 +12,99 @@ import Phaser from "phaser"; import { EncounterAnim } from "#enums/encounter-anims"; export enum AnimFrameTarget { - USER, - TARGET, - GRAPHIC + USER, + TARGET, + GRAPHIC, } enum AnimFocus { - TARGET = 1, - USER, - USER_TARGET, - SCREEN + TARGET = 1, + USER, + USER_TARGET, + SCREEN, } enum AnimBlendType { - NORMAL, - ADD, - SUBTRACT + NORMAL, + ADD, + SUBTRACT, } export enum ChargeAnim { - FLY_CHARGING = 1000, - BOUNCE_CHARGING, - DIG_CHARGING, - FUTURE_SIGHT_CHARGING, - DIVE_CHARGING, - SOLAR_BEAM_CHARGING, - SHADOW_FORCE_CHARGING, - SKULL_BASH_CHARGING, - FREEZE_SHOCK_CHARGING, - SKY_DROP_CHARGING, - SKY_ATTACK_CHARGING, - ICE_BURN_CHARGING, - DOOM_DESIRE_CHARGING, - RAZOR_WIND_CHARGING, - PHANTOM_FORCE_CHARGING, - GEOMANCY_CHARGING, - SHADOW_BLADE_CHARGING, - SOLAR_BLADE_CHARGING, - BEAK_BLAST_CHARGING, - METEOR_BEAM_CHARGING, - ELECTRO_SHOT_CHARGING + FLY_CHARGING = 1000, + BOUNCE_CHARGING, + DIG_CHARGING, + FUTURE_SIGHT_CHARGING, + DIVE_CHARGING, + SOLAR_BEAM_CHARGING, + SHADOW_FORCE_CHARGING, + SKULL_BASH_CHARGING, + FREEZE_SHOCK_CHARGING, + SKY_DROP_CHARGING, + SKY_ATTACK_CHARGING, + ICE_BURN_CHARGING, + DOOM_DESIRE_CHARGING, + RAZOR_WIND_CHARGING, + PHANTOM_FORCE_CHARGING, + GEOMANCY_CHARGING, + SHADOW_BLADE_CHARGING, + SOLAR_BLADE_CHARGING, + BEAK_BLAST_CHARGING, + METEOR_BEAM_CHARGING, + ELECTRO_SHOT_CHARGING, } export enum CommonAnim { - USE_ITEM = 2000, - HEALTH_UP, - TERASTALLIZE, - POISON = 2010, - TOXIC, - PARALYSIS, - SLEEP, - FROZEN, - BURN, - CONFUSION, - ATTRACT, - BIND, - WRAP, - CURSE_NO_GHOST, - LEECH_SEED, - FIRE_SPIN, - PROTECT, - COVET, - WHIRLPOOL, - BIDE, - SAND_TOMB, - QUICK_GUARD, - WIDE_GUARD, - CURSE, - MAGMA_STORM, - CLAMP, - SNAP_TRAP, - THUNDER_CAGE, - INFESTATION, - ORDER_UP_CURLY, - ORDER_UP_DROOPY, - ORDER_UP_STRETCHY, - RAGING_BULL_FIRE, - RAGING_BULL_WATER, - SALT_CURE, - POWDER, - SUNNY = 2100, - RAIN, - SANDSTORM, - HAIL, - SNOW, - WIND, - HEAVY_RAIN, - HARSH_SUN, - STRONG_WINDS, - MISTY_TERRAIN = 2110, - ELECTRIC_TERRAIN, - GRASSY_TERRAIN, - PSYCHIC_TERRAIN, - LOCK_ON = 2120 + USE_ITEM = 2000, + HEALTH_UP, + TERASTALLIZE, + POISON = 2010, + TOXIC, + PARALYSIS, + SLEEP, + FROZEN, + BURN, + CONFUSION, + ATTRACT, + BIND, + WRAP, + CURSE_NO_GHOST, + LEECH_SEED, + FIRE_SPIN, + PROTECT, + COVET, + WHIRLPOOL, + BIDE, + SAND_TOMB, + QUICK_GUARD, + WIDE_GUARD, + CURSE, + MAGMA_STORM, + CLAMP, + SNAP_TRAP, + THUNDER_CAGE, + INFESTATION, + ORDER_UP_CURLY, + ORDER_UP_DROOPY, + ORDER_UP_STRETCHY, + RAGING_BULL_FIRE, + RAGING_BULL_WATER, + SALT_CURE, + POWDER, + SUNNY = 2100, + RAIN, + SANDSTORM, + HAIL, + SNOW, + WIND, + HEAVY_RAIN, + HARSH_SUN, + STRONG_WINDS, + MISTY_TERRAIN = 2110, + ELECTRIC_TERRAIN, + GRASSY_TERRAIN, + PSYCHIC_TERRAIN, + LOCK_ON = 2120, } export class AnimConfig { @@ -128,7 +116,7 @@ export class AnimConfig { public hue: number; constructor(source?: any) { - this.frameTimedEvents = new Map; + this.frameTimedEvents = new Map(); if (source) { this.id = source.id; @@ -160,7 +148,7 @@ export class AnimConfig { timedEvent && timedEvents.push(timedEvent); } - this.frameTimedEvents.set(parseInt(fte), timedEvents); + this.frameTimedEvents.set(Number.parseInt(fte), timedEvents); } this.position = source.position; @@ -218,9 +206,34 @@ class AnimFrame { public priority: number; public focus: AnimFocus; - constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: AnimBlendType, pattern: number, - opacity: number, colorR: number, colorG: number, colorB: number, colorA: number, toneR: number, toneG: number, toneB: number, toneA: number, - flashR: number, flashG: number, flashB: number, flashA: number, locked: boolean, priority: number, focus: AnimFocus, init?: boolean) { + constructor( + x: number, + y: number, + zoomX: number, + zoomY: number, + angle: number, + mirror: boolean, + visible: boolean, + blendType: AnimBlendType, + pattern: number, + opacity: number, + colorR: number, + colorG: number, + colorB: number, + colorA: number, + toneR: number, + toneG: number, + toneB: number, + toneA: number, + flashR: number, + flashG: number, + flashB: number, + flashA: number, + locked: boolean, + priority: number, + focus: AnimFocus, + init?: boolean, + ) { this.x = !init ? ((x || 0) - 128) * 0.5 : x; this.y = !init ? ((y || 0) - 224) * 0.5 : y; if (zoomX) { @@ -272,19 +285,19 @@ class AnimFrame { this.opacity = 0; } if (colorR || colorG || colorB || colorA) { - this.color = [ colorR || 0, colorG || 0, colorB || 0, colorA || 0 ]; + this.color = [colorR || 0, colorG || 0, colorB || 0, colorA || 0]; } else if (init) { - this.color = [ 0, 0, 0, 0 ]; + this.color = [0, 0, 0, 0]; } if (toneR || toneG || toneB || toneA) { - this.tone = [ toneR || 0, toneG || 0, toneB || 0, toneA || 0 ]; + this.tone = [toneR || 0, toneG || 0, toneB || 0, toneA || 0]; } else if (init) { - this.tone = [ 0, 0, 0, 0 ]; + this.tone = [0, 0, 0, 0]; } if (flashR || flashG || flashB || flashA) { - this.flash = [ flashR || 0, flashG || 0, flashB || 0, flashA || 0 ]; + this.flash = [flashR || 0, flashG || 0, flashB || 0, flashA || 0]; } else if (init) { - this.flash = [ 0, 0, 0, 0 ]; + this.flash = [0, 0, 0, 0]; } if (locked) { this.locked = locked; @@ -302,10 +315,37 @@ class AnimFrame { class ImportedAnimFrame extends AnimFrame { constructor(source: any) { - const color: number[] = source.color || [ 0, 0, 0, 0 ]; - const tone: number[] = source.tone || [ 0, 0, 0, 0 ]; - const flash: number[] = source.flash || [ 0, 0, 0, 0 ]; - super(source.x, source.y, source.zoomX, source.zoomY, source.angle, source.mirror, source.visible, source.blendType, source.graphicFrame, source.opacity, color[0], color[1], color[2], color[3], tone[0], tone[1], tone[2], tone[3], flash[0], flash[1], flash[2], flash[3], source.locked, source.priority, source.focus, true); + const color: number[] = source.color || [0, 0, 0, 0]; + const tone: number[] = source.tone || [0, 0, 0, 0]; + const flash: number[] = source.flash || [0, 0, 0, 0]; + super( + source.x, + source.y, + source.zoomX, + source.zoomY, + source.angle, + source.mirror, + source.visible, + source.blendType, + source.graphicFrame, + source.opacity, + color[0], + color[1], + color[2], + color[3], + tone[0], + tone[1], + tone[2], + tone[3], + flash[0], + flash[1], + flash[2], + flash[3], + source.locked, + source.priority, + source.focus, + true, + ); this.target = source.target; this.graphicFrame = source.graphicFrame; } @@ -320,14 +360,14 @@ abstract class AnimTimedEvent { this.resourceName = resourceName; } - abstract execute(battleAnim: BattleAnim, priority?: number): number; + abstract execute(battleAnim: BattleAnim, priority?: number): number; - abstract getEventType(): string; + abstract getEventType(): string; } class AnimTimedSoundEvent extends AnimTimedEvent { - public volume: number = 100; - public pitch: number = 100; + public volume = 100; + public pitch = 100; constructor(frameIndex: number, resourceName: string, source?: any) { super(frameIndex, resourceName); @@ -338,8 +378,8 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } } - execute(battleAnim: BattleAnim, priority?: number): number { - const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; + execute(battleAnim: BattleAnim): number { + const soundConfig = { rate: this.pitch * 0.01, volume: this.volume * 0.01 }; if (this.resourceName) { try { globalScene.playSound(`battle_anims/${this.resourceName}`, soundConfig); @@ -347,9 +387,8 @@ class AnimTimedSoundEvent extends AnimTimedEvent { console.error(err); } return Math.ceil((globalScene.sound.get(`battle_anims/${this.resourceName}`).totalDuration * 1000) / 33.33); - } else { - return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? } + return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? } getEventType(): string { @@ -358,14 +397,14 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } abstract class AnimTimedBgEvent extends AnimTimedEvent { - public bgX: number = 0; - public bgY: number = 0; - public opacity: number = 0; + public bgX = 0; + public bgY = 0; + public opacity = 0; /*public colorRed: number = 0; public colorGreen: number = 0; public colorBlue: number = 0; public colorAlpha: number = 0;*/ - public duration: number = 0; + public duration = 0; /*public flashScope: number = 0; public flashRed: number = 0; public flashGreen: number = 0; @@ -373,7 +412,7 @@ abstract class AnimTimedBgEvent extends AnimTimedEvent { public flashAlpha: number = 0; public flashDuration: number = 0;*/ - constructor(frameIndex: number, resourceName: string, source: any) { + constructor(frameIndex: number, resourceName: string, source?: any) { super(frameIndex, resourceName); if (source) { @@ -396,26 +435,28 @@ abstract class AnimTimedBgEvent extends AnimTimedEvent { } class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: number, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); - } - + // biome-ignore lint/correctness/noUnusedVariables: seems intentional execute(moveAnim: MoveAnim, priority?: number): number { const tweenProps = {}; if (this.bgX !== undefined) { - tweenProps["x"] = (this.bgX * 0.5) - 320; + tweenProps["x"] = this.bgX * 0.5 - 320; } if (this.bgY !== undefined) { - tweenProps["y"] = (this.bgY * 0.5) - 284; + tweenProps["y"] = this.bgY * 0.5 - 284; } if (this.opacity !== undefined) { tweenProps["alpha"] = (this.opacity || 0) / 255; } if (Object.keys(tweenProps).length) { - globalScene.tweens.add(Object.assign({ - targets: moveAnim.bgSprite, - duration: getFrameMs(this.duration * 3) - }, tweenProps)); + globalScene.tweens.add( + Object.assign( + { + targets: moveAnim.bgSprite, + duration: getFrameMs(this.duration * 3), + }, + tweenProps, + ), + ); } return this.duration * 2; } @@ -426,10 +467,6 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { } class AnimTimedAddBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: number, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); - } - execute(moveAnim: MoveAnim, priority?: number): number { if (moveAnim.bgSprite) { moveAnim.bgSprite.destroy(); @@ -450,7 +487,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { globalScene.tweens.add({ targets: moveAnim.bgSprite, - duration: getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3), }); return this.duration * 2; @@ -473,9 +510,12 @@ export function initCommonAnims(): Promise { const commonAnimFetches: Promise>[] = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; - commonAnimFetches.push(globalScene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) - .then(response => response.json()) - .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas)))); + commonAnimFetches.push( + globalScene + .cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas))), + ); } Promise.allSettled(commonAnimFetches).then(() => resolve()); }); @@ -489,10 +529,9 @@ export function initMoveAnim(move: Moves): Promise { } else { const loadedCheckTimer = setInterval(() => { if (moveAnims.get(move) !== null) { - const chargeAnimSource = (allMoves[move].isChargingMove()) + const chargeAnimSource = allMoves[move].isChargingMove() ? allMoves[move] - : (allMoves[move].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource && chargeAnims.get(chargeAnimSource.chargeAnim) === null) { return; } @@ -503,10 +542,16 @@ export function initMoveAnim(move: Moves): Promise { } } else { moveAnims.set(move, null); - const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; + const defaultMoveAnim = + allMoves[move] instanceof AttackMove + ? Moves.TACKLE + : allMoves[move] instanceof SelfStatusMove + ? Moves.FOCUS_ENERGY + : Moves.TAIL_WHIP; const fetchAnimAndResolve = (move: Moves) => { - globalScene.cachedFetch(`./battle-anims/${animationFileName(move)}.json`) + globalScene + .cachedFetch(`./battle-anims/${animationFileName(move)}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { @@ -523,10 +568,9 @@ export function initMoveAnim(move: Moves): Promise { } else { populateMoveAnim(move, ba); } - const chargeAnimSource = (allMoves[move].isChargingMove()) + const chargeAnimSource = allMoves[move].isChargingMove() ? allMoves[move] - : (allMoves[move].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource) { initMoveChargeAnim(chargeAnimSource.chargeAnim).then(() => resolve()); } else { @@ -572,16 +616,19 @@ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { * @param encounterAnim one or more animations to fetch */ export async function initEncounterAnims(encounterAnim: EncounterAnim | EncounterAnim[]): Promise { - const anims = Array.isArray(encounterAnim) ? encounterAnim : [ encounterAnim ]; + const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; const encounterAnimNames = getEnumKeys(EncounterAnim); const encounterAnimFetches: Promise>[] = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { continue; } - encounterAnimFetches.push(globalScene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) - .then(response => response.json()) - .then(cas => encounterAnims.set(anim, new AnimConfig(cas)))); + encounterAnimFetches.push( + globalScene + .cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => encounterAnims.set(anim, new AnimConfig(cas))), + ); } await Promise.allSettled(encounterAnimFetches); } @@ -601,7 +648,8 @@ export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { } } else { chargeAnims.set(chargeAnim, null); - globalScene.cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) + globalScene + .cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) .then(response => response.json()) .then(ca => { if (Array.isArray(ca)) { @@ -622,7 +670,7 @@ function populateMoveAnim(move: Moves, animSource: any): void { moveAnims.set(move, moveAnim); return; } - moveAnims.set(move, [ moveAnims.get(move) as AnimConfig, moveAnim ]); + moveAnims.set(move, [moveAnims.get(move) as AnimConfig, moveAnim]); } function populateMoveChargeAnim(chargeAnim: ChargeAnim, animSource: any) { @@ -631,7 +679,7 @@ function populateMoveChargeAnim(chargeAnim: ChargeAnim, animSource: any) { chargeAnims.set(chargeAnim, moveChargeAnim); return; } - chargeAnims.set(chargeAnim, [ chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim ]); + chargeAnims.set(chargeAnim, [chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim]); } export function loadCommonAnimAssets(startLoad?: boolean): Promise { @@ -651,12 +699,11 @@ export async function loadEncounterAnimAssets(startLoad?: boolean): Promise { return new Promise(resolve => { - const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); + const moveAnimations = moveIds.flatMap(m => moveAnims.get(m) as AnimConfig); for (const moveId of moveIds) { - const chargeAnimSource = (allMoves[moveId].isChargingMove()) + const chargeAnimSource = allMoves[moveId].isChargingMove() ? allMoves[moveId] - : (allMoves[moveId].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[moveId].getAttrs(DelayedAttackAttr)[0] ?? allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource) { const moveChargeAnims = chargeAnims.get(chargeAnimSource.chargeAnim); moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct? @@ -707,11 +754,11 @@ function loadAnimAssets(anims: AnimConfig[], startLoad?: boolean): Promise } interface GraphicFrameData { - x: number, - y: number, - scaleX: number, - scaleY: number, - angle: number + x: number; + y: number; + scaleX: number; + scaleY: number; + angle: number; } const userFocusX = 106; @@ -719,25 +766,43 @@ const userFocusY = 148 - 32; const targetFocusX = 234; const targetFocusY = 84 - 32; -function transformPoint(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number, px: number, py: number): [ x: number, y: number ] { +function transformPoint( + x1: number, + y1: number, + x2: number, + y2: number, + x3: number, + y3: number, + x4: number, + y4: number, + px: number, + py: number, +): [x: number, y: number] { const yIntersect = yAxisIntersect(x1, y1, x2, y2, px, py); return repositionY(x3, y3, x4, y4, yIntersect[0], yIntersect[1]); } -function yAxisIntersect(x1: number, y1: number, x2: number, y2: number, px: number, py: number): [ x: number, y: number ] { +function yAxisIntersect( + x1: number, + y1: number, + x2: number, + y2: number, + px: number, + py: number, +): [x: number, y: number] { const dx = x2 - x1; const dy = y2 - y1; const x = dx === 0 ? 0 : (px - x1) / dx; const y = dy === 0 ? 0 : (py - y1) / dy; - return [ x, y ]; + return [x, y]; } -function repositionY(x1: number, y1: number, x2: number, y2: number, tx: number, ty: number): [ x: number, y: number ] { +function repositionY(x1: number, y1: number, x2: number, y2: number, tx: number, ty: number): [x: number, y: number] { const dx = x2 - x1; const dy = y2 - y1; - const x = x1 + (tx * dx); - const y = y1 + (ty * dy); - return [ x, y ]; + const x = x1 + tx * dx; + const y = y1 + ty * dy; + return [x, y]; } function isReversed(src1: number, src2: number, dst1: number, dst2: number) { @@ -751,7 +816,7 @@ function isReversed(src1: number, src2: number, dst1: number, dst2: number) { } interface SpriteCache { - [key: number]: Phaser.GameObjects.Sprite[] + [key: number]: Phaser.GameObjects.Sprite[]; } export abstract class BattleAnim { @@ -769,511 +834,590 @@ export abstract class BattleAnim { private srcLine: number[]; private dstLine: number[]; - constructor(user?: Pokemon, target?: Pokemon, playRegardlessOfIssues: boolean = false) { + constructor(user?: Pokemon, target?: Pokemon, playRegardlessOfIssues = false) { this.user = user ?? null; this.target = target ?? null; this.sprites = []; this.playRegardlessOfIssues = playRegardlessOfIssues; } - abstract getAnim(): AnimConfig | null; + abstract getAnim(): AnimConfig | null; - abstract isOppAnim(): boolean; + abstract isOppAnim(): boolean; - protected isHideUser(): boolean { - return false; - } + protected isHideUser(): boolean { + return false; + } - protected isHideTarget(): boolean { - return false; - } + protected isHideTarget(): boolean { + return false; + } - private getGraphicFrameData(frames: AnimFrame[], onSubstitute?: boolean): Map> { - const ret: Map> = new Map([ - [ AnimFrameTarget.GRAPHIC, new Map() ], - [ AnimFrameTarget.USER, new Map() ], - [ AnimFrameTarget.TARGET, new Map() ] - ]); + private getGraphicFrameData( + frames: AnimFrame[], + onSubstitute?: boolean, + ): Map> { + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map()], + [AnimFrameTarget.USER, new Map()], + [AnimFrameTarget.TARGET, new Map()], + ]); - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user : this.target; - const target = !isOppAnim ? this.target : this.user; + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user : this.target; + const target = !isOppAnim ? this.target : this.user; - const targetSubstitute = (onSubstitute && user !== target) ? target!.getTag(SubstituteTag) : null; + const targetSubstitute = onSubstitute && user !== target ? target!.getTag(SubstituteTag) : null; - const userInitialX = user!.x; // TODO: is this bang correct? - const userInitialY = user!.y; // TODO: is this bang correct? - const userHalfHeight = user!.getSprite().displayHeight! / 2; // TODO: is this bang correct? + const userInitialX = user!.x; // TODO: is this bang correct? + const userInitialY = user!.y; // TODO: is this bang correct? + const userHalfHeight = user!.getSprite().displayHeight! / 2; // TODO: is this bang correct? - const targetInitialX = targetSubstitute?.sprite?.x ?? target!.x; // TODO: is this bang correct? - const targetInitialY = targetSubstitute?.sprite?.y ?? target!.y; // TODO: is this bang correct? - const targetHalfHeight = (targetSubstitute?.sprite ?? target!.getSprite()).displayHeight! / 2; // TODO: is this bang correct? + const targetInitialX = targetSubstitute?.sprite?.x ?? target!.x; // TODO: is this bang correct? + const targetInitialY = targetSubstitute?.sprite?.y ?? target!.y; // TODO: is this bang correct? + const targetHalfHeight = (targetSubstitute?.sprite ?? target!.getSprite()).displayHeight! / 2; // TODO: is this bang correct? - let g = 0; - let u = 0; - let t = 0; + let g = 0; + let u = 0; + let t = 0; - for (const frame of frames) { - let x = frame.x + 106; - let y = frame.y + 116; - let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); - const scaleY = (frame.zoomY / 100); - switch (frame.focus) { - case AnimFocus.TARGET: - x += targetInitialX - targetFocusX; - y += (targetInitialY - targetHalfHeight) - targetFocusY; - break; - case AnimFocus.USER: - x += userInitialX - userFocusX; - y += (userInitialY - userHalfHeight) - userFocusY; - break; - case AnimFocus.USER_TARGET: - const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], - this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); + for (const frame of frames) { + let x = frame.x + 106; + let y = frame.y + 116; + let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = frame.zoomY / 100; + switch (frame.focus) { + case AnimFocus.TARGET: + x += targetInitialX - targetFocusX; + y += targetInitialY - targetHalfHeight - targetFocusY; + break; + case AnimFocus.USER: + x += userInitialX - userFocusX; + y += userInitialY - userHalfHeight - userFocusY; + break; + case AnimFocus.USER_TARGET: + { + const point = transformPoint( + this.srcLine[0], + this.srcLine[1], + this.srcLine[2], + this.srcLine[3], + this.dstLine[0], + this.dstLine[1] - userHalfHeight, + this.dstLine[2], + this.dstLine[3] - targetHalfHeight, + x, + y, + ); x = point[0]; y = point[1]; - if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { + if ( + frame.target === AnimFrameTarget.GRAPHIC && + isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2]) + ) { scaleX = scaleX * -1; } - break; - } - const angle = -frame.angle; - const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target)!.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); // TODO: is the bang correct? + } + break; } - - return ret; + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target)!.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); // TODO: is the bang correct? } - play(onSubstitute?: boolean, callback?: Function) { - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? - const target = !isOppAnim ? this.target! : this.user!; + return ret; + } - if (!target?.isOnField() && !this.playRegardlessOfIssues) { - if (callback) { - callback(); - } - return; + // biome-ignore lint/complexity/noBannedTypes: callback is used liberally + play(onSubstitute?: boolean, callback?: Function) { + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? + const target = !isOppAnim ? this.target! : this.user!; + + if (!target?.isOnField() && !this.playRegardlessOfIssues) { + if (callback) { + callback(); } - - const targetSubstitute = (!!onSubstitute && user !== target) ? target.getTag(SubstituteTag) : null; - - const userSprite = user.getSprite(); - const targetSprite = targetSubstitute?.sprite ?? target.getSprite(); - - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; - const spritePriorities: number[] = []; - - const cleanUpAndComplete = () => { - userSprite.setPosition(0, 0); - userSprite.setScale(1); - userSprite.setAlpha(1); - userSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; - userSprite.setAngle(0); - if (!targetSubstitute) { - targetSprite.setPosition(0, 0); - targetSprite.setScale(1); - targetSprite.setAlpha(1); - } else { - targetSprite.setPosition( - target.x - target.getSubstituteOffset()[0], - target.y - target.getSubstituteOffset()[1] - ); - targetSprite.setScale(target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1)); - targetSprite.setAlpha(1); - } - targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; - targetSprite.setAngle(0); - - /** - * This and `targetSpriteToShow` are used to restore context lost - * from the `isOppAnim` swap. Using these references instead of `this.user` - * and `this.target` prevent the target's Substitute doll from disappearing - * after being the target of an animation. - */ - const userSpriteToShow = !isOppAnim ? userSprite : targetSprite; - const targetSpriteToShow = !isOppAnim ? targetSprite : userSprite; - if (!this.isHideUser() && userSpriteToShow) { - userSpriteToShow.setVisible(true); - } - if (!this.isHideTarget() && (targetSpriteToShow !== userSpriteToShow || !this.isHideUser())) { - targetSpriteToShow.setVisible(true); - } - for (const ms of Object.values(spriteCache).flat()) { - if (ms) { - ms.destroy(); - } - } - if (this.bgSprite) { - this.bgSprite.destroy(); - } - if (callback) { - callback(); - } - }; - - if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { - return cleanUpAndComplete(); - } - - const anim = this.getAnim(); - - const userInitialX = user.x; - const userInitialY = user.y; - const targetInitialX = targetSubstitute?.sprite?.x ?? target.x; - const targetInitialY = targetSubstitute?.sprite?.y ?? target.y; - - this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; - this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; - - let r = anim?.frames.length ?? 0; - let f = 0; - - globalScene.tweens.addCounter({ - duration: getFrameMs(3), - repeat: anim?.frames.length ?? 0, - onRepeat: () => { - if (!f) { - userSprite.setVisible(false); - targetSprite.setVisible(false); - } - - const spriteFrames = anim!.frames[f]; // TODO: is the bang correcT? - const frameData = this.getGraphicFrameData(anim!.frames[f], onSubstitute); // TODO: is the bang correct? - let u = 0; - let t = 0; - let g = 0; - for (const frame of spriteFrames) { - if (frame.target !== AnimFrameTarget.GRAPHIC) { - const isUser = frame.target === AnimFrameTarget.USER; - if (isUser && target === user) { - continue; - } else if (this.playRegardlessOfIssues && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) { - continue; - } - const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; - const spriteSource = isUser ? userSprite : targetSprite; - if ((isUser ? u : t) === sprites.length) { - if (isUser || !targetSubstitute) { - const sprite = globalScene.addPokemonSprite(isUser ? user! : target, 0, 0, spriteSource!.texture, spriteSource!.frame.name, true); // TODO: are those bangs correct? - [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = (isUser ? user! : target).getSprite().pipelineData[k]); // TODO: are those bangs correct? - sprite.setPipelineData("spriteKey", (isUser ? user! : target).getBattleSpriteKey()); - sprite.setPipelineData("shiny", (isUser ? user : target).shiny); - sprite.setPipelineData("variant", (isUser ? user : target).variant); - sprite.setPipelineData("ignoreFieldPos", true); - spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); - globalScene.field.add(sprite); - sprites.push(sprite); - } else { - const sprite = globalScene.addFieldSprite(spriteSource.x, spriteSource.y, spriteSource.texture); - spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); - globalScene.field.add(sprite); - sprites.push(sprite); - } - } - - const spriteIndex = isUser ? u++ : t++; - const pokemonSprite = sprites[spriteIndex]; - const graphicFrameData = frameData.get(frame.target)!.get(spriteIndex)!; // TODO: are the bangs correct? - const spriteSourceScale = (isUser || !targetSubstitute) - ? spriteSource.parentContainer.scale - : target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1); - pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSourceScale - 1))); - - pokemonSprite.setAngle(graphicFrameData.angle); - pokemonSprite.setScale(graphicFrameData.scaleX * spriteSourceScale, graphicFrameData.scaleY * spriteSourceScale); - - pokemonSprite.setData("locked", frame.locked); - - pokemonSprite.setAlpha(frame.opacity / 255); - pokemonSprite.pipelineData["tone"] = frame.tone; - pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); - pokemonSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } else { - const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; - if (g === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); // TODO: is the bang correct? - sprites.push(newSprite); - globalScene.field.add(newSprite); - spritePriorities.push(1); - } - - const graphicIndex = g++; - const moveSprite = sprites[graphicIndex]; - if (spritePriorities[graphicIndex] !== frame.priority) { - spritePriorities[graphicIndex] = frame.priority; - /** Move the position that the moveSprite is rendered in based on the priority. - * @param priority The priority level to draw the sprite. - * - 0: Draw the sprite in front of the pokemon on the field. - * - 1: Draw the sprite in front of the user pokemon. - * - 2: Draw the sprite in front of its `bgSprite` (if it has one), or its - * `AnimFocus` (if that is user/target), otherwise behind everything. - * - 3: Draw the sprite behind its `AnimFocus` (if that is user/target), otherwise in front of everything. - */ - const setSpritePriority = (priority: number) => { - /** The sprite we are moving the moveSprite in relation to */ - let targetSprite: Phaser.GameObjects.GameObject | nil; - /** The method that is being used to move the sprite.*/ - let moveFunc: ((sprite: Phaser.GameObjects.GameObject, target: Phaser.GameObjects.GameObject) => void) | - ((sprite: Phaser.GameObjects.GameObject) => void) = globalScene.field.bringToTop; - - if (priority === 0) { // Place the sprite in front of the pokemon on the field. - targetSprite = globalScene.getEnemyField().find(p => p) ?? globalScene.getPlayerField().find(p => p); - console.log(typeof targetSprite); - moveFunc = globalScene.field.moveBelow; - } else if (priority === 2 && this.bgSprite) { - moveFunc = globalScene.field.moveAbove; - targetSprite = this.bgSprite; - } else if (priority === 2 || priority === 3) { - moveFunc = priority === 2 ? globalScene.field.moveBelow : globalScene.field.moveAbove; - if (frame.focus === AnimFocus.USER) { - targetSprite = this.user; - } else if (frame.focus === AnimFocus.TARGET) { - targetSprite = this.target; - } - } - // If target sprite is not undefined and exists in the field container, then move the sprite using the moveFunc. - // Otherwise, default to just bringing it to the top. - targetSprite && globalScene.field.exists(targetSprite) ? moveFunc.bind(globalScene.field)(moveSprite as Phaser.GameObjects.GameObject, targetSprite) : globalScene.field.bringToTop(moveSprite as Phaser.GameObjects.GameObject); - }; - setSpritePriority(frame.priority); - } - moveSprite.setFrame(frame.graphicFrame); - //console.log(AnimFocus[frame.focus]); - - const graphicFrameData = frameData.get(frame.target)!.get(graphicIndex)!; // TODO: are those bangs correct? - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } - } - if (anim?.frameTimedEvents.has(f)) { - const base = anim.frames.length - f; - // Bang is correct due to `has` check above, which cannot return true for an undefined / null `f` - for (const event of anim.frameTimedEvents.get(f)!) { - r = Math.max(base + event.execute(this), r); - } - } - const targets = getEnumValues(AnimFrameTarget); - for (const i of targets) { - const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; - if (count < spriteCache[i].length) { - const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); - for (const rs of spritesToRemove) { - if (!rs.getData("locked") as boolean) { - const spriteCacheIndex = spriteCache[i].indexOf(rs); - spriteCache[i].splice(spriteCacheIndex, 1); - if (i === AnimFrameTarget.GRAPHIC) { - spritePriorities.splice(spriteCacheIndex, 1); - } - rs.destroy(); - } - } - } - } - f++; - r--; - }, - onComplete: () => { - for (const ms of Object.values(spriteCache).flat()) { - if (ms && !ms.getData("locked")) { - ms.destroy(); - } - } - if (r) { - globalScene.tweens.addCounter({ - duration: getFrameMs(r), - onComplete: () => cleanUpAndComplete() - }); - } else { - cleanUpAndComplete(); - } - } - }); + return; } - private getGraphicFrameDataWithoutTarget(frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map> { - const ret: Map> = new Map([ - [ AnimFrameTarget.GRAPHIC, new Map() ], - [ AnimFrameTarget.USER, new Map() ], - [ AnimFrameTarget.TARGET, new Map() ] - ]); + const targetSubstitute = !!onSubstitute && user !== target ? target.getTag(SubstituteTag) : null; - let g = 0; - let u = 0; - let t = 0; + const userSprite = user.getSprite(); + const targetSprite = targetSubstitute?.sprite ?? target.getSprite(); - for (const frame of frames) { - let { x, y } = frame; - const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); - const scaleY = (frame.zoomY / 100); - x += targetInitialX; - y += targetInitialY; - const angle = -frame.angle; - const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target)?.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [], + }; + const spritePriorities: number[] = []; + + const cleanUpAndComplete = () => { + userSprite.setPosition(0, 0); + userSprite.setScale(1); + userSprite.setAlpha(1); + userSprite.pipelineData["tone"] = [0.0, 0.0, 0.0, 0.0]; + userSprite.setAngle(0); + if (!targetSubstitute) { + targetSprite.setPosition(0, 0); + targetSprite.setScale(1); + targetSprite.setAlpha(1); + } else { + targetSprite.setPosition( + target.x - target.getSubstituteOffset()[0], + target.y - target.getSubstituteOffset()[1], + ); + targetSprite.setScale(target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1)); + targetSprite.setAlpha(1); } + targetSprite.pipelineData["tone"] = [0.0, 0.0, 0.0, 0.0]; + targetSprite.setAngle(0); - return ret; + /** + * This and `targetSpriteToShow` are used to restore context lost + * from the `isOppAnim` swap. Using these references instead of `this.user` + * and `this.target` prevent the target's Substitute doll from disappearing + * after being the target of an animation. + */ + const userSpriteToShow = !isOppAnim ? userSprite : targetSprite; + const targetSpriteToShow = !isOppAnim ? targetSprite : userSprite; + if (!this.isHideUser() && userSpriteToShow) { + userSpriteToShow.setVisible(true); + } + if (!this.isHideTarget() && (targetSpriteToShow !== userSpriteToShow || !this.isHideUser())) { + targetSpriteToShow.setVisible(true); + } + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; + + if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { + return cleanUpAndComplete(); } - /** - * @param targetInitialX - * @param targetInitialY - * @param frameTimeMult - * @param frameTimedEventPriority - * - 0 is behind all other sprites (except BG) - * - 1 on top of player field - * - 3 is on top of both fields - * - 5 is on top of player sprite - * @param callback - */ - playWithoutTargets(targetInitialX: number, targetInitialY: number, frameTimeMult: number, frameTimedEventPriority?: 0 | 1 | 3 | 5, callback?: Function) { - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; + const anim = this.getAnim(); - const cleanUpAndComplete = () => { - for (const ms of Object.values(spriteCache).flat()) { - if (ms) { - ms.destroy(); - } + const userInitialX = user.x; + const userInitialY = user.y; + const targetInitialX = targetSubstitute?.sprite?.x ?? target.x; + const targetInitialY = targetSubstitute?.sprite?.y ?? target.y; + + this.srcLine = [userFocusX, userFocusY, targetFocusX, targetFocusY]; + this.dstLine = [userInitialX, userInitialY, targetInitialX, targetInitialY]; + + let r = anim?.frames.length ?? 0; + let f = 0; + + globalScene.tweens.addCounter({ + duration: getFrameMs(3), + repeat: anim?.frames.length ?? 0, + onRepeat: () => { + if (!f) { + userSprite.setVisible(false); + targetSprite.setVisible(false); } - if (this.bgSprite) { - this.bgSprite.destroy(); - } - if (callback) { - callback(); - } - }; - if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { - return cleanUpAndComplete(); - } - - const anim = this.getAnim(); - - this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; - this.dstLine = [ 150, 75, targetInitialX, targetInitialY ]; - - let totalFrames = anim!.frames.length; - let frameCount = 0; - - let existingFieldSprites = globalScene.field.getAll().slice(0); - - globalScene.tweens.addCounter({ - duration: getFrameMs(3) * frameTimeMult, - repeat: anim!.frames.length, - onRepeat: () => { - existingFieldSprites = globalScene.field.getAll().slice(0); - const spriteFrames = anim!.frames[frameCount]; - const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[frameCount], targetInitialX, targetInitialY); - let graphicFrameCount = 0; - for (const frame of spriteFrames) { - if (frame.target !== AnimFrameTarget.GRAPHIC) { - console.log("Encounter animations do not support targets"); + const spriteFrames = anim!.frames[f]; // TODO: is the bang correcT? + const frameData = this.getGraphicFrameData(anim!.frames[f], onSubstitute); // TODO: is the bang correct? + let u = 0; + let t = 0; + let g = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + const isUser = frame.target === AnimFrameTarget.USER; + if (isUser && target === user) { continue; } - - const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; - if (graphicFrameCount === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); - sprites.push(newSprite); - globalScene.field.add(newSprite); + if (this.playRegardlessOfIssues && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) { + continue; + } + const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; + const spriteSource = isUser ? userSprite : targetSprite; + if ((isUser ? u : t) === sprites.length) { + if (isUser || !targetSubstitute) { + const sprite = globalScene.addPokemonSprite( + isUser ? user! : target, + 0, + 0, + spriteSource!.texture, + spriteSource!.frame.name, + true, + ); // TODO: are those bangs correct? + ["spriteColors", "fusionSpriteColors"].map( + k => (sprite.pipelineData[k] = (isUser ? user! : target).getSprite().pipelineData[k]), + ); // TODO: are those bangs correct? + sprite.setPipelineData("spriteKey", (isUser ? user! : target).getBattleSpriteKey()); + sprite.setPipelineData("shiny", (isUser ? user : target).shiny); + sprite.setPipelineData("variant", (isUser ? user : target).variant); + sprite.setPipelineData("ignoreFieldPos", true); + spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + globalScene.field.add(sprite); + sprites.push(sprite); + } else { + const sprite = globalScene.addFieldSprite(spriteSource.x, spriteSource.y, spriteSource.texture); + spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + globalScene.field.add(sprite); + sprites.push(sprite); + } } - const graphicIndex = graphicFrameCount++; + const spriteIndex = isUser ? u++ : t++; + const pokemonSprite = sprites[spriteIndex]; + const graphicFrameData = frameData.get(frame.target)!.get(spriteIndex)!; // TODO: are the bangs correct? + const spriteSourceScale = + isUser || !targetSubstitute + ? spriteSource.parentContainer.scale + : target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1); + pokemonSprite.setPosition( + graphicFrameData.x, + graphicFrameData.y - (spriteSource.height / 2) * (spriteSourceScale - 1), + ); + + pokemonSprite.setAngle(graphicFrameData.angle); + pokemonSprite.setScale( + graphicFrameData.scaleX * spriteSourceScale, + graphicFrameData.scaleY * spriteSourceScale, + ); + + pokemonSprite.setData("locked", frame.locked); + + pokemonSprite.setAlpha(frame.opacity / 255); + pokemonSprite.pipelineData["tone"] = frame.tone; + pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); + pokemonSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); + } else { + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (g === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); // TODO: is the bang correct? + sprites.push(newSprite); + globalScene.field.add(newSprite); + spritePriorities.push(1); + } + + const graphicIndex = g++; const moveSprite = sprites[graphicIndex]; - if (!isNullOrUndefined(frame.priority)) { + if (spritePriorities[graphicIndex] !== frame.priority) { + spritePriorities[graphicIndex] = frame.priority; + /** Move the position that the moveSprite is rendered in based on the priority. + * @param priority The priority level to draw the sprite. + * - 0: Draw the sprite in front of the pokemon on the field. + * - 1: Draw the sprite in front of the user pokemon. + * - 2: Draw the sprite in front of its `bgSprite` (if it has one), or its + * `AnimFocus` (if that is user/target), otherwise behind everything. + * - 3: Draw the sprite behind its `AnimFocus` (if that is user/target), otherwise in front of everything. + */ const setSpritePriority = (priority: number) => { - if (existingFieldSprites.length > priority) { - // Move to specified priority index - const index = globalScene.field.getIndex(existingFieldSprites[priority]); - globalScene.field.moveTo(moveSprite, index); - } else { - // Move to top of scene - globalScene.field.moveTo(moveSprite, globalScene.field.getAll().length - 1); + /** The sprite we are moving the moveSprite in relation to */ + let targetSprite: Phaser.GameObjects.GameObject | nil; + /** The method that is being used to move the sprite.*/ + let moveFunc: + | ((sprite: Phaser.GameObjects.GameObject, target: Phaser.GameObjects.GameObject) => void) + | ((sprite: Phaser.GameObjects.GameObject) => void) = globalScene.field.bringToTop; + + if (priority === 0) { + // Place the sprite in front of the pokemon on the field. + targetSprite = globalScene.getEnemyField().find(p => p) ?? globalScene.getPlayerField().find(p => p); + console.log(typeof targetSprite); + moveFunc = globalScene.field.moveBelow; + } else if (priority === 2 && this.bgSprite) { + moveFunc = globalScene.field.moveAbove; + targetSprite = this.bgSprite; + } else if (priority === 2 || priority === 3) { + moveFunc = priority === 2 ? globalScene.field.moveBelow : globalScene.field.moveAbove; + if (frame.focus === AnimFocus.USER) { + targetSprite = this.user; + } else if (frame.focus === AnimFocus.TARGET) { + targetSprite = this.target; + } } + // If target sprite is not undefined and exists in the field container, then move the sprite using the moveFunc. + // Otherwise, default to just bringing it to the top. + targetSprite && globalScene.field.exists(targetSprite) + ? moveFunc.bind(globalScene.field)(moveSprite as Phaser.GameObjects.GameObject, targetSprite) + : globalScene.field.bringToTop(moveSprite as Phaser.GameObjects.GameObject); }; setSpritePriority(frame.priority); } moveSprite.setFrame(frame.graphicFrame); + //console.log(AnimFocus[frame.focus]); - const graphicFrameData = frameData.get(frame.target)?.get(graphicIndex); - if (graphicFrameData) { - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + const graphicFrameData = frameData.get(frame.target)!.get(graphicIndex)!; // TODO: are those bangs correct? + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); } - if (anim?.frameTimedEvents.get(frameCount)) { - const base = anim.frames.length - frameCount; - for (const event of anim.frameTimedEvents.get(frameCount)!) { - totalFrames = Math.max(base + event.execute(this, frameTimedEventPriority), totalFrames); - } + } + if (anim?.frameTimedEvents.has(f)) { + const base = anim.frames.length - f; + // Bang is correct due to `has` check above, which cannot return true for an undefined / null `f` + for (const event of anim.frameTimedEvents.get(f)!) { + r = Math.max(base + event.execute(this), r); } - const targets = getEnumValues(AnimFrameTarget); - for (const i of targets) { - const count = graphicFrameCount; - if (count < spriteCache[i].length) { - const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); - for (const sprite of spritesToRemove) { - if (!sprite.getData("locked") as boolean) { - const spriteCacheIndex = spriteCache[i].indexOf(sprite); - spriteCache[i].splice(spriteCacheIndex, 1); - sprite.destroy(); + } + const targets = getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const rs of spritesToRemove) { + if (!rs.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(rs); + spriteCache[i].splice(spriteCacheIndex, 1); + if (i === AnimFrameTarget.GRAPHIC) { + spritePriorities.splice(spriteCacheIndex, 1); } + rs.destroy(); } } } - frameCount++; - totalFrames--; - }, - onComplete: () => { - for (const sprite of Object.values(spriteCache).flat()) { - if (sprite && !sprite.getData("locked")) { - sprite.destroy(); - } - } - if (totalFrames) { - globalScene.tweens.addCounter({ - duration: getFrameMs(totalFrames), - onComplete: () => cleanUpAndComplete() - }); - } else { - cleanUpAndComplete(); + } + f++; + r--; + }, + onComplete: () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms && !ms.getData("locked")) { + ms.destroy(); } } + if (r) { + globalScene.tweens.addCounter({ + duration: getFrameMs(r), + onComplete: () => cleanUpAndComplete(), + }); + } else { + cleanUpAndComplete(); + } + }, + }); + } + + private getGraphicFrameDataWithoutTarget( + frames: AnimFrame[], + targetInitialX: number, + targetInitialY: number, + ): Map> { + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map()], + [AnimFrameTarget.USER, new Map()], + [AnimFrameTarget.TARGET, new Map()], + ]); + + let g = 0; + let u = 0; + let t = 0; + + for (const frame of frames) { + let { x, y } = frame; + const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = frame.zoomY / 100; + x += targetInitialX; + y += targetInitialY; + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target)?.set(key, { + x: x, + y: y, + scaleX: scaleX, + scaleY: scaleY, + angle: angle, }); } + + return ret; + } + + /** + * @param targetInitialX + * @param targetInitialY + * @param frameTimeMult + * @param frameTimedEventPriority + * - 0 is behind all other sprites (except BG) + * - 1 on top of player field + * - 3 is on top of both fields + * - 5 is on top of player sprite + * @param callback + */ + playWithoutTargets( + targetInitialX: number, + targetInitialY: number, + frameTimeMult: number, + frameTimedEventPriority?: 0 | 1 | 3 | 5, + // biome-ignore lint/complexity/noBannedTypes: callback is used liberally + callback?: Function, + ) { + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [], + }; + + const cleanUpAndComplete = () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; + + if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { + return cleanUpAndComplete(); + } + + const anim = this.getAnim(); + + this.srcLine = [userFocusX, userFocusY, targetFocusX, targetFocusY]; + this.dstLine = [150, 75, targetInitialX, targetInitialY]; + + let totalFrames = anim!.frames.length; + let frameCount = 0; + + let existingFieldSprites = globalScene.field.getAll().slice(0); + + globalScene.tweens.addCounter({ + duration: getFrameMs(3) * frameTimeMult, + repeat: anim!.frames.length, + onRepeat: () => { + existingFieldSprites = globalScene.field.getAll().slice(0); + const spriteFrames = anim!.frames[frameCount]; + const frameData = this.getGraphicFrameDataWithoutTarget( + anim!.frames[frameCount], + targetInitialX, + targetInitialY, + ); + let graphicFrameCount = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + console.log("Encounter animations do not support targets"); + continue; + } + + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (graphicFrameCount === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); + sprites.push(newSprite); + globalScene.field.add(newSprite); + } + + const graphicIndex = graphicFrameCount++; + const moveSprite = sprites[graphicIndex]; + if (!isNullOrUndefined(frame.priority)) { + const setSpritePriority = (priority: number) => { + if (existingFieldSprites.length > priority) { + // Move to specified priority index + const index = globalScene.field.getIndex(existingFieldSprites[priority]); + globalScene.field.moveTo(moveSprite, index); + } else { + // Move to top of scene + globalScene.field.moveTo(moveSprite, globalScene.field.getAll().length - 1); + } + }; + setSpritePriority(frame.priority); + } + moveSprite.setFrame(frame.graphicFrame); + + const graphicFrameData = frameData.get(frame.target)?.get(graphicIndex); + if (graphicFrameData) { + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); + } + } + if (anim?.frameTimedEvents.get(frameCount)) { + const base = anim.frames.length - frameCount; + for (const event of anim.frameTimedEvents.get(frameCount)!) { + totalFrames = Math.max(base + event.execute(this, frameTimedEventPriority), totalFrames); + } + } + const targets = getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = graphicFrameCount; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const sprite of spritesToRemove) { + if (!sprite.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(sprite); + spriteCache[i].splice(spriteCacheIndex, 1); + sprite.destroy(); + } + } + } + } + frameCount++; + totalFrames--; + }, + onComplete: () => { + for (const sprite of Object.values(spriteCache).flat()) { + if (sprite && !sprite.getData("locked")) { + sprite.destroy(); + } + } + if (totalFrames) { + globalScene.tweens.addCounter({ + duration: getFrameMs(totalFrames), + onComplete: () => cleanUpAndComplete(), + }); + } else { + cleanUpAndComplete(); + } + }, + }); + } } export class CommonBattleAnim extends BattleAnim { public commonAnim: CommonAnim | null; - constructor(commonAnim: CommonAnim | null, user: Pokemon, target?: Pokemon, playOnEmptyField: boolean = false) { + constructor(commonAnim: CommonAnim | null, user: Pokemon, target?: Pokemon, playOnEmptyField = false) { super(user, target || user, playOnEmptyField); this.commonAnim = commonAnim; } getAnim(): AnimConfig | null { - return this.commonAnim ? commonAnims.get(this.commonAnim) ?? null : null; + return this.commonAnim ? (commonAnims.get(this.commonAnim) ?? null) : null; } isOppAnim(): boolean { @@ -1284,7 +1428,7 @@ export class CommonBattleAnim extends BattleAnim { export class MoveAnim extends BattleAnim { public move: Moves; - constructor(move: Moves, user: Pokemon, target: BattlerIndex, playOnEmptyField: boolean = false) { + constructor(move: Moves, user: Pokemon, target: BattlerIndex, playOnEmptyField = false) { super(user, globalScene.getField()[target], playOnEmptyField); this.move = move; @@ -1292,8 +1436,8 @@ export class MoveAnim extends BattleAnim { getAnim(): AnimConfig { return moveAnims.get(this.move) instanceof AnimConfig - ? moveAnims.get(this.move) as AnimConfig - : moveAnims.get(this.move)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig; + ? (moveAnims.get(this.move) as AnimConfig) + : (moveAnims.get(this.move)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig); } isOppAnim(): boolean { @@ -1324,8 +1468,8 @@ export class MoveChargeAnim extends MoveAnim { getAnim(): AnimConfig { return chargeAnims.get(this.chargeAnim) instanceof AnimConfig - ? chargeAnims.get(this.chargeAnim) as AnimConfig - : chargeAnims.get(this.chargeAnim)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig; + ? (chargeAnims.get(this.chargeAnim) as AnimConfig) + : (chargeAnims.get(this.chargeAnim)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig); } } @@ -1363,9 +1507,9 @@ export async function populateAnims() { moveNameToId[moveName] = move; } - const seNames: string[] = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); + const seNames: string[] = []; //(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); - const animsData : any[] = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); // TODO: add a proper type + const animsData: any[] = []; //battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); // TODO: add a proper type for (let a = 0; a < animsData.length; a++) { const fields = animsData[a].split("@").slice(1); @@ -1396,51 +1540,84 @@ export async function populateAnims() { if (commonAnimId) { commonAnims.set(commonAnimId, anim); } else if (chargeAnimId) { - chargeAnims.set(chargeAnimId, !isOppMove ? anim : [ chargeAnims.get(chargeAnimId) as AnimConfig, anim ]); + chargeAnims.set(chargeAnimId, !isOppMove ? anim : [chargeAnims.get(chargeAnimId) as AnimConfig, anim]); } else { - moveAnims.set(moveNameToId[animName], !isOppMove ? anim as AnimConfig : [ moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig ]); + moveAnims.set( + moveNameToId[animName], + !isOppMove ? (anim as AnimConfig) : [moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig], + ); } for (let f = 0; f < fields.length; f++) { const field = fields[f]; const fieldName = field.slice(0, field.indexOf(":")); const fieldData = field.slice(fieldName.length + 1, field.lastIndexOf("\n")).trim(); switch (fieldName) { - case "array": + case "array": { const framesData = fieldData.split(" - - - ").slice(1); for (let fd = 0; fd < framesData.length; fd++) { anim.frames.push([]); const frameData = framesData[fd]; const focusFramesData = frameData.split(" - - "); for (let tf = 0; tf < focusFramesData.length; tf++) { - const values = focusFramesData[tf].replace(/ \- /g, "").split("\n"); - const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), - parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), - parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), - parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); + const values = focusFramesData[tf].replace(/ {6}\- /g, "").split("\n"); + const targetFrame = new AnimFrame( + Number.parseFloat(values[0]), + Number.parseFloat(values[1]), + Number.parseFloat(values[2]), + Number.parseFloat(values[11]), + Number.parseFloat(values[3]), + Number.parseInt(values[4]) === 1, + Number.parseInt(values[6]) === 1, + Number.parseInt(values[5]), + Number.parseInt(values[7]), + Number.parseInt(values[8]), + Number.parseInt(values[12]), + Number.parseInt(values[13]), + Number.parseInt(values[14]), + Number.parseInt(values[15]), + Number.parseInt(values[16]), + Number.parseInt(values[17]), + Number.parseInt(values[18]), + Number.parseInt(values[19]), + Number.parseInt(values[21]), + Number.parseInt(values[22]), + Number.parseInt(values[23]), + Number.parseInt(values[24]), + Number.parseInt(values[20]) === 1, + Number.parseInt(values[25]), + Number.parseInt(values[26]) as AnimFocus, + ); anim.frames[fd].push(targetFrame); } } break; - case "graphic": + } + case "graphic": { const graphic = fieldData !== "''" ? fieldData : ""; - anim.graphic = graphic.indexOf(".") > -1 - ? graphic.slice(0, fieldData.indexOf(".")) - : graphic; + anim.graphic = graphic.indexOf(".") > -1 ? graphic.slice(0, fieldData.indexOf(".")) : graphic; break; - case "timing": + } + case "timing": { const timingEntries = fieldData.split("- !ruby/object:PBAnimTiming ").slice(1); for (let t = 0; t < timingEntries.length; t++) { - const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") - .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); - const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? + const timingData = timingEntries[t] + .replace(/\n/g, " ") + .replace(/[ ]{2,}/g, " ") + .replace(/[a-z]+: ! '', /gi, "") + .replace(/name: (.*?),/, 'name: "$1",') + .replace( + /flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, + "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1", + ); + const frameIndex = Number.parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? let resourceName = /name: "(.*?)"/.exec(timingData)![1].replace("''", ""); // TODO: is the bang correct? - const timingType = parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? + const timingType = Number.parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? let timedEvent: AnimTimedEvent | undefined; switch (timingType) { case 0: if (resourceName && resourceName.indexOf(".") === -1) { let ext: string | undefined; - [ "wav", "mp3", "m4a" ].every(e => { + ["wav", "mp3", "m4a"].every(e => { if (seNames.indexOf(`${resourceName}.${e}`) > -1) { ext = e; return false; @@ -1464,15 +1641,16 @@ export async function populateAnims() { if (!timedEvent) { continue; } - const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; + const propPattern = /([a-z]+): (.*?)(?:,|\})/gi; let propMatch: RegExpExecArray; - while ((propMatch = propPattern.exec(timingData)!)) { // TODO: is this bang correct? + while ((propMatch = propPattern.exec(timingData)!)) { + // TODO: is this bang correct? const prop = propMatch[1]; let value: any = propMatch[2]; switch (prop) { case "bgX": case "bgY": - value = parseFloat(value); + value = Number.parseFloat(value); break; case "volume": case "pitch": @@ -1488,7 +1666,7 @@ export async function populateAnims() { case "flashBlue": case "flashAlpha": case "flashDuration": - value = parseInt(value); + value = Number.parseInt(value); break; } if (timedEvent.hasOwnProperty(prop)) { @@ -1498,21 +1676,21 @@ export async function populateAnims() { if (!anim.frameTimedEvents.has(frameIndex)) { anim.frameTimedEvents.set(frameIndex, []); } - anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? + anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? } break; + } case "position": - anim.position = parseInt(fieldData); + anim.position = Number.parseInt(fieldData); break; case "hue": - anim.hue = parseInt(fieldData); + anim.hue = Number.parseInt(fieldData); break; } } } - // used in commented code - // eslint-disable-next-line @typescript-eslint/no-unused-vars + // biome-ignore lint/correctness/noUnusedVariables: used in commented code const animReplacer = (k, v) => { if (k === "id" && !v) { return undefined; @@ -1526,12 +1704,29 @@ export async function populateAnims() { return v; }; - const animConfigProps = [ "id", "graphic", "frames", "frameTimedEvents", "position", "hue" ]; - const animFrameProps = [ "x", "y", "zoomX", "zoomY", "angle", "mirror", "visible", "blendType", "target", "graphicFrame", "opacity", "color", "tone", "flash", "locked", "priority", "focus" ]; - const propSets = [ animConfigProps, animFrameProps ]; + const animConfigProps = ["id", "graphic", "frames", "frameTimedEvents", "position", "hue"]; + const animFrameProps = [ + "x", + "y", + "zoomX", + "zoomY", + "angle", + "mirror", + "visible", + "blendType", + "target", + "graphicFrame", + "opacity", + "color", + "tone", + "flash", + "locked", + "priority", + "focus", + ]; + const propSets = [animConfigProps, animFrameProps]; - // used in commented code - // eslint-disable-next-line @typescript-eslint/no-unused-vars + // biome-ignore lint/correctness/noUnusedVariables: used in commented code const animComparator = (a: Element, b: Element) => { let props: string[]; for (let p = 0; p < propSets.length; p++) { diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 4a8c48d5e71..43a7072fd12 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -5,7 +5,7 @@ import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ProtectStatAbAttr, - ReverseDrainAbAttr + ReverseDrainAbAttr, } from "#app/data/ability"; import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "#app/data/battle-anims"; import type Move from "#app/data/moves/move"; @@ -14,7 +14,7 @@ import { applyMoveAttrs, ConsecutiveUseDoublePowerAttr, HealOnAllyAttr, - StatusCategoryOnAllyAttr + StatusCategoryOnAllyAttr, } from "#app/data/moves/move"; import { MoveFlags } from "#enums/MoveFlags"; import { MoveCategory } from "#enums/MoveCategory"; @@ -53,7 +53,7 @@ export enum BattlerTagLapseType { TURN_END, HIT, AFTER_HIT, - CUSTOM + CUSTOM, } export class BattlerTag { @@ -64,26 +64,33 @@ export class BattlerTag { public sourceId?: number; public isBatonPassable: boolean; - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number, isBatonPassable: boolean = false) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType | BattlerTagLapseType[], + turnCount: number, + sourceMove?: Moves, + sourceId?: number, + isBatonPassable = false, + ) { this.tagType = tagType; - this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ]; + this.lapseTypes = Array.isArray(lapseType) ? lapseType : [lapseType]; this.turnCount = turnCount; this.sourceMove = sourceMove!; // TODO: is this bang correct? this.sourceId = sourceId; this.isBatonPassable = isBatonPassable; } - canAdd(pokemon: Pokemon): boolean { + canAdd(_pokemon: Pokemon): boolean { return true; } - onAdd(pokemon: Pokemon): void { } + onAdd(_pokemon: Pokemon): void {} - onRemove(pokemon: Pokemon): void { } + onRemove(_pokemon: Pokemon): void {} - onOverlap(pokemon: Pokemon): void { } + onOverlap(_pokemon: Pokemon): void {} - lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + lapse(_pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { return --this.turnCount > 0; } @@ -96,16 +103,14 @@ export class BattlerTag { } getMoveName(): string | null { - return this.sourceMove - ? allMoves[this.sourceMove].name - : null; + return this.sourceMove ? allMoves[this.sourceMove].name : null; } /** - * When given a battler tag or json representing one, load the data for it. - * This is meant to be inherited from by any battler tag with custom attributes - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * This is meant to be inherited from by any battler tag with custom attributes + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; @@ -138,7 +143,13 @@ export interface TerrainBattlerTag { * to select restricted moves. */ export abstract class MoveRestrictionBattlerTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType | BattlerTagLapseType[], + turnCount: number, + sourceMove?: Moves, + sourceId?: number, + ) { super(tagType, lapseType, turnCount, sourceMove, sourceId); } @@ -174,12 +185,12 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { /** * Checks if this tag is restricting a move based on a user's decisions during the target selection phase * - * @param {Moves} move {@linkcode Moves} 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 + * @param {Moves} _move {@linkcode Moves} 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 */ - isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon): boolean { + isMoveTargetRestricted(_move: Moves, _user: Pokemon, _target: Pokemon): boolean { return false; } @@ -197,11 +208,11 @@ 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 {Moves} move {@linkcode Moves} ID of the move being interrupted + * @param {Pokemon} _pokemon {@linkcode Pokemon} attempting to use the restricted move + * @param {Moves} _move {@linkcode Moves} ID of the move being interrupted * @returns {string} text to display when the move is interrupted */ - interruptedText(pokemon: Pokemon, move: Moves): string { + interruptedText(_pokemon: Pokemon, _move: Moves): string { return ""; } } @@ -213,7 +224,12 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { */ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { constructor() { - super(BattlerTagType.THROAT_CHOPPED, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE ], 2, Moves.THROAT_CHOP); + super( + BattlerTagType.THROAT_CHOPPED, + [BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE], + 2, + Moves.THROAT_CHOP, + ); } /** @@ -229,23 +245,27 @@ 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 {Pokemon} _pokemon the {@linkcode Pokemon} that is attempting to select the restricted move * @param {Moves} move the {@linkcode Moves | move} that is being restricted * @returns the message to display when the player attempts to select the restricted move */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { + moveName: allMoves[move].name, + }); } /** * Shows a message when a move is interrupted by Throat Chop. * @override * @param {Pokemon} pokemon the interrupted {@linkcode Pokemon} - * @param {Moves} move the {@linkcode Moves | move} that was interrupted + * @param {Moves} _move the {@linkcode Moves | move} that was interrupted * @returns the message to display when the move is interrupted */ - override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:throatChopInterruptedMove", { pokemonName: getPokemonNameWithAffix(pokemon) }); + override interruptedText(pokemon: Pokemon, _move: Moves): string { + return i18next.t("battle:throatChopInterruptedMove", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } } @@ -258,7 +278,13 @@ export class DisabledTag extends MoveRestrictionBattlerTag { private moveId: Moves = Moves.NONE; constructor(sourceId: number) { - super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId); + super( + BattlerTagType.DISABLED, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], + 4, + Moves.DISABLE, + sourceId, + ); } /** @override */ @@ -275,26 +301,35 @@ export class DisabledTag extends MoveRestrictionBattlerTag { override onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - const move = pokemon.getLastXMoves(-1) - .find(m => !m.virtual); + const move = pokemon.getLastXMoves(-1).find(m => !m.virtual); if (Utils.isNullOrUndefined(move) || move.move === Moves.STRUGGLE || move.move === Moves.NONE) { return; } this.moveId = move.move; - globalScene.queueMessage(i18next.t("battlerTags:disabledOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + globalScene.queueMessage( + i18next.t("battlerTags:disabledOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[this.moveId].name, + }), + ); } /** @override */ override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:disabledLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + globalScene.queueMessage( + i18next.t("battlerTags:disabledLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[this.moveId].name, + }), + ); } /** @override */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); } @@ -305,7 +340,10 @@ export class DisabledTag extends MoveRestrictionBattlerTag { * @returns {string} text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:disableInterruptedMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } /** @override */ @@ -337,7 +375,7 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * @returns `true` if the pokemon has a valid move and no existing {@linkcode GorillaTacticsTag}; `false` otherwise */ override canAdd(pokemon: Pokemon): boolean { - return (this.getLastValidMove(pokemon) !== undefined) && !pokemon.getTag(GorillaTacticsTag); + return this.getLastValidMove(pokemon) !== undefined && !pokemon.getTag(GorillaTacticsTag); } /** @@ -371,11 +409,14 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * * @override * @param {Pokemon} pokemon n/a - * @param {Moves} move {@linkcode Moves} ID of the move being denied + * @param {Moves} _move {@linkcode Moves} ID of the move being denied * @returns {string} text to display when the move is denied - */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:canOnlyUseMove", { moveName: allMoves[this.moveId].name, pokemonName: getPokemonNameWithAffix(pokemon) }); + */ + override selectionDeniedText(pokemon: Pokemon, _move: Moves): string { + return i18next.t("battle:canOnlyUseMove", { + moveName: allMoves[this.moveId].name, + pokemonName: getPokemonNameWithAffix(pokemon), + }); } /** @@ -384,8 +425,7 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * @returns {Moves | undefined} the last valid move from the pokemon's move history */ getLastValidMove(pokemon: Pokemon): Moves | undefined { - const move = pokemon.getLastXMoves() - .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); + const move = pokemon.getLastXMoves().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); return move?.move; } @@ -396,20 +436,24 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { */ export class RechargingTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.RECHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 2, sourceMove); + super(BattlerTagType.RECHARGING, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 2, sourceMove); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); // Queue a placeholder move for the Pokemon to "use" next turn - pokemon.getMoveQueue().push({ move: Moves.NONE, targets: []}); + pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] }); } /** Cancels the source's move this turn and queues a "__ must recharge!" message */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { - globalScene.queueMessage(i18next.t("battlerTags:rechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:rechargingLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); (globalScene.getCurrentPhase() as MovePhase).cancel(); pokemon.getMoveQueue().shift(); } @@ -424,7 +468,12 @@ export class RechargingTag extends BattlerTag { */ export class BeakBlastChargingTag extends BattlerTag { constructor() { - super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1, Moves.BEAK_BLAST); + super( + BattlerTagType.BEAK_BLAST_CHARGING, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT], + 1, + Moves.BEAK_BLAST, + ); } onAdd(pokemon: Pokemon): void { @@ -432,7 +481,11 @@ export class BeakBlastChargingTag extends BattlerTag { new MoveChargeAnim(ChargeAnim.BEAK_BLAST_CHARGING, this.sourceMove, pokemon).play(); // Queue Beak Blast's header message - globalScene.queueMessage(i18next.t("moveTriggers:startedHeatingUpBeak", { pokemonName: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("moveTriggers:startedHeatingUpBeak", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -460,14 +513,18 @@ export class BeakBlastChargingTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Trap_(move) | Shell Trap} */ export class ShellTrapTag extends BattlerTag { - public activated: boolean = false; + public activated = false; constructor() { - super(BattlerTagType.SHELL_TRAP, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1); + super(BattlerTagType.SHELL_TRAP, [BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT], 1); } onAdd(pokemon: Pokemon): void { - globalScene.queueMessage(i18next.t("moveTriggers:setUpShellTrap", { pokemonName: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("moveTriggers:setUpShellTrap", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -483,11 +540,9 @@ export class ShellTrapTag extends BattlerTag { // Trap should only be triggered by opponent's Physical moves if (phaseData?.move.category === MoveCategory.PHYSICAL && pokemon.isOpponent(phaseData.attacker)) { const shellTrapPhaseIndex = globalScene.phaseQueue.findIndex( - phase => phase instanceof MovePhase && phase.pokemon === pokemon - ); - const firstMovePhaseIndex = globalScene.phaseQueue.findIndex( - phase => phase instanceof MovePhase + phase => phase instanceof MovePhase && phase.pokemon === pokemon, ); + const firstMovePhaseIndex = globalScene.phaseQueue.findIndex(phase => phase instanceof MovePhase); // Only shift MovePhase timing if it's not already next up if (shellTrapPhaseIndex !== -1 && shellTrapPhaseIndex !== firstMovePhaseIndex) { @@ -506,7 +561,13 @@ export class ShellTrapTag extends BattlerTag { } export class TrappedTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType, + turnCount: number, + sourceMove: Moves, + sourceId: number, + ) { super(tagType, lapseType, turnCount, sourceMove, sourceId, true); } @@ -530,10 +591,12 @@ export class TrappedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:trappedOnRemove", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - })); + globalScene.queueMessage( + i18next.t("battlerTags:trappedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); } getDescriptor(): string { @@ -545,7 +608,9 @@ export class TrappedTag extends BattlerTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:trappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:trappedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -571,7 +636,7 @@ class NoRetreatTag extends TrappedTag { */ export class FlinchedTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.FLINCHED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 0, sourceMove); + super(BattlerTagType.FLINCHED, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -589,7 +654,11 @@ export class FlinchedTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { (globalScene.getCurrentPhase() as MovePhase).cancel(); - globalScene.queueMessage(i18next.t("battlerTags:flinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:flinchedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } return super.lapse(pokemon, lapseType); @@ -613,7 +682,11 @@ export class InterruptedTag extends BattlerTag { super.onAdd(pokemon); pokemon.getMoveQueue().shift(); - pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.OTHER, targets: []}); + pokemon.pushMoveHistory({ + move: Moves.NONE, + result: MoveResult.OTHER, + targets: [], + }); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -638,33 +711,51 @@ export class ConfusedTag extends BattlerTag { super.onAdd(pokemon); globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); - globalScene.queueMessage(i18next.t("battlerTags:confusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:confusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:confusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType); if (ret) { - globalScene.queueMessage(i18next.t("battlerTags:confusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); // 1/3 chance of hitting self with a 40 base power move if (pokemon.randSeedInt(3) === 0) { const atk = pokemon.getEffectiveStat(Stat.ATK); const def = pokemon.getEffectiveStat(Stat.DEF); - const damage = toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); + const damage = toDmgValue( + ((((2 * pokemon.level) / 5 + 2) * 40 * atk) / def / 50 + 2) * (pokemon.randSeedIntRange(85, 100) / 100), + ); globalScene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; @@ -713,15 +804,19 @@ export class DestinyBondTag extends BattlerTag { } if (pokemon.isBossImmune()) { - globalScene.queueMessage(i18next.t("battlerTags:destinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:destinyBondLapseIsBoss", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return false; } globalScene.queueMessage( i18next.t("battlerTags:destinyBondLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(source), - pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon) - }) + pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon), + }), ); pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); return false; @@ -739,14 +834,12 @@ export class InfatuatedTag extends BattlerTag { if (pkm) { return pokemon.isOppositeGender(pkm); - } else { - console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); - return false; } - } else { - console.warn("canAdd: this.sourceId is undefined"); + console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); return false; } + console.warn("canAdd: this.sourceId is undefined"); + return false; } onAdd(pokemon: Pokemon): void { @@ -755,15 +848,19 @@ export class InfatuatedTag extends BattlerTag { globalScene.queueMessage( i18next.t("battlerTags:infatuatedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? - }) + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + }), ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:infatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -773,13 +870,17 @@ export class InfatuatedTag extends BattlerTag { globalScene.queueMessage( i18next.t("battlerTags:infatuatedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? - }) + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + }), ); globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); if (pokemon.randSeedInt(2)) { - globalScene.queueMessage(i18next.t("battlerTags:infatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedLapseImmobilize", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); (globalScene.getCurrentPhase() as MovePhase).cancel(); } } @@ -790,7 +891,11 @@ export class InfatuatedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:infatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } isSourceLinked(): boolean { @@ -810,9 +915,9 @@ 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 - */ + * 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; @@ -825,7 +930,11 @@ export class SeedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:seededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:seededOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); this.sourceIndex = globalScene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } @@ -839,14 +948,27 @@ export class SeedTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - globalScene.unshiftPhase(new CommonAnimPhase(source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); + globalScene.unshiftPhase( + new CommonAnimPhase(source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED), + ); const damage = pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); - globalScene.unshiftPhase(new PokemonHealPhase(source.getBattlerIndex(), - !reverseDrain ? damage : damage * -1, - !reverseDrain ? i18next.t("battlerTags:seededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battlerTags:seededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), - false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + source.getBattlerIndex(), + !reverseDrain ? damage : damage * -1, + !reverseDrain + ? i18next.t("battlerTags:seededLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }) + : i18next.t("battlerTags:seededLapseShed", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + false, + true, + ), + ); } } } @@ -866,14 +988,18 @@ export class SeedTag extends BattlerTag { */ export class PowderTag extends BattlerTag { constructor() { - super(BattlerTagType.POWDER, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 1); + super(BattlerTagType.POWDER, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 1); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); // "{Pokemon} is covered in powder!" - globalScene.queueMessage(i18next.t("battlerTags:powderOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:powderOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -889,11 +1015,16 @@ export class PowderTag extends BattlerTag { if (movePhase instanceof MovePhase) { const move = movePhase.move.getMove(); const weather = globalScene.arena.weather; - if (pokemon.getMoveType(move) === PokemonType.FIRE && !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed())) { + if ( + pokemon.getMoveType(move) === PokemonType.FIRE && + !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed()) + ) { movePhase.fail(); movePhase.showMoveText(); - globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.POWDER)); + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.POWDER), + ); const cancelDamage = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelDamage); @@ -906,9 +1037,8 @@ export class PowderTag extends BattlerTag { } } return true; - } else { - return super.lapse(pokemon, lapseType); } + return super.lapse(pokemon, lapseType); } } @@ -920,20 +1050,32 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:nightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:nightmareOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:nightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:nightmareOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - globalScene.queueMessage(i18next.t("battlerTags:nightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:nightmareLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type const cancelled = new BooleanHolder(false); @@ -960,7 +1102,8 @@ export class FrenzyTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - if (this.turnCount < 2) { // Only add CONFUSED tag if a disruption occurs on the final confusion-inducing turn of FRENZY + if (this.turnCount < 2) { + // Only add CONFUSED tag if a disruption occurs on the final confusion-inducing turn of FRENZY pokemon.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 4)); } } @@ -974,13 +1117,19 @@ export class EncoreTag extends MoveRestrictionBattlerTag { public moveId: Moves; constructor(sourceId: number) { - super(BattlerTagType.ENCORE, [ BattlerTagLapseType.CUSTOM, BattlerTagLapseType.AFTER_MOVE ], 3, Moves.ENCORE, sourceId); + super( + BattlerTagType.ENCORE, + [BattlerTagLapseType.CUSTOM, BattlerTagLapseType.AFTER_MOVE], + 3, + Moves.ENCORE, + sourceId, + ); } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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.moveId = source.moveId as Moves; @@ -1017,15 +1166,21 @@ export class EncoreTag extends MoveRestrictionBattlerTag { onAdd(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:encoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:encoreOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); const movePhase = globalScene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { const movesetMove = pokemon.getMoveset().find(m => m!.moveId === this.moveId); // TODO: is this bang correct? if (movesetMove) { const lastMove = pokemon.getLastXMoves(1)[0]; - globalScene.tryReplacePhase((m => m instanceof MovePhase && m.pokemon === pokemon), - new MovePhase(pokemon, lastMove.targets!, movesetMove)); // TODO: is this bang correct? + globalScene.tryReplacePhase( + m => m instanceof MovePhase && m.pokemon === pokemon, + new MovePhase(pokemon, lastMove.targets!, movesetMove), + ); // TODO: is this bang correct? } } } @@ -1041,9 +1196,8 @@ export class EncoreTag extends MoveRestrictionBattlerTag { return true; } return false; - } else { - return super.lapse(pokemon, lapseType); } + return super.lapse(pokemon, lapseType); } /** @@ -1066,7 +1220,11 @@ export class EncoreTag extends MoveRestrictionBattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:encoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:encoreOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1079,8 +1237,8 @@ export class HelpingHandTag extends BattlerTag { globalScene.queueMessage( i18next.t("battlerTags:helpingHandOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? - pokemonName: getPokemonNameWithAffix(pokemon) - }) + pokemonName: getPokemonNameWithAffix(pokemon), + }), ); } } @@ -1113,9 +1271,11 @@ export class IngrainTag extends TrappedTag { new PokemonHealPhase( pokemon.getBattlerIndex(), toDmgValue(pokemon.getMaxHp() / 16), - i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), - true - ) + i18next.t("battlerTags:ingrainLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + true, + ), ); } @@ -1123,7 +1283,9 @@ export class IngrainTag extends TrappedTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:ingrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:ingrainOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } getDescriptor(): string { @@ -1144,7 +1306,7 @@ export class OctolockTag extends TrappedTag { const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (shouldLapse) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [Stat.DEF, Stat.SPDEF], -1)); return true; } @@ -1160,7 +1322,11 @@ export class AquaRingTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:aquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:aquaRingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1173,9 +1339,11 @@ export class AquaRingTag extends BattlerTag { toDmgValue(pokemon.getMaxHp() / 16), i18next.t("battlerTags:aquaRingLapse", { moveName: this.getMoveName(), - pokemonName: getPokemonNameWithAffix(pokemon) + pokemonName: getPokemonNameWithAffix(pokemon), }), - true)); + true, + ), + ); } return ret; @@ -1213,7 +1381,11 @@ export class DrowsyTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:drowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:drowsyOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1240,9 +1412,9 @@ export abstract class DamagingTrapTag extends TrappedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -1259,8 +1431,8 @@ export abstract class DamagingTrapTag extends TrappedTag { globalScene.queueMessage( i18next.t("battlerTags:damagingTrapLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - }) + moveName: this.getMoveName(), + }), ); globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, this.commonAnim)); @@ -1285,7 +1457,7 @@ export class BindTag extends DamagingTrapTag { return i18next.t("battlerTags:bindOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? - moveName: this.getMoveName() + moveName: this.getMoveName(), }); } } @@ -1309,7 +1481,9 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:vortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:vortexOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1346,7 +1520,7 @@ export class SandTombTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:sandTombOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() + moveName: this.getMoveName(), }); } } @@ -1357,7 +1531,9 @@ export class MagmaStormTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:magmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:magmaStormOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1367,7 +1543,9 @@ export class SnapTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:snapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:snapTrapOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1397,7 +1575,6 @@ export class InfestationTag extends DamagingTrapTag { } } - export class ProtectedTag extends BattlerTag { constructor(sourceMove: Moves, tagType: BattlerTagType = BattlerTagType.PROTECTED) { super(tagType, BattlerTagLapseType.TURN_END, 0, sourceMove); @@ -1406,13 +1583,21 @@ export class ProtectedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:protectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:protectedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(); - globalScene.queueMessage(i18next.t("battlerTags:protectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:protectedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); // Stop multi-hit moves early const effectPhase = globalScene.getCurrentPhase(); @@ -1443,9 +1628,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -1484,9 +1669,9 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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.stat = source.stat; @@ -1500,7 +1685,7 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); - globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [ this.stat ], this.levels)); + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [this.stat], this.levels)); } } @@ -1565,12 +1750,20 @@ export class EnduringTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:enduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:enduringOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - globalScene.queueMessage(i18next.t("battlerTags:enduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:enduringLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return true; } @@ -1585,7 +1778,11 @@ export class SturdyTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - globalScene.queueMessage(i18next.t("battlerTags:sturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:sturdyLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return true; } @@ -1609,8 +1806,8 @@ export class PerishSongTag extends BattlerTag { globalScene.queueMessage( i18next.t("battlerTags:perishSongLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - turnCount: this.turnCount - }) + turnCount: this.turnCount, + }), ); } else { pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); @@ -1630,7 +1827,7 @@ export class CenterOfAttentionTag extends BattlerTag { constructor(sourceMove: Moves) { super(BattlerTagType.CENTER_OF_ATTENTION, BattlerTagLapseType.TURN_END, 1, sourceMove); - this.powder = (this.sourceMove === Moves.RAGE_POWDER); + this.powder = this.sourceMove === Moves.RAGE_POWDER; } /** "Center of Attention" can't be added if an ally is already the Center of Attention. */ @@ -1643,7 +1840,11 @@ export class CenterOfAttentionTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:centerOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:centerOfAttentionOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1657,9 +1858,9 @@ export class AbilityBattlerTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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 Abilities; @@ -1698,7 +1899,11 @@ export class TruantTag extends AbilityBattlerTag { if (lastMove && lastMove.move !== Moves.NONE) { (globalScene.getCurrentPhase() as MovePhase).cancel(); globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); - globalScene.queueMessage(i18next.t("battlerTags:truantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:truantLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } return true; @@ -1713,7 +1918,15 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:slowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); + globalScene.queueMessage( + i18next.t("battlerTags:slowStartOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + true, + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1727,7 +1940,14 @@ export class SlowStartTag extends AbilityBattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:slowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); + globalScene.queueMessage( + i18next.t("battlerTags:slowStartOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + ); } } @@ -1740,9 +1960,9 @@ export class HighestStatBoostTag extends AbilityBattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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.stat = source.stat as Stat; @@ -1753,7 +1973,9 @@ export class HighestStatBoostTag extends AbilityBattlerTag { super.onAdd(pokemon); let highestStat: EffectiveStat; - EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true)).reduce((highestValue: number, value: number, i: number) => { + EFFECTIVE_STATS.map(s => + pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true), + ).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = EFFECTIVE_STATS[i]; return value; @@ -1765,13 +1987,27 @@ export class HighestStatBoostTag extends AbilityBattlerTag { this.stat = highestStat; this.multiplier = this.stat === Stat.SPD ? 1.5 : 1.3; - globalScene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true); + globalScene.queueMessage( + i18next.t("battlerTags:highestStatBoostOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + statName: i18next.t(getStatKey(highestStat)), + }), + null, + false, + null, + true, + ); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:highestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); + globalScene.queueMessage( + i18next.t("battlerTags:highestStatBoostOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: allAbilities[this.ability].name, + }), + ); } } @@ -1784,9 +2020,9 @@ export class WeatherHighestStatBoostTag extends HighestStatBoostTag implements W } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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); @@ -1802,9 +2038,9 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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); @@ -1826,7 +2062,7 @@ export class SemiInvulnerableTag extends BattlerTag { // Wait 2 frames before setting visible for battle animations that don't immediately show the sprite invisible globalScene.tweens.addCounter({ duration: getFrameMs(2), - onComplete: () => pokemon.setVisible(true) + onComplete: () => pokemon.setVisible(true), }); } } @@ -1834,16 +2070,16 @@ export class SemiInvulnerableTag extends BattlerTag { export class TypeImmuneTag extends BattlerTag { public immuneType: PokemonType; - constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: PokemonType, length: number = 1) { + constructor(tagType: BattlerTagType, sourceMove: Moves, 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 - */ + * 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; @@ -1864,15 +2100,22 @@ export class FloatingTag extends TypeImmuneTag { super.onAdd(pokemon); if (this.sourceMove === Moves.MAGNET_RISE) { - globalScene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:magnetRisenOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } - } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); if (this.sourceMove === Moves.MAGNET_RISE) { - globalScene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:magnetRisenOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } } @@ -1882,7 +2125,13 @@ export class TypeBoostTag extends BattlerTag { public boostValue: number; public oneUse: boolean; - constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: PokemonType, boostValue: number, oneUse: boolean) { + constructor( + tagType: BattlerTagType, + sourceMove: Moves, + boostedType: PokemonType, + boostValue: number, + oneUse: boolean, + ) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove); this.boostedType = boostedType; @@ -1891,9 +2140,9 @@ export class TypeBoostTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -1914,7 +2163,11 @@ export class CritBoostTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:critBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:critBoostOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1924,7 +2177,11 @@ export class CritBoostTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:critBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:critBoostOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1955,9 +2212,9 @@ export class SaltCuredTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -1966,7 +2223,11 @@ export class SaltCuredTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:saltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:saltCuredOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); this.sourceIndex = globalScene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } @@ -1974,7 +2235,9 @@ export class SaltCuredTag extends BattlerTag { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE), + ); const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); @@ -1986,8 +2249,8 @@ export class SaltCuredTag extends BattlerTag { globalScene.queueMessage( i18next.t("battlerTags:saltCuredLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - }) + moveName: this.getMoveName(), + }), ); } } @@ -2004,9 +2267,9 @@ export class CursedTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -2021,14 +2284,20 @@ export class CursedTag extends BattlerTag { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE), + ); const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); - globalScene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:cursedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2060,8 +2329,8 @@ export class GroundedTag extends BattlerTag { */ export class RoostedTag extends BattlerTag { - private isBaseFlying : boolean; - private isBasePureFlying : boolean; + private isBaseFlying: boolean; + private isBasePureFlying: boolean; constructor() { super(BattlerTagType.ROOSTED, BattlerTagLapseType.TURN_END, 1, Moves.ROOST); @@ -2071,8 +2340,10 @@ export class RoostedTag extends BattlerTag { const currentTypes = pokemon.getTypes(); const baseTypes = pokemon.getTypes(false, false, true); - const forestsCurseApplied: boolean = currentTypes.includes(PokemonType.GRASS) && !baseTypes.includes(PokemonType.GRASS); - const trickOrTreatApplied: boolean = currentTypes.includes(PokemonType.GHOST) && !baseTypes.includes(PokemonType.GHOST); + const forestsCurseApplied: boolean = + currentTypes.includes(PokemonType.GRASS) && !baseTypes.includes(PokemonType.GRASS); + const trickOrTreatApplied: boolean = + currentTypes.includes(PokemonType.GHOST) && !baseTypes.includes(PokemonType.GHOST); if (this.isBaseFlying) { let modifiedTypes: PokemonType[] = []; @@ -2081,10 +2352,10 @@ export class RoostedTag extends BattlerTag { modifiedTypes = currentTypes.filter(type => type !== PokemonType.NORMAL); modifiedTypes.push(PokemonType.FLYING); } else { - modifiedTypes = [ PokemonType.FLYING ]; + modifiedTypes = [PokemonType.FLYING]; } } else { - modifiedTypes = [ ...currentTypes ]; + modifiedTypes = [...currentTypes]; modifiedTypes.push(PokemonType.FLYING); } pokemon.summonData.types = modifiedTypes; @@ -2104,10 +2375,10 @@ export class RoostedTag extends BattlerTag { if (this.isBaseFlying) { let modifiedTypes: PokemonType[]; if (this.isBasePureFlying && !isCurrentlyDualType) { - modifiedTypes = [ PokemonType.NORMAL ]; + modifiedTypes = [PokemonType.NORMAL]; } else { if (!!pokemon.getTag(RemovedTypeTag) && isOriginallyDualType && !isCurrentlyDualType) { - modifiedTypes = [ PokemonType.UNKNOWN ]; + modifiedTypes = [PokemonType.UNKNOWN]; } else { modifiedTypes = currentTypes.filter(type => type !== PokemonType.FLYING); } @@ -2159,10 +2430,6 @@ export class FormBlockDamageTag extends BattlerTag { } /** Provides the additional weather-based effects of the Ice Face ability */ export class IceFaceBlockDamageTag extends FormBlockDamageTag { - constructor(tagType: BattlerTagType) { - super(tagType); - } - /** * Determines if the tag can be added to the Pokémon. * @param {Pokemon} pokemon The Pokémon to which the tag might be added. @@ -2194,7 +2461,14 @@ export class CommandedTag extends BattlerTag { /** 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"; - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2)); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD], + 2, + ), + ); } /** Triggers an {@linkcode PokemonAnimType | animation} of the tagged Pokemon "spitting out" Tatsugiri */ @@ -2221,10 +2495,10 @@ export class CommandedTag extends BattlerTag { * the stat when added. */ export class StockpilingTag extends BattlerTag { - public stockpiledCount: number = 0; + public stockpiledCount = 0; public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = { [Stat.DEF]: 0, - [Stat.SPDEF]: 0 + [Stat.SPDEF]: 0, }; constructor(sourceMove: Moves = Moves.NONE) { @@ -2262,16 +2536,26 @@ export class StockpilingTag extends BattlerTag { if (this.stockpiledCount < 3) { this.stockpiledCount++; - globalScene.queueMessage(i18next.t("battlerTags:stockpilingOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - stockpiledCount: this.stockpiledCount - })); + globalScene.queueMessage( + i18next.t("battlerTags:stockpilingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + stockpiledCount: this.stockpiledCount, + }), + ); // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. - globalScene.unshiftPhase(new StatStageChangePhase( - pokemon.getBattlerIndex(), true, - [ Stat.SPDEF, Stat.DEF ], 1, true, false, true, this.onStatStagesChanged - )); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.SPDEF, Stat.DEF], + 1, + true, + false, + true, + this.onStatStagesChanged, + ), + ); } } @@ -2288,11 +2572,15 @@ export class StockpilingTag extends BattlerTag { const spDefChange = this.statChangeCounts[Stat.SPDEF]; if (defChange) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true)); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.DEF], -defChange, true, false, true), + ); } if (spDefChange) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true)); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF], -spDefChange, true, false, true), + ); } } } @@ -2306,7 +2594,7 @@ export class GulpMissileTag extends BattlerTag { super(tagType, BattlerTagLapseType.HIT, 0, sourceMove); } - override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + override lapse(pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { if (pokemon.getTag(BattlerTagType.UNDERWATER)) { return true; } @@ -2331,7 +2619,7 @@ export class GulpMissileTag extends BattlerTag { } if (this.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) { - globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [ Stat.DEF ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [Stat.DEF], -1)); } else { attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon); } @@ -2345,8 +2633,11 @@ export class GulpMissileTag extends BattlerTag { * @returns Whether the BattlerTag can be added. */ canAdd(pokemon: Pokemon): boolean { - const isSurfOrDive = [ Moves.SURF, Moves.DIVE ].includes(this.sourceMove); - const isNormalForm = pokemon.formIndex === 0 && !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && !pokemon.getTag(BattlerTagType.GULP_MISSILE_PIKACHU); + const isSurfOrDive = [Moves.SURF, Moves.DIVE].includes(this.sourceMove); + const isNormalForm = + pokemon.formIndex === 0 && + !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && + !pokemon.getTag(BattlerTagType.GULP_MISSILE_PIKACHU); const isCramorant = pokemon.species.speciesId === Species.CRAMORANT; return isSurfOrDive && isNormalForm && isCramorant; @@ -2384,9 +2675,9 @@ export class ExposedTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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; @@ -2411,11 +2702,18 @@ export class ExposedTag extends BattlerTag { */ export class HealBlockTag extends MoveRestrictionBattlerTag { constructor(turnCount: number, sourceMove: Moves) { - super(BattlerTagType.HEAL_BLOCK, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove); + super( + BattlerTagType.HEAL_BLOCK, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], + turnCount, + sourceMove, + ); } onActivation(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battle:battlerTagsHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } /** @@ -2441,7 +2739,7 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { override isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon) { const moveCategory = new NumberHolder(allMoves[move].category); applyMoveAttrs(StatusCategoryOnAllyAttr, user, target, allMoves[move], moveCategory); - if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS ) { + if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS) { return true; } return false; @@ -2451,7 +2749,11 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { * Uses its own unique selectionDeniedText() message */ override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name }); + return i18next.t("battle:moveDisabledHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + healBlockName: allMoves[Moves.HEAL_BLOCK].name, + }); } /** @@ -2461,13 +2763,24 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { * @returns {string} text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name }); + return i18next.t("battle:moveDisabledHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + healBlockName: allMoves[Moves.HEAL_BLOCK].name, + }); } override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battle:battlerTagsHealBlockOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); + globalScene.queueMessage( + i18next.t("battle:battlerTagsHealBlockOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + ); } } @@ -2490,7 +2803,11 @@ export class TarShotTag extends BattlerTag { } override onAdd(pokemon: Pokemon): void { - globalScene.queueMessage(i18next.t("battlerTags:tarShotOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:tarShotOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2505,7 +2822,11 @@ export class ElectrifiedTag extends BattlerTag { override onAdd(pokemon: Pokemon): void { // "{pokemonNameWithAffix}'s moves have been electrified!" - globalScene.queueMessage(i18next.t("battlerTags:electrifiedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:electrifiedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2514,7 +2835,7 @@ export class ElectrifiedTag extends BattlerTag { * Each count of Autotomization reduces the weight by 100kg */ export class AutotomizedTag extends BattlerTag { - public autotomizeCount: number = 0; + public autotomizeCount = 0; constructor(sourceMove: Moves = Moves.AUTOTOMIZE) { super(BattlerTagType.AUTOTOMIZED, BattlerTagLapseType.CUSTOM, 1, sourceMove); } @@ -2527,9 +2848,11 @@ export class AutotomizedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { const minWeight = 0.1; if (pokemon.getWeight() > minWeight) { - globalScene.queueMessage(i18next.t("battlerTags:autotomizeOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) - })); + globalScene.queueMessage( + i18next.t("battlerTags:autotomizeOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } this.autotomizeCount += 1; } @@ -2553,7 +2876,14 @@ export class SubstituteTag extends BattlerTag { public sourceInFocus: boolean; constructor(sourceMove: Moves, sourceId: number) { - super(BattlerTagType.SUBSTITUTE, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT ], 0, sourceMove, sourceId, true); + super( + BattlerTagType.SUBSTITUTE, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT], + 0, + sourceMove, + sourceId, + true, + ); } /** Sets the Substitute's HP and queues an on-add battle animation that initializes the Substitute's sprite. */ @@ -2564,9 +2894,19 @@ export class SubstituteTag extends BattlerTag { // Queue battle animation and message globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_ADD); if (this.sourceMove === Moves.SHED_TAIL) { - globalScene.queueMessage(i18next.t("battlerTags:shedTailOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:shedTailOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } else { - globalScene.queueMessage(i18next.t("battlerTags:substituteOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } // Remove any binding effects from the user @@ -2577,11 +2917,15 @@ export class SubstituteTag extends BattlerTag { onRemove(pokemon: Pokemon): void { // Only play the animation if the cause of removal isn't from the source's own move if (!this.sourceInFocus) { - globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [this.sprite]); } else { this.sprite.destroy(); } - globalScene.queueMessage(i18next.t("battlerTags:substituteOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -2601,13 +2945,13 @@ export class SubstituteTag extends BattlerTag { /** Triggers an animation that brings the Pokemon into focus before it uses a move */ onPreMove(pokemon: Pokemon): void { - globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [this.sprite]); this.sourceInFocus = true; } /** Triggers an animation that brings the Pokemon out of focus after it uses a move */ onAfterMove(pokemon: Pokemon): void { - globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [this.sprite]); this.sourceInFocus = false; } @@ -2620,18 +2964,22 @@ export class SubstituteTag extends BattlerTag { return; } const move = moveEffectPhase.move.getMove(); - const firstHit = (attacker.turnData.hitCount === attacker.turnData.hitsLeft); + const firstHit = attacker.turnData.hitCount === attacker.turnData.hitsLeft; if (firstHit && move.hitsSubstitute(attacker, pokemon)) { - globalScene.queueMessage(i18next.t("battlerTags:substituteOnHit", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnHit", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * 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.hp = source.hp; @@ -2695,7 +3043,12 @@ export class TormentTag extends MoveRestrictionBattlerTag { */ override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:tormentOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:tormentOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } /** @@ -2718,14 +3071,14 @@ export class TormentTag extends MoveRestrictionBattlerTag { return false; } const lastMove = user.getLastXMoves(1)[0]; - if ( !lastMove ) { + if (!lastMove) { return false; } // This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY // Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts const moveObj = allMoves[lastMove.move]; const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || user.getTag(BattlerTagType.FRENZY); - const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS); + const validLastMoveResult = lastMove.result === MoveResult.SUCCESS || lastMove.result === MoveResult.MISS; if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) { return true; } @@ -2733,7 +3086,9 @@ export class TormentTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, _move: Moves): string { - return i18next.t("battle:moveDisabledTorment", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battle:moveDisabledTorment", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -2744,18 +3099,27 @@ export class TormentTag extends MoveRestrictionBattlerTag { */ export class TauntTag extends MoveRestrictionBattlerTag { constructor() { - super(BattlerTagType.TAUNT, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 4, Moves.TAUNT); + super(BattlerTagType.TAUNT, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 4, Moves.TAUNT); } override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:tauntOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } public override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:tauntOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:tauntOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2768,11 +3132,17 @@ export class TauntTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledTaunt", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledTaunt", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } } @@ -2783,7 +3153,13 @@ export class TauntTag extends MoveRestrictionBattlerTag { */ export class ImprisonTag extends MoveRestrictionBattlerTag { constructor(sourceId: number) { - super(BattlerTagType.IMPRISON, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 1, Moves.IMPRISON, sourceId); + super( + BattlerTagType.IMPRISON, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], + 1, + Moves.IMPRISON, + sourceId, + ); } /** @@ -2797,9 +3173,8 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { if (source) { if (lapseType === BattlerTagLapseType.PRE_MOVE) { return super.lapse(pokemon, lapseType) && source.isActive(true); - } else { - return source.isActive(true); } + return source.isActive(true); } return false; } @@ -2810,7 +3185,7 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { * @param {Moves} move the move under investigation * @returns `false` if either condition is not met */ - public override isMoveRestricted(move: Moves, user: Pokemon): boolean { + public override isMoveRestricted(move: Moves, _user: Pokemon): boolean { const source = this.getSourcePokemon(); if (source) { const sourceMoveset = source.getMoveset().map(m => m!.moveId); @@ -2820,11 +3195,17 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledImprison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledImprison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } } @@ -2844,7 +3225,11 @@ export class SyrupBombTag extends BattlerTag { */ override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:syrupBombOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:syrupBombOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2858,11 +3243,14 @@ export class SyrupBombTag extends BattlerTag { return false; } // Custom message in lieu of an animation in mainline - globalScene.queueMessage(i18next.t("battlerTags:syrupBombLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - globalScene.unshiftPhase(new StatStageChangePhase( - pokemon.getBattlerIndex(), true, - [ Stat.SPD ], -1, true, false, true - )); + globalScene.queueMessage( + i18next.t("battlerTags:syrupBombLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPD], -1, true, false, true), + ); return --this.turnCount > 0; } } @@ -2875,11 +3263,22 @@ export class SyrupBombTag extends BattlerTag { */ export class TelekinesisTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.TELEKINESIS, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 3, sourceMove, undefined, true); + super( + BattlerTagType.TELEKINESIS, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], + 3, + sourceMove, + undefined, + true, + ); } - override onAdd(pokemon: Pokemon) { - globalScene.queueMessage(i18next.t("battlerTags:telekinesisOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + override onAdd(pokemon: Pokemon) { + globalScene.queueMessage( + i18next.t("battlerTags:telekinesisOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2894,12 +3293,20 @@ export class PowerTrickTag extends BattlerTag { onAdd(pokemon: Pokemon): void { this.swapStat(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:powerTrickActive", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:powerTrickActive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onRemove(pokemon: Pokemon): void { this.swapStat(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:powerTrickActive", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:powerTrickActive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2928,12 +3335,16 @@ export class PowerTrickTag extends BattlerTag { */ export class GrudgeTag extends BattlerTag { constructor() { - super(BattlerTagType.GRUDGE, [ BattlerTagLapseType.CUSTOM, BattlerTagLapseType.PRE_MOVE ], 1, Moves.GRUDGE); + super(BattlerTagType.GRUDGE, [BattlerTagLapseType.CUSTOM, BattlerTagLapseType.PRE_MOVE], 1, Moves.GRUDGE); } onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - globalScene.queueMessage(i18next.t("battlerTags:grudgeOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:grudgeOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2950,13 +3361,17 @@ export class GrudgeTag extends BattlerTag { const lastMoveData = sourcePokemon.getMoveset().find(m => m?.moveId === lastMove.move); if (lastMoveData && lastMove.move !== Moves.STRUGGLE) { lastMoveData.ppUsed = lastMoveData.getMovePp(); - globalScene.queueMessage(i18next.t("battlerTags:grudgeLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: lastMoveData.getName() })); + globalScene.queueMessage( + i18next.t("battlerTags:grudgeLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: lastMoveData.getName(), + }), + ); } } return false; - } else { - return super.lapse(pokemon, lapseType); } + return super.lapse(pokemon, lapseType); } } @@ -2996,7 +3411,11 @@ export class MagicCoatTag extends BattlerTag { */ override onAdd(pokemon: Pokemon) { // "{pokemonNameWithAffix} shrouded itself with Magic Coat!" - globalScene.queueMessage(i18next.t("battlerTags:magicCoatOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:magicCoatOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -3005,7 +3424,12 @@ export class MagicCoatTag extends BattlerTag { * @param sourceId - The ID of the pokemon adding the tag * @returns The corresponding {@linkcode BattlerTag} object. */ -export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { +export function getBattlerTag( + tagType: BattlerTagType, + turnCount: number, + sourceMove: Moves, + sourceId: number, +): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: return new RechargingTag(sourceMove); @@ -3094,7 +3518,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.SLOW_START: return new SlowStartTag(); case BattlerTagType.PROTOSYNTHESIS: - return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); + return new WeatherHighestStatBoostTag( + tagType, + Abilities.PROTOSYNTHESIS, + WeatherType.SUNNY, + WeatherType.HARSH_SUN, + ); case BattlerTagType.QUARK_DRIVE: return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); case BattlerTagType.FLYING: @@ -3149,9 +3578,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.DISABLED: return new DisabledTag(sourceId); case BattlerTagType.IGNORE_GHOST: - return new ExposedTag(tagType, sourceMove, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]); + return new ExposedTag(tagType, sourceMove, PokemonType.GHOST, [PokemonType.NORMAL, PokemonType.FIGHTING]); case BattlerTagType.IGNORE_DARK: - return new ExposedTag(tagType, sourceMove, PokemonType.DARK, [ PokemonType.PSYCHIC ]); + return new ExposedTag(tagType, sourceMove, PokemonType.DARK, [PokemonType.PSYCHIC]); case BattlerTagType.GULP_MISSILE_ARROKUDA: case BattlerTagType.GULP_MISSILE_PIKACHU: return new GulpMissileTag(tagType, sourceMove); @@ -3198,10 +3627,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source } /** -* 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 -*/ + * 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 + */ export function loadBattlerTag(source: BattlerTag | any): BattlerTag { const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId); tag.loadTag(source); @@ -3211,17 +3640,17 @@ 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 + * @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 * corresponding {@linkcode Move} and user {@linkcode Pokemon} */ -function getMoveEffectPhaseData(pokemon: Pokemon): {phase: MoveEffectPhase, attacker: Pokemon, move: Move} | null { +function getMoveEffectPhaseData(_pokemon: Pokemon): { phase: MoveEffectPhase; attacker: Pokemon; move: Move } | null { const phase = globalScene.getCurrentPhase(); if (phase instanceof MoveEffectPhase) { return { - phase : phase, - attacker : phase.getPokemon(), - move : phase.move.getMove() + phase: phase, + attacker: phase.getPokemon(), + move: phase.move.getMove(), }; } return null; diff --git a/src/data/berry.ts b/src/data/berry.ts index 06f52b2f38b..ed8ae8d2b62 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -3,7 +3,13 @@ import type Pokemon from "../field/pokemon"; import { HitResult } from "../field/pokemon"; import { getStatusEffectHealText } from "./status-effect"; import * as Utils from "../utils"; -import { DoubleBerryEffectAbAttr, PostItemLostAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs, applyPostItemLostAbAttrs } from "./ability"; +import { + DoubleBerryEffectAbAttr, + PostItemLostAbAttr, + ReduceBerryUseThresholdAbAttr, + applyAbAttrs, + applyPostItemLostAbAttrs, +} from "./ability"; import i18next from "i18next"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -29,7 +35,8 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate { case BerryType.LUM: return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); case BerryType.ENIGMA: - return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; + return (pokemon: Pokemon) => + !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; case BerryType.LIECHI: case BerryType.GANLON: case BerryType.PETAYA: @@ -75,8 +82,17 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { } const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed); - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + hpHealed.value, + i18next.t("battle:hpHealBerry", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + berryName: getBerryName(berryType), + }), + true, + ), + ); applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LUM: @@ -104,7 +120,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const stat: BattleStat = berryType - BerryType.ENIGMA; const statStages = new Utils.NumberHolder(1); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], statStages.value)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [stat], statStages.value)); applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LANSAT: @@ -123,7 +139,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); const stages = new Utils.NumberHolder(2); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [randStat], stages.value)); applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LEPPA: @@ -131,11 +147,19 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) ? pokemon.getMoveset().find(m => !m?.getPpRatio()) : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? + const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) + ? pokemon.getMoveset().find(m => !m?.getPpRatio()) + : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? if (ppRestoreMove !== undefined) { - ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); - globalScene.queueMessage(i18next.t("battle:ppHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: ppRestoreMove!.getName(), berryName: getBerryName(berryType) })); - applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); + ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); + globalScene.queueMessage( + i18next.t("battle:ppHealBerry", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: ppRestoreMove!.getName(), + berryName: getBerryName(berryType), + }), + ); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); } }; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 49af78292c3..b9d817836c3 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -33,37 +33,37 @@ export enum ChallengeType { /** * Challenges which modify what starters you can choose * @see {@link Challenge.applyStarterChoice} - */ + */ STARTER_CHOICE, /** * Challenges which modify how many starter points you have * @see {@link Challenge.applyStarterPoints} - */ + */ STARTER_POINTS, /** * Challenges which modify how many starter points you have * @see {@link Challenge.applyStarterPointCost} - */ + */ STARTER_COST, /** * Challenges which modify your starters in some way * @see {@link Challenge.applyStarterModify} - */ + */ STARTER_MODIFY, /** * Challenges which limit which pokemon you can have in battle. * @see {@link Challenge.applyPokemonInBattle} - */ + */ POKEMON_IN_BATTLE, /** * Adds or modifies the fixed battles in a run * @see {@link Challenge.applyFixedBattle} - */ + */ FIXED_BATTLES, /** * Modifies the effectiveness of Type matchups in battle * @see {@linkcode Challenge.applyTypeEffectiveness} - */ + */ TYPE_EFFECTIVENESS, /** * Modifies what level the AI pokemon are. UNIMPLEMENTED. @@ -93,7 +93,6 @@ export enum ChallengeType { * Modifies what the pokemon stats for Flip Stat Mode. */ FLIP_STAT, - } /** @@ -106,7 +105,7 @@ export enum MoveSourceType { GREAT_TM, ULTRA_TM, COMMON_EGG, - RARE_EGG + RARE_EGG, } /** @@ -148,7 +147,10 @@ export abstract class Challenge { * @returns {@link string} The i18n key for this challenge */ geti18nKey(): string { - return Challenges[this.id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + return Challenges[this.id] + .split("_") + .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join(""); } /** @@ -195,7 +197,7 @@ export abstract class Challenge { */ getDescription(overrideValue?: number): string { const value = overrideValue ?? this.value; - return `${i18next.t([ `challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc` ])}`; + return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc`])}`; } /** @@ -274,88 +276,93 @@ export abstract class Challenge { * @param source The source challenge or json. * @returns This challenge. */ - static loadChallenge(source: Challenge | any): Challenge { + static loadChallenge(_source: Challenge | any): Challenge { throw new Error("Method not implemented! Use derived class"); } /** * An apply function for STARTER_CHOICE challenges. Derived classes should alter this. - * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. - * @param valid {@link Utils.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. - * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. + * @param _pokemon {@link PokemonSpecies} The pokemon to check the validity of. + * @param _valid {@link Utils.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. + * @param _soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + applyStarterChoice( + _pokemon: PokemonSpecies, + _valid: Utils.BooleanHolder, + _dexAttr: DexAttrProps, + _soft = false, + ): boolean { return false; } /** * An apply function for STARTER_POINTS challenges. Derived classes should alter this. - * @param points {@link Utils.NumberHolder} The amount of points you have available. + * @param _points {@link Utils.NumberHolder} The amount of points you have available. * @returns {@link boolean} Whether this function did anything. */ - applyStarterPoints(points: Utils.NumberHolder): boolean { + applyStarterPoints(_points: Utils.NumberHolder): boolean { return false; } /** * An apply function for STARTER_COST challenges. Derived classes should alter this. - * @param species {@link Species} The pokemon to change the cost of. - * @param cost {@link Utils.NumberHolder} The cost of the starter. + * @param _species {@link Species} The pokemon to change the cost of. + * @param _cost {@link Utils.NumberHolder} The cost of the starter. * @returns {@link boolean} Whether this function did anything. */ - applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + applyStarterCost(_species: Species, _cost: Utils.NumberHolder): boolean { return false; } /** * An apply function for STARTER_MODIFY challenges. Derived classes should alter this. - * @param pokemon {@link Pokemon} The starter pokemon to modify. + * @param _pokemon {@link Pokemon} The starter pokemon to modify. * @returns {@link boolean} Whether this function did anything. */ - applyStarterModify(pokemon: Pokemon): boolean { + applyStarterModify(_pokemon: Pokemon): boolean { return false; } /** * An apply function for POKEMON_IN_BATTLE challenges. Derived classes should alter this. - * @param pokemon {@link Pokemon} The pokemon to check the validity of. - * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @param _pokemon {@link Pokemon} The pokemon to check the validity of. + * @param _valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @returns {@link boolean} Whether this function did anything. */ - applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { + applyPokemonInBattle(_pokemon: Pokemon, _valid: Utils.BooleanHolder): boolean { return false; } /** * An apply function for FIXED_BATTLE challenges. Derived classes should alter this. - * @param waveIndex {@link Number} The current wave index. - * @param battleConfig {@link FixedBattleConfig} The battle config to modify. + * @param _waveIndex {@link Number} The current wave index. + * @param _battleConfig {@link FixedBattleConfig} The battle config to modify. * @returns {@link boolean} Whether this function did anything. */ - applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { + applyFixedBattle(_waveIndex: number, _battleConfig: FixedBattleConfig): boolean { return false; } /** * An apply function for TYPE_EFFECTIVENESS challenges. Derived classes should alter this. - * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. + * @param _effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. * @returns Whether this function did anything. */ - applyTypeEffectiveness(effectiveness: Utils.NumberHolder): boolean { + applyTypeEffectiveness(_effectiveness: Utils.NumberHolder): boolean { return false; } /** * An apply function for AI_LEVEL challenges. Derived classes should alter this. - * @param level {@link Utils.NumberHolder} The generated level. - * @param levelCap {@link Number} The current level cap. - * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. - * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. + * @param _level {@link Utils.NumberHolder} The generated level. + * @param _levelCap {@link Number} The current level cap. + * @param _isTrainer {@link Boolean} Whether this is a trainer pokemon. + * @param _isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyLevelChange(level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { + applyLevelChange(_level: Utils.NumberHolder, _levelCap: number, _isTrainer: boolean, _isBoss: boolean): boolean { return false; } @@ -365,7 +372,7 @@ export abstract class Challenge { * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns {@link boolean} Whether this function did anything. */ - applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean { + applyMoveSlot(_pokemon: Pokemon, _moveSlots: Utils.NumberHolder): boolean { return false; } @@ -375,7 +382,7 @@ export abstract class Challenge { * @param hasPassive {@link Utils.BooleanHolder} Whether it should have its passive. * @returns {@link boolean} Whether this function did anything. */ - applyPassiveAccess(pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean { + applyPassiveAccess(_pokemon: Pokemon, _hasPassive: Utils.BooleanHolder): boolean { return false; } @@ -384,41 +391,46 @@ export abstract class Challenge { * @param gameMode {@link GameMode} The current game mode. * @returns {@link boolean} Whether this function did anything. */ - applyGameModeModify(gameMode: GameMode): boolean { + applyGameModeModify(_gameMode: GameMode): boolean { return false; } /** * An apply function for MOVE_ACCESS. Derived classes should alter this. - * @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 Moves} The move in question. - * @param level {@link Utils.NumberHolder} The level threshold for 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 Moves} The move in question. + * @param _level {@link Utils.NumberHolder} The level threshold for access. * @returns {@link boolean} Whether this function did anything. */ - applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { + applyMoveAccessLevel( + _pokemon: Pokemon, + _moveSource: MoveSourceType, + _move: Moves, + _level: Utils.NumberHolder, + ): boolean { return false; } /** * An apply function for MOVE_WEIGHT. Derived classes should alter this. - * @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 Moves} The move in question. - * @param weight {@link Utils.NumberHolder} The base weight of the move + * @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 Moves} The move in question. + * @param _weight {@link Utils.NumberHolder} The base weight of the move * @returns {@link boolean} Whether this function did anything. */ - applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { + applyMoveWeight(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: Moves, _level: Utils.NumberHolder): boolean { return false; } /** * An apply function for FlipStats. Derived classes should alter this. - * @param pokemon {@link Pokemon} What pokemon would learn the move. - * @param baseStats What are the stats to flip. + * @param _pokemon {@link Pokemon} What pokemon would learn the move. + * @param _baseStats What are the stats to flip. * @returns {@link boolean} Whether this function did anything. */ - applyFlipStat(pokemon: Pokemon, baseStats: number[]) { + applyFlipStat(_pokemon: Pokemon, _baseStats: number[]) { return false; } } @@ -433,10 +445,15 @@ export class SingleGenerationChallenge extends Challenge { super(Challenges.SINGLE_GENERATION, 9); } - applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { - const generations = [ pokemon.generation ]; + applyStarterChoice( + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + _dexAttr: DexAttrProps, + soft = false, + ): boolean { + const generations = [pokemon.generation]; if (soft) { - const speciesToCheck = [ pokemon.speciesId ]; + const speciesToCheck = [pokemon.speciesId]; while (speciesToCheck.length) { const checking = speciesToCheck.pop(); if (checking && pokemonEvolutions.hasOwnProperty(checking)) { @@ -458,7 +475,10 @@ export class SingleGenerationChallenge extends Challenge { applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { const baseGeneration = getPokemonSpecies(pokemon.species.speciesId).generation; const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? - if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { + if ( + pokemon.isPlayer() && + (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value)) + ) { valid.value = false; return true; } @@ -467,11 +487,63 @@ export class SingleGenerationChallenge extends Challenge { applyFixedBattle(waveIndex: number, battleConfig: FixedBattleConfig): boolean { let trainerTypes: (TrainerType | TrainerType[])[] = []; - const evilTeamWaves: number[] = [ ClassicFixedBossWaves.EVIL_GRUNT_1, ClassicFixedBossWaves.EVIL_GRUNT_2, ClassicFixedBossWaves.EVIL_GRUNT_3, ClassicFixedBossWaves.EVIL_ADMIN_1, ClassicFixedBossWaves.EVIL_GRUNT_4, ClassicFixedBossWaves.EVIL_ADMIN_2, ClassicFixedBossWaves.EVIL_BOSS_1, ClassicFixedBossWaves.EVIL_BOSS_2 ]; - const evilTeamGrunts = [[ TrainerType.ROCKET_GRUNT ], [ TrainerType.ROCKET_GRUNT ], [ TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT ], [ TrainerType.GALACTIC_GRUNT ], [ TrainerType.PLASMA_GRUNT ], [ TrainerType.FLARE_GRUNT ], [ TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT ], [ TrainerType.MACRO_GRUNT ], [ TrainerType.STAR_GRUNT ]]; - const evilTeamAdmins = [[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [[ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ]], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.COLRESS ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], [ TrainerType.FABA, TrainerType.PLUMERIA ], [ TrainerType.OLEANA ], [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]]; - const evilTeamBosses = [[ TrainerType.ROCKET_BOSS_GIOVANNI_1 ], [ TrainerType.ROCKET_BOSS_GIOVANNI_1 ], [ TrainerType.MAXIE, TrainerType.ARCHIE ], [ TrainerType.CYRUS ], [ TrainerType.GHETSIS ], [ TrainerType.LYSANDRE ], [ TrainerType.LUSAMINE, TrainerType.GUZMA ], [ TrainerType.ROSE ], [ TrainerType.PENNY ]]; - const evilTeamBossRematches = [[ TrainerType.ROCKET_BOSS_GIOVANNI_2 ], [ TrainerType.ROCKET_BOSS_GIOVANNI_2 ], [ TrainerType.MAXIE_2, TrainerType.ARCHIE_2 ], [ TrainerType.CYRUS_2 ], [ TrainerType.GHETSIS_2 ], [ TrainerType.LYSANDRE_2 ], [ TrainerType.LUSAMINE_2, TrainerType.GUZMA_2 ], [ TrainerType.ROSE_2 ], [ TrainerType.PENNY_2 ]]; + const evilTeamWaves: number[] = [ + ClassicFixedBossWaves.EVIL_GRUNT_1, + ClassicFixedBossWaves.EVIL_GRUNT_2, + ClassicFixedBossWaves.EVIL_GRUNT_3, + ClassicFixedBossWaves.EVIL_ADMIN_1, + ClassicFixedBossWaves.EVIL_GRUNT_4, + ClassicFixedBossWaves.EVIL_ADMIN_2, + ClassicFixedBossWaves.EVIL_BOSS_1, + ClassicFixedBossWaves.EVIL_BOSS_2, + ]; + const evilTeamGrunts = [ + [TrainerType.ROCKET_GRUNT], + [TrainerType.ROCKET_GRUNT], + [TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT], + [TrainerType.GALACTIC_GRUNT], + [TrainerType.PLASMA_GRUNT], + [TrainerType.FLARE_GRUNT], + [TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT], + [TrainerType.MACRO_GRUNT], + [TrainerType.STAR_GRUNT], + ]; + const evilTeamAdmins = [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [ + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + ], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + [TrainerType.FABA, TrainerType.PLUMERIA], + [TrainerType.OLEANA], + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ]; + const evilTeamBosses = [ + [TrainerType.ROCKET_BOSS_GIOVANNI_1], + [TrainerType.ROCKET_BOSS_GIOVANNI_1], + [TrainerType.MAXIE, TrainerType.ARCHIE], + [TrainerType.CYRUS], + [TrainerType.GHETSIS], + [TrainerType.LYSANDRE], + [TrainerType.LUSAMINE, TrainerType.GUZMA], + [TrainerType.ROSE], + [TrainerType.PENNY], + ]; + const evilTeamBossRematches = [ + [TrainerType.ROCKET_BOSS_GIOVANNI_2], + [TrainerType.ROCKET_BOSS_GIOVANNI_2], + [TrainerType.MAXIE_2, TrainerType.ARCHIE_2], + [TrainerType.CYRUS_2], + [TrainerType.GHETSIS_2], + [TrainerType.LYSANDRE_2], + [TrainerType.LUSAMINE_2, TrainerType.GUZMA_2], + [TrainerType.ROSE_2], + [TrainerType.PENNY_2], + ]; switch (waveIndex) { case ClassicFixedBossWaves.EVIL_GRUNT_1: trainerTypes = evilTeamGrunts[this.value - 1]; @@ -488,42 +560,123 @@ export class SingleGenerationChallenge extends Challenge { break; case ClassicFixedBossWaves.EVIL_BOSS_1: trainerTypes = evilTeamBosses[this.value - 1]; - battleConfig.setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1).setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }); + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }); return true; case ClassicFixedBossWaves.EVIL_BOSS_2: trainerTypes = evilTeamBossRematches[this.value - 1]; - battleConfig.setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1).setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }); + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }); return true; case ClassicFixedBossWaves.ELITE_FOUR_1: - trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]), TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; + trainerTypes = [ + TrainerType.LORELEI, + TrainerType.WILL, + TrainerType.SIDNEY, + TrainerType.AARON, + TrainerType.SHAUNTAL, + TrainerType.MALVA, + Utils.randSeedItem([TrainerType.HALA, TrainerType.MOLAYNE]), + TrainerType.MARNIE_ELITE, + TrainerType.RIKA, + ]; break; case ClassicFixedBossWaves.ELITE_FOUR_2: - trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; + trainerTypes = [ + TrainerType.BRUNO, + TrainerType.KOGA, + TrainerType.PHOEBE, + TrainerType.BERTHA, + TrainerType.MARSHAL, + TrainerType.SIEBOLD, + TrainerType.OLIVIA, + TrainerType.NESSA_ELITE, + TrainerType.POPPY, + ]; break; case ClassicFixedBossWaves.ELITE_FOUR_3: - trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ]), TrainerType.LARRY_ELITE ]; + trainerTypes = [ + TrainerType.AGATHA, + TrainerType.BRUNO, + TrainerType.GLACIA, + TrainerType.FLINT, + TrainerType.GRIMSLEY, + TrainerType.WIKSTROM, + TrainerType.ACEROLA, + Utils.randSeedItem([TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE]), + TrainerType.LARRY_ELITE, + ]; break; case ClassicFixedBossWaves.ELITE_FOUR_4: - trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; + trainerTypes = [ + TrainerType.LANCE, + TrainerType.KAREN, + TrainerType.DRAKE, + TrainerType.LUCIAN, + TrainerType.CAITLIN, + TrainerType.DRASNA, + TrainerType.KAHILI, + TrainerType.RAIHAN_ELITE, + TrainerType.HASSEL, + ]; break; case ClassicFixedBossWaves.CHAMPION: - trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, Utils.randSeedItem([ TrainerType.KUKUI, TrainerType.HAU ]), Utils.randSeedItem([ TrainerType.LEON, TrainerType.MUSTARD ]), Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; + trainerTypes = [ + TrainerType.BLUE, + Utils.randSeedItem([TrainerType.RED, TrainerType.LANCE_CHAMPION]), + Utils.randSeedItem([TrainerType.STEVEN, TrainerType.WALLACE]), + TrainerType.CYNTHIA, + Utils.randSeedItem([TrainerType.ALDER, TrainerType.IRIS]), + TrainerType.DIANTHA, + Utils.randSeedItem([TrainerType.KUKUI, TrainerType.HAU]), + Utils.randSeedItem([TrainerType.LEON, TrainerType.MUSTARD]), + Utils.randSeedItem([TrainerType.GEETA, TrainerType.NEMONA]), + ]; break; } if (trainerTypes.length === 0) { return false; - } else if (evilTeamWaves.includes(waveIndex)) { - battleConfig.setBattleType(BattleType.TRAINER).setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1).setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)); - return true; - } else if (waveIndex >= ClassicFixedBossWaves.ELITE_FOUR_1 && waveIndex <= ClassicFixedBossWaves.CHAMPION) { - const ttypes = trainerTypes as TrainerType[]; - battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(() => new Trainer(ttypes[this.value - 1], TrainerVariant.DEFAULT)); - return true; - } else { - return false; } + if (evilTeamWaves.includes(waveIndex)) { + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)); + return true; + } + if (waveIndex >= ClassicFixedBossWaves.ELITE_FOUR_1 && waveIndex <= ClassicFixedBossWaves.CHAMPION) { + const ttypes = trainerTypes as TrainerType[]; + battleConfig + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(() => new Trainer(ttypes[this.value - 1], TrainerVariant.DEFAULT)); + return true; + } + return false; } /** @@ -556,10 +709,11 @@ export class SingleGenerationChallenge extends Challenge { if (value === 0) { return i18next.t("challenges:singleGeneration.desc_default"); } - return i18next.t("challenges:singleGeneration.desc", { gen: i18next.t(`challenges:singleGeneration.gen_${value}`) }); + return i18next.t("challenges:singleGeneration.desc", { + gen: i18next.t(`challenges:singleGeneration.gen_${value}`), + }); } - static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge { const newChallenge = new SingleGenerationChallenge(); newChallenge.value = source.value; @@ -585,17 +739,22 @@ export class SingleTypeChallenge extends Challenge { { species: Species.CASTFORM, type: PokemonType.NORMAL, fusion: false }, ]; // TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy - private static SPECIES_OVERRIDES: Species[] = [ Species.MELOETTA ]; + private static SPECIES_OVERRIDES: Species[] = [Species.MELOETTA]; constructor() { super(Challenges.SINGLE_TYPE, 18); } - override applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + override applyStarterChoice( + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + dexAttr: DexAttrProps, + soft = false, + ): boolean { const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); - const types = [ speciesForm.type1, speciesForm.type2 ]; + const types = [speciesForm.type1, speciesForm.type2]; if (soft && !SingleTypeChallenge.SPECIES_OVERRIDES.includes(pokemon.speciesId)) { - const speciesToCheck = [ pokemon.speciesId ]; + const speciesToCheck = [pokemon.speciesId]; while (speciesToCheck.length) { const checking = speciesToCheck.pop(); if (checking && pokemonEvolutions.hasOwnProperty(checking)) { @@ -623,8 +782,16 @@ export class SingleTypeChallenge extends Challenge { } applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { - if (pokemon.isPlayer() && !pokemon.isOfType(this.value - 1, false, false, true) - && !SingleTypeChallenge.TYPE_OVERRIDES.some(o => o.type === (this.value - 1) && (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies! : pokemon.species).speciesId === o.species)) { // TODO: is the bang on fusionSpecies correct? + if ( + pokemon.isPlayer() && + !pokemon.isOfType(this.value - 1, false, false, true) && + !SingleTypeChallenge.TYPE_OVERRIDES.some( + o => + o.type === this.value - 1 && + (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies! : pokemon.species).speciesId === o.species, + ) + ) { + // TODO: is the bang on fusionSpecies correct? valid.value = false; return true; } @@ -662,7 +829,9 @@ export class SingleTypeChallenge extends Challenge { 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]`; const defaultDesc = i18next.t("challenges:singleType.desc_default"); - const typeDesc = i18next.t("challenges:singleType.desc", { type: typeColor }); + const typeDesc = i18next.t("challenges:singleType.desc", { + type: typeColor, + }); return this.value === 0 ? defaultDesc : typeDesc; } @@ -702,12 +871,17 @@ export class FreshStartChallenge extends Challenge { pokemon.abilityIndex = 0; // Always base ability, not hidden ability pokemon.passive = false; // Passive isn't unlocked pokemon.nature = Nature.HARDY; // Neutral nature - pokemon.moveset = pokemon.species.getLevelMoves().filter(m => m[0] <= 5).map(lm => lm[1]).slice(0, 4).map(m => new PokemonMove(m)); // No egg moves + pokemon.moveset = pokemon.species + .getLevelMoves() + .filter(m => m[0] <= 5) + .map(lm => lm[1]) + .slice(0, 4) + .map(m => new PokemonMove(m)); // No egg moves pokemon.luck = 0; // No luck pokemon.shiny = false; // Not shiny pokemon.variant = 0; // Not shiny pokemon.formIndex = 0; // Froakie should be base form - 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.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; } @@ -747,7 +921,8 @@ export class InverseBattleChallenge extends Challenge { if (effectiveness.value < 1) { effectiveness.value = 2; return true; - } else if (effectiveness.value > 1) { + } + if (effectiveness.value > 1) { effectiveness.value = 0.5; return true; } @@ -764,7 +939,7 @@ export class FlipStatChallenge extends Challenge { super(Challenges.FLIP_STAT, 1); } - override applyFlipStat(pokemon: Pokemon, baseStats: number[]) { + override applyFlipStat(_pokemon: Pokemon, baseStats: number[]) { const origStats = Utils.deepCopy(baseStats); baseStats[0] = origStats[5]; baseStats[1] = origStats[4]; @@ -858,7 +1033,14 @@ export class LowerStarterPointsChallenge extends Challenge { * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_CHOICE, pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_CHOICE, + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + dexAttr: DexAttrProps, + soft: boolean, +): boolean; /** * Apply all challenges that modify available total starter points. * @param gameMode {@link GameMode} The current gameMode @@ -866,7 +1048,11 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param points {@link Utils.NumberHolder} The amount of points you have available. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_POINTS, points: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_POINTS, + points: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify the cost of a starter. * @param gameMode {@link GameMode} The current gameMode @@ -875,7 +1061,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param points {@link Utils.NumberHolder} The cost of the pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_COST, species: Species, cost: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_COST, + species: Species, + cost: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify a starter after selection. * @param gameMode {@link GameMode} The current gameMode @@ -883,7 +1074,11 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} The starter pokemon to modify. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_MODIFY, pokemon: Pokemon): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_MODIFY, + pokemon: Pokemon, +): boolean; /** * Apply all challenges that what pokemon you can have in battle. * @param gameMode {@link GameMode} The current gameMode @@ -892,7 +1087,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param valid {@link Utils.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(gameMode: GameMode, challengeType: ChallengeType.POKEMON_IN_BATTLE, pokemon: Pokemon, valid: Utils.BooleanHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.POKEMON_IN_BATTLE, + pokemon: Pokemon, + valid: Utils.BooleanHolder, +): boolean; /** * Apply all challenges that modify what fixed battles there are. * @param gameMode {@link GameMode} The current gameMode @@ -901,7 +1101,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param battleConfig {@link FixedBattleConfig} The battle config to modify. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FIXED_BATTLES, waveIndex: Number, battleConfig: FixedBattleConfig): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.FIXED_BATTLES, + waveIndex: number, + battleConfig: FixedBattleConfig, +): boolean; /** * Apply all challenges that modify type effectiveness. * @param gameMode {@linkcode GameMode} The current gameMode @@ -909,7 +1114,11 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.TYPE_EFFECTIVENESS, + effectiveness: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify what level AI are. * @param gameMode {@link GameMode} The current gameMode @@ -920,7 +1129,14 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.AI_LEVEL, + level: Utils.NumberHolder, + levelCap: number, + isTrainer: boolean, + isBoss: boolean, +): boolean; /** * Apply all challenges that modify how many move slots the AI has. * @param gameMode {@link GameMode} The current gameMode @@ -929,7 +1145,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.AI_MOVE_SLOTS, + pokemon: Pokemon, + moveSlots: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify whether a pokemon has its passive. * @param gameMode {@link GameMode} The current gameMode @@ -938,7 +1159,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param hasPassive {@link Utils.BooleanHolder} Whether it has its passive. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.PASSIVE_ACCESS, pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.PASSIVE_ACCESS, + pokemon: Pokemon, + hasPassive: Utils.BooleanHolder, +): boolean; /** * Apply all challenges that modify the game modes settings. * @param gameMode {@link GameMode} The current gameMode @@ -956,7 +1182,14 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.MOVE_ACCESS, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: Moves, + level: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify what weight a pokemon gives to move generation * @param gameMode {@link GameMode} The current gameMode @@ -967,9 +1200,21 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param weight {@link Utils.NumberHolder} The weight of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.MOVE_WEIGHT, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: Moves, + weight: Utils.NumberHolder, +): boolean; -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FLIP_STAT, pokemon: Pokemon, baseStats: number[]): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.FLIP_STAT, + pokemon: Pokemon, + baseStats: number[], +): boolean; export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType, ...args: any[]): boolean { let ret = false; @@ -1057,6 +1302,6 @@ export function initChallenges() { new SingleTypeChallenge(), new FreshStartChallenge(), new InverseBattleChallenge(), - new FlipStatChallenge() + new FlipStatChallenge(), ); } diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index df6c08fc0f0..22fb7db10ae 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -16,7 +16,7 @@ export interface DailyRunConfig { } export function fetchDailyRunSeed(): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, _reject) => { pokerogueApi.daily.getSeed().then(dailySeed => { resolve(dailySeed); }); @@ -26,55 +26,76 @@ export function fetchDailyRunSeed(): Promise { export function getDailyRunStarters(seed: string): Starter[] { const starters: Starter[] = []; - globalScene.executeWithSeedOffset(() => { - const startingLevel = globalScene.gameMode.getStartingLevel(); + globalScene.executeWithSeedOffset( + () => { + 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(parseInt(seed.slice(offset, offset + 4)) as Species, parseInt(seed.slice(offset + 4, offset + 6))); - starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel)); + 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 Species, + Number.parseInt(seed.slice(offset + 4, offset + 6)), + ); + starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel)); + } + return; } - return; - } - const starterCosts: number[] = []; - starterCosts.push(Math.min(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))), 8)); - starterCosts.push(Utils.randSeedInt(9 - starterCosts[0], 1)); - starterCosts.push(10 - (starterCosts[0] + starterCosts[1])); + const starterCosts: number[] = []; + starterCosts.push(Math.min(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))), 8)); + starterCosts.push(Utils.randSeedInt(9 - starterCosts[0], 1)); + starterCosts.push(10 - (starterCosts[0] + starterCosts[1])); - for (let c = 0; c < starterCosts.length; c++) { - const cost = starterCosts[c]; - const costSpecies = Object.keys(speciesStarterCosts) - .map(s => parseInt(s) as Species) - .filter(s => speciesStarterCosts[s] === cost); - const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); - const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); - starters.push(getDailyRunStarter(starterSpecies, startingLevel)); - } - }, 0, seed); + for (let c = 0; c < starterCosts.length; c++) { + const cost = starterCosts[c]; + const costSpecies = Object.keys(speciesStarterCosts) + .map(s => Number.parseInt(s) as Species) + .filter(s => speciesStarterCosts[s] === cost); + const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); + const starterSpecies = getPokemonSpecies( + randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER), + ); + starters.push(getDailyRunStarter(starterSpecies, startingLevel)); + } + }, + 0, + seed, + ); return starters; } function getDailyRunStarter(starterSpeciesForm: PokemonSpeciesForm, startingLevel: number): Starter { - const starterSpecies = starterSpeciesForm instanceof PokemonSpecies ? starterSpeciesForm : getPokemonSpecies(starterSpeciesForm.speciesId); + 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 = new PlayerPokemon( + starterSpecies, + startingLevel, + undefined, + formIndex, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); const starter: Starter = { species: starterSpecies, dexAttr: pokemon.getDexAttr(), abilityIndex: pokemon.abilityIndex, passive: false, nature: pokemon.getNature(), - pokerus: pokemon.pokerus + pokerus: pokemon.pokerus, }; pokemon.destroy(); return starter; } interface BiomeWeights { - [key: number]: number + [key: number]: number; } // Initially weighted by amount of exits each biome has diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index f4933a070fd..208e269bd9c 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -3,13 +3,13 @@ import { TrainerType } from "#enums/trainer-type"; import { trainerConfigs } from "./trainer-config"; export interface TrainerTypeMessages { - encounter?: string | string[], - victory?: string | string[], - defeat?: string | string[] + encounter?: string | string[]; + victory?: string | string[]; + defeat?: string | string[]; } export interface TrainerTypeDialogue { - [key: number]: TrainerTypeMessages | Array + [key: number]: TrainerTypeMessages | Array; } export function getTrainerTypeDialogue(): TrainerTypeDialogue { @@ -32,7 +32,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:youngster.encounter.10", "dialogue:youngster.encounter.11", "dialogue:youngster.encounter.12", - "dialogue:youngster.encounter.13" + "dialogue:youngster.encounter.13", ], victory: [ "dialogue:youngster.victory.1", @@ -48,7 +48,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:youngster.victory.11", "dialogue:youngster.victory.12", "dialogue:youngster.victory.13", - ] + ], }, //LASS { @@ -61,7 +61,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:lass.encounter.6", "dialogue:lass.encounter.7", "dialogue:lass.encounter.8", - "dialogue:lass.encounter.9" + "dialogue:lass.encounter.9", ], victory: [ "dialogue:lass.victory.1", @@ -72,27 +72,15 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:lass.victory.6", "dialogue:lass.victory.7", "dialogue:lass.victory.8", - "dialogue:lass.victory.9" - ] - } + "dialogue:lass.victory.9", + ], + }, ], [TrainerType.BREEDER]: [ { - encounter: [ - "dialogue:breeder.encounter.1", - "dialogue:breeder.encounter.2", - "dialogue:breeder.encounter.3", - ], - victory: [ - "dialogue:breeder.victory.1", - "dialogue:breeder.victory.2", - "dialogue:breeder.victory.3", - ], - defeat: [ - "dialogue:breeder.defeat.1", - "dialogue:breeder.defeat.2", - "dialogue:breeder.defeat.3", - ] + encounter: ["dialogue:breeder.encounter.1", "dialogue:breeder.encounter.2", "dialogue:breeder.encounter.3"], + victory: ["dialogue:breeder.victory.1", "dialogue:breeder.victory.2", "dialogue:breeder.victory.3"], + defeat: ["dialogue:breeder.defeat.1", "dialogue:breeder.defeat.2", "dialogue:breeder.defeat.3"], }, { encounter: [ @@ -109,21 +97,13 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:breeder_female.defeat.1", "dialogue:breeder_female.defeat.2", "dialogue:breeder_female.defeat.3", - ] - } + ], + }, ], [TrainerType.FISHERMAN]: [ { - encounter: [ - "dialogue:fisherman.encounter.1", - "dialogue:fisherman.encounter.2", - "dialogue:fisherman.encounter.3", - ], - victory: [ - "dialogue:fisherman.victory.1", - "dialogue:fisherman.victory.2", - "dialogue:fisherman.victory.3", - ] + encounter: ["dialogue:fisherman.encounter.1", "dialogue:fisherman.encounter.2", "dialogue:fisherman.encounter.3"], + victory: ["dialogue:fisherman.victory.1", "dialogue:fisherman.victory.2", "dialogue:fisherman.victory.3"], }, { encounter: [ @@ -135,22 +115,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:fisherman_female.victory.1", "dialogue:fisherman_female.victory.2", "dialogue:fisherman_female.victory.3", - ] - } + ], + }, ], [TrainerType.SWIMMER]: [ { - encounter: [ - "dialogue:swimmer.encounter.1", - "dialogue:swimmer.encounter.2", - "dialogue:swimmer.encounter.3", - ], - victory: [ - "dialogue:swimmer.victory.1", - "dialogue:swimmer.victory.2", - "dialogue:swimmer.victory.3", - ] - } + encounter: ["dialogue:swimmer.encounter.1", "dialogue:swimmer.encounter.2", "dialogue:swimmer.encounter.3"], + victory: ["dialogue:swimmer.victory.1", "dialogue:swimmer.victory.2", "dialogue:swimmer.victory.3"], + }, ], [TrainerType.BACKPACKER]: [ { @@ -165,8 +137,8 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:backpacker.victory.2", "dialogue:backpacker.victory.3", "dialogue:backpacker.victory.4", - ] - } + ], + }, ], [TrainerType.ACE_TRAINER]: [ { @@ -187,258 +159,138 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:ace_trainer.defeat.2", "dialogue:ace_trainer.defeat.3", "dialogue:ace_trainer.defeat.4", - ] - } + ], + }, ], [TrainerType.PARASOL_LADY]: [ { - encounter: [ - "dialogue:parasol_lady.encounter.1", - ], - victory: [ - "dialogue:parasol_lady.victory.1", - ] - } + encounter: ["dialogue:parasol_lady.encounter.1"], + victory: ["dialogue:parasol_lady.victory.1"], + }, ], [TrainerType.TWINS]: [ { - encounter: [ - "dialogue:twins.encounter.1", - "dialogue:twins.encounter.2", - "dialogue:twins.encounter.3", - ], - victory: [ - "dialogue:twins.victory.1", - "dialogue:twins.victory.2", - "dialogue:twins.victory.3", - ], - defeat: [ - "dialogue:twins.defeat.1", - "dialogue:twins.defeat.2", - "dialogue:twins.defeat.3", - ], - } + encounter: ["dialogue:twins.encounter.1", "dialogue:twins.encounter.2", "dialogue:twins.encounter.3"], + victory: ["dialogue:twins.victory.1", "dialogue:twins.victory.2", "dialogue:twins.victory.3"], + defeat: ["dialogue:twins.defeat.1", "dialogue:twins.defeat.2", "dialogue:twins.defeat.3"], + }, ], [TrainerType.CYCLIST]: [ { - encounter: [ - "dialogue:cyclist.encounter.1", - "dialogue:cyclist.encounter.2", - "dialogue:cyclist.encounter.3", - ], - victory: [ - "dialogue:cyclist.victory.1", - "dialogue:cyclist.victory.2", - "dialogue:cyclist.victory.3", - ] - } + encounter: ["dialogue:cyclist.encounter.1", "dialogue:cyclist.encounter.2", "dialogue:cyclist.encounter.3"], + victory: ["dialogue:cyclist.victory.1", "dialogue:cyclist.victory.2", "dialogue:cyclist.victory.3"], + }, ], [TrainerType.BLACK_BELT]: [ { - encounter: [ - "dialogue:black_belt.encounter.1", - "dialogue:black_belt.encounter.2", - ], - victory: [ - "dialogue:black_belt.victory.1", - "dialogue:black_belt.victory.2", - ] + encounter: ["dialogue:black_belt.encounter.1", "dialogue:black_belt.encounter.2"], + victory: ["dialogue:black_belt.victory.1", "dialogue:black_belt.victory.2"], }, //BATTLE GIRL { - encounter: [ - "dialogue:battle_girl.encounter.1", - ], - victory: [ - "dialogue:battle_girl.victory.1", - ] - } + encounter: ["dialogue:battle_girl.encounter.1"], + victory: ["dialogue:battle_girl.victory.1"], + }, ], [TrainerType.HIKER]: [ { - encounter: [ - "dialogue:hiker.encounter.1", - "dialogue:hiker.encounter.2", - ], - victory: [ - "dialogue:hiker.victory.1", - "dialogue:hiker.victory.2", - ] - } + encounter: ["dialogue:hiker.encounter.1", "dialogue:hiker.encounter.2"], + victory: ["dialogue:hiker.victory.1", "dialogue:hiker.victory.2"], + }, ], [TrainerType.RANGER]: [ { - encounter: [ - "dialogue:ranger.encounter.1", - "dialogue:ranger.encounter.2", - ], - victory: [ - "dialogue:ranger.victory.1", - "dialogue:ranger.victory.2", - ], - defeat: [ - "dialogue:ranger.defeat.1", - "dialogue:ranger.defeat.2", - ] - } + encounter: ["dialogue:ranger.encounter.1", "dialogue:ranger.encounter.2"], + victory: ["dialogue:ranger.victory.1", "dialogue:ranger.victory.2"], + defeat: ["dialogue:ranger.defeat.1", "dialogue:ranger.defeat.2"], + }, ], [TrainerType.SCIENTIST]: [ { - encounter: [ - "dialogue:scientist.encounter.1", - ], - victory: [ - "dialogue:scientist.victory.1", - ] - } + encounter: ["dialogue:scientist.encounter.1"], + victory: ["dialogue:scientist.victory.1"], + }, ], [TrainerType.SCHOOL_KID]: [ { - encounter: [ - "dialogue:school_kid.encounter.1", - "dialogue:school_kid.encounter.2", - ], - victory: [ - "dialogue:school_kid.victory.1", - "dialogue:school_kid.victory.2", - ] - } + encounter: ["dialogue:school_kid.encounter.1", "dialogue:school_kid.encounter.2"], + victory: ["dialogue:school_kid.victory.1", "dialogue:school_kid.victory.2"], + }, ], [TrainerType.ARTIST]: [ { - encounter: [ - "dialogue:artist.encounter.1", - ], - victory: [ - "dialogue:artist.victory.1", - ] - } + encounter: ["dialogue:artist.encounter.1"], + victory: ["dialogue:artist.victory.1"], + }, ], [TrainerType.GUITARIST]: [ { - encounter: [ - "dialogue:guitarist.encounter.1", - ], - victory: [ - "dialogue:guitarist.victory.1", - ] - } + encounter: ["dialogue:guitarist.encounter.1"], + victory: ["dialogue:guitarist.victory.1"], + }, ], [TrainerType.WORKER]: [ { - encounter: [ - "dialogue:worker.encounter.1", - ], - victory: [ - "dialogue:worker.victory.1", - ] + encounter: ["dialogue:worker.encounter.1"], + victory: ["dialogue:worker.victory.1"], }, { - encounter: [ - "dialogue:worker_female.encounter.1", - ], - victory: [ - "dialogue:worker_female.victory.1", - ], - defeat: [ - "dialogue:worker_female.defeat.1", - ] + encounter: ["dialogue:worker_female.encounter.1"], + victory: ["dialogue:worker_female.victory.1"], + defeat: ["dialogue:worker_female.defeat.1"], }, { - encounter: [ - "dialogue:worker_double.encounter.1", - ], - victory: [ - "dialogue:worker_double.victory.1", - ] + encounter: ["dialogue:worker_double.encounter.1"], + victory: ["dialogue:worker_double.victory.1"], }, ], // Defeat dialogue in the language .JSONS exist as translated or placeholders; (en, fr, it, es, de, ja, ko, zh_cn, zh_tw, pt_br) [TrainerType.SNOW_WORKER]: [ { - encounter: [ - "dialogue:snow_worker.encounter.1", - ], - victory: [ - "dialogue:snow_worker.victory.1", - ] + encounter: ["dialogue:snow_worker.encounter.1"], + victory: ["dialogue:snow_worker.victory.1"], }, { - encounter: [ - "dialogue:snow_worker_double.encounter.1", - ], - victory: [ - "dialogue:snow_worker_double.victory.1", - ] + encounter: ["dialogue:snow_worker_double.encounter.1"], + victory: ["dialogue:snow_worker_double.victory.1"], }, ], [TrainerType.HEX_MANIAC]: [ { - encounter: [ - "dialogue:hex_maniac.encounter.1", - "dialogue:hex_maniac.encounter.2", - ], - victory: [ - "dialogue:hex_maniac.victory.1", - "dialogue:hex_maniac.victory.2", - ], - defeat: [ - "dialogue:hex_maniac.defeat.1", - "dialogue:hex_maniac.defeat.2", - ] - } + encounter: ["dialogue:hex_maniac.encounter.1", "dialogue:hex_maniac.encounter.2"], + victory: ["dialogue:hex_maniac.victory.1", "dialogue:hex_maniac.victory.2"], + defeat: ["dialogue:hex_maniac.defeat.1", "dialogue:hex_maniac.defeat.2"], + }, ], [TrainerType.PSYCHIC]: [ { - encounter: [ - "dialogue:psychic.encounter.1", - ], - victory: [ - "dialogue:psychic.victory.1", - ] - } + encounter: ["dialogue:psychic.encounter.1"], + victory: ["dialogue:psychic.victory.1"], + }, ], [TrainerType.OFFICER]: [ { - encounter: [ - "dialogue:officer.encounter.1", - "dialogue:officer.encounter.2", - ], - victory: [ - "dialogue:officer.victory.1", - "dialogue:officer.victory.2", - ], - } + encounter: ["dialogue:officer.encounter.1", "dialogue:officer.encounter.2"], + victory: ["dialogue:officer.victory.1", "dialogue:officer.victory.2"], + }, ], [TrainerType.BEAUTY]: [ { - encounter: [ - "dialogue:beauty.encounter.1", - ], - victory: [ - "dialogue:beauty.victory.1", - ] - } + encounter: ["dialogue:beauty.encounter.1"], + victory: ["dialogue:beauty.victory.1"], + }, ], [TrainerType.BAKER]: [ { - encounter: [ - "dialogue:baker.encounter.1", - ], - victory: [ - "dialogue:baker.victory.1", - ] - } + encounter: ["dialogue:baker.encounter.1"], + victory: ["dialogue:baker.victory.1"], + }, ], [TrainerType.BIKER]: [ { - encounter: [ - "dialogue:biker.encounter.1", - ], - victory: [ - "dialogue:biker.victory.1", - ] - } + encounter: ["dialogue:biker.encounter.1"], + victory: ["dialogue:biker.victory.1"], + }, ], [TrainerType.FIREBREATHER]: [ { @@ -451,22 +303,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:firebreather.victory.1", "dialogue:firebreather.victory.2", "dialogue:firebreather.victory.3", - ] - } + ], + }, ], [TrainerType.SAILOR]: [ { - encounter: [ - "dialogue:sailor.encounter.1", - "dialogue:sailor.encounter.2", - "dialogue:sailor.encounter.3", - ], - victory: [ - "dialogue:sailor.victory.1", - "dialogue:sailor.victory.2", - "dialogue:sailor.victory.3", - ] - } + encounter: ["dialogue:sailor.encounter.1", "dialogue:sailor.encounter.2", "dialogue:sailor.encounter.3"], + victory: ["dialogue:sailor.victory.1", "dialogue:sailor.victory.2", "dialogue:sailor.victory.3"], + }, ], [TrainerType.ROCKET_GRUNT]: [ { @@ -483,64 +327,32 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:rocket_grunt.victory.3", "dialogue:rocket_grunt.victory.4", "dialogue:rocket_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.ARCHER]: [ { - encounter: [ - "dialogue:archer.encounter.1", - "dialogue:archer.encounter.2", - "dialogue:archer.encounter.3", - ], - victory: [ - "dialogue:archer.victory.1", - "dialogue:archer.victory.2", - "dialogue:archer.victory.3", - ] - } + encounter: ["dialogue:archer.encounter.1", "dialogue:archer.encounter.2", "dialogue:archer.encounter.3"], + victory: ["dialogue:archer.victory.1", "dialogue:archer.victory.2", "dialogue:archer.victory.3"], + }, ], [TrainerType.ARIANA]: [ { - encounter: [ - "dialogue:ariana.encounter.1", - "dialogue:ariana.encounter.2", - "dialogue:ariana.encounter.3", - ], - victory: [ - "dialogue:ariana.victory.1", - "dialogue:ariana.victory.2", - "dialogue:ariana.victory.3", - ] - } + encounter: ["dialogue:ariana.encounter.1", "dialogue:ariana.encounter.2", "dialogue:ariana.encounter.3"], + victory: ["dialogue:ariana.victory.1", "dialogue:ariana.victory.2", "dialogue:ariana.victory.3"], + }, ], [TrainerType.PROTON]: [ { - encounter: [ - "dialogue:proton.encounter.1", - "dialogue:proton.encounter.2", - "dialogue:proton.encounter.3", - ], - victory: [ - "dialogue:proton.victory.1", - "dialogue:proton.victory.2", - "dialogue:proton.victory.3", - ] - } + encounter: ["dialogue:proton.encounter.1", "dialogue:proton.encounter.2", "dialogue:proton.encounter.3"], + victory: ["dialogue:proton.victory.1", "dialogue:proton.victory.2", "dialogue:proton.victory.3"], + }, ], [TrainerType.PETREL]: [ { - encounter: [ - "dialogue:petrel.encounter.1", - "dialogue:petrel.encounter.2", - "dialogue:petrel.encounter.3", - ], - victory: [ - "dialogue:petrel.victory.1", - "dialogue:petrel.victory.2", - "dialogue:petrel.victory.3", - ] - } + encounter: ["dialogue:petrel.encounter.1", "dialogue:petrel.encounter.2", "dialogue:petrel.encounter.3"], + victory: ["dialogue:petrel.victory.1", "dialogue:petrel.victory.2", "dialogue:petrel.victory.3"], + }, ], [TrainerType.MAGMA_GRUNT]: [ { @@ -557,36 +369,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:magma_grunt.victory.3", "dialogue:magma_grunt.victory.4", "dialogue:magma_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.TABITHA]: [ { - encounter: [ - "dialogue:tabitha.encounter.1", - "dialogue:tabitha.encounter.2", - "dialogue:tabitha.encounter.3", - ], - victory: [ - "dialogue:tabitha.victory.1", - "dialogue:tabitha.victory.2", - "dialogue:tabitha.victory.3", - ] - } + encounter: ["dialogue:tabitha.encounter.1", "dialogue:tabitha.encounter.2", "dialogue:tabitha.encounter.3"], + victory: ["dialogue:tabitha.victory.1", "dialogue:tabitha.victory.2", "dialogue:tabitha.victory.3"], + }, ], [TrainerType.COURTNEY]: [ { - encounter: [ - "dialogue:courtney.encounter.1", - "dialogue:courtney.encounter.2", - "dialogue:courtney.encounter.3", - ], - victory: [ - "dialogue:courtney.victory.1", - "dialogue:courtney.victory.2", - "dialogue:courtney.victory.3", - ] - } + encounter: ["dialogue:courtney.encounter.1", "dialogue:courtney.encounter.2", "dialogue:courtney.encounter.3"], + victory: ["dialogue:courtney.victory.1", "dialogue:courtney.victory.2", "dialogue:courtney.victory.3"], + }, ], [TrainerType.AQUA_GRUNT]: [ { @@ -603,36 +399,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:aqua_grunt.victory.3", "dialogue:aqua_grunt.victory.4", "dialogue:aqua_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.MATT]: [ { - encounter: [ - "dialogue:matt.encounter.1", - "dialogue:matt.encounter.2", - "dialogue:matt.encounter.3", - ], - victory: [ - "dialogue:matt.victory.1", - "dialogue:matt.victory.2", - "dialogue:matt.victory.3", - ] - } + encounter: ["dialogue:matt.encounter.1", "dialogue:matt.encounter.2", "dialogue:matt.encounter.3"], + victory: ["dialogue:matt.victory.1", "dialogue:matt.victory.2", "dialogue:matt.victory.3"], + }, ], [TrainerType.SHELLY]: [ { - encounter: [ - "dialogue:shelly.encounter.1", - "dialogue:shelly.encounter.2", - "dialogue:shelly.encounter.3", - ], - victory: [ - "dialogue:shelly.victory.1", - "dialogue:shelly.victory.2", - "dialogue:shelly.victory.3", - ] - } + encounter: ["dialogue:shelly.encounter.1", "dialogue:shelly.encounter.2", "dialogue:shelly.encounter.3"], + victory: ["dialogue:shelly.victory.1", "dialogue:shelly.victory.2", "dialogue:shelly.victory.3"], + }, ], [TrainerType.GALACTIC_GRUNT]: [ { @@ -649,50 +429,26 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:galactic_grunt.victory.3", "dialogue:galactic_grunt.victory.4", "dialogue:galactic_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.JUPITER]: [ { - encounter: [ - "dialogue:jupiter.encounter.1", - "dialogue:jupiter.encounter.2", - "dialogue:jupiter.encounter.3", - ], - victory: [ - "dialogue:jupiter.victory.1", - "dialogue:jupiter.victory.2", - "dialogue:jupiter.victory.3", - ] - } + encounter: ["dialogue:jupiter.encounter.1", "dialogue:jupiter.encounter.2", "dialogue:jupiter.encounter.3"], + victory: ["dialogue:jupiter.victory.1", "dialogue:jupiter.victory.2", "dialogue:jupiter.victory.3"], + }, ], [TrainerType.MARS]: [ { - encounter: [ - "dialogue:mars.encounter.1", - "dialogue:mars.encounter.2", - "dialogue:mars.encounter.3", - ], - victory: [ - "dialogue:mars.victory.1", - "dialogue:mars.victory.2", - "dialogue:mars.victory.3", - ] - } + encounter: ["dialogue:mars.encounter.1", "dialogue:mars.encounter.2", "dialogue:mars.encounter.3"], + victory: ["dialogue:mars.victory.1", "dialogue:mars.victory.2", "dialogue:mars.victory.3"], + }, ], [TrainerType.SATURN]: [ { - encounter: [ - "dialogue:saturn.encounter.1", - "dialogue:saturn.encounter.2", - "dialogue:saturn.encounter.3", - ], - victory: [ - "dialogue:saturn.victory.1", - "dialogue:saturn.victory.2", - "dialogue:saturn.victory.3", - ] - } + encounter: ["dialogue:saturn.encounter.1", "dialogue:saturn.encounter.2", "dialogue:saturn.encounter.3"], + victory: ["dialogue:saturn.victory.1", "dialogue:saturn.victory.2", "dialogue:saturn.victory.3"], + }, ], [TrainerType.PLASMA_GRUNT]: [ { @@ -709,36 +465,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:plasma_grunt.victory.3", "dialogue:plasma_grunt.victory.4", "dialogue:plasma_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.ZINZOLIN]: [ { - encounter: [ - "dialogue:zinzolin.encounter.1", - "dialogue:zinzolin.encounter.2", - "dialogue:zinzolin.encounter.3", - ], - victory: [ - "dialogue:zinzolin.victory.1", - "dialogue:zinzolin.victory.2", - "dialogue:zinzolin.victory.3", - ] - } + encounter: ["dialogue:zinzolin.encounter.1", "dialogue:zinzolin.encounter.2", "dialogue:zinzolin.encounter.3"], + victory: ["dialogue:zinzolin.victory.1", "dialogue:zinzolin.victory.2", "dialogue:zinzolin.victory.3"], + }, ], [TrainerType.COLRESS]: [ { - encounter: [ - "dialogue:colress.encounter.1", - "dialogue:colress.encounter.2", - "dialogue:colress.encounter.3", - ], - victory: [ - "dialogue:colress.victory.1", - "dialogue:colress.victory.2", - "dialogue:colress.victory.3", - ] - } + encounter: ["dialogue:colress.encounter.1", "dialogue:colress.encounter.2", "dialogue:colress.encounter.3"], + victory: ["dialogue:colress.victory.1", "dialogue:colress.victory.2", "dialogue:colress.victory.3"], + }, ], [TrainerType.FLARE_GRUNT]: [ { @@ -755,36 +495,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:flare_grunt.victory.3", "dialogue:flare_grunt.victory.4", "dialogue:flare_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.BRYONY]: [ { - encounter: [ - "dialogue:bryony.encounter.1", - "dialogue:bryony.encounter.2", - "dialogue:bryony.encounter.3", - ], - victory: [ - "dialogue:bryony.victory.1", - "dialogue:bryony.victory.2", - "dialogue:bryony.victory.3", - ] - } + encounter: ["dialogue:bryony.encounter.1", "dialogue:bryony.encounter.2", "dialogue:bryony.encounter.3"], + victory: ["dialogue:bryony.victory.1", "dialogue:bryony.victory.2", "dialogue:bryony.victory.3"], + }, ], [TrainerType.XEROSIC]: [ { - encounter: [ - "dialogue:xerosic.encounter.1", - "dialogue:xerosic.encounter.2", - "dialogue:xerosic.encounter.3", - ], - victory: [ - "dialogue:xerosic.victory.1", - "dialogue:xerosic.victory.2", - "dialogue:xerosic.victory.3", - ] - } + encounter: ["dialogue:xerosic.encounter.1", "dialogue:xerosic.encounter.2", "dialogue:xerosic.encounter.3"], + victory: ["dialogue:xerosic.victory.1", "dialogue:xerosic.victory.2", "dialogue:xerosic.victory.3"], + }, ], [TrainerType.AETHER_GRUNT]: [ { @@ -801,22 +525,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:aether_grunt.victory.3", "dialogue:aether_grunt.victory.4", "dialogue:aether_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.FABA]: [ { - encounter: [ - "dialogue:faba.encounter.1", - "dialogue:faba.encounter.2", - "dialogue:faba.encounter.3", - ], - victory: [ - "dialogue:faba.victory.1", - "dialogue:faba.victory.2", - "dialogue:faba.victory.3", - ] - } + encounter: ["dialogue:faba.encounter.1", "dialogue:faba.encounter.2", "dialogue:faba.encounter.3"], + victory: ["dialogue:faba.victory.1", "dialogue:faba.victory.2", "dialogue:faba.victory.3"], + }, ], [TrainerType.SKULL_GRUNT]: [ { @@ -833,22 +549,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:skull_grunt.victory.3", "dialogue:skull_grunt.victory.4", "dialogue:skull_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.PLUMERIA]: [ { - encounter: [ - "dialogue:plumeria.encounter.1", - "dialogue:plumeria.encounter.2", - "dialogue:plumeria.encounter.3", - ], - victory: [ - "dialogue:plumeria.victory.1", - "dialogue:plumeria.victory.2", - "dialogue:plumeria.victory.3", - ] - } + encounter: ["dialogue:plumeria.encounter.1", "dialogue:plumeria.encounter.2", "dialogue:plumeria.encounter.3"], + victory: ["dialogue:plumeria.victory.1", "dialogue:plumeria.victory.2", "dialogue:plumeria.victory.3"], + }, ], [TrainerType.MACRO_GRUNT]: [ { @@ -865,22 +573,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:macro_grunt.victory.3", "dialogue:macro_grunt.victory.4", "dialogue:macro_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.OLEANA]: [ { - encounter: [ - "dialogue:oleana.encounter.1", - "dialogue:oleana.encounter.2", - "dialogue:oleana.encounter.3", - ], - victory: [ - "dialogue:oleana.victory.1", - "dialogue:oleana.victory.2", - "dialogue:oleana.victory.3", - ] - } + encounter: ["dialogue:oleana.encounter.1", "dialogue:oleana.encounter.2", "dialogue:oleana.encounter.3"], + victory: ["dialogue:oleana.victory.1", "dialogue:oleana.victory.2", "dialogue:oleana.victory.3"], + }, ], [TrainerType.STAR_GRUNT]: [ { @@ -897,509 +597,258 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:star_grunt.victory.3", "dialogue:star_grunt.victory.4", "dialogue:star_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.GIACOMO]: [ { - encounter: [ - "dialogue:giacomo.encounter.1", - "dialogue:giacomo.encounter.2", - ], - victory: [ - "dialogue:giacomo.victory.1", - "dialogue:giacomo.victory.2", - ] - } + encounter: ["dialogue:giacomo.encounter.1", "dialogue:giacomo.encounter.2"], + victory: ["dialogue:giacomo.victory.1", "dialogue:giacomo.victory.2"], + }, ], [TrainerType.MELA]: [ { - encounter: [ - "dialogue:mela.encounter.1", - "dialogue:mela.encounter.2", - ], - victory: [ - "dialogue:mela.victory.1", - "dialogue:mela.victory.2", - ] - } + encounter: ["dialogue:mela.encounter.1", "dialogue:mela.encounter.2"], + victory: ["dialogue:mela.victory.1", "dialogue:mela.victory.2"], + }, ], [TrainerType.ATTICUS]: [ { - encounter: [ - "dialogue:atticus.encounter.1", - "dialogue:atticus.encounter.2", - ], - victory: [ - "dialogue:atticus.victory.1", - "dialogue:atticus.victory.2", - ] - } + encounter: ["dialogue:atticus.encounter.1", "dialogue:atticus.encounter.2"], + victory: ["dialogue:atticus.victory.1", "dialogue:atticus.victory.2"], + }, ], [TrainerType.ORTEGA]: [ { - encounter: [ - "dialogue:ortega.encounter.1", - "dialogue:ortega.encounter.2", - ], - victory: [ - "dialogue:ortega.victory.1", - "dialogue:ortega.victory.2", - ] - } + encounter: ["dialogue:ortega.encounter.1", "dialogue:ortega.encounter.2"], + victory: ["dialogue:ortega.victory.1", "dialogue:ortega.victory.2"], + }, ], [TrainerType.ERI]: [ { - encounter: [ - "dialogue:eri.encounter.1", - "dialogue:eri.encounter.2", - ], - victory: [ - "dialogue:eri.victory.1", - "dialogue:eri.victory.2", - ] - } + encounter: ["dialogue:eri.encounter.1", "dialogue:eri.encounter.2"], + victory: ["dialogue:eri.victory.1", "dialogue:eri.victory.2"], + }, ], [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ { - encounter: [ - "dialogue:rocket_boss_giovanni_1.encounter.1" - ], - victory: [ - "dialogue:rocket_boss_giovanni_1.victory.1" - ], - defeat: [ - "dialogue:rocket_boss_giovanni_1.defeat.1" - ] - } + encounter: ["dialogue:rocket_boss_giovanni_1.encounter.1"], + victory: ["dialogue:rocket_boss_giovanni_1.victory.1"], + defeat: ["dialogue:rocket_boss_giovanni_1.defeat.1"], + }, ], [TrainerType.ROCKET_BOSS_GIOVANNI_2]: [ { - encounter: [ - "dialogue:rocket_boss_giovanni_2.encounter.1" - ], - victory: [ - "dialogue:rocket_boss_giovanni_2.victory.1" - ], - defeat: [ - "dialogue:rocket_boss_giovanni_2.defeat.1" - ] - } + encounter: ["dialogue:rocket_boss_giovanni_2.encounter.1"], + victory: ["dialogue:rocket_boss_giovanni_2.victory.1"], + defeat: ["dialogue:rocket_boss_giovanni_2.defeat.1"], + }, ], [TrainerType.MAXIE]: [ { - encounter: [ - "dialogue:magma_boss_maxie_1.encounter.1" - ], - victory: [ - "dialogue:magma_boss_maxie_1.victory.1" - ], - defeat: [ - "dialogue:magma_boss_maxie_1.defeat.1" - ] - } + encounter: ["dialogue:magma_boss_maxie_1.encounter.1"], + victory: ["dialogue:magma_boss_maxie_1.victory.1"], + defeat: ["dialogue:magma_boss_maxie_1.defeat.1"], + }, ], [TrainerType.MAXIE_2]: [ { - encounter: [ - "dialogue:magma_boss_maxie_2.encounter.1" - ], - victory: [ - "dialogue:magma_boss_maxie_2.victory.1" - ], - defeat: [ - "dialogue:magma_boss_maxie_2.defeat.1" - ] - } + encounter: ["dialogue:magma_boss_maxie_2.encounter.1"], + victory: ["dialogue:magma_boss_maxie_2.victory.1"], + defeat: ["dialogue:magma_boss_maxie_2.defeat.1"], + }, ], [TrainerType.ARCHIE]: [ { - encounter: [ - "dialogue:aqua_boss_archie_1.encounter.1" - ], - victory: [ - "dialogue:aqua_boss_archie_1.victory.1" - ], - defeat: [ - "dialogue:aqua_boss_archie_1.defeat.1" - ] - } + encounter: ["dialogue:aqua_boss_archie_1.encounter.1"], + victory: ["dialogue:aqua_boss_archie_1.victory.1"], + defeat: ["dialogue:aqua_boss_archie_1.defeat.1"], + }, ], [TrainerType.ARCHIE_2]: [ { - encounter: [ - "dialogue:aqua_boss_archie_2.encounter.1" - ], - victory: [ - "dialogue:aqua_boss_archie_2.victory.1" - ], - defeat: [ - "dialogue:aqua_boss_archie_2.defeat.1" - ] - } + encounter: ["dialogue:aqua_boss_archie_2.encounter.1"], + victory: ["dialogue:aqua_boss_archie_2.victory.1"], + defeat: ["dialogue:aqua_boss_archie_2.defeat.1"], + }, ], [TrainerType.CYRUS]: [ { - encounter: [ - "dialogue:galactic_boss_cyrus_1.encounter.1" - ], - victory: [ - "dialogue:galactic_boss_cyrus_1.victory.1" - ], - defeat: [ - "dialogue:galactic_boss_cyrus_1.defeat.1" - ] - } + encounter: ["dialogue:galactic_boss_cyrus_1.encounter.1"], + victory: ["dialogue:galactic_boss_cyrus_1.victory.1"], + defeat: ["dialogue:galactic_boss_cyrus_1.defeat.1"], + }, ], [TrainerType.CYRUS_2]: [ { - encounter: [ - "dialogue:galactic_boss_cyrus_2.encounter.1" - ], - victory: [ - "dialogue:galactic_boss_cyrus_2.victory.1" - ], - defeat: [ - "dialogue:galactic_boss_cyrus_2.defeat.1" - ] - } + encounter: ["dialogue:galactic_boss_cyrus_2.encounter.1"], + victory: ["dialogue:galactic_boss_cyrus_2.victory.1"], + defeat: ["dialogue:galactic_boss_cyrus_2.defeat.1"], + }, ], [TrainerType.GHETSIS]: [ { - encounter: [ - "dialogue:plasma_boss_ghetsis_1.encounter.1" - ], - victory: [ - "dialogue:plasma_boss_ghetsis_1.victory.1" - ], - defeat: [ - "dialogue:plasma_boss_ghetsis_1.defeat.1" - ] - } + encounter: ["dialogue:plasma_boss_ghetsis_1.encounter.1"], + victory: ["dialogue:plasma_boss_ghetsis_1.victory.1"], + defeat: ["dialogue:plasma_boss_ghetsis_1.defeat.1"], + }, ], [TrainerType.GHETSIS_2]: [ { - encounter: [ - "dialogue:plasma_boss_ghetsis_2.encounter.1" - ], - victory: [ - "dialogue:plasma_boss_ghetsis_2.victory.1" - ], - defeat: [ - "dialogue:plasma_boss_ghetsis_2.defeat.1" - ] - } + encounter: ["dialogue:plasma_boss_ghetsis_2.encounter.1"], + victory: ["dialogue:plasma_boss_ghetsis_2.victory.1"], + defeat: ["dialogue:plasma_boss_ghetsis_2.defeat.1"], + }, ], [TrainerType.LYSANDRE]: [ { - encounter: [ - "dialogue:flare_boss_lysandre_1.encounter.1" - ], - victory: [ - "dialogue:flare_boss_lysandre_1.victory.1" - ], - defeat: [ - "dialogue:flare_boss_lysandre_1.defeat.1" - ] - } + encounter: ["dialogue:flare_boss_lysandre_1.encounter.1"], + victory: ["dialogue:flare_boss_lysandre_1.victory.1"], + defeat: ["dialogue:flare_boss_lysandre_1.defeat.1"], + }, ], [TrainerType.LYSANDRE_2]: [ { - encounter: [ - "dialogue:flare_boss_lysandre_2.encounter.1" - ], - victory: [ - "dialogue:flare_boss_lysandre_2.victory.1" - ], - defeat: [ - "dialogue:flare_boss_lysandre_2.defeat.1" - ] - } + encounter: ["dialogue:flare_boss_lysandre_2.encounter.1"], + victory: ["dialogue:flare_boss_lysandre_2.victory.1"], + defeat: ["dialogue:flare_boss_lysandre_2.defeat.1"], + }, ], [TrainerType.LUSAMINE]: [ { - encounter: [ - "dialogue:aether_boss_lusamine_1.encounter.1" - ], - victory: [ - "dialogue:aether_boss_lusamine_1.victory.1" - ], - defeat: [ - "dialogue:aether_boss_lusamine_1.defeat.1" - ] - } + encounter: ["dialogue:aether_boss_lusamine_1.encounter.1"], + victory: ["dialogue:aether_boss_lusamine_1.victory.1"], + defeat: ["dialogue:aether_boss_lusamine_1.defeat.1"], + }, ], [TrainerType.LUSAMINE_2]: [ { - encounter: [ - "dialogue:aether_boss_lusamine_2.encounter.1" - ], - victory: [ - "dialogue:aether_boss_lusamine_2.victory.1" - ], - defeat: [ - "dialogue:aether_boss_lusamine_2.defeat.1" - ] - } + encounter: ["dialogue:aether_boss_lusamine_2.encounter.1"], + victory: ["dialogue:aether_boss_lusamine_2.victory.1"], + defeat: ["dialogue:aether_boss_lusamine_2.defeat.1"], + }, ], [TrainerType.GUZMA]: [ { - encounter: [ - "dialogue:skull_boss_guzma_1.encounter.1" - ], - victory: [ - "dialogue:skull_boss_guzma_1.victory.1" - ], - defeat: [ - "dialogue:skull_boss_guzma_1.defeat.1" - ] - } + encounter: ["dialogue:skull_boss_guzma_1.encounter.1"], + victory: ["dialogue:skull_boss_guzma_1.victory.1"], + defeat: ["dialogue:skull_boss_guzma_1.defeat.1"], + }, ], [TrainerType.GUZMA_2]: [ { - encounter: [ - "dialogue:skull_boss_guzma_2.encounter.1" - ], - victory: [ - "dialogue:skull_boss_guzma_2.victory.1" - ], - defeat: [ - "dialogue:skull_boss_guzma_2.defeat.1" - ] - } + encounter: ["dialogue:skull_boss_guzma_2.encounter.1"], + victory: ["dialogue:skull_boss_guzma_2.victory.1"], + defeat: ["dialogue:skull_boss_guzma_2.defeat.1"], + }, ], [TrainerType.ROSE]: [ { - encounter: [ - "dialogue:macro_boss_rose_1.encounter.1" - ], - victory: [ - "dialogue:macro_boss_rose_1.victory.1" - ], - defeat: [ - "dialogue:macro_boss_rose_1.defeat.1" - ] - } + encounter: ["dialogue:macro_boss_rose_1.encounter.1"], + victory: ["dialogue:macro_boss_rose_1.victory.1"], + defeat: ["dialogue:macro_boss_rose_1.defeat.1"], + }, ], [TrainerType.ROSE_2]: [ { - encounter: [ - "dialogue:macro_boss_rose_2.encounter.1" - ], - victory: [ - "dialogue:macro_boss_rose_2.victory.1" - ], - defeat: [ - "dialogue:macro_boss_rose_2.defeat.1" - ] - } + encounter: ["dialogue:macro_boss_rose_2.encounter.1"], + victory: ["dialogue:macro_boss_rose_2.victory.1"], + defeat: ["dialogue:macro_boss_rose_2.defeat.1"], + }, ], [TrainerType.PENNY]: [ { - encounter: [ - "dialogue:star_boss_penny_1.encounter.1" - ], - victory: [ - "dialogue:star_boss_penny_1.victory.1" - ], - defeat: [ - "dialogue:star_boss_penny_1.defeat.1" - ] - } + encounter: ["dialogue:star_boss_penny_1.encounter.1"], + victory: ["dialogue:star_boss_penny_1.victory.1"], + defeat: ["dialogue:star_boss_penny_1.defeat.1"], + }, ], [TrainerType.PENNY_2]: [ { - encounter: [ - "dialogue:star_boss_penny_2.encounter.1" - ], - victory: [ - "dialogue:star_boss_penny_2.victory.1" - ], - defeat: [ - "dialogue:star_boss_penny_2.defeat.1" - ] - } + encounter: ["dialogue:star_boss_penny_2.encounter.1"], + victory: ["dialogue:star_boss_penny_2.victory.1"], + defeat: ["dialogue:star_boss_penny_2.defeat.1"], + }, ], [TrainerType.BUCK]: [ { - encounter: [ - "dialogue:stat_trainer_buck.encounter.1", - "dialogue:stat_trainer_buck.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_buck.victory.1", - "dialogue:stat_trainer_buck.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_buck.defeat.1", - "dialogue:stat_trainer_buck.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_buck.encounter.1", "dialogue:stat_trainer_buck.encounter.2"], + victory: ["dialogue:stat_trainer_buck.victory.1", "dialogue:stat_trainer_buck.victory.2"], + defeat: ["dialogue:stat_trainer_buck.defeat.1", "dialogue:stat_trainer_buck.defeat.2"], + }, ], [TrainerType.CHERYL]: [ { - encounter: [ - "dialogue:stat_trainer_cheryl.encounter.1", - "dialogue:stat_trainer_cheryl.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_cheryl.victory.1", - "dialogue:stat_trainer_cheryl.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_cheryl.defeat.1", - "dialogue:stat_trainer_cheryl.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_cheryl.encounter.1", "dialogue:stat_trainer_cheryl.encounter.2"], + victory: ["dialogue:stat_trainer_cheryl.victory.1", "dialogue:stat_trainer_cheryl.victory.2"], + defeat: ["dialogue:stat_trainer_cheryl.defeat.1", "dialogue:stat_trainer_cheryl.defeat.2"], + }, ], [TrainerType.MARLEY]: [ { - encounter: [ - "dialogue:stat_trainer_marley.encounter.1", - "dialogue:stat_trainer_marley.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_marley.victory.1", - "dialogue:stat_trainer_marley.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_marley.defeat.1", - "dialogue:stat_trainer_marley.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_marley.encounter.1", "dialogue:stat_trainer_marley.encounter.2"], + victory: ["dialogue:stat_trainer_marley.victory.1", "dialogue:stat_trainer_marley.victory.2"], + defeat: ["dialogue:stat_trainer_marley.defeat.1", "dialogue:stat_trainer_marley.defeat.2"], + }, ], [TrainerType.MIRA]: [ { - encounter: [ - "dialogue:stat_trainer_mira.encounter.1", - "dialogue:stat_trainer_mira.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_mira.victory.1", - "dialogue:stat_trainer_mira.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_mira.defeat.1", - "dialogue:stat_trainer_mira.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_mira.encounter.1", "dialogue:stat_trainer_mira.encounter.2"], + victory: ["dialogue:stat_trainer_mira.victory.1", "dialogue:stat_trainer_mira.victory.2"], + defeat: ["dialogue:stat_trainer_mira.defeat.1", "dialogue:stat_trainer_mira.defeat.2"], + }, ], [TrainerType.RILEY]: [ { - encounter: [ - "dialogue:stat_trainer_riley.encounter.1", - "dialogue:stat_trainer_riley.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_riley.victory.1", - "dialogue:stat_trainer_riley.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_riley.defeat.1", - "dialogue:stat_trainer_riley.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_riley.encounter.1", "dialogue:stat_trainer_riley.encounter.2"], + victory: ["dialogue:stat_trainer_riley.victory.1", "dialogue:stat_trainer_riley.victory.2"], + defeat: ["dialogue:stat_trainer_riley.defeat.1", "dialogue:stat_trainer_riley.defeat.2"], + }, ], [TrainerType.VICTOR]: [ { - encounter: [ - "dialogue:winstrates_victor.encounter.1", - ], - victory: [ - "dialogue:winstrates_victor.victory.1" - ], - } + encounter: ["dialogue:winstrates_victor.encounter.1"], + victory: ["dialogue:winstrates_victor.victory.1"], + }, ], [TrainerType.VICTORIA]: [ { - encounter: [ - "dialogue:winstrates_victoria.encounter.1", - ], - victory: [ - "dialogue:winstrates_victoria.victory.1" - ], - } + encounter: ["dialogue:winstrates_victoria.encounter.1"], + victory: ["dialogue:winstrates_victoria.victory.1"], + }, ], [TrainerType.VIVI]: [ { - encounter: [ - "dialogue:winstrates_vivi.encounter.1", - ], - victory: [ - "dialogue:winstrates_vivi.victory.1" - ], - } + encounter: ["dialogue:winstrates_vivi.encounter.1"], + victory: ["dialogue:winstrates_vivi.victory.1"], + }, ], [TrainerType.VICKY]: [ { - encounter: [ - "dialogue:winstrates_vicky.encounter.1", - ], - victory: [ - "dialogue:winstrates_vicky.victory.1" - ], - } + encounter: ["dialogue:winstrates_vicky.encounter.1"], + victory: ["dialogue:winstrates_vicky.victory.1"], + }, ], [TrainerType.VITO]: [ { - encounter: [ - "dialogue:winstrates_vito.encounter.1", - ], - victory: [ - "dialogue:winstrates_vito.victory.1" - ], - } + encounter: ["dialogue:winstrates_vito.encounter.1"], + victory: ["dialogue:winstrates_vito.victory.1"], + }, ], [TrainerType.BROCK]: { - encounter: [ - "dialogue:brock.encounter.1", - "dialogue:brock.encounter.2", - "dialogue:brock.encounter.3", - ], - victory: [ - "dialogue:brock.victory.1", - "dialogue:brock.victory.2", - "dialogue:brock.victory.3", - ], - defeat: [ - "dialogue:brock.defeat.1", - "dialogue:brock.defeat.2", - "dialogue:brock.defeat.3", - ] + encounter: ["dialogue:brock.encounter.1", "dialogue:brock.encounter.2", "dialogue:brock.encounter.3"], + victory: ["dialogue:brock.victory.1", "dialogue:brock.victory.2", "dialogue:brock.victory.3"], + defeat: ["dialogue:brock.defeat.1", "dialogue:brock.defeat.2", "dialogue:brock.defeat.3"], }, [TrainerType.MISTY]: { - encounter: [ - "dialogue:misty.encounter.1", - "dialogue:misty.encounter.2", - "dialogue:misty.encounter.3", - ], - victory: [ - "dialogue:misty.victory.1", - "dialogue:misty.victory.2", - "dialogue:misty.victory.3", - ], - defeat: [ - "dialogue:misty.defeat.1", - "dialogue:misty.defeat.2", - "dialogue:misty.defeat.3", - ] + encounter: ["dialogue:misty.encounter.1", "dialogue:misty.encounter.2", "dialogue:misty.encounter.3"], + victory: ["dialogue:misty.victory.1", "dialogue:misty.victory.2", "dialogue:misty.victory.3"], + defeat: ["dialogue:misty.defeat.1", "dialogue:misty.defeat.2", "dialogue:misty.defeat.3"], }, [TrainerType.LT_SURGE]: { - encounter: [ - "dialogue:lt_surge.encounter.1", - "dialogue:lt_surge.encounter.2", - "dialogue:lt_surge.encounter.3", - ], - victory: [ - "dialogue:lt_surge.victory.1", - "dialogue:lt_surge.victory.2", - "dialogue:lt_surge.victory.3", - ], - defeat: [ - "dialogue:lt_surge.defeat.1", - "dialogue:lt_surge.defeat.2", - "dialogue:lt_surge.defeat.3", - ] + encounter: ["dialogue:lt_surge.encounter.1", "dialogue:lt_surge.encounter.2", "dialogue:lt_surge.encounter.3"], + victory: ["dialogue:lt_surge.victory.1", "dialogue:lt_surge.victory.2", "dialogue:lt_surge.victory.3"], + defeat: ["dialogue:lt_surge.defeat.1", "dialogue:lt_surge.defeat.2", "dialogue:lt_surge.defeat.3"], }, [TrainerType.ERIKA]: { encounter: [ @@ -1419,420 +868,151 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:erika.defeat.2", "dialogue:erika.defeat.3", "dialogue:erika.defeat.4", - ] + ], }, [TrainerType.JANINE]: { - encounter: [ - "dialogue:janine.encounter.1", - "dialogue:janine.encounter.2", - "dialogue:janine.encounter.3", - ], - victory: [ - "dialogue:janine.victory.1", - "dialogue:janine.victory.2", - "dialogue:janine.victory.3", - ], - defeat: [ - "dialogue:janine.defeat.1", - "dialogue:janine.defeat.2", - "dialogue:janine.defeat.3", - ] + encounter: ["dialogue:janine.encounter.1", "dialogue:janine.encounter.2", "dialogue:janine.encounter.3"], + victory: ["dialogue:janine.victory.1", "dialogue:janine.victory.2", "dialogue:janine.victory.3"], + defeat: ["dialogue:janine.defeat.1", "dialogue:janine.defeat.2", "dialogue:janine.defeat.3"], }, [TrainerType.SABRINA]: { - encounter: [ - "dialogue:sabrina.encounter.1", - "dialogue:sabrina.encounter.2", - "dialogue:sabrina.encounter.3", - ], - victory: [ - "dialogue:sabrina.victory.1", - "dialogue:sabrina.victory.2", - "dialogue:sabrina.victory.3", - ], - defeat: [ - "dialogue:sabrina.defeat.1", - "dialogue:sabrina.defeat.2", - "dialogue:sabrina.defeat.3", - ] + encounter: ["dialogue:sabrina.encounter.1", "dialogue:sabrina.encounter.2", "dialogue:sabrina.encounter.3"], + victory: ["dialogue:sabrina.victory.1", "dialogue:sabrina.victory.2", "dialogue:sabrina.victory.3"], + defeat: ["dialogue:sabrina.defeat.1", "dialogue:sabrina.defeat.2", "dialogue:sabrina.defeat.3"], }, [TrainerType.BLAINE]: { - encounter: [ - "dialogue:blaine.encounter.1", - "dialogue:blaine.encounter.2", - "dialogue:blaine.encounter.3", - ], - victory: [ - "dialogue:blaine.victory.1", - "dialogue:blaine.victory.2", - "dialogue:blaine.victory.3", - ], - defeat: [ - "dialogue:blaine.defeat.1", - "dialogue:blaine.defeat.2", - "dialogue:blaine.defeat.3", - ] + encounter: ["dialogue:blaine.encounter.1", "dialogue:blaine.encounter.2", "dialogue:blaine.encounter.3"], + victory: ["dialogue:blaine.victory.1", "dialogue:blaine.victory.2", "dialogue:blaine.victory.3"], + defeat: ["dialogue:blaine.defeat.1", "dialogue:blaine.defeat.2", "dialogue:blaine.defeat.3"], }, [TrainerType.GIOVANNI]: { - encounter: [ - "dialogue:giovanni.encounter.1", - "dialogue:giovanni.encounter.2", - "dialogue:giovanni.encounter.3", - ], - victory: [ - "dialogue:giovanni.victory.1", - "dialogue:giovanni.victory.2", - "dialogue:giovanni.victory.3", - ], - defeat: [ - "dialogue:giovanni.defeat.1", - "dialogue:giovanni.defeat.2", - "dialogue:giovanni.defeat.3", - ] + encounter: ["dialogue:giovanni.encounter.1", "dialogue:giovanni.encounter.2", "dialogue:giovanni.encounter.3"], + victory: ["dialogue:giovanni.victory.1", "dialogue:giovanni.victory.2", "dialogue:giovanni.victory.3"], + defeat: ["dialogue:giovanni.defeat.1", "dialogue:giovanni.defeat.2", "dialogue:giovanni.defeat.3"], }, [TrainerType.ROXANNE]: { - encounter: [ - "dialogue:roxanne.encounter.1", - "dialogue:roxanne.encounter.2", - "dialogue:roxanne.encounter.3" - ], - victory: [ - "dialogue:roxanne.victory.1", - "dialogue:roxanne.victory.2", - "dialogue:roxanne.victory.3" - ], - defeat: [ - "dialogue:roxanne.defeat.1", - "dialogue:roxanne.defeat.2", - "dialogue:roxanne.defeat.3" - ] + encounter: ["dialogue:roxanne.encounter.1", "dialogue:roxanne.encounter.2", "dialogue:roxanne.encounter.3"], + victory: ["dialogue:roxanne.victory.1", "dialogue:roxanne.victory.2", "dialogue:roxanne.victory.3"], + defeat: ["dialogue:roxanne.defeat.1", "dialogue:roxanne.defeat.2", "dialogue:roxanne.defeat.3"], }, [TrainerType.BRAWLY]: { - encounter: [ - "dialogue:brawly.encounter.1", - "dialogue:brawly.encounter.2", - "dialogue:brawly.encounter.3" - ], - victory: [ - "dialogue:brawly.victory.1", - "dialogue:brawly.victory.2", - "dialogue:brawly.victory.3" - ], - defeat: [ - "dialogue:brawly.defeat.1", - "dialogue:brawly.defeat.2", - "dialogue:brawly.defeat.3" - ] + encounter: ["dialogue:brawly.encounter.1", "dialogue:brawly.encounter.2", "dialogue:brawly.encounter.3"], + victory: ["dialogue:brawly.victory.1", "dialogue:brawly.victory.2", "dialogue:brawly.victory.3"], + defeat: ["dialogue:brawly.defeat.1", "dialogue:brawly.defeat.2", "dialogue:brawly.defeat.3"], }, [TrainerType.WATTSON]: { - encounter: [ - "dialogue:wattson.encounter.1", - "dialogue:wattson.encounter.2", - "dialogue:wattson.encounter.3" - ], - victory: [ - "dialogue:wattson.victory.1", - "dialogue:wattson.victory.2", - "dialogue:wattson.victory.3" - ], - defeat: [ - "dialogue:wattson.defeat.1", - "dialogue:wattson.defeat.2", - "dialogue:wattson.defeat.3" - ] + encounter: ["dialogue:wattson.encounter.1", "dialogue:wattson.encounter.2", "dialogue:wattson.encounter.3"], + victory: ["dialogue:wattson.victory.1", "dialogue:wattson.victory.2", "dialogue:wattson.victory.3"], + defeat: ["dialogue:wattson.defeat.1", "dialogue:wattson.defeat.2", "dialogue:wattson.defeat.3"], }, [TrainerType.FLANNERY]: { - encounter: [ - "dialogue:flannery.encounter.1", - "dialogue:flannery.encounter.2", - "dialogue:flannery.encounter.3" - ], - victory: [ - "dialogue:flannery.victory.1", - "dialogue:flannery.victory.2", - "dialogue:flannery.victory.3" - ], - defeat: [ - "dialogue:flannery.defeat.1", - "dialogue:flannery.defeat.2", - "dialogue:flannery.defeat.3" - ] + encounter: ["dialogue:flannery.encounter.1", "dialogue:flannery.encounter.2", "dialogue:flannery.encounter.3"], + victory: ["dialogue:flannery.victory.1", "dialogue:flannery.victory.2", "dialogue:flannery.victory.3"], + defeat: ["dialogue:flannery.defeat.1", "dialogue:flannery.defeat.2", "dialogue:flannery.defeat.3"], }, [TrainerType.NORMAN]: { - encounter: [ - "dialogue:norman.encounter.1", - "dialogue:norman.encounter.2", - "dialogue:norman.encounter.3" - ], - victory: [ - "dialogue:norman.victory.1", - "dialogue:norman.victory.2", - "dialogue:norman.victory.3" - ], - defeat: [ - "dialogue:norman.defeat.1", - "dialogue:norman.defeat.2", - "dialogue:norman.defeat.3" - ] + encounter: ["dialogue:norman.encounter.1", "dialogue:norman.encounter.2", "dialogue:norman.encounter.3"], + victory: ["dialogue:norman.victory.1", "dialogue:norman.victory.2", "dialogue:norman.victory.3"], + defeat: ["dialogue:norman.defeat.1", "dialogue:norman.defeat.2", "dialogue:norman.defeat.3"], }, [TrainerType.WINONA]: { - encounter: [ - "dialogue:winona.encounter.1", - "dialogue:winona.encounter.2", - "dialogue:winona.encounter.3" - ], - victory: [ - "dialogue:winona.victory.1", - "dialogue:winona.victory.2", - "dialogue:winona.victory.3" - ], - defeat: [ - "dialogue:winona.defeat.1", - "dialogue:winona.defeat.2", - "dialogue:winona.defeat.3" - ] + encounter: ["dialogue:winona.encounter.1", "dialogue:winona.encounter.2", "dialogue:winona.encounter.3"], + victory: ["dialogue:winona.victory.1", "dialogue:winona.victory.2", "dialogue:winona.victory.3"], + defeat: ["dialogue:winona.defeat.1", "dialogue:winona.defeat.2", "dialogue:winona.defeat.3"], }, [TrainerType.TATE]: { - encounter: [ - "dialogue:tate.encounter.1", - "dialogue:tate.encounter.2", - "dialogue:tate.encounter.3" - ], - victory: [ - "dialogue:tate.victory.1", - "dialogue:tate.victory.2", - "dialogue:tate.victory.3" - ], - defeat: [ - "dialogue:tate.defeat.1", - "dialogue:tate.defeat.2", - "dialogue:tate.defeat.3" - ] + encounter: ["dialogue:tate.encounter.1", "dialogue:tate.encounter.2", "dialogue:tate.encounter.3"], + victory: ["dialogue:tate.victory.1", "dialogue:tate.victory.2", "dialogue:tate.victory.3"], + defeat: ["dialogue:tate.defeat.1", "dialogue:tate.defeat.2", "dialogue:tate.defeat.3"], }, [TrainerType.LIZA]: { - encounter: [ - "dialogue:liza.encounter.1", - "dialogue:liza.encounter.2", - "dialogue:liza.encounter.3" - ], - victory: [ - "dialogue:liza.victory.1", - "dialogue:liza.victory.2", - "dialogue:liza.victory.3" - ], - defeat: [ - "dialogue:liza.defeat.1", - "dialogue:liza.defeat.2", - "dialogue:liza.defeat.3" - ] + encounter: ["dialogue:liza.encounter.1", "dialogue:liza.encounter.2", "dialogue:liza.encounter.3"], + victory: ["dialogue:liza.victory.1", "dialogue:liza.victory.2", "dialogue:liza.victory.3"], + defeat: ["dialogue:liza.defeat.1", "dialogue:liza.defeat.2", "dialogue:liza.defeat.3"], }, [TrainerType.JUAN]: { encounter: [ "dialogue:juan.encounter.1", "dialogue:juan.encounter.2", "dialogue:juan.encounter.3", - "dialogue:juan.encounter.4" + "dialogue:juan.encounter.4", ], victory: [ "dialogue:juan.victory.1", "dialogue:juan.victory.2", "dialogue:juan.victory.3", - "dialogue:juan.victory.4" + "dialogue:juan.victory.4", ], - defeat: [ - "dialogue:juan.defeat.1", - "dialogue:juan.defeat.2", - "dialogue:juan.defeat.3", - "dialogue:juan.defeat.4" - ] + defeat: ["dialogue:juan.defeat.1", "dialogue:juan.defeat.2", "dialogue:juan.defeat.3", "dialogue:juan.defeat.4"], }, [TrainerType.CRASHER_WAKE]: { encounter: [ "dialogue:crasher_wake.encounter.1", "dialogue:crasher_wake.encounter.2", - "dialogue:crasher_wake.encounter.3" + "dialogue:crasher_wake.encounter.3", ], - victory: [ - "dialogue:crasher_wake.victory.1", - "dialogue:crasher_wake.victory.2", - "dialogue:crasher_wake.victory.3" - ], - defeat: [ - "dialogue:crasher_wake.defeat.1", - "dialogue:crasher_wake.defeat.2", - "dialogue:crasher_wake.defeat.3" - ] + victory: ["dialogue:crasher_wake.victory.1", "dialogue:crasher_wake.victory.2", "dialogue:crasher_wake.victory.3"], + defeat: ["dialogue:crasher_wake.defeat.1", "dialogue:crasher_wake.defeat.2", "dialogue:crasher_wake.defeat.3"], }, [TrainerType.FALKNER]: { - encounter: [ - "dialogue:falkner.encounter.1", - "dialogue:falkner.encounter.2", - "dialogue:falkner.encounter.3" - ], - victory: [ - "dialogue:falkner.victory.1", - "dialogue:falkner.victory.2", - "dialogue:falkner.victory.3" - ], - defeat: [ - "dialogue:falkner.defeat.1", - "dialogue:falkner.defeat.2", - "dialogue:falkner.defeat.3" - ] + encounter: ["dialogue:falkner.encounter.1", "dialogue:falkner.encounter.2", "dialogue:falkner.encounter.3"], + victory: ["dialogue:falkner.victory.1", "dialogue:falkner.victory.2", "dialogue:falkner.victory.3"], + defeat: ["dialogue:falkner.defeat.1", "dialogue:falkner.defeat.2", "dialogue:falkner.defeat.3"], }, [TrainerType.NESSA]: { - encounter: [ - "dialogue:nessa.encounter.1", - "dialogue:nessa.encounter.2", - "dialogue:nessa.encounter.3" - ], - victory: [ - "dialogue:nessa.victory.1", - "dialogue:nessa.victory.2", - "dialogue:nessa.victory.3" - ], - defeat: [ - "dialogue:nessa.defeat.1", - "dialogue:nessa.defeat.2", - "dialogue:nessa.defeat.3" - ] + encounter: ["dialogue:nessa.encounter.1", "dialogue:nessa.encounter.2", "dialogue:nessa.encounter.3"], + victory: ["dialogue:nessa.victory.1", "dialogue:nessa.victory.2", "dialogue:nessa.victory.3"], + defeat: ["dialogue:nessa.defeat.1", "dialogue:nessa.defeat.2", "dialogue:nessa.defeat.3"], }, [TrainerType.MELONY]: { - encounter: [ - "dialogue:melony.encounter.1", - "dialogue:melony.encounter.2", - "dialogue:melony.encounter.3" - ], - victory: [ - "dialogue:melony.victory.1", - "dialogue:melony.victory.2", - "dialogue:melony.victory.3" - ], - defeat: [ - "dialogue:melony.defeat.1", - "dialogue:melony.defeat.2", - "dialogue:melony.defeat.3" - ] + encounter: ["dialogue:melony.encounter.1", "dialogue:melony.encounter.2", "dialogue:melony.encounter.3"], + victory: ["dialogue:melony.victory.1", "dialogue:melony.victory.2", "dialogue:melony.victory.3"], + defeat: ["dialogue:melony.defeat.1", "dialogue:melony.defeat.2", "dialogue:melony.defeat.3"], }, [TrainerType.MARLON]: { - encounter: [ - "dialogue:marlon.encounter.1", - "dialogue:marlon.encounter.2", - "dialogue:marlon.encounter.3" - ], - victory: [ - "dialogue:marlon.victory.1", - "dialogue:marlon.victory.2", - "dialogue:marlon.victory.3" - ], - defeat: [ - "dialogue:marlon.defeat.1", - "dialogue:marlon.defeat.2", - "dialogue:marlon.defeat.3" - ] + encounter: ["dialogue:marlon.encounter.1", "dialogue:marlon.encounter.2", "dialogue:marlon.encounter.3"], + victory: ["dialogue:marlon.victory.1", "dialogue:marlon.victory.2", "dialogue:marlon.victory.3"], + defeat: ["dialogue:marlon.defeat.1", "dialogue:marlon.defeat.2", "dialogue:marlon.defeat.3"], }, [TrainerType.SHAUNTAL]: { - encounter: [ - "dialogue:shauntal.encounter.1", - "dialogue:shauntal.encounter.2", - "dialogue:shauntal.encounter.3" - ], - victory: [ - "dialogue:shauntal.victory.1", - "dialogue:shauntal.victory.2", - "dialogue:shauntal.victory.3" - ], - defeat: [ - "dialogue:shauntal.defeat.1", - "dialogue:shauntal.defeat.2", - "dialogue:shauntal.defeat.3" - ] + encounter: ["dialogue:shauntal.encounter.1", "dialogue:shauntal.encounter.2", "dialogue:shauntal.encounter.3"], + victory: ["dialogue:shauntal.victory.1", "dialogue:shauntal.victory.2", "dialogue:shauntal.victory.3"], + defeat: ["dialogue:shauntal.defeat.1", "dialogue:shauntal.defeat.2", "dialogue:shauntal.defeat.3"], }, [TrainerType.MARSHAL]: { - encounter: [ - "dialogue:marshal.encounter.1", - "dialogue:marshal.encounter.2", - "dialogue:marshal.encounter.3" - ], - victory: [ - "dialogue:marshal.victory.1", - "dialogue:marshal.victory.2", - "dialogue:marshal.victory.3" - ], - defeat: [ - "dialogue:marshal.defeat.1", - "dialogue:marshal.defeat.2", - "dialogue:marshal.defeat.3" - ] + encounter: ["dialogue:marshal.encounter.1", "dialogue:marshal.encounter.2", "dialogue:marshal.encounter.3"], + victory: ["dialogue:marshal.victory.1", "dialogue:marshal.victory.2", "dialogue:marshal.victory.3"], + defeat: ["dialogue:marshal.defeat.1", "dialogue:marshal.defeat.2", "dialogue:marshal.defeat.3"], }, [TrainerType.CHEREN]: { - encounter: [ - "dialogue:cheren.encounter.1", - "dialogue:cheren.encounter.2", - "dialogue:cheren.encounter.3" - ], - victory: [ - "dialogue:cheren.victory.1", - "dialogue:cheren.victory.2", - "dialogue:cheren.victory.3" - ], - defeat: [ - "dialogue:cheren.defeat.1", - "dialogue:cheren.defeat.2", - "dialogue:cheren.defeat.3" - ] + encounter: ["dialogue:cheren.encounter.1", "dialogue:cheren.encounter.2", "dialogue:cheren.encounter.3"], + victory: ["dialogue:cheren.victory.1", "dialogue:cheren.victory.2", "dialogue:cheren.victory.3"], + defeat: ["dialogue:cheren.defeat.1", "dialogue:cheren.defeat.2", "dialogue:cheren.defeat.3"], }, [TrainerType.CHILI]: { - encounter: [ - "dialogue:chili.encounter.1", - "dialogue:chili.encounter.2", - "dialogue:chili.encounter.3" - ], - victory: [ - "dialogue:chili.victory.1", - "dialogue:chili.victory.2", - "dialogue:chili.victory.3" - ], - defeat: [ - "dialogue:chili.defeat.1", - "dialogue:chili.defeat.2", - "dialogue:chili.defeat.3" - ] + encounter: ["dialogue:chili.encounter.1", "dialogue:chili.encounter.2", "dialogue:chili.encounter.3"], + victory: ["dialogue:chili.victory.1", "dialogue:chili.victory.2", "dialogue:chili.victory.3"], + defeat: ["dialogue:chili.defeat.1", "dialogue:chili.defeat.2", "dialogue:chili.defeat.3"], }, [TrainerType.CILAN]: { - encounter: [ - "dialogue:cilan.encounter.1", - "dialogue:cilan.encounter.2", - "dialogue:cilan.encounter.3" - ], - victory: [ - "dialogue:cilan.victory.1", - "dialogue:cilan.victory.2", - "dialogue:cilan.victory.3" - ], - defeat: [ - "dialogue:cilan.defeat.1", - "dialogue:cilan.defeat.2", - "dialogue:cilan.defeat.3" - ] + encounter: ["dialogue:cilan.encounter.1", "dialogue:cilan.encounter.2", "dialogue:cilan.encounter.3"], + victory: ["dialogue:cilan.victory.1", "dialogue:cilan.victory.2", "dialogue:cilan.victory.3"], + defeat: ["dialogue:cilan.defeat.1", "dialogue:cilan.defeat.2", "dialogue:cilan.defeat.3"], }, [TrainerType.ROARK]: { encounter: [ "dialogue:roark.encounter.1", "dialogue:roark.encounter.2", "dialogue:roark.encounter.3", - "dialogue:roark.encounter.4" + "dialogue:roark.encounter.4", ], victory: [ "dialogue:roark.victory.1", "dialogue:roark.victory.2", "dialogue:roark.victory.3", - "dialogue:roark.victory.4" + "dialogue:roark.victory.4", ], - defeat: [ - "dialogue:roark.defeat.1", - "dialogue:roark.defeat.2", - "dialogue:roark.defeat.3" - ] + defeat: ["dialogue:roark.defeat.1", "dialogue:roark.defeat.2", "dialogue:roark.defeat.3"], }, [TrainerType.MORTY]: { encounter: [ @@ -1841,7 +1021,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.encounter.3", "dialogue:morty.encounter.4", "dialogue:morty.encounter.5", - "dialogue:morty.encounter.6" + "dialogue:morty.encounter.6", ], victory: [ "dialogue:morty.victory.1", @@ -1849,7 +1029,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.victory.3", "dialogue:morty.victory.4", "dialogue:morty.victory.5", - "dialogue:morty.victory.6" + "dialogue:morty.victory.6", ], defeat: [ "dialogue:morty.defeat.1", @@ -1857,1335 +1037,626 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.defeat.3", "dialogue:morty.defeat.4", "dialogue:morty.defeat.5", - "dialogue:morty.defeat.6" - ] + "dialogue:morty.defeat.6", + ], }, [TrainerType.CRISPIN]: { - encounter: [ - "dialogue:crispin.encounter.1", - "dialogue:crispin.encounter.2" - ], - victory: [ - "dialogue:crispin.victory.1", - "dialogue:crispin.victory.2" - ], - defeat: [ - "dialogue:crispin.defeat.1", - "dialogue:crispin.defeat.2" - ] + encounter: ["dialogue:crispin.encounter.1", "dialogue:crispin.encounter.2"], + victory: ["dialogue:crispin.victory.1", "dialogue:crispin.victory.2"], + defeat: ["dialogue:crispin.defeat.1", "dialogue:crispin.defeat.2"], }, [TrainerType.AMARYS]: { - encounter: [ - "dialogue:amarys.encounter.1" - ], - victory: [ - "dialogue:amarys.victory.1" - ], - defeat: [ - "dialogue:amarys.defeat.1" - ] + encounter: ["dialogue:amarys.encounter.1"], + victory: ["dialogue:amarys.victory.1"], + defeat: ["dialogue:amarys.defeat.1"], }, [TrainerType.LACEY]: { - encounter: [ - "dialogue:lacey.encounter.1" - ], - victory: [ - "dialogue:lacey.victory.1" - ], - defeat: [ - "dialogue:lacey.defeat.1" - ] + encounter: ["dialogue:lacey.encounter.1"], + victory: ["dialogue:lacey.victory.1"], + defeat: ["dialogue:lacey.defeat.1"], }, [TrainerType.DRAYTON]: { - encounter: [ - "dialogue:drayton.encounter.1" - ], - victory: [ - "dialogue:drayton.victory.1" - ], - defeat: [ - "dialogue:drayton.defeat.1" - ] + encounter: ["dialogue:drayton.encounter.1"], + victory: ["dialogue:drayton.victory.1"], + defeat: ["dialogue:drayton.defeat.1"], }, [TrainerType.RAMOS]: { - encounter: [ - "dialogue:ramos.encounter.1" - ], - victory: [ - "dialogue:ramos.victory.1" - ], - defeat: [ - "dialogue:ramos.defeat.1" - ] + encounter: ["dialogue:ramos.encounter.1"], + victory: ["dialogue:ramos.victory.1"], + defeat: ["dialogue:ramos.defeat.1"], }, [TrainerType.VIOLA]: { - encounter: [ - "dialogue:viola.encounter.1", - "dialogue:viola.encounter.2" - ], - victory: [ - "dialogue:viola.victory.1", - "dialogue:viola.victory.2" - ], - defeat: [ - "dialogue:viola.defeat.1", - "dialogue:viola.defeat.2" - ] + encounter: ["dialogue:viola.encounter.1", "dialogue:viola.encounter.2"], + victory: ["dialogue:viola.victory.1", "dialogue:viola.victory.2"], + defeat: ["dialogue:viola.defeat.1", "dialogue:viola.defeat.2"], }, [TrainerType.CANDICE]: { - encounter: [ - "dialogue:candice.encounter.1", - "dialogue:candice.encounter.2" - ], - victory: [ - "dialogue:candice.victory.1", - "dialogue:candice.victory.2" - ], - defeat: [ - "dialogue:candice.defeat.1", - "dialogue:candice.defeat.2" - ] + encounter: ["dialogue:candice.encounter.1", "dialogue:candice.encounter.2"], + victory: ["dialogue:candice.victory.1", "dialogue:candice.victory.2"], + defeat: ["dialogue:candice.defeat.1", "dialogue:candice.defeat.2"], }, [TrainerType.GARDENIA]: { - encounter: [ - "dialogue:gardenia.encounter.1" - ], - victory: [ - "dialogue:gardenia.victory.1" - ], - defeat: [ - "dialogue:gardenia.defeat.1" - ] + encounter: ["dialogue:gardenia.encounter.1"], + victory: ["dialogue:gardenia.victory.1"], + defeat: ["dialogue:gardenia.defeat.1"], }, [TrainerType.AARON]: { - encounter: [ - "dialogue:aaron.encounter.1" - ], - victory: [ - "dialogue:aaron.victory.1" - ], - defeat: [ - "dialogue:aaron.defeat.1" - ] + encounter: ["dialogue:aaron.encounter.1"], + victory: ["dialogue:aaron.victory.1"], + defeat: ["dialogue:aaron.defeat.1"], }, [TrainerType.CRESS]: { - encounter: [ - "dialogue:cress.encounter.1" - ], - victory: [ - "dialogue:cress.victory.1" - ], - defeat: [ - "dialogue:cress.defeat.1" - ] + encounter: ["dialogue:cress.encounter.1"], + victory: ["dialogue:cress.victory.1"], + defeat: ["dialogue:cress.defeat.1"], }, [TrainerType.ALLISTER]: { - encounter: [ - "dialogue:allister.encounter.1" - ], - victory: [ - "dialogue:allister.victory.1" - ], - defeat: [ - "dialogue:allister.defeat.1" - ] + encounter: ["dialogue:allister.encounter.1"], + victory: ["dialogue:allister.victory.1"], + defeat: ["dialogue:allister.defeat.1"], }, [TrainerType.CLAY]: { - encounter: [ - "dialogue:clay.encounter.1" - ], - victory: [ - "dialogue:clay.victory.1" - ], - defeat: [ - "dialogue:clay.defeat.1" - ] + encounter: ["dialogue:clay.encounter.1"], + victory: ["dialogue:clay.victory.1"], + defeat: ["dialogue:clay.defeat.1"], }, [TrainerType.KOFU]: { - encounter: [ - "dialogue:kofu.encounter.1" - ], - victory: [ - "dialogue:kofu.victory.1" - ], - defeat: [ - "dialogue:kofu.defeat.1" - ] + encounter: ["dialogue:kofu.encounter.1"], + victory: ["dialogue:kofu.victory.1"], + defeat: ["dialogue:kofu.defeat.1"], }, [TrainerType.TULIP]: { - encounter: [ - "dialogue:tulip.encounter.1" - ], - victory: [ - "dialogue:tulip.victory.1" - ], - defeat: [ - "dialogue:tulip.defeat.1" - ] + encounter: ["dialogue:tulip.encounter.1"], + victory: ["dialogue:tulip.victory.1"], + defeat: ["dialogue:tulip.defeat.1"], }, [TrainerType.SIDNEY]: { - encounter: [ - "dialogue:sidney.encounter.1" - ], - victory: [ - "dialogue:sidney.victory.1" - ], - defeat: [ - "dialogue:sidney.defeat.1" - ] + encounter: ["dialogue:sidney.encounter.1"], + victory: ["dialogue:sidney.victory.1"], + defeat: ["dialogue:sidney.defeat.1"], }, [TrainerType.PHOEBE]: { - encounter: [ - "dialogue:phoebe.encounter.1" - ], - victory: [ - "dialogue:phoebe.victory.1" - ], - defeat: [ - "dialogue:phoebe.defeat.1" - ] + encounter: ["dialogue:phoebe.encounter.1"], + victory: ["dialogue:phoebe.victory.1"], + defeat: ["dialogue:phoebe.defeat.1"], }, [TrainerType.GLACIA]: { - encounter: [ - "dialogue:glacia.encounter.1" - ], - victory: [ - "dialogue:glacia.victory.1" - ], - defeat: [ - "dialogue:glacia.defeat.1" - ] + encounter: ["dialogue:glacia.encounter.1"], + victory: ["dialogue:glacia.victory.1"], + defeat: ["dialogue:glacia.defeat.1"], }, [TrainerType.DRAKE]: { - encounter: [ - "dialogue:drake.encounter.1" - ], - victory: [ - "dialogue:drake.victory.1" - ], - defeat: [ - "dialogue:drake.defeat.1" - ] + encounter: ["dialogue:drake.encounter.1"], + victory: ["dialogue:drake.victory.1"], + defeat: ["dialogue:drake.defeat.1"], }, [TrainerType.WALLACE]: { - encounter: [ - "dialogue:wallace.encounter.1" - ], - victory: [ - "dialogue:wallace.victory.1" - ], - defeat: [ - "dialogue:wallace.defeat.1" - ] + encounter: ["dialogue:wallace.encounter.1"], + victory: ["dialogue:wallace.victory.1"], + defeat: ["dialogue:wallace.defeat.1"], }, [TrainerType.LORELEI]: { - encounter: [ - "dialogue:lorelei.encounter.1" - ], - victory: [ - "dialogue:lorelei.victory.1" - ], - defeat: [ - "dialogue:lorelei.defeat.1" - ] + encounter: ["dialogue:lorelei.encounter.1"], + victory: ["dialogue:lorelei.victory.1"], + defeat: ["dialogue:lorelei.defeat.1"], }, [TrainerType.WILL]: { - encounter: [ - "dialogue:will.encounter.1" - ], - victory: [ - "dialogue:will.victory.1" - ], - defeat: [ - "dialogue:will.defeat.1" - ] + encounter: ["dialogue:will.encounter.1"], + victory: ["dialogue:will.victory.1"], + defeat: ["dialogue:will.defeat.1"], }, [TrainerType.MALVA]: { - encounter: [ - "dialogue:malva.encounter.1" - ], - victory: [ - "dialogue:malva.victory.1" - ], - defeat: [ - "dialogue:malva.defeat.1" - ] + encounter: ["dialogue:malva.encounter.1"], + victory: ["dialogue:malva.victory.1"], + defeat: ["dialogue:malva.defeat.1"], }, [TrainerType.HALA]: { - encounter: [ - "dialogue:hala.encounter.1" - ], - victory: [ - "dialogue:hala.victory.1" - ], - defeat: [ - "dialogue:hala.defeat.1" - ] + encounter: ["dialogue:hala.encounter.1"], + victory: ["dialogue:hala.victory.1"], + defeat: ["dialogue:hala.defeat.1"], }, [TrainerType.MOLAYNE]: { - encounter: [ - "dialogue:molayne.encounter.1" - ], - victory: [ - "dialogue:molayne.victory.1" - ], - defeat: [ - "dialogue:molayne.defeat.1" - ] + encounter: ["dialogue:molayne.encounter.1"], + victory: ["dialogue:molayne.victory.1"], + defeat: ["dialogue:molayne.defeat.1"], }, [TrainerType.RIKA]: { - encounter: [ - "dialogue:rika.encounter.1" - ], - victory: [ - "dialogue:rika.victory.1" - ], - defeat: [ - "dialogue:rika.defeat.1" - ] + encounter: ["dialogue:rika.encounter.1"], + victory: ["dialogue:rika.victory.1"], + defeat: ["dialogue:rika.defeat.1"], }, [TrainerType.BRUNO]: { - encounter: [ - "dialogue:bruno.encounter.1" - ], - victory: [ - "dialogue:bruno.victory.1" - ], - defeat: [ - "dialogue:bruno.defeat.1" - ] + encounter: ["dialogue:bruno.encounter.1"], + victory: ["dialogue:bruno.victory.1"], + defeat: ["dialogue:bruno.defeat.1"], }, [TrainerType.BUGSY]: { - encounter: [ - "dialogue:bugsy.encounter.1" - ], - victory: [ - "dialogue:bugsy.victory.1" - ], - defeat: [ - "dialogue:bugsy.defeat.1" - ] + encounter: ["dialogue:bugsy.encounter.1"], + victory: ["dialogue:bugsy.victory.1"], + defeat: ["dialogue:bugsy.defeat.1"], }, [TrainerType.KOGA]: { - encounter: [ - "dialogue:koga.encounter.1" - ], - victory: [ - "dialogue:koga.victory.1" - ], - defeat: [ - "dialogue:koga.defeat.1" - ] + encounter: ["dialogue:koga.encounter.1"], + victory: ["dialogue:koga.victory.1"], + defeat: ["dialogue:koga.defeat.1"], }, [TrainerType.BERTHA]: { - encounter: [ - "dialogue:bertha.encounter.1" - ], - victory: [ - "dialogue:bertha.victory.1" - ], - defeat: [ - "dialogue:bertha.defeat.1" - ] + encounter: ["dialogue:bertha.encounter.1"], + victory: ["dialogue:bertha.victory.1"], + defeat: ["dialogue:bertha.defeat.1"], }, [TrainerType.LENORA]: { - encounter: [ - "dialogue:lenora.encounter.1" - ], - victory: [ - "dialogue:lenora.victory.1" - ], - defeat: [ - "dialogue:lenora.defeat.1" - ] + encounter: ["dialogue:lenora.encounter.1"], + victory: ["dialogue:lenora.victory.1"], + defeat: ["dialogue:lenora.defeat.1"], }, [TrainerType.SIEBOLD]: { - encounter: [ - "dialogue:siebold.encounter.1" - ], - victory: [ - "dialogue:siebold.victory.1" - ], - defeat: [ - "dialogue:siebold.defeat.1" - ] + encounter: ["dialogue:siebold.encounter.1"], + victory: ["dialogue:siebold.victory.1"], + defeat: ["dialogue:siebold.defeat.1"], }, [TrainerType.ROXIE]: { - encounter: [ - "dialogue:roxie.encounter.1" - ], - victory: [ - "dialogue:roxie.victory.1" - ], - defeat: [ - "dialogue:roxie.defeat.1" - ] + encounter: ["dialogue:roxie.encounter.1"], + victory: ["dialogue:roxie.victory.1"], + defeat: ["dialogue:roxie.defeat.1"], }, [TrainerType.OLIVIA]: { - encounter: [ - "dialogue:olivia.encounter.1" - ], - victory: [ - "dialogue:olivia.victory.1" - ], - defeat: [ - "dialogue:olivia.defeat.1" - ] + encounter: ["dialogue:olivia.encounter.1"], + victory: ["dialogue:olivia.victory.1"], + defeat: ["dialogue:olivia.defeat.1"], }, [TrainerType.POPPY]: { - encounter: [ - "dialogue:poppy.encounter.1" - ], - victory: [ - "dialogue:poppy.victory.1" - ], - defeat: [ - "dialogue:poppy.defeat.1" - ] + encounter: ["dialogue:poppy.encounter.1"], + victory: ["dialogue:poppy.victory.1"], + defeat: ["dialogue:poppy.defeat.1"], }, [TrainerType.AGATHA]: { - encounter: [ - "dialogue:agatha.encounter.1" - ], - victory: [ - "dialogue:agatha.victory.1" - ], - defeat: [ - "dialogue:agatha.defeat.1" - ] + encounter: ["dialogue:agatha.encounter.1"], + victory: ["dialogue:agatha.victory.1"], + defeat: ["dialogue:agatha.defeat.1"], }, [TrainerType.FLINT]: { - encounter: [ - "dialogue:flint.encounter.1" - ], - victory: [ - "dialogue:flint.victory.1" - ], - defeat: [ - "dialogue:flint.defeat.1" - ] + encounter: ["dialogue:flint.encounter.1"], + victory: ["dialogue:flint.victory.1"], + defeat: ["dialogue:flint.defeat.1"], }, [TrainerType.GRIMSLEY]: { - encounter: [ - "dialogue:grimsley.encounter.1" - ], - victory: [ - "dialogue:grimsley.victory.1" - ], - defeat: [ - "dialogue:grimsley.defeat.1" - ] + encounter: ["dialogue:grimsley.encounter.1"], + victory: ["dialogue:grimsley.victory.1"], + defeat: ["dialogue:grimsley.defeat.1"], }, [TrainerType.CAITLIN]: { - encounter: [ - "dialogue:caitlin.encounter.1" - ], - victory: [ - "dialogue:caitlin.victory.1" - ], - defeat: [ - "dialogue:caitlin.defeat.1" - ] + encounter: ["dialogue:caitlin.encounter.1"], + victory: ["dialogue:caitlin.victory.1"], + defeat: ["dialogue:caitlin.defeat.1"], }, [TrainerType.DIANTHA]: { - encounter: [ - "dialogue:diantha.encounter.1" - ], - victory: [ - "dialogue:diantha.victory.1" - ], - defeat: [ - "dialogue:diantha.defeat.1" - ] + encounter: ["dialogue:diantha.encounter.1"], + victory: ["dialogue:diantha.victory.1"], + defeat: ["dialogue:diantha.defeat.1"], }, [TrainerType.WIKSTROM]: { - encounter: [ - "dialogue:wikstrom.encounter.1" - ], - victory: [ - "dialogue:wikstrom.victory.1" - ], - defeat: [ - "dialogue:wikstrom.defeat.1" - ] + encounter: ["dialogue:wikstrom.encounter.1"], + victory: ["dialogue:wikstrom.victory.1"], + defeat: ["dialogue:wikstrom.defeat.1"], }, [TrainerType.ACEROLA]: { - encounter: [ - "dialogue:acerola.encounter.1" - ], - victory: [ - "dialogue:acerola.victory.1" - ], - defeat: [ - "dialogue:acerola.defeat.1" - ] + encounter: ["dialogue:acerola.encounter.1"], + victory: ["dialogue:acerola.victory.1"], + defeat: ["dialogue:acerola.defeat.1"], }, [TrainerType.LARRY_ELITE]: { - encounter: [ - "dialogue:larry_elite.encounter.1" - ], - victory: [ - "dialogue:larry_elite.victory.1" - ], - defeat: [ - "dialogue:larry_elite.defeat.1" - ] + encounter: ["dialogue:larry_elite.encounter.1"], + victory: ["dialogue:larry_elite.victory.1"], + defeat: ["dialogue:larry_elite.defeat.1"], }, [TrainerType.LANCE]: { - encounter: [ - "dialogue:lance.encounter.1", - "dialogue:lance.encounter.2" - ], - victory: [ - "dialogue:lance.victory.1", - "dialogue:lance.victory.2" - ], - defeat: [ - "dialogue:lance.defeat.1", - "dialogue:lance.defeat.2" - ] + encounter: ["dialogue:lance.encounter.1", "dialogue:lance.encounter.2"], + victory: ["dialogue:lance.victory.1", "dialogue:lance.victory.2"], + defeat: ["dialogue:lance.defeat.1", "dialogue:lance.defeat.2"], }, [TrainerType.KAREN]: { - encounter: [ - "dialogue:karen.encounter.1", - "dialogue:karen.encounter.2", - "dialogue:karen.encounter.3" - ], - victory: [ - "dialogue:karen.victory.1", - "dialogue:karen.victory.2", - "dialogue:karen.victory.3" - ], - defeat: [ - "dialogue:karen.defeat.1", - "dialogue:karen.defeat.2", - "dialogue:karen.defeat.3" - ] + encounter: ["dialogue:karen.encounter.1", "dialogue:karen.encounter.2", "dialogue:karen.encounter.3"], + victory: ["dialogue:karen.victory.1", "dialogue:karen.victory.2", "dialogue:karen.victory.3"], + defeat: ["dialogue:karen.defeat.1", "dialogue:karen.defeat.2", "dialogue:karen.defeat.3"], }, [TrainerType.MILO]: { - encounter: [ - "dialogue:milo.encounter.1" - ], - victory: [ - "dialogue:milo.victory.1" - ], - defeat: [ - "dialogue:milo.defeat.1" - ] + encounter: ["dialogue:milo.encounter.1"], + victory: ["dialogue:milo.victory.1"], + defeat: ["dialogue:milo.defeat.1"], }, [TrainerType.LUCIAN]: { - encounter: [ - "dialogue:lucian.encounter.1" - ], - victory: [ - "dialogue:lucian.victory.1" - ], - defeat: [ - "dialogue:lucian.defeat.1" - ] + encounter: ["dialogue:lucian.encounter.1"], + victory: ["dialogue:lucian.victory.1"], + defeat: ["dialogue:lucian.defeat.1"], }, [TrainerType.DRASNA]: { - encounter: [ - "dialogue:drasna.encounter.1" - ], - victory: [ - "dialogue:drasna.victory.1" - ], - defeat: [ - "dialogue:drasna.defeat.1" - ] + encounter: ["dialogue:drasna.encounter.1"], + victory: ["dialogue:drasna.victory.1"], + defeat: ["dialogue:drasna.defeat.1"], }, [TrainerType.KAHILI]: { - encounter: [ - "dialogue:kahili.encounter.1" - ], - victory: [ - "dialogue:kahili.victory.1" - ], - defeat: [ - "dialogue:kahili.defeat.1" - ] + encounter: ["dialogue:kahili.encounter.1"], + victory: ["dialogue:kahili.victory.1"], + defeat: ["dialogue:kahili.defeat.1"], }, [TrainerType.HASSEL]: { - encounter: [ - "dialogue:hassel.encounter.1" - ], - victory: [ - "dialogue:hassel.victory.1" - ], - defeat: [ - "dialogue:hassel.defeat.1" - ] + encounter: ["dialogue:hassel.encounter.1"], + victory: ["dialogue:hassel.victory.1"], + defeat: ["dialogue:hassel.defeat.1"], }, [TrainerType.BLUE]: { - encounter: [ - "dialogue:blue.encounter.1" - ], - victory: [ - "dialogue:blue.victory.1" - ], - defeat: [ - "dialogue:blue.defeat.1" - ] + encounter: ["dialogue:blue.encounter.1"], + victory: ["dialogue:blue.victory.1"], + defeat: ["dialogue:blue.defeat.1"], }, [TrainerType.PIERS]: { - encounter: [ - "dialogue:piers.encounter.1" - ], - victory: [ - "dialogue:piers.victory.1" - ], - defeat: [ - "dialogue:piers.defeat.1" - ] + encounter: ["dialogue:piers.encounter.1"], + victory: ["dialogue:piers.victory.1"], + defeat: ["dialogue:piers.defeat.1"], }, [TrainerType.RED]: { - encounter: [ - "dialogue:red.encounter.1" - ], - victory: [ - "dialogue:red.victory.1" - ], - defeat: [ - "dialogue:red.defeat.1" - ] + encounter: ["dialogue:red.encounter.1"], + victory: ["dialogue:red.victory.1"], + defeat: ["dialogue:red.defeat.1"], }, [TrainerType.JASMINE]: { - encounter: [ - "dialogue:jasmine.encounter.1" - ], - victory: [ - "dialogue:jasmine.victory.1" - ], - defeat: [ - "dialogue:jasmine.defeat.1" - ] + encounter: ["dialogue:jasmine.encounter.1"], + victory: ["dialogue:jasmine.victory.1"], + defeat: ["dialogue:jasmine.defeat.1"], }, [TrainerType.LANCE_CHAMPION]: { - encounter: [ - "dialogue:lance_champion.encounter.1" - ], - victory: [ - "dialogue:lance_champion.victory.1" - ], - defeat: [ - "dialogue:lance_champion.defeat.1" - ] + encounter: ["dialogue:lance_champion.encounter.1"], + victory: ["dialogue:lance_champion.victory.1"], + defeat: ["dialogue:lance_champion.defeat.1"], }, [TrainerType.STEVEN]: { - encounter: [ - "dialogue:steven.encounter.1" - ], - victory: [ - "dialogue:steven.victory.1" - ], - defeat: [ - "dialogue:steven.defeat.1" - ] + encounter: ["dialogue:steven.encounter.1"], + victory: ["dialogue:steven.victory.1"], + defeat: ["dialogue:steven.defeat.1"], }, [TrainerType.CYNTHIA]: { - encounter: [ - "dialogue:cynthia.encounter.1" - ], - victory: [ - "dialogue:cynthia.victory.1" - ], - defeat: [ - "dialogue:cynthia.defeat.1" - ] + encounter: ["dialogue:cynthia.encounter.1"], + victory: ["dialogue:cynthia.victory.1"], + defeat: ["dialogue:cynthia.defeat.1"], }, [TrainerType.IRIS]: { - encounter: [ - "dialogue:iris.encounter.1" - ], - victory: [ - "dialogue:iris.victory.1" - ], - defeat: [ - "dialogue:iris.defeat.1" - ] + encounter: ["dialogue:iris.encounter.1"], + victory: ["dialogue:iris.victory.1"], + defeat: ["dialogue:iris.defeat.1"], }, [TrainerType.KUKUI]: { - encounter: [ - "dialogue:kukui.encounter.1" - ], - victory: [ - "dialogue:kukui.victory.1" - ], - defeat: [ - "dialogue:kukui.defeat.1" - ] + encounter: ["dialogue:kukui.encounter.1"], + victory: ["dialogue:kukui.victory.1"], + defeat: ["dialogue:kukui.defeat.1"], }, [TrainerType.HAU]: { - encounter: [ - "dialogue:hau.encounter.1" - ], - victory: [ - "dialogue:hau.victory.1" - ], - defeat: [ - "dialogue:hau.defeat.1" - ] + encounter: ["dialogue:hau.encounter.1"], + victory: ["dialogue:hau.victory.1"], + defeat: ["dialogue:hau.defeat.1"], }, [TrainerType.GEETA]: { - encounter: [ - "dialogue:geeta.encounter.1" - ], - victory: [ - "dialogue:geeta.victory.1" - ], - defeat: [ - "dialogue:geeta.defeat.1" - ] + encounter: ["dialogue:geeta.encounter.1"], + victory: ["dialogue:geeta.victory.1"], + defeat: ["dialogue:geeta.defeat.1"], }, [TrainerType.NEMONA]: { - encounter: [ - "dialogue:nemona.encounter.1" - ], - victory: [ - "dialogue:nemona.victory.1" - ], - defeat: [ - "dialogue:nemona.defeat.1" - ] + encounter: ["dialogue:nemona.encounter.1"], + victory: ["dialogue:nemona.victory.1"], + defeat: ["dialogue:nemona.defeat.1"], }, [TrainerType.LEON]: { - encounter: [ - "dialogue:leon.encounter.1" - ], - victory: [ - "dialogue:leon.victory.1" - ], - defeat: [ - "dialogue:leon.defeat.1" - ] + encounter: ["dialogue:leon.encounter.1"], + victory: ["dialogue:leon.victory.1"], + defeat: ["dialogue:leon.defeat.1"], }, [TrainerType.MUSTARD]: { - encounter: [ - "dialogue:mustard.encounter.1" - ], - victory: [ - "dialogue:mustard.victory.1" - ], - defeat: [ - "dialogue:mustard.defeat.1" - ] + encounter: ["dialogue:mustard.encounter.1"], + victory: ["dialogue:mustard.victory.1"], + defeat: ["dialogue:mustard.defeat.1"], }, [TrainerType.WHITNEY]: { - encounter: [ - "dialogue:whitney.encounter.1" - ], - victory: [ - "dialogue:whitney.victory.1" - ], - defeat: [ - "dialogue:whitney.defeat.1" - ] + encounter: ["dialogue:whitney.encounter.1"], + victory: ["dialogue:whitney.victory.1"], + defeat: ["dialogue:whitney.defeat.1"], }, [TrainerType.CHUCK]: { - encounter: [ - "dialogue:chuck.encounter.1" - ], - victory: [ - "dialogue:chuck.victory.1" - ], - defeat: [ - "dialogue:chuck.defeat.1" - ] + encounter: ["dialogue:chuck.encounter.1"], + victory: ["dialogue:chuck.victory.1"], + defeat: ["dialogue:chuck.defeat.1"], }, [TrainerType.KATY]: { - encounter: [ - "dialogue:katy.encounter.1" - ], - victory: [ - "dialogue:katy.victory.1" - ], - defeat: [ - "dialogue:katy.defeat.1" - ] + encounter: ["dialogue:katy.encounter.1"], + victory: ["dialogue:katy.victory.1"], + defeat: ["dialogue:katy.defeat.1"], }, [TrainerType.PRYCE]: { - encounter: [ - "dialogue:pryce.encounter.1" - ], - victory: [ - "dialogue:pryce.victory.1" - ], - defeat: [ - "dialogue:pryce.defeat.1" - ] + encounter: ["dialogue:pryce.encounter.1"], + victory: ["dialogue:pryce.victory.1"], + defeat: ["dialogue:pryce.defeat.1"], }, [TrainerType.CLAIR]: { - encounter: [ - "dialogue:clair.encounter.1" - ], - victory: [ - "dialogue:clair.victory.1" - ], - defeat: [ - "dialogue:clair.defeat.1" - ] + encounter: ["dialogue:clair.encounter.1"], + victory: ["dialogue:clair.victory.1"], + defeat: ["dialogue:clair.defeat.1"], }, [TrainerType.MAYLENE]: { - encounter: [ - "dialogue:maylene.encounter.1" - ], - victory: [ - "dialogue:maylene.victory.1" - ], - defeat: [ - "dialogue:maylene.defeat.1" - ] + encounter: ["dialogue:maylene.encounter.1"], + victory: ["dialogue:maylene.victory.1"], + defeat: ["dialogue:maylene.defeat.1"], }, [TrainerType.FANTINA]: { - encounter: [ - "dialogue:fantina.encounter.1" - ], - victory: [ - "dialogue:fantina.victory.1" - ], - defeat: [ - "dialogue:fantina.defeat.1" - ] + encounter: ["dialogue:fantina.encounter.1"], + victory: ["dialogue:fantina.victory.1"], + defeat: ["dialogue:fantina.defeat.1"], }, [TrainerType.BYRON]: { - encounter: [ - "dialogue:byron.encounter.1" - ], - victory: [ - "dialogue:byron.victory.1" - ], - defeat: [ - "dialogue:byron.defeat.1" - ] + encounter: ["dialogue:byron.encounter.1"], + victory: ["dialogue:byron.victory.1"], + defeat: ["dialogue:byron.defeat.1"], }, [TrainerType.OLYMPIA]: { - encounter: [ - "dialogue:olympia.encounter.1" - ], - victory: [ - "dialogue:olympia.victory.1" - ], - defeat: [ - "dialogue:olympia.defeat.1" - ] + encounter: ["dialogue:olympia.encounter.1"], + victory: ["dialogue:olympia.victory.1"], + defeat: ["dialogue:olympia.defeat.1"], }, [TrainerType.VOLKNER]: { - encounter: [ - "dialogue:volkner.encounter.1" - ], - victory: [ - "dialogue:volkner.victory.1" - ], - defeat: [ - "dialogue:volkner.defeat.1" - ] + encounter: ["dialogue:volkner.encounter.1"], + victory: ["dialogue:volkner.victory.1"], + defeat: ["dialogue:volkner.defeat.1"], }, [TrainerType.BURGH]: { - encounter: [ - "dialogue:burgh.encounter.1", - "dialogue:burgh.encounter.2" - ], - victory: [ - "dialogue:burgh.victory.1", - "dialogue:burgh.victory.2" - ], - defeat: [ - "dialogue:burgh.defeat.1", - "dialogue:burgh.defeat.2" - ] + encounter: ["dialogue:burgh.encounter.1", "dialogue:burgh.encounter.2"], + victory: ["dialogue:burgh.victory.1", "dialogue:burgh.victory.2"], + defeat: ["dialogue:burgh.defeat.1", "dialogue:burgh.defeat.2"], }, [TrainerType.ELESA]: { - encounter: [ - "dialogue:elesa.encounter.1" - ], - victory: [ - "dialogue:elesa.victory.1" - ], - defeat: [ - "dialogue:elesa.defeat.1" - ] + encounter: ["dialogue:elesa.encounter.1"], + victory: ["dialogue:elesa.victory.1"], + defeat: ["dialogue:elesa.defeat.1"], }, [TrainerType.SKYLA]: { - encounter: [ - "dialogue:skyla.encounter.1" - ], - victory: [ - "dialogue:skyla.victory.1" - ], - defeat: [ - "dialogue:skyla.defeat.1" - ] + encounter: ["dialogue:skyla.encounter.1"], + victory: ["dialogue:skyla.victory.1"], + defeat: ["dialogue:skyla.defeat.1"], }, [TrainerType.BRYCEN]: { - encounter: [ - "dialogue:brycen.encounter.1" - ], - victory: [ - "dialogue:brycen.victory.1" - ], - defeat: [ - "dialogue:brycen.defeat.1" - ] + encounter: ["dialogue:brycen.encounter.1"], + victory: ["dialogue:brycen.victory.1"], + defeat: ["dialogue:brycen.defeat.1"], }, [TrainerType.DRAYDEN]: { - encounter: [ - "dialogue:drayden.encounter.1" - ], - victory: [ - "dialogue:drayden.victory.1" - ], - defeat: [ - "dialogue:drayden.defeat.1" - ] + encounter: ["dialogue:drayden.encounter.1"], + victory: ["dialogue:drayden.victory.1"], + defeat: ["dialogue:drayden.defeat.1"], }, [TrainerType.GRANT]: { - encounter: [ - "dialogue:grant.encounter.1" - ], - victory: [ - "dialogue:grant.victory.1" - ], - defeat: [ - "dialogue:grant.defeat.1" - ] + encounter: ["dialogue:grant.encounter.1"], + victory: ["dialogue:grant.victory.1"], + defeat: ["dialogue:grant.defeat.1"], }, [TrainerType.KORRINA]: { - encounter: [ - "dialogue:korrina.encounter.1" - ], - victory: [ - "dialogue:korrina.victory.1" - ], - defeat: [ - "dialogue:korrina.defeat.1" - ] + encounter: ["dialogue:korrina.encounter.1"], + victory: ["dialogue:korrina.victory.1"], + defeat: ["dialogue:korrina.defeat.1"], }, [TrainerType.CLEMONT]: { - encounter: [ - "dialogue:clemont.encounter.1" - ], - victory: [ - "dialogue:clemont.victory.1" - ], - defeat: [ - "dialogue:clemont.defeat.1" - ] + encounter: ["dialogue:clemont.encounter.1"], + victory: ["dialogue:clemont.victory.1"], + defeat: ["dialogue:clemont.defeat.1"], }, [TrainerType.VALERIE]: { - encounter: [ - "dialogue:valerie.encounter.1" - ], - victory: [ - "dialogue:valerie.victory.1" - ], - defeat: [ - "dialogue:valerie.defeat.1" - ] + encounter: ["dialogue:valerie.encounter.1"], + victory: ["dialogue:valerie.victory.1"], + defeat: ["dialogue:valerie.defeat.1"], }, [TrainerType.WULFRIC]: { - encounter: [ - "dialogue:wulfric.encounter.1" - ], - victory: [ - "dialogue:wulfric.victory.1" - ], - defeat: [ - "dialogue:wulfric.defeat.1" - ] + encounter: ["dialogue:wulfric.encounter.1"], + victory: ["dialogue:wulfric.victory.1"], + defeat: ["dialogue:wulfric.defeat.1"], }, [TrainerType.KABU]: { - encounter: [ - "dialogue:kabu.encounter.1" - ], - victory: [ - "dialogue:kabu.victory.1" - ], - defeat: [ - "dialogue:kabu.defeat.1" - ] + encounter: ["dialogue:kabu.encounter.1"], + victory: ["dialogue:kabu.victory.1"], + defeat: ["dialogue:kabu.defeat.1"], }, [TrainerType.BEA]: { - encounter: [ - "dialogue:bea.encounter.1" - ], - victory: [ - "dialogue:bea.victory.1" - ], - defeat: [ - "dialogue:bea.defeat.1" - ] + encounter: ["dialogue:bea.encounter.1"], + victory: ["dialogue:bea.victory.1"], + defeat: ["dialogue:bea.defeat.1"], }, [TrainerType.OPAL]: { - encounter: [ - "dialogue:opal.encounter.1" - ], - victory: [ - "dialogue:opal.victory.1" - ], - defeat: [ - "dialogue:opal.defeat.1" - ] + encounter: ["dialogue:opal.encounter.1"], + victory: ["dialogue:opal.victory.1"], + defeat: ["dialogue:opal.defeat.1"], }, [TrainerType.BEDE]: { - encounter: [ - "dialogue:bede.encounter.1" - ], - victory: [ - "dialogue:bede.victory.1" - ], - defeat: [ - "dialogue:bede.defeat.1" - ] + encounter: ["dialogue:bede.encounter.1"], + victory: ["dialogue:bede.victory.1"], + defeat: ["dialogue:bede.defeat.1"], }, [TrainerType.GORDIE]: { - encounter: [ - "dialogue:gordie.encounter.1" - ], - victory: [ - "dialogue:gordie.victory.1" - ], - defeat: [ - "dialogue:gordie.defeat.1" - ] + encounter: ["dialogue:gordie.encounter.1"], + victory: ["dialogue:gordie.victory.1"], + defeat: ["dialogue:gordie.defeat.1"], }, [TrainerType.MARNIE]: { - encounter: [ - "dialogue:marnie.encounter.1" - ], - victory: [ - "dialogue:marnie.victory.1" - ], - defeat: [ - "dialogue:marnie.defeat.1" - ] + encounter: ["dialogue:marnie.encounter.1"], + victory: ["dialogue:marnie.victory.1"], + defeat: ["dialogue:marnie.defeat.1"], }, [TrainerType.RAIHAN]: { - encounter: [ - "dialogue:raihan.encounter.1" - ], - victory: [ - "dialogue:raihan.victory.1" - ], - defeat: [ - "dialogue:raihan.defeat.1" - ] + encounter: ["dialogue:raihan.encounter.1"], + victory: ["dialogue:raihan.victory.1"], + defeat: ["dialogue:raihan.defeat.1"], }, [TrainerType.BRASSIUS]: { - encounter: [ - "dialogue:brassius.encounter.1" - ], - victory: [ - "dialogue:brassius.victory.1" - ], - defeat: [ - "dialogue:brassius.defeat.1" - ] + encounter: ["dialogue:brassius.encounter.1"], + victory: ["dialogue:brassius.victory.1"], + defeat: ["dialogue:brassius.defeat.1"], }, [TrainerType.IONO]: { - encounter: [ - "dialogue:iono.encounter.1" - ], - victory: [ - "dialogue:iono.victory.1" - ], - defeat: [ - "dialogue:iono.defeat.1" - ] + encounter: ["dialogue:iono.encounter.1"], + victory: ["dialogue:iono.victory.1"], + defeat: ["dialogue:iono.defeat.1"], }, [TrainerType.LARRY]: { - encounter: [ - "dialogue:larry.encounter.1" - ], - victory: [ - "dialogue:larry.victory.1" - ], - defeat: [ - "dialogue:larry.defeat.1" - ] + encounter: ["dialogue:larry.encounter.1"], + victory: ["dialogue:larry.victory.1"], + defeat: ["dialogue:larry.defeat.1"], }, [TrainerType.RYME]: { - encounter: [ - "dialogue:ryme.encounter.1" - ], - victory: [ - "dialogue:ryme.victory.1" - ], - defeat: [ - "dialogue:ryme.defeat.1" - ] + encounter: ["dialogue:ryme.encounter.1"], + victory: ["dialogue:ryme.victory.1"], + defeat: ["dialogue:ryme.defeat.1"], }, [TrainerType.GRUSHA]: { - encounter: [ - "dialogue:grusha.encounter.1" - ], - victory: [ - "dialogue:grusha.victory.1" - ], - defeat: [ - "dialogue:grusha.defeat.1" - ] + encounter: ["dialogue:grusha.encounter.1"], + victory: ["dialogue:grusha.victory.1"], + defeat: ["dialogue:grusha.defeat.1"], }, [TrainerType.MARNIE_ELITE]: { - encounter: [ - "dialogue:marnie_elite.encounter.1", - "dialogue:marnie_elite.encounter.2" - ], - victory: [ - "dialogue:marnie_elite.victory.1", - "dialogue:marnie_elite.victory.2" - ], - defeat: [ - "dialogue:marnie_elite.defeat.1", - "dialogue:marnie_elite.defeat.2" - ] + encounter: ["dialogue:marnie_elite.encounter.1", "dialogue:marnie_elite.encounter.2"], + victory: ["dialogue:marnie_elite.victory.1", "dialogue:marnie_elite.victory.2"], + defeat: ["dialogue:marnie_elite.defeat.1", "dialogue:marnie_elite.defeat.2"], }, [TrainerType.NESSA_ELITE]: { - encounter: [ - "dialogue:nessa_elite.encounter.1", - "dialogue:nessa_elite.encounter.2" - ], - victory: [ - "dialogue:nessa_elite.victory.1", - "dialogue:nessa_elite.victory.2" - ], - defeat: [ - "dialogue:nessa_elite.defeat.1", - "dialogue:nessa_elite.defeat.2" - ] + encounter: ["dialogue:nessa_elite.encounter.1", "dialogue:nessa_elite.encounter.2"], + victory: ["dialogue:nessa_elite.victory.1", "dialogue:nessa_elite.victory.2"], + defeat: ["dialogue:nessa_elite.defeat.1", "dialogue:nessa_elite.defeat.2"], }, [TrainerType.BEA_ELITE]: { - encounter: [ - "dialogue:bea_elite.encounter.1", - "dialogue:bea_elite.encounter.2" - ], - victory: [ - "dialogue:bea_elite.victory.1", - "dialogue:bea_elite.victory.2" - ], - defeat: [ - "dialogue:bea_elite.defeat.1", - "dialogue:bea_elite.defeat.2" - ] + encounter: ["dialogue:bea_elite.encounter.1", "dialogue:bea_elite.encounter.2"], + victory: ["dialogue:bea_elite.victory.1", "dialogue:bea_elite.victory.2"], + defeat: ["dialogue:bea_elite.defeat.1", "dialogue:bea_elite.defeat.2"], }, [TrainerType.ALLISTER_ELITE]: { - encounter: [ - "dialogue:allister_elite.encounter.1", - "dialogue:allister_elite.encounter.2" - ], - victory: [ - "dialogue:allister_elite.victory.1", - "dialogue:allister_elite.victory.2" - ], - defeat: [ - "dialogue:allister_elite.defeat.1", - "dialogue:allister_elite.defeat.2" - ] + encounter: ["dialogue:allister_elite.encounter.1", "dialogue:allister_elite.encounter.2"], + victory: ["dialogue:allister_elite.victory.1", "dialogue:allister_elite.victory.2"], + defeat: ["dialogue:allister_elite.defeat.1", "dialogue:allister_elite.defeat.2"], }, [TrainerType.RAIHAN_ELITE]: { - encounter: [ - "dialogue:raihan_elite.encounter.1", - "dialogue:raihan_elite.encounter.2" - ], - victory: [ - "dialogue:raihan_elite.victory.1", - "dialogue:raihan_elite.victory.2" - ], - defeat: [ - "dialogue:raihan_elite.defeat.1", - "dialogue:raihan_elite.defeat.2" - ] + encounter: ["dialogue:raihan_elite.encounter.1", "dialogue:raihan_elite.encounter.2"], + victory: ["dialogue:raihan_elite.victory.1", "dialogue:raihan_elite.victory.2"], + defeat: ["dialogue:raihan_elite.defeat.1", "dialogue:raihan_elite.defeat.2"], }, [TrainerType.ALDER]: { - encounter: [ - "dialogue:alder.encounter.1" - ], - victory: [ - "dialogue:alder.victory.1" - ], - defeat: [ - "dialogue:alder.defeat.1" - ] + encounter: ["dialogue:alder.encounter.1"], + victory: ["dialogue:alder.victory.1"], + defeat: ["dialogue:alder.defeat.1"], }, [TrainerType.KIERAN]: { - encounter: [ - "dialogue:kieran.encounter.1" - ], - victory: [ - "dialogue:kieran.victory.1" - ], - defeat: [ - "dialogue:kieran.defeat.1" - ] + encounter: ["dialogue:kieran.encounter.1"], + victory: ["dialogue:kieran.victory.1"], + defeat: ["dialogue:kieran.defeat.1"], }, [TrainerType.RIVAL]: [ { - encounter: [ - "dialogue:rival.encounter.1", - ], - victory: [ - "dialogue:rival.victory.1", - ], - + encounter: ["dialogue:rival.encounter.1"], + victory: ["dialogue:rival.victory.1"], }, { - encounter: [ - "dialogue:rival_female.encounter.1", - ], - victory: [ - "dialogue:rival_female.victory.1", - ] - } + encounter: ["dialogue:rival_female.encounter.1"], + victory: ["dialogue:rival_female.victory.1"], + }, ], [TrainerType.RIVAL_2]: [ { - encounter: [ - "dialogue:rival_2.encounter.1", - ], - victory: [ - "dialogue:rival_2.victory.1", - ], - + encounter: ["dialogue:rival_2.encounter.1"], + victory: ["dialogue:rival_2.victory.1"], }, { - encounter: [ - "dialogue:rival_2_female.encounter.1", - ], - victory: [ - "dialogue:rival_2_female.victory.1", - ], - defeat: [ - "dialogue:rival_2_female.defeat.1", - ] + encounter: ["dialogue:rival_2_female.encounter.1"], + victory: ["dialogue:rival_2_female.victory.1"], + defeat: ["dialogue:rival_2_female.defeat.1"], }, ], [TrainerType.RIVAL_3]: [ { - encounter: [ - "dialogue:rival_3.encounter.1", - ], - victory: [ - "dialogue:rival_3.victory.1", - ] + encounter: ["dialogue:rival_3.encounter.1"], + victory: ["dialogue:rival_3.victory.1"], }, { - encounter: [ - "dialogue:rival_3_female.encounter.1", - ], - victory: [ - "dialogue:rival_3_female.victory.1", - ], - defeat: [ - "dialogue:rival_3_female.defeat.1", - ] - } + encounter: ["dialogue:rival_3_female.encounter.1"], + victory: ["dialogue:rival_3_female.victory.1"], + defeat: ["dialogue:rival_3_female.defeat.1"], + }, ], [TrainerType.RIVAL_4]: [ { - encounter: [ - "dialogue:rival_4.encounter.1", - ], - victory: [ - "dialogue:rival_4.victory.1", - ] + encounter: ["dialogue:rival_4.encounter.1"], + victory: ["dialogue:rival_4.victory.1"], }, { - encounter: [ - "dialogue:rival_4_female.encounter.1", - ], - victory: [ - "dialogue:rival_4_female.victory.1", - ], - defeat: [ - "dialogue:rival_4_female.defeat.1", - ] - } + encounter: ["dialogue:rival_4_female.encounter.1"], + victory: ["dialogue:rival_4_female.victory.1"], + defeat: ["dialogue:rival_4_female.defeat.1"], + }, ], [TrainerType.RIVAL_5]: [ { - encounter: [ - "dialogue:rival_5.encounter.1", - ], - victory: [ - "dialogue:rival_5.victory.1", - ] + encounter: ["dialogue:rival_5.encounter.1"], + victory: ["dialogue:rival_5.victory.1"], }, { - encounter: [ - "dialogue:rival_5_female.encounter.1", - ], - victory: [ - "dialogue:rival_5_female.victory.1", - ], - defeat: [ - "dialogue:rival_5_female.defeat.1", - ] - } + encounter: ["dialogue:rival_5_female.encounter.1"], + victory: ["dialogue:rival_5_female.victory.1"], + defeat: ["dialogue:rival_5_female.defeat.1"], + }, ], [TrainerType.RIVAL_6]: [ { - encounter: [ - "dialogue:rival_6.encounter.1", - ], - victory: [ - "dialogue:rival_6.victory.1", - ] + encounter: ["dialogue:rival_6.encounter.1"], + victory: ["dialogue:rival_6.victory.1"], }, { - encounter: [ - "dialogue:rival_6_female.encounter.1", - ], - victory: [ - "dialogue:rival_6_female.victory.1", - ], - } - ] + encounter: ["dialogue:rival_6_female.encounter.1"], + victory: ["dialogue:rival_6_female.victory.1"], + }, + ], }; - export const doubleBattleDialogue = { - "blue_red_double": { - encounter: [ "doubleBattleDialogue:blue_red_double.encounter.1" ], - victory: [ "doubleBattleDialogue:blue_red_double.victory.1" ] + blue_red_double: { + encounter: ["doubleBattleDialogue:blue_red_double.encounter.1"], + victory: ["doubleBattleDialogue:blue_red_double.victory.1"], }, - "red_blue_double": { - encounter: [ "doubleBattleDialogue:red_blue_double.encounter.1" ], - victory: [ "doubleBattleDialogue:red_blue_double.victory.1" ] + red_blue_double: { + encounter: ["doubleBattleDialogue:red_blue_double.encounter.1"], + victory: ["doubleBattleDialogue:red_blue_double.victory.1"], }, - "tate_liza_double": { - encounter: [ "doubleBattleDialogue:tate_liza_double.encounter.1" ], - victory: [ "doubleBattleDialogue:tate_liza_double.victory.1" ] + tate_liza_double: { + encounter: ["doubleBattleDialogue:tate_liza_double.encounter.1"], + victory: ["doubleBattleDialogue:tate_liza_double.victory.1"], }, - "liza_tate_double": { - encounter: [ "doubleBattleDialogue:liza_tate_double.encounter.1" ], - victory: [ "doubleBattleDialogue:liza_tate_double.victory.1" ] + liza_tate_double: { + encounter: ["doubleBattleDialogue:liza_tate_double.encounter.1"], + victory: ["doubleBattleDialogue:liza_tate_double.victory.1"], }, - "wallace_steven_double": { - encounter: [ "doubleBattleDialogue:wallace_steven_double.encounter.1" ], - victory: [ "doubleBattleDialogue:wallace_steven_double.victory.1" ] + wallace_steven_double: { + encounter: ["doubleBattleDialogue:wallace_steven_double.encounter.1"], + victory: ["doubleBattleDialogue:wallace_steven_double.victory.1"], }, - "steven_wallace_double": { - encounter: [ "doubleBattleDialogue:steven_wallace_double.encounter.1" ], - victory: [ "doubleBattleDialogue:steven_wallace_double.victory.1" ] + steven_wallace_double: { + encounter: ["doubleBattleDialogue:steven_wallace_double.encounter.1"], + victory: ["doubleBattleDialogue:steven_wallace_double.victory.1"], }, - "alder_iris_double": { - encounter: [ "doubleBattleDialogue:alder_iris_double.encounter.1" ], - victory: [ "doubleBattleDialogue:alder_iris_double.victory.1" ] + alder_iris_double: { + encounter: ["doubleBattleDialogue:alder_iris_double.encounter.1"], + victory: ["doubleBattleDialogue:alder_iris_double.victory.1"], }, - "iris_alder_double": { - encounter: [ "doubleBattleDialogue:iris_alder_double.encounter.1" ], - victory: [ "doubleBattleDialogue:iris_alder_double.victory.1" ] + iris_alder_double: { + encounter: ["doubleBattleDialogue:iris_alder_double.encounter.1"], + victory: ["doubleBattleDialogue:iris_alder_double.victory.1"], }, - "marnie_piers_double": { - encounter: [ "doubleBattleDialogue:marnie_piers_double.encounter.1" ], - victory: [ "doubleBattleDialogue:marnie_piers_double.victory.1" ] + marnie_piers_double: { + encounter: ["doubleBattleDialogue:marnie_piers_double.encounter.1"], + victory: ["doubleBattleDialogue:marnie_piers_double.victory.1"], }, - "piers_marnie_double": { - encounter: [ "doubleBattleDialogue:piers_marnie_double.encounter.1" ], - victory: [ "doubleBattleDialogue:piers_marnie_double.victory.1" ] + piers_marnie_double: { + encounter: ["doubleBattleDialogue:piers_marnie_double.encounter.1"], + victory: ["doubleBattleDialogue:piers_marnie_double.victory.1"], }, - - }; export const battleSpecDialogue = { @@ -3193,14 +1664,11 @@ export const battleSpecDialogue = { encounter: "battleSpecDialogue:encounter", firstStageWin: "battleSpecDialogue:firstStageWin", secondStageWin: "battleSpecDialogue:secondStageWin", - } + }, }; export const miscDialogue = { - ending: [ - "miscDialogue:ending", - "miscDialogue:ending_female" - ] + ending: ["miscDialogue:ending", "miscDialogue:ending_female"], }; export function getCharVariantFromDialogue(message: string): string { @@ -3212,17 +1680,18 @@ export function getCharVariantFromDialogue(message: string): string { } export function initTrainerTypeDialogue(): void { - const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType); + const trainerTypes = Object.keys(trainerTypeDialogue).map(t => Number.parseInt(t) as TrainerType); for (const trainerType of trainerTypes) { const messages = trainerTypeDialogue[trainerType]; - const messageTypes = [ "encounter", "victory", "defeat" ]; + const messageTypes = ["encounter", "victory", "defeat"]; for (const messageType of messageTypes) { if (Array.isArray(messages)) { if (messages[0][messageType]) { 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${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = + messages[1][messageType]; } } else { trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType]; diff --git a/src/data/egg-hatch-data.ts b/src/data/egg-hatch-data.ts index 37ee9bede09..949ed1af063 100644 --- a/src/data/egg-hatch-data.ts +++ b/src/data/egg-hatch-data.ts @@ -24,17 +24,17 @@ export class EggHatchData { } /** - * Sets the boolean for if the egg move for the hatch is a new unlock - * @param unlocked True if the EM is new - */ + * Sets the boolean for if the egg move for the hatch is a new unlock + * @param unlocked True if the EM is new + */ setEggMoveUnlocked(unlocked: boolean) { - this.eggMoveUnlocked = unlocked; + this.eggMoveUnlocked = unlocked; } /** - * Stores a copy of the current DexEntry of the pokemon and StarterDataEntry of its starter - * Used before updating the dex, so comparing the pokemon to these entries will show the new attributes - */ + * Stores a copy of the current DexEntry of the pokemon and StarterDataEntry of its starter + * Used before updating the dex, so comparing the pokemon to these entries will show the new attributes + */ setDex() { const currDexEntry = globalScene.gameData.dexData[this.pokemon.species.speciesId]; const currStarterDataEntry = globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()]; @@ -45,7 +45,7 @@ export class EggHatchData { seenCount: currDexEntry.seenCount, caughtCount: currDexEntry.caughtCount, hatchedCount: currDexEntry.hatchedCount, - ivs: [ ...currDexEntry.ivs ] + ivs: [...currDexEntry.ivs], }; this.starterDataEntryBeforeUpdate = { moveset: currStarterDataEntry.moveset, @@ -55,37 +55,37 @@ export class EggHatchData { abilityAttr: currStarterDataEntry.abilityAttr, passiveAttr: currStarterDataEntry.passiveAttr, valueReduction: currStarterDataEntry.valueReduction, - classicWinCount: currStarterDataEntry.classicWinCount + classicWinCount: currStarterDataEntry.classicWinCount, }; } /** - * Gets the dex entry before update - * @returns Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex - */ + * Gets the dex entry before update + * @returns Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex + */ getDex(): DexEntry { return this.dexEntryBeforeUpdate; } /** - * Gets the starter dex entry before update - * @returns Starter Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex - */ + * Gets the starter dex entry before update + * @returns Starter Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex + */ getStarterEntry(): StarterDataEntry { return this.starterDataEntryBeforeUpdate; } /** - * Update the pokedex data corresponding with the new hatch's pokemon data - * Also sets whether the egg move is a new unlock or not - * @param showMessage boolean to show messages for the new catches and egg moves (false by default) - * @returns - */ - updatePokemon(showMessage : boolean = false) { + * Update the pokedex data corresponding with the new hatch's pokemon data + * Also sets whether the egg move is a new unlock or not + * @param showMessage boolean to show messages for the new catches and egg moves (false by default) + * @returns + */ + updatePokemon(showMessage = false) { return new Promise(resolve => { globalScene.gameData.setPokemonCaught(this.pokemon, true, true, showMessage).then(() => { globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); - globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex, showMessage).then((value) => { + globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex, showMessage).then(value => { this.setEggMoveUnlocked(value); resolve(); }); diff --git a/src/data/egg.ts b/src/data/egg.ts index 380b5ddabfe..0dabf8f1119 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -12,7 +12,31 @@ import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; import { EggSourceType } from "#enums/egg-source-types"; -import { MANAPHY_EGG_MANAPHY_RATE, SAME_SPECIES_EGG_HA_RATE, GACHA_EGG_HA_RATE, GACHA_DEFAULT_RARE_EGGMOVE_RATE, SAME_SPECIES_EGG_RARE_EGGMOVE_RATE, GACHA_MOVE_UP_RARE_EGGMOVE_RATE, GACHA_DEFAULT_SHINY_RATE, GACHA_SHINY_UP_SHINY_RATE, SAME_SPECIES_EGG_SHINY_RATE, EGG_PITY_LEGENDARY_THRESHOLD, EGG_PITY_EPIC_THRESHOLD, EGG_PITY_RARE_THRESHOLD, SHINY_VARIANT_CHANCE, SHINY_EPIC_CHANCE, GACHA_DEFAULT_COMMON_EGG_THRESHOLD, GACHA_DEFAULT_RARE_EGG_THRESHOLD, GACHA_DEFAULT_EPIC_EGG_THRESHOLD, GACHA_LEGENDARY_UP_THRESHOLD_OFFSET, HATCH_WAVES_MANAPHY_EGG, HATCH_WAVES_COMMON_EGG, HATCH_WAVES_RARE_EGG, HATCH_WAVES_EPIC_EGG, HATCH_WAVES_LEGENDARY_EGG } from "#app/data/balance/rates"; +import { + MANAPHY_EGG_MANAPHY_RATE, + SAME_SPECIES_EGG_HA_RATE, + GACHA_EGG_HA_RATE, + GACHA_DEFAULT_RARE_EGGMOVE_RATE, + SAME_SPECIES_EGG_RARE_EGGMOVE_RATE, + GACHA_MOVE_UP_RARE_EGGMOVE_RATE, + GACHA_DEFAULT_SHINY_RATE, + GACHA_SHINY_UP_SHINY_RATE, + SAME_SPECIES_EGG_SHINY_RATE, + EGG_PITY_LEGENDARY_THRESHOLD, + EGG_PITY_EPIC_THRESHOLD, + EGG_PITY_RARE_THRESHOLD, + SHINY_VARIANT_CHANCE, + SHINY_EPIC_CHANCE, + GACHA_DEFAULT_COMMON_EGG_THRESHOLD, + GACHA_DEFAULT_RARE_EGG_THRESHOLD, + GACHA_DEFAULT_EPIC_EGG_THRESHOLD, + GACHA_LEGENDARY_UP_THRESHOLD_OFFSET, + HATCH_WAVES_MANAPHY_EGG, + HATCH_WAVES_COMMON_EGG, + HATCH_WAVES_RARE_EGG, + HATCH_WAVES_EPIC_EGG, + HATCH_WAVES_LEGENDARY_EGG, +} from "#app/data/balance/rates"; import { speciesEggTiers } from "#app/data/balance/species-egg-tiers"; export const EGG_SEED = 1073741824; @@ -60,7 +84,6 @@ export interface IEggOptions { } export class Egg { - //// // #region Private properties //// @@ -141,7 +164,7 @@ export class Egg { this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct? // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced - this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); + this._tier = eggOptions?.tier ?? Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier(); // If egg was pulled, check if egg pity needs to override the egg tier if (eggOptions?.pulled) { // Needs this._tier and this._sourceType to work @@ -156,7 +179,7 @@ export class Egg { // First roll shiny and variant so we can filter if species with an variant exist this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); - this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); + this._variantTier = eggOptions?.variantTier ?? Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant(); this._species = eggOptions?.species ?? this.rollSpecies()!; // TODO: Is this bang correct? this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false; @@ -181,9 +204,13 @@ export class Egg { }; const seedOverride = Utils.randomString(24); - globalScene.executeWithSeedOffset(() => { - generateEggProperties(eggOptions); - }, 0, seedOverride); + globalScene.executeWithSeedOffset( + () => { + generateEggProperties(eggOptions); + }, + 0, + seedOverride, + ); this._eggDescriptor = eggOptions?.eggDescriptor; } @@ -193,8 +220,11 @@ export class Egg { //// public isManaphyEgg(): boolean { - return (this._species === Species.PHIONE || this._species === Species.MANAPHY) || - this._tier === EggTier.COMMON && !(this._id % 204) && !this._species; + return ( + this._species === Species.PHIONE || + this._species === Species.MANAPHY || + (this._tier === EggTier.COMMON && !(this._id % 204) && !this._species) + ); } public getKey(): string { @@ -218,14 +248,18 @@ export class Egg { let pokemonSpecies = getPokemonSpecies(this._species); // Special condition to have Phione eggs also have a chance of generating Manaphy if (this._species === Species.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) { - pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); + pokemonSpecies = getPokemonSpecies( + Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY, + ); } // Sets the hidden ability if a hidden ability exists and // the override is set or the egg hits the chance let abilityIndex: number | undefined = undefined; - const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)); - const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE)); + const sameSpeciesEggHACheck = + this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE); + const gachaEggHACheck = + !(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE); if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) { abilityIndex = 2; } @@ -242,10 +276,14 @@ export class Egg { } }; - ret = ret!; // Tell TS compiler it's defined now - globalScene.executeWithSeedOffset(() => { - generatePlayerPokemonHelper(); - }, this._id, EGG_SEED.toString()); + ret = ret!; // Tell TS compiler it's defined now + globalScene.executeWithSeedOffset( + () => { + generatePlayerPokemonHelper(); + }, + this._id, + EGG_SEED.toString(), + ); return ret; } @@ -287,9 +325,17 @@ export class Egg { public getEggTypeDescriptor(): string { switch (this.sourceType) { case EggSourceType.SAME_SPECIES_EGG: - return this._eggDescriptor ?? i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName() }); + return ( + this._eggDescriptor ?? + i18next.t("egg:sameSpeciesEgg", { + species: getPokemonSpecies(this._species).getName(), + }) + ); case EggSourceType.GACHA_LEGENDARY: - return this._eggDescriptor ?? `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.timestamp)).getName()})`; + return ( + this._eggDescriptor ?? + `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.timestamp)).getName()})` + ); case EggSourceType.GACHA_SHINY: return this._eggDescriptor ?? i18next.t("egg:gachaTypeShiny"); case EggSourceType.GACHA_MOVE: @@ -344,9 +390,16 @@ export class Egg { } private rollEggTier(): EggTier { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; + const tierValueOffset = + this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; const tierValue = Utils.randInt(256); - return tierValue >= GACHA_DEFAULT_COMMON_EGG_THRESHOLD + tierValueOffset ? EggTier.COMMON : tierValue >= GACHA_DEFAULT_RARE_EGG_THRESHOLD + tierValueOffset ? EggTier.RARE : tierValue >= GACHA_DEFAULT_EPIC_EGG_THRESHOLD + tierValueOffset ? EggTier.EPIC : EggTier.LEGENDARY; + return tierValue >= GACHA_DEFAULT_COMMON_EGG_THRESHOLD + tierValueOffset + ? EggTier.COMMON + : tierValue >= GACHA_DEFAULT_RARE_EGG_THRESHOLD + tierValueOffset + ? EggTier.RARE + : tierValue >= GACHA_DEFAULT_EPIC_EGG_THRESHOLD + tierValueOffset + ? EggTier.EPIC + : EggTier.LEGENDARY; } private rollSpecies(): Species | null { @@ -364,10 +417,10 @@ export class Egg { * when Utils.randSeedInt(8) = 1, and by making the generatePlayerPokemon() species * check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests. */ - const rand = (Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1); + const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1; return rand ? Species.PHIONE : Species.MANAPHY; - } else if (this.tier === EggTier.LEGENDARY - && this._sourceType === EggSourceType.GACHA_LEGENDARY) { + } + if (this.tier === EggTier.LEGENDARY && this._sourceType === EggSourceType.GACHA_LEGENDARY) { if (!Utils.randSeedInt(2)) { return getLegendaryGachaSpeciesForTimestamp(this.timestamp); } @@ -395,17 +448,25 @@ export class Egg { break; } - const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; + const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; let speciesPool = Object.keys(speciesEggTiers) .filter(s => speciesEggTiers[s] === this.tier) - .map(s => parseInt(s) as Species) - .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); + .map(s => Number.parseInt(s) as Species) + .filter( + s => + !pokemonPrevolutions.hasOwnProperty(s) && + getPokemonSpecies(s).isObtainable() && + ignoredSpecies.indexOf(s) === -1, + ); // If this is the 10th egg without unlocking something new, attempt to force it. if (globalScene.gameData.unlockPity[this.tier] >= 9) { - const lockedPool = speciesPool.filter(s => !globalScene.gameData.dexData[s].caughtAttr && !globalScene.gameData.eggs.some(e => e.species === s)); - if (lockedPool.length) { // Skip this if everything is unlocked + const lockedPool = speciesPool.filter( + s => !globalScene.gameData.dexData[s].caughtAttr && !globalScene.gameData.eggs.some(e => e.species === s), + ); + if (lockedPool.length) { + // Skip this if everything is unlocked speciesPool = lockedPool; } } @@ -427,11 +488,13 @@ export class Egg { * and being the same each time */ let totalWeight = 0; - const speciesWeights : number[] = []; + const speciesWeights: number[] = []; for (const speciesId of speciesPool) { // Accounts for species that have starter costs outside of the normal range for their EggTier const speciesCostClamped = Phaser.Math.Clamp(speciesStarterCosts[speciesId], minStarterValue, maxStarterValue); - const weight = Math.floor((((maxStarterValue - speciesCostClamped) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); + const weight = Math.floor( + (((maxStarterValue - speciesCostClamped) / (maxStarterValue - minStarterValue + 1)) * 1.5 + 1) * 100, + ); speciesWeights.push(totalWeight + weight); totalWeight += weight; } @@ -447,7 +510,10 @@ export class Egg { } species = species!; // tell TS compiled it's defined now! - if (globalScene.gameData.dexData[species].caughtAttr || globalScene.gameData.eggs.some(e => e.species === species)) { + if ( + globalScene.gameData.dexData[species].caughtAttr || + globalScene.gameData.eggs.some(e => e.species === species) + ) { globalScene.gameData.unlockPity[this.tier] = Math.min(globalScene.gameData.unlockPity[this.tier] + 1, 10); } else { globalScene.gameData.unlockPity[this.tier] = 0; @@ -457,9 +523,9 @@ export class Egg { } /** - * Rolls whether the egg is shiny or not. - * @returns `true` if the egg is shiny - **/ + * Rolls whether the egg is shiny or not. + * @returns `true` if the egg is shiny + **/ private rollShiny(): boolean { let shinyChance = GACHA_DEFAULT_SHINY_RATE; switch (this._sourceType) { @@ -487,20 +553,24 @@ export class Egg { const rand = Utils.randSeedInt(10); if (rand >= SHINY_VARIANT_CHANCE) { return VariantTier.STANDARD; // 6/10 - } else if (rand >= SHINY_EPIC_CHANCE) { - return VariantTier.RARE; // 3/10 - } else { - return VariantTier.EPIC; // 1/10 } + if (rand >= SHINY_EPIC_CHANCE) { + return VariantTier.RARE; // 3/10 + } + return VariantTier.EPIC; // 1/10 } private checkForPityTierOverrides(): void { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; + const tierValueOffset = + this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; globalScene.gameData.eggPity[EggTier.RARE] += 1; globalScene.gameData.eggPity[EggTier.EPIC] += 1; globalScene.gameData.eggPity[EggTier.LEGENDARY] += 1 + tierValueOffset; // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (globalScene.gameData.eggPity[EggTier.LEGENDARY] >= EGG_PITY_LEGENDARY_THRESHOLD && this._tier === EggTier.COMMON) { + if ( + globalScene.gameData.eggPity[EggTier.LEGENDARY] >= EGG_PITY_LEGENDARY_THRESHOLD && + this._tier === EggTier.COMMON + ) { this._tier = EggTier.LEGENDARY; } else if (globalScene.gameData.eggPity[EggTier.EPIC] >= EGG_PITY_EPIC_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.EPIC; @@ -539,10 +609,10 @@ export class Egg { //// } -export function getValidLegendaryGachaSpecies() : Species[] { +export function getValidLegendaryGachaSpecies(): Species[] { return Object.entries(speciesEggTiers) .filter(s => s[1] === EggTier.LEGENDARY) - .map(s => parseInt(s[0])) + .map(s => Number.parseInt(s[0])) .filter(s => getPokemonSpecies(s).isObtainable() && s !== Species.ETERNATUS); } @@ -557,9 +627,13 @@ export function getLegendaryGachaSpeciesForTimestamp(timestamp: number): Species const offset = Math.floor(Math.floor(dayTimestamp / 86400000) / legendarySpecies.length); // Cycle number const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length; // Index within cycle - globalScene.executeWithSeedOffset(() => { - ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; - }, offset, EGG_SEED.toString()); + globalScene.executeWithSeedOffset( + () => { + ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; + }, + offset, + EGG_SEED.toString(), + ); ret = ret!; // tell TS compiler it's return ret; @@ -570,6 +644,6 @@ export function getLegendaryGachaSpeciesForTimestamp(timestamp: number): Species * @param pokemonSpecies - Species for wich we will check the egg tier it belongs to * @returns The egg tier of a given pokemon species */ -export function getEggTierForSpecies(pokemonSpecies :PokemonSpecies): EggTier { +export function getEggTierForSpecies(pokemonSpecies: PokemonSpecies): EggTier { return speciesEggTiers[pokemonSpecies.getRootSpeciesId()]; } diff --git a/src/data/exp.ts b/src/data/exp.ts index 0f5d3e62cef..9f8ccce6d88 100644 --- a/src/data/exp.ts +++ b/src/data/exp.ts @@ -4,16 +4,64 @@ export enum GrowthRate { MEDIUM_FAST, MEDIUM_SLOW, SLOW, - FLUCTUATING + FLUCTUATING, } const expLevels = [ - [ 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, 548720, 560922, 571333, 583539, 591882, 600000 ], - [ 0, 6, 21, 51, 100, 172, 274, 409, 583, 800, 1064, 1382, 1757, 2195, 2700, 3276, 3930, 4665, 5487, 6400, 7408, 8518, 9733, 11059, 12500, 14060, 15746, 17561, 19511, 21600, 23832, 26214, 28749, 31443, 34300, 37324, 40522, 43897, 47455, 51200, 55136, 59270, 63605, 68147, 72900, 77868, 83058, 88473, 94119, 100000, 106120, 112486, 119101, 125971, 133100, 140492, 148154, 156089, 164303, 172800, 181584, 190662, 200037, 209715, 219700, 229996, 240610, 251545, 262807, 274400, 286328, 298598, 311213, 324179, 337500, 351180, 365226, 379641, 394431, 409600, 425152, 441094, 457429, 474163, 491300, 508844, 526802, 545177, 563975, 583200, 602856, 622950, 643485, 664467, 685900, 707788, 730138, 752953, 776239, 800000 ], - [ 0, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, 857375, 884736, 912673, 941192, 970299, 1000000 ], - [ 0, 9, 57, 96, 135, 179, 236, 314, 419, 560, 742, 973, 1261, 1612, 2035, 2535, 3120, 3798, 4575, 5460, 6458, 7577, 8825, 10208, 11735, 13411, 15244, 17242, 19411, 21760, 24294, 27021, 29949, 33084, 36435, 40007, 43808, 47846, 52127, 56660, 61450, 66505, 71833, 77440, 83335, 89523, 96012, 102810, 109923, 117360, 125126, 133229, 141677, 150476, 159635, 169159, 179056, 189334, 199999, 211060, 222522, 234393, 246681, 259392, 272535, 286115, 300140, 314618, 329555, 344960, 360838, 377197, 394045, 411388, 429235, 447591, 466464, 485862, 505791, 526260, 547274, 568841, 590969, 613664, 636935, 660787, 685228, 710266, 735907, 762160, 789030, 816525, 844653, 873420, 902835, 932903, 963632, 995030, 1027103, 1059860 ], - [ 0, 10, 33, 80, 156, 270, 428, 640, 911, 1250, 1663, 2160, 2746, 3430, 4218, 5120, 6141, 7290, 8573, 10000, 11576, 13310, 15208, 17280, 19531, 21970, 24603, 27440, 30486, 33750, 37238, 40960, 44921, 49130, 53593, 58320, 63316, 68590, 74148, 80000, 86151, 92610, 99383, 106480, 113906, 121670, 129778, 138240, 147061, 156250, 165813, 175760, 186096, 196830, 207968, 219520, 231491, 243890, 256723, 270000, 283726, 297910, 312558, 327680, 343281, 359370, 375953, 393040, 410636, 428750, 447388, 466560, 486271, 506530, 527343, 548720, 570666, 593190, 616298, 640000, 664301, 689210, 714733, 740880, 767656, 795070, 823128, 851840, 881211, 911250, 941963, 973360, 1005446, 1038230, 1071718, 1105920, 1140841, 1176490, 1212873, 1250000 ], - [ 0, 4, 13, 32, 65, 112, 178, 276, 393, 540, 745, 967, 1230, 1591, 1957, 2457, 3046, 3732, 4526, 5440, 6482, 7666, 9003, 10506, 12187, 14060, 16140, 18439, 20974, 23760, 26811, 30146, 33780, 37731, 42017, 46656, 50653, 55969, 60505, 66560, 71677, 78533, 84277, 91998, 98415, 107069, 114205, 123863, 131766, 142500, 151222, 163105, 172697, 185807, 196322, 210739, 222231, 238036, 250562, 267840, 281456, 300293, 315059, 335544, 351520, 373744, 390991, 415050, 433631, 459620, 479600, 507617, 529063, 559209, 582187, 614566, 639146, 673863, 700115, 737280, 765275, 804997, 834809, 877201, 908905, 954084, 987754, 1035837, 1071552, 1122660, 1160499, 1214753, 1254796, 1312322, 1354652, 1415577, 1460276, 1524731, 1571884, 1640000 ] + [ + 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, + 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, + 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, + 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, + 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, + 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, + 548720, 560922, 571333, 583539, 591882, 600000, + ], + [ + 0, 6, 21, 51, 100, 172, 274, 409, 583, 800, 1064, 1382, 1757, 2195, 2700, 3276, 3930, 4665, 5487, 6400, 7408, 8518, + 9733, 11059, 12500, 14060, 15746, 17561, 19511, 21600, 23832, 26214, 28749, 31443, 34300, 37324, 40522, 43897, + 47455, 51200, 55136, 59270, 63605, 68147, 72900, 77868, 83058, 88473, 94119, 100000, 106120, 112486, 119101, 125971, + 133100, 140492, 148154, 156089, 164303, 172800, 181584, 190662, 200037, 209715, 219700, 229996, 240610, 251545, + 262807, 274400, 286328, 298598, 311213, 324179, 337500, 351180, 365226, 379641, 394431, 409600, 425152, 441094, + 457429, 474163, 491300, 508844, 526802, 545177, 563975, 583200, 602856, 622950, 643485, 664467, 685900, 707788, + 730138, 752953, 776239, 800000, + ], + [ + 0, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, + 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, + 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, + 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, + 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, + 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, + 857375, 884736, 912673, 941192, 970299, 1000000, + ], + [ + 0, 9, 57, 96, 135, 179, 236, 314, 419, 560, 742, 973, 1261, 1612, 2035, 2535, 3120, 3798, 4575, 5460, 6458, 7577, + 8825, 10208, 11735, 13411, 15244, 17242, 19411, 21760, 24294, 27021, 29949, 33084, 36435, 40007, 43808, 47846, + 52127, 56660, 61450, 66505, 71833, 77440, 83335, 89523, 96012, 102810, 109923, 117360, 125126, 133229, 141677, + 150476, 159635, 169159, 179056, 189334, 199999, 211060, 222522, 234393, 246681, 259392, 272535, 286115, 300140, + 314618, 329555, 344960, 360838, 377197, 394045, 411388, 429235, 447591, 466464, 485862, 505791, 526260, 547274, + 568841, 590969, 613664, 636935, 660787, 685228, 710266, 735907, 762160, 789030, 816525, 844653, 873420, 902835, + 932903, 963632, 995030, 1027103, 1059860, + ], + [ + 0, 10, 33, 80, 156, 270, 428, 640, 911, 1250, 1663, 2160, 2746, 3430, 4218, 5120, 6141, 7290, 8573, 10000, 11576, + 13310, 15208, 17280, 19531, 21970, 24603, 27440, 30486, 33750, 37238, 40960, 44921, 49130, 53593, 58320, 63316, + 68590, 74148, 80000, 86151, 92610, 99383, 106480, 113906, 121670, 129778, 138240, 147061, 156250, 165813, 175760, + 186096, 196830, 207968, 219520, 231491, 243890, 256723, 270000, 283726, 297910, 312558, 327680, 343281, 359370, + 375953, 393040, 410636, 428750, 447388, 466560, 486271, 506530, 527343, 548720, 570666, 593190, 616298, 640000, + 664301, 689210, 714733, 740880, 767656, 795070, 823128, 851840, 881211, 911250, 941963, 973360, 1005446, 1038230, + 1071718, 1105920, 1140841, 1176490, 1212873, 1250000, + ], + [ + 0, 4, 13, 32, 65, 112, 178, 276, 393, 540, 745, 967, 1230, 1591, 1957, 2457, 3046, 3732, 4526, 5440, 6482, 7666, + 9003, 10506, 12187, 14060, 16140, 18439, 20974, 23760, 26811, 30146, 33780, 37731, 42017, 46656, 50653, 55969, + 60505, 66560, 71677, 78533, 84277, 91998, 98415, 107069, 114205, 123863, 131766, 142500, 151222, 163105, 172697, + 185807, 196322, 210739, 222231, 238036, 250562, 267840, 281456, 300293, 315059, 335544, 351520, 373744, 390991, + 415050, 433631, 459620, 479600, 507617, 529063, 559209, 582187, 614566, 639146, 673863, 700115, 737280, 765275, + 804997, 834809, 877201, 908905, 954084, 987754, 1035837, 1071552, 1122660, 1160499, 1214753, 1254796, 1312322, + 1354652, 1415577, 1460276, 1524731, 1571884, 1640000, + ], ]; export function getLevelTotalExp(level: number, growthRate: GrowthRate): number { @@ -29,22 +77,22 @@ export function getLevelTotalExp(level: number, growthRate: GrowthRate): number switch (growthRate) { case GrowthRate.ERRATIC: - ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; + ret = (Math.pow(level, 4) + Math.pow(level, 3) * 2000) / 3500; break; case GrowthRate.FAST: - ret = Math.pow(level, 3) * 4 / 5; + ret = (Math.pow(level, 3) * 4) / 5; break; case GrowthRate.MEDIUM_FAST: ret = Math.pow(level, 3); break; case GrowthRate.MEDIUM_SLOW: - ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; + ret = (Math.pow(level, 3) * 6) / 5 - 15 * Math.pow(level, 2) + 100 * level - 140; break; case GrowthRate.SLOW: - ret = Math.pow(level, 3) * 5 / 4; + ret = (Math.pow(level, 3) * 5) / 4; break; case GrowthRate.FLUCTUATING: - ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); + ret = (Math.pow(level, 3) * (level / 2 + 8) * 4) / (100 + level); break; } diff --git a/src/data/gender.ts b/src/data/gender.ts index dae7723dd85..5a835c2e786 100644 --- a/src/data/gender.ts +++ b/src/data/gender.ts @@ -1,7 +1,7 @@ export enum Gender { - GENDERLESS = -1, - MALE, - FEMALE + GENDERLESS = -1, + MALE, + FEMALE, } export function getGenderSymbol(gender: Gender) { 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 407644ee939..6cea85346b3 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -1,7 +1,12 @@ import { globalScene } from "#app/global-scene"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, } from "#app/data/trainer-config"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; @@ -27,161 +32,172 @@ const namespace = "mysteryEncounters/aTrainersTest"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3816 | GitHub Issue #3816} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ATrainersTestEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.A_TRAINERS_TEST) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ +export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.A_TRAINERS_TEST, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withAutoHideIntroVisuals(false) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Randomly pick from 1 of the 5 stat trainers to spawn + let trainerType: TrainerType; + let spriteKeys: { spriteKey: any; fileRoot: any }; + let trainerNameKey: string; + switch (randSeedInt(5)) { + case 1: + trainerType = TrainerType.CHERYL; + spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); + trainerNameKey = "cheryl"; + break; + case 2: + trainerType = TrainerType.MARLEY; + spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); + trainerNameKey = "marley"; + break; + case 3: + trainerType = TrainerType.MIRA; + spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); + trainerNameKey = "mira"; + break; + case 4: + trainerType = TrainerType.RILEY; + spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); + trainerNameKey = "riley"; + break; + default: + trainerType = TrainerType.BUCK; + spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); + trainerNameKey = "buck"; + break; + } + + // Dialogue and tokens for trainer + encounter.dialogue.intro = [ { - text: `${namespace}:intro`, + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.intro_dialogue`, }, - ]) - .withAutoHideIntroVisuals(false) - .withOnInit(() => { + ]; + encounter.options[0].dialogue!.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.accept`, + }, + ]; + encounter.options[1].dialogue!.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.decline`, + }, + ]; + + encounter.setDialogueToken("statTrainerName", i18next.t(`trainerNames:${trainerNameKey}`)); + const eggDescription = `${i18next.t(`${namespace}:title`)}:\n${i18next.t(`trainerNames:${trainerNameKey}`)}`; + encounter.misc = { + trainerType, + trainerNameKey, + trainerEggDescription: eggDescription, + }; + + // Trainer config + const trainerConfig = trainerConfigs[trainerType].clone(); + const trainerSpriteKey = trainerConfig.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + levelAdditiveModifier: 1, + trainerConfig: trainerConfig, + }); + + encounter.spriteConfigs = [ + { + spriteKey: spriteKeys.spriteKey, + fileRoot: spriteKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: 22, + y: -2, + yShadow: -2, + }, + { + spriteKey: trainerSpriteKey, + fileRoot: "trainer", + hasShadow: true, + disableAnimation: true, + x: -24, + y: 4, + yShadow: 4, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withIntroDialogue() + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + }, + async () => { const encounter = globalScene.currentBattle.mysteryEncounter!; + // Battle the stat trainer for an Egg and great rewards + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Randomly pick from 1 of the 5 stat trainers to spawn - let trainerType: TrainerType; - let spriteKeys; - let trainerNameKey: string; - switch (randSeedInt(5)) { - default: - case 0: - trainerType = TrainerType.BUCK; - spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); - trainerNameKey = "buck"; - break; - case 1: - trainerType = TrainerType.CHERYL; - spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); - trainerNameKey = "cheryl"; - break; - case 2: - trainerType = TrainerType.MARLEY; - spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); - trainerNameKey = "marley"; - break; - case 3: - trainerType = TrainerType.MIRA; - spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); - trainerNameKey = "mira"; - break; - case 4: - trainerType = TrainerType.RILEY; - spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); - trainerNameKey = "riley"; - break; - } + await transitionMysteryEncounterIntroVisuals(); - // Dialogue and tokens for trainer - encounter.dialogue.intro = [ + const eggOptions: IEggOptions = { + pulled: false, + sourceType: EggSourceType.EVENT, + eggDescriptor: encounter.misc.trainerEggDescription, + tier: EggTier.EPIC, + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.epic`)); + setEncounterRewards( { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.intro_dialogue` - } - ]; - encounter.options[0].dialogue!.selected = [ - { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.accept` - } - ]; - encounter.options[1].dialogue!.selected = [ - { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.decline` - } - ]; - - encounter.setDialogueToken("statTrainerName", i18next.t(`trainerNames:${trainerNameKey}`)); - const eggDescription = i18next.t(`${namespace}:title`) + ":\n" + i18next.t(`trainerNames:${trainerNameKey}`); - encounter.misc = { trainerType, trainerNameKey, trainerEggDescription: eggDescription }; - - // Trainer config - const trainerConfig = trainerConfigs[trainerType].clone(); - const trainerSpriteKey = trainerConfig.getSpriteKey(); - encounter.enemyPartyConfigs.push({ - levelAdditiveModifier: 1, - trainerConfig: trainerConfig - }); - - encounter.spriteConfigs = [ - { - spriteKey: spriteKeys.spriteKey, - fileRoot: spriteKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: 22, - y: -2, - yShadow: -2 + guaranteedModifierTypeFuncs: [modifierTypes.SACRED_ASH], + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA], + fillRemaining: true, }, - { - spriteKey: trainerSpriteKey, - fileRoot: "trainer", - hasShadow: true, - disableAnimation: true, - x: -24, - y: 4, - yShadow: 4 - } - ]; + [eggOptions], + ); + await initBattleWithEnemyConfig(config); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Full heal party + globalScene.unshiftPhase(new PartyHealPhase(true)); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withIntroDialogue() - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip` - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Battle the stat trainer for an Egg and great rewards - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - await transitionMysteryEncounterIntroVisuals(); - - const eggOptions: IEggOptions = { - pulled: false, - sourceType: EggSourceType.EVENT, - eggDescriptor: encounter.misc.trainerEggDescription, - tier: EggTier.EPIC - }; - encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.epic`)); - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.SACRED_ASH ], guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ULTRA ], fillRemaining: true }, [ eggOptions ]); - await initBattleWithEnemyConfig(config); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Full heal party - globalScene.unshiftPhase(new PartyHealPhase(true)); - - const eggOptions: IEggOptions = { - pulled: false, - sourceType: EggSourceType.EVENT, - eggDescriptor: encounter.misc.trainerEggDescription, - tier: EggTier.RARE - }; - encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.rare`)); - setEncounterRewards({ fillRemaining: false, rerollMultiplier: -1 }, [ eggOptions ]); - leaveEncounterWithoutBattle(); - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro` - } - ]) - .build(); + const eggOptions: IEggOptions = { + pulled: false, + sourceType: EggSourceType.EVENT, + eggDescriptor: encounter.misc.trainerEggDescription, + tier: EggTier.RARE, + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.rare`)); + setEncounterRewards({ fillRemaining: false, rerollMultiplier: -1 }, [eggOptions]); + leaveEncounterWithoutBattle(); + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 1499d953941..ca44782691d 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -1,5 +1,11 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type Pokemon from "#app/field/pokemon"; import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; import type { BerryModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; @@ -20,7 +26,11 @@ import { Moves } from "#enums/moves"; import { BattlerTagType } from "#enums/battler-tag-type"; import { randInt } from "#app/utils"; import { BattlerIndex } from "#app/battle"; -import { applyModifierTypeToPlayerPokemon, catchPokemon, getHighestLevelPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyModifierTypeToPlayerPokemon, + catchPokemon, + getHighestLevelPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { TrainerSlot } from "#app/data/trainer-config"; import { PokeballType } from "#enums/pokeball"; import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; @@ -38,339 +48,348 @@ const namespace = "mysteryEncounters/absoluteAvarice"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3805 | GitHub Issue #3805} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AbsoluteAvariceEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.ABSOLUTE_AVARICE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - // This sprite has the shadow - spriteKey: "", - fileRoot: "", - species: Species.GREEDENT, - hasShadow: true, - alpha: 0.001, - repeat: true, - x: -5 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.GREEDENT, - hasShadow: false, - repeat: true, - x: -5 - }, - { - spriteKey: "lum_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: -14, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "salac_berry", - fileRoot: "items", - isItem: true, - x: 2, - y: 4, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "lansat_berry", - fileRoot: "items", - isItem: true, - x: 32, - y: 5, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "liechi_berry", - fileRoot: "items", - isItem: true, - x: 6, - y: -5, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "sitrus_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: 8, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "enigma_berry", - fileRoot: "items", - isItem: true, - x: 26, - y: -4, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "leppa_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -27, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "petaya_berry", - fileRoot: "items", - isItem: true, - x: 30, - y: -17, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "ganlon_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -11, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "apicot_berry", - fileRoot: "items", - isItem: true, - x: 14, - y: -2, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "starf_berry", - fileRoot: "items", - isItem: true, - x: 18, - y: 9, - hidden: true, - disableAnimation: true - }, - ]) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, +export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.ABSOLUTE_AVARICE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + // This sprite has the shadow + spriteKey: "", + fileRoot: "", + species: Species.GREEDENT, + hasShadow: true, + alpha: 0.001, + repeat: true, + x: -5, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.GREEDENT, + hasShadow: false, + repeat: true, + x: -5, + }, + { + spriteKey: "lum_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: -14, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "salac_berry", + fileRoot: "items", + isItem: true, + x: 2, + y: 4, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "lansat_berry", + fileRoot: "items", + isItem: true, + x: 32, + y: 5, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "liechi_berry", + fileRoot: "items", + isItem: true, + x: 6, + y: -5, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "sitrus_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: 8, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "enigma_berry", + fileRoot: "items", + isItem: true, + x: 26, + y: -4, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "leppa_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -27, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "petaya_berry", + fileRoot: "items", + isItem: true, + x: 30, + y: -17, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "ganlon_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -11, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "apicot_berry", + fileRoot: "items", + isItem: true, + x: 14, + y: -2, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "starf_berry", + fileRoot: "items", + isItem: true, + x: 18, + y: 9, + hidden: true, + disableAnimation: true, + }, + ]) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + globalScene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); + globalScene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); + + // Get all player berry items, remove from party, and store reference + const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + + // Sort berries by party member ID to more easily re-add later if necessary + const berryItemsMap = new Map(); + globalScene.getPlayerParty().forEach(pokemon => { + const pokemonBerries = berryItems.filter(b => b.pokemonId === pokemon.id); + if (pokemonBerries?.length > 0) { + berryItemsMap.set(pokemon.id, pokemonBerries); } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; + }); - globalScene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); - globalScene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); + encounter.misc = { berryItemsMap }; - // Get all player berry items, remove from party, and store reference - const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + // Generates copies of the stolen berries to put on the Greedent + const bossModifierConfigs: HeldModifierConfig[] = []; + berryItems.forEach(berryMod => { + // Can't define stack count on a ModifierType, have to just create separate instances for each stack + // Overflow berries will be "lost" on the boss, but it's un-catchable anyway + for (let i = 0; i < berryMod.stackCount; i++) { + const modifierType = generateModifierType(modifierTypes.BERRY, [ + berryMod.berryType, + ]) as PokemonHeldItemModifierType; + bossModifierConfigs.push({ modifier: modifierType }); + } + }); - // Sort berries by party member ID to more easily re-add later if necessary - const berryItemsMap = new Map(); - globalScene.getPlayerParty().forEach(pokemon => { - const pokemonBerries = berryItems.filter(b => b.pokemonId === pokemon.id); - if (pokemonBerries?.length > 0) { - berryItemsMap.set(pokemon.id, pokemonBerries); - } - }); + // Do NOT remove the real berries yet or else it will be persisted in the session data - encounter.misc = { berryItemsMap }; + // SpDef buff below wave 50, +1 to all stats otherwise + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 ? [Stat.SPDEF] : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; - // Generates copies of the stolen berries to put on the Greedent - const bossModifierConfigs: HeldModifierConfig[] = []; - berryItems.forEach(berryMod => { - // Can't define stack count on a ModifierType, have to just create separate instances for each stack - // Overflow berries will be "lost" on the boss, but it's un-catchable anyway - for (let i = 0; i < berryMod.stackCount; i++) { - const modifierType = generateModifierType(modifierTypes.BERRY, [ berryMod.berryType ]) as PokemonHeldItemModifierType; - bossModifierConfigs.push({ modifier: modifierType }); - } - }); + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 1, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.GREEDENT), + isBoss: true, + bossSegments: 3, + shiny: false, // Shiny lock because of consistency issues between the different options + moveSet: [Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH], + modifierConfigs: bossModifierConfigs, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.1.boss_enraged`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }, + }, + ], + }; - // Do NOT remove the real berries yet or else it will be persisted in the session data + encounter.enemyPartyConfigs = [config]; + encounter.setDialogueToken("greedentName", getPokemonSpecies(Species.GREEDENT).getName()); - // SpDef buff below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = globalScene.currentBattle.waveIndex < 50 ? - [ Stat.SPDEF ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + return true; + }) + .withOnVisualsStart(() => { + doGreedentSpriteSteal(); + doBerrySpritePile(); - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 1, - pokemonConfigs: [ + // Remove the berries from the party + // Session has been safely saved at this point, so data won't be lost + const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + berryItems.forEach(berryMod => { + globalScene.removeModifier(berryMod); + }); + + globalScene.updateModifiers(true); + + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ { - species: getPokemonSpecies(Species.GREEDENT), - isBoss: true, - bossSegments: 3, - shiny: false, // Shiny lock because of consistency issues between the different options - moveSet: [ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH ], - modifierConfigs: bossModifierConfigs, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(`${namespace}:option.1.boss_enraged`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Provides 1x Reviver Seed to each party member at end of battle + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED); + encounter.setDialogueToken( + "foodReward", + revSeed?.name ?? i18next.t("modifierType:ModifierType.REVIVER_SEED.name"), + ); + const givePartyPokemonReviverSeeds = () => { + const party = globalScene.getPlayerParty(); + party.forEach(p => { + const heldItems = p.getHeldItems(); + if (revSeed && !heldItems.some(item => item instanceof PokemonInstantReviveModifier)) { + const seedModifier = revSeed.newModifier(p); + globalScene.addModifier(seedModifier, false, false, false, true); + } + }); + queueEncounterMessage(`${namespace}:option.1.food_stash`); + }; + + setEncounterRewards({ fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.STUFF_CHEEKS), + ignorePp: true, + }); + + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const berryMap = encounter.misc.berryItemsMap; + + // Returns 2/5 of the berries stolen to each Pokemon + const party = globalScene.getPlayerParty(); + party.forEach(pokemon => { + const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); + const berryTypesAsArray: BerryType[] = []; + stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); + const returnedBerryCount = Math.floor(((berryTypesAsArray.length ?? 0) * 2) / 5); + + if (returnedBerryCount > 0) { + for (let i = 0; i < returnedBerryCount; i++) { + // Shuffle remaining berry types and pop + Phaser.Math.RND.shuffle(berryTypesAsArray); + const randBerryType = berryTypesAsArray.pop(); + + const berryModType = generateModifierType(modifierTypes.BERRY, [randBerryType]) as BerryModifierType; + applyModifierTypeToPlayerPokemon(pokemon, berryModType); } } + }); + await globalScene.updateModifiers(true); + + await transitionMysteryEncounterIntroVisuals(true, true, 500); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, ], - }; + }) + .withPreOptionPhase(async () => { + // Animate berries being eaten + doGreedentEatBerries(); + doBerrySpritePile(true); + return true; + }) + .withOptionPhase(async () => { + // Let it have the food + // Greedent joins the team, level equal to 2 below highest party member (shiny locked) + const level = getHighestLevelPlayerPokemon(false, true).level - 2; + const greedent = new EnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, true); + greedent.moveset = [ + new PokemonMove(Moves.THRASH), + new PokemonMove(Moves.BODY_PRESS), + new PokemonMove(Moves.STUFF_CHEEKS), + new PokemonMove(Moves.SLACK_OFF), + ]; + greedent.passive = true; - encounter.enemyPartyConfigs = [ config ]; - encounter.setDialogueToken("greedentName", getPokemonSpecies(Species.GREEDENT).getName()); - - return true; - }) - .withOnVisualsStart(() => { - doGreedentSpriteSteal(); - doBerrySpritePile(); - - // Remove the berries from the party - // Session has been safely saved at this point, so data won't be lost - const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; - berryItems.forEach(berryMod => { - globalScene.removeModifier(berryMod); - }); - - globalScene.updateModifiers(true); - - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withOptionPhase(async () => { - // Pick battle - const encounter = globalScene.currentBattle.mysteryEncounter!; - - // Provides 1x Reviver Seed to each party member at end of battle - const revSeed = generateModifierType(modifierTypes.REVIVER_SEED); - encounter.setDialogueToken("foodReward", revSeed?.name ?? i18next.t("modifierType:ModifierType.REVIVER_SEED.name")); - const givePartyPokemonReviverSeeds = () => { - const party = globalScene.getPlayerParty(); - party.forEach(p => { - const heldItems = p.getHeldItems(); - if (revSeed && !heldItems.some(item => item instanceof PokemonInstantReviveModifier)) { - const seedModifier = revSeed.newModifier(p); - globalScene.addModifier(seedModifier, false, false, false, true); - } - }); - queueEncounterMessage(`${namespace}:option.1.food_stash`); - }; - - setEncounterRewards({ fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); - encounter.startOfBattleEffects.push({ - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY ], - move: new PokemonMove(Moves.STUFF_CHEEKS), - ignorePp: true - }); - - await transitionMysteryEncounterIntroVisuals(true, true, 500); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const berryMap = encounter.misc.berryItemsMap; - - // Returns 2/5 of the berries stolen to each Pokemon - const party = globalScene.getPlayerParty(); - party.forEach(pokemon => { - const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); - const berryTypesAsArray: BerryType[] = []; - stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); - const returnedBerryCount = Math.floor((berryTypesAsArray.length ?? 0) * 2 / 5); - - if (returnedBerryCount > 0) { - for (let i = 0; i < returnedBerryCount; i++) { - // Shuffle remaining berry types and pop - Phaser.Math.RND.shuffle(berryTypesAsArray); - const randBerryType = berryTypesAsArray.pop(); - - const berryModType = generateModifierType(modifierTypes.BERRY, [ randBerryType ]) as BerryModifierType; - applyModifierTypeToPlayerPokemon(pokemon, berryModType); - } - } - }); - await globalScene.updateModifiers(true); - - await transitionMysteryEncounterIntroVisuals(true, true, 500); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Animate berries being eaten - doGreedentEatBerries(); - doBerrySpritePile(true); - return true; - }) - .withOptionPhase(async () => { - // Let it have the food - // Greedent joins the team, level equal to 2 below highest party member (shiny locked) - const level = getHighestLevelPlayerPokemon(false, true).level - 2; - const greedent = new EnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, true); - greedent.moveset = [ new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF) ]; - greedent.passive = true; - - await transitionMysteryEncounterIntroVisuals(true, true, 500); - await catchPokemon(greedent, null, PokeballType.POKEBALL, false); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .build(); + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await catchPokemon(greedent, null, PokeballType.POKEBALL, false); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); function doGreedentSpriteSteal() { const shakeDelay = 50; @@ -382,70 +401,79 @@ function doGreedentSpriteSteal() { globalScene.tweens.chain({ targets: greedentSprites, tweens: [ - { // Slide Greedent diagonally + { + // Slide Greedent diagonally duration: slideDelay, ease: "Cubic.easeOut", y: "+=75", x: "-=65", - scale: 1.1 + scale: 1.1, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Slide Greedent diagonally + { + // Slide Greedent diagonally duration: slideDelay, ease: "Cubic.easeOut", y: "-=75", x: "+=65", - scale: 1 + scale: 1, }, - { // Bounce at the end + { + // Bounce at the end duration: 300, ease: "Cubic.easeOut", yoyo: true, y: "-=20", loop: 1, - } - ] + }, + ], }); } @@ -467,16 +495,28 @@ function doGreedentEatBerries() { globalScene.playSound("battle_anims/PRSFX- Bug Bite"); } index++; - } + }, }); } /** * @param isEat Default false. Will "create" pile when false, and remove pile when true. */ -function doBerrySpritePile(isEat: boolean = false) { +function doBerrySpritePile(isEat = false) { const berryAddDelay = 150; - let animationOrder = [ "starf", "sitrus", "lansat", "salac", "apicot", "enigma", "liechi", "ganlon", "lum", "petaya", "leppa" ]; + let animationOrder = [ + "starf", + "sitrus", + "lansat", + "salac", + "apicot", + "enigma", + "liechi", + "ganlon", + "lum", + "petaya", + "leppa", + ]; if (isEat) { animationOrder = animationOrder.reverse(); } @@ -500,7 +540,7 @@ function doBerrySpritePile(isEat: boolean = false) { // Animate Petaya berry falling off the pile if (berry === "petaya" && sprite && tintSprite && !isEat) { globalScene.time.delayedCall(200, () => { - doBerryBounce([ sprite, tintSprite ], 30, 500); + doBerryBounce([sprite, tintSprite], 30, 500); }); } }); @@ -515,7 +555,7 @@ function doBerryBounce(berrySprites: Phaser.GameObjects.Sprite[], yd: number, ba globalScene.tweens.add({ targets: berrySprites, y: "+=" + bounceYOffset, - x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + x: { value: "+=" + bouncePower * bouncePower * 10, ease: "Linear" }, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeIn", onComplete: () => { @@ -527,13 +567,13 @@ function doBerryBounce(berrySprites: Phaser.GameObjects.Sprite[], yd: number, ba globalScene.tweens.add({ targets: berrySprites, y: "-=" + bounceYOffset, - x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + x: { value: "+=" + bouncePower * bouncePower * 10, ease: "Linear" }, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeOut", - onComplete: () => doBounce() + onComplete: () => doBounce(), }); } - } + }, }); }; diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index 671eb3d3ab8..b66052cfd16 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -1,4 +1,9 @@ -import { generateModifierType, leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + setEncounterExp, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -6,7 +11,11 @@ import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + AbilityRequirement, + CombinationPokemonRequirement, + MoveRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { EXTORTION_ABILITIES, EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { getPokemonSpecies } from "#app/data/pokemon-species"; @@ -33,153 +42,152 @@ const MONEY_MAXIMUM_MULTIPLIER = 30; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3808 | GitHub Issue #3808} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AnOfferYouCantRefuseEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party - .withIntroSpriteConfigs([ - { - spriteKey: Species.LIEPARD.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 0, - y: -4, - yShadow: -4 - }, - { - spriteKey: "rich_kid_m", - fileRoot: "trainer", - hasShadow: true, - x: 2, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const pokemon = getHighestStatTotalPlayerPokemon(true, true); +export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party + .withIntroSpriteConfigs([ + { + spriteKey: Species.LIEPARD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 0, + y: -4, + yShadow: -4, + }, + { + spriteKey: "rich_kid_m", + fileRoot: "trainer", + hasShadow: true, + x: 2, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = getHighestStatTotalPlayerPokemon(true, true); - const baseSpecies = pokemon.getSpeciesForm().getRootSpeciesId(); - const starterValue: number = speciesStarterCosts[baseSpecies] ?? 1; - const multiplier = Math.max(MONEY_MAXIMUM_MULTIPLIER / 10 * starterValue, MONEY_MINIMUM_MULTIPLIER); - const price = globalScene.getWaveMoneyAmount(multiplier); + const baseSpecies = pokemon.getSpeciesForm().getRootSpeciesId(); + const starterValue: number = speciesStarterCosts[baseSpecies] ?? 1; + const multiplier = Math.max((MONEY_MAXIMUM_MULTIPLIER / 10) * starterValue, MONEY_MINIMUM_MULTIPLIER); + const price = globalScene.getWaveMoneyAmount(multiplier); - encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("price", price.toString()); + encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("price", price.toString()); - // Store pokemon and price - encounter.misc = { - pokemon: pokemon, - price: price - }; + // Store pokemon and price + encounter.misc = { + pokemon: pokemon, + price: price, + }; - // If player meets the combo OR requirements for option 2, populate the token - const opt2Req = encounter.options[1].primaryPokemonRequirements[0]; - if (opt2Req.meetsRequirement()) { - const abilityToken = encounter.dialogueTokens["option2PrimaryAbility"]; - const moveToken = encounter.dialogueTokens["option2PrimaryMove"]; - if (abilityToken) { - encounter.setDialogueToken("moveOrAbility", abilityToken); - } else if (moveToken) { - encounter.setDialogueToken("moveOrAbility", moveToken); - } + // If player meets the combo OR requirements for option 2, populate the token + const opt2Req = encounter.options[1].primaryPokemonRequirements[0]; + if (opt2Req.meetsRequirement()) { + const abilityToken = encounter.dialogueTokens["option2PrimaryAbility"]; + const moveToken = encounter.dialogueTokens["option2PrimaryMove"]; + if (abilityToken) { + encounter.setDialogueToken("moveOrAbility", abilityToken); + } else if (moveToken) { + encounter.setDialogueToken("moveOrAbility", moveToken); } + } - const shinyCharm = generateModifierType(modifierTypes.SHINY_CHARM); - encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name")); - encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName()); + const shinyCharm = generateModifierType(modifierTypes.SHINY_CHARM); + encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name")); + encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - speaker: `${namespace}:speaker`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Update money and remove pokemon from party - updatePlayerMoney(encounter.misc.price); - globalScene.removePokemonFromPlayerParty(encounter.misc.pokemon); - return true; - }) - .withOptionPhase(async () => { - // Give the player a Shiny Charm - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.SHINY_CHARM)); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - new MoveRequirement(EXTORTION_MOVES, true), - new AbilityRequirement(EXTORTION_ABILITIES, true) - ) - ) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async () => { - // Extort the rich kid for money - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Update money and remove pokemon from party - updatePlayerMoney(encounter.misc.price); - - setEncounterExp(encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); - - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Update money and remove pokemon from party + updatePlayerMoney(encounter.misc.price); + globalScene.removePokemonFromPlayerParty(encounter.misc.pokemon); + return true; + }) + .withOptionPhase(async () => { + // Give the player a Shiny Charm + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.SHINY_CHARM)); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new MoveRequirement(EXTORTION_MOVES, true), + new AbilityRequirement(EXTORTION_ABILITIES, true), + ), + ) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, selected: [ { speaker: `${namespace}:speaker`, - text: `${namespace}:option.3.selected`, + text: `${namespace}:option.2.selected`, }, ], - }, - async () => { - // Leave encounter with no rewards or exp + }) + .withOptionPhase(async () => { + // Extort the rich kid for money + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Update money and remove pokemon from party + updatePlayerMoney(encounter.misc.price); + + setEncounterExp(encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); + leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 550d9bd4f13..94e27e32773 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -1,6 +1,5 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import type { - EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType, generateModifierTypeOption, @@ -8,18 +7,12 @@ import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, - setEncounterRewards + setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; -import type { - BerryModifierType, - ModifierTypeOption } from "#app/modifier/modifier-type"; -import { - ModifierPoolType, - modifierTypes, - regenerateModifierPoolThresholds, -} from "#app/modifier/modifier-type"; +import type { BerryModifierType, ModifierTypeOption } from "#app/modifier/modifier-type"; +import { ModifierPoolType, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -30,7 +23,13 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-enco import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { applyModifierTypeToPlayerPokemon, getEncounterPokemonLevelForWave, getHighestStatPlayerPokemon, getSpriteKeysFromPokemon, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyModifierTypeToPlayerPokemon, + getEncounterPokemonLevelForWave, + getHighestStatPlayerPokemon, + getSpriteKeysFromPokemon, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { BerryModifier } from "#app/modifier/modifier"; import i18next from "#app/plugins/i18n"; @@ -47,107 +46,150 @@ const namespace = "mysteryEncounters/berriesAbound"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3810 | GitHub Issue #3810} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const BerriesAboundEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BERRIES_ABOUND) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const BerriesAboundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.BERRIES_ABOUND, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossPokemon = getRandomEncounterSpecies(level, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Calculate boss mon + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossPokemon = getRandomEncounterSpecies(level, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, species: bossPokemon.species, dataSource: new PokemonData(bossPokemon), - isBoss: true - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - // Calculate the number of extra berries that player receives - // 10-40: 2, 40-120: 4, 120-160: 5, 160-180: 7 - const numBerries = - globalScene.currentBattle.waveIndex > 160 ? 7 - : globalScene.currentBattle.waveIndex > 120 ? 5 - : globalScene.currentBattle.waveIndex > 40 ? 4 : 2; - regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); - encounter.misc = { numBerries }; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); - encounter.spriteConfigs = [ - { - spriteKey: "berries_abound_bush", - fileRoot: "mystery-encounters", - x: 25, - y: -6, - yShadow: -7, - disableAnimation: true, - hasShadow: true + isBoss: true, }, - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - isPokemon: true, - isShiny: bossPokemon.shiny, - variant: bossPokemon.variant - } - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; - // Get fastest party pokemon for option 2 - const fastestPokemon = getHighestStatPlayerPokemon(PERMANENT_STATS[Stat.SPD], true, false); - encounter.misc.fastestPokemon = fastestPokemon; - encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD); - encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender()); + // Calculate the number of extra berries that player receives + // 10-40: 2, 40-120: 4, 120-160: 5, 160-180: 7 + const numBerries = + globalScene.currentBattle.waveIndex > 160 + ? 7 + : globalScene.currentBattle.waveIndex > 120 + ? 5 + : globalScene.currentBattle.waveIndex > 40 + ? 4 + : 2; + regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); + encounter.misc = { numBerries }; - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], + spriteKey: "berries_abound_bush", + fileRoot: "mystery-encounters", + x: 25, + y: -6, + yShadow: -7, + disableAnimation: true, + hasShadow: true, }, - async () => { - // Pick battle + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant, + }, + ]; + + // Get fastest party pokemon for option 2 + const fastestPokemon = getHighestStatPlayerPokemon(PERMANENT_STATS[Stat.SPD], true, false); + encounter.misc.fastestPokemon = fastestPokemon; + encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD); + encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender()); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + const numBerries = encounter.misc.numBerries; + + const doBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); + + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerries, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it + for (let i = 0; i < numBerries; i++) { + tryGiveBerry(); + } + }; + + const shopOptions: ModifierTypeOption[] = []; + for (let i = 0; i < 5; i++) { + // Generate shop berries + const mod = generateModifierTypeOption(modifierTypes.BERRY); + if (mod) { + shopOptions.push(mod); + } + } + + setEncounterRewards( + { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, + undefined, + doBerryRewards, + ); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }) + .withOptionPhase(async () => { + // Pick race for berries const encounter = globalScene.currentBattle.mysteryEncounter!; - const numBerries = encounter.misc.numBerries; - - const doBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); - - globalScene.playSound("item_fanfare"); - queueEncounterMessage(i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); - - // Generate a random berry and give it to the first Pokemon with room for it - for (let i = 0; i < numBerries; i++) { - tryGiveBerry(); - } - }; + const fastestPokemon: PlayerPokemon = encounter.misc.fastestPokemon; + const enemySpeed: number = encounter.misc.enemySpeed; + const speedDiff = fastestPokemon.getStat(Stat.SPD) / (enemySpeed * 1.1); + const numBerries: number = encounter.misc.numBerries; const shopOptions: ModifierTypeOption[] = []; for (let i = 0; i < 5; i++) { @@ -158,115 +200,126 @@ export const BerriesAboundEncounter: MysteryEncounter = } } - setEncounterRewards({ guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); - await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` - }) - .withOptionPhase(async () => { - // Pick race for berries - const encounter = globalScene.currentBattle.mysteryEncounter!; - const fastestPokemon: PlayerPokemon = encounter.misc.fastestPokemon; - const enemySpeed: number = encounter.misc.enemySpeed; - const speedDiff = fastestPokemon.getStat(Stat.SPD) / (enemySpeed * 1.1); - const numBerries: number = encounter.misc.numBerries; + if (speedDiff < 1) { + // Caught and attacked by boss, gets +1 to all stats at start of fight + const doBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); - const shopOptions: ModifierTypeOption[] = []; - for (let i = 0; i < 5; i++) { - // Generate shop berries - const mod = generateModifierTypeOption(modifierTypes.BERRY); - if (mod) { - shopOptions.push(mod); + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerries, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it + for (let i = 0; i < numBerries; i++) { + tryGiveBerry(); } + }; + + // Defense/Spd buffs below wave 50, +1 to all stats otherwise + const statChangesForBattle: ( + | Stat.ATK + | Stat.DEF + | Stat.SPATK + | Stat.SPDEF + | Stat.SPD + | Stat.ACC + | Stat.EVA + )[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; + + const config = globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; + config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.2.boss_enraged`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }; + setEncounterRewards( + { + guaranteedModifierTypeOptions: shopOptions, + fillRemaining: false, + }, + undefined, + doBerryRewards, + ); + await showEncounterText(`${namespace}:option.2.selected_bad`); + await initBattleWithEnemyConfig(config); + return; + } + // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 2 + const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1) / 0.08), numBerries), 2); + encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); + const doFasterBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); + + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerriesGrabbed, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) + for (let i = 0; i < numBerriesGrabbed; i++) { + tryGiveBerry(fastestPokemon); } + }; - if (speedDiff < 1) { - // Caught and attacked by boss, gets +1 to all stats at start of fight - const doBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); - - globalScene.playSound("item_fanfare"); - queueEncounterMessage(i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); - - // Generate a random berry and give it to the first Pokemon with room for it - for (let i = 0; i < numBerries; i++) { - tryGiveBerry(); - } - }; - - // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = globalScene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; - - const config = globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - config.pokemonConfigs![0].tags = [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ]; - config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - queueEncounterMessage(`${namespace}:option.2.boss_enraged`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - }; - setEncounterRewards({ guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); - await showEncounterText(`${namespace}:option.2.selected_bad`); - await initBattleWithEnemyConfig(config); - return; - } else { - // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 2 - const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1) / 0.08), numBerries), 2); - encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); - const doFasterBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); - - globalScene.playSound("item_fanfare"); - queueEncounterMessage(i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerriesGrabbed })); - - // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) - for (let i = 0; i < numBerriesGrabbed; i++) { - tryGiveBerry(fastestPokemon); - } - }; - - setEncounterExp(fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); - setEncounterRewards({ guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doFasterBerryRewards); - await showEncounterText(`${namespace}:option.2.selected`); - leaveEncounterWithoutBattle(); - } - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ + setEncounterExp(fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); + setEncounterRewards( { - text: `${namespace}:option.3.selected`, + guaranteedModifierTypeOptions: shopOptions, + fillRemaining: false, }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + undefined, + doFasterBerryRewards, + ); + await showEncounterText(`${namespace}:option.2.selected`); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); function tryGiveBerry(prioritizedPokemon?: PlayerPokemon) { - const berryType = randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType; - const berry = generateModifierType(modifierTypes.BERRY, [ berryType ]) as BerryModifierType; + const berryType = randSeedInt(Object.keys(BerryType).filter(s => !Number.isNaN(Number(s))).length) as BerryType; + const berry = generateModifierType(modifierTypes.BERRY, [berryType]) as BerryModifierType; const party = globalScene.getPlayerParty(); // Will try to apply to prioritized pokemon first, then do normal application method if it fails if (prioritizedPokemon) { - const heldBerriesOfType = globalScene.findModifier(m => m instanceof BerryModifier - && m.pokemonId === prioritizedPokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + const heldBerriesOfType = globalScene.findModifier( + m => + m instanceof BerryModifier && + m.pokemonId === prioritizedPokemon.id && + (m as BerryModifier).berryType === berryType, + true, + ) as BerryModifier; if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount()) { applyModifierTypeToPlayerPokemon(prioritizedPokemon, berry); @@ -276,8 +329,10 @@ function tryGiveBerry(prioritizedPokemon?: PlayerPokemon) { // Iterate over the party until berry was successfully given for (const pokemon of party) { - const heldBerriesOfType = globalScene.findModifier(m => m instanceof BerryModifier - && m.pokemonId === pokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + const heldBerriesOfType = globalScene.findModifier( + m => m instanceof BerryModifier && m.pokemonId === pokemon.id && (m as BerryModifier).berryType === berryType, + true, + ) as BerryModifier; if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount()) { applyModifierTypeToPlayerPokemon(pokemon, berry); 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 9a95cf305be..15cba1fa103 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -1,5 +1,4 @@ -import type { - EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType, generateModifierTypeOption, @@ -39,20 +38,18 @@ import { AttackTypeBoosterHeldItemTypeRequirement, CombinationPokemonRequirement, HeldItemRequirement, - TypeRequirement + TypeRequirement, } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { PokemonType } from "#enums/pokemon-type"; import type { AttackTypeBoosterModifierType, ModifierTypeOption } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; -import type { - PokemonHeldItemModifier -} from "#app/modifier/modifier"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AttackTypeBoosterModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, GigantamaxAccessModifier, - MegaEvolutionAccessModifier + MegaEvolutionAccessModifier, } from "#app/modifier/modifier"; import i18next from "i18next"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; @@ -87,7 +84,7 @@ const POOL_1_POKEMON = [ Species.CHARJABUG, Species.RIBOMBEE, Species.SPIDOPS, - Species.LOKIX + Species.LOKIX, ]; const POOL_2_POKEMON = [ @@ -116,26 +113,26 @@ const POOL_2_POKEMON = [ Species.KLEAVOR, ]; -const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ +const POOL_3_POKEMON: { species: Species; formIndex?: number }[] = [ { species: Species.PINSIR, - formIndex: 1 + formIndex: 1, }, { species: Species.SCIZOR, - formIndex: 1 + formIndex: 1, }, { species: Species.HERACROSS, - formIndex: 1 + formIndex: 1, }, { species: Species.ORBEETLE, - formIndex: 1 + formIndex: 1, }, { species: Species.CENTISKORCH, - formIndex: 1 + formIndex: 1, }, { species: Species.DURANT, @@ -148,35 +145,19 @@ const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ }, ]; -const POOL_4_POKEMON = [ - Species.GENESECT, - Species.SLITHER_WING, - Species.BUZZWOLE, - Species.PHEROMOSA -]; +const POOL_4_POKEMON = [Species.GENESECT, Species.SLITHER_WING, Species.BUZZWOLE, Species.PHEROMOSA]; const PHYSICAL_TUTOR_MOVES = [ Moves.MEGAHORN, Moves.X_SCISSOR, Moves.ATTACK_ORDER, Moves.PIN_MISSILE, - Moves.FIRST_IMPRESSION + Moves.FIRST_IMPRESSION, ]; -const SPECIAL_TUTOR_MOVES = [ - Moves.SILVER_WIND, - Moves.BUG_BUZZ, - Moves.SIGNAL_BEAM, - Moves.POLLEN_PUFF -]; +const SPECIAL_TUTOR_MOVES = [Moves.SILVER_WIND, Moves.BUG_BUZZ, Moves.SIGNAL_BEAM, Moves.POLLEN_PUFF]; -const STATUS_TUTOR_MOVES = [ - Moves.STRING_SHOT, - Moves.STICKY_WEB, - Moves.SILK_TRAP, - Moves.RAGE_POWDER, - Moves.HEAL_ORDER -]; +const STATUS_TUTOR_MOVES = [Moves.STRING_SHOT, Moves.STICKY_WEB, Moves.SILK_TRAP, Moves.RAGE_POWDER, Moves.HEAL_ORDER]; const MISC_TUTOR_MOVES = [ Moves.BUG_BITE, @@ -185,154 +166,155 @@ const MISC_TUTOR_MOVES = [ Moves.QUIVER_DANCE, Moves.TAIL_GLOW, Moves.INFESTATION, - Moves.U_TURN + Moves.U_TURN, ]; /** * Wave breakpoints that determine how strong to make the Bug-Type Superfan's team */ -const WAVE_LEVEL_BREAKPOINTS = [ 30, 50, 70, 100, 120, 140, 160 ]; +const WAVE_LEVEL_BREAKPOINTS = [30, 50, 70, 100, 120, 140, 160]; /** * Bug Type Superfan encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3820 | GitHub Issue #3820} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const BugTypeSuperfanEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BUG_TYPE_SUPERFAN) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), - new TypeRequirement(PokemonType.BUG, false, 1) - ) - ) - .withMaxAllowedEncounters(1) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ +export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.BUG_TYPE_SUPERFAN, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), + new TypeRequirement(PokemonType.BUG, false, 1), + ), + ) + .withMaxAllowedEncounters(1) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Calculates what trainers are available for battle in the encounter + + // Bug type superfan trainer config + const config = getTrainerConfigForWave(globalScene.currentBattle.waveIndex); + const spriteKey = config.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + trainerConfig: config, + female: true, + }); + + let beedrillKeys: { spriteKey: string; fileRoot: string }, butterfreeKeys: { spriteKey: string; fileRoot: string }; + if (globalScene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { + beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false); + butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false); + } else { + // Mega Beedrill/Gmax Butterfree + beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false, 1); + butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false, 1); + } + + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: beedrillKeys.spriteKey, + fileRoot: beedrillKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: -30, + tint: 0.15, + y: -4, + yShadow: -4, }, { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, + spriteKey: butterfreeKeys.spriteKey, + fileRoot: butterfreeKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: 30, + tint: 0.15, + y: -4, + yShadow: -4, }, - ]) - .withOnInit(() => { + { + spriteKey: spriteKey, + fileRoot: "trainer", + hasShadow: true, + x: 4, + y: 7, + yShadow: 7, + }, + ]; + + const requiredItems = [ + generateModifierType(modifierTypes.QUICK_CLAW), + generateModifierType(modifierTypes.GRIP_CLAW), + generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.BUG]), + ]; + + const requiredItemString = requiredItems.map(m => m?.name ?? "unknown").join("/"); + encounter.setDialogueToken("requiredBugItems", requiredItemString); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Select battle the bug trainer const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculates what trainers are available for battle in the encounter + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Bug type superfan trainer config - const config = getTrainerConfigForWave(globalScene.currentBattle.waveIndex); - const spriteKey = config.getSpriteKey(); - encounter.enemyPartyConfigs.push({ - trainerConfig: config, - female: true, - }); + // Init the moves available for tutor + const moveTutorOptions: PokemonMove[] = []; + moveTutorOptions.push(new PokemonMove(PHYSICAL_TUTOR_MOVES[randSeedInt(PHYSICAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(SPECIAL_TUTOR_MOVES[randSeedInt(SPECIAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(STATUS_TUTOR_MOVES[randSeedInt(STATUS_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(MISC_TUTOR_MOVES[randSeedInt(MISC_TUTOR_MOVES.length)])); + encounter.misc = { + moveTutorOptions, + }; - let beedrillKeys: { spriteKey: string, fileRoot: string }, butterfreeKeys: { spriteKey: string, fileRoot: string }; - if (globalScene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { - beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false); - butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false); - } else { - // Mega Beedrill/Gmax Butterfree - beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false, 1); - butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false, 1); - } + // Assigns callback that teaches move before continuing to rewards + encounter.onRewards = doBugTypeMoveTutor; - encounter.spriteConfigs = [ - { - spriteKey: beedrillKeys.spriteKey, - fileRoot: beedrillKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: -30, - tint: 0.15, - y: -4, - yShadow: -4 - }, - { - spriteKey: butterfreeKeys.spriteKey, - fileRoot: butterfreeKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: 30, - tint: 0.15, - y: -4, - yShadow: -4 - }, - { - spriteKey: spriteKey, - fileRoot: "trainer", - hasShadow: true, - x: 4, - y: 7, - yShadow: 7 - }, - ]; - - const requiredItems = [ - generateModifierType(modifierTypes.QUICK_CLAW), - generateModifierType(modifierTypes.GRIP_CLAW), - generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.BUG ]), - ]; - - const requiredItemString = requiredItems.map(m => m?.name ?? "unknown").join("/"); - encounter.setDialogueToken("requiredBugItems", requiredItemString); - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected`, - }, - ], - }, - async () => { - // Select battle the bug trainer - const encounter = globalScene.currentBattle.mysteryEncounter!; - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - // Init the moves available for tutor - const moveTutorOptions: PokemonMove[] = []; - moveTutorOptions.push(new PokemonMove(PHYSICAL_TUTOR_MOVES[randSeedInt(PHYSICAL_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(SPECIAL_TUTOR_MOVES[randSeedInt(SPECIAL_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(STATUS_TUTOR_MOVES[randSeedInt(STATUS_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(MISC_TUTOR_MOVES[randSeedInt(MISC_TUTOR_MOVES.length)])); - encounter.misc = { - moveTutorOptions - }; - - // Assigns callback that teaches move before continuing to rewards - encounter.onRewards = doBugTypeMoveTutor; - - setEncounterRewards({ fillRemaining: true }); - await transitionMysteryEncounterIntroVisuals(true, true); - await initBattleWithEnemyConfig(config); - } - ) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + setEncounterRewards({ fillRemaining: true }); + await transitionMysteryEncounterIntroVisuals(true, true); + await initBattleWithEnemyConfig(config); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPrimaryPokemonRequirement(new TypeRequirement(PokemonType.BUG, false, 1)) // Must have 1 Bug type on team .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip` + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, }) .withPreOptionPhase(async () => { // Player shows off their bug types @@ -340,11 +322,16 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = // Player gets different rewards depending on the number of bug types they have const numBugTypes = globalScene.getPlayerParty().filter(p => p.isOfType(PokemonType.BUG, true)).length; - const numBugTypesText = i18next.t(`${namespace}:numBugTypes`, { count: numBugTypes }); + const numBugTypesText = i18next.t(`${namespace}:numBugTypes`, { + count: numBugTypes, + }); encounter.setDialogueToken("numBugTypes", numBugTypesText); if (numBugTypes < 2) { - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.SUPER_LURE, modifierTypes.GREAT_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SUPER_LURE, modifierTypes.GREAT_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -352,7 +339,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else if (numBugTypes < 4) { - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.QUICK_CLAW, modifierTypes.MAX_LURE, modifierTypes.ULTRA_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.QUICK_CLAW, modifierTypes.MAX_LURE, modifierTypes.ULTRA_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -360,7 +350,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else if (numBugTypes < 6) { - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.GRIP_CLAW, modifierTypes.MAX_LURE, modifierTypes.ROGUE_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.GRIP_CLAW, modifierTypes.MAX_LURE, modifierTypes.ROGUE_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -370,7 +363,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = } else { // If the player has any evolution/form change items that are valid for their party, // spawn one of those items in addition to Dynamax Band, Mega Band, and Master Ball - const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(modifierTypes.MASTER_BALL)! ]; + const modifierOptions: ModifierTypeOption[] = [generateModifierTypeOption(modifierTypes.MASTER_BALL)!]; const specialOptions: ModifierTypeOption[] = []; if (!globalScene.findModifier(m => m instanceof MegaEvolutionAccessModifier)) { @@ -399,7 +392,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = modifierOptions.push(specialOptions[randSeedInt(specialOptions.length)]); } - setEncounterRewards({ guaranteedModifierTypeOptions: modifierOptions, fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: modifierOptions, + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -412,15 +408,16 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = // Player shows off their bug types leaveEncounterWithoutBattle(); }) - .build()) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPrimaryPokemonRequirement( CombinationPokemonRequirement.Some( // Meets one or both of the below reqs - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1) - ) + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), + ), ) .withDialogue({ buttonLabel: `${namespace}:option.3.label`, @@ -443,10 +440,13 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const onPokemonSelected = (pokemon: PlayerPokemon) => { // Get Pokemon held items and filter for valid ones const validItems = pokemon.getHeldItems().filter(item => { - return (item instanceof BypassSpeedChanceModifier || - item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG)) && - item.isTransferable; + return ( + (item instanceof BypassSpeedChanceModifier || + item instanceof ContactHeldItemTransferChanceModifier || + (item instanceof AttackTypeBoosterModifier && + (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG)) && + item.isTransferable + ); }); return validItems.map((modifier: PokemonHeldItemModifier) => { @@ -469,9 +469,12 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { // If pokemon has valid item, it can be selected const hasValidItem = pokemon.getHeldItems().some(item => { - return item instanceof BypassSpeedChanceModifier || + return ( + item instanceof BypassSpeedChanceModifier || item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG); + (item instanceof AttackTypeBoosterModifier && + (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG) + ); }); if (!hasValidItem) { return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; @@ -493,16 +496,21 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const bugNet = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET)!; bugNet.type.tier = ModifierTier.ROGUE; - setEncounterRewards({ guaranteedModifierTypeOptions: [ bugNet ], guaranteedModifierTypeFuncs: [ modifierTypes.REVIVER_SEED ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: [bugNet], + guaranteedModifierTypeFuncs: [modifierTypes.REVIVER_SEED], + fillRemaining: false, + }); leaveEncounterWithoutBattle(true); }) - .build()) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + .build(), + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); function getTrainerConfigForWave(waveIndex: number) { // Bug type superfan trainer config @@ -516,134 +524,186 @@ function getTrainerConfigForWave(waveIndex: number) { if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) { // Use default template (2 AVG) config - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)); + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[1]) { config .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[2]) { config .setPartyTemplates(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[4]) { config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[5]) { pool3Copy = randSeedShuffle(pool3Copy); const pool3Mon2 = pool3Copy.pop()!; config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; - p.generateAndPopulateMoveset(); - p.generateName(); - } - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ pool3Mon2.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon2.formIndex)) { - p.formIndex = pool3Mon2.formIndex; - p.generateAndPopulateMoveset(); - p.generateName(); - } - })); + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon2.formIndex)) { + p.formIndex = pool3Mon2.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[6]) { config - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); } else { pool3Copy = randSeedShuffle(pool3Copy); const pool3Mon2 = pool3Copy.pop()!; config - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon2.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon2.formIndex)) { - p.formIndex = pool3Mon2.formIndex; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon2.formIndex)) { + p.formIndex = pool3Mon2.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); } @@ -651,6 +711,7 @@ function getTrainerConfigForWave(waveIndex: number) { } function doBugTypeMoveTutor(): Promise { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO explain return new Promise(async resolve => { const moveOptions = globalScene.currentBattle.mysteryEncounter!.misc.moveTutorOptions; await showEncounterDialogue(`${namespace}:battle_won`, `${namespace}:speaker`); @@ -663,7 +724,7 @@ function doBugTypeMoveTutor(): Promise { right: true, x: 1, y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: (globalScene.game.canvas.width / 6) - 2, + width: globalScene.game.canvas.width / 6 - 2, }); globalScene.ui.add(moveInfoOverlay); @@ -688,7 +749,12 @@ function doBugTypeMoveTutor(): Promise { moveInfoOverlay.setVisible(false); }; - const result = await selectOptionThenPokemon(optionSelectItems, `${namespace}:teach_move_prompt`, undefined, onHoverOverCancel); + const result = await selectOptionThenPokemon( + optionSelectItems, + `${namespace}:teach_move_prompt`, + undefined, + onHoverOverCancel, + ); // let forceExit = !!result; if (!result) { moveInfoOverlay.active = false; @@ -699,7 +765,9 @@ function doBugTypeMoveTutor(): Promise { // Option select complete, handle if they are learning a move if (result && result.selectedOptionIndex < moveOptions.length) { - globalScene.unshiftPhase(new LearnMovePhase(result.selectedPokemonIndex, moveOptions[result.selectedOptionIndex].moveId)); + globalScene.unshiftPhase( + new LearnMovePhase(result.selectedPokemonIndex, moveOptions[result.selectedOptionIndex].moveId), + ); } // Complete battle and go to rewards diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index c9fc7975a3f..2b499d938cd 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,6 +1,14 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + selectPokemonForOption, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { ModifierPoolType, modifierTypes } from "#app/modifier/modifier-type"; @@ -14,7 +22,10 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#enums/abilities"; -import { applyAbilityOverrideToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyAbilityOverrideToPokemon, + applyModifierTypeToPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { PokemonType } from "#enums/pokemon-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -55,7 +66,7 @@ const RANDOM_ABILITY_POOL = [ Abilities.MISTY_SURGE, Abilities.MAGICIAN, Abilities.SHEER_FORCE, - Abilities.PRANKSTER + Abilities.PRANKSTER, ]; /** @@ -63,340 +74,363 @@ const RANDOM_ABILITY_POOL = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3807 | GitHub Issue #3807} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ClowningAroundEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withDisallowedChallenges(Challenges.SINGLE_TYPE) - .withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withAnimations(EncounterAnim.SMOKESCREEN) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.MR_MIME.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: -25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: Species.BLACEPHALON.toString(), - fileRoot: "pokemon/exp", - hasShadow: true, - repeat: true, - x: 25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: "harlequin", - fileRoot: "trainer", - hasShadow: true, - x: 0, - y: 2, - yShadow: 2 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker` - }, - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.CLOWNING_AROUND, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withDisallowedChallenges(Challenges.SINGLE_TYPE) + .withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withAnimations(EncounterAnim.SMOKESCREEN) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.MR_MIME.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: -25, + tint: 0.3, + y: -3, + yShadow: -3, + }, + { + spriteKey: Species.BLACEPHALON.toString(), + fileRoot: "pokemon/exp", + hasShadow: true, + repeat: true, + x: 25, + tint: 0.3, + y: -3, + yShadow: -3, + }, + { + spriteKey: "harlequin", + fileRoot: "trainer", + hasShadow: true, + x: 0, + y: 2, + yShadow: 2, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - const clownTrainerType = TrainerType.HARLEQUIN; - const clownConfig = trainerConfigs[clownTrainerType].clone(); - const clownPartyTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); - clownConfig.setPartyTemplates(clownPartyTemplate); - clownConfig.setDoubleOnly(); - // @ts-ignore - clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists + const clownTrainerType = TrainerType.HARLEQUIN; + const clownConfig = trainerConfigs[clownTrainerType].clone(); + const clownPartyTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ); + clownConfig.setPartyTemplates(clownPartyTemplate); + clownConfig.setDoubleOnly(); + // @ts-ignore + clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists - // Generate random ability for Blacephalon from pool - const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; - encounter.setDialogueToken("ability", new Ability(ability, 3).name); - encounter.misc = { ability }; + // Generate random ability for Blacephalon from pool + const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; + encounter.setDialogueToken("ability", new Ability(ability, 3).name); + encounter.misc = { ability }; - // Decide the random types for Blacephalon. They should not be the same. - const firstType: number = randSeedInt(18); - let secondType: number = randSeedInt(17); - if ( secondType >= firstType ) { - secondType++; - } + // Decide the random types for Blacephalon. They should not be the same. + const firstType: number = randSeedInt(18); + let secondType: number = randSeedInt(17); + if (secondType >= firstType) { + secondType++; + } - encounter.enemyPartyConfigs.push({ - trainerConfig: clownConfig, - pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + encounter.enemyPartyConfigs.push({ + trainerConfig: clownConfig, + pokemonConfigs: [ + // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + { + species: getPokemonSpecies(Species.MR_MIME), + isBoss: true, + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC], + }, + { + // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter + species: getPokemonSpecies(Species.BLACEPHALON), + customPokemonData: new CustomPokemonData({ + ability: ability, + types: [firstType, secondType], + }), + isBoss: true, + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN], + }, + ], + doubleBattle: true, + }); + + // Load animations/sfx for start of fight moves + loadCustomMovesForEncounter([Moves.ROLE_PLAY, Moves.TAUNT]); + + encounter.setDialogueToken("blacephalonName", getPokemonSpecies(Species.BLACEPHALON).getName()); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ { - species: getPokemonSpecies(Species.MR_MIME), - isBoss: true, - moveSet: [ Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC ] - }, - { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter - species: getPokemonSpecies(Species.BLACEPHALON), - customPokemonData: new CustomPokemonData({ ability: ability, types: [ firstType, secondType ]}), - isBoss: true, - moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] + text: `${namespace}:option.1.selected`, + speaker: `${namespace}:speaker`, }, ], - doubleBattle: true - }); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Load animations/sfx for start of fight moves - loadCustomMovesForEncounter([ Moves.ROLE_PLAY, Moves.TAUNT ]); + setEncounterRewards({ fillRemaining: true }); - encounter.setDialogueToken("blacephalonName", getPokemonSpecies(Species.BLACEPHALON).getName()); + // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle + encounter.startOfBattleEffects.push( + { + // Mr. Mime copies the Blacephalon's random ability + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY_2], + move: new PokemonMove(Moves.ROLE_PLAY), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true, + }, + ); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn battle - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + await transitionMysteryEncounterIntroVisuals(); + await initBattleWithEnemyConfig(config); + }) + .withPostOptionPhase(async (): Promise => { + // After the battle, offer the player the opportunity to permanently swap ability + const abilityWasSwapped = await handleSwapAbility(); + if (abilityWasSwapped) { + await showEncounterText(`${namespace}:option.1.ability_gained`); + } - setEncounterRewards({ fillRemaining: true }); + // Play animations once ability swap is complete + // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 250, + }); + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + return true; + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + speaker: `${namespace}:speaker`, + }, + { + text: `${namespace}:option.2.selected_2`, + }, + { + text: `${namespace}:option.2.selected_3`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Swap player's items on pokemon with the most items + // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items + // So Vitamins, form change items, etc. are not included + const encounter = globalScene.currentBattle.mysteryEncounter!; - // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle - encounter.startOfBattleEffects.push( - { // Mr. Mime copies the Blacephalon's random ability - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY_2 ], - move: new PokemonMove(Moves.ROLE_PLAY), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER_2 ], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }); + const party = globalScene.getPlayerParty(); + let mostHeldItemsPokemon = party[0]; + let count = mostHeldItemsPokemon + .getHeldItems() + .filter(m => m.isTransferable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); - await transitionMysteryEncounterIntroVisuals(); - await initBattleWithEnemyConfig(config); - }) - .withPostOptionPhase(async (): Promise => { - // After the battle, offer the player the opportunity to permanently swap ability - const abilityWasSwapped = await handleSwapAbility(); - if (abilityWasSwapped) { - await showEncounterText(`${namespace}:option.1.ability_gained`); - } - - // Play animations once ability swap is complete - // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals - globalScene.tweens.add({ - targets: globalScene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 250 - }); - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, globalScene.getPlayerPokemon()!, globalScene.getPlayerPokemon()); - background.playWithoutTargets(230, 40, 2); - return true; - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - speaker: `${namespace}:speaker` - }, - { - text: `${namespace}:option.2.selected_2`, - }, - { - text: `${namespace}:option.2.selected_3`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withPreOptionPhase(async () => { - // Swap player's items on pokemon with the most items - // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items - // So Vitamins, form change items, etc. are not included - const encounter = globalScene.currentBattle.mysteryEncounter!; - - const party = globalScene.getPlayerParty(); - let mostHeldItemsPokemon = party[0]; - let count = mostHeldItemsPokemon.getHeldItems() + for (const pokemon of party) { + const nextCount = pokemon + .getHeldItems() .filter(m => m.isTransferable && !(m instanceof BerryModifier)) .reduce((v, m) => v + m.stackCount, 0); + if (nextCount > count) { + mostHeldItemsPokemon = pokemon; + count = nextCount; + } + } - party.forEach(pokemon => { - const nextCount = pokemon.getHeldItems() - .filter(m => m.isTransferable && !(m instanceof BerryModifier)) - .reduce((v, m) => v + m.stackCount, 0); - if (nextCount > count) { - mostHeldItemsPokemon = pokemon; - count = nextCount; - } - }); + encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); - encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); + const items = mostHeldItemsPokemon.getHeldItems(); - const items = mostHeldItemsPokemon.getHeldItems(); + // Shuffles Berries (if they have any) + let numBerries = 0; + for (const m of items.filter(m => m instanceof BerryModifier)) { + numBerries += m.stackCount; + globalScene.removeModifier(m); + } - // Shuffles Berries (if they have any) - let numBerries = 0; - items.filter(m => m instanceof BerryModifier) - .forEach(m => { - numBerries += m.stackCount; - globalScene.removeModifier(m); - }); + generateItemsOfTier(mostHeldItemsPokemon, numBerries, "Berries"); - generateItemsOfTier(mostHeldItemsPokemon, numBerries, "Berries"); + // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) + // For the purpose of this ME, Soothe Bells and Lucky Eggs are counted as Ultra tier + // And Golden Eggs as Rogue tier + let numUltra = 0; + let numRogue = 0; - // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) - // For the purpose of this ME, Soothe Bells and Lucky Eggs are counted as Ultra tier - // And Golden Eggs as Rogue tier - let numUltra = 0; - let numRogue = 0; - items.filter(m => m.isTransferable && !(m instanceof BerryModifier)) - .forEach(m => { - const type = m.type.withTierFromPool(ModifierPoolType.PLAYER, party); - const tier = type.tier ?? ModifierTier.ULTRA; - if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { - numRogue += m.stackCount; - globalScene.removeModifier(m); - } else if (type.id === "LUCKY_EGG" || type.id === "SOOTHE_BELL" || tier === ModifierTier.ULTRA) { - numUltra += m.stackCount; - globalScene.removeModifier(m); - } - }); + for (const m of items.filter(m => m.isTransferable && !(m instanceof BerryModifier))) { + const type = m.type.withTierFromPool(ModifierPoolType.PLAYER, party); + const tier = type.tier ?? ModifierTier.ULTRA; + if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { + numRogue += m.stackCount; + globalScene.removeModifier(m); + } else if (type.id === "LUCKY_EGG" || type.id === "SOOTHE_BELL" || tier === ModifierTier.ULTRA) { + numUltra += m.stackCount; + globalScene.removeModifier(m); + } + } - generateItemsOfTier(mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); - generateItemsOfTier(mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); - }) - .withOptionPhase(async () => { - leaveEncounterWithoutBattle(true); - }) - .withPostOptionPhase(async () => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, globalScene.getPlayerPokemon()!, globalScene.getPlayerPokemon()); - background.playWithoutTargets(230, 40, 2); - await transitionMysteryEncounterIntroVisuals(true, true, 200); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - speaker: `${namespace}:speaker` - }, - { - text: `${namespace}:option.3.selected_2`, - }, - { - text: `${namespace}:option.3.selected_3`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withPreOptionPhase(async () => { - // Randomize the second type of all player's pokemon - // If the pokemon does not normally have a second type, it will gain 1 - for (const pokemon of globalScene.getPlayerParty()) { - const originalTypes = pokemon.getTypes(false, false, true); + generateItemsOfTier(mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); + generateItemsOfTier(mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); + }) + .withOptionPhase(async () => { + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + await transitionMysteryEncounterIntroVisuals(true, true, 200); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + speaker: `${namespace}:speaker`, + }, + { + text: `${namespace}:option.3.selected_2`, + }, + { + text: `${namespace}:option.3.selected_3`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Randomize the second type of all player's pokemon + // If the pokemon does not normally have a second type, it will gain 1 + for (const pokemon of globalScene.getPlayerParty()) { + const originalTypes = pokemon.getTypes(false, false, true); - // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type - // Makes the "randomness" of the shuffle slightly less punishing - let priorityTypes = pokemon.moveset - .filter(move => move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) - .map(move => move!.getMove().type); - if (priorityTypes?.length > 0) { - priorityTypes = [ ...new Set(priorityTypes) ].sort(); - priorityTypes = randSeedShuffle(priorityTypes); - } + // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type + // Makes the "randomness" of the shuffle slightly less punishing + let priorityTypes = pokemon.moveset + .filter( + move => + move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS, + ) + .map(move => move!.getMove().type); + if (priorityTypes?.length > 0) { + priorityTypes = [...new Set(priorityTypes)].sort(); + priorityTypes = randSeedShuffle(priorityTypes); + } - const newTypes = [ PokemonType.UNKNOWN ]; - let secondType: PokemonType | null = null; - while (secondType === null || secondType === newTypes[0] || originalTypes.includes(secondType)) { - if (priorityTypes.length > 0) { - secondType = priorityTypes.pop() ?? null; - } else { - secondType = randSeedInt(18) as PokemonType; - } - } - newTypes.push(secondType); - - // Apply the type changes (to both base and fusion, if pokemon is fused) - if (!pokemon.customPokemonData) { - pokemon.customPokemonData = new CustomPokemonData(); - } - pokemon.customPokemonData.types = newTypes; - if (pokemon.isFusion()) { - if (!pokemon.fusionCustomPokemonData) { - pokemon.fusionCustomPokemonData = new CustomPokemonData(); - } - pokemon.fusionCustomPokemonData.types = newTypes; + const newTypes = [PokemonType.UNKNOWN]; + let secondType: PokemonType | null = null; + while (secondType === null || secondType === newTypes[0] || originalTypes.includes(secondType)) { + if (priorityTypes.length > 0) { + secondType = priorityTypes.pop() ?? null; + } else { + secondType = randSeedInt(18) as PokemonType; } } - }) - .withOptionPhase(async () => { - leaveEncounterWithoutBattle(true); - }) - .withPostOptionPhase(async () => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, globalScene.getPlayerPokemon()!, globalScene.getPlayerPokemon()); - background.playWithoutTargets(230, 40, 2); - await transitionMysteryEncounterIntroVisuals(true, true, 200); - }) - .build() - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + newTypes.push(secondType); + + // Apply the type changes (to both base and fusion, if pokemon is fused) + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); + } + pokemon.customPokemonData.types = newTypes; + if (pokemon.isFusion()) { + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); + } + pokemon.fusionCustomPokemonData.types = newTypes; + } + } + }) + .withOptionPhase(async () => { + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + await transitionMysteryEncounterIntroVisuals(true, true, 200); + }) + .build(), + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); async function handleSwapAbility() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { await showEncounterDialogue(`${namespace}:option.1.apply_ability_dialogue`, `${namespace}:speaker`); await showEncounterText(`${namespace}:option.1.apply_ability_message`); @@ -415,21 +449,21 @@ function displayYesNoOptions(resolve) { handler: () => { onYesAbilitySwap(resolve); return true; - } + }, }, { label: i18next.t("menu:no"), handler: () => { resolve(false); return true; - } - } + }, + }, ]; const config: OptionSelectConfig = { options: fullOptions, maxOptions: 7, - yOffset: 0 + yOffset: 0, }; globalScene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); } @@ -458,36 +492,36 @@ function generateItemsOfTier(pokemon: PlayerPokemon, numItems: number, tier: Mod // Pools have instances of the modifier type equal to the max stacks that modifier can be applied to any one pokemon // This is to prevent "over-generating" a random item of a certain type during item swaps const ultraPool = [ - [ modifierTypes.REVIVER_SEED, 1 ], - [ modifierTypes.GOLDEN_PUNCH, 5 ], - [ modifierTypes.ATTACK_TYPE_BOOSTER, 99 ], - [ modifierTypes.QUICK_CLAW, 3 ], - [ modifierTypes.WIDE_LENS, 3 ] + [modifierTypes.REVIVER_SEED, 1], + [modifierTypes.GOLDEN_PUNCH, 5], + [modifierTypes.ATTACK_TYPE_BOOSTER, 99], + [modifierTypes.QUICK_CLAW, 3], + [modifierTypes.WIDE_LENS, 3], ]; const roguePool = [ - [ modifierTypes.LEFTOVERS, 4 ], - [ modifierTypes.SHELL_BELL, 4 ], - [ modifierTypes.SOUL_DEW, 10 ], - [ modifierTypes.SCOPE_LENS, 1 ], - [ modifierTypes.BATON, 1 ], - [ modifierTypes.FOCUS_BAND, 5 ], - [ modifierTypes.KINGS_ROCK, 3 ], - [ modifierTypes.GRIP_CLAW, 5 ] + [modifierTypes.LEFTOVERS, 4], + [modifierTypes.SHELL_BELL, 4], + [modifierTypes.SOUL_DEW, 10], + [modifierTypes.SCOPE_LENS, 1], + [modifierTypes.BATON, 1], + [modifierTypes.FOCUS_BAND, 5], + [modifierTypes.KINGS_ROCK, 3], + [modifierTypes.GRIP_CLAW, 5], ]; const berryPool = [ - [ BerryType.APICOT, 3 ], - [ BerryType.ENIGMA, 2 ], - [ BerryType.GANLON, 3 ], - [ BerryType.LANSAT, 3 ], - [ BerryType.LEPPA, 2 ], - [ BerryType.LIECHI, 3 ], - [ BerryType.LUM, 2 ], - [ BerryType.PETAYA, 3 ], - [ BerryType.SALAC, 2 ], - [ BerryType.SITRUS, 2 ], - [ BerryType.STARF, 3 ] + [BerryType.APICOT, 3], + [BerryType.ENIGMA, 2], + [BerryType.GANLON, 3], + [BerryType.LANSAT, 3], + [BerryType.LEPPA, 2], + [BerryType.LIECHI, 3], + [BerryType.LUM, 2], + [BerryType.PETAYA, 3], + [BerryType.SALAC, 2], + [BerryType.SITRUS, 2], + [BerryType.STARF, 3], ]; let pool: any[]; @@ -506,7 +540,7 @@ function generateItemsOfTier(pokemon: PlayerPokemon, numItems: number, tier: Mod const newItemType = pool[randIndex]; let newMod: PokemonHeldItemModifierType; if (tier === "Berries") { - newMod = generateModifierType(modifierTypes.BERRY, [ newItemType[0] ]) as PokemonHeldItemModifierType; + newMod = generateModifierType(modifierTypes.BERRY, [newItemType[0]]) as PokemonHeldItemModifierType; } else { newMod = generateModifierType(newItemType[0]) as PokemonHeldItemModifierType; } diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 88e5794e816..91f168371cf 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -8,8 +8,17 @@ import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter- import { DANCING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { catchPokemon, getEncounterPokemonLevelForWave, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + catchPokemon, + getEncounterPokemonLevelForWave, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { TrainerSlot } from "#app/data/trainer-config"; import type { PlayerPokemon } from "#app/field/pokemon"; @@ -44,7 +53,7 @@ const BAILE_STYLE_BIOMES = [ Biome.WASTELAND, Biome.MOUNTAIN, Biome.BADLANDS, - Biome.DESERT + Biome.DESERT, ]; // Electric form @@ -55,7 +64,7 @@ const POM_POM_STYLE_BIOMES = [ Biome.LABORATORY, Biome.SLUM, Biome.METROPOLIS, - Biome.DOJO + Biome.DOJO, ]; // Psychic form @@ -66,7 +75,7 @@ const PAU_STYLE_BIOMES = [ Biome.PLAINS, Biome.GRASS, Biome.TALL_GRASS, - Biome.FOREST + Biome.FOREST, ]; // Ghost form @@ -77,7 +86,7 @@ const SENSU_STYLE_BIOMES = [ Biome.ABYSS, Biome.GRAVEYARD, Biome.LAKE, - Biome.TEMPLE + Biome.TEMPLE, ]; /** @@ -85,239 +94,259 @@ const SENSU_STYLE_BIOMES = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3823 | GitHub Issue #3823} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DancingLessonsEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DANCING_LESSONS) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // Uses a real Pokemon sprite instead of ME Intro Visuals - .withAnimations(EncounterAnim.DANCE) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withFleeAllowed(false) - .withOnVisualsStart(() => { - const oricorio = globalScene.getEnemyPokemon()!; - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, oricorio, globalScene.getPlayerPokemon()!); - danceAnim.play(false, () => { - if (oricorio.shiny) { - oricorio.sparkle(); - } - }); - return true; - }) - .withIntroDialogue([ - { - text: `${namespace}:intro`, +export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DANCING_LESSONS, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // Uses a real Pokemon sprite instead of ME Intro Visuals + .withAnimations(EncounterAnim.DANCE) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withFleeAllowed(false) + .withOnVisualsStart(() => { + const oricorio = globalScene.getEnemyPokemon()!; + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, oricorio, globalScene.getPlayerPokemon()!); + danceAnim.play(false, () => { + if (oricorio.shiny) { + oricorio.sparkle(); } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; + }); + return true; + }) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - const species = getPokemonSpecies(Species.ORICORIO); - const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const enemyPokemon = new EnemyPokemon(species, level, TrainerSlot.NONE, false); - if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { - if (enemyPokemon.moveset.length < 4) { - enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); - } else { - enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE); - } - } - - // Set the form index based on the biome - // Defaults to Baile style if somehow nothing matches - const currentBiome = globalScene.arena.biomeType; - if (BAILE_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 0; - } else if (POM_POM_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 1; - } else if (PAU_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 2; - } else if (SENSU_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 3; + const species = getPokemonSpecies(Species.ORICORIO); + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const enemyPokemon = new EnemyPokemon(species, level, TrainerSlot.NONE, false); + if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { + if (enemyPokemon.moveset.length < 4) { + enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); } else { - enemyPokemon.formIndex = 0; + enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE); } + } - const oricorioData = new PokemonData(enemyPokemon); - const oricorio = globalScene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, false, oricorioData); + // Set the form index based on the biome + // Defaults to Baile style if somehow nothing matches + const currentBiome = globalScene.arena.biomeType; + if (BAILE_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 0; + } else if (POM_POM_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 1; + } else if (PAU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 2; + } else if (SENSU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 3; + } else { + enemyPokemon.formIndex = 0; + } - // Adds a real Pokemon sprite to the field (required for the animation) - globalScene.getEnemyParty().forEach(enemyPokemon => { - enemyPokemon.leaveField(true, true, true); - }); - globalScene.currentBattle.enemyParty = [ oricorio ]; - globalScene.field.add(oricorio); - // Spawns on offscreen field - oricorio.x -= 300; - encounter.loadAssets.push(oricorio.loadAssets()); + const oricorioData = new PokemonData(enemyPokemon); + const oricorio = globalScene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, false, oricorioData); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Adds a real Pokemon sprite to the field (required for the animation) + for (const enemyPokemon of globalScene.getEnemyParty()) { + enemyPokemon.leaveField(true, true, true); + } + globalScene.currentBattle.enemyParty = [oricorio]; + globalScene.field.add(oricorio); + // Spawns on offscreen field + oricorio.x -= 300; + encounter.loadAssets.push(oricorio.loadAssets()); + + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { species: species, dataSource: oricorioData, isBoss: true, // Gets +1 to all stats except SPD on battle start - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { queueEncounterMessage(`${namespace}:option.1.boss_enraged`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF ], 1)); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF], + 1, + ), + ); + }, + }, + ], + }; + encounter.enemyPartyConfigs = [config]; + encounter.misc = { + oricorioData, + }; + + encounter.setDialogueToken("oricorioName", getPokemonSpecies(Species.ORICORIO).getName()); + + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.REVELATION_DANCE), + ignorePp: true, + }); + + await hideOricorioPokemon(); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.BATON], + fillRemaining: true, + }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Learn its Dance + const encounter = globalScene.currentBattle.mysteryEncounter!; + + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + globalScene.unshiftPhase( + new LearnMovePhase(globalScene.getPlayerParty().indexOf(pokemon), Moves.REVELATION_DANCE), + ); + + // Play animation again to "learn" the dance + const danceAnim = new EncounterBattleAnim( + EncounterAnim.DANCE, + globalScene.getEnemyPokemon()!, + globalScene.getPlayerPokemon(), + ); + danceAnim.play(); + }; + + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + // Learn its Dance + await hideOricorioPokemon(); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Open menu for selecting pokemon with a Dancing move + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return pokemon.moveset + .filter(move => move && DANCING_MOVES.includes(move.getMove().id)) + .map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("selectedMove", move.getName()); + encounter.misc.selectedMove = move; + + return true; + }, + }; + return option; + }); + }; + + // Only challenge legal/unfainted Pokemon that have a Dancing move can be selected + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + if (!pokemon.isAllowedInBattle()) { + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - encounter.misc = { - oricorioData - }; - - encounter.setDialogueToken("oricorioName", getPokemonSpecies(Species.ORICORIO).getName()); - - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withOptionPhase(async () => { - // Pick battle - const encounter = globalScene.currentBattle.mysteryEncounter!; - - encounter.startOfBattleEffects.push({ - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.REVELATION_DANCE), - ignorePp: true - }); - - await hideOricorioPokemon(); - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.BATON ], fillRemaining: true }); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Learn its Dance - const encounter = globalScene.currentBattle.mysteryEncounter!; - - const onPokemonSelected = (pokemon: PlayerPokemon) => { - encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - globalScene.unshiftPhase(new LearnMovePhase(globalScene.getPlayerParty().indexOf(pokemon), Moves.REVELATION_DANCE)); - - // Play animation again to "learn" the dance - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, globalScene.getEnemyPokemon()!, globalScene.getPlayerPokemon()); - danceAnim.play(); - }; - - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - // Learn its Dance - await hideOricorioPokemon(); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Open menu for selecting pokemon with a Dancing move - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for nature selection - return pokemon.moveset - .filter(move => move && DANCING_MOVES.includes(move.getMove().id)) - .map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and second option selected - encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("selectedMove", move.getName()); - encounter.misc.selectedMove = move; - - return true; - }, - }; - return option; - }); - }; - - // Only challenge legal/unfainted Pokemon that have a Dancing move can be selected - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - if (!pokemon.isAllowedInBattle()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; - } - const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); - if (!meetsReqs) { - return getEncounterText(`${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - // Show the Oricorio a dance, and recruit it - const encounter = globalScene.currentBattle.mysteryEncounter!; - const oricorio = encounter.misc.oricorioData.toPokemon(); - oricorio.passive = true; - - // Ensure the Oricorio's moveset gains the Dance move the player used - const move = encounter.misc.selectedMove?.getMove().id; - if (!oricorio.moveset.some(m => m.getMove().id === move)) { - if (oricorio.moveset.length < 4) { - oricorio.moveset.push(new PokemonMove(move)); - } else { - oricorio.moveset[3] = new PokemonMove(move); - } + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; } - await hideOricorioPokemon(); - await catchPokemon(oricorio, null, PokeballType.POKEBALL, false); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .build(); + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Show the Oricorio a dance, and recruit it + const encounter = globalScene.currentBattle.mysteryEncounter!; + const oricorio = encounter.misc.oricorioData.toPokemon(); + oricorio.passive = true; + + // Ensure the Oricorio's moveset gains the Dance move the player used + const move = encounter.misc.selectedMove?.getMove().id; + if (!oricorio.moveset.some(m => m.getMove().id === move)) { + if (oricorio.moveset.length < 4) { + oricorio.moveset.push(new PokemonMove(move)); + } else { + oricorio.moveset[3] = new PokemonMove(move); + } + } + + await hideOricorioPokemon(); + await catchPokemon(oricorio, null, PokeballType.POKEBALL, false); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); function hideOricorioPokemon() { return new Promise(resolve => { @@ -332,7 +361,7 @@ function hideOricorioPokemon() { onComplete: () => { globalScene.field.remove(oricorioSprite, true); resolve(); - } + }, }); }); } diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 6e55566fe8a..6c4c8f26deb 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -9,8 +9,11 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../utils/encounter-phase-utils"; -import { getRandomPlayerPokemon, getRandomSpeciesByStarterCost } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle } from "../utils/encounter-phase-utils"; +import { + getRandomPlayerPokemon, + getRandomSpeciesByStarterCost, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; @@ -93,131 +96,132 @@ const excludedBosses = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3806 | GitHub Issue #3806} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DarkDealEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withIntroSpriteConfigs([ - { - spriteKey: "dark_deal_scientist", - fileRoot: "mystery-encounters", - hasShadow: true, - }, - { - spriteKey: "dark_deal_porygon", - fileRoot: "mystery-encounters", - hasShadow: true, - repeat: true, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party - .withCatchAllowed(true) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected_dialogue`, - }, - { - text: `${namespace}:option.1.selected_message`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens - // Will never return last battle able mon and instead pick fainted/unable to battle - const removedPokemon = getRandomPlayerPokemon(true, false, true); - - // Get all the pokemon's held items - const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); - globalScene.removePokemonFromPlayerParty(removedPokemon); - - const encounter = globalScene.currentBattle.mysteryEncounter!; - encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); - - // Store removed pokemon types - encounter.misc = { - removedTypes: removedPokemon.getTypes(), - modifiers - }; - }) - .withOptionPhase(async () => { - // Give the player 5 Rogue Balls - const encounter = globalScene.currentBattle.mysteryEncounter!; - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.ROGUE_BALL)); - - // Start encounter with random legendary (7-10 starter strength) that has level additive - // If this is a mono-type challenge, always ensure the required type is filtered for - let bossTypes: PokemonType[] = encounter.misc.removedTypes; - const singleTypeChallenges = globalScene.gameMode.challenges.filter(c => c.value && c.id === Challenges.SINGLE_TYPE); - if (globalScene.gameMode.isChallenge && singleTypeChallenges.length > 0) { - bossTypes = singleTypeChallenges.map(c => (c.value - 1) as PokemonType); - } - - const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; - // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ - const roll = randSeedInt(100); - const starterTier: number | [number, number] = - roll >= 65 ? 6 : roll >= 15 ? 7 : roll >= 5 ? 8 : [ 9, 10 ]; - const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterCost(starterTier, excludedBosses, bossTypes)); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - modifierConfigs: bossModifiers.map(m => { - return { - modifier: m, - stackCount: m.getStackCount(), - }; - }) - }; - if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { - pokemonConfig.formIndex = 0; - } - const config: EnemyPartyConfig = { - pokemonConfigs: [ pokemonConfig ], - }; - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, +export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DARK_DEAL, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withIntroSpriteConfigs([ + { + spriteKey: "dark_deal_scientist", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "dark_deal_porygon", + fileRoot: "mystery-encounters", + hasShadow: true, + repeat: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party + .withCatchAllowed(true) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected_dialogue`, + }, + { + text: `${namespace}:option.1.selected_message`, }, ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro` - } - ]) - .build(); + }) + .withPreOptionPhase(async () => { + // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens + // Will never return last battle able mon and instead pick fainted/unable to battle + const removedPokemon = getRandomPlayerPokemon(true, false, true); + + // Get all the pokemon's held items + const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); + globalScene.removePokemonFromPlayerParty(removedPokemon); + + const encounter = globalScene.currentBattle.mysteryEncounter!; + encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); + + // Store removed pokemon types + encounter.misc = { + removedTypes: removedPokemon.getTypes(), + modifiers, + }; + }) + .withOptionPhase(async () => { + // Give the player 5 Rogue Balls + const encounter = globalScene.currentBattle.mysteryEncounter!; + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.ROGUE_BALL)); + + // Start encounter with random legendary (7-10 starter strength) that has level additive + // If this is a mono-type challenge, always ensure the required type is filtered for + let bossTypes: PokemonType[] = encounter.misc.removedTypes; + const singleTypeChallenges = globalScene.gameMode.challenges.filter( + c => c.value && c.id === Challenges.SINGLE_TYPE, + ); + if (globalScene.gameMode.isChallenge && singleTypeChallenges.length > 0) { + bossTypes = singleTypeChallenges.map(c => (c.value - 1) as PokemonType); + } + + const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; + // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ + const roll = randSeedInt(100); + const starterTier: number | [number, number] = roll >= 65 ? 6 : roll >= 15 ? 7 : roll >= 5 ? 8 : [9, 10]; + const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterCost(starterTier, excludedBosses, bossTypes)); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + modifierConfigs: bossModifiers.map(m => { + return { + modifier: m, + stackCount: m.getStackCount(), + }; + }), + }; + if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { + pokemonConfig.formIndex = 0; + } + const config: EnemyPartyConfig = { + pokemonConfigs: [pokemonConfig], + }; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index f382f130540..c1486ff100b 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -2,16 +2,31 @@ import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + CombinationPokemonRequirement, + HeldItemRequirement, + MoneyRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + selectPokemonForOption, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import type { PokemonHeldItemModifier, PokemonInstantReviveModifier } from "#app/modifier/modifier"; -import { BerryModifier, HealingBoosterModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier, PreserveBerryModifier } from "#app/modifier/modifier"; +import { + BerryModifier, + HealingBoosterModifier, + LevelIncrementBoosterModifier, + MoneyMultiplierModifier, + PreserveBerryModifier, +} from "#app/modifier/modifier"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; @@ -27,7 +42,7 @@ import { Species } from "#enums/species"; const namespace = "mysteryEncounters/delibirdy"; /** Berries only */ -const OPTION_2_ALLOWED_MODIFIERS = [ "BerryModifier", "PokemonInstantReviveModifier" ]; +const OPTION_2_ALLOWED_MODIFIERS = ["BerryModifier", "PokemonInstantReviveModifier"]; /** Disallowed items are berries, Reviver Seeds, and Vitamins (form change items and fusion items are not PokemonHeldItemModifiers) */ const OPTION_3_DISALLOWED_MODIFIERS = [ @@ -35,7 +50,7 @@ const OPTION_3_DISALLOWED_MODIFIERS = [ "PokemonInstantReviveModifier", "TerastallizeModifier", "PokemonBaseStatModifier", - "PokemonBaseStatTotalModifier" + "PokemonBaseStatTotalModifier", ]; const DELIBIRDY_MONEY_PRICE_MULTIPLIER = 2; @@ -43,11 +58,11 @@ const DELIBIRDY_MONEY_PRICE_MULTIPLIER = 2; const doEventReward = () => { const event_buff = globalScene.eventManager.getDelibirdyBuff(); if (event_buff.length > 0) { - const candidates = event_buff.filter((c => { + const candidates = event_buff.filter(c => { const mtype = generateModifierType(modifierTypes[c]); const existingCharm = globalScene.findModifier(m => m.type.id === mtype?.id); return !(existingCharm && existingCharm.getStackCount() >= existingCharm.getMaxStackCount()); - })); + }); if (candidates.length > 0) { globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes[randSeedItem(candidates)])); } else { @@ -62,282 +77,308 @@ const doEventReward = () => { * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3804 | GitHub Issue #3804} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DelibirdyEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DELIBIRDY) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER)) // Must have enough money for it to spawn at the very least - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - // Must also have either option 2 or 3 available to spawn - new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), - new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true) - ) - ) - .withIntroSpriteConfigs([ - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - startFrame: 38, - scale: 0.94 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - scale: 1.06 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - startFrame: 65, - x: 1, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - } - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - encounter.setDialogueToken("delibirdName", getPokemonSpecies(Species.DELIBIRD).getName()); +export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DELIBIRDY, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER)) // Must have enough money for it to spawn at the very least + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must also have either option 2 or 3 available to spawn + new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), + new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true), + ), + ) + .withIntroSpriteConfigs([ + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + startFrame: 38, + scale: 0.94, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + scale: 1.06, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + startFrame: 65, + x: 1, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + encounter.setDialogueToken("delibirdName", getPokemonSpecies(Species.DELIBIRD).getName()); - globalScene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3"); - return true; - }) - .withOnVisualsStart(() => { - globalScene.fadeAndSwitchBgm("mystery_encounter_delibirdy"); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER) // Must have money to spawn - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); - return true; - }) - .withOptionPhase(async () => { - // Give the player an Amulet Coin - // Check if the player has max stacks of that item already - const existing = globalScene.findModifier(m => m instanceof MoneyMultiplierModifier) as MoneyMultiplierModifier; + globalScene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3"); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_delibirdy"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER) // Must have money to spawn + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); + return true; + }) + .withOptionPhase(async () => { + // Give the player an Amulet Coin + // Check if the player has max stacks of that item already + const existing = globalScene.findModifier(m => m instanceof MoneyMultiplierModifier) as MoneyMultiplierModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { modifierName: shellBell.name }), + null, + undefined, + true, + ); + doEventReward(); + } else { + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.AMULET_COIN)); + doEventReward(); + } + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:option.2.select_prompt`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has valid item, it can be selected + const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier: BerryModifier | PokemonInstantReviveModifier = encounter.misc.chosenModifier; + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; + + // Give the player a Candy Jar if they gave a Berry, and a Berry Pouch for Reviver Seed + if (modifier instanceof BerryModifier) { + // Check if the player has max stacks of that Candy Jar already + const existing = globalScene.findModifier( + m => m instanceof LevelIncrementBoosterModifier, + ) as LevelIncrementBoosterModifier; if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: shellBell.name, + }), + null, + undefined, + true, + ); doEventReward(); } else { - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.AMULET_COIN)); + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.CANDY_JAR)); doEventReward(); } - - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:option.2.select_prompt`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; - }); - - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc = { - chosenPokemon: pokemon, - chosenModifier: modifier, - }; - return true; - }, - }; - return option; - }); - }; - - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has valid item, it can be selected - const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(pokemon); - if (!meetsReqs) { - return getEncounterText(`${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const modifier: BerryModifier | PokemonInstantReviveModifier = encounter.misc.chosenModifier; - const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - - // Give the player a Candy Jar if they gave a Berry, and a Berry Pouch for Reviver Seed - if (modifier instanceof BerryModifier) { - // Check if the player has max stacks of that Candy Jar already - const existing = globalScene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier; - - if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { - // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); - globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); - doEventReward(); - } else { - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.CANDY_JAR)); - doEventReward(); - } - } else { - // Check if the player has max stacks of that Berry Pouch already - const existing = globalScene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; - - if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { - // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); - globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); - doEventReward(); - } else { - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.BERRY_POUCH)); - doEventReward(); - } - } - - chosenPokemon.loseHeldItem(modifier, false); - - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; - }); - - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc = { - chosenPokemon: pokemon, - chosenModifier: modifier, - }; - return true; - }, - }; - return option; - }); - }; - - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has valid item, it can be selected - const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); - if (!meetsReqs) { - return getEncounterText(`${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const modifier = encounter.misc.chosenModifier; - const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - - // Check if the player has max stacks of Healing Charm already - const existing = globalScene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; + } else { + // Check if the player has max stacks of that Berry Pouch already + const existing = globalScene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(globalScene.getPlayerParty()[0], shellBell); + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: shellBell.name, + }), + null, + undefined, + true, + ); doEventReward(); } else { - globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.HEALING_CHARM)); + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.BERRY_POUCH)); doEventReward(); } + } - chosenPokemon.loseHeldItem(modifier, false); + chosenPokemon.loseHeldItem(modifier, false); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .build(); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return ( + !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable + ); + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has valid item, it can be selected + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier = encounter.misc.chosenModifier; + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; + + // Check if the player has max stacks of Healing Charm already + const existing = globalScene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerParty()[0], shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { modifierName: shellBell.name }), + null, + undefined, + true, + ); + doEventReward(); + } else { + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.HEALING_CHARM)); + doEventReward(); + } + + chosenPokemon.loseHeldItem(modifier, false); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts index b2bc13ca744..9b8e2e24d12 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -8,9 +8,7 @@ import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { - MysteryEncounterBuilder, -} from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -22,145 +20,158 @@ const namespace = "mysteryEncounters/departmentStoreSale"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3797 | GitHub Issue #3797} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DepartmentStoreSaleEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) - .withIntroSpriteConfigs([ - { - spriteKey: "department_store_sale_lady", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -20, - }, - { - spriteKey: "", - fileRoot: "", - species: Species.FURFROU, - hasShadow: true, - repeat: true, - x: 30, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .withAutoHideIntroVisuals(false) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - }, - async () => { - // Choose TMs - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 5) { - // 2/2/1 weight on TM rarity - const roll = randSeedInt(5); - if (roll < 2) { - modifiers.push(modifierTypes.TM_COMMON); - } else if (roll < 4) { - modifiers.push(modifierTypes.TM_GREAT); - } else { - modifiers.push(modifierTypes.TM_ULTRA); - } - i++; +export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DEPARTMENT_STORE_SALE, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) + .withIntroSpriteConfigs([ + { + spriteKey: "department_store_sale_lady", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -20, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.FURFROU, + hasShadow: true, + repeat: true, + x: 30, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withAutoHideIntroVisuals(false) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + }, + async () => { + // Choose TMs + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 5) { + // 2/2/1 weight on TM rarity + const roll = randSeedInt(5); + if (roll < 2) { + modifiers.push(modifierTypes.TM_COMMON); + } else if (roll < 4) { + modifiers.push(modifierTypes.TM_GREAT); + } else { + modifiers.push(modifierTypes.TM_ULTRA); } - - setEncounterRewards({ guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - }, - async () => { - // Choose Vitamins - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 3) { - // 2/1 weight on base stat booster vs PP Up - const roll = randSeedInt(3); - if (roll === 0) { - modifiers.push(modifierTypes.PP_UP); - } else { - modifiers.push(modifierTypes.BASE_STAT_BOOSTER); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }, + async () => { + // Choose Vitamins + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + modifiers.push(modifierTypes.BASE_STAT_BOOSTER); } - - setEncounterRewards({ guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - }, - async () => { - // Choose X Items - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 5) { - // 4/1 weight on base stat booster vs Dire Hit - const roll = randSeedInt(5); - if (roll === 0) { - modifiers.push(modifierTypes.DIRE_HIT); - } else { - modifiers.push(modifierTypes.TEMP_STAT_STAGE_BOOSTER); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + }, + async () => { + // Choose X Items + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 5) { + // 4/1 weight on base stat booster vs Dire Hit + const roll = randSeedInt(5); + if (roll === 0) { + modifiers.push(modifierTypes.DIRE_HIT); + } else { + modifiers.push(modifierTypes.TEMP_STAT_STAGE_BOOSTER); } - - setEncounterRewards({ guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - }, - async () => { - // Choose Pokeballs - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 4) { - // 10/30/20/5 weight on pokeballs - const roll = randSeedInt(65); - if (roll < 10) { - modifiers.push(modifierTypes.POKEBALL); - } else if (roll < 40) { - modifiers.push(modifierTypes.GREAT_BALL); - } else if (roll < 60) { - modifiers.push(modifierTypes.ULTRA_BALL); - } else { - modifiers.push(modifierTypes.ROGUE_BALL); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + }, + async () => { + // Choose Pokeballs + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 4) { + // 10/30/20/5 weight on pokeballs + const roll = randSeedInt(65); + if (roll < 10) { + modifiers.push(modifierTypes.POKEBALL); + } else if (roll < 40) { + modifiers.push(modifierTypes.GREAT_BALL); + } else if (roll < 60) { + modifiers.push(modifierTypes.ULTRA_BALL); + } else { + modifiers.push(modifierTypes.ROGUE_BALL); } + i++; + } - setEncounterRewards({ guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(); - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - } - ]) - .build(); + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 0e5d6ff87bc..a1964aa5ab4 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,6 +1,12 @@ import { MoveCategory } from "#enums/MoveCategory"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierTypeOption, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; @@ -22,180 +28,187 @@ const namespace = "mysteryEncounters/fieldTrip"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3794 | GitHub Issue #3794} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieldTripEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) - .withIntroSpriteConfigs([ - { - spriteKey: "preschooler_m", - fileRoot: "trainer", - hasShadow: true, - }, - { - spriteKey: "field_trip_teacher", - fileRoot: "mystery-encounters", - hasShadow: true, - }, - { - spriteKey: "preschooler_f", - fileRoot: "trainer", - hasShadow: true, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .withAutoHideIntroVisuals(false) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:physical`)); - pokemonAndMoveChosen(pokemon, move, MoveCategory.PHYSICAL); - return true; - }, - }; - return option; - }); - }; +export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIELD_TRIP, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) + .withIntroSpriteConfigs([ + { + spriteKey: "preschooler_m", + fileRoot: "trainer", + hasShadow: true, + }, + { + spriteKey: "field_trip_teacher", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "preschooler_f", + fileRoot: "trainer", + hasShadow: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withAutoHideIntroVisuals(false) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:physical`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.PHYSICAL); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.ATK ])!, - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.DEF ])!, - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(modifierTypes.DIRE_HIT)!, - generateModifierTypeOption(modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.ATK])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.DEF])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.DIRE_HIT)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards({ guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(!encounter.misc.correctMove); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:special`)); - pokemonAndMoveChosen(pokemon, move, MoveCategory.SPECIAL); - return true; - }, - }; - return option; - }); - }; + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:special`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.SPECIAL); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPATK ])!, - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPDEF ])!, - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(modifierTypes.DIRE_HIT)!, - generateModifierTypeOption(modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPATK])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPDEF])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.DIRE_HIT)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards({ guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(!encounter.misc.correctMove); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:status`)); - pokemonAndMoveChosen(pokemon, move, MoveCategory.STATUS); - return true; - }, - }; - return option; - }); - }; + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:status`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.STATUS); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.ACC ])!, - generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(modifierTypes.GREAT_BALL)!, - generateModifierTypeOption(modifierTypes.IV_SCANNER)!, - generateModifierTypeOption(modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.ACC])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.GREAT_BALL)!, + generateModifierTypeOption(modifierTypes.IV_SCANNER)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards({ guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(!encounter.misc.correctMove); - }) - .build() - ) - .build(); + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .build(); function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correctMoveCategory: MoveCategory) { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -215,7 +228,10 @@ function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correct text: `${namespace}:incorrect_exp`, }, ]; - setEncounterExp(globalScene.getPlayerParty().map((p) => p.id), 50); + setEncounterExp( + globalScene.getPlayerParty().map(p => p.id), + 50, + ); } else { encounter.selectedOption!.dialogue!.selected = [ { @@ -229,7 +245,7 @@ function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correct text: `${namespace}:correct_exp`, }, ]; - setEncounterExp([ pokemon.id ], 100); + setEncounterExp([pokemon.id], 100); } encounter.misc = { correctMove: correctMove, diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 1f425dc9ea9..d9bd6983d97 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,13 +1,25 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + loadCustomMovesForEncounter, + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + generateModifierType, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; -import { modifierTypes, } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { AbilityRequirement, CombinationPokemonRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + AbilityRequirement, + CombinationPokemonRequirement, + TypeRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Gender } from "#app/data/gender"; @@ -21,7 +33,11 @@ import { WeatherType } from "#enums/weather-type"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { StatusEffect } from "#enums/status-effect"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyAbilityOverrideToPokemon, applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyAbilityOverrideToPokemon, + applyDamageToPokemon, + applyModifierTypeToPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { EncounterAnim } from "#enums/encounter-anims"; @@ -48,216 +64,230 @@ const DAMAGE_PERCENTAGE: number = 20; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3814 | GitHub Issue #3814} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieryFalloutEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(40, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withCatchAllowed(true) - .withIntroSpriteConfigs([]) // Set in onInit() - .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) - .withAutoHideIntroVisuals(false) - .withFleeAllowed(false) - .withIntroDialogue([ +export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIERY_FALLOUT, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(40, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withCatchAllowed(true) + .withIntroSpriteConfigs([]) // Set in onInit() + .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) + .withAutoHideIntroVisuals(false) + .withFleeAllowed(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Calculate boss mons + const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { + species: volcaronaSpecies, + isBoss: false, + gender: Gender.MALE, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF, Stat.SPD], 1), + ); + }, + }, + { + species: volcaronaSpecies, + isBoss: false, + gender: Gender.FEMALE, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF, Stat.SPD], 1), + ); + }, + }, + ], + doubleBattle: true, + disableSwitch: true, + }; + encounter.enemyPartyConfigs = [config]; + + // Load hidden Volcarona sprites + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: "", + fileRoot: "", + species: Species.VOLCARONA, + repeat: true, + hidden: true, + hasShadow: true, + x: -20, + startFrame: 20, }, - ]) - .withOnInit(() => { + { + spriteKey: "", + fileRoot: "", + species: Species.VOLCARONA, + repeat: true, + hidden: true, + hasShadow: true, + x: 20, + }, + ]; + + // Load animations/sfx for Volcarona moves + loadCustomMovesForEncounter([Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); + + globalScene.arena.trySetWeather(WeatherType.SUNNY, true); + + encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName()); + + return true; + }) + .withOnVisualsStart(() => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.MAGMA_BG, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(200, 70, 2, 3); + const animation = new EncounterBattleAnim( + EncounterAnim.MAGMA_SPOUT, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + animation.playWithoutTargets(80, 100, 2); + globalScene.time.delayedCall(600, () => { + animation.playWithoutTargets(-20, 100, 2); + }); + globalScene.time.delayedCall(1200, () => { + animation.playWithoutTargets(140, 150, 2); + }); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle const encounter = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ fillRemaining: true }, undefined, () => giveLeadPokemonAttackTypeBoostItem()); - // Calculate boss mons - const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); - const config: EnemyPartyConfig = { - pokemonConfigs: [ - { - species: volcaronaSpecies, - isBoss: false, - gender: Gender.MALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); - } - }, - { - species: volcaronaSpecies, - isBoss: false, - gender: Gender.FEMALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); - } - } - ], - doubleBattle: true, - disableSwitch: true, - }; - encounter.enemyPartyConfigs = [ config ]; - - // Load hidden Volcarona sprites - encounter.spriteConfigs = [ + encounter.startOfBattleEffects.push( { - spriteKey: "", - fileRoot: "", - species: Species.VOLCARONA, - repeat: true, - hidden: true, - hasShadow: true, - x: -20, - startFrame: 20 + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true, }, { - spriteKey: "", - fileRoot: "", - species: Species.VOLCARONA, - repeat: true, - hidden: true, - hasShadow: true, - x: 20 + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true, }, - ]; + ); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof + const encounter = globalScene.currentBattle.mysteryEncounter!; + const nonFireTypes = globalScene + .getPlayerParty() + .filter(p => p.isAllowedInBattle() && !p.getTypes().includes(PokemonType.FIRE)); - // Load animations/sfx for Volcarona moves - loadCustomMovesForEncounter([ Moves.FIRE_SPIN, Moves.QUIVER_DANCE ]); + for (const pkm of nonFireTypes) { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + applyDamageToPokemon(pkm, damage); + } - globalScene.arena.trySetWeather(WeatherType.SUNNY, true); + // Burn random member + const burnable = nonFireTypes.filter( + p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status.effect === StatusEffect.NONE, + ); + if (burnable?.length > 0) { + const roll = randSeedInt(burnable.length); + const chosenPokemon = burnable[roll]; + if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { + // Burn applied + encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); + encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name); + queueEncounterMessage(`${namespace}:option.2.target_burned`); - encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName()); + // Also permanently change the burned Pokemon's ability to Heatproof + applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF); + } + } - return true; - }) - .withOnVisualsStart(() => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, globalScene.getPlayerPokemon()!, globalScene.getPlayerPokemon()); - background.playWithoutTargets(200, 70, 2, 3); - const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, globalScene.getPlayerPokemon()!, globalScene.getPlayerPokemon()); - animation.playWithoutTargets(80, 100, 2); - globalScene.time.delayedCall(600, () => { - animation.playWithoutTargets(-20, 100, 2); - }); - globalScene.time.delayedCall(1200, () => { - animation.playWithoutTargets(140, 150, 2); - }); - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + // No rewards + leaveEncounterWithoutBattle(true); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new TypeRequirement(PokemonType.FIRE, true, 1), + new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true), + ), + ) // Will set option3PrimaryName dialogue token automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.3.selected`, }, ], - }, - async () => { - // Pick battle + }) + .withPreOptionPhase(async () => { + // Do NOT await this, to prevent player from repeatedly pressing options + transitionMysteryEncounterIntroVisuals(false, false, 2000); + }) + .withOptionPhase(async () => { + // Fire types help calm the Volcarona const encounter = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards({ fillRemaining: true }, undefined, () => giveLeadPokemonAttackTypeBoostItem()); + await transitionMysteryEncounterIntroVisuals(); + setEncounterRewards({ fillRemaining: true }, undefined, () => { + giveLeadPokemonAttackTypeBoostItem(); + }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER_2 ], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true - }); - await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof - const encounter = globalScene.currentBattle.mysteryEncounter!; - const nonFireTypes = globalScene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(PokemonType.FIRE)); + const primary = encounter.options[2].primaryPokemon!; - for (const pkm of nonFireTypes) { - const percentage = DAMAGE_PERCENTAGE / 100; - const damage = Math.floor(pkm.getMaxHp() * percentage); - applyDamageToPokemon(pkm, damage); - } - - // Burn random member - const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status.effect === StatusEffect.NONE); - if (burnable?.length > 0) { - const roll = randSeedInt(burnable.length); - const chosenPokemon = burnable[roll]; - if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { - // Burn applied - encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); - encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name); - queueEncounterMessage(`${namespace}:option.2.target_burned`); - - // Also permanently change the burned Pokemon's ability to Heatproof - applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF); - } - } - - // No rewards - leaveEncounterWithoutBattle(true); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - new TypeRequirement(PokemonType.FIRE, true, 1), - new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true) - ) - ) // Will set option3PrimaryName dialogue token automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Do NOT await this, to prevent player from repeatedly pressing options - transitionMysteryEncounterIntroVisuals(false, false, 2000); - }) - .withOptionPhase(async () => { - // Fire types help calm the Volcarona - const encounter = globalScene.currentBattle.mysteryEncounter!; - await transitionMysteryEncounterIntroVisuals(); - setEncounterRewards( - { fillRemaining: true }, - undefined, - () => { - giveLeadPokemonAttackTypeBoostItem(); - }); - - const primary = encounter.options[2].primaryPokemon!; - - setEncounterExp([ primary.id ], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .build(); + setEncounterExp([primary.id], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .build(); function giveLeadPokemonAttackTypeBoostItem() { // Give first party pokemon attack type boost item for free at end of battle @@ -266,7 +296,9 @@ function giveLeadPokemonAttackTypeBoostItem() { // Generate type booster held item, default to Charcoal if item fails to generate let boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER) as AttackTypeBoosterModifierType; if (!boosterModifierType) { - boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.FIRE ]) as AttackTypeBoosterModifierType; + boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.FIRE, + ]) as AttackTypeBoosterModifierType; } applyModifierTypeToPlayerPokemon(leadPokemon, boosterModifierType); diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index 1667a15e7c9..595d13cf727 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -1,18 +1,16 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import type { - EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getRandomEncounterSpecies, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, - setEncounterRewards + setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import type Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import type { - ModifierTypeOption } from "#app/modifier/modifier-type"; +import type { ModifierTypeOption } from "#app/modifier/modifier-type"; import { getPlayerModifierTypeOptions, ModifierPoolType, @@ -25,7 +23,11 @@ import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-en import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { getEncounterPokemonLevelForWave, getSpriteKeysFromPokemon, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + getEncounterPokemonLevelForWave, + getSpriteKeysFromPokemon, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { BattlerTagType } from "#enums/battler-tag-type"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -41,152 +43,163 @@ const namespace = "mysteryEncounters/fightOrFlight"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3795 | GitHub Issue #3795} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FightOrFlightEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIGHT_OR_FLIGHT, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossPokemon = getRandomEncounterSpecies(level, true); - encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender()); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Calculate boss mon + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossPokemon = getRandomEncounterSpecies(level, true); + encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender()); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, species: bossPokemon.species, dataSource: new PokemonData(bossPokemon), isBoss: true, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { queueEncounterMessage(`${namespace}:option.1.stat_boost`); // Randomly boost 1 stat 2 stages // Cannot boost Spd, Acc, or Evasion - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ randSeedInt(4, 1) ], 2)); - } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - // Calculate item - // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER - const tier = - globalScene.currentBattle.waveIndex > 160 - ? ModifierTier.MASTER - : globalScene.currentBattle.waveIndex > 120 - ? ModifierTier.ROGUE - : globalScene.currentBattle.waveIndex > 40 - ? ModifierTier.ULTRA - : ModifierTier.GREAT; - regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); - let item: ModifierTypeOption | null = null; - // TMs and Candy Jar excluded from possible rewards as they're too swingy in value for a singular item reward - while (!item || item.type.id.includes("TM_") || item.type.id === "CANDY_JAR") { - item = getPlayerModifierTypeOptions(1, globalScene.getPlayerParty(), [], { guaranteedModifierTiers: [ tier ], allowLuckUpgrades: false })[0]; - } - encounter.setDialogueToken("itemName", item.type.name); - encounter.misc = item; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); - encounter.spriteConfigs = [ - { - spriteKey: item.type.iconImage, - fileRoot: "items", - hasShadow: false, - x: 35, - y: -5, - scale: 0.75, - isItem: true, - disableAnimation: true + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [randSeedInt(4, 1)], 2)); + }, }, - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - isPokemon: true, - isShiny: bossPokemon.shiny, - variant: bossPokemon.variant - }, - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + // Calculate item + // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER + const tier = + globalScene.currentBattle.waveIndex > 160 + ? ModifierTier.MASTER + : globalScene.currentBattle.waveIndex > 120 + ? ModifierTier.ROGUE + : globalScene.currentBattle.waveIndex > 40 + ? ModifierTier.ULTRA + : ModifierTier.GREAT; + regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); + let item: ModifierTypeOption | null = null; + // TMs and Candy Jar excluded from possible rewards as they're too swingy in value for a singular item reward + while (!item || item.type.id.includes("TM_") || item.type.id === "CANDY_JAR") { + item = getPlayerModifierTypeOptions(1, globalScene.getPlayerParty(), [], { + guaranteedModifierTiers: [tier], + allowLuckUpgrades: false, + })[0]; + } + encounter.setDialogueToken("itemName", item.type.name); + encounter.misc = item; + + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + spriteKey: item.type.iconImage, + fileRoot: "items", + hasShadow: false, + x: 35, + y: -5, + scale: 0.75, + isItem: true, + disableAnimation: true, + }, + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + // Pokemon will randomly boost 1 stat by 2 stages + const item = globalScene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.2.selected`, }, ], - }, - async () => { - // Pick battle - // Pokemon will randomly boost 1 stat by 2 stages + }) + .withOptionPhase(async () => { + // Pick steal + const encounter = globalScene.currentBattle.mysteryEncounter!; const item = globalScene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; - setEncounterRewards({ guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); - await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected` - } - ] - }) - .withOptionPhase(async () => { - // Pick steal - const encounter = globalScene.currentBattle.mysteryEncounter!; - const item = globalScene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; - setEncounterRewards({ guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); - // Use primaryPokemon to execute the thievery - const primaryPokemon = encounter.options[1].primaryPokemon!; - setEncounterExp(primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + // Use primaryPokemon to execute the thievery + const primaryPokemon = encounter.options[1].primaryPokemon!; + setEncounterExp(primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts index 287376f8bd0..c95810b94d0 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -1,4 +1,10 @@ -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; @@ -35,64 +41,65 @@ const namespace = "mysteryEncounters/funAndGames"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3819 | GitHub Issue #3819} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FunAndGamesEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FUN_AND_GAMES) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play - .withAutoHideIntroVisuals(false) - // The Wobbuffet won't use moves - .withSkipEnemyBattleTurns(true) - // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu - .withSkipToFightInput(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "fun_and_games_game", - fileRoot: "mystery-encounters", - hasShadow: false, - x: 0, - y: 6, - }, - { - spriteKey: "fun_and_games_wobbuffet", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -28, - y: 6, - yShadow: 6 - }, - { - spriteKey: "fun_and_games_man", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 40, - y: 6, - yShadow: 6 - }, - ]) - .withIntroDialogue([ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - globalScene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3"); - encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(Species.WOBBUFFET).getName()); - return true; - }) - .withOnVisualsStart(() => { - globalScene.fadeAndSwitchBgm("mystery_encounter_fun_and_games"); - return true; - }) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) +export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FUN_AND_GAMES, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play + .withAutoHideIntroVisuals(false) + // The Wobbuffet won't use moves + .withSkipEnemyBattleTurns(true) + // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu + .withSkipToFightInput(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "fun_and_games_game", + fileRoot: "mystery-encounters", + hasShadow: false, + x: 0, + y: 6, + }, + { + spriteKey: "fun_and_games_wobbuffet", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -28, + y: 6, + yShadow: 6, + }, + { + spriteKey: "fun_and_games_man", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 40, + y: 6, + yShadow: 6, + }, + ]) + .withIntroDialogue([ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + globalScene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3"); + encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(Species.WOBBUFFET).getName()); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_fun_and_games"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -127,7 +134,11 @@ export const FunAndGamesEncounter: MysteryEncounter = // Update money const moneyCost = (encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney; updatePlayerMoney(-moneyCost, true, false); - await showEncounterText(i18next.t("mysteryEncounterMessages:paid_money", { amount: moneyCost })); + await showEncounterText( + i18next.t("mysteryEncounterMessages:paid_money", { + amount: moneyCost, + }), + ); // Handlers for battle events encounter.onTurnStart = handleNextTurn; // triggered during TurnInitPhase @@ -139,28 +150,29 @@ export const FunAndGamesEncounter: MysteryEncounter = return true; }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - await transitionMysteryEncounterIntroVisuals(true, true); - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + await transitionMysteryEncounterIntroVisuals(true, true); + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); async function summonPlayerPokemon() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -176,9 +188,15 @@ async function summonPlayerPokemon() { // Do trainer summon animation let playerAnimationPromise: Promise | undefined; - globalScene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(playerPokemon) })); + globalScene.ui.showText( + i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(playerPokemon), + }), + ); globalScene.pbTray.hide(); - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); globalScene.time.delayedCall(562, () => { globalScene.trainer.setFrame("2"); globalScene.time.delayedCall(64, () => { @@ -189,7 +207,7 @@ async function summonPlayerPokemon() { targets: globalScene.trainer, x: -36, duration: 1000, - onComplete: () => globalScene.trainer.setVisible(false) + onComplete: () => globalScene.trainer.setVisible(false), }); globalScene.time.delayedCall(750, () => { playerAnimationPromise = summonPlayerPokemonAnimation(playerPokemon); @@ -198,8 +216,14 @@ async function summonPlayerPokemon() { // Also loads Wobbuffet data (cannot be shiny) const enemySpecies = getPokemonSpecies(Species.WOBBUFFET); globalScene.currentBattle.enemyParty = []; - const wobbuffet = globalScene.addEnemyPokemon(enemySpecies, encounter.misc.playerPokemon.level, TrainerSlot.NONE, false, true); - wobbuffet.ivs = [ 0, 0, 0, 0, 0, 0 ]; + const wobbuffet = globalScene.addEnemyPokemon( + enemySpecies, + encounter.misc.playerPokemon.level, + TrainerSlot.NONE, + false, + true, + ); + wobbuffet.ivs = [0, 0, 0, 0, 0, 0]; wobbuffet.setNature(Nature.MILD); wobbuffet.setAlpha(0); wobbuffet.setVisible(false); @@ -219,6 +243,7 @@ async function summonPlayerPokemon() { } function handleLoseMinigame() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { // Check Wobbuffet is still alive const wobbuffet = globalScene.getEnemyPokemon(); @@ -258,15 +283,24 @@ function handleNextTurn() { let isHealPhase = false; if (healthRatio < 0.03) { // Grand prize - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.MULTI_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.MULTI_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:best_result`; } else if (healthRatio < 0.15) { // 2nd prize - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.SCOPE_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SCOPE_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:great_result`; } else if (healthRatio < 0.33) { // 3rd prize - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.WIDE_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.WIDE_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:good_result`; } else { // No prize @@ -286,14 +320,13 @@ function handleNextTurn() { // Skip remainder of TurnInitPhase return true; - } else { - if (encounter.misc.turnsRemaining < 3) { - // Display charging messages on turns that aren't the initial turn - queueEncounterMessage(`${namespace}:charging_continue`); - } - queueEncounterMessage(`${namespace}:turn_remaining_${encounter.misc.turnsRemaining}`); - encounter.misc.turnsRemaining--; } + if (encounter.misc.turnsRemaining < 3) { + // Display charging messages on turns that aren't the initial turn + queueEncounterMessage(`${namespace}:charging_continue`); + } + queueEncounterMessage(`${namespace}:turn_remaining_${encounter.misc.turnsRemaining}`); + encounter.misc.turnsRemaining--; // Don't skip remainder of TurnInitPhase return false; @@ -336,7 +369,7 @@ function summonPlayerPokemonAnimation(pokemon: PlayerPokemon): Promise { globalScene.tweens.add({ targets: pokeball, duration: 650, - x: 100 + fpOffset[0] + x: 100 + fpOffset[0], }); globalScene.tweens.add({ @@ -387,11 +420,11 @@ function summonPlayerPokemonAnimation(pokemon: PlayerPokemon): Promise { globalScene.pushPhase(new PostSummonPhase(pokemon.getBattlerIndex())); resolve(); }); - } + }, }); - } + }, }); - } + }, }); }); } @@ -408,14 +441,14 @@ function hideShowmanIntroSprite() { y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); // Slide the Wobbuffet and Game over slightly globalScene.tweens.add({ - targets: [ wobbuffet, carnivalGame ], + targets: [wobbuffet, carnivalGame], x: "+=16", ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } 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 f494aaf2c28..a81392941ba 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -1,9 +1,17 @@ -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { TrainerSlot, } from "#app/data/trainer-config"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { TrainerSlot } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MusicPreference } from "#app/system/settings/settings"; import type { ModifierTypeOption } from "#app/modifier/modifier-type"; -import { getPlayerModifierTypeOptions, ModifierPoolType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { + getPlayerModifierTypeOptions, + ModifierPoolType, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; @@ -20,7 +28,12 @@ import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier, ShinyRateBoosterModifier, SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { + HiddenAbilityRateBoosterModifier, + PokemonFormChangeItemModifier, + ShinyRateBoosterModifier, + SpeciesStatBoosterModifier, +} from "#app/modifier/modifier"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import PokemonData from "#app/system/pokemon-data"; import i18next from "i18next"; @@ -43,15 +56,15 @@ const WONDER_TRADE_SHINY_CHANCE = 512; const MAX_WONDER_TRADE_SHINY_CHANCE = 4096; const LEGENDARY_TRADE_POOLS = { - 1: [ Species.RATTATA, Species.PIDGEY, Species.WEEDLE ], - 2: [ Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA ], - 3: [ Species.POOCHYENA, Species.ZIGZAGOON, Species.TAILLOW ], - 4: [ Species.BIDOOF, Species.STARLY, Species.KRICKETOT ], - 5: [ Species.PATRAT, Species.PURRLOIN, Species.PIDOVE ], - 6: [ Species.BUNNELBY, Species.LITLEO, Species.SCATTERBUG ], - 7: [ Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF ], - 8: [ Species.SKWOVET, Species.WOOLOO, Species.ROOKIDEE ], - 9: [ Species.LECHONK, Species.FIDOUGH, Species.TAROUNTULA ] + 1: [Species.RATTATA, Species.PIDGEY, Species.WEEDLE], + 2: [Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA], + 3: [Species.POOCHYENA, Species.ZIGZAGOON, Species.TAILLOW], + 4: [Species.BIDOOF, Species.STARLY, Species.KRICKETOT], + 5: [Species.PATRAT, Species.PURRLOIN, Species.PIDOVE], + 6: [Species.BUNNELBY, Species.LITLEO, Species.SCATTERBUG], + 7: [Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF], + 8: [Species.SKWOVET, Species.WOOLOO, Species.ROOKIDEE], + 9: [Species.LECHONK, Species.FIDOUGH, Species.TAROUNTULA], }; /** Exclude Paradox mons as they aren't considered legendary/mythical */ @@ -75,7 +88,7 @@ const EXCLUDED_TRADE_SPECIES = [ Species.IRON_VALIANT, Species.IRON_LEAVES, Species.IRON_BOULDER, - Species.IRON_CROWN + Species.IRON_CROWN, ]; /** @@ -83,363 +96,405 @@ const EXCLUDED_TRADE_SPECIES = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3812 | GitHub Issue #3812} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const GlobalTradeSystemEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.GLOBAL_TRADE_SYSTEM) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "global_trade_system", - fileRoot: "mystery-encounters", - hasShadow: true, - disableAnimation: true, - x: 3, - y: 5, - yShadow: 1 - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.GLOBAL_TRADE_SYSTEM, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "global_trade_system", + fileRoot: "mystery-encounters", + hasShadow: true, + disableAnimation: true, + x: 3, + y: 5, + yShadow: 1, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Load bgm - let bgmKey: string; - if (globalScene.musicPreference === MusicPreference.GENFIVE) { - bgmKey = "mystery_encounter_gen_5_gts"; - globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); - } else { - // Mixed option - bgmKey = "mystery_encounter_gen_6_gts"; - globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); - } + // Load bgm + let bgmKey: string; + if (globalScene.musicPreference === MusicPreference.GENFIVE) { + bgmKey = "mystery_encounter_gen_5_gts"; + globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); + } else { + // Mixed option + bgmKey = "mystery_encounter_gen_6_gts"; + globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); + } - // Load possible trade options - // Maps current party member's id to 3 EnemyPokemon objects - // None of the trade options can be the same species - const tradeOptionsMap: Map = getPokemonTradeOptions(); - encounter.misc = { - tradeOptionsMap, - bgmKey - }; + // Load possible trade options + // Maps current party member's id to 3 EnemyPokemon objects + // None of the trade options can be the same species + const tradeOptionsMap: Map = getPokemonTradeOptions(); + encounter.misc = { + tradeOptionsMap, + bgmKey, + }; - return true; - }) - .withOnVisualsStart(() => { - globalScene.fadeAndSwitchBgm(globalScene.currentBattle.mysteryEncounter!.misc.bgmKey); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get the trade species options for the selected pokemon - const tradeOptionsMap: Map = encounter.misc.tradeOptionsMap; - const tradeOptions = tradeOptionsMap.get(pokemon.id); - if (!tradeOptions) { - return []; - } - - return tradeOptions.map((tradePokemon: EnemyPokemon) => { - const option: OptionSelectItem = { - label: tradePokemon.getNameToRender(), - handler: () => { - // Pokemon trade selected - encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("received", tradePokemon.getNameToRender()); - encounter.misc.tradedPokemon = pokemon; - encounter.misc.receivedPokemon = tradePokemon; - return true; - }, - onHover: () => { - const formName = tradePokemon.species.forms && tradePokemon.species.forms.length > tradePokemon.formIndex ? tradePokemon.species.forms[tradePokemon.formIndex].formName : null; - const line1 = i18next.t("pokemonInfoContainer:ability") + " " + tradePokemon.getAbility().name + (tradePokemon.getGender() !== Gender.GENDERLESS ? " | " + i18next.t("pokemonInfoContainer:gender") + " " + getGenderSymbol(tradePokemon.getGender()) : ""); - const line2 = i18next.t("pokemonInfoContainer:nature") + " " + getNatureName(tradePokemon.getNature()) + (formName ? " | " + i18next.t("pokemonInfoContainer:form") + " " + formName : ""); - showEncounterText(`${line1}\n${line2}`, 0, 0, false); - }, - }; - return option; - }); - }; - - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; - const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; - const modifiers = tradedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - - // Remove the original party member from party - globalScene.removePokemonFromPlayerParty(tradedPokemon, false); - - // Set data properly, then generate the new Pokemon's assets - receivedPokemonData.passive = tradedPokemon.passive; - // Pokeball to Ultra ball, randomly - receivedPokemonData.pokeball = randInt(4) as PokeballType; - const dataSource = new PokemonData(receivedPokemonData); - const newPlayerPokemon = globalScene.addPlayerPokemon(receivedPokemonData.species, receivedPokemonData.level, dataSource.abilityIndex, dataSource.formIndex, dataSource.gender, dataSource.shiny, dataSource.variant, dataSource.ivs, dataSource.nature, dataSource); - globalScene.getPlayerParty().push(newPlayerPokemon); - await newPlayerPokemon.loadAssets(); - - for (const mod of modifiers) { - mod.pokemonId = newPlayerPokemon.id; - globalScene.addModifier(mod, true, false, false, true); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm(globalScene.currentBattle.mysteryEncounter!.misc.bgmKey); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get the trade species options for the selected pokemon + const tradeOptionsMap: Map = encounter.misc.tradeOptionsMap; + const tradeOptions = tradeOptionsMap.get(pokemon.id); + if (!tradeOptions) { + return []; } - // Show the trade animation - await showTradeBackground(); - await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); - await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); - globalScene.playBgm(encounter.misc.bgmKey); - await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); - await hideTradeBackground(); - tradedPokemon.destroy(); + return tradeOptions.map((tradePokemon: EnemyPokemon) => { + const option: OptionSelectItem = { + label: tradePokemon.getNameToRender(), + handler: () => { + // Pokemon trade selected + encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("received", tradePokemon.getNameToRender()); + encounter.misc.tradedPokemon = pokemon; + encounter.misc.receivedPokemon = tradePokemon; + return true; + }, + onHover: () => { + const formName = + tradePokemon.species.forms && tradePokemon.species.forms.length > tradePokemon.formIndex + ? tradePokemon.species.forms[tradePokemon.formIndex].formName + : null; + const line1 = `${i18next.t("pokemonInfoContainer:ability")} ${tradePokemon.getAbility().name}${ + tradePokemon.getGender() !== Gender.GENDERLESS + ? ` | ${i18next.t("pokemonInfoContainer:gender")} ${getGenderSymbol(tradePokemon.getGender())}` + : "" + }`; + const line2 = + i18next.t("pokemonInfoContainer:nature") + + " " + + getNatureName(tradePokemon.getNature()) + + (formName ? ` | ${i18next.t("pokemonInfoContainer:form")} ${formName}` : ""); + showEncounterText(`${line1}\n${line2}`, 0, 0, false); + }, + }; + return option; + }); + }; - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Randomly generate a Wonder Trade pokemon - const randomTradeOption = generateTradeOption(globalScene.getPlayerParty().map(p => p.species)); - const tradePokemon = new EnemyPokemon(randomTradeOption, pokemon.level, TrainerSlot.NONE, false); - // Extra shiny roll at 1/128 odds (boosted by events and charms) - if (!tradePokemon.shiny) { - const shinyThreshold = new NumberHolder(WONDER_TRADE_SHINY_CHANCE); - if (globalScene.eventManager.isEventActive()) { - shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); - } - globalScene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; + const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; + const modifiers = tradedPokemon + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - // Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms - // Maximum shiny chance of 4096/65536 -> 1/16, cannot improve further after that - const shinyChance = Math.min(shinyThreshold.value, MAX_WONDER_TRADE_SHINY_CHANCE); + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - tradePokemon.trySetShinySeed(shinyChance, false); + // Remove the original party member from party + globalScene.removePokemonFromPlayerParty(tradedPokemon, false); + + // Set data properly, then generate the new Pokemon's assets + receivedPokemonData.passive = tradedPokemon.passive; + // Pokeball to Ultra ball, randomly + receivedPokemonData.pokeball = randInt(4) as PokeballType; + const dataSource = new PokemonData(receivedPokemonData); + const newPlayerPokemon = globalScene.addPlayerPokemon( + receivedPokemonData.species, + receivedPokemonData.level, + dataSource.abilityIndex, + dataSource.formIndex, + dataSource.gender, + dataSource.shiny, + dataSource.variant, + dataSource.ivs, + dataSource.nature, + dataSource, + ); + globalScene.getPlayerParty().push(newPlayerPokemon); + await newPlayerPokemon.loadAssets(); + + for (const mod of modifiers) { + mod.pokemonId = newPlayerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + + // Show the trade animation + await showTradeBackground(); + await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); + await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); + globalScene.playBgm(encounter.misc.bgmKey); + await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); + await hideTradeBackground(); + tradedPokemon.destroy(); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Randomly generate a Wonder Trade pokemon + const randomTradeOption = generateTradeOption(globalScene.getPlayerParty().map(p => p.species)); + const tradePokemon = new EnemyPokemon(randomTradeOption, pokemon.level, TrainerSlot.NONE, false); + // Extra shiny roll at 1/128 odds (boosted by events and charms) + if (!tradePokemon.shiny) { + const shinyThreshold = new NumberHolder(WONDER_TRADE_SHINY_CHANCE); + if (globalScene.eventManager.isEventActive()) { + shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } + globalScene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); - // Extra HA roll at base 1/64 odds (boosted by events and charms) - const hiddenIndex = tradePokemon.species.ability2 ? 2 : 1; - if (tradePokemon.species.abilityHidden) { - if (tradePokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new NumberHolder(64); - globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + // Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms + // Maximum shiny chance of 4096/65536 -> 1/16, cannot improve further after that + const shinyChance = Math.min(shinyThreshold.value, MAX_WONDER_TRADE_SHINY_CHANCE); - const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + tradePokemon.trySetShinySeed(shinyChance, false); + } - if (hasHiddenAbility) { - tradePokemon.abilityIndex = hiddenIndex; + // Extra HA roll at base 1/64 odds (boosted by events and charms) + const hiddenIndex = tradePokemon.species.ability2 ? 2 : 1; + if (tradePokemon.species.abilityHidden) { + if (tradePokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new NumberHolder(64); + globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + + if (hasHiddenAbility) { + tradePokemon.abilityIndex = hiddenIndex; + } + } + } + + // If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset + if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) { + const eggMoves = tradePokemon.getEggMoves(); + if (eggMoves) { + // Cannot gen the rare egg move, only 1 of the first 3 common moves + const eggMove = eggMoves[randSeedInt(3)]; + if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) { + if (tradePokemon.moveset.length < 4) { + tradePokemon.moveset.push(new PokemonMove(eggMove)); + } else { + const eggMoveIndex = randSeedInt(4); + tradePokemon.moveset[eggMoveIndex] = new PokemonMove(eggMove); } } } - - // If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset - if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) { - const eggMoves = tradePokemon.getEggMoves(); - if (eggMoves) { - // Cannot gen the rare egg move, only 1 of the first 3 common moves - const eggMove = eggMoves[randSeedInt(3)]; - if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) { - if (tradePokemon.moveset.length < 4) { - tradePokemon.moveset.push(new PokemonMove(eggMove)); - } else { - const eggMoveIndex = randSeedInt(4); - tradePokemon.moveset[eggMoveIndex] = new PokemonMove(eggMove); - } - } - } - } - - encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("received", tradePokemon.getNameToRender()); - encounter.misc.tradedPokemon = pokemon; - encounter.misc.receivedPokemon = tradePokemon; - }; - - return selectPokemonForOption(onPokemonSelected); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; - const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; - const modifiers = tradedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - - // Remove the original party member from party - globalScene.removePokemonFromPlayerParty(tradedPokemon, false); - - // Set data properly, then generate the new Pokemon's assets - receivedPokemonData.passive = tradedPokemon.passive; - receivedPokemonData.pokeball = randInt(4) as PokeballType; - const dataSource = new PokemonData(receivedPokemonData); - const newPlayerPokemon = globalScene.addPlayerPokemon(receivedPokemonData.species, receivedPokemonData.level, dataSource.abilityIndex, dataSource.formIndex, dataSource.gender, dataSource.shiny, dataSource.variant, dataSource.ivs, dataSource.nature, dataSource); - globalScene.getPlayerParty().push(newPlayerPokemon); - await newPlayerPokemon.loadAssets(); - - for (const mod of modifiers) { - mod.pokemonId = newPlayerPokemon.id; - globalScene.addModifier(mod, true, false, false, true); } - // Show the trade animation - await showTradeBackground(); - await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); - await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); - globalScene.playBgm(encounter.misc.bgmKey); - await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); - await hideTradeBackground(); - tradedPokemon.destroy(); + encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("received", tradePokemon.getNameToRender()); + encounter.misc.tradedPokemon = pokemon; + encounter.misc.receivedPokemon = tradePokemon; + }; - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return it.isTransferable; - }); + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; + const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; + const modifiers = tradedPokemon + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc.chosenModifier = modifier; - encounter.misc.chosenPokemon = pokemon; - return true; - }, - }; - return option; - }); - }; + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has items to trade - const meetsReqs = pokemon.getHeldItems().filter((it) => { + // Remove the original party member from party + globalScene.removePokemonFromPlayerParty(tradedPokemon, false); + + // Set data properly, then generate the new Pokemon's assets + receivedPokemonData.passive = tradedPokemon.passive; + receivedPokemonData.pokeball = randInt(4) as PokeballType; + const dataSource = new PokemonData(receivedPokemonData); + const newPlayerPokemon = globalScene.addPlayerPokemon( + receivedPokemonData.species, + receivedPokemonData.level, + dataSource.abilityIndex, + dataSource.formIndex, + dataSource.gender, + dataSource.shiny, + dataSource.variant, + dataSource.ivs, + dataSource.nature, + dataSource, + ); + globalScene.getPlayerParty().push(newPlayerPokemon); + await newPlayerPokemon.loadAssets(); + + for (const mod of modifiers) { + mod.pokemonId = newPlayerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + + // Show the trade animation + await showTradeBackground(); + await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); + await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); + globalScene.playBgm(encounter.misc.bgmKey); + await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); + await hideTradeBackground(); + tradedPokemon.destroy(); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return it.isTransferable; + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc.chosenModifier = modifier; + encounter.misc.chosenPokemon = pokemon; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has items to trade + const meetsReqs = + pokemon.getHeldItems().filter(it => { return it.isTransferable; }).length > 0; - if (!meetsReqs) { - return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const modifier = encounter.misc.chosenModifier as PokemonHeldItemModifier; - const party = globalScene.getPlayerParty(); - const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - - // Check tier of the traded item, the received item will be one tier up - const type = modifier.type.withTierFromPool(ModifierPoolType.PLAYER, party); - let tier = type.tier ?? ModifierTier.GREAT; - // Eggs and White Herb are not in the pool - if (type.id === "WHITE_HERB") { - tier = ModifierTier.GREAT; - } else if (type.id === "LUCKY_EGG") { - tier = ModifierTier.ULTRA; - } else if (type.id === "GOLDEN_EGG") { - tier = ModifierTier.ROGUE; - } - // Increment tier by 1 - if (tier < ModifierTier.MASTER) { - tier++; + if (!meetsReqs) { + return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; } - regenerateModifierPoolThresholds(party, ModifierPoolType.PLAYER, 0); - let item: ModifierTypeOption | null = null; - // TMs excluded from possible rewards - while (!item || item.type.id.includes("TM_")) { - item = getPlayerModifierTypeOptions(1, party, [], { guaranteedModifierTiers: [ tier ], allowLuckUpgrades: false })[0]; - } + return null; + }; - encounter.setDialogueToken("itemName", item.type.name); - setEncounterRewards({ guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier = encounter.misc.chosenModifier as PokemonHeldItemModifier; + const party = globalScene.getPlayerParty(); + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - chosenPokemon.loseHeldItem(modifier, false); - await globalScene.updateModifiers(true, true); + // Check tier of the traded item, the received item will be one tier up + const type = modifier.type.withTierFromPool(ModifierPoolType.PLAYER, party); + let tier = type.tier ?? ModifierTier.GREAT; + // Eggs and White Herb are not in the pool + if (type.id === "WHITE_HERB") { + tier = ModifierTier.GREAT; + } else if (type.id === "LUCKY_EGG") { + tier = ModifierTier.ULTRA; + } else if (type.id === "GOLDEN_EGG") { + tier = ModifierTier.ROGUE; + } + // Increment tier by 1 + if (tier < ModifierTier.MASTER) { + tier++; + } - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - await showEncounterText(`${namespace}:item_trade_selected`); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - selected: [ - { - text: `${namespace}:option.4.selected`, - }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + regenerateModifierPoolThresholds(party, ModifierPoolType.PLAYER, 0); + let item: ModifierTypeOption | null = null; + // TMs excluded from possible rewards + while (!item || item.type.id.includes("TM_")) { + item = getPlayerModifierTypeOptions(1, party, [], { + guaranteedModifierTiers: [tier], + allowLuckUpgrades: false, + })[0]; + } + + encounter.setDialogueToken("itemName", item.type.name); + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + + chosenPokemon.loseHeldItem(modifier, false); + await globalScene.updateModifiers(true, true); + + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); + await showEncounterText(`${namespace}:item_trade_selected`); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + selected: [ + { + text: `${namespace}:option.4.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); function getPokemonTradeOptions(): Map { const tradeOptionsMap: Map = new Map(); // Starts by filtering out any current party members as valid resulting species const alreadyUsedSpecies: PokemonSpecies[] = globalScene.getPlayerParty().map(p => p.species); - globalScene.getPlayerParty().forEach(pokemon => { + for (const pokemon of globalScene.getPlayerParty()) { // If the party member is legendary/mythical, the only trade options available are always pulled from generation-specific legendary trade pools if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) { const generation = pokemon.species.generation; @@ -459,11 +514,14 @@ function getPokemonTradeOptions(): Map { } // Add trade options to map - tradeOptionsMap.set(pokemon.id, tradeOptions.map(s => { - return new EnemyPokemon(s, pokemon.level, TrainerSlot.NONE, false); - })); + tradeOptionsMap.set( + pokemon.id, + tradeOptions.map(s => { + return new EnemyPokemon(s, pokemon.level, TrainerSlot.NONE, false); + }), + ); } - }); + } return tradeOptionsMap; } @@ -478,13 +536,12 @@ function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: } while (isNullOrUndefined(newSpecies)) { // Get all non-legendary species that fall within the Bst range requirements - let validSpecies = allSpecies - .filter(s => { - const isLegendaryOrMythical = s.legendary || s.subLegendary || s.mythical; - const speciesBst = s.getBaseStatTotal(); - const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; - return !isLegendaryOrMythical && bstInRange && !EXCLUDED_TRADE_SPECIES.includes(s.speciesId); - }); + let validSpecies = allSpecies.filter(s => { + const isLegendaryOrMythical = s.legendary || s.subLegendary || s.mythical; + const speciesBst = s.getBaseStatTotal(); + const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; + return !isLegendaryOrMythical && bstInRange && !EXCLUDED_TRADE_SPECIES.includes(s.speciesId); + }); // There must be at least 20 species available before it will choose one if (validSpecies?.length > 20) { @@ -508,7 +565,13 @@ function showTradeBackground() { const tradeContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); tradeContainer.setName("Trade Background"); - const flyByStaticBg = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0); + const flyByStaticBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); flyByStaticBg.setName("Black Background"); flyByStaticBg.setOrigin(0, 0); flyByStaticBg.setVisible(false); @@ -531,7 +594,7 @@ function showTradeBackground() { ease: "Sine.easeInOut", onComplete: () => { resolve(); - } + }, }); }); } @@ -548,7 +611,7 @@ function hideTradeBackground() { onComplete: () => { globalScene.fieldUI.remove(transformationContainer, true); resolve(); - } + }, }); }); } @@ -569,8 +632,16 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P let receivedPokemonTintSprite: Phaser.GameObjects.Sprite; const getPokemonSprite = () => { - const ret = globalScene.addPokemonSprite(tradedPokemon, tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + tradedPokemon, + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -586,7 +657,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P receivedPokemonTintSprite.setVisible(false); receivedPokemonTintSprite.setTintFill(getPokeballTintColor(receivedPokemon.pokeball)); - [ tradedPokemonSprite, tradedPokemonTintSprite ].map(sprite => { + [tradedPokemonSprite, tradedPokemonTintSprite].map(sprite => { const spriteKey = tradedPokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -594,12 +665,17 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(tradedPokemon.getTeraType()), + isTerastallized: tradedPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", tradedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", tradedPokemon.shiny); sprite.setPipelineData("variant", tradedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (tradedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -607,7 +683,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P }); }); - [ receivedPokemonSprite, receivedPokemonTintSprite ].map(sprite => { + [receivedPokemonSprite, receivedPokemonTintSprite].map(sprite => { const spriteKey = receivedPokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -615,12 +691,17 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(tradedPokemon.getTeraType()), + isTerastallized: tradedPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", receivedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", receivedPokemon.shiny); sprite.setPipelineData("variant", receivedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (receivedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -630,13 +711,23 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P // Traded pokemon pokeball const tradedPbAtlasKey = getPokeballAtlasKey(tradedPokemon.pokeball); - const tradedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite(tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pb", tradedPbAtlasKey); + const tradedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite( + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pb", + tradedPbAtlasKey, + ); tradedPokeball.setVisible(false); tradeContainer.add(tradedPokeball); // Received pokemon pokeball const receivedPbAtlasKey = getPokeballAtlasKey(receivedPokemon.pokeball); - const receivedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite(tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pb", receivedPbAtlasKey); + const receivedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite( + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pb", + receivedPbAtlasKey, + ); receivedPokeball.setVisible(false); tradeContainer.add(receivedPokeball); @@ -669,7 +760,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P // addPokeballOpenParticles(tradedPokemon.x, tradedPokemon.y, tradedPokemon.pokeball); globalScene.tweens.add({ - targets: [ tradedPokemonTintSprite, tradedPokemonSprite ], + targets: [tradedPokemonTintSprite, tradedPokemonSprite], duration: 500, ease: "Sine.easeIn", scale: 0.25, @@ -700,22 +791,31 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P }, onComplete: async () => { await doPokemonTradeFlyBySequence(tradedPokemonSprite, receivedPokemonSprite); - await doTradeReceivedSequence(receivedPokemon, receivedPokemonSprite, receivedPokemonTintSprite, receivedPokeball, receivedPbAtlasKey); + await doTradeReceivedSequence( + receivedPokemon, + receivedPokemonSprite, + receivedPokemonTintSprite, + receivedPokeball, + receivedPbAtlasKey, + ); resolve(); - } + }, }); - } + }, }); - } + }, }); - } + }, }); - } + }, }); }); } -function doPokemonTradeFlyBySequence(tradedPokemonSprite: Phaser.GameObjects.Sprite, receivedPokemonSprite: Phaser.GameObjects.Sprite) { +function doPokemonTradeFlyBySequence( + tradedPokemonSprite: Phaser.GameObjects.Sprite, + receivedPokemonSprite: Phaser.GameObjects.Sprite, +) { return new Promise(resolve => { const tradeContainer = globalScene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; const tradeBaseBg = tradeContainer.getByName("Trade Background Image") as Phaser.GameObjects.Image; @@ -728,7 +828,7 @@ function doPokemonTradeFlyBySequence(tradedPokemonSprite: Phaser.GameObjects.Spr tradedPokemonSprite.y = 200; tradedPokemonSprite.scale = 1; tradedPokemonSprite.setVisible(true); - receivedPokemonSprite.x = tradeBaseBg.displayWidth * 3 / 4; + receivedPokemonSprite.x = (tradeBaseBg.displayWidth * 3) / 4; receivedPokemonSprite.y = -200; receivedPokemonSprite.scale = 1; receivedPokemonSprite.setVisible(true); @@ -745,7 +845,7 @@ function doPokemonTradeFlyBySequence(tradedPokemonSprite: Phaser.GameObjects.Spr duration: FADE_DELAY, onComplete: () => { globalScene.tweens.add({ - targets: [ receivedPokemonSprite, tradedPokemonSprite ], + targets: [receivedPokemonSprite, tradedPokemonSprite], y: tradeBaseBg.displayWidth / 2 - 100, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION * 3, @@ -755,11 +855,11 @@ function doPokemonTradeFlyBySequence(tradedPokemonSprite: Phaser.GameObjects.Spr x: tradeBaseBg.displayWidth / 4, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION / 2, - delay: ANIM_DELAY + delay: ANIM_DELAY, }); globalScene.tweens.add({ targets: tradedPokemonSprite, - x: tradeBaseBg.displayWidth * 3 / 4, + x: (tradeBaseBg.displayWidth * 3) / 4, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION / 2, delay: ANIM_DELAY, @@ -785,20 +885,26 @@ function doPokemonTradeFlyBySequence(tradedPokemonSprite: Phaser.GameObjects.Spr duration: FADE_DELAY, onComplete: () => { resolve(); - } + }, }); - } + }, }); - } + }, }); - } + }, }); - } + }, }); }); } -function doTradeReceivedSequence(receivedPokemon: PlayerPokemon, receivedPokemonSprite: Phaser.GameObjects.Sprite, receivedPokemonTintSprite: Phaser.GameObjects.Sprite, receivedPokeballSprite: Phaser.GameObjects.Sprite, receivedPbAtlasKey: string) { +function doTradeReceivedSequence( + receivedPokemon: PlayerPokemon, + receivedPokemonSprite: Phaser.GameObjects.Sprite, + receivedPokemonTintSprite: Phaser.GameObjects.Sprite, + receivedPokeballSprite: Phaser.GameObjects.Sprite, + receivedPbAtlasKey: string, +) { return new Promise(resolve => { const tradeContainer = globalScene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; const tradeBaseBg = tradeContainer.getByName("Trade Background Image") as Phaser.GameObjects.Image; @@ -851,7 +957,7 @@ function doTradeReceivedSequence(receivedPokemon: PlayerPokemon, receivedPokemon targets: receivedPokemonSprite, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); globalScene.tweens.add({ targets: receivedPokemonTintSprite, @@ -867,10 +973,10 @@ function doTradeReceivedSequence(receivedPokemon: PlayerPokemon, receivedPokemon } receivedPokeballSprite.destroy(); globalScene.time.delayedCall(2000, () => resolve()); - } + }, }); }); - } + }, }); }); } @@ -884,7 +990,7 @@ function generateRandomTraderName() { } // Some trainers have 2 gendered pools, some do not const genderedPool = trainerTypePool[randInt(trainerTypePool.length)]; - const trainerNameString = genderedPool instanceof Array ? genderedPool[randInt(genderedPool.length)] : genderedPool; + const trainerNameString = Array.isArray(genderedPool) ? genderedPool[randInt(genderedPool.length)] : genderedPool; // Some names have an '&' symbol and need to be trimmed to a single name instead of a double name const trainerNames = trainerNameString.split(" & "); return trainerNames[randInt(trainerNames.length)]; diff --git a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts index 34c808359b7..97fd5783ebb 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -29,7 +29,9 @@ const namespace = "mysteryEncounters/lostAtSea"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3793 | GitHub Issue #3793} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) +export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.LOST_AT_SEA, +) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withIntroSpriteConfigs([ @@ -57,8 +59,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withQuery(`${namespace}:query`) .withOption( // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -72,12 +73,11 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ], }) .withOptionPhase(async () => handlePokemonGuidingYouPhase()) - .build() + .build(), ) .withOption( //Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, @@ -91,7 +91,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ], }) .withOptionPhase(async () => handlePokemonGuidingYouPhase()) - .build() + .build(), ) .withSimpleOption( // Option 3: Wander aimlessly @@ -105,7 +105,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ], }, async () => { - const allowedPokemon = globalScene.getPlayerParty().filter((p) => p.isAllowedInBattle()); + const allowedPokemon = globalScene.getPlayerParty().filter(p => p.isAllowedInBattle()); for (const pkm of allowedPokemon) { const percentage = DAMAGE_PERCENTAGE / 100; @@ -116,7 +116,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with leaveEncounterWithoutBattle(); return true; - } + }, ) .withOutroDialogue([ { diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 36e12b34e10..bf60e982b15 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -1,5 +1,4 @@ -import type { - EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { initBattleWithEnemyConfig, setEncounterRewards, @@ -29,195 +28,202 @@ const namespace = "mysteryEncounters/mysteriousChallengers"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3801 | GitHub Issue #3801} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChallengersEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ +export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.MYSTERIOUS_CHALLENGERS, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Calculates what trainers are available for battle in the encounter + + // Normal difficulty trainer is randomly pulled from biome + const normalTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + const normalConfig = trainerConfigs[normalTrainerType].clone(); + let female = false; + if (normalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: normalConfig, + female: female, + }); + + // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config + // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 + let retries = 0; + let hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + while (retries < 5 && hardTrainerType === normalTrainerType) { + // Will try to use a different trainer from the normal trainer type + hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + retries++; + } + const hardTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate( + Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 20), 5), + PartyMemberStrength.AVERAGE, + false, + true, + ), + ); + const hardConfig = trainerConfigs[hardTrainerType].clone(); + hardConfig.setPartyTemplates(hardTemplate); + female = false; + if (hardConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: hardConfig, + levelAdditiveModifier: 1, + female: female, + }); + + // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const brutalTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex, true); + const e4Template = trainerPartyTemplates.ELITE_FOUR; + const brutalConfig = trainerConfigs[brutalTrainerType].clone(); + brutalConfig.title = trainerConfigs[brutalTrainerType].title; + brutalConfig.setPartyTemplates(e4Template); + // @ts-ignore + brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func + female = false; + if (brutalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: brutalConfig, + levelAdditiveModifier: 1.5, + female: female, + }); + + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: normalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, }, - ]) - .withOnInit(() => { + { + spriteKey: hardSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + { + spriteKey: brutalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculates what trainers are available for battle in the encounter + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Normal difficulty trainer is randomly pulled from biome - const normalTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); - const normalConfig = trainerConfigs[normalTrainerType].clone(); - let female = false; - if (normalConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: normalConfig, - female: female, + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], + fillRemaining: true, }); - // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config - // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 - let retries = 0; - let hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); - while (retries < 5 && hardTrainerType === normalTrainerType) { - // Will try to use a different trainer from the normal trainer type - hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); - retries++; - } - const hardTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), - new TrainerPartyTemplate( - Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 20), 5), - PartyMemberStrength.AVERAGE, - false, - true - ) - ); - const hardConfig = trainerConfigs[hardTrainerType].clone(); - hardConfig.setPartyTemplates(hardTemplate); - female = false; - if (hardConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: hardConfig, - levelAdditiveModifier: 1, - female: female, + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 10); + await initBattlePromise!; + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn hard fight + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + fillRemaining: true, }); - // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome - // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons - const brutalTrainerType = globalScene.arena.randomTrainerType( - globalScene.currentBattle.waveIndex, - true - ); - const e4Template = trainerPartyTemplates.ELITE_FOUR; - const brutalConfig = trainerConfigs[brutalTrainerType].clone(); - brutalConfig.title = trainerConfigs[brutalTrainerType].title; - brutalConfig.setPartyTemplates(e4Template); - // @ts-ignore - brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func - female = false; - if (brutalConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: brutalConfig, - levelAdditiveModifier: 1.5, - female: female, + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 100); + await initBattlePromise!; + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn brutal fight + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], + fillRemaining: true, }); - encounter.spriteConfigs = [ - { - spriteKey: normalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - { - spriteKey: hardSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - { - spriteKey: brutalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - ]; - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn standard trainer battle with memory mushroom reward - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - globalScene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(config); - }, globalScene.currentBattle.waveIndex * 10); - await initBattlePromise!; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn hard fight - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - globalScene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(config); - }, globalScene.currentBattle.waveIndex * 100); - await initBattlePromise!; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn brutal fight - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; - - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; - - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - globalScene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(config); - }, globalScene.currentBattle.waveIndex * 1000); - await initBattlePromise!; - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 1000); + await initBattlePromise!; + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 9b4999020d0..c295e36749a 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -4,8 +4,16 @@ import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-en import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + getHighestLevelPlayerPokemon, + koPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { ModifierTier } from "#app/modifier/modifier-tier"; @@ -32,183 +40,181 @@ const MASTER_REWARDS_PERCENT = 5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3796 | GitHub Issue #3796} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChestEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(2, 6, true) - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withIntroSpriteConfigs([ - { - spriteKey: "mysterious_chest_blue", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 8, - yShadow: 6, - alpha: 1, - disableAnimation: true, // Re-enabled after option select - }, - { - spriteKey: "mysterious_chest_red", - fileRoot: "mystery-encounters", - hasShadow: false, - y: 8, - yShadow: 6, - alpha: 0, - disableAnimation: true, // Re-enabled after option select - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.MYSTERIOUS_CHEST, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withIntroSpriteConfigs([ + { + spriteKey: "mysterious_chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 8, + yShadow: 6, + alpha: 1, + disableAnimation: true, // Re-enabled after option select + }, + { + spriteKey: "mysterious_chest_red", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 8, + yShadow: 6, + alpha: 0, + disableAnimation: true, // Re-enabled after option select + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - disableSwitch: true, - pokemonConfigs: [ - { - species: getPokemonSpecies(Species.GIMMIGHOUL), - formIndex: 0, - isBoss: true, - moveSet: [ Moves.NASTY_PLOT, Moves.SHADOW_BALL, Moves.POWER_GEM, Moves.THIEF ] - } - ], - }; + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.GIMMIGHOUL), + formIndex: 0, + isBoss: true, + moveSet: [Moves.NASTY_PLOT, Moves.SHADOW_BALL, Moves.POWER_GEM, Moves.THIEF], + }, + ], + }; - encounter.enemyPartyConfigs = [ config ]; + encounter.enemyPartyConfigs = [config]; - encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(Species.GIMMIGHOUL).getName()); - encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString()); - encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("roguePercent", ROGUE_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("masterPercent", MASTER_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(Species.GIMMIGHOUL).getName()); + encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString()); + encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("roguePercent", ROGUE_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("masterPercent", MASTER_REWARDS_PERCENT.toString()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Play animation - const encounter = globalScene.currentBattle.mysteryEncounter!; - const introVisuals = encounter.introVisuals!; - - // Determine roll first - const roll = randSeedInt(RAND_LENGTH); - encounter.misc = { - roll - }; - - if (roll < TRAP_PERCENT) { - // Chest is springing trap, change to red chest sprite - const blueChestSprites = introVisuals.getSpriteAtIndex(0); - const redChestSprites = introVisuals.getSpriteAtIndex(1); - redChestSprites[0].setAlpha(1); - blueChestSprites[0].setAlpha(0.001); - } - introVisuals.spriteConfigs[0].disableAnimation = false; - introVisuals.spriteConfigs[1].disableAnimation = false; - introVisuals.playAnim(); - }) - .withOptionPhase(async () => { - // Open the chest - const encounter = globalScene.currentBattle.mysteryEncounter!; - const roll = encounter.misc.roll; - if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT) { - // Choose between 2 COMMON / 2 GREAT tier items (20%) - setEncounterRewards({ - guaranteedModifierTiers: [ - ModifierTier.COMMON, - ModifierTier.COMMON, - ModifierTier.GREAT, - ModifierTier.GREAT, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage(`${namespace}:option.1.normal`); - leaveEncounterWithoutBattle(); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT) { - // Choose between 3 ULTRA tier items (30%) - setEncounterRewards({ - guaranteedModifierTiers: [ - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage(`${namespace}:option.1.good`); - leaveEncounterWithoutBattle(); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT) { - // Choose between 2 ROGUE tier items (10%) - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE ]}); - // Display result message then proceed to rewards - queueEncounterMessage(`${namespace}:option.1.great`); - leaveEncounterWithoutBattle(); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT - MASTER_REWARDS_PERCENT) { - // Choose 1 MASTER tier item (5%) - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.MASTER ]}); - // Display result message then proceed to rewards - queueEncounterMessage(`${namespace}:option.1.amazing`); - leaveEncounterWithoutBattle(); - } else { - // Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%) - const highestLevelPokemon = getHighestLevelPlayerPokemon(true, false); - koPlayerPokemon(highestLevelPokemon); - - encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); - await showEncounterText(`${namespace}:option.1.bad`); - - // Handle game over edge case - const allowedPokemon = globalScene.getPokemonAllowedInBattle(); - if (allowedPokemon.length === 0) { - // If there are no longer any legal pokemon in the party, game over. - globalScene.clearPhaseQueue(); - globalScene.unshiftPhase(new GameOverPhase()); - } else { - // Show which Pokemon was KOed, then start battle against Gimmighoul - await transitionMysteryEncounterIntroVisuals(true, true, 500); - setEncounterRewards({ fillRemaining: true }); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - } - } - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected`, }, ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + }) + .withPreOptionPhase(async () => { + // Play animation + const encounter = globalScene.currentBattle.mysteryEncounter!; + const introVisuals = encounter.introVisuals!; + + // Determine roll first + const roll = randSeedInt(RAND_LENGTH); + encounter.misc = { + roll, + }; + + if (roll < TRAP_PERCENT) { + // Chest is springing trap, change to red chest sprite + const blueChestSprites = introVisuals.getSpriteAtIndex(0); + const redChestSprites = introVisuals.getSpriteAtIndex(1); + redChestSprites[0].setAlpha(1); + blueChestSprites[0].setAlpha(0.001); + } + introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.spriteConfigs[1].disableAnimation = false; + introVisuals.playAnim(); + }) + .withOptionPhase(async () => { + // Open the chest + const encounter = globalScene.currentBattle.mysteryEncounter!; + const roll = encounter.misc.roll; + if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT) { + // Choose between 2 COMMON / 2 GREAT tier items (20%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.normal`); + leaveEncounterWithoutBattle(); + } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT) { + // Choose between 3 ULTRA tier items (30%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.good`); + leaveEncounterWithoutBattle(); + } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT) { + // Choose between 2 ROGUE tier items (10%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.great`); + leaveEncounterWithoutBattle(); + } else if ( + roll >= + RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT - MASTER_REWARDS_PERCENT + ) { + // Choose 1 MASTER tier item (5%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.MASTER], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.amazing`); + leaveEncounterWithoutBattle(); + } else { + // Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%) + const highestLevelPokemon = getHighestLevelPlayerPokemon(true, false); + koPlayerPokemon(highestLevelPokemon); + + encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); + await showEncounterText(`${namespace}:option.1.bad`); + + // Handle game over edge case + const allowedPokemon = globalScene.getPokemonAllowedInBattle(); + if (allowedPokemon.length === 0) { + // If there are no longer any legal pokemon in the party, game over. + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); + } else { + // Show which Pokemon was KOed, then start battle against Gimmighoul + await transitionMysteryEncounterIntroVisuals(true, true, 500); + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + } + } + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 4db8e2eb6e8..61b48353997 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -1,5 +1,12 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; @@ -24,67 +31,68 @@ const namespace = "mysteryEncounters/partTimer"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3813 | GitHub Issue #3813} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const PartTimerEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.PART_TIMER) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([ - { - spriteKey: "part_timer_crate", - fileRoot: "mystery-encounters", - hasShadow: false, - y: 6, - x: 15 - }, - { - spriteKey: "worker_f", - fileRoot: "trainer", - hasShadow: true, - x: -18, - y: 4 - } - ]) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withOnInit(() => { - // Load sfx - globalScene.loadSe("PRSFX- Horn Drill1", "battle_anims", "PRSFX- Horn Drill1.wav"); - globalScene.loadSe("PRSFX- Horn Drill3", "battle_anims", "PRSFX- Horn Drill3.wav"); - globalScene.loadSe("PRSFX- Guillotine2", "battle_anims", "PRSFX- Guillotine2.wav"); - globalScene.loadSe("PRSFX- Heavy Slam2", "battle_anims", "PRSFX- Heavy Slam2.wav"); +export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.PART_TIMER, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([ + { + spriteKey: "part_timer_crate", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 6, + x: 15, + }, + { + spriteKey: "worker_f", + fileRoot: "trainer", + hasShadow: true, + x: -18, + y: 4, + }, + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + // Load sfx + globalScene.loadSe("PRSFX- Horn Drill1", "battle_anims", "PRSFX- Horn Drill1.wav"); + globalScene.loadSe("PRSFX- Horn Drill3", "battle_anims", "PRSFX- Horn Drill3.wav"); + globalScene.loadSe("PRSFX- Guillotine2", "battle_anims", "PRSFX- Guillotine2.wav"); + globalScene.loadSe("PRSFX- Heavy Slam2", "battle_anims", "PRSFX- Heavy Slam2.wav"); - globalScene.loadSe("PRSFX- Agility", "battle_anims", "PRSFX- Agility.wav"); - globalScene.loadSe("PRSFX- Extremespeed1", "battle_anims", "PRSFX- Extremespeed1.wav"); - globalScene.loadSe("PRSFX- Accelerock1", "battle_anims", "PRSFX- Accelerock1.wav"); + globalScene.loadSe("PRSFX- Agility", "battle_anims", "PRSFX- Agility.wav"); + globalScene.loadSe("PRSFX- Extremespeed1", "battle_anims", "PRSFX- Extremespeed1.wav"); + globalScene.loadSe("PRSFX- Accelerock1", "battle_anims", "PRSFX- Accelerock1.wav"); - globalScene.loadSe("PRSFX- Captivate", "battle_anims", "PRSFX- Captivate.wav"); - globalScene.loadSe("PRSFX- Attract2", "battle_anims", "PRSFX- Attract2.wav"); - globalScene.loadSe("PRSFX- Aurora Veil2", "battle_anims", "PRSFX- Aurora Veil2.wav"); + globalScene.loadSe("PRSFX- Captivate", "battle_anims", "PRSFX- Captivate.wav"); + globalScene.loadSe("PRSFX- Attract2", "battle_anims", "PRSFX- Attract2.wav"); + globalScene.loadSe("PRSFX- Aurora Veil2", "battle_anims", "PRSFX- Aurora Veil2.wav"); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option.1.label`, buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.1.selected` - } - ] + text: `${namespace}:option.1.selected`, + }, + ], }) .withPreOptionPhase(async () => { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -95,21 +103,21 @@ export const PartTimerEncounter: MysteryEncounter = // Calculate the "baseline" stat value (90 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineValue = Math.floor(((2 * 90 + 16) * pokemon.level) * 0.01) + 5; + const baselineValue = Math.floor((2 * 90 + 16) * pokemon.level * 0.01) + 5; const percentDiff = (pokemon.getStat(Stat.SPD) - baselineValue) / baselineValue; const moneyMultiplier = Math.min(Math.max(2.5 * (1 + percentDiff), 1), 4); encounter.misc = { - moneyMultiplier + moneyMultiplier, }; // Reduce all PP to 2 (if they started at greater than 2) - pokemon.moveset.forEach(move => { + for (const move of pokemon.moveset) { if (move) { const newPpUsed = move.getMovePp() - 2; move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; } - }); + } setEncounterExp(pokemon.id, 100); @@ -141,24 +149,28 @@ export const PartTimerEncounter: MysteryEncounter = } const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); updatePlayerMoney(moneyChange, true, false); - await showEncounterText(i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); await showEncounterText(`${namespace}:pokemon_tired`); setEncounterRewards({ fillRemaining: true }); leaveEncounterWithoutBattle(); }) - .build() - ) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, selected: [ { - text: `${namespace}:option.2.selected` - } - ] + text: `${namespace}:option.2.selected`, + }, + ], }) .withPreOptionPhase(async () => { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -169,24 +181,25 @@ export const PartTimerEncounter: MysteryEncounter = // Calculate the "baseline" stat value (75 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineHp = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + pokemon.level + 10; - const baselineAtkDef = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + 5; + const baselineHp = Math.floor((2 * 75 + 16) * pokemon.level * 0.01) + pokemon.level + 10; + const baselineAtkDef = Math.floor((2 * 75 + 16) * pokemon.level * 0.01) + 5; const baselineValue = baselineHp + 1.5 * (baselineAtkDef * 2); - const strongestValue = pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); + const strongestValue = + pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); const percentDiff = (strongestValue - baselineValue) / baselineValue; const moneyMultiplier = Math.min(Math.max(2.5 * (1 + percentDiff), 1), 4); encounter.misc = { - moneyMultiplier + moneyMultiplier, }; // Reduce all PP to 2 (if they started at greater than 2) - pokemon.moveset.forEach(move => { + for (const move of pokemon.moveset) { if (move) { const newPpUsed = move.getMovePp() - 2; move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; } - }); + } setEncounterExp(pokemon.id, 100); @@ -218,73 +231,80 @@ export const PartTimerEncounter: MysteryEncounter = } const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); updatePlayerMoney(moneyChange, true, false); - await showEncounterText(i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); await showEncounterText(`${namespace}:pokemon_tired`); setEncounterRewards({ fillRemaining: true }); leaveEncounterWithoutBattle(); }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const selectedPokemon = encounter.selectedOption?.primaryPokemon!; - encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const selectedPokemon = encounter.selectedOption?.primaryPokemon!; + encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); - // Reduce all PP to 2 (if they started at greater than 2) - selectedPokemon.moveset.forEach(move => { - if (move) { - const newPpUsed = move.getMovePp() - 2; - move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; - } - }); + // Reduce all PP to 2 (if they started at greater than 2) + for (const move of selectedPokemon.moveset) { + if (move) { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + } + } - setEncounterExp(selectedPokemon.id, 100); + setEncounterExp(selectedPokemon.id, 100); - // Hide intro visuals - transitionMysteryEncounterIntroVisuals(true, false); - // Play sfx for "working" - doSalesSfx(); - return true; - }) - .withOptionPhase(async () => { - // Assist with Sales - // Bring visuals back in - await transitionMysteryEncounterIntroVisuals(false, false); + // Hide intro visuals + transitionMysteryEncounterIntroVisuals(true, false); + // Play sfx for "working" + doSalesSfx(); + return true; + }) + .withOptionPhase(async () => { + // Assist with Sales + // Bring visuals back in + await transitionMysteryEncounterIntroVisuals(false, false); - // Give money and do dialogue - await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); - const moneyChange = globalScene.getWaveMoneyAmount(2.5); - updatePlayerMoney(moneyChange, true, false); - await showEncounterText(i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); - await showEncounterText(`${namespace}:pokemon_tired`); + // Give money and do dialogue + await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); + const moneyChange = globalScene.getWaveMoneyAmount(2.5); + updatePlayerMoney(moneyChange, true, false); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); + await showEncounterText(`${namespace}:pokemon_tired`); - setEncounterRewards({ fillRemaining: true }); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .withOutroDialogue([ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:outro`, - } - ]) - .build(); + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withOutroDialogue([ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:outro`, + }, + ]) + .build(); function doStrongWorkSfx() { globalScene.playSound("battle_anims/PRSFX- Horn Drill1"); diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 130c55c361e..f231e4abdb8 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,4 +1,9 @@ -import { initSubsequentOptionSelect, leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initSubsequentOptionSelect, + leaveEncounterWithoutBattle, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; @@ -14,7 +19,12 @@ import { NumberHolder, randSeedInt } from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterCost, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + doPlayerFlee, + doPokemonFlee, + getRandomSpeciesByStarterCost, + trainerThrowPokeball, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -27,7 +37,7 @@ import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-gr /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/safariZone"; -const TRAINER_THROW_ANIMATION_TIMES = [ 512, 184, 768 ]; +const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; const SAFARI_MONEY_MULTIPLIER = 2; @@ -38,36 +48,37 @@ const NUM_SAFARI_ENCOUNTERS = 3; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SafariZoneEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "safari_zone", - fileRoot: "mystery-encounters", - hasShadow: false, - x: 4, - y: 6 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - globalScene.currentBattle.mysteryEncounter?.setDialogueToken("numEncounters", NUM_SAFARI_ENCOUNTERS.toString()); - return true; - }) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) +export const SafariZoneEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SAFARI_ZONE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "safari_zone", + fileRoot: "mystery-encounters", + hasShadow: false, + x: 4, + y: 6, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + globalScene.currentBattle.mysteryEncounter?.setDialogueToken("numEncounters", NUM_SAFARI_ENCOUNTERS.toString()); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -83,7 +94,7 @@ export const SafariZoneEncounter: MysteryEncounter = const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.continuousEncounter = true; encounter.misc = { - safariPokemonRemaining: NUM_SAFARI_ENCOUNTERS + safariPokemonRemaining: NUM_SAFARI_ENCOUNTERS, }; updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Load bait/mud assets @@ -96,28 +107,31 @@ export const SafariZoneEncounter: MysteryEncounter = globalScene.currentBattle.enemyParty = []; await transitionMysteryEncounterIntroVisuals(); await summonSafariPokemon(); - initSubsequentOptionSelect({ overrideOptions: safariZoneGameOptions, hideDescription: true }); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + hideDescription: true, + }); return true; }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); /** * SAFARI ZONE MINIGAME OPTIONS @@ -135,15 +149,14 @@ export const SafariZoneEncounter: MysteryEncounter = * Flee chance = fleeRate / 255 */ const safariZoneGameOptions: MysteryEncounterOption[] = [ - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.1.label`, buttonTooltip: `${namespace}:safari.1.tooltip`, selected: [ { text: `${namespace}:safari.1.selected`, - } + }, ], }) .withOptionPhase(async () => { @@ -157,7 +170,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(); - initSubsequentOptionSelect({ overrideOptions: safariZoneGameOptions, startingCursorIndex: 0, hideDescription: true }); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: 0, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; @@ -170,8 +187,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.2.label`, buttonTooltip: `${namespace}:safari.2.tooltip`, @@ -191,7 +207,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to increase flee stage +1 const fleeChangeResult = tryChangeFleeStage(1, 8); if (!fleeChangeResult) { - await showEncounterText(getEncounterText(`${namespace}:safari.busy_eating`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.busy_eating`) ?? "", null, 1000, false); } else { await showEncounterText(getEncounterText(`${namespace}:safari.eating`) ?? "", null, 1000, false); } @@ -200,8 +216,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.3.label`, buttonTooltip: `${namespace}:safari.3.tooltip`, @@ -220,17 +235,16 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to decrease catch stage -1 const catchChangeResult = tryChangeCatchStage(-1, 8); if (!catchChangeResult) { - await showEncounterText(getEncounterText(`${namespace}:safari.beside_itself_angry`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.beside_itself_angry`) ?? "", null, 1000, false); } else { - await showEncounterText(getEncounterText(`${namespace}:safari.angry`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.angry`) ?? "", null, 1000, false); } await doEndTurn(2); return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.4.label`, buttonTooltip: `${namespace}:safari.4.tooltip`, @@ -243,7 +257,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(); - initSubsequentOptionSelect({ overrideOptions: safariZoneGameOptions, startingCursorIndex: 3, hideDescription: true }); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: 3, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; @@ -251,7 +269,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ } return true; }) - .build() + .build(), ]; async function summonSafariPokemon() { @@ -262,38 +280,41 @@ async function summonSafariPokemon() { // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal - let enemySpecies; - let pokemon; - globalScene.executeWithSeedOffset(() => { - enemySpecies = getSafariSpeciesSpawn(); - const level = globalScene.currentBattle.getLevelForWave(); - enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, globalScene.gameMode)); - pokemon = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false); + let enemySpecies: PokemonSpecies; + let pokemon: any; + globalScene.executeWithSeedOffset( + () => { + enemySpecies = getSafariSpeciesSpawn(); + const level = globalScene.currentBattle.getLevelForWave(); + enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, globalScene.gameMode)); + pokemon = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false); - // Roll shiny twice - if (!pokemon.shiny) { - pokemon.trySetShinySeed(); - } + // Roll shiny twice + if (!pokemon.shiny) { + pokemon.trySetShinySeed(); + } - // Roll HA twice - if (pokemon.species.abilityHidden) { - const hiddenIndex = pokemon.species.ability2 ? 2 : 1; - if (pokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new NumberHolder(256); - globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + // Roll HA twice + if (pokemon.species.abilityHidden) { + const hiddenIndex = pokemon.species.ability2 ? 2 : 1; + if (pokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new NumberHolder(256); + globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); - const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); - if (hasHiddenAbility) { - pokemon.abilityIndex = hiddenIndex; + if (hasHiddenAbility) { + pokemon.abilityIndex = hiddenIndex; + } } } - } - pokemon.calculateStats(); + pokemon.calculateStats(); - globalScene.currentBattle.enemyParty.unshift(pokemon); - }, globalScene.currentBattle.waveIndex * 1000 * encounter.misc.safariPokemonRemaining); + globalScene.currentBattle.enemyParty.unshift(pokemon); + }, + globalScene.currentBattle.waveIndex * 1000 * encounter.misc.safariPokemonRemaining, + ); globalScene.gameData.setPokemonSeen(pokemon, true); await pokemon.loadAssets(); @@ -324,7 +345,8 @@ function throwPokeball(pokemon: EnemyPokemon): Promise { // Catch stage ranges from -6 to +6 (like stat boost stages) const safariCatchStage = globalScene.currentBattle.mysteryEncounter!.misc.catchStage; // Catch modifier ranges from 2/8 (-6 stage) to 8/2 (+6) - const safariModifier = (2 + Math.min(Math.max(safariCatchStage, 0), 6)) / (2 - Math.max(Math.min(safariCatchStage, 0), -6)); + const safariModifier = + (2 + Math.min(Math.max(safariCatchStage, 0), 6)) / (2 - Math.max(Math.min(safariCatchStage, 0), -6)); // Catch rate same as safari ball const pokeballMultiplier = 1.5; const catchRate = Math.round(baseCatchRate * pokeballMultiplier * safariModifier); @@ -341,7 +363,9 @@ async function throwBait(pokemon: EnemyPokemon): Promise { globalScene.field.add(bait); return new Promise(resolve => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { globalScene.playSound("se/pb_throw"); @@ -350,7 +374,9 @@ async function throwBait(pokemon: EnemyPokemon): Promise { globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { globalScene.trainer.setFrame("3"); globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); @@ -361,7 +387,6 @@ async function throwBait(pokemon: EnemyPokemon): Promise { y: { value: 55 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { - let index = 1; globalScene.time.delayedCall(768, () => { globalScene.tweens.add({ @@ -389,10 +414,10 @@ async function throwBait(pokemon: EnemyPokemon): Promise { bait.destroy(); resolve(true); }); - } + }, }); }); - } + }, }); }); }); @@ -407,7 +432,9 @@ async function throwMud(pokemon: EnemyPokemon): Promise { globalScene.field.add(mud); return new Promise(resolve => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { globalScene.playSound("se/pb_throw"); @@ -416,7 +443,9 @@ async function throwMud(pokemon: EnemyPokemon): Promise { globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { globalScene.trainer.setFrame("3"); globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); @@ -461,11 +490,11 @@ async function throwMud(pokemon: EnemyPokemon): Promise { }, onComplete: () => { resolve(true); - } + }, }); - } + }, }); - } + }, }); }); }); @@ -474,7 +503,7 @@ async function throwMud(pokemon: EnemyPokemon): Promise { function isPokemonFlee(pokemon: EnemyPokemon, fleeStage: number): boolean { const speciesCatchRate = pokemon.species.catchRate; const fleeModifier = (2 + Math.min(Math.max(fleeStage, 0), 6)) / (2 - Math.max(Math.min(fleeStage, 0), -6)); - const fleeRate = (255 * 255 - speciesCatchRate * speciesCatchRate) / 255 / 2 * fleeModifier; + const fleeRate = ((255 * 255 - speciesCatchRate * speciesCatchRate) / 255 / 2) * fleeModifier; console.log("Flee rate: " + fleeRate); const roll = randSeedInt(256); console.log("Roll: " + roll); @@ -519,7 +548,11 @@ async function doEndTurn(cursorIndex: number) { // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(); - initSubsequentOptionSelect({ overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: cursorIndex, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; @@ -527,7 +560,11 @@ async function doEndTurn(cursorIndex: number) { } } else { globalScene.queueMessage(getEncounterText(`${namespace}:safari.watching`) ?? "", 0, null, 1000); - initSubsequentOptionSelect({ overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: cursorIndex, + hideDescription: true, + }); } } @@ -535,5 +572,7 @@ async function doEndTurn(cursorIndex: number) { * @returns A random species that has at most 5 starter cost and is not Mythical, Paradox, etc. */ export function getSafariSpeciesSpawn(): PokemonSpecies { - return getPokemonSpecies(getRandomSpeciesByStarterCost([ 0, 5 ], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false)); + return getPokemonSpecies( + getRandomSpeciesByStarterCost([0, 5], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false), + ); } diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts index d5362df28e7..b9476d49fec 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -1,4 +1,10 @@ -import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -11,7 +17,11 @@ import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-en import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon, isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyDamageToPokemon, + applyModifierTypeToPlayerPokemon, + isPokemonValidForEncounterOptionSelection, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import type { Nature } from "#enums/nature"; @@ -30,201 +40,204 @@ const VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER = 5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3798 | GitHub Issue #3798} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ShadyVitaminDealerEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal - .withPrimaryPokemonHealthRatioRequirement([ 0.51, 1 ]) // At least 1 Pokemon must have above half HP - .withIntroSpriteConfigs([ - { - spriteKey: Species.KROOKODILE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 12, - y: -5, - yShadow: -5 - }, - { - spriteKey: "shady_vitamin_dealer", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -12, - y: 3, - yShadow: 3 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, - generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are above half HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - if (!pokemon.isAllowedInChallenge()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; - } - if (!encounter.pokemonMeetsPrimaryRequirements(pokemon)) { - return getEncounterText(`${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - // Choose Cheap Option - const encounter = globalScene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); - } - - leaveEncounterWithoutBattle(true); - }) - .withPostOptionPhase(async () => { - // Damage and status applied after dealer leaves (to make thematic sense) - const encounter = globalScene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon as PlayerPokemon; - - // Pokemon takes half max HP damage and nature is randomized (does not update dex) - applyDamageToPokemon(chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 2)); - - const currentNature = chosenPokemon.nature; - let newNature = randSeedInt(25) as Nature; - while (newNature === currentNature) { - newNature = randSeedInt(25) as Nature; - } - - chosenPokemon.setCustomNature(newNature); - encounter.setDialogueToken("newNature", getNatureName(newNature)); - queueEncounterMessage(`${namespace}:cheap_side_effects`); - setEncounterExp([ chosenPokemon.id ], 100); - await chosenPokemon.updateInfo(); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(-(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, - generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are unfainted - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - // Choose Expensive Option - const encounter = globalScene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); - } - - leaveEncounterWithoutBattle(true); - }) - .withPostOptionPhase(async () => { - // Status applied after dealer leaves (to make thematic sense) - const encounter = globalScene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - - queueEncounterMessage(`${namespace}:no_bad_effects`); - setEncounterExp([ chosenPokemon.id ], 100); - - await chosenPokemon.updateInfo(); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, +export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SHADY_VITAMIN_DEALER, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal + .withPrimaryPokemonHealthRatioRequirement([0.51, 1]) // At least 1 Pokemon must have above half HP + .withIntroSpriteConfigs([ + { + spriteKey: Species.KROOKODILE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 12, + y: -5, + yShadow: -5, + }, + { + spriteKey: "shady_vitamin_dealer", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -12, + y: 3, + yShadow: 3, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.3.selected`, - speaker: `${namespace}:speaker` + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are above half HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + if (!pokemon.isAllowedInChallenge()) { + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } - ] - }, - async () => { - // Leave encounter with no rewards or exp + if (!encounter.pokemonMeetsPrimaryRequirements(pokemon)) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Choose Cheap Option + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); + } + leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + }) + .withPostOptionPhase(async () => { + // Damage and status applied after dealer leaves (to make thematic sense) + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon as PlayerPokemon; + + // Pokemon takes half max HP damage and nature is randomized (does not update dex) + applyDamageToPokemon(chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 2)); + + const currentNature = chosenPokemon.nature; + let newNature = randSeedInt(25) as Nature; + while (newNature === currentNature) { + newNature = randSeedInt(25) as Nature; + } + + chosenPokemon.setCustomNature(newNature); + encounter.setDialogueToken("newNature", getNatureName(newNature)); + queueEncounterMessage(`${namespace}:cheap_side_effects`); + setEncounterExp([chosenPokemon.id], 100); + await chosenPokemon.updateInfo(); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(-(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are unfainted + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Choose Expensive Option + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); + } + + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Status applied after dealer leaves (to make thematic sense) + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + + queueEncounterMessage(`${namespace}:no_bad_effects`); + setEncounterExp([chosenPokemon.id], 100); + + await chosenPokemon.updateInfo(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + speaker: `${namespace}:speaker`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 923d8f06c23..bfa1204a8ba 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -10,7 +10,14 @@ import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-en import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; -import { generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + setEncounterExp, + setEncounterRewards, +} from "../utils/encounter-phase-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; @@ -31,141 +38,148 @@ const namespace = "mysteryEncounters/slumberingSnorlax"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3815 | GitHub Issue #3815} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SlumberingSnorlaxEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SLUMBERING_SNORLAX) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.SNORLAX.toString(), - fileRoot: "pokemon", - hasShadow: true, - tint: 0.25, - scale: 1.25, - repeat: true, - y: 5, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit(() => { +export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SLUMBERING_SNORLAX, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SNORLAX.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + scale: 1.25, + repeat: true, + y: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + console.log(encounter); + + // Calculate boss mon + const bossSpecies = getPokemonSpecies(Species.SNORLAX); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked + status: [StatusEffect.SLEEP, 5], // Extra turns on timer for Snorlax's start of fight moves + moveSet: [Moves.REST, Moves.SLEEP_TALK, Moves.CRUNCH, Moves.GIGA_IMPACT], + modifierConfigs: [ + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + ], + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), + aiType: AiType.SMART, // Required to ensure Snorlax uses Sleep Talk while it is asleep + }; + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + pokemonConfigs: [pokemonConfig], + }; + encounter.enemyPartyConfigs = [config]; + + // Load animations/sfx for Snorlax fight start moves + loadCustomMovesForEncounter([Moves.SNORE]); + + encounter.setDialogueToken("snorlaxName", getPokemonSpecies(Species.SNORLAX).getName()); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle const encounter = globalScene.currentBattle.mysteryEncounter!; - console.log(encounter); - - // Calculate boss mon - const bossSpecies = getPokemonSpecies(Species.SNORLAX); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked - status: [ StatusEffect.SLEEP, 5 ], // Extra turns on timer for Snorlax's start of fight moves - moveSet: [ Moves.REST, Moves.SLEEP_TALK, Moves.CRUNCH, Moves.GIGA_IMPACT ], - modifierConfigs: [ - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType, - stackCount: 2 - }, - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType, - stackCount: 2 - }, - ], - customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), - aiType: AiType.SMART // Required to ensure Snorlax uses Sleep Talk while it is asleep - }; - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - pokemonConfigs: [ pokemonConfig ], - }; - encounter.enemyPartyConfigs = [ config ]; - - // Load animations/sfx for Snorlax fight start moves - loadCustomMovesForEncounter([ Moves.SNORE ]); - - encounter.setDialogueToken("snorlaxName", getPokemonSpecies(Species.SNORLAX).getName()); - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true, + }, + ); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Fall asleep waiting for Snorlax + // Full heal party + globalScene.unshiftPhase(new PartyHealPhase(true)); + queueEncounterMessage(`${namespace}:option.2.rest_result`); + leaveEncounterWithoutBattle(); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.3.selected`, }, ], - }, - async () => { - // Pick battle - const encounter = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.LEFTOVERS ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.SNORE), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.SNORE), - ignorePp: true - }); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Fall asleep waiting for Snorlax - // Full heal party - globalScene.unshiftPhase(new PartyHealPhase(true)); - queueEncounterMessage(`${namespace}:option.2.rest_result`); + }) + .withOptionPhase(async () => { + // Steal the Snorlax's Leftovers + const instance = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + fillRemaining: false, + }); + // Snorlax exp to Pokemon that did the stealing + setEncounterExp(instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp); leaveEncounterWithoutBattle(); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected` - } - ] - }) - .withOptionPhase(async () => { - // Steal the Snorlax's Leftovers - const instance = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.LEFTOVERS ], fillRemaining: false }); - // Snorlax exp to Pokemon that did the stealing - setEncounterExp(instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .build(); + }) + .build(), + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index 57e6fec91bb..c7220192caa 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -1,5 +1,12 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierTypeOption, initBattleWithEnemyConfig, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierTypeOption, + initBattleWithEnemyConfig, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; @@ -23,140 +30,153 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; -import { getEncounterPokemonLevelForWave, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + getEncounterPokemonLevelForWave, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounters/teleportingHijinks"; const MONEY_COST_MULTIPLIER = 1.75; -const BIOME_CANDIDATES = [ Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO ]; -const MACHINE_INTERFACING_TYPES = [ PokemonType.ELECTRIC, PokemonType.STEEL ]; +const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO]; +const MACHINE_INTERFACING_TYPES = [PokemonType.ELECTRIC, PokemonType.STEEL]; /** * Teleporting Hijinks encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3817 | GitHub Issue #3817} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TeleportingHijinksEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TELEPORTING_HIJINKS) - .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 MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "teleporting_hijinks_teleporter", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 4, - y: 4, - yShadow: 1 - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const price = globalScene.getWaveMoneyAmount(MONEY_COST_MULTIPLIER); - encounter.setDialogueToken("price", price.toString()); - encounter.misc = { - price - }; +export const TeleportingHijinksEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TELEPORTING_HIJINKS, +) + .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 MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "teleporting_hijinks_teleporter", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 4, + yShadow: 1, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const price = globalScene.getWaveMoneyAmount(MONEY_COST_MULTIPLIER); + encounter.setDialogueToken("price", price.toString()); + encounter.misc = { + price, + }; - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - } - ], - }) - .withPreOptionPhase(async () => { - // Update money - updatePlayerMoney(-globalScene.currentBattle.mysteryEncounter!.misc.price, true, false); - }) - .withOptionPhase(async () => { - const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); - setEncounterRewards({ fillRemaining: true }); - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPokemonTypeRequirement(MACHINE_INTERFACING_TYPES, true, 1) // Must have Steel or Electric type - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - } - ], - }) - .withOptionPhase(async () => { - const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); - setEncounterRewards({ fillRemaining: true }); - setEncounterExp(globalScene.currentBattle.mysteryEncounter!.selectedOption!.primaryPokemon!.id, 100); - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.3.selected`, + text: `${namespace}:option.1.selected`, }, ], - }, - async () => { - // Inspect the Machine - const encounter = globalScene.currentBattle.mysteryEncounter!; + }) + .withPreOptionPhase(async () => { + // Update money + updatePlayerMoney(-globalScene.currentBattle.mysteryEncounter!.misc.price, true, false); + }) + .withOptionPhase(async () => { + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPokemonTypeRequirement(MACHINE_INTERFACING_TYPES, true, 1) // Must have Steel or Electric type + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); + setEncounterRewards({ fillRemaining: true }); + setEncounterExp(globalScene.currentBattle.mysteryEncounter!.selectedOption!.primaryPokemon!.id, 100); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Inspect the Machine + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Init enemy - const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, level, 0, getPartyLuckValue(globalScene.getPlayerParty()), true); - const bossPokemon = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Init enemy + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + true, + ); + const bossPokemon = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, species: bossSpecies, dataSource: new PokemonData(bossPokemon), isBoss: true, - }], - }; + }, + ], + }; - const magnet = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.STEEL ])!; - const metalCoat = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.ELECTRIC ])!; - setEncounterRewards({ guaranteedModifierTypeOptions: [ magnet, metalCoat ], fillRemaining: true }); - await transitionMysteryEncounterIntroVisuals(true, true); - await initBattleWithEnemyConfig(config); - } - ) - .build(); + const magnet = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.STEEL])!; + const metalCoat = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.ELECTRIC])!; + setEncounterRewards({ + guaranteedModifierTypeOptions: [magnet, metalCoat], + fillRemaining: true, + }); + await transitionMysteryEncounterIntroVisuals(true, true); + await initBattleWithEnemyConfig(config); + }, + ) + .build(); async function doBiomeTransitionDialogueAndBattleInit() { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -167,34 +187,43 @@ async function doBiomeTransitionDialogueAndBattleInit() { // Show dialogue and transition biome await showEncounterText(`${namespace}:transport`); - await Promise.all([ animateBiomeChange(newBiome), transitionMysteryEncounterIntroVisuals() ]); + await Promise.all([animateBiomeChange(newBiome), transitionMysteryEncounterIntroVisuals()]); globalScene.updateBiomeWaveText(); globalScene.playBgm(); await showEncounterText(`${namespace}:attacked`); // Init enemy const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, level, 0, getPartyLuckValue(globalScene.getPlayerParty()), true); + const bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + true, + ); const bossPokemon = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, true); encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = globalScene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; const config: EnemyPartyConfig = { - pokemonConfigs: [{ - level: level, - species: bossSpecies, - dataSource: new PokemonData(bossPokemon), - isBoss: true, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(`${namespace}:boss_enraged`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - } - }], + pokemonConfigs: [ + { + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:boss_enraged`); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); + }, + }, + ], }; return config; @@ -203,7 +232,7 @@ async function doBiomeTransitionDialogueAndBattleInit() { async function animateBiomeChange(nextBiome: Biome) { return new Promise(resolve => { globalScene.tweens.add({ - targets: [ globalScene.arenaEnemy, globalScene.lastEnemyTrainer ], + targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer], x: "+=300", duration: 2000, onComplete: () => { @@ -219,10 +248,10 @@ async function animateBiomeChange(nextBiome: Biome) { globalScene.arenaPlayerTransition.setVisible(true); globalScene.tweens.add({ - targets: [ globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition ], + targets: [globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition], duration: 1000, ease: "Sine.easeInOut", - alpha: (target: any) => target === globalScene.arenaPlayer ? 0 : 1, + alpha: (target: any) => (target === globalScene.arenaPlayer ? 0 : 1), onComplete: () => { globalScene.arenaBg.setTexture(bgTexture); globalScene.arenaPlayer.setBiome(nextBiome); @@ -242,9 +271,9 @@ async function animateBiomeChange(nextBiome: Biome) { targets: globalScene.arenaEnemy, x: "-=300", }); - } + }, }); - } + }, }); }); } 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 802296bfd98..2b29046f738 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 @@ -1,5 +1,9 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + handleMysteryEncounterBattleFailed, + initBattleWithEnemyConfig, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; @@ -39,7 +43,7 @@ const FINAL_STAGE_EVOLUTION_WAVE = 75; const FRIENDSHIP_ADDED = 20; -class BreederSpeciesEvolution { +class BreederSpeciesEvolution { species: Species; evolution: number; @@ -50,29 +54,65 @@ class BreederSpeciesEvolution { } const POOL_1_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ - [ Species.MUNCHLAX, new BreederSpeciesEvolution(Species.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.HAPPINY, new BreederSpeciesEvolution(Species.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.MAGBY, new BreederSpeciesEvolution(Species.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.ELEKID, new BreederSpeciesEvolution(Species.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.RIOLU, new BreederSpeciesEvolution(Species.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.BUDEW, new BreederSpeciesEvolution(Species.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.TOXEL, new BreederSpeciesEvolution(Species.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.MIME_JR, new BreederSpeciesEvolution(Species.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE) ] + [Species.MUNCHLAX, new BreederSpeciesEvolution(Species.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.HAPPINY, + new BreederSpeciesEvolution(Species.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.MAGBY, + new BreederSpeciesEvolution(Species.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.ELEKID, + new BreederSpeciesEvolution(Species.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.RIOLU, new BreederSpeciesEvolution(Species.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.BUDEW, + new BreederSpeciesEvolution(Species.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.TOXEL, new BreederSpeciesEvolution(Species.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.MIME_JR, + new BreederSpeciesEvolution(Species.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE), + ], ]; const POOL_2_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ - [ Species.PICHU, new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.RAICHU, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.PICHU, new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.SMOOCHUM, new BreederSpeciesEvolution(Species.JYNX, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.IGGLYBUFF, new BreederSpeciesEvolution(Species.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.AZURILL, new BreederSpeciesEvolution(Species.MARILL, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.WYNAUT, new BreederSpeciesEvolution(Species.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.CHINGLING, new BreederSpeciesEvolution(Species.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.BONSLY, new BreederSpeciesEvolution(Species.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.MANTYKE, new BreederSpeciesEvolution(Species.MANTINE, SECOND_STAGE_EVOLUTION_WAVE) ] + [ + Species.PICHU, + new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.RAICHU, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.PICHU, + new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.SMOOCHUM, new BreederSpeciesEvolution(Species.JYNX, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.IGGLYBUFF, + new BreederSpeciesEvolution(Species.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.AZURILL, + new BreederSpeciesEvolution(Species.MARILL, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.WYNAUT, new BreederSpeciesEvolution(Species.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.CHINGLING, new BreederSpeciesEvolution(Species.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.BONSLY, new BreederSpeciesEvolution(Species.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.MANTYKE, new BreederSpeciesEvolution(Species.MANTINE, SECOND_STAGE_EVOLUTION_WAVE)], ]; /** @@ -80,291 +120,344 @@ const POOL_2_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3818 | GitHub Issue #3818} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheExpertPokemonBreederEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(4, 6, true) // Must have at least 4 legal pokemon in party - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ +export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(4, 6, true) // Must have at least 4 legal pokemon in party + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: trainerNameKey, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const waveIndex = globalScene.currentBattle.waveIndex; + // Calculates what trainers are available for battle in the encounter + + // If player is in space biome, uses special "Space" version of the trainer + encounter.enemyPartyConfigs = [getPartyConfig()]; + + const cleffaSpecies = + waveIndex < FIRST_STAGE_EVOLUTION_WAVE + ? Species.CLEFFA + : waveIndex < FINAL_STAGE_EVOLUTION_WAVE + ? Species.CLEFAIRY + : Species.CLEFABLE; + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: cleffaSpecies.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 14, + y: -2, + yShadow: -2, }, { - speaker: trainerNameKey, - text: `${namespace}:intro_dialogue`, + spriteKey: "expert_pokemon_breeder", + fileRoot: "trainer", + hasShadow: true, + x: -14, + y: 4, + yShadow: 2, }, - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const waveIndex = globalScene.currentBattle.waveIndex; - // Calculates what trainers are available for battle in the encounter + ]; - // If player is in space biome, uses special "Space" version of the trainer - encounter.enemyPartyConfigs = [ - getPartyConfig() - ]; + // Determine the 3 pokemon the player can battle with + let partyCopy = globalScene.getPlayerParty().slice(0); + partyCopy = partyCopy.filter(p => p.isAllowedInBattle()).sort((a, b) => a.friendship - b.friendship); - const cleffaSpecies = waveIndex < FIRST_STAGE_EVOLUTION_WAVE ? Species.CLEFFA : waveIndex < FINAL_STAGE_EVOLUTION_WAVE ? Species.CLEFAIRY : Species.CLEFABLE; - encounter.spriteConfigs = [ - { - spriteKey: cleffaSpecies.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 14, - y: -2, - yShadow: -2 - }, - { - spriteKey: "expert_pokemon_breeder", - fileRoot: "trainer", - hasShadow: true, - x: -14, - y: 4, - yShadow: 2 - }, - ]; + const pokemon1 = partyCopy[0]; + const pokemon2 = partyCopy[1]; + const pokemon3 = partyCopy[2]; + encounter.setDialogueToken("pokemon1Name", pokemon1.getNameToRender()); + encounter.setDialogueToken("pokemon2Name", pokemon2.getNameToRender()); + encounter.setDialogueToken("pokemon3Name", pokemon3.getNameToRender()); - // Determine the 3 pokemon the player can battle with - let partyCopy = globalScene.getPlayerParty().slice(0); - partyCopy = partyCopy - .filter(p => p.isAllowedInBattle()) - .sort((a, b) => a.friendship - b.friendship); + // Dialogue and egg calcs for Pokemon 1 + const [pokemon1CommonEggs, pokemon1RareEggs] = calculateEggRewardsForPokemon(pokemon1); + let pokemon1Tooltip = getEncounterText(`${namespace}:option.1.tooltip_base`)!; + if (pokemon1RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon1RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon1RareEggs", eggsText); + } + if (pokemon1CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon1CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon1CommonEggs", eggsText); + } + encounter.options[0].dialogue!.buttonTooltip = pokemon1Tooltip; - const pokemon1 = partyCopy[0]; - const pokemon2 = partyCopy[1]; - const pokemon3 = partyCopy[2]; - encounter.setDialogueToken("pokemon1Name", pokemon1.getNameToRender()); - encounter.setDialogueToken("pokemon2Name", pokemon2.getNameToRender()); - encounter.setDialogueToken("pokemon3Name", pokemon3.getNameToRender()); + // Dialogue and egg calcs for Pokemon 2 + const [pokemon2CommonEggs, pokemon2RareEggs] = calculateEggRewardsForPokemon(pokemon2); + let pokemon2Tooltip = getEncounterText(`${namespace}:option.2.tooltip_base`)!; + if (pokemon2RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon2RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon2RareEggs", eggsText); + } + if (pokemon2CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon2CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon2CommonEggs", eggsText); + } + encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; - // Dialogue and egg calcs for Pokemon 1 - const [ pokemon1CommonEggs, pokemon1RareEggs ] = calculateEggRewardsForPokemon(pokemon1); - let pokemon1Tooltip = getEncounterText(`${namespace}:option.1.tooltip_base`)!; - if (pokemon1RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon1RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1RareEggs", eggsText); - } - if (pokemon1CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon1CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1CommonEggs", eggsText); - } - encounter.options[0].dialogue!.buttonTooltip = pokemon1Tooltip; + // Dialogue and egg calcs for Pokemon 3 + const [pokemon3CommonEggs, pokemon3RareEggs] = calculateEggRewardsForPokemon(pokemon3); + let pokemon3Tooltip = getEncounterText(`${namespace}:option.3.tooltip_base`)!; + if (pokemon3RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon3RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon3RareEggs", eggsText); + } + if (pokemon3CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon3CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon3CommonEggs", eggsText); + } + encounter.options[2].dialogue!.buttonTooltip = pokemon3Tooltip; - // Dialogue and egg calcs for Pokemon 2 - const [ pokemon2CommonEggs, pokemon2RareEggs ] = calculateEggRewardsForPokemon(pokemon2); - let pokemon2Tooltip = getEncounterText(`${namespace}:option.2.tooltip_base`)!; - if (pokemon2RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon2RareEggs", eggsText); - } - if (pokemon2CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon2CommonEggs", eggsText); - } - encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; + encounter.misc = { + pokemon1, + pokemon1CommonEggs, + pokemon1RareEggs, + pokemon2, + pokemon2CommonEggs, + pokemon2RareEggs, + pokemon3, + pokemon3CommonEggs, + pokemon3RareEggs, + }; - // Dialogue and egg calcs for Pokemon 3 - const [ pokemon3CommonEggs, pokemon3RareEggs ] = calculateEggRewardsForPokemon(pokemon3); - let pokemon3Tooltip = getEncounterText(`${namespace}:option.3.tooltip_base`)!; - if (pokemon3RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon3RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon3RareEggs", eggsText); - } - if (pokemon3CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon3CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon3CommonEggs", eggsText); - } - encounter.options[2].dialogue!.buttonTooltip = pokemon3Tooltip; + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with first pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - encounter.misc = { - pokemon1, - pokemon1CommonEggs, - pokemon1RareEggs, - pokemon2, - pokemon2CommonEggs, - pokemon2RareEggs, - pokemon3, - pokemon3CommonEggs, - pokemon3RareEggs - }; + const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon1; + encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); + const eggOptions = getEggOptions(pokemon1CommonEggs, pokemon1RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn battle with first pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon1); - const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon1; - encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); - const eggOptions = getEggOptions(pokemon1CommonEggs, pokemon1RareEggs); - setEncounterRewards( - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup()); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon1CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon1RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(encounter, pokemon1); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with second pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon1CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon1RareEggs"] }), - }); - } + const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon2; + encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); + const eggOptions = getEggOptions(pokemon2CommonEggs, pokemon2RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn battle with second pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon2); - const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon2; - encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); - const eggOptions = getEggOptions(pokemon2CommonEggs, pokemon2RareEggs); - setEncounterRewards( - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup()); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon2CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon2RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(encounter, pokemon2); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with third pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon2CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon2RareEggs"] }), - }); - } + const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon3; + encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); + const eggOptions = getEggOptions(pokemon3CommonEggs, pokemon3RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Spawn battle with third pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon3); - const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon3; - encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); - const eggOptions = getEggOptions(pokemon3CommonEggs, pokemon3RareEggs); - setEncounterRewards( - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup()); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon3CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon3RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(encounter, pokemon3); - - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon3CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon3RareEggs"] }), - }); - } - - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOutroDialogue([ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]) - .build(); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOutroDialogue([ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]) + .build(); function getPartyConfig(): EnemyPartyConfig { // Bug type superfan trainer config @@ -373,64 +466,79 @@ function getPartyConfig(): EnemyPartyConfig { breederConfig.name = i18next.t(trainerNameKey); // First mon is *always* this special cleffa - const cleffaSpecies = waveIndex < FIRST_STAGE_EVOLUTION_WAVE ? Species.CLEFFA : waveIndex < FINAL_STAGE_EVOLUTION_WAVE ? Species.CLEFAIRY : Species.CLEFABLE; + const cleffaSpecies = + waveIndex < FIRST_STAGE_EVOLUTION_WAVE + ? Species.CLEFFA + : waveIndex < FINAL_STAGE_EVOLUTION_WAVE + ? Species.CLEFAIRY + : Species.CLEFABLE; const baseConfig: EnemyPartyConfig = { trainerType: TrainerType.EXPERT_POKEMON_BREEDER, pokemonConfigs: [ { - nickname: i18next.t(`${namespace}:cleffa_1_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), + nickname: i18next.t(`${namespace}:cleffa_1_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), species: getPokemonSpecies(cleffaSpecies), isBoss: false, abilityIndex: 1, // Magic Guard shiny: false, nature: Nature.ADAMANT, - moveSet: [ Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH ], - ivs: [ 31, 31, 31, 31, 31, 31 ], + moveSet: [Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH], + ivs: [31, 31, 31, 31, 31, 31], tera: PokemonType.STEEL, - } - ] + }, + ], }; if (globalScene.arena.biomeType === Biome.SPACE) { // All 3 members always Cleffa line, but different configs - baseConfig.pokemonConfigs!.push({ - nickname: i18next.t(`${namespace}:cleffa_2_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), - species: getPokemonSpecies(cleffaSpecies), - isBoss: false, - abilityIndex: 1, // Magic Guard - shiny: true, - variant: 1, - nature: Nature.MODEST, - moveSet: [ Moves.MOONBLAST, Moves.MYSTICAL_FIRE, Moves.ICE_BEAM, Moves.THUNDERBOLT ], - ivs: [ 31, 31, 31, 31, 31, 31 ] - }, - { - nickname: i18next.t(`${namespace}:cleffa_3_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), - species: getPokemonSpecies(cleffaSpecies), - isBoss: false, - abilityIndex: 2, // Friend Guard / Unaware - shiny: true, - variant: 2, - nature: Nature.BOLD, - moveSet: [ Moves.TRI_ATTACK, Moves.STORED_POWER, Moves.TAKE_HEART, Moves.MOONLIGHT ], - ivs: [ 31, 31, 31, 31, 31, 31 ] - }); + baseConfig.pokemonConfigs!.push( + { + nickname: i18next.t(`${namespace}:cleffa_2_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), + species: getPokemonSpecies(cleffaSpecies), + isBoss: false, + abilityIndex: 1, // Magic Guard + shiny: true, + variant: 1, + nature: Nature.MODEST, + moveSet: [Moves.MOONBLAST, Moves.MYSTICAL_FIRE, Moves.ICE_BEAM, Moves.THUNDERBOLT], + ivs: [31, 31, 31, 31, 31, 31], + }, + { + nickname: i18next.t(`${namespace}:cleffa_3_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), + species: getPokemonSpecies(cleffaSpecies), + isBoss: false, + abilityIndex: 2, // Friend Guard / Unaware + shiny: true, + variant: 2, + nature: Nature.BOLD, + moveSet: [Moves.TRI_ATTACK, Moves.STORED_POWER, Moves.TAKE_HEART, Moves.MOONLIGHT], + ivs: [31, 31, 31, 31, 31, 31], + }, + ); } else { // Second member from pool 1 const pool1Species = getSpeciesFromPool(POOL_1_POKEMON, waveIndex); // Third member from pool 2 const pool2Species = getSpeciesFromPool(POOL_2_POKEMON, waveIndex); - baseConfig.pokemonConfigs!.push({ - species: getPokemonSpecies(pool1Species), - isBoss: false, - ivs: [ 31, 31, 31, 31, 31, 31 ] - }, - { - species: getPokemonSpecies(pool2Species), - isBoss: false, - ivs: [ 31, 31, 31, 31, 31, 31 ] - }); + baseConfig.pokemonConfigs!.push( + { + species: getPokemonSpecies(pool1Species), + isBoss: false, + ivs: [31, 31, 31, 31, 31, 31], + }, + { + species: getPokemonSpecies(pool2Species), + isBoss: false, + ivs: [31, 31, 31, 31, 31, 31], + }, + ); } return baseConfig; @@ -471,7 +579,7 @@ function calculateEggRewardsForPokemon(pokemon: PlayerPokemon): [number, number] // 1 Common egg for every point leftover numCommons += totalPoints % 4; - return [ numCommons, numRares ]; + return [numCommons, numRares]; } function getEggOptions(commonEggs: number, rareEggs: number) { @@ -484,7 +592,7 @@ function getEggOptions(commonEggs: number, rareEggs: number) { pulled: false, sourceType: EggSourceType.EVENT, eggDescriptor: eggDescription, - tier: EggTier.COMMON + tier: EggTier.COMMON, }); } } @@ -494,7 +602,7 @@ function getEggOptions(commonEggs: number, rareEggs: number) { pulled: false, sourceType: EggSourceType.EVENT, eggDescriptor: eggDescription, - tier: EggTier.RARE + tier: EggTier.RARE, }); } } @@ -508,11 +616,8 @@ function removePokemonFromPartyAndStoreHeldItems(encounter: MysteryEncounter, ch party[chosenIndex] = party[0]; party[0] = chosenPokemon; encounter.misc.originalParty = globalScene.getPlayerParty().slice(1); - encounter.misc.originalPartyHeldItems = encounter.misc.originalParty - .map(p => p.getHeldItems()); - globalScene["party"] = [ - chosenPokemon - ]; + encounter.misc.originalPartyHeldItems = encounter.misc.originalParty.map(p => p.getHeldItems()); + globalScene["party"] = [chosenPokemon]; } function restorePartyAndHeldItems() { @@ -522,11 +627,11 @@ function restorePartyAndHeldItems() { // Restore held items const originalHeldItems = encounter.misc.originalPartyHeldItems; - originalHeldItems.forEach((pokemonHeldItemsList: PokemonHeldItemModifier[]) => { - pokemonHeldItemsList.forEach(heldItem => { + for (const pokemonHeldItemsList of originalHeldItems) { + for (const heldItem of pokemonHeldItemsList) { globalScene.addModifier(heldItem, true, false, false, true); - }); - }); + } + } globalScene.updateModifiers(true); } @@ -542,7 +647,7 @@ function onGameOver() { // Restore original party, player loses all friendship with chosen mon (it remains fainted) restorePartyAndHeldItems(); - const chosenPokemon = encounter.misc.chosenPokemon; + const chosenPokemon = encounter.misc.chosenPokemon; chosenPokemon.friendship = 0; // Clear all rewards that would have been earned @@ -571,7 +676,7 @@ function onGameOver() { scale: 0.5, onComplete: () => { pokemon.leaveField(true, true, true); - } + }, }); } @@ -593,11 +698,10 @@ function onGameOver() { y: "+=16", alpha: 1, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); }); - handleMysteryEncounterBattleFailed(true); return false; diff --git a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts index ff4dd9750c9..fb55c55a1a3 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -1,11 +1,19 @@ -import { leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { catchPokemon, getRandomSpeciesByStarterCost, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + catchPokemon, + getRandomSpeciesByStarterCost, + getSpriteKeysFromPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; @@ -35,143 +43,149 @@ const SHINY_MAGIKARP_WEIGHT = 100; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3799 | GitHub Issue #3799} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ThePokemonSalesmanEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "pokemon_salesman", - fileRoot: "mystery-encounters", - hasShadow: true - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_POKEMON_SALESMAN, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "pokemon_salesman", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - let species = getSalesmanSpeciesOffer(); - let tries = 0; + let species = getSalesmanSpeciesOffer(); + let tries = 0; - // Reroll any species that don't have HAs - while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) { - species = getSalesmanSpeciesOffer(); - tries++; - } + // Reroll any species that don't have HAs + while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) { + species = getSalesmanSpeciesOffer(); + tries++; + } - let pokemon: PlayerPokemon; - if (randSeedInt(SHINY_MAGIKARP_WEIGHT) === 0 || isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) { - // If no HA mon found or you roll 1%, give shiny Magikarp with random variant - species = getPokemonSpecies(Species.MAGIKARP); - pokemon = new PlayerPokemon(species, 5, 2, species.formIndex, undefined, true); - } else { - pokemon = new PlayerPokemon(species, 5, 2, species.formIndex); - } - pokemon.generateAndPopulateMoveset(); + let pokemon: PlayerPokemon; + if ( + randSeedInt(SHINY_MAGIKARP_WEIGHT) === 0 || + isNullOrUndefined(species.abilityHidden) || + species.abilityHidden === Abilities.NONE + ) { + // If no HA mon found or you roll 1%, give shiny Magikarp with random variant + species = getPokemonSpecies(Species.MAGIKARP); + pokemon = new PlayerPokemon(species, 5, 2, species.formIndex, undefined, true); + } else { + pokemon = new PlayerPokemon(species, 5, 2, species.formIndex); + } + pokemon.generateAndPopulateMoveset(); - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); - encounter.spriteConfigs.push({ - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - isShiny: pokemon.shiny, - variant: pokemon.variant - }); + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); + encounter.spriteConfigs.push({ + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant, + }); - const starterTier = speciesStarterCosts[species.speciesId]; - // Prices decrease by starter tier less than 5, but only reduces cost by half at max - let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); - if (pokemon.shiny) { - // Always max price for shiny (flip HA back to normal), and add special messaging - priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; - pokemon.abilityIndex = 0; - encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:description_shiny`; - encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltip_shiny`; - } - const price = globalScene.getWaveMoneyAmount(priceMultiplier); - encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("price", price.toString()); - encounter.misc = { - price: price, - pokemon: pokemon - }; + const starterTier = speciesStarterCosts[species.speciesId]; + // Prices decrease by starter tier less than 5, but only reduces cost by half at max + let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); + if (pokemon.shiny) { + // Always max price for shiny (flip HA back to normal), and add special messaging + priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; + pokemon.abilityIndex = 0; + encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:description_shiny`; + encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltip_shiny`; + } + const price = globalScene.getWaveMoneyAmount(priceMultiplier); + encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("price", price.toString()); + encounter.misc = { + price: price, + pokemon: pokemon, + }; - pokemon.calculateStats(); + pokemon.calculateStats(); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withHasDexProgress(true) - .withSceneMoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected_message`, - } - ], - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const price = encounter.misc.price; - const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; - - // Update money - updatePlayerMoney(-price, true, false); - - // Show dialogue - await showEncounterDialogue(`${namespace}:option.1.selected_dialogue`, `${namespace}:speaker`); - await transitionMysteryEncounterIntroVisuals(); - - // "Catch" purchased pokemon - const data = new PokemonData(purchasedPokemon); - data.player = false; - await catchPokemon(data.toPokemon() as EnemyPokemon, null, PokeballType.POKEBALL, true, true); - - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withHasDexProgress(true) + .withSceneMoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected_message`, }, ], - }, - async () => { - // Leave encounter with no rewards or exp + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const price = encounter.misc.price; + const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; + + // Update money + updatePlayerMoney(-price, true, false); + + // Show dialogue + await showEncounterDialogue(`${namespace}:option.1.selected_dialogue`, `${namespace}:speaker`); + await transitionMysteryEncounterIntroVisuals(); + + // "Catch" purchased pokemon + const data = new PokemonData(purchasedPokemon); + data.player = false; + await catchPokemon(data.toPokemon() as EnemyPokemon, null, PokeballType.POKEBALL, true, true); + leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); /** * @returns A random species that has at most 5 starter cost and is not Mythical, Paradox, etc. */ export function getSalesmanSpeciesOffer(): PokemonSpecies { - return getPokemonSpecies(getRandomSpeciesByStarterCost([ 0, 5 ], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false)); + return getPokemonSpecies( + getRandomSpeciesByStarterCost([0, 5], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false), + ); } diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 9e94e87938e..e54df048430 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,5 +1,12 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + loadCustomMovesForEncounter, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + generateModifierType, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -35,179 +42,188 @@ const BST_INCREASE_VALUE = 10; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3803 | GitHub Issue #3803} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheStrongStuffEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party - .withMaxAllowedEncounters(1) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "berry_juice", - fileRoot: "items", - hasShadow: true, - isItem: true, - scale: 1.25, - x: -15, - y: 3, - disableAnimation: true - }, - { - spriteKey: Species.SHUCKLE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - scale: 1.25, - x: 20, - y: 10, - yShadow: 7 - }, - ]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit(() => { +export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_STRONG_STUFF, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party + .withMaxAllowedEncounters(1) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "berry_juice", + fileRoot: "items", + hasShadow: true, + isItem: true, + scale: 1.25, + x: -15, + y: 3, + disableAnimation: true, + }, + { + spriteKey: Species.SHUCKLE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 1.25, + x: 20, + y: 10, + yShadow: 7, + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 1, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SHUCKLE), + isBoss: true, + bossSegments: 5, + shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), + nature: Nature.BOLD, + moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], + modifierConfigs: [ + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.2.stat_boost`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.DEF, Stat.SPDEF], 2), + ); + }, + }, + ], + }; + + encounter.enemyPartyConfigs = [config]; + + loadCustomMovesForEncounter([Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); + + encounter.setDialogueToken("shuckleName", getPokemonSpecies(Species.SHUCKLE).getName()); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { const encounter = globalScene.currentBattle.mysteryEncounter!; + // Do blackout and hide intro visuals during blackout + globalScene.time.delayedCall(750, () => { + transitionMysteryEncounterIntroVisuals(true, true, 50); + }); - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 1, - disableSwitch: true, - pokemonConfigs: [ - { - species: getPokemonSpecies(Species.SHUCKLE), - isBoss: true, - bossSegments: 5, - shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked - customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), - nature: Nature.BOLD, - moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], - modifierConfigs: [ - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.APICOT ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, - stackCount: 2 - } - ], - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(`${namespace}:option.2.stat_boost`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.DEF, Stat.SPDEF ], 2)); - } - } - ], - }; + // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP) + // Sort party by bst + const sortedParty = globalScene + .getPlayerParty() + .slice(0) + .sort((pokemon1, pokemon2) => { + const pokemon1Bst = pokemon1.getSpeciesForm().getBaseStatTotal(); + const pokemon2Bst = pokemon2.getSpeciesForm().getBaseStatTotal(); + return pokemon2Bst - pokemon1Bst; + }); - encounter.enemyPartyConfigs = [ config ]; + sortedParty.forEach((pokemon, index) => { + if (index < 2) { + // -15 to the two highest BST mons + modifyPlayerPokemonBST(pokemon, -HIGH_BST_REDUCTION_VALUE); + encounter.setDialogueToken("highBstPokemon" + (index + 1), pokemon.getNameToRender()); + } else { + // +10 for the rest + modifyPlayerPokemonBST(pokemon, BST_INCREASE_VALUE); + } + }); - loadCustomMovesForEncounter([ Moves.GASTRO_ACID, Moves.STEALTH_ROCK ]); - - encounter.setDialogueToken("shuckleName", getPokemonSpecies(Species.SHUCKLE).getName()); + encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString()); + encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString()); + await showEncounterText(`${namespace}:option.1.selected_2`, null, undefined, true); + encounter.dialogue.outro = [ + { + text: `${namespace}:outro`, + }, + ]; + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(true); return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected` - } - ] - }, - async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - // Do blackout and hide intro visuals during blackout - globalScene.time.delayedCall(750, () => { - transitionMysteryEncounterIntroVisuals(true, true, 50); - }); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SOUL_DEW], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.GASTRO_ACID), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.STEALTH_ROCK), + ignorePp: true, + }, + ); - // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP) - // Sort party by bst - const sortedParty = globalScene.getPlayerParty().slice(0) - .sort((pokemon1, pokemon2) => { - const pokemon1Bst = pokemon1.getSpeciesForm().getBaseStatTotal(); - const pokemon2Bst = pokemon2.getSpeciesForm().getBaseStatTotal(); - return pokemon2Bst - pokemon1Bst; - }); - - sortedParty.forEach((pokemon, index) => { - if (index < 2) { - // -15 to the two highest BST mons - modifyPlayerPokemonBST(pokemon, -HIGH_BST_REDUCTION_VALUE); - encounter.setDialogueToken("highBstPokemon" + (index + 1), pokemon.getNameToRender()); - } else { - // +10 for the rest - modifyPlayerPokemonBST(pokemon, BST_INCREASE_VALUE); - } - }); - - encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString()); - encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString()); - await showEncounterText(`${namespace}:option.1.selected_2`, null, undefined, true); - - encounter.dialogue.outro = [ - { - text: `${namespace}:outro`, - } - ]; - setEncounterRewards({ fillRemaining: true }); - leaveEncounterWithoutBattle(true); - return true; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Pick battle - const encounter = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.SOUL_DEW ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.GASTRO_ACID), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.STEALTH_ROCK), - ignorePp: true - }); - - encounter.dialogue.outro = []; - await transitionMysteryEncounterIntroVisuals(true, true, 500); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - } - ) - .build(); + encounter.dialogue.outro = []; + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index c1a74f67c49..aca04ad50ed 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -1,5 +1,12 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + generateModifierTypeOption, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -36,111 +43,115 @@ const namespace = "mysteryEncounters/theWinstrateChallenge"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3821 | GitHub Issue #3821} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheWinstrateChallengeEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withIntroSpriteConfigs([ - { - spriteKey: "vito", - fileRoot: "trainer", - hasShadow: false, - x: 16, - y: -4 - }, - { - spriteKey: "vivi", - fileRoot: "trainer", - hasShadow: false, - x: -14, - y: -4 - }, - { - spriteKey: "victor", - fileRoot: "trainer", - hasShadow: true, - x: -32 - }, - { - spriteKey: "victoria", - fileRoot: "trainer", - hasShadow: true, - x: 40, - }, - { - spriteKey: "vicky", - fileRoot: "trainer", - hasShadow: true, - x: 3, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withAutoHideIntroVisuals(false) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const TheWinstrateChallengeEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_WINSTRATE_CHALLENGE, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withIntroSpriteConfigs([ + { + spriteKey: "vito", + fileRoot: "trainer", + hasShadow: false, + x: 16, + y: -4, + }, + { + spriteKey: "vivi", + fileRoot: "trainer", + hasShadow: false, + x: -14, + y: -4, + }, + { + spriteKey: "victor", + fileRoot: "trainer", + hasShadow: true, + x: -32, + }, + { + spriteKey: "victoria", + fileRoot: "trainer", + hasShadow: true, + x: 40, + }, + { + spriteKey: "vicky", + fileRoot: "trainer", + hasShadow: true, + x: 3, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withAutoHideIntroVisuals(false) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Loaded back to front for pop() operations - encounter.enemyPartyConfigs.push(getVitoTrainerConfig()); - encounter.enemyPartyConfigs.push(getVickyTrainerConfig()); - encounter.enemyPartyConfigs.push(getViviTrainerConfig()); - encounter.enemyPartyConfigs.push(getVictoriaTrainerConfig()); - encounter.enemyPartyConfigs.push(getVictorTrainerConfig()); + // Loaded back to front for pop() operations + encounter.enemyPartyConfigs.push(getVitoTrainerConfig()); + encounter.enemyPartyConfigs.push(getVickyTrainerConfig()); + encounter.enemyPartyConfigs.push(getViviTrainerConfig()); + encounter.enemyPartyConfigs.push(getVictoriaTrainerConfig()); + encounter.enemyPartyConfigs.push(getVictorTrainerConfig()); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected`, - }, - ], - }, - async () => { - // Spawn 5 trainer battles back to back with Macho Brace in rewards - globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = async () => { - await endTrainerBattleAndShowDialogue(); - }; - await transitionMysteryEncounterIntroVisuals(true, false); - await spawnNextTrainerOrEndEncounter(); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Refuse the challenge, they full heal the party and give the player a Rarer Candy - globalScene.unshiftPhase(new PartyHealPhase(true)); - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.RARER_CANDY ], fillRemaining: false }); - leaveEncounterWithoutBattle(); - } - ) - .build(); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Spawn 5 trainer battles back to back with Macho Brace in rewards + globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = async () => { + await endTrainerBattleAndShowDialogue(); + }; + await transitionMysteryEncounterIntroVisuals(true, false); + await spawnNextTrainerOrEndEncounter(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Refuse the challenge, they full heal the party and give the player a Rarer Candy + globalScene.unshiftPhase(new PartyHealPhase(true)); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.RARER_CANDY], + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .build(); async function spawnNextTrainerOrEndEncounter() { const encounter = globalScene.currentBattle.mysteryEncounter!; @@ -159,7 +170,10 @@ async function spawnNextTrainerOrEndEncounter() { globalScene.ui.clearText(); // Clears "Winstrate" title from screen as rewards get animated in const machoBrace = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE)!; machoBrace.type.tier = ModifierTier.MASTER; - setEncounterRewards({ guaranteedModifierTypeOptions: [ machoBrace ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: [machoBrace], + fillRemaining: false, + }); encounter.doContinueEncounter = undefined; leaveEncounterWithoutBattle(false, MysteryEncounterMode.NO_BATTLE); } else { @@ -168,6 +182,7 @@ async function spawnNextTrainerOrEndEncounter() { } function endTrainerBattleAndShowDialogue(): Promise { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { if (globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs.length === 0) { // Battle is over @@ -182,7 +197,7 @@ function endTrainerBattleAndShowDialogue(): Promise { duration: 750, onComplete: () => { globalScene.field.remove(trainer, true); - } + }, }); } @@ -191,13 +206,19 @@ function endTrainerBattleAndShowDialogue(): Promise { } else { globalScene.arena.resetArenaEffects(); const playerField = globalScene.getPlayerField(); - playerField.forEach((pokemon) => pokemon.lapseTag(BattlerTagType.COMMANDED)); + for (const pokemon of playerField) { + pokemon.lapseTag(BattlerTagType.COMMANDED); + } playerField.forEach((_, p) => globalScene.unshiftPhase(new ReturnPhase(p))); for (const pokemon of globalScene.getPlayerParty()) { // Only trigger form change when Eiscue is in Noice form // Hardcoded Eiscue for now in case it is fused with another pokemon - if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + if ( + pokemon.species.speciesId === Species.EISCUE && + pokemon.hasAbility(Abilities.ICE_FACE) && + pokemon.formIndex === 1 + ) { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } @@ -222,7 +243,7 @@ function endTrainerBattleAndShowDialogue(): Promise { onComplete: () => { globalScene.field.remove(trainer, true); resolve(); - } + }, }); } } @@ -238,38 +259,38 @@ function getVictorTrainerConfig(): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK ], + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, - isTransferable: false + isTransferable: false, }, { modifier: generateModifierType(modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] + ], }, { species: getPokemonSpecies(Species.OBSTAGOON), isBoss: false, abilityIndex: 1, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH ], + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, - isTransferable: false + isTransferable: false, }, { modifier: generateModifierType(modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] - } - ] + isTransferable: false, + }, + ], + }, + ], }; } @@ -282,39 +303,43 @@ function getVictoriaTrainerConfig(): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Natural Cure nature: Nature.CALM, - moveSet: [ Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER ], + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, - isTransferable: false + isTransferable: false, }, { modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.GARDEVOIR), isBoss: false, formIndex: 1, nature: Nature.TIMID, - moveSet: [ Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP ], + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.PSYCHIC ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.PSYCHIC, + ]) as PokemonHeldItemModifierType, stackCount: 1, - isTransferable: false + isTransferable: false, }, { - modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.FAIRY ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.FAIRY, + ]) as PokemonHeldItemModifierType, stackCount: 1, - isTransferable: false - } - ] - } - ] + isTransferable: false, + }, + ], + }, + ], }; } @@ -327,53 +352,53 @@ function getViviTrainerConfig(): EnemyPartyConfig { isBoss: false, abilityIndex: 3, // Lightning Rod nature: Nature.ADAMANT, - moveSet: [ Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST ], + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, { - modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [ Stat.HP ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.BRELOOM), isBoss: false, abilityIndex: 1, // Poison Heal nature: Nature.JOLLY, - moveSet: [ Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH ], + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [ Stat.HP ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, - isTransferable: false + isTransferable: false, }, { modifier: generateModifierType(modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.CAMERUPT), isBoss: false, formIndex: 1, nature: Nature.CALM, - moveSet: [ Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT ], + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 3, - isTransferable: false + isTransferable: false, }, - ] - } - ] + ], + }, + ], }; } @@ -386,15 +411,15 @@ function getVickyTrainerConfig(): EnemyPartyConfig { isBoss: false, formIndex: 1, nature: Nature.IMPISH, - moveSet: [ Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH ], + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, - isTransferable: false - } - ] - } - ] + isTransferable: false, + }, + ], + }, + ], }; } @@ -407,110 +432,110 @@ function getVitoTrainerConfig(): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Soundproof nature: Nature.MODEST, - moveSet: [ Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE ], + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [ Stat.SPD ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.SWALOT), isBoss: false, abilityIndex: 2, // Gluttony nature: Nature.QUIET, - moveSet: [ Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE ], + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.APICOT ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.STARF ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.SALAC ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LANSAT ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LIECHI ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.PETAYA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(modifierTypes.BERRY, [ BerryType.LEPPA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, stackCount: 2, - } - ] + }, + ], }, { species: getPokemonSpecies(Species.DODRIO), isBoss: false, abilityIndex: 2, // Tangled Feet nature: Nature.JOLLY, - moveSet: [ Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF ], + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.ALAKAZAM), isBoss: false, formIndex: 1, nature: Nature.BOLD, - moveSet: [ Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT ], + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] + ], }, { species: getPokemonSpecies(Species.DARMANITAN), isBoss: false, abilityIndex: 0, // Sheer Force nature: Nature.IMPISH, - moveSet: [ Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE ], + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], modifierConfigs: [ { modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] - } - ] + ], + }, + ], }; } diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 9cb388e343c..cc56f3efa42 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -1,7 +1,12 @@ import type { Ability } from "#app/data/ability"; import { allAbilities } from "#app/data/ability"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getNatureName } from "#app/data/nature"; import { speciesStarterCosts } from "#app/data/balance/starters"; import type { PlayerPokemon } from "#app/field/pokemon"; @@ -35,360 +40,350 @@ const namespace = "mysteryEncounters/trainingSession"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3802 | GitHub Issue #3802} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrainingSessionEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRAINING_SESSION) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party - .withFleeAllowed(false) - .withHideWildIntroMessage(true) - .withPreventGameStatsUpdates(true) // Do not count the Pokemon as seen or defeated since it is ours - .withIntroSpriteConfigs([ - { - spriteKey: "training_session_gear", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 6, - x: 5, - yShadow: -2 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - encounter.misc = { - playerPokemon: pokemon, +export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TRAINING_SESSION, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party + .withFleeAllowed(false) + .withHideWildIntroMessage(true) + .withPreventGameStatsUpdates(true) // Do not count the Pokemon as seen or defeated since it is ours + .withIntroSpriteConfigs([ + { + spriteKey: "training_session_gear", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 6, + x: 5, + yShadow: -2, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.misc = { + playerPokemon: pokemon, + }; + }; + + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn light training session with chosen pokemon + // Every 50 waves, add +1 boss segment, capping at 5 + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 50), 5); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + globalScene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + encounter.setDialogueToken("stat1", "-"); + encounter.setDialogueToken("stat2", "-"); + // Add the pokemon back to party with IV boost + let ivIndexes: any[] = []; + playerPokemon.ivs.forEach((iv, index) => { + if (iv < 31) { + ivIndexes.push({ iv: iv, index: index }); + } + }); + + // Improves 2 random non-maxed IVs + // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 + // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) + // 5-14 starting IV caps in 5 encounters + // 15-19 starting IV caps in 4 encounters + // 20-24 starting IV caps in 3 encounters + // 25-27 starting IV caps in 2 encounters + let improvedCount = 0; + while (ivIndexes.length > 0 && improvedCount < 2) { + ivIndexes = randSeedShuffle(ivIndexes); + const ivToChange = ivIndexes.pop(); + let newVal = ivToChange.iv; + if (improvedCount === 0) { + encounter.setDialogueToken("stat1", i18next.t(getStatKey(ivToChange.index)) ?? ""); + } else { + encounter.setDialogueToken("stat2", i18next.t(getStatKey(ivToChange.index)) ?? ""); + } + + // Corrects required encounter breakpoints to be continuous for all IV values + if (ivToChange.iv <= 21 && ivToChange.iv - (1 % 5) === 0) { + newVal += 1; + } + + newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; + newVal = Math.min(newVal, 31); + playerPokemon.ivs[ivToChange.index] = newVal; + improvedCount++; + } + + if (improvedCount > 0) { + playerPokemon.calculateStats(); + globalScene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); + globalScene.gameData.setPokemonCaught(playerPokemon, false); + } + + // Add pokemon and mods back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + queueEncounterMessage(`${namespace}:option.1.finished`); + }; + + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); + + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:option.2.select_prompt`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + // Open menu for selecting pokemon and Nature + const encounter = globalScene.currentBattle.mysteryEncounter!; + const natures = new Array(25).fill(null).map((_val, i) => i as Nature); + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return natures.map((nature: Nature) => { + const option: OptionSelectItem = { + label: getNatureName(nature, true, true, true, globalScene.uiTheme), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("nature", getNatureName(nature)); + encounter.misc = { + playerPokemon: pokemon, + chosenNature: nature, + }; + return true; + }, }; - }; + return option; + }); + }; - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); - }; + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - // Spawn light training session with chosen pokemon - // Every 50 waves, add +1 boss segment, capping at 5 - const segments = Math.min( - 2 + Math.floor(globalScene.currentBattle.waveIndex / 50), - 5 - ); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(playerPokemon, segments, modifiers); - globalScene.removePokemonFromPlayerParty(playerPokemon, false); + // Spawn medium training session with chosen pokemon + // Every 40 waves, add +1 boss segment, capping at 6 + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 40), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + globalScene.removePokemonFromPlayerParty(playerPokemon, false); - const onBeforeRewardsPhase = () => { - encounter.setDialogueToken("stat1", "-"); - encounter.setDialogueToken("stat2", "-"); - // Add the pokemon back to party with IV boost - let ivIndexes: any[] = []; - playerPokemon.ivs.forEach((iv, index) => { - if (iv < 31) { - ivIndexes.push({ iv: iv, index: index }); - } - }); + const onBeforeRewardsPhase = () => { + queueEncounterMessage(`${namespace}:option.2.finished`); + // Add the pokemon back to party with Nature change + playerPokemon.setCustomNature(encounter.misc.chosenNature); + globalScene.gameData.unlockSpeciesNature(playerPokemon.species, encounter.misc.chosenNature); - // Improves 2 random non-maxed IVs - // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 - // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) - // 5-14 starting IV caps in 5 encounters - // 15-19 starting IV caps in 4 encounters - // 20-24 starting IV caps in 3 encounters - // 25-27 starting IV caps in 2 encounters - let improvedCount = 0; - while (ivIndexes.length > 0 && improvedCount < 2) { - ivIndexes = randSeedShuffle(ivIndexes); - const ivToChange = ivIndexes.pop(); - let newVal = ivToChange.iv; - if (improvedCount === 0) { - encounter.setDialogueToken( - "stat1", - i18next.t(getStatKey(ivToChange.index)) ?? "" - ); - } else { - encounter.setDialogueToken( - "stat2", - i18next.t(getStatKey(ivToChange.index)) ?? "" - ); - } + // Add pokemon and modifiers back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + }; - // Corrects required encounter breakpoints to be continuous for all IV values - if (ivToChange.iv <= 21 && ivToChange.iv - (1 % 5) === 0) { - newVal += 1; - } + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); - newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; - newVal = Math.min(newVal, 31); - playerPokemon.ivs[ivToChange.index] = newVal; - improvedCount++; - } + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + // Open menu for selecting pokemon and ability to learn + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for ability selection + const speciesForm = pokemon.getFusionSpeciesForm() + ? pokemon.getFusionSpeciesForm() + : pokemon.getSpeciesForm(); + const abilityCount = speciesForm.getAbilityCount(); + const abilities: Ability[] = new Array(abilityCount) + .fill(null) + .map((_val, i) => allAbilities[speciesForm.getAbility(i)]); - if (improvedCount > 0) { - playerPokemon.calculateStats(); - globalScene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); - globalScene.gameData.setPokemonCaught(playerPokemon, false); - } - - // Add pokemon and mods back - globalScene.getPlayerParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - globalScene.addModifier(mod, true, false, false, true); - } - globalScene.updateModifiers(true); - queueEncounterMessage(`${namespace}:option.1.finished`); - }; - - setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); - - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:option.2.select_prompt`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - // Open menu for selecting pokemon and Nature - const encounter = globalScene.currentBattle.mysteryEncounter!; - const natures = new Array(25).fill(null).map((val, i) => i as Nature); - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for nature selection - return natures.map((nature: Nature) => { + const optionSelectItems: OptionSelectItem[] = []; + abilities.forEach((ability: Ability, index) => { + if (!optionSelectItems.some(o => o.label === ability.name)) { const option: OptionSelectItem = { - label: getNatureName(nature, true, true, true, globalScene.uiTheme), + label: ability.name, handler: () => { - // Pokemon and second option selected - encounter.setDialogueToken("nature", getNatureName(nature)); + // Pokemon and ability selected + encounter.setDialogueToken("ability", ability.name); encounter.misc = { playerPokemon: pokemon, - chosenNature: nature, + abilityIndex: index, }; return true; }, + onHover: () => { + showEncounterText(ability.description, 0, 0, false); + }, }; - return option; - }); - }; - - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); - }; - - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - - // Spawn medium training session with chosen pokemon - // Every 40 waves, add +1 boss segment, capping at 6 - const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 40), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(playerPokemon, segments, modifiers); - globalScene.removePokemonFromPlayerParty(playerPokemon, false); - - const onBeforeRewardsPhase = () => { - queueEncounterMessage(`${namespace}:option.2.finished`); - // Add the pokemon back to party with Nature change - playerPokemon.setCustomNature(encounter.misc.chosenNature); - globalScene.gameData.unlockSpeciesNature(playerPokemon.species, encounter.misc.chosenNature); - - // Add pokemon and modifiers back - globalScene.getPlayerParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - globalScene.addModifier(mod, true, false, false, true); + optionSelectItems.push(option); } - globalScene.updateModifiers(true); - }; + }); - setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); + return optionSelectItems; + }; - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (): Promise => { - // Open menu for selecting pokemon and ability to learn - const encounter = globalScene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for ability selection - const speciesForm = !!pokemon.getFusionSpeciesForm() - ? pokemon.getFusionSpeciesForm() - : pokemon.getSpeciesForm(); - const abilityCount = speciesForm.getAbilityCount(); - const abilities: Ability[] = new Array(abilityCount) - .fill(null) - .map((val, i) => allAbilities[speciesForm.getAbility(i)]); + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; - const optionSelectItems: OptionSelectItem[] = []; - abilities.forEach((ability: Ability, index) => { - if (!optionSelectItems.some(o => o.label === ability.name)) { - const option: OptionSelectItem = { - label: ability.name, - handler: () => { - // Pokemon and ability selected - encounter.setDialogueToken("ability", ability.name); - encounter.misc = { - playerPokemon: pokemon, - abilityIndex: index, - }; - return true; - }, - onHover: () => { - showEncounterText(ability.description, 0, 0, false); - }, - }; - optionSelectItems.push(option); - } - }); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - return optionSelectItems; - }; + // Spawn hard training session with chosen pokemon + // Every 30 waves, add +1 boss segment, capping at 6 + // Also starts with +1 to all stats + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 30), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + globalScene.removePokemonFromPlayerParty(playerPokemon, false); - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); - }; + const onBeforeRewardsPhase = () => { + queueEncounterMessage(`${namespace}:option.3.finished`); + // Add the pokemon back to party with ability change + const abilityIndex = encounter.misc.abilityIndex; - return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async () => { - const encounter = globalScene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + if (playerPokemon.getFusionSpeciesForm()) { + playerPokemon.fusionAbilityIndex = abilityIndex; - // Spawn hard training session with chosen pokemon - // Every 30 waves, add +1 boss segment, capping at 6 - // Also starts with +1 to all stats - const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 30), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(playerPokemon, segments, modifiers); - config.pokemonConfigs![0].tags = [ - BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, - ]; - globalScene.removePokemonFromPlayerParty(playerPokemon, false); - - const onBeforeRewardsPhase = () => { - queueEncounterMessage(`${namespace}:option.3.finished`); - // Add the pokemon back to party with ability change - const abilityIndex = encounter.misc.abilityIndex; - - if (!!playerPokemon.getFusionSpeciesForm()) { - playerPokemon.fusionAbilityIndex = abilityIndex; - - // Only update the fusion's dex data if the Pokemon is already caught in dex (ignore rentals) - const rootFusionSpecies = playerPokemon.fusionSpecies?.getRootSpeciesId(); - if (!isNullOrUndefined(rootFusionSpecies) - && speciesStarterCosts.hasOwnProperty(rootFusionSpecies) - && !!globalScene.gameData.dexData[rootFusionSpecies].caughtAttr) { - globalScene.gameData.starterData[rootFusionSpecies].abilityAttr |= playerPokemon.fusionAbilityIndex !== 1 || playerPokemon.fusionSpecies?.ability2 + // Only update the fusion's dex data if the Pokemon is already caught in dex (ignore rentals) + const rootFusionSpecies = playerPokemon.fusionSpecies?.getRootSpeciesId(); + if ( + !isNullOrUndefined(rootFusionSpecies) && + speciesStarterCosts.hasOwnProperty(rootFusionSpecies) && + !!globalScene.gameData.dexData[rootFusionSpecies].caughtAttr + ) { + globalScene.gameData.starterData[rootFusionSpecies].abilityAttr |= + playerPokemon.fusionAbilityIndex !== 1 || playerPokemon.fusionSpecies?.ability2 ? 1 << playerPokemon.fusionAbilityIndex : AbilityAttr.ABILITY_HIDDEN; - } - } else { - playerPokemon.abilityIndex = abilityIndex; } + } else { + playerPokemon.abilityIndex = abilityIndex; + } - playerPokemon.calculateStats(); - globalScene.gameData.setPokemonCaught(playerPokemon, false); + playerPokemon.calculateStats(); + globalScene.gameData.setPokemonCaught(playerPokemon, false); - // Add pokemon and mods back - globalScene.getPlayerParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - globalScene.addModifier(mod, true, false, false, true); - } - globalScene.updateModifiers(true); - }; + // Add pokemon and mods back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + }; - setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); - await initBattleWithEnemyConfig(config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - selected: [ - { - text: `${namespace}:option.4.selected`, - }, - ], - }, - async () => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + selected: [ + { + text: `${namespace}:option.4.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); function getEnemyConfig(playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { playerPokemon.resetSummonData(); // Passes modifiers by reference modifiers.value = playerPokemon.getHeldItems(); - const modifierConfigs = modifiers.value.map((mod) => { + const modifierConfigs = modifiers.value.map(mod => { return { modifier: mod.clone(), isTransferable: false, - stackCount: mod.stackCount + stackCount: mod.stackCount, }; }) as HeldModifierConfig[]; @@ -410,6 +405,4 @@ function getEnemyConfig(playerPokemon: PlayerPokemon, segments: number, modifier class ModifiersHolder { public value: PokemonHeldItemModifier[] = []; - - constructor() {} } 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 a17b05c4e33..1c617aa2c7f 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -1,5 +1,12 @@ import type { EnemyPartyConfig, EnemyPokemonConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -34,135 +41,149 @@ const SHOP_ITEM_COST_MULTIPLIER = 2.5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3809 | GitHub Issue #3809} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrashToTreasureEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(60, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withMaxAllowedEncounters(1) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.GARBODOR.toString() + "-gigantamax", - fileRoot: "pokemon", - hasShadow: false, - disableAnimation: true, - scale: 1.5, - y: 8, - tint: 0.4 - } - ]) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TRASH_TO_TREASURE, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(60, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withMaxAllowedEncounters(1) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.GARBODOR.toString() + "-gigantamax", + fileRoot: "pokemon", + hasShadow: false, + disableAnimation: true, + scale: 1.5, + y: 8, + tint: 0.4, + }, + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon (shiny locked) - const bossSpecies = getPokemonSpecies(Species.GARBODOR); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - shiny: false, // Shiny lock because of custom intro sprite - formIndex: 1, // Gmax - bossSegmentModifier: 1, // +1 Segment from normal - moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ] - }; - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - pokemonConfigs: [ pokemonConfig ], - disableSwitch: true - }; - encounter.enemyPartyConfigs = [ config ]; + // Calculate boss mon (shiny locked) + const bossSpecies = getPokemonSpecies(Species.GARBODOR); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + shiny: false, // Shiny lock because of custom intro sprite + formIndex: 1, // Gmax + bossSegmentModifier: 1, // +1 Segment from normal + moveSet: [Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH], + }; + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + pokemonConfigs: [pokemonConfig], + disableSwitch: true, + }; + encounter.enemyPartyConfigs = [config]; - // Load animations/sfx for Garbodor fight start moves - loadCustomMovesForEncounter([ Moves.TOXIC, Moves.AMNESIA ]); + // Load animations/sfx for Garbodor fight start moves + loadCustomMovesForEncounter([Moves.TOXIC, Moves.AMNESIA]); - globalScene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav"); - globalScene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav"); + globalScene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav"); + globalScene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav"); - encounter.setDialogueToken("costMultiplier", SHOP_ITEM_COST_MULTIPLIER.toString()); + encounter.setDialogueToken("costMultiplier", SHOP_ITEM_COST_MULTIPLIER.toString()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async () => { - // Play Dig2 and then Venom Drench sfx - doGarbageDig(); - }) - .withOptionPhase(async () => { - // Gain 2 Leftovers and 2 Shell Bell - await transitionMysteryEncounterIntroVisuals(); - await tryApplyDigRewardItems(); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Play Dig2 and then Venom Drench sfx + doGarbageDig(); + }) + .withOptionPhase(async () => { + // Gain 2 Leftovers and 2 Shell Bell + await transitionMysteryEncounterIntroVisuals(); + await tryApplyDigRewardItems(); - const blackSludge = generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_BLACK_SLUDGE, [ SHOP_ITEM_COST_MULTIPLIER ]); - const modifier = blackSludge?.newModifier(); - if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); - globalScene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 }); - await showEncounterText(i18next.t("battle:rewardGain", { modifierName: modifier.type.name }), null, undefined, true); - } + const blackSludge = generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_BLACK_SLUDGE, [ + SHOP_ITEM_COST_MULTIPLIER, + ]); + const modifier = blackSludge?.newModifier(); + if (modifier) { + await globalScene.addModifier(modifier, false, false, false, true); + globalScene.playSound("battle_anims/PRSFX- Venom Drench", { + volume: 2, + }); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: modifier.type.name, + }), + null, + undefined, + true, + ); + } - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async () => { - // Investigate garbage, battle Gmax Garbodor - globalScene.setFieldScale(0.75); - await showEncounterText(`${namespace}:option.2.selected_2`); - await transitionMysteryEncounterIntroVisuals(); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Investigate garbage, battle Gmax Garbodor + globalScene.setFieldScale(0.75); + await showEncounterText(`${namespace}:option.2.selected_2`); + await transitionMysteryEncounterIntroVisuals(); - const encounter = globalScene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.TOXIC), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY ], - move: new PokemonMove(Moves.AMNESIA), - ignorePp: true - }); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .build(); + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TOXIC), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.AMNESIA), + ignorePp: true, + }, + ); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .build(); async function tryApplyDigRewardItems() { const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; @@ -173,8 +194,10 @@ async function tryApplyDigRewardItems() { // Iterate over the party until an item was successfully given // First leftovers for (const pokemon of party) { - const heldItems = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount()) { @@ -185,8 +208,10 @@ async function tryApplyDigRewardItems() { // Second leftovers for (const pokemon of party) { - const heldItems = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount()) { @@ -196,12 +221,22 @@ async function tryApplyDigRewardItems() { } globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGainCount", { modifierName: leftovers.name, count: 2 }), null, undefined, true); + await showEncounterText( + i18next.t("battle:rewardGainCount", { + modifierName: leftovers.name, + count: 2, + }), + null, + undefined, + true, + ); // First Shell bell for (const pokemon of party) { - const heldItems = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount()) { @@ -212,8 +247,10 @@ async function tryApplyDigRewardItems() { // Second Shell bell for (const pokemon of party) { - const heldItems = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount()) { @@ -223,7 +260,15 @@ async function tryApplyDigRewardItems() { } globalScene.playSound("item_fanfare"); - await showEncounterText(i18next.t("battle:rewardGainCount", { modifierName: shellBell.name, count: 2 }), null, undefined, true); + await showEncounterText( + i18next.t("battle:rewardGainCount", { + modifierName: shellBell.name, + count: 2, + }), + null, + undefined, + true, + ); } function doGarbageDig() { diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index 6c0219688da..ed1866c7a1b 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -1,6 +1,12 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { getRandomEncounterSpecies, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + getRandomEncounterSpecies, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import type Pokemon from "#app/field/pokemon"; import type { EnemyPokemon } from "#app/field/pokemon"; @@ -9,10 +15,17 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { MoveRequirement, PersistentModifierRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + MoveRequirement, + PersistentModifierRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + catchPokemon, + getHighestLevelPlayerPokemon, + getSpriteKeysFromPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import type { Moves } from "#enums/moves"; @@ -34,223 +47,228 @@ const namespace = "mysteryEncounters/uncommonBreed"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3811 | GitHub Issue #3811} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const UncommonBreedEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.UNCOMMON_BREED) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit(() => { - const encounter = globalScene.currentBattle.mysteryEncounter!; +export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.UNCOMMON_BREED, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - // Level equal to 2 below highest party member - const level = getHighestLevelPlayerPokemon(false, true).level - 2; - const pokemon = getRandomEncounterSpecies(level, true, true); + // Calculate boss mon + // Level equal to 2 below highest party member + const level = getHighestLevelPlayerPokemon(false, true).level - 2; + const pokemon = getRandomEncounterSpecies(level, true, true); - // Pokemon will always have one of its egg moves in its moveset - const eggMoves = pokemon.getEggMoves(); - if (eggMoves) { - const eggMoveIndex = randSeedInt(4); - const randomEggMove: Moves = eggMoves[eggMoveIndex]; - encounter.misc = { - eggMove: randomEggMove, - pokemon: pokemon - }; - if (pokemon.moveset.length < 4) { - pokemon.moveset.push(new PokemonMove(randomEggMove)); - } else { - pokemon.moveset[0] = new PokemonMove(randomEggMove); - } + // Pokemon will always have one of its egg moves in its moveset + const eggMoves = pokemon.getEggMoves(); + if (eggMoves) { + const eggMoveIndex = randSeedInt(4); + const randomEggMove: Moves = eggMoves[eggMoveIndex]; + encounter.misc = { + eggMove: randomEggMove, + pokemon: pokemon, + }; + if (pokemon.moveset.length < 4) { + pokemon.moveset.push(new PokemonMove(randomEggMove)); } else { - encounter.misc.pokemon = pokemon; + pokemon.moveset[0] = new PokemonMove(randomEggMove); } + } else { + encounter.misc.pokemon = pokemon; + } - // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = globalScene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + // Defense/Spd buffs below wave 50, +1 to all stats otherwise + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, species: pokemon.species, dataSource: new PokemonData(pokemon), isBoss: false, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { queueEncounterMessage(`${namespace}:option.1.stat_boost`); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); - encounter.spriteConfigs = [ - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - x: -5, - repeat: true, - isPokemon: true, - isShiny: pokemon.shiny, - variant: pokemon.variant + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }, }, - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; - encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender()); - globalScene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav"); - return true; - }) - .withOnVisualsStart(() => { - // Animate the pokemon - const encounter = globalScene.currentBattle.mysteryEncounter!; - const pokemonSprite = encounter.introVisuals!.getSprites(); - - // Bounce at the end, then shiny sparkle if the Pokemon is shiny - globalScene.tweens.add({ - targets: pokemonSprite, - duration: 300, - ease: "Cubic.easeOut", - yoyo: true, - y: "-=20", - loop: 1, - onComplete: () => encounter.introVisuals?.playShinySparkles() - }); - - globalScene.time.delayedCall(500, () => globalScene.playSound("battle_anims/PRSFX- Spotlight2")); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + x: -5, + repeat: true, + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant, + }, + ]; + + encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender()); + globalScene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav"); + return true; + }) + .withOnVisualsStart(() => { + // Animate the pokemon + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemonSprite = encounter.introVisuals!.getSprites(); + + // Bounce at the end, then shiny sparkle if the Pokemon is shiny + globalScene.tweens.add({ + targets: pokemonSprite, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=20", + loop: 1, + onComplete: () => encounter.introVisuals?.playShinySparkles(), + }); + + globalScene.time.delayedCall(500, () => globalScene.playSound("battle_anims/PRSFX- Spotlight2")); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + const eggMove = encounter.misc.eggMove; + if (!isNullOrUndefined(eggMove)) { + // Check what type of move the egg move is to determine target + const pokemonMove = new PokemonMove(eggMove); + const move = pokemonMove.getMove(); + const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER; + + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [target], + move: pokemonMove, + ignorePp: true, + }); + } + + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.2.selected`, }, ], - }, - async () => { - // Pick battle - const encounter = globalScene.currentBattle.mysteryEncounter!; + }) + .withOptionPhase(async () => { + // Give it some food - const eggMove = encounter.misc.eggMove; - if (!isNullOrUndefined(eggMove)) { - // Check what type of move the egg move is to determine target - const pokemonMove = new PokemonMove(eggMove); - const move = pokemonMove.getMove(); - const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER; - - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ target ], - move: pokemonMove, - ignorePp: true - }); + // Remove 4 random berries from player's party + // Get all player berry items, remove from party, and store reference + const berryItems: BerryModifier[] = globalScene.findModifiers( + m => m instanceof BerryModifier, + ) as BerryModifier[]; + for (let i = 0; i < 4; i++) { + const index = randSeedInt(berryItems.length); + const randBerry = berryItems[index]; + randBerry.stackCount--; + if (randBerry.stackCount === 0) { + globalScene.removeModifier(randBerry); + berryItems.splice(index, 1); + } } + await globalScene.updateModifiers(true, true); + // Pokemon joins the team, with 2 egg moves + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; + + // Give 1 additional egg move + givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); + + await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); setEncounterRewards({ fillRemaining: true }); - await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected` - } - ] - }) - .withOptionPhase(async () => { - // Give it some food + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Attract the pokemon with a move + // Pokemon joins the team, with 2 egg moves and IVs rolled an additional time + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; - // Remove 4 random berries from player's party - // Get all player berry items, remove from party, and store reference - const berryItems: BerryModifier[] = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; - for (let i = 0; i < 4; i++) { - const index = randSeedInt(berryItems.length); - const randBerry = berryItems[index]; - randBerry.stackCount--; - if (randBerry.stackCount === 0) { - globalScene.removeModifier(randBerry); - berryItems.splice(index, 1); - } - } - await globalScene.updateModifiers(true, true); + // Give 1 additional egg move + givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - // Pokemon joins the team, with 2 egg moves - const encounter = globalScene.currentBattle.mysteryEncounter!; - const pokemon = encounter.misc.pokemon; + // Roll IVs a second time + pokemon.ivs = pokemon.ivs.map(iv => { + const newValue = randSeedInt(31); + return newValue > iv ? newValue : iv; + }); - // Give 1 additional egg move - givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - - await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); - setEncounterRewards({ fillRemaining: true }); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected` - } - ] - }) - .withOptionPhase(async () => { - // Attract the pokemon with a move - // Pokemon joins the team, with 2 egg moves and IVs rolled an additional time - const encounter = globalScene.currentBattle.mysteryEncounter!; - const pokemon = encounter.misc.pokemon; - - // Give 1 additional egg move - givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - - // Roll IVs a second time - pokemon.ivs = pokemon.ivs.map(iv => { - const newValue = randSeedInt(31); - return newValue > iv ? newValue : iv; - }); - - await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); - if (encounter.selectedOption?.primaryPokemon?.id) { - setEncounterExp(encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false); - } - setEncounterRewards({ fillRemaining: true }); - leaveEncounterWithoutBattle(); - }) - .build() - ) - .build(); + await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); + if (encounter.selectedOption?.primaryPokemon?.id) { + setEncounterExp(encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false); + } + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .build(); function givePokemonExtraEggMove(pokemon: EnemyPokemon, previousEggMove: Moves) { const eggMoves = pokemon.getEggMoves(); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 4f9338ac5cc..758e3fabd76 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -6,7 +6,12 @@ import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounte import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; -import { generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, +} from "../utils/encounter-phase-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import type { PlayerPokemon } from "#app/field/pokemon"; @@ -23,7 +28,10 @@ import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter- import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; +import { + doPokemonTransformationSequence, + TransformationScreenPosition, +} from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat } from "#enums/stat"; import { Challenges } from "#enums/challenges"; @@ -104,230 +112,260 @@ const PERCENT_LEVEL_LOSS_ON_REFUSE = 10; * Value ranges of the resulting species BST transformations after adding values to original species * 2 Pokemon in the party use this range */ -const HIGH_BST_TRANSFORM_BASE_VALUES: [number, number] = [ 90, 110 ]; +const HIGH_BST_TRANSFORM_BASE_VALUES: [number, number] = [90, 110]; /** * Value ranges of the resulting species BST transformations after adding values to original species * All remaining Pokemon in the party use this range */ -const STANDARD_BST_TRANSFORM_BASE_VALUES: [number, number] = [ 40, 50 ]; +const STANDARD_BST_TRANSFORM_BASE_VALUES: [number, number] = [40, 50]; /** * Weird Dream encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3822 | GitHub Issue #3822} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const WeirdDreamEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withDisallowedChallenges(Challenges.SINGLE_TYPE, Challenges.SINGLE_GENERATION) - // TODO: should reset minimum wave to 10 when there are more Rogue tiers in pool. Matching Dark Deal minimum for now. - .withSceneWaveRangeRequirement(30, 140) - .withIntroSpriteConfigs([ - { - spriteKey: "weird_dream_woman", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 11, - yShadow: 6, - x: 4 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit(() => { - globalScene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); +export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.WEIRD_DREAM, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withDisallowedChallenges(Challenges.SINGLE_TYPE, Challenges.SINGLE_GENERATION) + // TODO: should reset minimum wave to 10 when there are more Rogue tiers in pool. Matching Dark Deal minimum for now. + .withSceneWaveRangeRequirement(30, 140) + .withIntroSpriteConfigs([ + { + spriteKey: "weird_dream_woman", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 11, + yShadow: 6, + x: 4, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + globalScene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); - // Calculate all the newly transformed Pokemon and begin asset load - const teamTransformations = getTeamTransformations(); - const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); - globalScene.currentBattle.mysteryEncounter!.misc = { - teamTransformations, - loadAssets + // Calculate all the newly transformed Pokemon and begin asset load + const teamTransformations = getTeamTransformations(); + const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); + globalScene.currentBattle.mysteryEncounter!.misc = { + teamTransformations, + loadAssets, + }; + + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_weird_dream"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Play the animation as the player goes through the dialogue + globalScene.time.delayedCall(1000, () => { + doShowDreamBackground(); + }); + + for (const transformation of globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations) { + globalScene.removePokemonFromPlayerParty(transformation.previousPokemon, false); + globalScene.getPlayerParty().push(transformation.newPokemon); + } + }) + .withOptionPhase(async () => { + // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue + const cutsceneDialoguePromise = showEncounterText(`${namespace}:option.1.cutscene`); + + // Change the entire player's party + // Wait for all new Pokemon assets to be loaded before showing transformation animations + await Promise.all(globalScene.currentBattle.mysteryEncounter!.misc.loadAssets); + const transformations = globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; + + // If there are 1-3 transformations, do them centered back to back + // Otherwise, the first 3 transformations are executed side-by-side, then any remaining 1-3 transformations occur in those same respective positions + if (transformations.length <= 3) { + for (const transformation of transformations) { + const pokemon1 = transformation.previousPokemon; + const pokemon2 = transformation.newPokemon; + + await doPokemonTransformationSequence(pokemon1, pokemon2, TransformationScreenPosition.CENTER); + } + } else { + await doSideBySideTransformations(transformations); + } + + // Make sure player has finished cutscene dialogue + await cutsceneDialoguePromise; + + doHideDreamBackground(); + await showEncounterText(`${namespace}:option.1.dream_complete`); + + await doNewTeamPostProcess(transformations); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [ + modifierTypes.MEMORY_MUSHROOM, + modifierTypes.ROGUE_BALL, + modifierTypes.MINT, + modifierTypes.MINT, + modifierTypes.MINT, + ], + fillRemaining: false, + }); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Battle your "future" team for some item rewards + const transformations: PokemonTransformation[] = + globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; + + // Uses the pokemon that player's party would have transformed into + const enemyPokemonConfigs: EnemyPokemonConfig[] = []; + for (const transformation of transformations) { + const newPokemon = transformation.newPokemon; + const previousPokemon = transformation.previousPokemon; + + await postProcessTransformedPokemon(previousPokemon, newPokemon, newPokemon.species.getRootSpeciesId(), true); + + const dataSource = new PokemonData(newPokemon); + dataSource.player = false; + + // Copy held items to new pokemon + const newPokemonHeldItemConfigs: HeldModifierConfig[] = []; + for (const item of transformation.heldItems) { + newPokemonHeldItemConfigs.push({ + modifier: item.clone() as PokemonHeldItemModifier, + stackCount: item.getStackCount(), + isTransferable: false, + }); + } + // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats + if (shouldGetOldGateau(newPokemon)) { + const stats = getOldGateauBoostedStats(newPokemon); + newPokemonHeldItemConfigs.push({ + modifier: generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU, [ + OLD_GATEAU_STATS_UP, + stats, + ]) as PokemonHeldItemModifierType, + stackCount: 1, + isTransferable: false, + }); + } + + const enemyConfig: EnemyPokemonConfig = { + species: transformation.newSpecies, + isBoss: newPokemon.getSpeciesForm().getBaseStatTotal() > NON_LEGENDARY_BST_THRESHOLD, + level: previousPokemon.level, + dataSource: dataSource, + modifierConfigs: newPokemonHeldItemConfigs, + }; + + enemyPokemonConfigs.push(enemyConfig); + } + + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; + const trainerConfig = + trainerConfigs[ + genderIndex === PlayerGender.FEMALE ? TrainerType.FUTURE_SELF_F : TrainerType.FUTURE_SELF_M + ].clone(); + trainerConfig.setPartyTemplates(new TrainerPartyTemplate(transformations.length, PartyMemberStrength.STRONG)); + const enemyPartyConfig: EnemyPartyConfig = { + trainerConfig: trainerConfig, + pokemonConfigs: enemyPokemonConfigs, + female: genderIndex === PlayerGender.FEMALE, }; - return true; - }) - .withOnVisualsStart(() => { - globalScene.fadeAndSwitchBgm("mystery_encounter_weird_dream"); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - } + const onBeforeRewards = () => { + // Before battle rewards, unlock the passive on a pokemon in the player's team for the rest of the run (not permanently) + // One random pokemon will get its passive unlocked + const passiveDisabledPokemon = globalScene.getPlayerParty().filter(p => !p.passive); + if (passiveDisabledPokemon?.length > 0) { + const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; + enablePassiveMon.passive = true; + enablePassiveMon.updateInfo(true); + } + }; + + setEncounterRewards( + { + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.GREAT, + ModifierTier.GREAT, ], - }) - .withPreOptionPhase(async () => { - // Play the animation as the player goes through the dialogue - globalScene.time.delayedCall(1000, () => { - doShowDreamBackground(); - }); + fillRemaining: false, + }, + undefined, + onBeforeRewards, + ); - for (const transformation of globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations) { - globalScene.removePokemonFromPlayerParty(transformation.previousPokemon, false); - globalScene.getPlayerParty().push(transformation.newPokemon); - } - }) - .withOptionPhase(async () => { - // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue - const cutsceneDialoguePromise = showEncounterText(`${namespace}:option.1.cutscene`); + await showEncounterText(`${namespace}:option.2.selected_2`, null, undefined, true); + await initBattleWithEnemyConfig(enemyPartyConfig); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave, reduce party levels by 10% + for (const pokemon of globalScene.getPlayerParty()) { + pokemon.level = Math.max(Math.ceil(((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100) * pokemon.level), 1); + pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); + pokemon.levelExp = 0; - // Change the entire player's party - // Wait for all new Pokemon assets to be loaded before showing transformation animations - await Promise.all(globalScene.currentBattle.mysteryEncounter!.misc.loadAssets); - const transformations = globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; - - // If there are 1-3 transformations, do them centered back to back - // Otherwise, the first 3 transformations are executed side-by-side, then any remaining 1-3 transformations occur in those same respective positions - if (transformations.length <= 3) { - for (const transformation of transformations) { - const pokemon1 = transformation.previousPokemon; - const pokemon2 = transformation.newPokemon; - - await doPokemonTransformationSequence(pokemon1, pokemon2, TransformationScreenPosition.CENTER); - } - } else { - await doSideBySideTransformations(transformations); - } - - // Make sure player has finished cutscene dialogue - await cutsceneDialoguePromise; - - doHideDreamBackground(); - await showEncounterText(`${namespace}:option.1.dream_complete`); - - await doNewTeamPostProcess(transformations); - setEncounterRewards({ guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.ROGUE_BALL, modifierTypes.MINT, modifierTypes.MINT, modifierTypes.MINT ], fillRemaining: false }); - leaveEncounterWithoutBattle(true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async () => { - // Battle your "future" team for some item rewards - const transformations: PokemonTransformation[] = globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; - - // Uses the pokemon that player's party would have transformed into - const enemyPokemonConfigs: EnemyPokemonConfig[] = []; - for (const transformation of transformations) { - const newPokemon = transformation.newPokemon; - const previousPokemon = transformation.previousPokemon; - - await postProcessTransformedPokemon(previousPokemon, newPokemon, newPokemon.species.getRootSpeciesId(), true); - - const dataSource = new PokemonData(newPokemon); - dataSource.player = false; - - // Copy held items to new pokemon - const newPokemonHeldItemConfigs: HeldModifierConfig[] = []; - for (const item of transformation.heldItems) { - newPokemonHeldItemConfigs.push({ - modifier: item.clone() as PokemonHeldItemModifier, - stackCount: item.getStackCount(), - isTransferable: false - }); - } - // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats - if (shouldGetOldGateau(newPokemon)) { - const stats = getOldGateauBoostedStats(newPokemon); - newPokemonHeldItemConfigs.push({ - modifier: generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU, [ OLD_GATEAU_STATS_UP, stats ]) as PokemonHeldItemModifierType, - stackCount: 1, - isTransferable: false - }); - } - - const enemyConfig: EnemyPokemonConfig = { - species: transformation.newSpecies, - isBoss: newPokemon.getSpeciesForm().getBaseStatTotal() > NON_LEGENDARY_BST_THRESHOLD, - level: previousPokemon.level, - dataSource: dataSource, - modifierConfigs: newPokemonHeldItemConfigs - }; - - enemyPokemonConfigs.push(enemyConfig); - } - - const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; - const trainerConfig = trainerConfigs[genderIndex === PlayerGender.FEMALE ? TrainerType.FUTURE_SELF_F : TrainerType.FUTURE_SELF_M].clone(); - trainerConfig.setPartyTemplates(new TrainerPartyTemplate(transformations.length, PartyMemberStrength.STRONG)); - const enemyPartyConfig: EnemyPartyConfig = { - trainerConfig: trainerConfig, - pokemonConfigs: enemyPokemonConfigs, - female: genderIndex === PlayerGender.FEMALE - }; - - const onBeforeRewards = () => { - // Before battle rewards, unlock the passive on a pokemon in the player's team for the rest of the run (not permanently) - // One random pokemon will get its passive unlocked - const passiveDisabledPokemon = globalScene.getPlayerParty().filter(p => !p.passive); - if (passiveDisabledPokemon?.length > 0) { - const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; - enablePassiveMon.passive = true; - enablePassiveMon.updateInfo(true); - } - }; - - setEncounterRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], fillRemaining: false }, undefined, onBeforeRewards); - - await showEncounterText(`${namespace}:option.2.selected_2`, null, undefined, true); - await initBattleWithEnemyConfig(enemyPartyConfig); + pokemon.calculateStats(); + pokemon.getBattleInfo().setLevel(pokemon.level); + await pokemon.updateInfo(); } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }, - async () => { - // Leave, reduce party levels by 10% - for (const pokemon of globalScene.getPlayerParty()) { - pokemon.level = Math.max(Math.ceil((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100 * pokemon.level), 1); - pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); - pokemon.levelExp = 0; - pokemon.calculateStats(); - pokemon.getBattleInfo().setLevel(pokemon.level); - await pokemon.updateInfo(); - } - - leaveEncounterWithoutBattle(true); - return true; - } - ) - .build(); + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); interface PokemonTransformation { previousPokemon: PlayerPokemon; @@ -342,7 +380,7 @@ function getTeamTransformations(): PokemonTransformation[] { const alreadyUsedSpecies: PokemonSpecies[] = party.map(p => p.species); const pokemonTransformations: PokemonTransformation[] = party.map(p => { return { - previousPokemon: p + previousPokemon: p, } as PokemonTransformation; }); @@ -358,7 +396,9 @@ function getTeamTransformations(): PokemonTransformation[] { for (let i = 0; i < numPokemon; i++) { const removed = removedPokemon[i]; const index = pokemonTransformations.findIndex(p => p.previousPokemon.id === removed.id); - pokemonTransformations[index].heldItems = removed.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); + pokemonTransformations[index].heldItems = removed + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier)); const bst = removed.getSpeciesForm().getBaseStatTotal(); let newBstRange: [number, number]; @@ -368,7 +408,13 @@ function getTeamTransformations(): PokemonTransformation[] { newBstRange = STANDARD_BST_TRANSFORM_BASE_VALUES; } - const newSpecies = getTransformedSpecies(bst, newBstRange, hasPokemonInSuperLegendaryBstThreshold, hasPokemonInLegendaryBstThreshold, alreadyUsedSpecies); + const newSpecies = getTransformedSpecies( + bst, + newBstRange, + hasPokemonInSuperLegendaryBstThreshold, + hasPokemonInLegendaryBstThreshold, + alreadyUsedSpecies, + ); const newSpeciesBst = newSpecies.getBaseStatTotal(); if (newSpeciesBst > SUPER_LEGENDARY_BST_THRESHOLD) { @@ -378,7 +424,6 @@ function getTeamTransformations(): PokemonTransformation[] { hasPokemonInLegendaryBstThreshold = true; } - pokemonTransformations[index].newSpecies = newSpecies; console.log("New species: " + JSON.stringify(newSpecies)); alreadyUsedSpecies.push(newSpecies); @@ -386,7 +431,12 @@ function getTeamTransformations(): PokemonTransformation[] { for (const transformation of pokemonTransformations) { const newAbilityIndex = randSeedInt(transformation.newSpecies.getAbilityCount()); - transformation.newPokemon = globalScene.addPlayerPokemon(transformation.newSpecies, transformation.previousPokemon.level, newAbilityIndex, undefined); + transformation.newPokemon = globalScene.addPlayerPokemon( + transformation.newSpecies, + transformation.previousPokemon.level, + newAbilityIndex, + undefined, + ); } return pokemonTransformations; @@ -411,8 +461,9 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats if (shouldGetOldGateau(newPokemon)) { const stats = getOldGateauBoostedStats(newPokemon); - const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU() - .generateType(globalScene.getPlayerParty(), [ OLD_GATEAU_STATS_UP, stats ]) + const modType = modifierTypes + .MYSTERY_ENCOUNTER_OLD_GATEAU() + .generateType(globalScene.getPlayerParty(), [OLD_GATEAU_STATS_UP, stats]) ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { @@ -446,7 +497,12 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { * @param speciesRootForm * @param forBattle Default `false`. If false, will perform achievements and dex unlocks for the player. */ -async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { +async function postProcessTransformedPokemon( + previousPokemon: PlayerPokemon, + newPokemon: PlayerPokemon, + speciesRootForm: Species, + forBattle = false, +): Promise { let isNewStarter = false; // Roll HA a second time if (newPokemon.species.abilityHidden) { @@ -470,11 +526,17 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new }); // Roll a neutral nature - newPokemon.nature = [ Nature.HARDY, Nature.DOCILE, Nature.BASHFUL, Nature.QUIRKY, Nature.SERIOUS ][randSeedInt(5)]; + newPokemon.nature = [Nature.HARDY, Nature.DOCILE, Nature.BASHFUL, Nature.QUIRKY, Nature.SERIOUS][randSeedInt(5)]; // For pokemon at/below 570 BST or any shiny pokemon, unlock it permanently as if you had caught it - if (!forBattle && (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny())) { - if (newPokemon.getSpeciesForm().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { + if ( + !forBattle && + (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny()) + ) { + if ( + newPokemon.getSpeciesForm().abilityHidden && + newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1 + ) { globalScene.validateAchv(achvs.HIDDEN_ABILITY); } @@ -494,7 +556,11 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new const newStarterUnlocked = await globalScene.gameData.setPokemonCaught(newPokemon, true, false, false); if (newStarterUnlocked) { isNewStarter = true; - await showEncounterText(i18next.t("battle:addedAsAStarter", { pokemonName: getPokemonSpecies(speciesRootForm).getName() })); + await showEncounterText( + i18next.t("battle:addedAsAStarter", { + pokemonName: getPokemonSpecies(speciesRootForm).getName(), + }), + ); } } @@ -528,7 +594,7 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new // Randomize the second type of the pokemon // If the pokemon does not normally have a second type, it will gain 1 - const newTypes = [ PokemonType.UNKNOWN ]; + const newTypes = [PokemonType.UNKNOWN]; let newType = randSeedInt(18) as PokemonType; while (newType === newTypes[0]) { newType = randSeedInt(18) as PokemonType; @@ -568,23 +634,30 @@ function getOldGateauBoostedStats(pokemon: Pokemon): Stat[] { return stats; } - -function getTransformedSpecies(originalBst: number, bstSearchRange: [number, number], hasPokemonBstHigherThan600: boolean, hasPokemonBstBetween570And600: boolean, alreadyUsedSpecies: PokemonSpecies[]): PokemonSpecies { +function getTransformedSpecies( + originalBst: number, + bstSearchRange: [number, number], + hasPokemonBstHigherThan600: boolean, + hasPokemonBstBetween570And600: boolean, + alreadyUsedSpecies: PokemonSpecies[], +): PokemonSpecies { let newSpecies: PokemonSpecies | undefined; while (isNullOrUndefined(newSpecies)) { const bstCap = originalBst + bstSearchRange[1]; const bstMin = Math.max(originalBst + bstSearchRange[0], 0); // Get any/all species that fall within the Bst range requirements - let validSpecies = allSpecies - .filter(s => { - const speciesBst = s.getBaseStatTotal(); - const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; - // Checks that a Pokemon has not already been added in the +600 or 570-600 slots; - const validBst = (!hasPokemonBstBetween570And600 || (speciesBst < NON_LEGENDARY_BST_THRESHOLD || speciesBst > SUPER_LEGENDARY_BST_THRESHOLD)) && - (!hasPokemonBstHigherThan600 || speciesBst <= SUPER_LEGENDARY_BST_THRESHOLD); - return bstInRange && validBst && !EXCLUDED_TRANSFORMATION_SPECIES.includes(s.speciesId); - }); + let validSpecies = allSpecies.filter(s => { + const speciesBst = s.getBaseStatTotal(); + const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; + // Checks that a Pokemon has not already been added in the +600 or 570-600 slots; + const validBst = + (!hasPokemonBstBetween570And600 || + speciesBst < NON_LEGENDARY_BST_THRESHOLD || + speciesBst > SUPER_LEGENDARY_BST_THRESHOLD) && + (!hasPokemonBstHigherThan600 || speciesBst <= SUPER_LEGENDARY_BST_THRESHOLD); + return bstInRange && validBst && !EXCLUDED_TRANSFORMATION_SPECIES.includes(s.speciesId); + }); // There must be at least 20 species available before it will choose one if (validSpecies?.length > 20) { @@ -608,7 +681,13 @@ function doShowDreamBackground() { 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, 0); + const transformationStaticBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); transformationStaticBg.setName("Black Background"); transformationStaticBg.setOrigin(0, 0); transformationContainer.add(transformationStaticBg); @@ -631,7 +710,7 @@ function doShowDreamBackground() { targets: transformationContainer, alpha: 1, duration: 3000, - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } @@ -645,7 +724,7 @@ function doHideDreamBackground() { ease: "Sine.easeInOut", onComplete: () => { globalScene.fieldUI.remove(transformationContainer, true); - } + }, }); } @@ -660,16 +739,15 @@ function doSideBySideTransformations(transformations: PokemonTransformation[]) { const pokemon2 = transformation.newPokemon; const screenPosition = i as TransformationScreenPosition; - const transformationPromise = doPokemonTransformationSequence(pokemon1, pokemon2, screenPosition) - .then(() => { - if (transformations.length > i + 3) { - const nextTransformationAtPosition = transformations[i + 3]; - const nextPokemon1 = nextTransformationAtPosition.previousPokemon; - const nextPokemon2 = nextTransformationAtPosition.newPokemon; + const transformationPromise = doPokemonTransformationSequence(pokemon1, pokemon2, screenPosition).then(() => { + if (transformations.length > i + 3) { + const nextTransformationAtPosition = transformations[i + 3]; + const nextPokemon1 = nextTransformationAtPosition.previousPokemon; + const nextPokemon2 = nextTransformationAtPosition.newPokemon; - allTransformationPromises.push(doPokemonTransformationSequence(nextPokemon1, nextPokemon2, screenPosition)); - } - }); + allTransformationPromises.push(doPokemonTransformationSequence(nextPokemon1, nextPokemon2, screenPosition)); + } + }); allTransformationPromises.push(transformationPromise); }); } @@ -691,11 +769,15 @@ function doSideBySideTransformations(transformations: PokemonTransformation[]) { * @param newPokemon * @param speciesRootForm */ -async function addEggMoveToNewPokemonMoveset(newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { +async function addEggMoveToNewPokemonMoveset( + newPokemon: PlayerPokemon, + speciesRootForm: Species, + forBattle = false, +): Promise { let eggMoveIndex: null | number = null; const eggMoves = newPokemon.getEggMoves()?.slice(0); if (eggMoves) { - const eggMoveIndices = randSeedShuffle([ 0, 1, 2, 3 ]); + const eggMoveIndices = randSeedShuffle([0, 1, 2, 3]); let randomEggMoveIndex = eggMoveIndices.pop(); let randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null; let retries = 0; @@ -717,7 +799,11 @@ async function addEggMoveToNewPokemonMoveset(newPokemon: PlayerPokemon, speciesR } // For pokemon that the player owns (including ones just caught), unlock the egg move - if (!forBattle && !isNullOrUndefined(randomEggMoveIndex) && !!globalScene.gameData.dexData[speciesRootForm].caughtAttr) { + if ( + !forBattle && + !isNullOrUndefined(randomEggMoveIndex) && + !!globalScene.gameData.dexData[speciesRootForm].caughtAttr + ) { await globalScene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true); } } @@ -732,11 +818,18 @@ async function addEggMoveToNewPokemonMoveset(newPokemon: PlayerPokemon, speciesR * @param newPokemonGeneratedMoveset * @param newEggMoveIndex */ -function addFavoredMoveToNewPokemonMoveset(newPokemon: PlayerPokemon, newPokemonGeneratedMoveset: (PokemonMove | null)[], newEggMoveIndex: number | null) { +function addFavoredMoveToNewPokemonMoveset( + newPokemon: PlayerPokemon, + newPokemonGeneratedMoveset: (PokemonMove | null)[], + newEggMoveIndex: number | null, +) { let favoredMove: PokemonMove | null = null; for (const move of newPokemonGeneratedMoveset) { // Needs to match first type, second type will be replaced - if (move?.getMove().type === newPokemon.getTypes()[0] && !newPokemon.moveset.some(m => m?.moveId === move?.moveId)) { + if ( + move?.getMove().type === newPokemon.getTypes()[0] && + !newPokemon.moveset.some(m => m?.moveId === move?.moveId) + ) { favoredMove = move; break; } diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 39db3d58690..71e1b382f61 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -72,4 +72,3 @@ export default class MysteryEncounterDialogue { encounterOptionsDialogue?: EncounterOptionsDialogue; outro?: TextDisplay[]; } - diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index ce9d4839c49..f360658c2dc 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -4,13 +4,18 @@ import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { globalScene } from "#app/global-scene"; import type { PokemonType } from "#enums/pokemon-type"; -import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + EncounterPokemonRequirement, + EncounterSceneRequirement, + MoneyRequirement, + TypeRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import type { CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; import { CanLearnMoveRequirement } from "./requirements/can-learn-move-requirement"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; - +// biome-ignore lint/suspicious/noConfusingVoidType: void unions in callbacks are OK export type OptionPhaseCallback = () => Promise; /** @@ -71,16 +76,22 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { * Returns true if option contains any {@linkcode EncounterRequirement}s, false otherwise. */ hasRequirements(): boolean { - return this.requirements.length > 0 || this.primaryPokemonRequirements.length > 0 || this.secondaryPokemonRequirements.length > 0; + return ( + this.requirements.length > 0 || + this.primaryPokemonRequirements.length > 0 || + this.secondaryPokemonRequirements.length > 0 + ); } /** * Returns true if all {@linkcode EncounterRequirement}s for the option are met */ meetsRequirements(): boolean { - return !this.requirements.some(requirement => !requirement.meetsRequirement()) - && this.meetsSupportingRequirementAndSupportingPokemonSelected() - && this.meetsPrimaryRequirementAndPrimaryPokemonSelected(); + return ( + !this.requirements.some(requirement => !requirement.meetsRequirement()) && + this.meetsSupportingRequirementAndSupportingPokemonSelected() && + this.meetsPrimaryRequirementAndPrimaryPokemonSelected() + ); } /** @@ -88,7 +99,13 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { * @param pokemon */ pokemonMeetsPrimaryRequirements(pokemon: Pokemon): boolean { - return !this.primaryPokemonRequirements.some(req => !req.queryParty(globalScene.getPlayerParty()).map(p => p.id).includes(pokemon.id)); + return !this.primaryPokemonRequirements.some( + req => + !req + .queryParty(globalScene.getPlayerParty()) + .map(p => p.id) + .includes(pokemon.id), + ); } /** @@ -125,27 +142,26 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { } else { overlap.push(qp); } - } if (truePrimaryPool.length > 0) { // always choose from the non-overlapping pokemon first this.primaryPokemon = truePrimaryPool[randSeedInt(truePrimaryPool.length)]; return true; - } else { - // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool - if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { - this.primaryPokemon = overlap[randSeedInt(overlap.length)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); - 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."); - return false; } - } else { - // Just pick the first qualifying Pokemon - this.primaryPokemon = qualified[0]; - return true; + // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool + if (overlap.length > 1 || this.secondaryPokemon.length - overlap.length >= 1) { + this.primaryPokemon = overlap[randSeedInt(overlap.length)]; + this.secondaryPokemon = this.secondaryPokemon.filter(supp => supp !== this.primaryPokemon); + 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.", + ); + return false; } + // Just pick the first qualifying Pokemon + this.primaryPokemon = qualified[0]; + return true; } /** @@ -180,12 +196,14 @@ export class MysteryEncounterOptionBuilder implements Partial { + static newOptionWithMode( + optionMode: MysteryEncounterOptionMode, + ): MysteryEncounterOptionBuilder & Pick { return Object.assign(new MysteryEncounterOptionBuilder(), { optionMode }); } @@ -197,7 +215,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSceneRequirement( + requirement: EncounterSceneRequirement, + ): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -216,7 +236,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPreOptionPhase( + onPreOptionPhase: OptionPhaseCallback, + ): this & Required> { return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); } @@ -228,7 +250,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPostOptionPhase( + onPostOptionPhase: OptionPhaseCallback, + ): this & Required> { return Object.assign(this, { onPostOptionPhase: onPostOptionPhase }); } @@ -236,13 +260,17 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPrimaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.primaryPokemonRequirements.push(requirement); - return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + return Object.assign(this, { + primaryPokemonRequirements: this.primaryPokemonRequirements, + }); } /** @@ -254,8 +282,15 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSecondaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + excludePrimaryFromSecondaryRequirements = true, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; - return Object.assign(this, { secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + return Object.assign(this, { + secondaryPokemonRequirements: this.secondaryPokemonRequirements, + }); } /** diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 48d2f3766d2..e9398547740 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -76,15 +76,14 @@ export class CombinationSceneRequirement extends EncounterSceneRequirement { override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (this.isAnd) { throw new Error("Not implemented (Sorry)"); - } else { - for (const req of this.requirements) { - if (req.meetsRequirement()) { - return req.getDialogueToken(pokemon); - } - } - - return this.requirements[0].getDialogueToken(pokemon); } + for (const req of this.requirements) { + if (req.meetsRequirement()) { + return req.getDialogueToken(pokemon); + } + } + + return this.requirements[0].getDialogueToken(pokemon); } } @@ -153,10 +152,9 @@ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (this.isAnd) { return this.requirements.reduce((relevantPokemon, req) => req.queryParty(relevantPokemon), partyPokemon); - } else { - const matchingRequirement = this.requirements.find(req => req.queryParty(partyPokemon).length > 0); - return matchingRequirement ? matchingRequirement.queryParty(partyPokemon) : []; } + const matchingRequirement = this.requirements.find(req => req.queryParty(partyPokemon).length > 0); + return matchingRequirement ? matchingRequirement.queryParty(partyPokemon) : []; } /** @@ -168,15 +166,14 @@ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (this.isAnd) { throw new Error("Not implemented (Sorry)"); - } else { - for (const req of this.requirements) { - if (req.meetsRequirement()) { - return req.getDialogueToken(pokemon); - } - } - - return this.requirements[0].getDialogueToken(pokemon); } + for (const req of this.requirements) { + if (req.meetsRequirement()) { + return req.getDialogueToken(pokemon); + } + } + + return this.requirements[0].getDialogueToken(pokemon); } } @@ -193,11 +190,18 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { } override meetsRequirement(): boolean { - return globalScene.mysteryEncounterSaveData.encounteredEvents.some(e => e.type === this.previousEncounterRequirement); + return globalScene.mysteryEncounterSaveData.encounteredEvents.some( + e => e.type === this.previousEncounterRequirement, + ); } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "previousEncounter", globalScene.mysteryEncounterSaveData.encounteredEvents.find(e => e.type === this.previousEncounterRequirement)?.[0].toString() ?? "" ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return [ + "previousEncounter", + globalScene.mysteryEncounterSaveData.encounteredEvents + .find(e => e.type === this.previousEncounterRequirement)?.[0] + .toString() ?? "", + ]; } } @@ -217,15 +221,18 @@ export class WaveRangeRequirement extends EncounterSceneRequirement { override meetsRequirement(): boolean { if (!isNullOrUndefined(this.waveRange) && this.waveRange[0] <= this.waveRange[1]) { const waveIndex = globalScene.currentBattle.waveIndex; - if (waveIndex >= 0 && (this.waveRange[0] >= 0 && this.waveRange[0] > waveIndex) || (this.waveRange[1] >= 0 && this.waveRange[1] < waveIndex)) { + if ( + (waveIndex >= 0 && this.waveRange[0] >= 0 && this.waveRange[0] > waveIndex) || + (this.waveRange[1] >= 0 && this.waveRange[1] < waveIndex) + ) { return false; } } return true; } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "waveIndex", globalScene.currentBattle.waveIndex.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["waveIndex", globalScene.currentBattle.waveIndex.toString()]; } } @@ -253,8 +260,8 @@ export class WaveModulusRequirement extends EncounterSceneRequirement { return this.waveModuli.includes(globalScene.currentBattle.waveIndex % this.modulusValue); } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "waveIndex", globalScene.currentBattle.waveIndex.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["waveIndex", globalScene.currentBattle.waveIndex.toString()]; } } @@ -263,20 +270,24 @@ export class TimeOfDayRequirement extends EncounterSceneRequirement { constructor(timeOfDay: TimeOfDay | TimeOfDay[]) { super(); - this.requiredTimeOfDay = Array.isArray(timeOfDay) ? timeOfDay : [ timeOfDay ]; + this.requiredTimeOfDay = Array.isArray(timeOfDay) ? timeOfDay : [timeOfDay]; } override meetsRequirement(): boolean { const timeOfDay = globalScene.arena?.getTimeOfDay(); - if (!isNullOrUndefined(timeOfDay) && this.requiredTimeOfDay?.length > 0 && !this.requiredTimeOfDay.includes(timeOfDay)) { + if ( + !isNullOrUndefined(timeOfDay) && + this.requiredTimeOfDay?.length > 0 && + !this.requiredTimeOfDay.includes(timeOfDay) + ) { return false; } return true; } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "timeOfDay", TimeOfDay[globalScene.arena.getTimeOfDay()].toLocaleLowerCase() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["timeOfDay", TimeOfDay[globalScene.arena.getTimeOfDay()].toLocaleLowerCase()]; } } @@ -285,25 +296,29 @@ export class WeatherRequirement extends EncounterSceneRequirement { constructor(weather: WeatherType | WeatherType[]) { super(); - this.requiredWeather = Array.isArray(weather) ? weather : [ weather ]; + this.requiredWeather = Array.isArray(weather) ? weather : [weather]; } override meetsRequirement(): boolean { const currentWeather = globalScene.arena.weather?.weatherType; - if (!isNullOrUndefined(currentWeather) && this.requiredWeather?.length > 0 && !this.requiredWeather.includes(currentWeather!)) { + if ( + !isNullOrUndefined(currentWeather) && + this.requiredWeather?.length > 0 && + !this.requiredWeather.includes(currentWeather!) + ) { return false; } return true; } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { const currentWeather = globalScene.arena.weather?.weatherType; let token = ""; if (!isNullOrUndefined(currentWeather)) { token = WeatherType[currentWeather].replace("_", " ").toLocaleLowerCase(); } - return [ "weather", token ]; + return ["weather", token]; } } @@ -325,8 +340,13 @@ export class PartySizeRequirement extends EncounterSceneRequirement { override meetsRequirement(): boolean { if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange[0] <= this.partySizeRange[1]) { - const partySize = this.excludeDisallowedPokemon ? globalScene.getPokemonAllowedInBattle().length : globalScene.getPlayerParty().length; - if (partySize >= 0 && (this.partySizeRange[0] >= 0 && this.partySizeRange[0] > partySize) || (this.partySizeRange[1] >= 0 && this.partySizeRange[1] < partySize)) { + const partySize = this.excludeDisallowedPokemon + ? globalScene.getPokemonAllowedInBattle().length + : globalScene.getPlayerParty().length; + if ( + (partySize >= 0 && this.partySizeRange[0] >= 0 && this.partySizeRange[0] > partySize) || + (this.partySizeRange[1] >= 0 && this.partySizeRange[1] < partySize) + ) { return false; } } @@ -334,8 +354,8 @@ export class PartySizeRequirement extends EncounterSceneRequirement { return true; } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "partySize", globalScene.getPlayerParty().length.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["partySize", globalScene.getPlayerParty().length.toString()]; } } @@ -343,10 +363,10 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { requiredHeldItemModifiers: string[]; minNumberOfItems: number; - constructor(heldItem: string | string[], minNumberOfItems: number = 1) { + constructor(heldItem: string | string[], minNumberOfItems = 1) { super(); this.minNumberOfItems = minNumberOfItems; - this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [ heldItem ]; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; } override meetsRequirement(): boolean { @@ -355,20 +375,20 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { return false; } let modifierCount = 0; - this.requiredHeldItemModifiers.forEach(modifier => { + for (const modifier of this.requiredHeldItemModifiers) { const matchingMods = globalScene.findModifiers(m => m.constructor.name === modifier); if (matchingMods?.length > 0) { - matchingMods.forEach(matchingMod => { + for (const matchingMod of matchingMods) { modifierCount += matchingMod.stackCount; - }); + } } - }); + } return modifierCount >= this.minNumberOfItems; } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "requiredItem", this.requiredHeldItemModifiers[0] ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["requiredItem", this.requiredHeldItemModifiers[0]]; } } @@ -394,9 +414,12 @@ export class MoneyRequirement extends EncounterSceneRequirement { return !(this.requiredMoney > 0 && this.requiredMoney > money); } - override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const value = this.scalingMultiplier > 0 ? globalScene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); - return [ "money", value ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + const value = + this.scalingMultiplier > 0 + ? globalScene.getWaveMoneyAmount(this.scalingMultiplier).toString() + : this.requiredMoney.toString(); + return ["money", value]; } } @@ -405,11 +428,11 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(species: Species | Species[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(species: Species | Species[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredSpecies = Array.isArray(species) ? species : [ species ]; + this.requiredSpecies = Array.isArray(species) ? species : [species]; } override meetsRequirement(): boolean { @@ -422,32 +445,34 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed speciess - return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length === 0); + return partyPokemon.filter( + pokemon => this.requiredSpecies.filter(species => pokemon.species.speciesId === species).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed speciess + return partyPokemon.filter( + pokemon => this.requiredSpecies.filter(species => pokemon.species.speciesId === species).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (pokemon?.species.speciesId && this.requiredSpecies.includes(pokemon.species.speciesId)) { - return [ "species", Species[pokemon.species.speciesId] ]; + return ["species", Species[pokemon.species.speciesId]]; } - return [ "species", "" ]; + return ["species", ""]; } } - export class NatureRequirement extends EncounterPokemonRequirement { requiredNature: Nature[]; minNumberOfPokemon: number; invertQuery: boolean; - constructor(nature: Nature | Nature[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(nature: Nature | Nature[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredNature = Array.isArray(nature) ? nature : [ nature ]; + this.requiredNature = Array.isArray(nature) ? nature : [nature]; } override meetsRequirement(): boolean { @@ -460,18 +485,17 @@ export class NatureRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed natures - return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length === 0); + return partyPokemon.filter(pokemon => this.requiredNature.filter(nature => pokemon.nature === nature).length > 0); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed natures + return partyPokemon.filter(pokemon => this.requiredNature.filter(nature => pokemon.nature === nature).length === 0); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (!isNullOrUndefined(pokemon?.nature) && this.requiredNature.includes(pokemon.nature)) { - return [ "nature", Nature[pokemon.nature] ]; + return ["nature", Nature[pokemon.nature]]; } - return [ "nature", "" ]; + return ["nature", ""]; } } @@ -481,12 +505,12 @@ export class TypeRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(type: PokemonType | PokemonType[], excludeFainted: boolean = true, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(type: PokemonType | PokemonType[], excludeFainted = true, minNumberOfPokemon = 1, invertQuery = false) { super(); this.excludeFainted = excludeFainted; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredType = Array.isArray(type) ? type : [ type ]; + this.requiredType = Array.isArray(type) ? type : [type]; } override meetsRequirement(): boolean { @@ -497,7 +521,7 @@ export class TypeRequirement extends EncounterPokemonRequirement { } if (this.excludeFainted) { - partyPokemon = partyPokemon.filter((pokemon) => !pokemon.isFainted()); + partyPokemon = partyPokemon.filter(pokemon => !pokemon.isFainted()); } return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; @@ -505,35 +529,37 @@ export class TypeRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed types - return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length === 0); + return partyPokemon.filter( + pokemon => this.requiredType.filter(type => pokemon.getTypes().includes(type)).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed types + return partyPokemon.filter( + pokemon => this.requiredType.filter(type => pokemon.getTypes().includes(type)).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const includedTypes = this.requiredType.filter((ty) => pokemon?.getTypes().includes(ty)); + const includedTypes = this.requiredType.filter(ty => pokemon?.getTypes().includes(ty)); if (includedTypes.length > 0) { - return [ "type", PokemonType[includedTypes[0]] ]; + return ["type", PokemonType[includedTypes[0]]]; } - return [ "type", "" ]; + return ["type", ""]; } } - export class MoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[] = []; minNumberOfPokemon: number; invertQuery: boolean; excludeDisallowedPokemon: boolean; - constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon = 1, invertQuery = false) { super(); this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredMoves = Array.isArray(moves) ? moves : [ moves ]; + this.requiredMoves = Array.isArray(moves) ? moves : [moves]; } override meetsRequirement(): boolean { @@ -547,25 +573,27 @@ export class MoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { // get the Pokemon with at least one move in the required moves list - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && !pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + !pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const includedMoves = pokemon?.moveset.filter((move) => move?.moveId && this.requiredMoves.includes(move.moveId)); + const includedMoves = pokemon?.moveset.filter(move => move?.moveId && this.requiredMoves.includes(move.moveId)); if (includedMoves && includedMoves.length > 0 && includedMoves[0]) { - return [ "move", includedMoves[0].getName() ]; + return ["move", includedMoves[0].getName()]; } - return [ "move", "" ]; + return ["move", ""]; } - } /** @@ -578,11 +606,11 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(learnableMove: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(learnableMove: Moves | Moves[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredMoves = Array.isArray(learnableMove) ? learnableMove : [ learnableMove ]; + this.requiredMoves = Array.isArray(learnableMove) ? learnableMove : [learnableMove]; } override meetsRequirement(): boolean { @@ -595,21 +623,31 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length === 0); + return partyPokemon.filter( + pokemon => + this.requiredMoves.filter(learnableMove => + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + ).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves + return partyPokemon.filter( + pokemon => + this.requiredMoves.filter(learnableMove => + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + ).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon?.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove)); + const includedCompatMoves = this.requiredMoves.filter(reqMove => + pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove), + ); if (includedCompatMoves.length > 0) { - return [ "compatibleMove", Moves[includedCompatMoves[0]] ]; + return ["compatibleMove", Moves[includedCompatMoves[0]]]; } - return [ "compatibleMove", "" ]; + return ["compatibleMove", ""]; } - } export class AbilityRequirement extends EncounterPokemonRequirement { @@ -618,12 +656,17 @@ export class AbilityRequirement extends EncounterPokemonRequirement { invertQuery: boolean; excludeDisallowedPokemon: boolean; - constructor(abilities: Abilities | Abilities[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor( + abilities: Abilities | Abilities[], + excludeDisallowedPokemon: boolean, + minNumberOfPokemon = 1, + invertQuery = false, + ) { super(); this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredAbilities = Array.isArray(abilities) ? abilities : [ abilities ]; + this.requiredAbilities = Array.isArray(abilities) ? abilities : [abilities]; } override meetsRequirement(): boolean { @@ -636,23 +679,26 @@ export class AbilityRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && this.requiredAbilities.some((ability) => pokemon.hasAbility(ability, false))); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && this.requiredAbilities.filter((ability) => pokemon.hasAbility(ability, false)).length === 0); + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + this.requiredAbilities.some(ability => pokemon.hasAbility(ability, false)), + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + this.requiredAbilities.filter(ability => pokemon.hasAbility(ability, false)).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { const matchingAbility = this.requiredAbilities.find(a => pokemon?.hasAbility(a, false)); if (!isNullOrUndefined(matchingAbility)) { - return [ "ability", allAbilities[matchingAbility].name ]; + return ["ability", allAbilities[matchingAbility].name]; } - return [ "ability", "" ]; + return ["ability", ""]; } } @@ -661,11 +707,11 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredStatusEffect = Array.isArray(statusEffect) ? statusEffect : [ statusEffect ]; + this.requiredStatusEffect = Array.isArray(statusEffect) ? statusEffect : [statusEffect]; } override meetsRequirement(): boolean { @@ -680,44 +726,50 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => { - return this.requiredStatusEffect.some((statusEffect) => { + return partyPokemon.filter(pokemon => { + return this.requiredStatusEffect.some(statusEffect => { if (statusEffect === StatusEffect.NONE) { // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect; - } else { - return pokemon.status?.effect === statusEffect; - } - }); - }); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects - return partyPokemon.filter((pokemon) => { - return !this.requiredStatusEffect.some((statusEffect) => { - if (statusEffect === StatusEffect.NONE) { - // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect; - } else { - return pokemon.status?.effect === statusEffect; + return ( + isNullOrUndefined(pokemon.status) || + isNullOrUndefined(pokemon.status.effect) || + pokemon.status.effect === statusEffect + ); } + return pokemon.status?.effect === statusEffect; }); }); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects + return partyPokemon.filter(pokemon => { + return !this.requiredStatusEffect.some(statusEffect => { + if (statusEffect === StatusEffect.NONE) { + // StatusEffect.NONE also checks for null or undefined status + return ( + isNullOrUndefined(pokemon.status) || + isNullOrUndefined(pokemon.status.effect) || + pokemon.status.effect === statusEffect + ); + } + return pokemon.status?.effect === statusEffect; + }); + }); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const reqStatus = this.requiredStatusEffect.filter((a) => { + const reqStatus = this.requiredStatusEffect.filter(a => { if (a === StatusEffect.NONE) { - return isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === a; + return ( + isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === a + ); } return pokemon!.status?.effect === a; }); if (reqStatus.length > 0) { - return [ "status", StatusEffect[reqStatus[0]] ]; + return ["status", StatusEffect[reqStatus[0]]]; } - return [ "status", "" ]; + return ["status", ""]; } - } /** @@ -730,11 +782,11 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen minNumberOfPokemon: number; invertQuery: boolean; - constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredFormChangeItem = Array.isArray(formChangeItem) ? formChangeItem : [ formChangeItem ]; + this.requiredFormChangeItem = Array.isArray(formChangeItem) ? formChangeItem : [formChangeItem]; } override meetsRequirement(): boolean { @@ -746,35 +798,44 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen } filterByForm(pokemon, formChangeItem) { - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) + if ( + pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + pokemonFormChanges[pokemon.species.speciesId] + .filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) // Returns true if any form changes match this item - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .flat().flatMap(fc => fc.item).includes(formChangeItem)) { + .flatMap(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flatMap(fc => fc.item) + .includes(formChangeItem) + ) { return true; - } else { - return false; } + return false; } override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed formChangeItems - return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length === 0); + return partyPokemon.filter( + pokemon => + this.requiredFormChangeItem.filter(formChangeItem => this.filterByForm(pokemon, formChangeItem)).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed formChangeItems + return partyPokemon.filter( + pokemon => + this.requiredFormChangeItem.filter(formChangeItem => this.filterByForm(pokemon, formChangeItem)).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const requiredItems = this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)); + const requiredItems = this.requiredFormChangeItem.filter(formChangeItem => + this.filterByForm(pokemon, formChangeItem), + ); if (requiredItems.length > 0) { - return [ "formChangeItem", FormChangeItem[requiredItems[0]] ]; + return ["formChangeItem", FormChangeItem[requiredItems[0]]]; } - return [ "formChangeItem", "" ]; + return ["formChangeItem", ""]; } - } export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { @@ -782,11 +843,11 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredEvolutionItem = Array.isArray(evolutionItems) ? evolutionItems : [ evolutionItems ]; + this.requiredEvolutionItem = Array.isArray(evolutionItems) ? evolutionItems : [evolutionItems]; } override meetsRequirement(): boolean { @@ -798,11 +859,23 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { } filterByEvo(pokemon, evolutionItem) { - if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && + pokemonEvolutions[pokemon.species.speciesId].filter( + e => e.item === evolutionItem && (!e.condition || e.condition.predicate(pokemon)), + ).length && + pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return true; - } else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + } + if ( + pokemon.isFusion() && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && + pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter( + e => e.item === evolutionItem && (!e.condition || e.condition.predicate(pokemon)), + ).length && + pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return true; } return false; @@ -810,19 +883,24 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItem) => this.filterByEvo(pokemon, evolutionItem)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionItemss - return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItems) => this.filterByEvo(pokemon, evolutionItems)).length === 0); + return partyPokemon.filter( + pokemon => + this.requiredEvolutionItem.filter(evolutionItem => this.filterByEvo(pokemon, evolutionItem)).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionItemss + return partyPokemon.filter( + pokemon => + this.requiredEvolutionItem.filter(evolutionItems => this.filterByEvo(pokemon, evolutionItems)).length === 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const requiredItems = this.requiredEvolutionItem.filter((evoItem) => this.filterByEvo(pokemon, evoItem)); + const requiredItems = this.requiredEvolutionItem.filter(evoItem => this.filterByEvo(pokemon, evoItem)); if (requiredItems.length > 0) { - return [ "evolutionItem", EvolutionItem[requiredItems[0]] ]; + return ["evolutionItem", EvolutionItem[requiredItems[0]]]; } - return [ "evolutionItem", "" ]; + return ["evolutionItem", ""]; } } @@ -832,11 +910,11 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { invertQuery: boolean; requireTransferable: boolean; - constructor(heldItem: string | string[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { + constructor(heldItem: string | string[], minNumberOfPokemon = 1, invertQuery = false, requireTransferable = true) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [ heldItem ]; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; this.requireTransferable = requireTransferable; } @@ -850,30 +928,38 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredHeldItemModifiers.some((heldItem) => { - return pokemon.getHeldItems().some((it) => { - return it.constructor.name === heldItem && (!this.requireTransferable || it.isTransferable); - }); - })); - } else { - // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers - // E.g. functions as a blacklist - return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => { - return !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) - && (!this.requireTransferable || it.isTransferable); - }).length > 0); + return partyPokemon.filter(pokemon => + this.requiredHeldItemModifiers.some(heldItem => { + return pokemon.getHeldItems().some(it => { + return it.constructor.name === heldItem && (!this.requireTransferable || it.isTransferable); + }); + }), + ); } + // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers + // E.g. functions as a blacklist + return partyPokemon.filter( + pokemon => + pokemon.getHeldItems().filter(it => { + return ( + !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) && + (!this.requireTransferable || it.isTransferable) + ); + }).length > 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const requiredItems = pokemon?.getHeldItems().filter((it) => { - return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) - && (!this.requireTransferable || it.isTransferable); + const requiredItems = pokemon?.getHeldItems().filter(it => { + return ( + this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) && + (!this.requireTransferable || it.isTransferable) + ); }); if (requiredItems && requiredItems.length > 0) { - return [ "heldItem", requiredItems[0].type.name ]; + return ["heldItem", requiredItems[0].type.name]; } - return [ "heldItem", "" ]; + return ["heldItem", ""]; } } @@ -883,11 +969,16 @@ export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRe invertQuery: boolean; requireTransferable: boolean; - constructor(heldItemTypes: PokemonType | PokemonType[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { + constructor( + heldItemTypes: PokemonType | PokemonType[], + minNumberOfPokemon = 1, + invertQuery = false, + requireTransferable = true, + ) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [ heldItemTypes ]; + this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [heldItemTypes]; this.requireTransferable = requireTransferable; } @@ -901,36 +992,48 @@ export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRe override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredHeldItemTypes.some((heldItemType) => { - return pokemon.getHeldItems().some((it) => { - return it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType - && (!this.requireTransferable || it.isTransferable); - }); - })); - } else { - // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers - // E.g. functions as a blacklist - return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => { - return !this.requiredHeldItemTypes.some(heldItemType => - it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType - && (!this.requireTransferable || it.isTransferable)); - }).length > 0); + return partyPokemon.filter(pokemon => + this.requiredHeldItemTypes.some(heldItemType => { + return pokemon.getHeldItems().some(it => { + return ( + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType && + (!this.requireTransferable || it.isTransferable) + ); + }); + }), + ); } + // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers + // E.g. functions as a blacklist + return partyPokemon.filter( + pokemon => + pokemon.getHeldItems().filter(it => { + return !this.requiredHeldItemTypes.some( + heldItemType => + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType && + (!this.requireTransferable || it.isTransferable), + ); + }).length > 0, + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - const requiredItems = pokemon?.getHeldItems().filter((it) => { - return this.requiredHeldItemTypes.some(heldItemType => - it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType) - && (!this.requireTransferable || it.isTransferable); + const requiredItems = pokemon?.getHeldItems().filter(it => { + return ( + this.requiredHeldItemTypes.some( + heldItemType => + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType, + ) && + (!this.requireTransferable || it.isTransferable) + ); }); if (requiredItems && requiredItems.length > 0) { - return [ "heldItem", requiredItems[0].type.name ]; + return ["heldItem", requiredItems[0].type.name]; } - return [ "heldItem", "" ]; + return ["heldItem", ""]; } } @@ -939,7 +1042,7 @@ export class LevelRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredLevelRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredLevelRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; @@ -960,15 +1063,18 @@ export class LevelRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.level >= this.requiredLevelRange[0] && pokemon.level <= this.requiredLevelRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredLevelRanges - return partyPokemon.filter((pokemon) => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1]); + return partyPokemon.filter( + pokemon => pokemon.level >= this.requiredLevelRange[0] && pokemon.level <= this.requiredLevelRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredLevelRanges + return partyPokemon.filter( + pokemon => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1], + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "level", pokemon?.level.toString() ?? "" ]; + return ["level", pokemon?.level.toString() ?? ""]; } } @@ -977,7 +1083,7 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; @@ -986,7 +1092,10 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { override meetsRequirement(): boolean { // Party Pokemon inside required friendship range - if (!isNullOrUndefined(this.requiredFriendshipRange) && this.requiredFriendshipRange[0] <= this.requiredFriendshipRange[1]) { + if ( + !isNullOrUndefined(this.requiredFriendshipRange) && + this.requiredFriendshipRange[0] <= this.requiredFriendshipRange[1] + ) { const partyPokemon = globalScene.getPlayerParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { @@ -998,15 +1107,21 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.friendship >= this.requiredFriendshipRange[0] && pokemon.friendship <= this.requiredFriendshipRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredFriendshipRanges - return partyPokemon.filter((pokemon) => pokemon.friendship < this.requiredFriendshipRange[0] || pokemon.friendship > this.requiredFriendshipRange[1]); + return partyPokemon.filter( + pokemon => + pokemon.friendship >= this.requiredFriendshipRange[0] && + pokemon.friendship <= this.requiredFriendshipRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredFriendshipRanges + return partyPokemon.filter( + pokemon => + pokemon.friendship < this.requiredFriendshipRange[0] || pokemon.friendship > this.requiredFriendshipRange[1], + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "friendship", pokemon?.friendship.toString() ?? "" ]; + return ["friendship", pokemon?.friendship.toString() ?? ""]; } } @@ -1020,7 +1135,7 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredHealthRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; @@ -1041,21 +1156,25 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => { - return pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1]; + return partyPokemon.filter(pokemon => { + return ( + pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1] + ); }); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges - return partyPokemon.filter((pokemon) => pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1]); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges + return partyPokemon.filter( + pokemon => + pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1], + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { const hpRatio = pokemon?.getHpRatio(); if (!isNullOrUndefined(hpRatio)) { - return [ "healthRatio", Math.floor(hpRatio * 100).toString() + "%" ]; + return ["healthRatio", Math.floor(hpRatio * 100).toString() + "%"]; } - return [ "healthRatio", "" ]; + return ["healthRatio", ""]; } } @@ -1064,7 +1183,7 @@ export class WeightRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredWeightRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredWeightRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; @@ -1085,15 +1204,18 @@ export class WeightRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.getWeight() >= this.requiredWeightRange[0] && pokemon.getWeight() <= this.requiredWeightRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredWeightRanges - return partyPokemon.filter((pokemon) => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1]); + return partyPokemon.filter( + pokemon => + pokemon.getWeight() >= this.requiredWeightRange[0] && pokemon.getWeight() <= this.requiredWeightRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredWeightRanges + return partyPokemon.filter( + pokemon => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1], + ); } override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { - return [ "weight", pokemon?.getWeight().toString() ?? "" ]; + return ["weight", pokemon?.getWeight().toString() ?? ""]; } } - diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index c90649e551d..53e976cda8a 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -12,7 +12,14 @@ import type MysteryEncounterDialogue from "./mystery-encounter-dialogue"; import type { OptionPhaseCallback } from "./mystery-encounter-option"; import type MysteryEncounterOption from "./mystery-encounter-option"; import { MysteryEncounterOptionBuilder } from "./mystery-encounter-option"; -import { EncounterPokemonRequirement, EncounterSceneRequirement, HealthRatioRequirement, PartySizeRequirement, StatusEffectRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; +import { + EncounterPokemonRequirement, + EncounterSceneRequirement, + HealthRatioRequirement, + PartySizeRequirement, + StatusEffectRequirement, + WaveRangeRequirement, +} from "./mystery-encounter-requirements"; import type { BattlerIndex } from "#app/battle"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; @@ -276,9 +283,12 @@ export default class MysteryEncounter implements IMysteryEncounter { this.encounterTier = this.encounterTier ?? MysteryEncounterTier.COMMON; this.localizationKey = this.localizationKey ?? ""; this.dialogue = this.dialogue ?? {}; - this.spriteConfigs = this.spriteConfigs ? [ ...this.spriteConfigs ] : []; + this.spriteConfigs = this.spriteConfigs ? [...this.spriteConfigs] : []; // Default max is 1 for ROGUE encounters, 2 for others - this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? DEFAULT_MAX_ALLOWED_ROGUE_ENCOUNTERS : DEFAULT_MAX_ALLOWED_ENCOUNTERS; + this.maxAllowedEncounters = + (this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE) + ? DEFAULT_MAX_ALLOWED_ROGUE_ENCOUNTERS + : DEFAULT_MAX_ALLOWED_ENCOUNTERS; this.encounterMode = MysteryEncounterMode.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = this.hideBattleIntroMessage ?? false; @@ -317,7 +327,13 @@ export default class MysteryEncounter implements IMysteryEncounter { * @param pokemon */ pokemonMeetsPrimaryRequirements(pokemon: Pokemon): boolean { - return !this.primaryPokemonRequirements.some(req => !req.queryParty(globalScene.getPlayerParty()).map(p => p.id).includes(pokemon.id)); + return !this.primaryPokemonRequirements.some( + req => + !req + .queryParty(globalScene.getPlayerParty()) + .map(p => p.id) + .includes(pokemon.id), + ); } /** @@ -359,28 +375,27 @@ export default class MysteryEncounter implements IMysteryEncounter { } else { overlap.push(qp); } - } if (truePrimaryPool.length > 0) { // Always choose from the non-overlapping pokemon first this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; return true; - } else { - // If there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool - if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { - // is this working? - this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); - return true; - } - console.log("Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left."); - return false; } - } else { - // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. - this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; - return true; + // If there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool + if (overlap.length > 1 || this.secondaryPokemon.length - overlap.length >= 1) { + // is this working? + this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; + this.secondaryPokemon = this.secondaryPokemon.filter(supp => supp !== this.primaryPokemon); + return true; + } + console.log( + "Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left.", + ); + return false; } + // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. + this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; + return true; } /** @@ -533,28 +548,28 @@ export class MysteryEncounterBuilder implements Partial { options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; enemyPartyConfigs: EnemyPartyConfig[] = []; - localizationKey: string = ""; + localizationKey = ""; dialogue: MysteryEncounterDialogue = {}; requirements: EncounterSceneRequirement[] = []; primaryPokemonRequirements: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements: EncounterPokemonRequirement[] = []; - excludePrimaryFromSupportRequirements: boolean = true; + excludePrimaryFromSupportRequirements = true; dialogueTokens: Record = {}; - hideBattleIntroMessage: boolean = false; - autoHideIntroVisuals: boolean = true; - enterIntroVisualsFromRight: boolean = false; - continuousEncounter: boolean = false; - catchAllowed: boolean = false; - fleeAllowed: boolean = true; - lockEncounterRewardTiers: boolean = false; - startOfBattleEffectsComplete: boolean = false; - hasBattleAnimationsWithoutTargets: boolean = false; - skipEnemyBattleTurns: boolean = false; - skipToFightInput: boolean = false; - preventGameStatsUpdates: boolean = false; - maxAllowedEncounters: number = 3; - expMultiplier: number = 1; + hideBattleIntroMessage = false; + autoHideIntroVisuals = true; + enterIntroVisualsFromRight = false; + continuousEncounter = false; + catchAllowed = false; + fleeAllowed = true; + lockEncounterRewardTiers = false; + startOfBattleEffectsComplete = false; + hasBattleAnimationsWithoutTargets = false; + skipEnemyBattleTurns = false; + skipToFightInput = false; + preventGameStatsUpdates = false; + maxAllowedEncounters = 3; + expMultiplier = 1; /** * REQUIRED @@ -566,7 +581,9 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + static withEncounterType( + encounterType: MysteryEncounterType, + ): MysteryEncounterBuilder & Pick { return Object.assign(new MysteryEncounterBuilder(), { encounterType }); } @@ -580,12 +597,11 @@ export class MysteryEncounterBuilder implements Partial { */ withOption(option: MysteryEncounterOption): this & Pick { if (!this.options) { - const options = [ option ]; + const options = [option]; return Object.assign(this, { options }); - } else { - this.options.push(option); - return this; } + this.options.push(option); + return this; } /** @@ -598,8 +614,16 @@ export class MysteryEncounterBuilder implements Partial { * @param callback {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { - return this.withOption(MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); + withSimpleOption( + dialogue: OptionTextDisplay, + callback: OptionPhaseCallback, + ): this & Pick { + return this.withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue(dialogue) + .withOptionPhase(callback) + .build(), + ); } /** @@ -612,12 +636,17 @@ export class MysteryEncounterBuilder implements Partial { * @param callback {@linkcode OptionPhaseCallback} * @returns */ - withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { - return this.withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue(dialogue) - .withOptionPhase(callback).build()); + withSimpleDexProgressOption( + dialogue: OptionTextDisplay, + callback: OptionPhaseCallback, + ): this & Pick { + return this.withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue(dialogue) + .withOptionPhase(callback) + .build(), + ); } /** @@ -626,7 +655,9 @@ export class MysteryEncounterBuilder implements Partial { * @param spriteConfigs * @returns */ - withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + withIntroSpriteConfigs( + spriteConfigs: MysteryEncounterSpriteConfig[], + ): this & Pick { return Object.assign(this, { spriteConfigs: spriteConfigs }); } @@ -635,7 +666,13 @@ export class MysteryEncounterBuilder implements Partial { return this; } - withIntro({ spriteConfigs, dialogue } : {spriteConfigs: MysteryEncounterSpriteConfig[], dialogue?: MysteryEncounterDialogue["intro"]}) { + withIntro({ + spriteConfigs, + dialogue, + }: { + spriteConfigs: MysteryEncounterSpriteConfig[]; + dialogue?: MysteryEncounterDialogue["intro"]; + }) { return this.withIntroSpriteConfigs(spriteConfigs).withIntroDialogue(dialogue); } @@ -676,8 +713,10 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterAnimations * @returns */ - withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { - const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [ encounterAnimations ]; + withAnimations( + ...encounterAnimations: EncounterAnim[] + ): this & Required> { + const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [encounterAnimations]; return Object.assign(this, { encounterAnimations: animations }); } @@ -686,8 +725,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns * @param disallowedGameModes */ - withDisallowedGameModes(...disallowedGameModes: GameModes[]): this & Required> { - const gameModes = Array.isArray(disallowedGameModes) ? disallowedGameModes : [ disallowedGameModes ]; + withDisallowedGameModes( + ...disallowedGameModes: GameModes[] + ): this & Required> { + const gameModes = Array.isArray(disallowedGameModes) ? disallowedGameModes : [disallowedGameModes]; return Object.assign(this, { disallowedGameModes: gameModes }); } @@ -696,8 +737,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns * @param disallowedChallenges */ - withDisallowedChallenges(...disallowedChallenges: Challenges[]): this & Required> { - const challenges = Array.isArray(disallowedChallenges) ? disallowedChallenges : [ disallowedChallenges ]; + withDisallowedChallenges( + ...disallowedChallenges: Challenges[] + ): this & Required> { + const challenges = Array.isArray(disallowedChallenges) ? disallowedChallenges : [disallowedChallenges]; return Object.assign(this, { disallowedChallenges: challenges }); } @@ -707,7 +750,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param continuousEncounter */ - withContinuousEncounter(continuousEncounter: boolean): this & Required> { + withContinuousEncounter( + continuousEncounter: boolean, + ): this & Required> { return Object.assign(this, { continuousEncounter: continuousEncounter }); } @@ -717,7 +762,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param hasBattleAnimationsWithoutTargets */ - withBattleAnimationsWithoutTargets(hasBattleAnimationsWithoutTargets: boolean): this & Required> { + withBattleAnimationsWithoutTargets( + hasBattleAnimationsWithoutTargets: boolean, + ): this & Required> { return Object.assign(this, { hasBattleAnimationsWithoutTargets }); } @@ -727,7 +774,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param skipEnemyBattleTurns */ - withSkipEnemyBattleTurns(skipEnemyBattleTurns: boolean): this & Required> { + withSkipEnemyBattleTurns( + skipEnemyBattleTurns: boolean, + ): this & Required> { return Object.assign(this, { skipEnemyBattleTurns }); } @@ -744,7 +793,9 @@ export class MysteryEncounterBuilder implements Partial { * If true, will prevent updating {@linkcode GameStats} for encountering and/or defeating Pokemon * Default `false` */ - withPreventGameStatsUpdates(preventGameStatsUpdates: boolean): this & Required> { + withPreventGameStatsUpdates( + preventGameStatsUpdates: boolean, + ): this & Required> { return Object.assign(this, { preventGameStatsUpdates }); } @@ -753,7 +804,9 @@ export class MysteryEncounterBuilder implements Partial { * @param maxAllowedEncounters * @returns */ - withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { + withMaxAllowedEncounters( + maxAllowedEncounters: number, + ): this & Required> { return Object.assign(this, { maxAllowedEncounters: maxAllowedEncounters }); } @@ -764,7 +817,9 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement * @returns */ - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement( + requirement: EncounterSceneRequirement, + ): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -780,7 +835,7 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { - return this.withSceneRequirement(new WaveRangeRequirement([ min, max ?? min ])); + return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } /** @@ -791,8 +846,12 @@ export class MysteryEncounterBuilder implements Partial { * @param excludeDisallowedPokemon if true, only counts allowed (legal in Challenge/unfainted) mons * @returns */ - withScenePartySizeRequirement(min: number, max?: number, excludeDisallowedPokemon: boolean = false): this & Required> { - return this.withSceneRequirement(new PartySizeRequirement([ min, max ?? min ], excludeDisallowedPokemon)); + withScenePartySizeRequirement( + min: number, + max?: number, + excludeDisallowedPokemon = false, + ): this & Required> { + return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeDisallowedPokemon)); } /** @@ -801,13 +860,17 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement {@linkcode EncounterPokemonRequirement} * @returns */ - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.primaryPokemonRequirements.push(requirement); - return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + return Object.assign(this, { + primaryPokemonRequirements: this.primaryPokemonRequirements, + }); } /** @@ -818,8 +881,14 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { - return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); + withPrimaryPokemonStatusEffectRequirement( + statusEffect: StatusEffect | StatusEffect[], + minNumberOfPokemon = 1, + invertQuery = false, + ): this & Required> { + return this.withPrimaryPokemonRequirement( + new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery), + ); } /** @@ -830,21 +899,33 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { - return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); + withPrimaryPokemonHealthRatioRequirement( + requiredHealthRange: [number, number], + minNumberOfPokemon = 1, + invertQuery = false, + ): this & Required> { + return this.withPrimaryPokemonRequirement( + new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery), + ); } // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + withSecondaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + excludePrimaryFromSecondaryRequirements = false, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; - return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + return Object.assign(this, { + excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, + secondaryPokemonRequirements: this.secondaryPokemonRequirements, + }); } /** @@ -919,15 +1000,21 @@ export class MysteryEncounterBuilder implements Partial { * @param hideBattleIntroMessage If `true`, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter * @returns */ - withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { - return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); + withHideWildIntroMessage( + hideBattleIntroMessage: boolean, + ): this & Required> { + return Object.assign(this, { + hideBattleIntroMessage: hideBattleIntroMessage, + }); } /** * @param autoHideIntroVisuals If `false`, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { + withAutoHideIntroVisuals( + autoHideIntroVisuals: boolean, + ): this & Required> { return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } @@ -936,8 +1023,12 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @returns */ - withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { - return Object.assign(this, { enterIntroVisualsFromRight: enterIntroVisualsFromRight }); + withEnterIntroVisualsFromRight( + enterIntroVisualsFromRight: boolean, + ): this & Required> { + return Object.assign(this, { + enterIntroVisualsFromRight: enterIntroVisualsFromRight, + }); } /** @@ -954,7 +1045,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, title, - } + }, }; return this; @@ -974,7 +1065,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, description, - } + }, }; return this; @@ -994,7 +1085,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, query, - } + }, }; return this; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 3219640e4e5..354f69d0ca3 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -80,7 +80,7 @@ export const EXTREME_ENCOUNTER_BIOMES = [ Biome.WASTELAND, Biome.ABYSS, Biome.SPACE, - Biome.END + Biome.END, ]; export const NON_EXTREME_ENCOUNTER_BIOMES = [ @@ -108,7 +108,7 @@ export const NON_EXTREME_ENCOUNTER_BIOMES = [ Biome.SLUM, Biome.SNOWY_FOREST, Biome.ISLAND, - Biome.LABORATORY + Biome.LABORATORY, ]; /** @@ -147,7 +147,7 @@ export const HUMAN_TRANSITABLE_BIOMES = [ Biome.SLUM, Biome.SNOWY_FOREST, Biome.ISLAND, - Biome.LABORATORY + Biome.LABORATORY, ]; /** @@ -168,11 +168,12 @@ export const CIVILIZATION_ENCOUNTER_BIOMES = [ Biome.FACTORY, Biome.CONSTRUCTION_SITE, Biome.SLUM, - Biome.ISLAND + Biome.ISLAND, ]; -export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; - +export const allMysteryEncounters: { + [encounterType: number]: MysteryEncounter; +} = {}; const extremeBiomeEncounters: MysteryEncounterType[] = []; @@ -187,14 +188,14 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.THE_POKEMON_SALESMAN, // MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, Disabled MysteryEncounterType.THE_WINSTRATE_CHALLENGE, - MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.DEPARTMENT_STORE_SALE, MysteryEncounterType.PART_TIMER, MysteryEncounterType.FUN_AND_GAMES, - MysteryEncounterType.GLOBAL_TRADE_SYSTEM + MysteryEncounterType.GLOBAL_TRADE_SYSTEM, ]; /** @@ -213,7 +214,7 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.WEIRD_DREAM, MysteryEncounterType.TELEPORTING_HIJINKS, MysteryEncounterType.BUG_TYPE_SUPERFAN, - MysteryEncounterType.UNCOMMON_BREED + MysteryEncounterType.UNCOMMON_BREED, ]; /** @@ -224,72 +225,40 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ * that biome groups do not cover */ export const mysteryEncountersByBiome = new Map([ - [ Biome.TOWN, []], - [ Biome.PLAINS, [ - MysteryEncounterType.SLUMBERING_SNORLAX, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.GRASS, [ - MysteryEncounterType.SLUMBERING_SNORLAX, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.TALL_GRASS, [ - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.METROPOLIS, []], - [ Biome.FOREST, [ - MysteryEncounterType.SAFARI_ZONE, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.SEA, [ - MysteryEncounterType.LOST_AT_SEA - ]], - [ Biome.SWAMP, [ - MysteryEncounterType.SAFARI_ZONE - ]], - [ Biome.BEACH, []], - [ Biome.LAKE, []], - [ Biome.SEABED, []], - [ Biome.MOUNTAIN, []], - [ Biome.BADLANDS, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.CAVE, [ - MysteryEncounterType.THE_STRONG_STUFF - ]], - [ Biome.DESERT, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.ICE_CAVE, []], - [ Biome.MEADOW, []], - [ Biome.POWER_PLANT, []], - [ Biome.VOLCANO, [ - MysteryEncounterType.FIERY_FALLOUT, - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.GRAVEYARD, []], - [ Biome.DOJO, []], - [ Biome.FACTORY, []], - [ Biome.RUINS, []], - [ Biome.WASTELAND, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.ABYSS, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.SPACE, [ - MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER - ]], - [ Biome.CONSTRUCTION_SITE, []], - [ Biome.JUNGLE, [ - MysteryEncounterType.SAFARI_ZONE - ]], - [ Biome.FAIRY_CAVE, []], - [ Biome.TEMPLE, []], - [ Biome.SLUM, []], - [ Biome.SNOWY_FOREST, []], - [ Biome.ISLAND, []], - [ Biome.LABORATORY, []] + [Biome.TOWN, []], + [Biome.PLAINS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.TALL_GRASS, [MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.METROPOLIS, []], + [Biome.FOREST, [MysteryEncounterType.SAFARI_ZONE, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], + [Biome.SWAMP, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.BEACH, []], + [Biome.LAKE, []], + [Biome.SEABED, []], + [Biome.MOUNTAIN, []], + [Biome.BADLANDS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]], + [Biome.DESERT, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.ICE_CAVE, []], + [Biome.MEADOW, []], + [Biome.POWER_PLANT, []], + [Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT, MysteryEncounterType.DANCING_LESSONS]], + [Biome.GRAVEYARD, []], + [Biome.DOJO, []], + [Biome.FACTORY, []], + [Biome.RUINS, []], + [Biome.WASTELAND, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.ABYSS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.SPACE, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]], + [Biome.CONSTRUCTION_SITE, []], + [Biome.JUNGLE, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.FAIRY_CAVE, []], + [Biome.TEMPLE, []], + [Biome.SLUM, []], + [Biome.SNOWY_FOREST, []], + [Biome.ISLAND, []], + [Biome.LABORATORY, []], ]); export function initMysteryEncounters() { @@ -364,7 +333,7 @@ export function initMysteryEncounters() { // Add ANY biome encounters to biome map // eslint-disable-next-line - let encounterBiomeTableLog = ""; + let _encounterBiomeTableLog = ""; mysteryEncountersByBiome.forEach((biomeEncounters, biome) => { anyBiomeEncounters.forEach(encounter => { if (!biomeEncounters.includes(encounter)) { @@ -372,7 +341,10 @@ export function initMysteryEncounters() { } }); - encounterBiomeTableLog += `${getBiomeName(biome).toUpperCase()}: [${biomeEncounters.map(type => MysteryEncounterType[type].toString().toLowerCase()).sort().join(", ")}]\n`; + _encounterBiomeTableLog += `${getBiomeName(biome).toUpperCase()}: [${biomeEncounters + .map(type => MysteryEncounterType[type].toString().toLowerCase()) + .sort() + .join(", ")}]\n`; }); //console.debug("All Mystery Encounters by Biome:\n" + encounterBiomeTableLog); diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index 3d454269204..a7ffe3e26ca 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -29,7 +29,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { constructor(requiredMoves: Moves | Moves[], options: CanLearnMoveRequirementOptions = {}) { super(); - this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [ requiredMoves ]; + this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves]; this.excludeLevelMoves = options.excludeLevelMoves ?? false; this.excludeTmMoves = options.excludeTmMoves ?? false; @@ -40,7 +40,9 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { } override meetsRequirement(): boolean { - const partyPokemon = globalScene.getPlayerParty().filter((pkm) => (this.includeFainted ? pkm.isAllowedInChallenge() : pkm.isAllowedInBattle())); + const partyPokemon = globalScene + .getPlayerParty() + .filter(pkm => (this.includeFainted ? pkm.isAllowedInChallenge() : pkm.isAllowedInBattle())); if (isNullOrUndefined(partyPokemon) || this.requiredMoves?.length < 0) { return false; @@ -51,25 +53,24 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => + return partyPokemon.filter(pokemon => // every required move should be included - this.requiredMoves.every((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) - ); - } else { - return partyPokemon.filter( - (pokemon) => - // none of the "required" moves should be included - !this.requiredMoves.some((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) + this.requiredMoves.every(requiredMove => this.getAllPokemonMoves(pokemon).includes(requiredMove)), ); } + return partyPokemon.filter( + pokemon => + // none of the "required" moves should be included + !this.requiredMoves.some(requiredMove => this.getAllPokemonMoves(pokemon).includes(requiredMove)), + ); } override getDialogueToken(__pokemon?: PlayerPokemon): [string, string] { - return [ "requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ") ]; + return ["requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ")]; } private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { - return pkm.getLevelMoves().map(([ _level, move ]) => move); + return pkm.getLevelMoves().map(([_level, move]) => move); } private getAllPokemonMoves(pkm: PlayerPokemon): Moves[] { diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 76bbb8f03a7..d9d62819fa6 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -4,14 +4,7 @@ import { Abilities } from "#enums/abilities"; /** * Moves that "steal" things */ -export const STEALING_MOVES = [ - Moves.PLUCK, - Moves.COVET, - Moves.KNOCK_OFF, - Moves.THIEF, - Moves.TRICK, - Moves.SWITCHEROO -]; +export const STEALING_MOVES = [Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO]; /** * Moves that "charm" someone @@ -24,7 +17,7 @@ export const CHARMING_MOVES = [ Moves.ATTRACT, Moves.SWEET_SCENT, Moves.CAPTIVATE, - Moves.AROMATIC_MIST + Moves.AROMATIC_MIST, ]; /** @@ -42,7 +35,7 @@ export const DANCING_MOVES = [ Moves.QUIVER_DANCE, Moves.SWORDS_DANCE, Moves.TEETER_DANCE, - Moves.VICTORY_DANCE + Moves.VICTORY_DANCE, ]; /** @@ -60,7 +53,7 @@ export const DISTRACTION_MOVES = [ Moves.CAPTIVATE, Moves.RAGE_POWDER, Moves.SUBSTITUTE, - Moves.SHED_TAIL + Moves.SHED_TAIL, ]; /** @@ -79,7 +72,7 @@ export const PROTECTING_MOVES = [ Moves.CRAFTY_SHIELD, Moves.SPIKY_SHIELD, Moves.OBSTRUCT, - Moves.DETECT + Moves.DETECT, ]; /** @@ -116,7 +109,7 @@ export const EXTORTION_ABILITIES = [ Abilities.ARENA_TRAP, Abilities.SHADOW_TAG, Abilities.SUCTION_CUPS, - Abilities.STICKY_HOLD + Abilities.STICKY_HOLD, ]; /** @@ -133,5 +126,5 @@ export const FIRE_RESISTANT_ABILITIES = [ Abilities.MAGMA_ARMOR, Abilities.WATER_VEIL, Abilities.STEAM_ENGINE, - Abilities.PRIMORDIAL_SEA + Abilities.PRIMORDIAL_SEA, ]; diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index df9b6355017..94790145687 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -63,7 +63,13 @@ export function queueEncounterMessage(contentKey: string): void { * @param callbackDelay * @param promptDelay */ -export function showEncounterText(contentKey: string, delay: number | null = null, callbackDelay: number = 0, prompt: boolean = true, promptDelay: number | null = null): Promise { +export function showEncounterText( + contentKey: string, + delay: number | null = null, + callbackDelay = 0, + prompt = true, + promptDelay: number | null = null, +): Promise { return new Promise(resolve => { const text: string | null = getEncounterText(contentKey); globalScene.ui.showText(text ?? "", delay, () => resolve(), callbackDelay, prompt, promptDelay); @@ -78,7 +84,12 @@ export function showEncounterText(contentKey: string, delay: number | null = nul * @param speakerContentKey * @param callbackDelay */ -export function showEncounterDialogue(textContentKey: string, speakerContentKey: string, delay: number | null = null, callbackDelay: number = 0): Promise { +export function showEncounterDialogue( + textContentKey: string, + speakerContentKey: string, + delay: number | null = null, + callbackDelay = 0, +): Promise { return new Promise(resolve => { const text: string | null = getEncounterText(textContentKey); const speaker: string | null = getEncounterText(speakerContentKey); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index a6ca236f735..d37ac340a7c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -2,14 +2,29 @@ import type Battle from "#app/battle"; import { BattlerIndex, BattleType } from "#app/battle"; import { biomeLinks, BiomePoolTier } from "#app/data/balance/biomes"; import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; -import { AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { + AVERAGE_ENCOUNTERS_PER_RUN_TARGET, + WEIGHT_INCREMENT_ON_SPAWN_MISS, +} from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import type { AiType, PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { EnemyPokemon, FieldPosition, PokemonMove, PokemonSummonData } from "#app/field/pokemon"; import type { CustomModifierSettings, ModifierType } from "#app/modifier/modifier-type"; -import { getPartyLuckValue, ModifierPoolType, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; +import { + getPartyLuckValue, + ModifierPoolType, + ModifierTypeGenerator, + ModifierTypeOption, + modifierTypes, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; +import { + MysteryEncounterBattlePhase, + MysteryEncounterBattleStartCleanupPhase, + MysteryEncounterPhase, + MysteryEncounterRewardsPhase, +} from "#app/phases/mystery-encounter-phases"; import type PokemonData from "#app/system/pokemon-data"; import type { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import type { PartyOption, PokemonSelectFilter } from "#app/ui/party-ui-handler"; @@ -71,7 +86,7 @@ export function doTrainerExclamation() { globalScene.time.delayedCall(800, () => { globalScene.field.remove(exclamationSprite, true); }); - } + }, }); globalScene.playSound("battle_anims/GEN8- Exclaim", { volume: 0.7 }); @@ -151,8 +166,15 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && !!partyConfig.doubleBattle); doubleBattle = doubleTrainer; - const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!(Utils.randSeedInt(2)) : partyConfig.female; - const newTrainer = new Trainer(trainerConfig.trainerType, doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, undefined, undefined, undefined, trainerConfig); + const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!Utils.randSeedInt(2) : partyConfig.female; + const newTrainer = new Trainer( + trainerConfig.trainerType, + doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + undefined, + undefined, + undefined, + trainerConfig, + ); newTrainer.x += 300; newTrainer.setVisible(false); globalScene.field.add(newTrainer); @@ -163,7 +185,12 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): } else { // Wild globalScene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.WILD_BATTLE; - const numEnemies = partyConfig?.pokemonConfigs && partyConfig.pokemonConfigs.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1; + const numEnemies = + partyConfig?.pokemonConfigs && partyConfig.pokemonConfigs.length > 0 + ? partyConfig?.pokemonConfigs?.length + : doubleBattle + ? 2 + : 1; battle.enemyLevels = new Array(numEnemies).fill(null).map(() => globalScene.currentBattle.getLevelForWave()); } @@ -183,8 +210,8 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): battle.enemyLevels = battle.enemyLevels.map(level => level + additive); battle.enemyLevels.forEach((level, e) => { - let enemySpecies; - let dataSource; + let enemySpecies: PokemonSpecies | undefined; + let dataSource: PokemonData | undefined; let isBoss = false; if (!loaded) { if ((!isNullOrUndefined(trainerType) || trainerConfig) && battle.trainer) { @@ -195,7 +222,14 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): dataSource = config.dataSource; enemySpecies = config.species; isBoss = config.isBoss; - battle.enemyParty[e] = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.TRAINER, isBoss, false, dataSource); + battle.enemyParty[e] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.TRAINER, + isBoss, + false, + dataSource, + ); } else { battle.enemyParty[e] = battle.trainer.genPartyMember(e); } @@ -213,7 +247,14 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): enemySpecies = globalScene.randomSpecies(battle.waveIndex, level, true); } - battle.enemyParty[e] = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, isBoss, false, dataSource); + battle.enemyParty[e] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.NONE, + isBoss, + false, + dataSource, + ); } } @@ -229,7 +270,7 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): enemyPokemon.resetSummonData(); } - if (!loaded && isNullOrUndefined(partyConfig.countAsSeen) || partyConfig.countAsSeen) { + if ((!loaded && isNullOrUndefined(partyConfig.countAsSeen)) || partyConfig.countAsSeen) { globalScene.gameData.setPokemonSeen(enemyPokemon, true, !!(trainerType || trainerConfig)); } @@ -268,7 +309,9 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): // Set Boss if (config.isBoss) { - let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments! : globalScene.getEncounterBossSegments(globalScene.currentBattle.waveIndex, level, enemySpecies, true); + let segments = !isNullOrUndefined(config.bossSegments) + ? config.bossSegments! + : globalScene.getEncounterBossSegments(globalScene.currentBattle.waveIndex, level, enemySpecies, true); if (!isNullOrUndefined(config.bossSegmentModifier)) { segments += config.bossSegmentModifier; } @@ -295,7 +338,11 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): if (statusEffects) { // Default to cureturn 3 for sleep const status = Array.isArray(statusEffects) ? statusEffects[0] : statusEffects; - const cureTurn = Array.isArray(statusEffects) ? statusEffects[1] : statusEffects === StatusEffect.SLEEP ? 3 : undefined; + const cureTurn = Array.isArray(statusEffects) + ? statusEffects[1] + : statusEffects === StatusEffect.SLEEP + ? 3 + : undefined; enemyPokemon.status = new Status(status, 0, cureTurn); } @@ -368,7 +415,7 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, ]; const moveset: string[] = []; - enemyPokemon.getMoveset().forEach((move) => { + enemyPokemon.getMoveset().forEach(move => { moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR }); @@ -381,7 +428,7 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): console.log( `Ability: ${enemyPokemon.getAbility().name}`, `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, - `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}`, ); console.log("Moveset:", moveset); }); @@ -400,7 +447,10 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): } }); if (!loaded) { - regenerateModifierPoolThresholds(globalScene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); + regenerateModifierPoolThresholds( + globalScene.getEnemyField(), + battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, + ); const customModifierTypes = partyConfig?.pokemonConfigs ?.filter(config => config?.modifierConfigs) .map(config => config.modifierConfigs!); @@ -416,9 +466,8 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): * @param moves */ export function loadCustomMovesForEncounter(moves: Moves | Moves[]) { - moves = Array.isArray(moves) ? moves : [ moves ]; - return Promise.all(moves.map(move => initMoveAnim(move))) - .then(() => loadMoveAnimAssets(moves)); + moves = Array.isArray(moves) ? moves : [moves]; + return Promise.all(moves.map(move => initMoveAnim(move))).then(() => loadMoveAnimAssets(moves)); } /** @@ -427,7 +476,7 @@ export function loadCustomMovesForEncounter(moves: Moves | Moves[]) { * @param playSound * @param showMessage */ -export function updatePlayerMoney(changeValue: number, playSound: boolean = true, showMessage: boolean = true) { +export function updatePlayerMoney(changeValue: number, playSound = true, showMessage = true) { globalScene.money = Math.min(Math.max(globalScene.money + changeValue, 0), Number.MAX_SAFE_INTEGER); globalScene.updateMoneyText(); globalScene.animateMoneyChanged(false); @@ -436,9 +485,21 @@ export function updatePlayerMoney(changeValue: number, playSound: boolean = true } if (showMessage) { if (changeValue < 0) { - globalScene.queueMessage(i18next.t("mysteryEncounterMessages:paid_money", { amount: -changeValue }), null, true); + globalScene.queueMessage( + i18next.t("mysteryEncounterMessages:paid_money", { + amount: -changeValue, + }), + null, + true, + ); } else { - globalScene.queueMessage(i18next.t("mysteryEncounterMessages:receive_money", { amount: changeValue }), null, true); + globalScene.queueMessage( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: changeValue, + }), + null, + true, + ); } } } @@ -461,7 +522,9 @@ export function generateModifierType(modifier: () => ModifierType, pregenArgs?: .withIdFromFunc(modifierTypes[modifierId]) .withTierFromPool(ModifierPoolType.PLAYER, globalScene.getPlayerParty()); - return result instanceof ModifierTypeGenerator ? result.generateType(globalScene.getPlayerParty(), pregenArgs) : result; + return result instanceof ModifierTypeGenerator + ? result.generateType(globalScene.getPlayerParty(), pregenArgs) + : result; } /** @@ -469,7 +532,10 @@ export function generateModifierType(modifier: () => ModifierType, pregenArgs?: * @param modifier * @param pregenArgs - can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. */ -export function generateModifierTypeOption(modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption | null { +export function generateModifierTypeOption( + modifier: () => ModifierType, + pregenArgs?: any[], +): ModifierTypeOption | null { const result = generateModifierType(modifier, pregenArgs); if (result) { return new ModifierTypeOption(result, 0); @@ -484,80 +550,100 @@ export function generateModifierTypeOption(modifier: () => ModifierType, pregenA * @param onPokemonNotSelected - Any logic that needs to be performed if no Pokemon is chosen * @param selectablePokemonFilter */ -export function selectPokemonForOption(onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: PokemonSelectFilter): Promise { +export function selectPokemonForOption( + // biome-ignore lint/suspicious/noConfusingVoidType: Takes a function that either returns void or an array of OptionSelectItem + onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], + onPokemonNotSelected?: () => void, + selectablePokemonFilter?: PokemonSelectFilter, +): Promise { return new Promise(resolve => { const modeToSetOnExit = globalScene.ui.getMode(); // Open party screen to choose pokemon - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: number, option: PartyOption) => { - if (slotIndex < globalScene.getPlayerParty().length) { - globalScene.ui.setMode(modeToSetOnExit).then(() => { - const pokemon = globalScene.getPlayerParty()[slotIndex]; - const secondaryOptions = onPokemonSelected(pokemon); - if (!secondaryOptions) { - globalScene.currentBattle.mysteryEncounter!.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - resolve(true); - return; - } + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.SELECT, + -1, + (slotIndex: number, _option: PartyOption) => { + if (slotIndex < globalScene.getPlayerParty().length) { + globalScene.ui.setMode(modeToSetOnExit).then(() => { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + const secondaryOptions = onPokemonSelected(pokemon); + if (!secondaryOptions) { + globalScene.currentBattle.mysteryEncounter!.setDialogueToken( + "selectedPokemon", + pokemon.getNameToRender(), + ); + resolve(true); + return; + } - // There is a second option to choose after selecting the Pokemon - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - const displayOptions = () => { - // Always appends a cancel option to bottom of options - const fullOptions = secondaryOptions.map(option => { - // Update handler to resolve promise - const onSelect = option.handler; - option.handler = () => { - onSelect(); - globalScene.currentBattle.mysteryEncounter!.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - resolve(true); - return true; + // There is a second option to choose after selecting the Pokemon + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + const displayOptions = () => { + // Always appends a cancel option to bottom of options + const fullOptions = secondaryOptions + .map(option => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + globalScene.currentBattle.mysteryEncounter!.setDialogueToken( + "selectedPokemon", + pokemon.getNameToRender(), + ); + resolve(true); + return true; + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(modeToSetOnExit); + resolve(false); + return true; + }, + onHover: () => { + showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); + }, + }); + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0, + supportHover: true, }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(modeToSetOnExit); - resolve(false); - return true; - }, - onHover: () => { - showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); - } - }); - const config: OptionSelectConfig = { - options: fullOptions, - maxOptions: 7, - yOffset: 0, - supportHover: true + // Do hover over the starting selection option + if (fullOptions[0].onHover) { + fullOptions[0].onHover(); + } + globalScene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); }; - // Do hover over the starting selection option - if (fullOptions[0].onHover) { - fullOptions[0].onHover(); + const textPromptKey = + globalScene.currentBattle.mysteryEncounter?.selectedOption?.dialogue?.secondOptionPrompt; + if (!textPromptKey) { + displayOptions(); + } else { + showEncounterText(textPromptKey).then(() => displayOptions()); } - globalScene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); - }; - - const textPromptKey = globalScene.currentBattle.mysteryEncounter?.selectedOption?.dialogue?.secondOptionPrompt; - if (!textPromptKey) { - displayOptions(); - } else { - showEncounterText(textPromptKey).then(() => displayOptions()); - } + }); }); - }); - } else { - globalScene.ui.setMode(modeToSetOnExit).then(() => { - if (onPokemonNotSelected) { - onPokemonNotSelected(); - } - resolve(false); - }); - } - }, selectablePokemonFilter); + } else { + globalScene.ui.setMode(modeToSetOnExit).then(() => { + if (onPokemonNotSelected) { + onPokemonNotSelected(); + } + resolve(false); + }); + } + }, + selectablePokemonFilter, + ); }); } @@ -575,7 +661,12 @@ interface PokemonAndOptionSelected { * @param selectablePokemonFilter * @param onHoverOverCancelOption */ -export function selectOptionThenPokemon(options: OptionSelectItem[], optionSelectPromptKey: string, selectablePokemonFilter?: PokemonSelectFilter, onHoverOverCancelOption?: () => void): Promise { +export function selectOptionThenPokemon( + options: OptionSelectItem[], + optionSelectPromptKey: string, + selectablePokemonFilter?: PokemonSelectFilter, + onHoverOverCancelOption?: () => void, +): Promise { return new Promise(resolve => { const modeToSetOnExit = globalScene.ui.getMode(); @@ -601,51 +692,62 @@ export function selectOptionThenPokemon(options: OptionSelectItem[], optionSelec const selectPokemonAfterOption = (selectedOptionIndex: number) => { // Open party screen to choose a Pokemon - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: number, option: PartyOption) => { - if (slotIndex < globalScene.getPlayerParty().length) { - // Pokemon and option selected - globalScene.ui.setMode(modeToSetOnExit).then(() => { - const result: PokemonAndOptionSelected = { selectedPokemonIndex: slotIndex, selectedOptionIndex: selectedOptionIndex }; - resolve(result); - }); - } else { - // Back to first option select screen - displayOptions(config); - } - }, selectablePokemonFilter); + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.SELECT, + -1, + (slotIndex: number, _option: PartyOption) => { + if (slotIndex < globalScene.getPlayerParty().length) { + // Pokemon and option selected + globalScene.ui.setMode(modeToSetOnExit).then(() => { + const result: PokemonAndOptionSelected = { + selectedPokemonIndex: slotIndex, + selectedOptionIndex: selectedOptionIndex, + }; + resolve(result); + }); + } else { + // Back to first option select screen + displayOptions(config); + } + }, + selectablePokemonFilter, + ); }; // Always appends a cancel option to bottom of options - const fullOptions = options.map((option, index) => { - // Update handler to resolve promise - const onSelect = option.handler; - option.handler = () => { - onSelect(); - selectPokemonAfterOption(index); - return true; - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(modeToSetOnExit); - resolve(null); - return true; - }, - onHover: () => { - if (onHoverOverCancelOption) { - onHoverOverCancelOption(); - } - showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); - } - }); + const fullOptions = options + .map((option, index) => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + selectPokemonAfterOption(index); + return true; + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(modeToSetOnExit); + resolve(null); + return true; + }, + onHover: () => { + if (onHoverOverCancelOption) { + onHoverOverCancelOption(); + } + showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); + }, + }); const config: OptionSelectConfig = { options: fullOptions, maxOptions: 7, yOffset: 0, - supportHover: true + supportHover: true, }; displayOptions(config); @@ -659,7 +761,11 @@ export function selectOptionThenPokemon(options: OptionSelectItem[], optionSelec * @param eggRewards * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before {@linkcode MysteryEncounterRewardsPhase}) */ -export function setEncounterRewards(customShopRewards?: CustomModifierSettings, eggRewards?: IEggOptions[], preRewardsCallback?: Function) { +export function setEncounterRewards( + customShopRewards?: CustomModifierSettings, + eggRewards?: IEggOptions[], + preRewardsCallback?: Function, +) { globalScene.currentBattle.mysteryEncounter!.doEncounterRewards = () => { if (preRewardsCallback) { preRewardsCallback(); @@ -702,8 +808,8 @@ export function setEncounterRewards(customShopRewards?: CustomModifierSettings, * https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_effort_value_yield_(Generation_IX) * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue */ -export function setEncounterExp(participantId: number | number[], baseExpValue: number, useWaveIndex: boolean = true) { - const participantIds = Array.isArray(participantId) ? participantId : [ participantId ]; +export function setEncounterExp(participantId: number | number[], baseExpValue: number, useWaveIndex = true) { + const participantIds = Array.isArray(participantId) ? participantId : [participantId]; globalScene.currentBattle.mysteryEncounter!.doEncounterExp = () => { globalScene.unshiftPhase(new PartyExpPhase(baseExpValue, useWaveIndex, new Set(participantIds))); @@ -737,7 +843,10 @@ export function initSubsequentOptionSelect(optionSelectSettings: OptionSelectSet * @param addHealPhase - when true, will add a shop phase to end of encounter with 0 rewards but healing items are available * @param encounterMode - Can set custom encounter mode if necessary (may be required for forcing Pokemon to return before next phase) */ -export function leaveEncounterWithoutBattle(addHealPhase: boolean = false, encounterMode: MysteryEncounterMode = MysteryEncounterMode.NO_BATTLE) { +export function leaveEncounterWithoutBattle( + addHealPhase = false, + encounterMode: MysteryEncounterMode = MysteryEncounterMode.NO_BATTLE, +) { globalScene.currentBattle.mysteryEncounter!.encounterMode = encounterMode; globalScene.clearPhaseQueue(); globalScene.clearPhaseQueueSplice(); @@ -749,8 +858,8 @@ export function leaveEncounterWithoutBattle(addHealPhase: boolean = false, encou * @param addHealPhase - Adds an empty shop phase to allow player to purchase healing items * @param doNotContinue - default `false`. If set to true, will not end the battle and continue to next wave */ -export function handleMysteryEncounterVictory(addHealPhase: boolean = false, doNotContinue: boolean = false) { - const allowedPkm = globalScene.getPlayerParty().filter((pkm) => pkm.isAllowedInBattle()); +export function handleMysteryEncounterVictory(addHealPhase = false, doNotContinue = false) { + const allowedPkm = globalScene.getPlayerParty().filter(pkm => pkm.isAllowedInBattle()); if (allowedPkm.length === 0) { globalScene.clearPhaseQueue(); @@ -763,10 +872,17 @@ export function handleMysteryEncounterVictory(addHealPhase: boolean = false, doN const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.continuousEncounter || doNotContinue) { return; - } else if (encounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { + } + if (encounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { globalScene.pushPhase(new MysteryEncounterRewardsPhase(addHealPhase)); globalScene.pushPhase(new EggLapsePhase()); - } else if (!globalScene.getEnemyParty().find(p => encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { + } else if ( + !globalScene + .getEnemyParty() + .find(p => + encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true), + ) + ) { globalScene.pushPhase(new BattleEndPhase(true)); if (encounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { globalScene.pushPhase(new TrainerVictoryPhase()); @@ -785,8 +901,8 @@ export function handleMysteryEncounterVictory(addHealPhase: boolean = false, doN * Similar to {@linkcode handleMysteryEncounterVictory}, but for cases where the player lost a battle or failed a challenge * @param addHealPhase */ -export function handleMysteryEncounterBattleFailed(addHealPhase: boolean = false, doNotContinue: boolean = false) { - const allowedPkm = globalScene.getPlayerParty().filter((pkm) => pkm.isAllowedInBattle()); +export function handleMysteryEncounterBattleFailed(addHealPhase = false, doNotContinue = false) { + const allowedPkm = globalScene.getPlayerParty().filter(pkm => pkm.isAllowedInBattle()); if (allowedPkm.length === 0) { globalScene.clearPhaseQueue(); @@ -799,7 +915,8 @@ export function handleMysteryEncounterBattleFailed(addHealPhase: boolean = false const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.continuousEncounter || doNotContinue) { return; - } else if (encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE) { + } + if (encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE) { globalScene.pushPhase(new BattleEndPhase(false)); } @@ -817,7 +934,7 @@ export function handleMysteryEncounterBattleFailed(addHealPhase: boolean = false * @param destroy - If true, will destroy visuals ONLY ON HIDE TRANSITION. Does nothing on show. Defaults to true * @param duration */ -export function transitionMysteryEncounterIntroVisuals(hide: boolean = true, destroy: boolean = true, duration: number = 750): Promise { +export function transitionMysteryEncounterIntroVisuals(hide = true, destroy = true, duration = 750): Promise { return new Promise(resolve => { const introVisuals = globalScene.currentBattle.mysteryEncounter!.introVisuals; const enemyPokemon = globalScene.getEnemyField(); @@ -835,7 +952,7 @@ export function transitionMysteryEncounterIntroVisuals(hide: boolean = true, des // Transition globalScene.tweens.add({ - targets: [ introVisuals, enemyPokemon ], + targets: [introVisuals, enemyPokemon], x: `${hide ? "+" : "-"}=16`, y: `${hide ? "-" : "+"}=16`, alpha: hide ? 0 : 1, @@ -852,7 +969,7 @@ export function transitionMysteryEncounterIntroVisuals(hide: boolean = true, des globalScene.currentBattle.mysteryEncounter!.introVisuals = undefined; } resolve(true); - } + }, }); } else { resolve(true); @@ -866,10 +983,15 @@ export function transitionMysteryEncounterIntroVisuals(hide: boolean = true, des */ export function handleMysteryEncounterBattleStartEffects() { const encounter = globalScene.currentBattle.mysteryEncounter; - if (globalScene.currentBattle.isBattleMysteryEncounter() && encounter && encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE && !encounter.startOfBattleEffectsComplete) { + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + encounter && + encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE && + !encounter.startOfBattleEffectsComplete + ) { const effects = encounter.startOfBattleEffects; effects.forEach(effect => { - let source; + let source: EnemyPokemon | Pokemon; if (effect.sourcePokemon) { source = effect.sourcePokemon; } else if (!isNullOrUndefined(effect.sourceBattlerIndex)) { @@ -887,6 +1009,7 @@ export function handleMysteryEncounterBattleStartEffects() { } else { source = globalScene.getEnemyField()[0]; } + // @ts-ignore: source cannot be undefined globalScene.pushPhase(new MovePhase(source, effect.targets, effect.move, effect.followUp, effect.ignorePp)); }); @@ -919,20 +1042,31 @@ export function handleMysteryEncounterTurnStartEffects(): boolean { * @param rerollHidden whether the mon should get an extra roll for Hidden Ability * @returns {@linkcode EnemyPokemon} for the requested encounter */ -export function getRandomEncounterSpecies(level: number, isBoss: boolean = false, rerollHidden: boolean = false): EnemyPokemon { +export function getRandomEncounterSpecies(level: number, isBoss = false, rerollHidden = false): EnemyPokemon { let bossSpecies: PokemonSpecies; let isEventEncounter = false; const eventEncounters = globalScene.eventManager.getEventEncounters(); - let formIndex; + let formIndex: number | undefined; if (eventEncounters.length > 0 && randSeedInt(2) === 1) { const eventEncounter = randSeedItem(eventEncounters); - const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, !eventEncounter.blockEvolution, isBoss, globalScene.gameMode); + const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel( + level, + !eventEncounter.blockEvolution, + isBoss, + globalScene.gameMode, + ); isEventEncounter = true; bossSpecies = getPokemonSpecies(levelSpecies); formIndex = eventEncounter.formIndex; } else { - bossSpecies = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, level, 0, getPartyLuckValue(globalScene.getPlayerParty()), isBoss); + bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + isBoss, + ); } const ret = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, isBoss); if (formIndex) { @@ -959,15 +1093,24 @@ export function getRandomEncounterSpecies(level: number, isBoss: boolean = false export function calculateMEAggregateStats(baseSpawnWeight: number) { const numRuns = 1000; let run = 0; - const biomes = Object.keys(Biome).filter(key => isNaN(Number(key))); - const alwaysPickTheseBiomes = [ Biome.ISLAND, Biome.ABYSS, Biome.WASTELAND, Biome.FAIRY_CAVE, Biome.TEMPLE, Biome.LABORATORY, Biome.SPACE, Biome.WASTELAND ]; + const biomes = Object.keys(Biome).filter(key => Number.isNaN(Number(key))); + const alwaysPickTheseBiomes = [ + Biome.ISLAND, + Biome.ABYSS, + Biome.WASTELAND, + Biome.FAIRY_CAVE, + Biome.TEMPLE, + Biome.LABORATORY, + Biome.SPACE, + Biome.WASTELAND, + ]; const calculateNumEncounters = (): any[] => { let encounterRate = baseSpawnWeight; // BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT - const numEncounters = [ 0, 0, 0, 0 ]; + const numEncounters = [0, 0, 0, 0]; let mostRecentEncounterWave = 0; - const encountersByBiome = new Map(biomes.map(b => [ b, 0 ])); - const validMEfloorsByBiome = new Map(biomes.map(b => [ b, 0 ])); + const encountersByBiome = new Map(biomes.map(b => [b, 0])); + const validMEfloorsByBiome = new Map(biomes.map(b => [b, 0])); let currentBiome = Biome.TOWN; let currentArena = globalScene.newArena(currentBiome); globalScene.setSeed(Utils.randomString(24)); @@ -987,7 +1130,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { .filter(b => { return !Array.isArray(b) || !Utils.randSeedInt(b[1]); }) - .map(b => !Array.isArray(b) ? b : b[0]); + .map(b => (!Array.isArray(b) ? b : b[0])); }, i * 100); if (biomes! && biomes.length > 0) { const specialBiomes = biomes.filter(b => alwaysPickTheseBiomes.includes(b)); @@ -998,7 +1141,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { } } } else if (biomeLinks.hasOwnProperty(currentBiome)) { - currentBiome = (biomeLinks[currentBiome] as Biome); + currentBiome = biomeLinks[currentBiome] as Biome; } else { if (!(i % 50)) { currentBiome = Biome.END; @@ -1027,12 +1170,12 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { // If total number of encounters is lower than expected for the run, slightly favor a new encounter // Do the reverse as well - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10) * (i - 10); + const expectedEncountersByFloor = (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10)) * (i - 10); const currentRunDiffFromAvg = expectedEncountersByFloor - numEncounters.reduce((a, b) => a + b); const favoredEncounterRate = encounterRate + currentRunDiffFromAvg * 15; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = (i - mostRecentEncounterWave) > 3; + const canSpawn = i - mostRecentEncounterWave > 3; if (canSpawn && roll < favoredEncounterRate) { mostRecentEncounterWave = i; @@ -1040,7 +1183,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { // Calculate encounter rarity // Common / Uncommon / Rare / Super Rare (base is out of 128) - const tierWeights = [ 66, 40, 19, 3 ]; + const tierWeights = [66, 40, 19, 3]; // Adjust tier weights by currently encountered events (pity system that lowers odds of multiple Common/Great) tierWeights[0] = tierWeights[0] - 6 * numEncounters[0]; @@ -1052,14 +1195,20 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { const uncommonThreshold = totalWeight - tierWeights[0] - tierWeights[1]; // 64 - 32 - 16 = 16 const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; // 64 - 32 - 16 - 10 = 6 - tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; + tierValue > commonThreshold + ? ++numEncounters[0] + : tierValue > uncommonThreshold + ? ++numEncounters[1] + : tierValue > rareThreshold + ? ++numEncounters[2] + : ++numEncounters[3]; encountersByBiome.set(Biome[currentBiome], (encountersByBiome.get(Biome[currentBiome]) ?? 0) + 1); } else { encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS; } } - return [ numEncounters, encountersByBiome, validMEfloorsByBiome ]; + return [numEncounters, encountersByBiome, validMEfloorsByBiome]; }; const encounterRuns: number[][] = []; @@ -1067,7 +1216,7 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { const validFloorsByBiome: Map[] = []; while (run < numRuns) { globalScene.executeWithSeedOffset(() => { - const [ numEncounters, encountersByBiome, validMEfloorsByBiome ] = calculateNumEncounters(); + const [numEncounters, encountersByBiome, validMEfloorsByBiome] = calculateNumEncounters(); encounterRuns.push(numEncounters); encountersByBiomeRuns.push(encountersByBiome); validFloorsByBiome.push(validMEfloorsByBiome); @@ -1108,13 +1257,17 @@ export function calculateMEAggregateStats(baseSpawnWeight: number) { let stats = `Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Greats: ${uncommonMean}\nAvg Ultras: ${rareMean}\nAvg Rogues: ${superRareMean}\n`; - const meanEncountersPerRunPerBiomeSorted = [ ...meanEncountersPerRunPerBiome.entries() ].sort((e1, e2) => e2[1] - e1[1]); - meanEncountersPerRunPerBiomeSorted.forEach(value => stats = stats + `${value[0]}: avg valid floors ${meanMEFloorsPerRunPerBiome.get(value[0])}, avg MEs ${value[1]},\n`); + const meanEncountersPerRunPerBiomeSorted = [...meanEncountersPerRunPerBiome.entries()].sort( + (e1, e2) => e2[1] - e1[1], + ); + + for (const value of meanEncountersPerRunPerBiomeSorted) { + stats += value[0] + "avg valid floors " + meanMEFloorsPerRunPerBiome.get(value[0]) + ", avg MEs ${value[1]},\n"; + } console.log(stats); } - /** * TODO: remove once encounter spawn rate is finalized * Just a helper function to calculate aggregate stats for MEs in a Classic run @@ -1125,7 +1278,7 @@ export function calculateRareSpawnAggregateStats(luckValue: number) { let run = 0; const calculateNumRareEncounters = (): any[] => { - const bossEncountersByRarity = [ 0, 0, 0, 0 ]; + const bossEncountersByRarity = [0, 0, 0, 0]; globalScene.setSeed(Utils.randomString(24)); globalScene.resetSeed(); // There are 12 wild boss floors @@ -1133,17 +1286,20 @@ export function calculateRareSpawnAggregateStats(luckValue: number) { // Roll boss tier // luck influences encounter rarity let luckModifier = 0; - if (!isNaN(luckValue)) { + if (!Number.isNaN(luckValue)) { luckModifier = luckValue * 0.5; } const tierValue = Utils.randSeedInt(64 - luckModifier); - const tier = tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + const tier = + tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; switch (tier) { - default: - case BiomePoolTier.BOSS: - ++bossEncountersByRarity[0]; - break; case BiomePoolTier.BOSS_RARE: ++bossEncountersByRarity[1]; break; @@ -1153,6 +1309,10 @@ export function calculateRareSpawnAggregateStats(luckValue: number) { case BiomePoolTier.BOSS_ULTRA_RARE: ++bossEncountersByRarity[3]; break; + case BiomePoolTier.BOSS: + default: + ++bossEncountersByRarity[0]; + break; } } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 3871b919e62..275078dbace 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -4,7 +4,12 @@ import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; -import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor } from "#app/data/pokeball"; +import { + doPokeballBounceAnim, + getPokeballAtlasKey, + getPokeballCatchMultiplier, + getPokeballTintColor, +} from "#app/data/pokeball"; import { PlayerGender } from "#enums/player-gender"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; @@ -17,7 +22,11 @@ import type { PokemonType } from "#enums/pokemon-type"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; -import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { + getEncounterText, + queueEncounterMessage, + showEncounterText, +} from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -41,18 +50,41 @@ export const STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER = 1; * @param shiny * @param variant */ -export function getSpriteKeysFromSpecies(species: Species, female?: boolean, formIndex?: number, shiny?: boolean, variant?: number): { spriteKey: string, fileRoot: string } { - const spriteKey = getPokemonSpecies(species).getSpriteKey(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); - const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); +export function getSpriteKeysFromSpecies( + species: Species, + female?: boolean, + formIndex?: number, + shiny?: boolean, + variant?: number, +): { spriteKey: string; fileRoot: string } { + const spriteKey = getPokemonSpecies(species).getSpriteKey( + female ?? false, + formIndex ?? 0, + shiny ?? false, + variant ?? 0, + ); + const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath( + female ?? false, + formIndex ?? 0, + shiny ?? false, + variant ?? 0, + ); return { spriteKey, fileRoot }; } /** * Gets the sprite key and file root for a given Pokemon (accounts for gender, shiny, variants, forms, and experimental) */ -export function getSpriteKeysFromPokemon(pokemon: Pokemon): { spriteKey: string, fileRoot: string } { - const spriteKey = pokemon.getSpeciesForm().getSpriteKey(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); - const fileRoot = pokemon.getSpeciesForm().getSpriteAtlasPath(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); +export function getSpriteKeysFromPokemon(pokemon: Pokemon): { + spriteKey: string; + fileRoot: string; +} { + const spriteKey = pokemon + .getSpeciesForm() + .getSpriteKey(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); + const fileRoot = pokemon + .getSpeciesForm() + .getSpriteAtlasPath(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); return { spriteKey, fileRoot }; } @@ -65,7 +97,11 @@ export function getSpriteKeysFromPokemon(pokemon: Pokemon): { spriteKey: string, * @param doNotReturnLastAllowedMon Default `false`. If `true`, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) * @returns */ -export function getRandomPlayerPokemon(isAllowed: boolean = false, isFainted: boolean = false, doNotReturnLastAllowedMon: boolean = false): PlayerPokemon { +export function getRandomPlayerPokemon( + isAllowed = false, + isFainted = false, + doNotReturnLastAllowedMon = false, +): PlayerPokemon { const party = globalScene.getPlayerParty(); let chosenIndex: number; let chosenPokemon: PlayerPokemon | null = null; @@ -104,7 +140,7 @@ export function getRandomPlayerPokemon(isAllowed: boolean = false, isFainted: bo * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestLevelPlayerPokemon(isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { +export function getHighestLevelPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; @@ -116,7 +152,7 @@ export function getHighestLevelPlayerPokemon(isAllowed: boolean = false, isFaint continue; } - pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.level < p?.level ? p : pokemon) : p; } return pokemon!; @@ -130,7 +166,7 @@ export function getHighestLevelPlayerPokemon(isAllowed: boolean = false, isFaint * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestStatPlayerPokemon(stat: PermanentStat, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { +export function getHighestStatPlayerPokemon(stat: PermanentStat, isAllowed = false, isFainted = false): PlayerPokemon { const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; @@ -142,7 +178,7 @@ export function getHighestStatPlayerPokemon(stat: PermanentStat, isAllowed: bool continue; } - pokemon = pokemon ? pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon : p; + pokemon = pokemon ? (pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon) : p; } return pokemon!; @@ -155,7 +191,7 @@ export function getHighestStatPlayerPokemon(stat: PermanentStat, isAllowed: bool * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getLowestLevelPlayerPokemon(isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { +export function getLowestLevelPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; @@ -167,7 +203,7 @@ export function getLowestLevelPlayerPokemon(isAllowed: boolean = false, isFainte continue; } - pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.level > p?.level ? p : pokemon) : p; } return pokemon!; @@ -180,7 +216,7 @@ export function getLowestLevelPlayerPokemon(isAllowed: boolean = false, isFainte * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestStatTotalPlayerPokemon(isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { +export function getHighestStatTotalPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; @@ -192,7 +228,7 @@ export function getHighestStatTotalPlayerPokemon(isAllowed: boolean = false, isF continue; } - pokemon = pokemon ? pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon) : p; } return pokemon!; @@ -209,28 +245,40 @@ export function getHighestStatTotalPlayerPokemon(isAllowed: boolean = false, isF * @param allowMythical * @returns */ -export function getRandomSpeciesByStarterCost(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: PokemonType[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species { +export function getRandomSpeciesByStarterCost( + starterTiers: number | [number, number], + excludedSpecies?: Species[], + types?: PokemonType[], + allowSubLegendary = true, + allowLegendary = true, + allowMythical = true, +): Species { let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarterCosts) - .map(s => [ parseInt(s) as Species, speciesStarterCosts[s] as number ]) + .map(s => [Number.parseInt(s) as Species, speciesStarterCosts[s] as number]) .filter(s => { const pokemonSpecies = getPokemonSpecies(s[0]); - return pokemonSpecies && (!excludedSpecies || !excludedSpecies.includes(s[0])) - && (allowSubLegendary || !pokemonSpecies.subLegendary) - && (allowLegendary || !pokemonSpecies.legendary) - && (allowMythical || !pokemonSpecies.mythical); + return ( + pokemonSpecies && + (!excludedSpecies || !excludedSpecies.includes(s[0])) && + (allowSubLegendary || !pokemonSpecies.subLegendary) && + (allowLegendary || !pokemonSpecies.legendary) && + (allowMythical || !pokemonSpecies.mythical) + ); }) - .map(s => [ getPokemonSpecies(s[0]), s[1] ]); + .map(s => [getPokemonSpecies(s[0]), s[1]]); if (types && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2))); + filteredSpecies = filteredSpecies.filter( + s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2)), + ); } // If no filtered mons exist at specified starter tiers, will expand starter search range until there are // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 - let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); + let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); while (tryFilterStarterTiers.length === 0 && !(min === 0 && max === 10)) { if (min > 0) { min--; @@ -259,7 +307,11 @@ export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.hp = 0; pokemon.trySetStatus(StatusEffect.FAINT); pokemon.updateInfo(); - queueEncounterMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + queueEncounterMessage( + i18next.t("battle:fainted", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -290,7 +342,9 @@ function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { */ export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { if (damage <= 0) { - console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); + console.warn( + "Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead.", + ); } // If a Pokemon would faint from the damage applied, its HP is instead set to 1. if (pokemon.isAllowedInBattle() && pokemon.hp - damage <= 0) { @@ -308,7 +362,9 @@ export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { */ export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { if (heal <= 0) { - console.warn("Damaging pokemon with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead."); + console.warn( + "Damaging pokemon with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead.", + ); } applyHpChangeToPokemon(pokemon, heal); @@ -321,8 +377,9 @@ export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { * @param value */ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { - const modType = modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE() - .generateType(globalScene.getPlayerParty(), [ value ]) + const modType = modifierTypes + .MYSTERY_ENCOUNTER_SHUCKLE_JUICE() + .generateType(globalScene.getPlayerParty(), [value]) ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE); const modifier = modType?.newModifier(pokemon); if (modifier) { @@ -339,15 +396,20 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb * @param modType * @param fallbackModifierType */ -export async function applyModifierTypeToPlayerPokemon(pokemon: PlayerPokemon, modType: PokemonHeldItemModifierType, fallbackModifierType?: PokemonHeldItemModifierType) { +export async function applyModifierTypeToPlayerPokemon( + pokemon: PlayerPokemon, + modType: PokemonHeldItemModifierType, + fallbackModifierType?: PokemonHeldItemModifierType, +) { // Check if the Pokemon has max stacks of that item already const modifier = modType.newModifier(pokemon); - const existing = globalScene.findModifier(m => ( - m instanceof PokemonHeldItemModifier && - m.type.id === modType.id && - m.pokemonId === pokemon.id && - m.matchType(modifier) - )) as PokemonHeldItemModifier; + const existing = globalScene.findModifier( + m => + m instanceof PokemonHeldItemModifier && + m.type.id === modType.id && + m.pokemonId === pokemon.id && + m.matchType(modifier), + ) as PokemonHeldItemModifier; // At max stacks if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { @@ -373,7 +435,11 @@ export async function applyModifierTypeToPlayerPokemon(pokemon: PlayerPokemon, m * @param pokeballType * @param ballTwitchRate - can pass custom ball catch rates (for special events, like safari) */ -export function trainerThrowPokeball(pokemon: EnemyPokemon, pokeballType: PokeballType, ballTwitchRate?: number): Promise { +export function trainerThrowPokeball( + pokemon: EnemyPokemon, + pokeballType: PokeballType, + ballTwitchRate?: number, +): Promise { const originalY: number = pokemon.y; if (!ballTwitchRate) { @@ -397,7 +463,9 @@ export function trainerThrowPokeball(pokemon: EnemyPokemon, pokeballType: Pokeba }); return new Promise(resolve => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); globalScene.time.delayedCall(512, () => { globalScene.playSound("se/pb_throw"); @@ -406,7 +474,9 @@ export function trainerThrowPokeball(pokemon: EnemyPokemon, pokeballType: Pokeba globalScene.time.delayedCall(256, () => { globalScene.trainer.setFrame("3"); globalScene.time.delayedCall(768, () => { - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); @@ -486,22 +556,22 @@ export function trainerThrowPokeball(pokemon: EnemyPokemon, pokeballType: Pokeba alpha: 0, duration: 200, easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() + onComplete: () => pbTint.destroy(), }); - } + }, }); } }, onComplete: () => { catchPokemon(pokemon, pokeball, pokeballType).then(() => resolve(true)); - } + }, }); }; globalScene.time.delayedCall(250, () => doPokeballBounceAnim(pokeball, 16, 72, 350, doShake)); - } + }, }); - } + }, }); }); }); @@ -515,7 +585,12 @@ export function trainerThrowPokeball(pokemon: EnemyPokemon, pokeballType: Pokeba * @param pokeball * @param pokeballType */ -function failCatch(pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType) { +function failCatch( + pokemon: EnemyPokemon, + originalY: number, + pokeball: Phaser.GameObjects.Sprite, + pokeballType: PokeballType, +) { return new Promise(resolve => { globalScene.playSound("se/pb_rel"); pokemon.setY(originalY); @@ -534,13 +609,21 @@ function failCatch(pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.Ga targets: pokemon, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); globalScene.currentBattle.lastUsedPokeball = pokeballType; removePb(pokeball); - globalScene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.getNameToRender() }), null, () => resolve(), null, true); + globalScene.ui.showText( + i18next.t("battle:pokemonBrokeFree", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => resolve(), + null, + true, + ); }); } @@ -553,10 +636,19 @@ function failCatch(pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.Ga * @param showCatchObtainMessage * @param isObtain */ -export async function catchPokemon(pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite | null, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { +export async function catchPokemon( + pokemon: EnemyPokemon, + pokeball: Phaser.GameObjects.Sprite | null, + pokeballType: PokeballType, + showCatchObtainMessage = true, + isObtain = false, +): Promise { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { globalScene.validateAchv(achvs.HIDDEN_ABILITY); } @@ -611,35 +703,70 @@ export async function catchPokemon(pokemon: EnemyPokemon, pokeball: Phaser.GameO } }); }; - Promise.all([ pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon) ]).then(() => { + Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { if (globalScene.getPlayerParty().length === 6) { const promptRelease = () => { - globalScene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { - globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); - globalScene.ui.setMode(Mode.CONFIRM, () => { - const newPokemon = globalScene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); - globalScene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - promptRelease(); - }); - }, false); - }, () => { - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: number, _option: PartyOption) => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(slotIndex); - } else { - promptRelease(); - } - }); - }); - }, () => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }, "fullParty"); - }); + globalScene.ui.showText( + i18next.t("battle:partyFull", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => { + globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + const newPokemon = globalScene.addPlayerPokemon( + pokemon.species, + pokemon.level, + pokemon.abilityIndex, + pokemon.formIndex, + pokemon.gender, + pokemon.shiny, + pokemon.variant, + pokemon.ivs, + pokemon.nature, + pokemon, + ); + globalScene.ui.setMode( + Mode.SUMMARY, + newPokemon, + 0, + SummaryUiMode.DEFAULT, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + false, + ); + }, + () => { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.RELEASE, + 0, + (slotIndex: number, _option: PartyOption) => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(slotIndex); + } else { + promptRelease(); + } + }); + }, + ); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }, + "fullParty", + ); + }, + ); }; promptRelease(); } else { @@ -649,7 +776,15 @@ export async function catchPokemon(pokemon: EnemyPokemon, pokeball: Phaser.GameO }; if (showCatchObtainMessage) { - globalScene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.getNameToRender() }), null, doPokemonCatchMenu, 0, true); + globalScene.ui.showText( + i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { + pokemonName: pokemon.getNameToRender(), + }), + null, + doPokemonCatchMenu, + 0, + true, + ); } else { doPokemonCatchMenu(); } @@ -671,7 +806,7 @@ function removePb(pokeball: Phaser.GameObjects.Sprite) { alpha: 0, onComplete: () => { pokeball.destroy(); - } + }, }); } } @@ -696,11 +831,17 @@ export async function doPokemonFlee(pokemon: EnemyPokemon): Promise { onComplete: () => { pokemon.setVisible(false); pokemon.leaveField(true, true, true); - showEncounterText(i18next.t("battle:pokemonFled", { pokemonName: pokemon.getNameToRender() }), null, 600, false) - .then(() => { - resolve(); - }); - } + showEncounterText( + i18next.t("battle:pokemonFled", { + pokemonName: pokemon.getNameToRender(), + }), + null, + 600, + false, + ).then(() => { + resolve(); + }); + }, }); }); } @@ -724,11 +865,17 @@ export function doPlayerFlee(pokemon: EnemyPokemon): Promise { onComplete: () => { pokemon.setVisible(false); pokemon.leaveField(true, true, true); - showEncounterText(i18next.t("battle:playerFled", { pokemonName: pokemon.getNameToRender() }), null, 600, false) - .then(() => { - resolve(); - }); - } + showEncounterText( + i18next.t("battle:playerFled", { + pokemonName: pokemon.getNameToRender(), + }), + null, + 600, + false, + ).then(() => { + resolve(); + }); + }, }); }); } @@ -737,33 +884,33 @@ export function doPlayerFlee(pokemon: EnemyPokemon): Promise { * Bug Species and their corresponding weights */ const GOLDEN_BUG_NET_SPECIES_POOL: [Species, number][] = [ - [ Species.SCYTHER, 40 ], - [ Species.SCIZOR, 40 ], - [ Species.KLEAVOR, 40 ], - [ Species.PINSIR, 40 ], - [ Species.HERACROSS, 40 ], - [ Species.YANMA, 40 ], - [ Species.YANMEGA, 40 ], - [ Species.SHUCKLE, 40 ], - [ Species.ANORITH, 40 ], - [ Species.ARMALDO, 40 ], - [ Species.ESCAVALIER, 40 ], - [ Species.ACCELGOR, 40 ], - [ Species.JOLTIK, 40 ], - [ Species.GALVANTULA, 40 ], - [ Species.DURANT, 40 ], - [ Species.LARVESTA, 40 ], - [ Species.VOLCARONA, 40 ], - [ Species.DEWPIDER, 40 ], - [ Species.ARAQUANID, 40 ], - [ Species.WIMPOD, 40 ], - [ Species.GOLISOPOD, 40 ], - [ Species.SIZZLIPEDE, 40 ], - [ Species.CENTISKORCH, 40 ], - [ Species.NYMBLE, 40 ], - [ Species.LOKIX, 40 ], - [ Species.BUZZWOLE, 1 ], - [ Species.PHEROMOSA, 1 ], + [Species.SCYTHER, 40], + [Species.SCIZOR, 40], + [Species.KLEAVOR, 40], + [Species.PINSIR, 40], + [Species.HERACROSS, 40], + [Species.YANMA, 40], + [Species.YANMEGA, 40], + [Species.SHUCKLE, 40], + [Species.ANORITH, 40], + [Species.ARMALDO, 40], + [Species.ESCAVALIER, 40], + [Species.ACCELGOR, 40], + [Species.JOLTIK, 40], + [Species.GALVANTULA, 40], + [Species.DURANT, 40], + [Species.LARVESTA, 40], + [Species.VOLCARONA, 40], + [Species.DEWPIDER, 40], + [Species.ARAQUANID, 40], + [Species.WIMPOD, 40], + [Species.GOLISOPOD, 40], + [Species.SIZZLIPEDE, 40], + [Species.CENTISKORCH, 40], + [Species.NYMBLE, 40], + [Species.LOKIX, 40], + [Species.BUZZWOLE, 1], + [Species.PHEROMOSA, 1], ]; /** @@ -792,7 +939,7 @@ export function getGoldenBugNetSpecies(level: number): PokemonSpecies { * @param scene * @param levelAdditiveModifier Default 0. will add +(1 level / 10 waves * levelAdditiveModifier) to the level calculation */ -export function getEncounterPokemonLevelForWave(levelAdditiveModifier: number = 0) { +export function getEncounterPokemonLevelForWave(levelAdditiveModifier = 0) { const currentBattle = globalScene.currentBattle; const baseLevel = currentBattle.getLevelForWave(); @@ -803,7 +950,10 @@ export function getEncounterPokemonLevelForWave(levelAdditiveModifier: number = export async function addPokemonDataToDexAndValidateAchievements(pokemon: PlayerPokemon) { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { globalScene.validateAchv(achvs.HIDDEN_ABILITY); } @@ -832,9 +982,16 @@ export async function addPokemonDataToDexAndValidateAchievements(pokemon: Player * @param scene * @param invalidSelectionKey */ -export function isPokemonValidForEncounterOptionSelection(pokemon: Pokemon, invalidSelectionKey: string): string | null { +export function isPokemonValidForEncounterOptionSelection( + pokemon: Pokemon, + invalidSelectionKey: string, +): string | null { if (!pokemon.isAllowedInChallenge()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } if (!pokemon.isAllowedInBattle()) { return getEncounterText(invalidSelectionKey) ?? null; diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index 0cb2a695de8..15085bb2bf8 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -7,7 +7,7 @@ import { globalScene } from "#app/global-scene"; export enum TransformationScreenPosition { CENTER, LEFT, - RIGHT + RIGHT, } /** @@ -17,7 +17,11 @@ export enum TransformationScreenPosition { * @param transformPokemon * @param screenPosition */ -export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, transformPokemon: PlayerPokemon, screenPosition: TransformationScreenPosition) { +export function doPokemonTransformationSequence( + previousPokemon: PlayerPokemon, + transformPokemon: PlayerPokemon, + screenPosition: TransformationScreenPosition, +) { return new Promise(resolve => { const transformationContainer = globalScene.fieldUI.getByName("Dream Background") as Phaser.GameObjects.Container; const transformationBaseBg = globalScene.add.image(0, 0, "default_bg"); @@ -30,14 +34,26 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, let pokemonEvoSprite: Phaser.GameObjects.Sprite; let pokemonEvoTintSprite: Phaser.GameObjects.Sprite; - const xOffset = screenPosition === TransformationScreenPosition.CENTER ? 0 : - screenPosition === TransformationScreenPosition.RIGHT ? 100 : -100; + const xOffset = + screenPosition === TransformationScreenPosition.CENTER + ? 0 + : screenPosition === TransformationScreenPosition.RIGHT + ? 100 + : -100; // Centered transformations occur at a lower y Position const yOffset = screenPosition !== TransformationScreenPosition.CENTER ? -15 : 0; const getPokemonSprite = () => { - const ret = globalScene.addPokemonSprite(previousPokemon, transformationBaseBg.displayWidth / 2 + xOffset, transformationBaseBg.displayHeight / 2 + yOffset, "pkmn__sub"); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + previousPokemon, + transformationBaseBg.displayWidth / 2 + xOffset, + transformationBaseBg.displayHeight / 2 + yOffset, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -48,12 +64,12 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, pokemonSprite.setAlpha(0); pokemonTintSprite.setAlpha(0); - pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonTintSprite.setTintFill(0xffffff); pokemonEvoSprite.setVisible(false); pokemonEvoTintSprite.setVisible(false); - pokemonEvoTintSprite.setTintFill(0xFFFFFF); + pokemonEvoTintSprite.setTintFill(0xffffff); - [ pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { + [pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite].map(sprite => { const spriteKey = previousPokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -61,12 +77,17 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()), isTerastallized: previousPokemon.isTerastallized }); + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(previousPokemon.getTeraType()), + isTerastallized: previousPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); sprite.setPipelineData("shiny", previousPokemon.shiny); sprite.setPipelineData("variant", previousPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (previousPokemon.summonData?.speciesForm) { k += "Base"; } @@ -74,7 +95,7 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, }); }); - [ pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { + [pokemonEvoSprite, pokemonEvoTintSprite].map(sprite => { const spriteKey = transformPokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -86,7 +107,7 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, sprite.setPipelineData("spriteKey", transformPokemon.getSpriteKey()); sprite.setPipelineData("shiny", transformPokemon.shiny); sprite.setPipelineData("variant", transformPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (transformPokemon.summonData?.speciesForm) { k += "Base"; } @@ -139,18 +160,18 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, previousPokemon.destroy(); transformPokemon.setVisible(false); transformPokemon.setAlpha(1); - } + }, }); }); - } + }, }); }); }); }); }); - } + }, }); - } + }, }); }); } @@ -163,7 +184,12 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, * @param xOffset * @param yOffset */ -function doSpiralUpward(transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doSpiralUpward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; globalScene.tweens.addCounter({ @@ -173,12 +199,18 @@ function doSpiralUpward(transformationBaseBg: Phaser.GameObjects.Image, transfor if (f < 64) { if (!(f & 7)) { for (let i = 0; i < 4; i++) { - doSpiralUpwardParticle((f & 120) * 2 + i * 64, transformationBaseBg, transformationContainer, xOffset, yOffset); + doSpiralUpwardParticle( + (f & 120) * 2 + i * 64, + transformationBaseBg, + transformationContainer, + xOffset, + yOffset, + ); } } f++; } - } + }, }); } @@ -190,7 +222,12 @@ function doSpiralUpward(transformationBaseBg: Phaser.GameObjects.Image, transfor * @param xOffset * @param yOffset */ -function doArcDownward(transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doArcDownward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; globalScene.tweens.addCounter({ @@ -205,7 +242,7 @@ function doArcDownward(transformationBaseBg: Phaser.GameObjects.Image, transform } f++; } - } + }, }); } @@ -217,7 +254,12 @@ function doArcDownward(transformationBaseBg: Phaser.GameObjects.Image, transform * @param pokemonTintSprite * @param pokemonEvoTintSprite */ -function doCycle(l: number, lastCycle: number, pokemonTintSprite: Phaser.GameObjects.Sprite, pokemonEvoTintSprite: Phaser.GameObjects.Sprite): Promise { +function doCycle( + l: number, + lastCycle: number, + pokemonTintSprite: Phaser.GameObjects.Sprite, + pokemonEvoTintSprite: Phaser.GameObjects.Sprite, +): Promise { return new Promise(resolve => { const isLastCycle = l === lastCycle; globalScene.tweens.add({ @@ -225,7 +267,7 @@ function doCycle(l: number, lastCycle: number, pokemonTintSprite: Phaser.GameObj scale: 0.25, ease: "Cubic.easeInOut", duration: 500 / l, - yoyo: !isLastCycle + yoyo: !isLastCycle, }); globalScene.tweens.add({ targets: pokemonEvoTintSprite, @@ -240,7 +282,7 @@ function doCycle(l: number, lastCycle: number, pokemonTintSprite: Phaser.GameObj pokemonTintSprite.setVisible(false); resolve(true); } - } + }, }); }); } @@ -253,7 +295,12 @@ function doCycle(l: number, lastCycle: number, pokemonTintSprite: Phaser.GameObj * @param xOffset * @param yOffset */ -function doCircleInward(transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doCircleInward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; globalScene.tweens.addCounter({ @@ -270,7 +317,7 @@ function doCircleInward(transformationBaseBg: Phaser.GameObjects.Image, transfor } } f++; - } + }, }); } @@ -283,7 +330,13 @@ function doCircleInward(transformationBaseBg: Phaser.GameObjects.Image, transfor * @param xOffset * @param yOffset */ -function doSpiralUpwardParticle(trigIndex: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doSpiralUpwardParticle( + trigIndex: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); transformationContainer.add(particle); @@ -296,7 +349,7 @@ function doSpiralUpwardParticle(trigIndex: number, transformationBaseBg: Phaser. duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -304,7 +357,7 @@ function doSpiralUpwardParticle(trigIndex: number, transformationBaseBg: Phaser. particle.setPosition(initialX, 88 - (f * f) / 80 + yOffset); particle.y += sin(trigIndex, amp) / 4; particle.x += cos(trigIndex, amp); - particle.setScale(1 - (f / 80)); + particle.setScale(1 - f / 80); trigIndex += 4; if (f & 1) { amp--; @@ -328,7 +381,13 @@ function doSpiralUpwardParticle(trigIndex: number, transformationBaseBg: Phaser. * @param xOffset * @param yOffset */ -function doArcDownParticle(trigIndex: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doArcDownParticle( + trigIndex: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); particle.setScale(0.5); @@ -342,7 +401,7 @@ function doArcDownParticle(trigIndex: number, transformationBaseBg: Phaser.GameO duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -371,7 +430,14 @@ function doArcDownParticle(trigIndex: number, transformationBaseBg: Phaser.GameO * @param xOffset * @param yOffset */ -function doCircleInwardParticle(trigIndex: number, speed: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doCircleInwardParticle( + trigIndex: number, + speed: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; const initialY = transformationBaseBg.displayHeight / 2 + yOffset; const particle = globalScene.add.image(initialX, initialY, "evo_sparkle"); @@ -384,7 +450,7 @@ function doCircleInwardParticle(trigIndex: number, speed: number, transformation duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { diff --git a/src/data/nature.ts b/src/data/nature.ts index b90047ce6f0..e23d92c14b0 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -5,11 +5,17 @@ import { UiTheme } from "#enums/ui-theme"; import i18next from "i18next"; import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#enums/stat"; -export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string { +export function getNatureName( + nature: Nature, + includeStatEffects = false, + forStarterSelect = false, + ignoreBBCode = false, + uiTheme: UiTheme = UiTheme.DEFAULT, +): string { let ret = Utils.toReadableString(Nature[nature]); //Translating nature - if (i18next.exists("nature:" + ret)) { - ret = i18next.t("nature:" + ret as any); + if (i18next.exists(`nature:${ret}`)) { + ret = i18next.t(`nature:${ret}` as any); } if (includeStatEffects) { let increasedStat: Stat | null = null; @@ -23,7 +29,9 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals } } const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW; - const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text; + const getTextFrag = !ignoreBBCode + ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) + : (text: string, _style: TextStyle) => text; if (increasedStat && decreasedStat) { ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`; } else { diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 7cd9f061cdd..b0744237755 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -95,16 +95,31 @@ export function getCriticalCaptureChance(modifiedCatchRate: number): number { const dexCount = globalScene.gameData.getSpeciesCount(d => !!d.caughtAttr); const catchingCharmMultiplier = new NumberHolder(1); globalScene.findModifier(m => m instanceof CriticalCatchChanceBoosterModifier)?.apply(catchingCharmMultiplier); - const dexMultiplier = globalScene.gameMode.isDaily || dexCount > 800 ? 2.5 - : dexCount > 600 ? 2 - : dexCount > 400 ? 1.5 - : dexCount > 200 ? 1 - : dexCount > 100 ? 0.5 - : 0; - return Math.floor(catchingCharmMultiplier.value * dexMultiplier * Math.min(255, modifiedCatchRate) / 6); + const dexMultiplier = + globalScene.gameMode.isDaily || dexCount > 800 + ? 2.5 + : dexCount > 600 + ? 2 + : dexCount > 400 + ? 1.5 + : dexCount > 200 + ? 1 + : dexCount > 100 + ? 0.5 + : 0; + return Math.floor((catchingCharmMultiplier.value * dexMultiplier * Math.min(255, modifiedCatchRate)) / 6); } -export function doPokeballBounceAnim(pokeball: Phaser.GameObjects.Sprite, y1: number, y2: number, baseBounceDuration: number, callback: Function, isCritical: boolean = false) { +// TODO: fix Function annotations +export function doPokeballBounceAnim( + pokeball: Phaser.GameObjects.Sprite, + y1: number, + y2: number, + baseBounceDuration: number, + // biome-ignore lint/complexity/noBannedTypes: TODO + callback: Function, + isCritical = false, +) { let bouncePower = 1; let bounceYOffset = y1; let bounceY = y2; @@ -134,12 +149,12 @@ export function doPokeballBounceAnim(pokeball: Phaser.GameObjects.Sprite, y1: nu y: bounceY, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeOut", - onComplete: () => doBounce() + onComplete: () => doBounce(), }); } else if (callback) { callback(); } - } + }, }); }; @@ -165,12 +180,12 @@ export function doPokeballBounceAnim(pokeball: Phaser.GameObjects.Sprite, y1: nu x: x0, duration: 60, ease: "Linear", - onComplete: () => globalScene.time.delayedCall(500, doBounce) + onComplete: () => globalScene.time.delayedCall(500, doBounce), }); } - } + }, }); - } + }, }); }; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 1192f7f17c1..4636e68d6d6 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -113,7 +113,7 @@ export enum FormChangeItem { DRACO_PLATE, DREAD_PLATE, PIXIE_PLATE, - BLANK_PLATE, // TODO: Find a potential use for this + BLANK_PLATE, // TODO: Find a potential use for this LEGEND_PLATE, // TODO: Find a potential use for this FIGHTING_MEMORY, FLYING_MEMORY, @@ -132,7 +132,7 @@ export enum FormChangeItem { DRAGON_MEMORY, DARK_MEMORY, FAIRY_MEMORY, - NORMAL_MEMORY // TODO: Find a potential use for this + NORMAL_MEMORY, // TODO: Find a potential use for this } export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean; @@ -146,7 +146,14 @@ export class SpeciesFormChange { public quiet: boolean; public readonly conditions: SpeciesFormChangeCondition[]; - constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false, ...conditions: SpeciesFormChangeCondition[]) { + constructor( + speciesId: Species, + preFormKey: string, + evoFormKey: string, + trigger: SpeciesFormChangeTrigger, + quiet = false, + ...conditions: SpeciesFormChangeCondition[] + ) { this.speciesId = speciesId; this.preFormKey = preFormKey; this.formKey = evoFormKey; @@ -212,9 +219,9 @@ export class SpeciesFormChangeCondition { } export abstract class SpeciesFormChangeTrigger { - public description: string = ""; + public description = ""; - canChange(pokemon: Pokemon): boolean { + canChange(_pokemon: Pokemon): boolean { return true; } @@ -223,20 +230,22 @@ export abstract class SpeciesFormChangeTrigger { } } -export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger { -} +export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger {} export class SpeciesFormChangeAbilityTrigger extends SpeciesFormChangeTrigger { public description: string = i18next.t("pokemonEvolutions:Forms.ability"); } export class SpeciesFormChangeCompoundTrigger { - public description: string = ""; + public description = ""; public triggers: SpeciesFormChangeTrigger[]; constructor(...triggers: SpeciesFormChangeTrigger[]) { this.triggers = triggers; - this.description = this.triggers.filter(trigger => trigger?.description?.length > 0).map(trigger => trigger.description).join(", "); + this.description = this.triggers + .filter(trigger => trigger?.description?.length > 0) + .map(trigger => trigger.description) + .join(", "); } canChange(pokemon: Pokemon): boolean { @@ -258,17 +267,27 @@ export class SpeciesFormChangeItemTrigger extends SpeciesFormChangeTrigger { public item: FormChangeItem; public active: boolean; - constructor(item: FormChangeItem, active: boolean = true) { + constructor(item: FormChangeItem, active = true) { super(); this.item = item; this.active = active; - this.description = this.active ? - i18next.t("pokemonEvolutions:Forms.item", { item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`) }) : - i18next.t("pokemonEvolutions:Forms.deactivateItem", { item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`) }); + this.description = this.active + ? i18next.t("pokemonEvolutions:Forms.item", { + item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), + }) + : i18next.t("pokemonEvolutions:Forms.deactivateItem", { + item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), + }); } canChange(pokemon: Pokemon): boolean { - return !!globalScene.findModifier(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id && m.formChangeItem === this.item && m.active === this.active); + return !!globalScene.findModifier( + m => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === pokemon.id && + m.formChangeItem === this.item && + m.active === this.active, + ); } } @@ -281,7 +300,7 @@ export class SpeciesFormChangeTimeOfDayTrigger extends SpeciesFormChangeTrigger this.description = i18next.t("pokemonEvolutions:Forms.timeOfDay"); } - canChange(pokemon: Pokemon): boolean { + canChange(_pokemon: Pokemon): boolean { return this.timesOfDay.indexOf(globalScene.arena.getTimeOfDay()) > -1; } } @@ -289,10 +308,12 @@ export class SpeciesFormChangeTimeOfDayTrigger extends SpeciesFormChangeTrigger export class SpeciesFormChangeActiveTrigger extends SpeciesFormChangeTrigger { public active: boolean; - constructor(active: boolean = false) { + constructor(active = false) { super(); this.active = active; - this.description = this.active ? i18next.t("pokemonEvolutions:Forms.enter") : i18next.t("pokemonEvolutions:Forms.leave"); + this.description = this.active + ? i18next.t("pokemonEvolutions:Forms.enter") + : i18next.t("pokemonEvolutions:Forms.leave"); } canChange(pokemon: Pokemon): boolean { @@ -304,10 +325,10 @@ export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigg public statusEffects: StatusEffect[]; public invert: boolean; - constructor(statusEffects: StatusEffect | StatusEffect[], invert: boolean = false) { + constructor(statusEffects: StatusEffect | StatusEffect[], invert = false) { super(); if (!Array.isArray(statusEffects)) { - statusEffects = [ statusEffects ]; + statusEffects = [statusEffects]; } this.statusEffects = statusEffects; this.invert = invert; @@ -315,7 +336,7 @@ export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigg } canChange(pokemon: Pokemon): boolean { - return (this.statusEffects.indexOf(pokemon.status?.effect || StatusEffect.NONE) > -1) !== this.invert; + return this.statusEffects.indexOf(pokemon.status?.effect || StatusEffect.NONE) > -1 !== this.invert; } } @@ -323,17 +344,26 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge public move: Moves; public known: boolean; - constructor(move: Moves, known: boolean = true) { + constructor(move: Moves, known = true) { super(); this.move = move; this.known = known; - const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as unknown as string; - this.description = known ? i18next.t("pokemonEvolutions:Forms.moveLearned", { move: i18next.t(`move:${moveKey}.name`) }) : - i18next.t("pokemonEvolutions:Forms.moveForgotten", { move: i18next.t(`move:${moveKey}.name`) }); + const moveKey = Moves[this.move] + .split("_") + .filter(f => f) + .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join("") as unknown as string; + this.description = known + ? i18next.t("pokemonEvolutions:Forms.moveLearned", { + move: i18next.t(`move:${moveKey}.name`), + }) + : i18next.t("pokemonEvolutions:Forms.moveForgotten", { + move: i18next.t(`move:${moveKey}.name`), + }); } canChange(pokemon: Pokemon): boolean { - return (!!pokemon.moveset.filter(m => m?.moveId === this.move).length) === this.known; + return !!pokemon.moveset.filter(m => m?.moveId === this.move).length === this.known; } } @@ -341,7 +371,7 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig public movePredicate: (m: Moves) => boolean; public used: boolean; - constructor(move: Moves | ((m: Moves) => boolean), used: boolean = true) { + constructor(move: Moves | ((m: Moves) => boolean), used = true) { super(); this.movePredicate = typeof move === "function" ? move : (m: Moves) => m === move; this.used = used; @@ -361,7 +391,9 @@ export class SpeciesFormChangePostMoveTrigger extends SpeciesFormChangeMoveTrigg description = i18next.t("pokemonEvolutions:Forms.postMove"); canChange(pokemon: Pokemon): boolean { - return pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used; + return ( + pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used + ); } } @@ -369,13 +401,12 @@ export class MeloettaFormChangePostMoveTrigger extends SpeciesFormChangePostMove override canChange(pokemon: Pokemon): boolean { if (globalScene.gameMode.hasChallenge(Challenges.SINGLE_TYPE)) { return false; - } else { - // Meloetta will not transform if it has the ability Sheer Force when using Relic Song - if (pokemon.hasAbility(Abilities.SHEER_FORCE)) { - return false; - } - return super.canChange(pokemon); } + // Meloetta will not transform if it has the ability Sheer Force when using Relic Song + if (pokemon.hasAbility(Abilities.SHEER_FORCE)) { + return false; + } + return super.canChange(pokemon); } } @@ -389,7 +420,11 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { } canChange(pokemon: Pokemon): boolean { - return this.formKey === pokemon.species.forms[globalScene.getSpeciesFormIndex(pokemon.species, pokemon.gender, pokemon.getNature(), true)].formKey; + return ( + this.formKey === + pokemon.species.forms[globalScene.getSpeciesFormIndex(pokemon.species, pokemon.gender, pokemon.getNature(), true)] + .formKey + ); } } @@ -399,7 +434,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { * @extends SpeciesFormChangeTrigger */ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { - description = i18next.t("pokemonEvolutions:Forms.tera" ); + description = i18next.t("pokemonEvolutions:Forms.tera"); } /** @@ -440,7 +475,12 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger { const isWeatherSuppressed = globalScene.arena.weather?.isEffectSuppressed(); const isAbilitySuppressed = pokemon.summonData.abilitySuppressed; - return !isAbilitySuppressed && !isWeatherSuppressed && (pokemon.hasAbility(this.ability) && this.weathers.includes(currentWeather)); + return ( + !isAbilitySuppressed && + !isWeatherSuppressed && + pokemon.hasAbility(this.ability) && + this.weathers.includes(currentWeather) + ); } } @@ -491,16 +531,27 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie const isEmax = formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1; const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; if (isMega) { - return i18next.t("battlePokemonForm:megaChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:megaChange", { + preName, + pokemonName: pokemon.name, + }); } if (isGmax) { - return i18next.t("battlePokemonForm:gigantamaxChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:gigantamaxChange", { + preName, + pokemonName: pokemon.name, + }); } if (isEmax) { - return i18next.t("battlePokemonForm:eternamaxChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:eternamaxChange", { + preName, + pokemonName: pokemon.name, + }); } if (isRevert) { - return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlePokemonForm:revertChange", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } if (pokemon.getAbility().id === Abilities.DISGUISE) { return i18next.t("battlePokemonForm:disguiseChange"); @@ -515,13 +566,14 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie * @returns A {@linkcode SpeciesFormChangeCondition} checking if that species is registered as caught */ function getSpeciesDependentFormChangeCondition(species: Species): SpeciesFormChangeCondition { - return new SpeciesFormChangeCondition(p => !!globalScene.gameData.dexData[species].caughtAttr); + return new SpeciesFormChangeCondition(_p => !!globalScene.gameData.dexData[species].caughtAttr); } interface PokemonFormChanges { - [key: string]: SpeciesFormChange[] + [key: string]: SpeciesFormChange[]; } +// biome-ignore format: manually formatted export const pokemonFormChanges: PokemonFormChanges = { [Species.VENUSAUR]: [ new SpeciesFormChange(Species.VENUSAUR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.VENUSAURITE)), @@ -994,16 +1046,22 @@ export const pokemonFormChanges: PokemonFormChanges = { export function initPokemonForms() { const formChangeKeys = Object.keys(pokemonFormChanges); - formChangeKeys.forEach(pk => { + for (const pk of formChangeKeys) { const formChanges = pokemonFormChanges[pk]; const newFormChanges: SpeciesFormChange[] = []; for (const fc of formChanges) { const itemTrigger = fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger; if (itemTrigger && !formChanges.find(c => fc.formKey === c.preFormKey && fc.preFormKey === c.formKey)) { - newFormChanges.push(new SpeciesFormChange(fc.speciesId, fc.formKey, fc.preFormKey, new SpeciesFormChangeItemTrigger(itemTrigger.item, false))); + newFormChanges.push( + new SpeciesFormChange( + fc.speciesId, + fc.formKey, + fc.preFormKey, + new SpeciesFormChangeItemTrigger(itemTrigger.item, false), + ), + ); } } formChanges.push(...newFormChanges); - }); + } } - diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 796678a200c..1bf97209613 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -13,10 +13,18 @@ import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate } from "#app/data/exp"; import type { EvolutionLevel } from "#app/data/balance/pokemon-evolutions"; -import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { + SpeciesWildEvolutionDelay, + pokemonEvolutions, + pokemonPrevolutions, +} from "#app/data/balance/pokemon-evolutions"; import { PokemonType } from "#enums/pokemon-type"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; -import { pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { + pokemonFormLevelMoves, + pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, + pokemonSpeciesLevelMoves, +} from "#app/data/balance/pokemon-level-moves"; import type { Stat } from "#enums/stat"; import type { Variant, VariantSet } from "#app/data/variant"; import { variantData } from "#app/data/variant"; @@ -29,7 +37,7 @@ export enum Region { ALOLA, GALAR, HISUI, - PALDEA + PALDEA, } // TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed. @@ -60,7 +68,7 @@ export const normalForm: Species[] = [ Species.MARSHADOW, Species.CRAMORANT, Species.ZARUDE, - Species.CALYREX + Species.CALYREX, ]; /** @@ -81,9 +89,10 @@ export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies } export function getPokemonSpeciesForm(species: Species, formIndex: number): PokemonSpeciesForm { - const retSpecies: PokemonSpecies = species >= 2000 - ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? - : allSpecies[species - 1]; + 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]; } @@ -94,8 +103,8 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: 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] : ""); + 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); @@ -104,8 +113,8 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): speciesBName = speciesBName.slice(speciesBPrefix.length); } - const [ speciesASuffixMatch, speciesBSuffixMatch ] = [ speciesAName, speciesBName ].map(n => / (?:[^ ]+)$/.exec(n)); - const [ speciesASuffix, speciesBSuffix ] = [ speciesASuffixMatch, speciesBSuffixMatch ].map(m => m ? m[0] : ""); + 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); @@ -123,9 +132,7 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): let fragA: string; let fragB: string; - fragA = splitNameA.length === 1 - ? fragAMatch ? fragAMatch[1] : speciesAName - : splitNameA[splitNameA.length - 1]; + fragA = splitNameA.length === 1 ? (fragAMatch ? fragAMatch[1] : speciesAName) : splitNameA[splitNameA.length - 1]; if (splitNameB.length === 1) { if (fragBMatch) { @@ -179,9 +186,26 @@ export abstract class PokemonSpeciesForm { readonly genderDiffs: boolean; readonly isStarterSelectable: boolean; - constructor(type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean, isStarterSelectable: boolean + constructor( + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + genderDiffs: boolean, + isStarterSelectable: boolean, ) { this.type1 = type1; this.type2 = type2; @@ -191,7 +215,7 @@ export abstract class PokemonSpeciesForm { this.ability2 = ability2 === Abilities.NONE ? ability1 : ability2; this.abilityHidden = abilityHidden; this.baseTotal = baseTotal; - this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; + this.baseStats = [baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd]; this.catchRate = catchRate; this.baseFriendship = baseFriendship; this.baseExp = baseExp; @@ -206,7 +230,7 @@ export abstract class PokemonSpeciesForm { * @param forStarter boolean to get the nonbaby form of a starter * @returns The species */ - getRootSpeciesId(forStarter: boolean = false): Species { + getRootSpeciesId(forStarter = false): Species { let ret = this.speciesId; while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarterCosts.hasOwnProperty(ret))) { ret = pokemonPrevolutions[ret]; @@ -269,23 +293,29 @@ export abstract class PokemonSpeciesForm { formIndex = this.formIndex; } let starterSpeciesId = this.speciesId; - while (!(starterSpeciesId in starterPassiveAbilities) || !(formIndex in starterPassiveAbilities[starterSpeciesId])) { + while ( + !(starterSpeciesId in starterPassiveAbilities) || + !(formIndex in starterPassiveAbilities[starterSpeciesId]) + ) { if (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) { starterSpeciesId = pokemonPrevolutions[starterSpeciesId]; - } else { // If we've reached the base species and still haven't found a matching ability, use form 0 if possible + } else { + // If we've reached the base species and still haven't found a matching ability, use form 0 if possible if (0 in starterPassiveAbilities[starterSpeciesId]) { return starterPassiveAbilities[starterSpeciesId][0]; - } else { - console.log("No passive ability found for %s, using run away", this.speciesId); - return Abilities.RUN_AWAY; } + console.log("No passive ability found for %s, using run away", this.speciesId); + return Abilities.RUN_AWAY; } } return starterPassiveAbilities[starterSpeciesId][formIndex]; } getLevelMoves(): LevelMoves { - if (pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { + if ( + pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && + pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex) + ) { return pokemonSpeciesFormLevelMoves[this.speciesId][this.formIndex].slice(0); } return pokemonSpeciesLevelMoves[this.speciesId].slice(0); @@ -296,7 +326,7 @@ export abstract class PokemonSpeciesForm { } isObtainable(): boolean { - return (this.generation <= 9 || pokemonPrevolutions.hasOwnProperty(this.speciesId)); + return this.generation <= 9 || pokemonPrevolutions.hasOwnProperty(this.speciesId); } isCatchable(): boolean { @@ -308,7 +338,7 @@ export abstract class PokemonSpeciesForm { } isTrainerForbidden(): boolean { - return [ Species.ETERNAL_FLOETTE, Species.BLOODMOON_URSALUNA ].includes(this.speciesId); + return [Species.ETERNAL_FLOETTE, Species.BLOODMOON_URSALUNA].includes(this.speciesId); } isRareRegional(): boolean { @@ -357,18 +387,19 @@ export abstract class PokemonSpeciesForm { return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } - getSpriteId(female: boolean, formIndex?: number, shiny?: boolean, variant: number = 0, back?: boolean): string { + getSpriteId(female: boolean, formIndex?: number, shiny?: boolean, variant = 0, back?: boolean): string { if (formIndex === undefined || this instanceof PokemonForm) { formIndex = this.formIndex; } const formSpriteKey = this.getFormSpriteKey(formIndex); - const showGenderDiffs = this.genderDiffs && female && ![ SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX ].find(k => formSpriteKey === k); + const showGenderDiffs = + this.genderDiffs && female && ![SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX].find(k => formSpriteKey === k); const baseSpriteKey = `${showGenderDiffs ? "female__" : ""}${this.speciesId}${formSpriteKey ? `-${formSpriteKey}` : ""}`; let config = variantData; - `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => config ? config = config[p] : null); + `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => (config ? (config = config[p]) : null)); const variantSet = config as VariantSet; return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant] === 2 ? `_${variant + 1}` : ""}`; @@ -380,7 +411,6 @@ export abstract class PokemonSpeciesForm { abstract getFormSpriteKey(formIndex?: number): string; - /** * Variant Data key/index is either species id or species id followed by -formkey * @param formIndex optional form index for pokemon with different forms @@ -401,7 +431,8 @@ export abstract class PokemonSpeciesForm { getIconAtlasKey(formIndex?: number, shiny?: boolean, variant?: number): string { const variantDataIndex = this.getVariantDataIndex(formIndex); - const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); + const isVariant = + shiny && variantData[variantDataIndex] && variant !== undefined && variantData[variantDataIndex][variant]; return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } @@ -414,7 +445,8 @@ export abstract class PokemonSpeciesForm { let ret = this.speciesId.toString(); - const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); + const isVariant = + shiny && variantData[variantDataIndex] && variant !== undefined && variantData[variantDataIndex][variant]; if (shiny && !isVariant) { ret += "s"; @@ -479,7 +511,9 @@ export abstract class PokemonSpeciesForm { const forms = getPokemonSpecies(speciesId).forms; if (forms.length) { if (formIndex !== undefined && formIndex >= forms.length) { - console.warn(`Attempted accessing form with index ${formIndex} of species ${getPokemonSpecies(speciesId).getName()} with only ${forms.length || 0} forms`); + console.warn( + `Attempted accessing form with index ${formIndex} of species ${getPokemonSpecies(speciesId).getName()} with only ${forms.length || 0} forms`, + ); formIndex = Math.min(formIndex, forms.length - 1); } const formKey = forms[formIndex || 0].formKey; @@ -532,11 +566,14 @@ export abstract class PokemonSpeciesForm { for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { const eggMoveIndex = speciesEggMoves[rootSpeciesId].findIndex(m => m === moveId); - if (eggMoveIndex > -1 && (eggMoves & (1 << eggMoveIndex))) { + if (eggMoveIndex > -1 && eggMoves & (1 << eggMoveIndex)) { continue; } } - if (pokemonFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { + if ( + pokemonFormLevelMoves.hasOwnProperty(this.speciesId) && + pokemonFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex) + ) { if (!pokemonFormLevelMoves[this.speciesId][this.formIndex].find(lm => lm[0] <= 5 && lm[1] === moveId)) { return false; } @@ -548,7 +585,14 @@ export abstract class PokemonSpeciesForm { return true; } - loadAssets(female: boolean, formIndex?: number, shiny?: boolean, variant?: Variant, startLoad?: boolean, back?: boolean): Promise { + loadAssets( + female: boolean, + formIndex?: number, + shiny?: boolean, + variant?: Variant, + startLoad?: boolean, + back?: boolean, + ): Promise { return new Promise(resolve => { const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant, back); globalScene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant, back)); @@ -557,19 +601,26 @@ export abstract class PokemonSpeciesForm { const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot console.warn = () => {}; - const frameNames = globalScene.anims.generateFrameNames(spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); + const frameNames = globalScene.anims.generateFrameNames(spriteKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 400, + }); console.warn = originalWarn; - if (!(globalScene.anims.exists(spriteKey))) { + if (!globalScene.anims.exists(spriteKey)) { globalScene.anims.create({ key: this.getSpriteKey(female, formIndex, shiny, variant, back), frames: frameNames, frameRate: 10, - repeat: -1 + repeat: -1, }); } else { globalScene.anims.get(spriteKey).frameRate = 10; } - const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant, back).replace("variant/", "").replace(/_[1-3]$/, ""); + const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant, back) + .replace("variant/", "") + .replace(/_[1-3]$/, ""); globalScene.loadPokemonVariantAssets(spriteKey, spritePath, variant).then(() => resolve()); }); if (startLoad) { @@ -618,9 +669,9 @@ export abstract class PokemonSpeciesForm { for (let i = 0; i < pixelData.length; i += 4) { if (pixelData[i + 3]) { const pixel = pixelData.slice(i, i + 4); - const [ r, g, b, a ] = pixel; + const [r, g, b, a] = pixel; if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { - spriteColors.push([ r, g, b, a ]); + spriteColors.push([r, g, b, a]); } } } @@ -630,7 +681,14 @@ export abstract class PokemonSpeciesForm { if (!total) { continue; } - pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); + pixelColors.push( + argbFromRgba({ + r: pixelData[i], + g: pixelData[i + 1], + b: pixelData[i + 2], + a: pixelData[i + 3], + }), + ); } } @@ -639,9 +697,13 @@ export abstract class PokemonSpeciesForm { const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - globalScene.executeWithSeedOffset(() => { - paletteColors = QuantizerCelebi.quantize(pixelColors, 2); - }, 0, "This result should not vary"); + globalScene.executeWithSeedOffset( + () => { + paletteColors = QuantizerCelebi.quantize(pixelColors, 2); + }, + 0, + "This result should not vary", + ); Math.random = originalRandom; @@ -661,14 +723,57 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali readonly canChangeForm: boolean; readonly forms: PokemonForm[]; - constructor(id: Species, generation: number, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, - type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, growthRate: GrowthRate, malePercent: number | null, - genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[] + constructor( + id: Species, + generation: number, + subLegendary: boolean, + legendary: boolean, + mythical: boolean, + species: string, + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + growthRate: GrowthRate, + malePercent: number | null, + genderDiffs: boolean, + canChangeForm?: boolean, + ...forms: PokemonForm[] ) { - super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, genderDiffs, false); + super( + type1, + type2, + height, + weight, + ability1, + ability2, + abilityHidden, + baseTotal, + baseHp, + baseAtk, + baseDef, + baseSpatk, + baseSpdef, + baseSpd, + catchRate, + baseFriendship, + baseExp, + genderDiffs, + false, + ); this.speciesId = id; this.formIndex = 0; this.generation = generation; @@ -712,7 +817,9 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } if (key) { - return i18next.t(`battlePokemonForm:${key}`, { pokemonName: this.name }); + return i18next.t(`battlePokemonForm:${key}`, { + pokemonName: this.name, + }); } } return this.name; @@ -725,29 +832,47 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali getExpandedSpeciesName(): string { if (this.speciesId < 2000) { return this.name; // Other special cases could be put here too - } else { // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES - return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); } + // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES + return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); } /** - * Find the form name for species with just one form (regional variants, Floette, Ursaluna) - * @param formIndex The form index to check (defaults to 0) - * @param append Whether to append the species name to the end (defaults to false) - * @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc) - */ - getFormNameToDisplay(formIndex: number = 0, append: boolean = false): string { + * Find the form name for species with just one form (regional variants, Floette, Ursaluna) + * @param formIndex The form index to check (defaults to 0) + * @param append Whether to append the species name to the end (defaults to false) + * @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 = Utils.capitalizeString(formKey, "-", false, false) || ""; const speciesName = Utils.capitalizeString(Species[this.speciesId], "_", true, false); - let ret: string = ""; + let ret = ""; const region = this.getRegion(); if (this.speciesId === Species.ARCEUS) { ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); - } else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) { - return append ? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) : i18next.t(`pokemonForm:battleForm.${formKey}`); - } else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here + } else if ( + [ + SpeciesFormKey.MEGA, + SpeciesFormKey.MEGA_X, + SpeciesFormKey.MEGA_Y, + SpeciesFormKey.PRIMAL, + SpeciesFormKey.GIGANTAMAX, + SpeciesFormKey.GIGANTAMAX_RAPID, + SpeciesFormKey.GIGANTAMAX_SINGLE, + SpeciesFormKey.ETERNAMAX, + ].includes(formKey as SpeciesFormKey) + ) { + return append + ? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) + : i18next.t(`pokemonForm:battleForm.${formKey}`); + } else if ( + region === Region.NORMAL || + (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || + this.speciesId === Species.PALDEA_TAUROS + ) { + // More special cases can be added here const i18key = `pokemonForm:${speciesName}${formText}`; if (i18next.exists(i18key)) { ret = i18next.t(i18key); @@ -756,16 +881,25 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; } - } else if (append) { // Everything beyond this has an expanded name + } else if (append) { + // Everything beyond this has an expanded name return this.getExpandedSpeciesName(); - } else if (this.speciesId === Species.ETERNAL_FLOETTE) { // Not a real form, so the key is made up + } else if (this.speciesId === Species.ETERNAL_FLOETTE) { + // Not a real form, so the key is made up return i18next.t("pokemonForm:floetteEternalFlower"); - } else if (this.speciesId === Species.BLOODMOON_URSALUNA) { // Not a real form, so the key is made up + } else if (this.speciesId === Species.BLOODMOON_URSALUNA) { + // Not a real form, so the key is made up return i18next.t("pokemonForm:ursalunaBloodmoon"); - } else { // Only regional forms should be left at this point + } else { + // Only regional forms should be left at this point return i18next.t(`pokemonForm:regionalForm.${Region[region]}`); } - return append ? i18next.t("pokemonForm:appendForm.GENERIC", { pokemonName: this.name, formName: ret }) : ret; + return append + ? i18next.t("pokemonForm:appendForm.GENERIC", { + pokemonName: this.name, + formName: ret, + }) + : ret; } localize(): void { @@ -773,10 +907,20 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } getWildSpeciesForLevel(level: number, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): Species { - return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); + return this.getSpeciesForLevel( + level, + allowEvolving, + false, + (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0), + ); } - getTrainerSpeciesForLevel(level: number, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + getTrainerSpeciesForLevel( + level: number, + allowEvolving = false, + strength: PartyMemberStrength, + currentWave = 0, + ): Species { return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } @@ -815,7 +959,13 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - getSpeciesForLevel(level: number, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { + getSpeciesForLevel( + level: number, + allowEvolving = false, + forTrainer = false, + strength: PartyMemberStrength = PartyMemberStrength.WEAKER, + currentWave = 0, + ): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -827,10 +977,13 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - if ( // If evolutions shouldn't happen, add more cases here :) - !allowEvolving - || !pokemonEvolutions.hasOwnProperty(this.speciesId) - || globalScene.currentBattle?.waveIndex === 20 && globalScene.gameMode.isClassic && globalScene.currentBattle.trainer + if ( + // If evolutions shouldn't happen, add more cases here :) + !allowEvolving || + !pokemonEvolutions.hasOwnProperty(this.speciesId) || + (globalScene.currentBattle?.waveIndex === 20 && + globalScene.gameMode.isClassic && + globalScene.currentBattle.trainer) ) { return this.speciesId; } @@ -864,20 +1017,32 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const maxLevelDiff = this.getStrengthLevelDiff(strength); //The maximum distance from the evolution level tolerated for the mon to not evolve const minChance: number = 0.875 - 0.125 * strength; - evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1); + evolutionChance = Math.min( + minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), + 1, + ); } } else { - const preferredMinLevel = Math.max((ev.level - 1) + (ev.wildDelay!) * this.getStrengthLevelDiff(strength), 1); // TODO: is the bang correct? + const preferredMinLevel = Math.max(ev.level - 1 + ev.wildDelay! * this.getStrengthLevelDiff(strength), 1); // TODO: is the bang correct? let evolutionLevel = Math.max(ev.level > 1 ? ev.level : Math.floor(preferredMinLevel / 2), 1); if (ev.level <= 1 && pokemonPrevolutions.hasOwnProperty(this.speciesId)) { - const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find(ev => ev.speciesId === this.speciesId)!.level; // TODO: is the bang correct? + const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find( + ev => ev.speciesId === this.speciesId, + )!.level; // TODO: is the bang correct? if (prevolutionLevel > 1) { evolutionLevel = prevolutionLevel; } } - evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); + evolutionChance = Math.min( + 0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + + 0.35 * + easeOutFunc( + Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5), + ), + 1, + ); } } @@ -890,14 +1055,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (evolutionChance > 0) { if (isRegionalEvolution) { - evolutionChance /= (evolutionSpecies.isRareRegional() ? 16 : 4); + evolutionChance /= evolutionSpecies.isRareRegional() ? 16 : 4; } totalWeight += evolutionChance; evolutionPool.set(totalWeight, ev.speciesId); - if ((1 - evolutionChance) < noEvolutionChance) { + if (1 - evolutionChance < noEvolutionChance) { noEvolutionChance = 1 - evolutionChance; } } @@ -912,7 +1077,13 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { // TODO: this entire function is dumb and should be changed, adding a `!` here for now until then - return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); + return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel( + level, + true, + forTrainer, + strength, + currentWave, + ); } } @@ -928,7 +1099,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const e of pokemonEvolutions[this.speciesId]) { const speciesId = e.speciesId; const level = e.level; - evolutionLevels.push([ speciesId, level ]); + evolutionLevels.push([speciesId, level]); //console.log(Species[speciesId], getPokemonSpecies(speciesId), getPokemonSpecies(speciesId).getEvolutionLevels()); const nextEvolutionLevels = getPokemonSpecies(speciesId).getEvolutionLevels(); for (const npl of nextEvolutionLevels) { @@ -946,10 +1117,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const allEvolvingPokemon = Object.keys(pokemonEvolutions); for (const p of allEvolvingPokemon) { for (const e of pokemonEvolutions[p]) { - if (e.speciesId === this.speciesId && (!this.forms.length || !e.evoFormKey || e.evoFormKey === this.forms[this.formIndex].formKey) && prevolutionLevels.every(pe => pe[0] !== parseInt(p))) { - const speciesId = parseInt(p) as Species; + if ( + e.speciesId === this.speciesId && + (!this.forms.length || !e.evoFormKey || e.evoFormKey === this.forms[this.formIndex].formKey) && + prevolutionLevels.every(pe => pe[0] !== Number.parseInt(p)) + ) { + const speciesId = Number.parseInt(p) as Species; const level = e.level; - prevolutionLevels.push([ speciesId, level ]); + prevolutionLevels.push([speciesId, level]); const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); for (const spl of subPrevolutionLevels) { prevolutionLevels.push(spl); @@ -962,21 +1137,53 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // This could definitely be written better and more accurate to the getSpeciesForLevel logic, but it is only for generating movesets for evolved Pokemon - getSimulatedEvolutionChain(currentLevel: number, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): EvolutionLevel[] { + getSimulatedEvolutionChain( + currentLevel: number, + forTrainer = false, + isBoss = false, + player = false, + ): EvolutionLevel[] { const ret: EvolutionLevel[] = []; if (pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevels = this.getPrevolutionLevels().reverse(); - const levelDiff = player ? 0 : forTrainer || isBoss ? forTrainer && isBoss ? 2.5 : 5 : 10; - ret.push([ prevolutionLevels[0][0], 1 ]); + const levelDiff = player ? 0 : forTrainer || isBoss ? (forTrainer && isBoss ? 2.5 : 5) : 10; + ret.push([prevolutionLevels[0][0], 1]); for (let l = 1; l < prevolutionLevels.length; l++) { - const evolution = pokemonEvolutions[prevolutionLevels[l - 1][0]].find(e => e.speciesId === prevolutionLevels[l][0]); - ret.push([ prevolutionLevels[l][0], Math.min(Math.max((evolution?.level!) + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5) - 1, 2, (evolution?.level!)), currentLevel - 1) ]); // TODO: are those bangs correct? + const evolution = pokemonEvolutions[prevolutionLevels[l - 1][0]].find( + e => e.speciesId === prevolutionLevels[l][0], + ); + ret.push([ + prevolutionLevels[l][0], + Math.min( + Math.max( + evolution?.level! + + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution?.wildDelay!, 0.5) * 5) - + 1, + 2, + evolution?.level!, + ), + currentLevel - 1, + ), + ]); // TODO: are those bangs correct? } const lastPrevolutionLevel = ret[prevolutionLevels.length - 1][1]; - const evolution = pokemonEvolutions[prevolutionLevels[prevolutionLevels.length - 1][0]].find(e => e.speciesId === this.speciesId); - ret.push([ this.speciesId, Math.min(Math.max(lastPrevolutionLevel + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5), lastPrevolutionLevel + 1, (evolution?.level!)), currentLevel) ]); // TODO: are those bangs correct? + const evolution = pokemonEvolutions[prevolutionLevels[prevolutionLevels.length - 1][0]].find( + e => e.speciesId === this.speciesId, + ); + ret.push([ + this.speciesId, + Math.min( + Math.max( + lastPrevolutionLevel + + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution?.wildDelay!, 0.5) * 5), + lastPrevolutionLevel + 1, + evolution?.level!, + ), + currentLevel, + ), + ]); // TODO: are those bangs correct? } else { - ret.push([ this.speciesId, 1 ]); + ret.push([this.speciesId, 1]); } return ret; @@ -990,19 +1197,17 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const mythical = this.mythical; return species => { return ( - subLegendary - || legendary - || mythical - || ( - pokemonEvolutions.hasOwnProperty(species.speciesId) === hasEvolution - && pokemonPrevolutions.hasOwnProperty(species.speciesId) === hasPrevolution - ) - ) - && species.subLegendary === subLegendary - && species.legendary === legendary - && species.mythical === mythical - && (this.isTrainerForbidden() || !species.isTrainerForbidden()) - && species.speciesId !== Species.DITTO; + (subLegendary || + legendary || + mythical || + (pokemonEvolutions.hasOwnProperty(species.speciesId) === hasEvolution && + pokemonPrevolutions.hasOwnProperty(species.speciesId) === hasPrevolution)) && + species.subLegendary === subLegendary && + species.legendary === legendary && + species.mythical === mythical && + (this.isTrainerForbidden() || !species.isTrainerForbidden()) && + species.speciesId !== Species.DITTO + ); }; } @@ -1022,13 +1227,13 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } getFormSpriteKey(formIndex?: number) { - if (this.forms.length && (formIndex !== undefined && formIndex >= this.forms.length)) { - console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); + if (this.forms.length && formIndex !== undefined && formIndex >= this.forms.length) { + console.warn( + `Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`, + ); formIndex = Math.min(formIndex, this.forms.length - 1); } - return this.forms?.length - ? this.forms[formIndex || 0].getFormSpriteKey() - : ""; + return this.forms?.length ? this.forms[formIndex || 0].getFormSpriteKey() : ""; } /** @@ -1037,7 +1242,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali * @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}. */ getFullUnlocksData(): bigint { - let caughtAttr: bigint = 0n; + let caughtAttr = 0n; caughtAttr += DexAttr.NON_SHINY; caughtAttr += DexAttr.SHINY; if (this.malePercent !== null) { @@ -1055,9 +1260,12 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // Summing successive bigints for each obtainable form - caughtAttr += this?.forms?.length > 1 ? - this.forms.map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)).reduce((acc, val) => acc + val, 0n) : - DexAttr.DEFAULT_FORM; + caughtAttr += + this?.forms?.length > 1 + ? this.forms + .map((f, index) => (f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index))) + .reduce((acc, val) => acc + val, 0n) + : DexAttr.DEFAULT_FORM; return caughtAttr; } @@ -1070,15 +1278,66 @@ export class PokemonForm extends PokemonSpeciesForm { public isUnobtainable: boolean; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen - private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; + private starterSelectableKeys: string[] = [ + "10", + "50", + "10-pc", + "50-pc", + "red", + "orange", + "yellow", + "green", + "blue", + "indigo", + "violet", + ]; - constructor(formName: string, formKey: string, type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false, - isUnobtainable: boolean = false + constructor( + formName: string, + formKey: string, + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + genderDiffs = false, + formSpriteKey: string | null = null, + isStarterSelectable = false, + isUnobtainable = false, ) { - super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey)); + super( + type1, + type2, + height, + weight, + ability1, + ability2, + abilityHidden, + baseTotal, + baseHp, + baseAtk, + baseDef, + baseSpatk, + baseSpdef, + baseSpd, + catchRate, + baseFriendship, + baseExp, + genderDiffs, + isStarterSelectable || !formKey, + ); this.formName = formName; this.formKey = formKey; this.formSpriteKey = formSpriteKey; @@ -1091,27 +1350,32 @@ export class PokemonForm extends PokemonSpeciesForm { } /** -* Method to get the daily list of starters with Pokerus. -* @returns A list of starters with Pokerus -*/ + * 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 = parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); - const species = getPokemonSpecies(randomSpeciesId); - if (!pokerusStarters.includes(species)) { - pokerusStarters.push(species); + globalScene.executeWithSeedOffset( + () => { + while (pokerusStarters.length < POKERUS_STARTER_COUNT) { + const randomSpeciesId = Number.parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); + const species = getPokemonSpecies(randomSpeciesId); + if (!pokerusStarters.includes(species)) { + pokerusStarters.push(species); + } } - } - }, 0, date.getTime().toString()); + }, + 0, + date.getTime().toString(), + ); return pokerusStarters; } export const allSpecies: PokemonSpecies[] = []; +// biome-ignore format: manually formatted export function initSpecies() { allSpecies.push( new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2887,23 +3151,3 @@ export function initSpecies() { new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes ); } - -// TODO: Remove -{ - //setTimeout(() => { - /*for (let tc of Object.keys(trainerConfigs)) { - console.log(TrainerType[tc], !trainerConfigs[tc].speciesFilter ? 'all' : [...new Set(allSpecies.filter(s => s.generation <= 9).filter(trainerConfigs[tc].speciesFilter).map(s => { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - return s; - }))].map(s => s.name)); - } - - const speciesFilter = (species: PokemonSpecies) => !species.legendary && !species.pseudoLegendary && !species.mythical && species.baseTotal >= 540; - console.log(!speciesFilter ? 'all' : [...new Set(allSpecies.filter(s => s.generation <= 9).filter(speciesFilter).map(s => { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - return s; - }))].map(s => s.name));*/ - //}, 1000); -} diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 1f00ce0d555..9fd71d9d95b 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -185,26 +185,38 @@ const seasonalSplashMessages: Season[] = [ name: "Halloween", start: "09-15", end: "10-31", - messages: [ "halloween.pumpkabooAbout", "halloween.mayContainSpiders", "halloween.spookyScarySkeledirge", "halloween.gourgeistUsedTrickOrTreat", "halloween.letsSnuggleForever" ], + messages: [ + "halloween.pumpkabooAbout", + "halloween.mayContainSpiders", + "halloween.spookyScarySkeledirge", + "halloween.gourgeistUsedTrickOrTreat", + "halloween.letsSnuggleForever", + ], }, { name: "XMAS", start: "12-01", end: "12-26", - messages: [ "xmas.happyHolidays", "xmas.unaffilicatedWithDelibirdServices", "xmas.delibirdSeason", "xmas.diamondsFromTheSky", "xmas.holidayStylePikachuNotIncluded" ], + messages: [ + "xmas.happyHolidays", + "xmas.unaffilicatedWithDelibirdServices", + "xmas.delibirdSeason", + "xmas.diamondsFromTheSky", + "xmas.holidayStylePikachuNotIncluded", + ], }, { name: "New Year's", start: "01-01", end: "01-31", - messages: [ "newYears.happyNewYear" ], + messages: ["newYears.happyNewYear"], }, ]; //#endregion export function getSplashMessages(): string[] { - const splashMessages: string[] = [ ...commonSplashMessages ]; + const splashMessages: string[] = [...commonSplashMessages]; console.log("use seasonal splash messages", USE_SEASONAL_SPLASH_MESSAGES); if (USE_SEASONAL_SPLASH_MESSAGES) { // add seasonal splash messages if the season is active @@ -215,13 +227,13 @@ export function getSplashMessages(): string[] { if (now >= startDate && now <= endDate) { console.log(`Adding ${messages.length} ${name} splash messages (weight: x${SEASONAL_WEIGHT_MULTIPLIER})`); - messages.forEach((message) => { + for (const message of messages) { const weightedMessage = Array(SEASONAL_WEIGHT_MULTIPLIER).fill(message); splashMessages.push(...weightedMessage); - }); + } } } } - return splashMessages.map((message) => `splashMessages:${message}`); + return splashMessages.map(message => `splashMessages:${message}`); } diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 35a956cbb93..fe4fa380d46 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -6,10 +6,10 @@ import i18next from "i18next"; export class Status { public effect: StatusEffect; /** Toxic damage is `1/16 max HP * toxicTurnCount` */ - public toxicTurnCount: number = 0; + public toxicTurnCount = 0; public sleepTurnsRemaining?: number; - constructor(effect: StatusEffect, toxicTurnCount: number = 0, sleepTurnsRemaining?: number) { + constructor(effect: StatusEffect, toxicTurnCount = 0, sleepTurnsRemaining?: number) { this.effect = effect; this.toxicTurnCount = toxicTurnCount; this.sleepTurnsRemaining = sleepTurnsRemaining; @@ -23,7 +23,9 @@ export class Status { } isPostTurn(): boolean { - return this.effect === StatusEffect.POISON || this.effect === StatusEffect.TOXIC || this.effect === StatusEffect.BURN; + return ( + this.effect === StatusEffect.POISON || this.effect === StatusEffect.TOXIC || this.effect === StatusEffect.BURN + ); } } @@ -46,17 +48,24 @@ function getStatusEffectMessageKey(statusEffect: StatusEffect | undefined): stri } } -export function getStatusEffectObtainText(statusEffect: StatusEffect | undefined, pokemonNameWithAffix: string, sourceText?: string): string { +export function getStatusEffectObtainText( + statusEffect: StatusEffect | undefined, + pokemonNameWithAffix: string, + sourceText?: string, +): string { if (statusEffect === StatusEffect.NONE) { return ""; } if (!sourceText) { - const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain` as ParseKeys; return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } - const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys; - return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText }); + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource` as ParseKeys; + return i18next.t(i18nKey, { + pokemonNameWithAffix: pokemonNameWithAffix, + sourceText: sourceText, + }); } export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { @@ -107,17 +116,17 @@ export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): } /** -* Returns a random non-volatile StatusEffect -*/ + * Returns a random non-volatile StatusEffect + */ export function generateRandomStatusEffect(): StatusEffect { return randIntRange(1, 6); } /** -* Returns a random non-volatile StatusEffect between the two provided -* @param statusEffectA The first StatusEffect -* @param statusEffectA The second StatusEffect -*/ + * Returns a random non-volatile StatusEffect between the two provided + * @param statusEffectA The first StatusEffect + * @param statusEffectA The second StatusEffect + */ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB: StatusEffect): StatusEffect { if (statusEffectA === StatusEffect.NONE || statusEffectA === StatusEffect.FAINT) { return statusEffectB; @@ -130,10 +139,10 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB } /** -* Returns a random non-volatile StatusEffect between the two provided -* @param statusA The first Status -* @param statusB The second Status -*/ + * Returns a random non-volatile StatusEffect between the two provided + * @param statusA The first Status + * @param statusB The second Status + */ export function getRandomStatus(statusA: Status | null, statusB: Status | null): Status | null { if (!statusA || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { return statusB; @@ -142,7 +151,6 @@ export function getRandomStatus(statusA: Status | null, statusB: Status | null): return statusA; } - return randIntRange(0, 2) ? statusA : statusB; } @@ -150,14 +158,14 @@ export function getRandomStatus(statusA: Status | null, statusB: Status | null): * Gets all non volatile status effects * @returns A list containing all non volatile status effects */ -export function getNonVolatileStatusEffects():Array { +export function getNonVolatileStatusEffects(): Array { return [ StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.PARALYSIS, StatusEffect.SLEEP, StatusEffect.FREEZE, - StatusEffect.BURN + StatusEffect.BURN, ]; } diff --git a/src/data/terrain.ts b/src/data/terrain.ts index c727ef724c9..894fb8a7955 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -10,7 +10,7 @@ export enum TerrainType { MISTY, ELECTRIC, GRASSY, - PSYCHIC + PSYCHIC, } export class Terrain { @@ -57,7 +57,10 @@ export class Terrain { case TerrainType.PSYCHIC: if (!move.hasAttr(ProtectAttr)) { // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain - return move.getPriority(user) > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); + return ( + move.getPriority(user) > 0 && + user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()) + ); } } @@ -80,18 +83,17 @@ export function getTerrainName(terrainType: TerrainType): string { return ""; } - -export function getTerrainColor(terrainType: TerrainType): [ number, number, number ] { +export function getTerrainColor(terrainType: TerrainType): [number, number, number] { switch (terrainType) { case TerrainType.MISTY: - return [ 232, 136, 200 ]; + return [232, 136, 200]; case TerrainType.ELECTRIC: - return [ 248, 248, 120 ]; + return [248, 248, 120]; case TerrainType.GRASSY: - return [ 120, 200, 80 ]; + return [120, 200, 80]; case TerrainType.PSYCHIC: - return [ 160, 64, 160 ]; + return [160, 64, 160]; } - return [ 0, 0, 0 ]; + return [0, 0, 0]; } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 2b912bda603..693338c145e 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -30,21 +30,21 @@ const ELITE_FOUR_MINIMUM_BST = 460; const GYM_LEADER_TERA_WAVE = 100; export enum TrainerPoolTier { - COMMON, - UNCOMMON, - RARE, - SUPER_RARE, - ULTRA_RARE + COMMON, + UNCOMMON, + RARE, + SUPER_RARE, + ULTRA_RARE, } export interface TrainerTierPools { - [key: number]: Species[] + [key: number]: Species[]; } export enum TrainerSlot { - NONE, - TRAINER, - TRAINER_PARTNER + NONE, + TRAINER, + TRAINER_PARTNER, } export class TrainerPartyTemplate { @@ -60,15 +60,15 @@ export class TrainerPartyTemplate { this.balanced = !!balanced; } - getStrength(index: number): PartyMemberStrength { + getStrength(_index: number): PartyMemberStrength { return this.strength; } - isSameSpecies(index: number): boolean { + isSameSpecies(_index: number): boolean { return this.sameSpecies; } - isBalanced(index: number): boolean { + isBalanced(_index: number): boolean { return this.balanced; } } @@ -77,10 +77,13 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { public templates: TrainerPartyTemplate[]; constructor(...templates: TrainerPartyTemplate[]) { - super(templates.reduce((total: number, template: TrainerPartyTemplate) => { - total += template.size; - return total; - }, 0), PartyMemberStrength.AVERAGE); + super( + templates.reduce((total: number, template: TrainerPartyTemplate) => { + total += template.size; + return total; + }, 0), + PartyMemberStrength.AVERAGE, + ); this.templates = templates; } @@ -122,22 +125,52 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { } export const trainerPartyTemplates = { - ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)), - TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + ), + TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)), + TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + ), TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), @@ -157,22 +190,75 @@ export const trainerPartyTemplates = { SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), - GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + GYM_LEADER_1: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + GYM_LEADER_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), - ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + ELITE_FOUR: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), - CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.STRONG), new TrainerPartyTemplate(2, PartyMemberStrength.STRONGER, false, true)), + CHAMPION: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONGER, false, true), + ), - RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + RIVAL: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + RIVAL_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + RIVAL_6: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), }; type PartyTemplateFunc = () => TrainerPartyTemplate; @@ -181,13 +267,13 @@ type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; type GenAIFunc = (party: EnemyPokemon[]) => void; export interface PartyMemberFuncs { - [key: number]: PartyMemberFunc + [key: number]: PartyMemberFunc; } export enum TeraAIMode { NO_TERA, INSTANT_TERA, - SMART_TERA + SMART_TERA, } /** @@ -231,14 +317,14 @@ export class TrainerConfig { public nameDouble: string; public title: string; public titleDouble: string; - public hasGenders: boolean = false; - public hasDouble: boolean = false; - public hasCharSprite: boolean = false; - public doubleOnly: boolean = false; - public moneyMultiplier: number = 1; - public isBoss: boolean = false; - public hasStaticParty: boolean = false; - public useSameSeedForAllMembers: boolean = false; + public hasGenders = false; + public hasDouble = false; + public hasCharSprite = false; + public doubleOnly = false; + public moneyMultiplier = 1; + public isBoss = false; + public hasStaticParty = false; + public useSameSeedForAllMembers = false; public mixedBattleBgm: string; public battleBgm: string; public encounterBgm: string; @@ -255,7 +341,7 @@ export class TrainerConfig { public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; public specialtyType: PokemonType; - public hasVoucher: boolean = false; + public hasVoucher = false; public trainerAI: TrainerAI; public encounterMessages: string[] = []; @@ -277,15 +363,17 @@ export class TrainerConfig { this.battleBgm = "battle_trainer"; this.mixedBattleBgm = "battle_trainer"; this.victoryBgm = "victory_trainer"; - this.partyTemplates = [ trainerPartyTemplates.TWO_AVG ]; - this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden(); + this.partyTemplates = [trainerPartyTemplates.TWO_AVG]; + this.speciesFilter = species => + (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && + !species.isTrainerForbidden(); } getKey(): string { return TrainerType[this.getDerivedType()].toString().toLowerCase(); } - getSpriteKey(female?: boolean, isDouble: boolean = false): string { + getSpriteKey(female?: boolean, isDouble = false): string { let ret = this.getKey(); if (this.hasGenders) { ret += `_${female ? "f" : "m"}`; @@ -336,16 +424,14 @@ export class TrainerConfig { // Get the title from the i18n file this.title = i18next.t(`titles:${title}`); - return this; } - /** - * Returns the derived trainer type for a given trainer type. - * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.) - * @returns {TrainerType} - The derived trainer type. - */ + * Returns the derived trainer type for a given trainer type. + * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.) + * @returns {TrainerType} - The derived trainer type. + */ getDerivedType(trainerTypeToDeriveFrom: TrainerType | null = null): TrainerType { let trainerType = trainerTypeToDeriveFrom ? trainerTypeToDeriveFrom : this.trainerType; switch (trainerType) { @@ -414,11 +500,11 @@ export class TrainerConfig { } /** - * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). - * @param {string} [nameFemale] The name of the female trainer. If 'Ivy', a localized name will be assigned. - * @param {TrainerType | string} [femaleEncounterBgm] The encounter BGM for the female trainer, which can be a TrainerType or a string. - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). + * @param {string} [nameFemale] The name of the female trainer. If 'Ivy', a localized name will be assigned. + * @param {TrainerType | string} [femaleEncounterBgm] The encounter BGM for the female trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { // If the female name is 'Ivy' (the rival), assign a localized name. if (nameFemale === "Ivy") { @@ -441,9 +527,10 @@ export class TrainerConfig { if (femaleEncounterBgm) { // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase. // Otherwise, assign the provided string as the BGM. - this.femaleEncounterBgm = typeof femaleEncounterBgm === "number" - ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() - : femaleEncounterBgm; + this.femaleEncounterBgm = + typeof femaleEncounterBgm === "number" + ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() + : femaleEncounterBgm; } // Return the updated TrainerConfig instance. @@ -451,25 +538,28 @@ export class TrainerConfig { } /** - * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM. - * @param nameDouble The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles). - * @param doubleEncounterBgm The encounter BGM for the double trainer, which can be a TrainerType or a string. - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM. + * @param nameDouble The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles). + * @param doubleEncounterBgm The encounter BGM for the double trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig { this.hasDouble = true; this.nameDouble = nameDouble; if (doubleEncounterBgm) { - this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() : doubleEncounterBgm; + this.doubleEncounterBgm = + typeof doubleEncounterBgm === "number" + ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() + : doubleEncounterBgm; } return this; } /** - * Sets the trainer type for double battles. - * @param trainerTypeDouble The TrainerType of the partner in a double battle. - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the trainer type for double battles. + * @param trainerTypeDouble The TrainerType of the partner in a double battle. + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig { this.trainerTypeDouble = trainerTypeDouble; this.setDoubleMessages(this.nameDouble); @@ -477,9 +567,9 @@ export class TrainerConfig { } /** - * Sets the encounter and victory messages for double trainers. - * @param nameDouble - The name of the pair (e.g. "red_blue_double"). - */ + * Sets the encounter and victory messages for double trainers. + * @param nameDouble - The name of the pair (e.g. "red_blue_double"). + */ setDoubleMessages(nameDouble: string) { // Check if there is double battle dialogue for this trainer if (doubleBattleDialogue[nameDouble]) { @@ -491,10 +581,10 @@ export class TrainerConfig { } /** - * Sets the title for double trainers - * @param titleDouble The key for the title in the i18n file. (e.g., "champion_double"). - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the title for double trainers + * @param titleDouble The key for the title in the i18n file. (e.g., "champion_double"). + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setDoubleTitle(titleDouble: string): TrainerConfig { // First check if i18n is initialized if (!getIsInitialized()) { @@ -551,7 +641,8 @@ export class TrainerConfig { } setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig { - this.encounterBgm = typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; + this.encounterBgm = + typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; return this; } @@ -576,7 +667,9 @@ export class TrainerConfig { } setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig { - this.speciesPools = (Array.isArray(speciesPools) ? { [TrainerPoolTier.COMMON]: speciesPools } : speciesPools) as unknown as TrainerTierPools; + this.speciesPools = (Array.isArray(speciesPools) + ? { [TrainerPoolTier.COMMON]: speciesPools } + : speciesPools) as unknown as TrainerTierPools; return this; } @@ -605,11 +698,14 @@ export class TrainerConfig { setRandomTeraModifiers(count: () => number, slot?: number): TrainerConfig { this.genAIFuncs.push((party: EnemyPokemon[]) => { const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === PokemonType.BUG; // Better to check one time than 6 - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) + const partyMemberIndexes = new Array(party.length) + .fill(null) + .map((_, i) => i) .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length) : -1; // If we have a tera slot defined, wrap it to party size. for (let t = 0; t < Math.min(count(), party.length); t++) { - const randomIndex = partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); + const randomIndex = + partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); if (this.hasSpecialtyType()) { party[randomIndex].teraType = this.specialtyType; @@ -651,7 +747,6 @@ export class TrainerConfig { return this; } - setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); @@ -663,116 +758,421 @@ export class TrainerConfig { } /** - * Returns the pool of species for an evil team admin - * @param team - The evil team the admin belongs to. - * @returns {TrainerTierPools} - */ + * Returns the pool of species for an evil team admin + * @param team - The evil team the admin belongs to. + * @returns {TrainerTierPools} + */ speciesPoolPerEvilTeamAdmin(team): TrainerTierPools { team = team.toLowerCase(); switch (team) { case "rocket": { return { - [TrainerPoolTier.COMMON]: [ Species.RATICATE, Species.ARBOK, Species.VILEPLUME, Species.ARCANINE, Species.GENGAR, Species.HYPNO, Species.ELECTRODE, Species.EXEGGUTOR, Species.CUBONE, Species.KOFFING, Species.GYARADOS, Species.CROBAT, Species.STEELIX, Species.HOUNDOOM, Species.HONCHKROW ], - [TrainerPoolTier.UNCOMMON]: [ Species.OMASTAR, Species.KABUTOPS, Species.MAGNEZONE, Species.ELECTIVIRE, Species.MAGMORTAR, Species.PORYGON_Z, Species.ANNIHILAPE, Species.ALOLA_SANDSLASH, Species.ALOLA_PERSIAN, Species.ALOLA_GOLEM, Species.ALOLA_MUK, Species.PALDEA_TAUROS ], - [TrainerPoolTier.RARE]: [ Species.DRAGONITE, Species.TYRANITAR ] + [TrainerPoolTier.COMMON]: [ + Species.RATICATE, + Species.ARBOK, + Species.VILEPLUME, + Species.ARCANINE, + Species.GENGAR, + Species.HYPNO, + Species.ELECTRODE, + Species.EXEGGUTOR, + Species.CUBONE, + Species.KOFFING, + Species.GYARADOS, + Species.CROBAT, + Species.STEELIX, + Species.HOUNDOOM, + Species.HONCHKROW, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.OMASTAR, + Species.KABUTOPS, + Species.MAGNEZONE, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.PORYGON_Z, + Species.ANNIHILAPE, + Species.ALOLA_SANDSLASH, + Species.ALOLA_PERSIAN, + Species.ALOLA_GOLEM, + Species.ALOLA_MUK, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.RARE]: [Species.DRAGONITE, Species.TYRANITAR], }; } case "magma": { return { - [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.MAGCARGO, Species.HOUNDOOM, Species.TORKOAL, Species.SOLROCK, Species.CLAYDOL, Species.HIPPOWDON, Species.MAGMORTAR, Species.GLISCOR, Species.COALOSSAL ], - [TrainerPoolTier.UNCOMMON]: [ Species.AGGRON, Species.FLYGON, Species.CRADILY, Species.ARMALDO, Species.RHYPERIOR, Species.TURTONATOR, Species.SANDACONDA, Species.TOEDSCRUEL, Species.HISUI_ARCANINE ], - [TrainerPoolTier.RARE]: [ Species.CHARCADET, Species.SCOVILLAIN ] + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.MAGCARGO, + Species.HOUNDOOM, + Species.TORKOAL, + Species.SOLROCK, + Species.CLAYDOL, + Species.HIPPOWDON, + Species.MAGMORTAR, + Species.GLISCOR, + Species.COALOSSAL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.AGGRON, + Species.FLYGON, + Species.CRADILY, + Species.ARMALDO, + Species.RHYPERIOR, + Species.TURTONATOR, + Species.SANDACONDA, + Species.TOEDSCRUEL, + Species.HISUI_ARCANINE, + ], + [TrainerPoolTier.RARE]: [Species.CHARCADET, Species.SCOVILLAIN], }; } case "aqua": { return { - [TrainerPoolTier.COMMON]: [ Species.TENTACRUEL, Species.LANTURN, Species.AZUMARILL, Species.QUAGSIRE, Species.OCTILLERY, Species.LUDICOLO, Species.PELIPPER, Species.WAILORD, Species.WHISCASH, Species.CRAWDAUNT, Species.WALREIN, Species.CLAMPERL ], - [TrainerPoolTier.UNCOMMON]: [ Species.QUAGSIRE, Species.MANTINE, Species.KINGDRA, Species.MILOTIC, Species.DRAGALGE, Species.DHELMISE, Species.BARRASKEWDA, Species.GRAPPLOCT, Species.OVERQWIL ], - [TrainerPoolTier.RARE]: [ Species.BASCULEGION, Species.DONDOZO ] + [TrainerPoolTier.COMMON]: [ + Species.TENTACRUEL, + Species.LANTURN, + Species.AZUMARILL, + Species.QUAGSIRE, + Species.OCTILLERY, + Species.LUDICOLO, + Species.PELIPPER, + Species.WAILORD, + Species.WHISCASH, + Species.CRAWDAUNT, + Species.WALREIN, + Species.CLAMPERL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.QUAGSIRE, + Species.MANTINE, + Species.KINGDRA, + Species.MILOTIC, + Species.DRAGALGE, + Species.DHELMISE, + Species.BARRASKEWDA, + Species.GRAPPLOCT, + Species.OVERQWIL, + ], + [TrainerPoolTier.RARE]: [Species.BASCULEGION, Species.DONDOZO], }; } case "galactic": { return { - [TrainerPoolTier.COMMON]: [ Species.ELECTRODE, Species.GYARADOS, Species.CROBAT, Species.HONCHKROW, Species.BRONZONG, Species.DRAPION, Species.LICKILICKY, Species.TANGROWTH, Species.ELECTIVIRE, Species.MAGMORTAR, Species.YANMEGA, Species.MAMOSWINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.ALAKAZAM, Species.WEAVILE, Species.GLISCOR, Species.DUSKNOIR, Species.ROTOM, Species.OVERQWIL, Species.HISUI_ARCANINE, Species.HISUI_ELECTRODE ], - [TrainerPoolTier.RARE]: [ Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ + Species.ELECTRODE, + Species.GYARADOS, + Species.CROBAT, + Species.HONCHKROW, + Species.BRONZONG, + Species.DRAPION, + Species.LICKILICKY, + Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.YANMEGA, + Species.MAMOSWINE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ALAKAZAM, + Species.WEAVILE, + Species.GLISCOR, + Species.DUSKNOIR, + Species.ROTOM, + Species.OVERQWIL, + Species.HISUI_ARCANINE, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT], }; } case "plasma": { return { - [TrainerPoolTier.COMMON]: [ Species.GIGALITH, Species.CONKELDURR, Species.SEISMITOAD, Species.KROOKODILE, Species.DARMANITAN, Species.COFAGRIGUS, Species.VANILLUXE, Species.AMOONGUSS, Species.JELLICENT, Species.GALVANTULA, Species.FERROTHORN, Species.BEARTIC ], - [TrainerPoolTier.UNCOMMON]: [ Species.EXCADRILL, Species.SIGILYPH, Species.ZOROARK, Species.KLINKLANG, Species.EELEKTROSS, Species.MIENSHAO, Species.GOLURK, Species.BISHARP, Species.MANDIBUZZ, Species.DURANT, Species.GALAR_DARMANITAN ], - [TrainerPoolTier.RARE]: [ Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ + Species.GIGALITH, + Species.CONKELDURR, + Species.SEISMITOAD, + Species.KROOKODILE, + Species.DARMANITAN, + Species.COFAGRIGUS, + Species.VANILLUXE, + Species.AMOONGUSS, + Species.JELLICENT, + Species.GALVANTULA, + Species.FERROTHORN, + Species.BEARTIC, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.EXCADRILL, + Species.SIGILYPH, + Species.ZOROARK, + Species.KLINKLANG, + Species.EELEKTROSS, + Species.MIENSHAO, + Species.GOLURK, + Species.BISHARP, + Species.MANDIBUZZ, + Species.DURANT, + Species.GALAR_DARMANITAN, + ], + [TrainerPoolTier.RARE]: [Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY], }; } case "plasma_2": { return { - [TrainerPoolTier.COMMON]: [ Species.MUK, Species.ELECTRODE, Species.BRONZONG, Species.MAGNEZONE, Species.PORYGON_Z, Species.MUSHARNA, Species.REUNICLUS, Species.GALVANTULA, Species.FERROTHORN, Species.EELEKTROSS, Species.BEHEEYEM ], - [TrainerPoolTier.UNCOMMON]: [ Species.METAGROSS, Species.ROTOM, Species.CARRACOSTA, Species.ARCHEOPS, Species.GOLURK, Species.DURANT, Species.VIKAVOLT, Species.ORBEETLE, Species.REVAVROOM, Species.ALOLA_MUK, Species.HISUI_ELECTRODE ], - [TrainerPoolTier.RARE]: [ Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON ] + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.ELECTRODE, + Species.BRONZONG, + Species.MAGNEZONE, + Species.PORYGON_Z, + Species.MUSHARNA, + Species.REUNICLUS, + Species.GALVANTULA, + Species.FERROTHORN, + Species.EELEKTROSS, + Species.BEHEEYEM, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.METAGROSS, + Species.ROTOM, + Species.CARRACOSTA, + Species.ARCHEOPS, + Species.GOLURK, + Species.DURANT, + Species.VIKAVOLT, + Species.ORBEETLE, + Species.REVAVROOM, + Species.ALOLA_MUK, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON], }; } case "flare": { return { - [TrainerPoolTier.COMMON]: [ Species.MANECTRIC, Species.DRAPION, Species.LIEPARD, Species.AMOONGUSS, Species.DIGGERSBY, Species.TALONFLAME, Species.PYROAR, Species.PANGORO, Species.MEOWSTIC, Species.MALAMAR, Species.CLAWITZER, Species.HELIOLISK ], - [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOOM, Species.WEAVILE, Species.CHANDELURE, Species.AEGISLASH, Species.BARBARACLE, Species.DRAGALGE, Species.GOODRA, Species.TREVENANT, Species.GOURGEIST ], - [TrainerPoolTier.RARE]: [ Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG ] + [TrainerPoolTier.COMMON]: [ + Species.MANECTRIC, + Species.DRAPION, + Species.LIEPARD, + Species.AMOONGUSS, + Species.DIGGERSBY, + Species.TALONFLAME, + Species.PYROAR, + Species.PANGORO, + Species.MEOWSTIC, + Species.MALAMAR, + Species.CLAWITZER, + Species.HELIOLISK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.HOUNDOOM, + Species.WEAVILE, + Species.CHANDELURE, + Species.AEGISLASH, + Species.BARBARACLE, + Species.DRAGALGE, + Species.GOODRA, + Species.TREVENANT, + Species.GOURGEIST, + ], + [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG], }; } case "aether": { return { - [TrainerPoolTier.COMMON]: [ Species.ALAKAZAM, Species.SLOWBRO, Species.EXEGGUTOR, Species.XATU, Species.CLAYDOL, Species.BEHEEYEM, Species.ORANGURU, Species.BRUXISH, Species.ORBEETLE, Species.FARIGIRAF, Species.ALOLA_RAICHU ], - [TrainerPoolTier.UNCOMMON]: [ Species.KIRLIA, Species.MEDICHAM, Species.METAGROSS, Species.MALAMAR, Species.HATTERENE, Species.MR_RIME, Species.GALAR_SLOWKING ], - [TrainerPoolTier.RARE]: [ Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ + Species.ALAKAZAM, + Species.SLOWBRO, + Species.EXEGGUTOR, + Species.XATU, + Species.CLAYDOL, + Species.BEHEEYEM, + Species.ORANGURU, + Species.BRUXISH, + Species.ORBEETLE, + Species.FARIGIRAF, + Species.ALOLA_RAICHU, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.KIRLIA, + Species.MEDICHAM, + Species.METAGROSS, + Species.MALAMAR, + Species.HATTERENE, + Species.MR_RIME, + Species.GALAR_SLOWKING, + ], + [TrainerPoolTier.RARE]: [Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY], }; } case "skull": { return { - [TrainerPoolTier.COMMON]: [ Species.NIDOQUEEN, Species.GENGAR, Species.KOFFING, Species.CROBAT, Species.ROSERADE, Species.SKUNTANK, Species.TOXICROAK, Species.SCOLIPEDE, Species.TOXAPEX, Species.LURANTIS, Species.ALOLA_MUK ], - [TrainerPoolTier.UNCOMMON]: [ Species.DRAPION, Species.MANDIBUZZ, Species.OVERQWIL, Species.GLIMMORA, Species.CLODSIRE, Species.GALAR_SLOWBRO ], - [TrainerPoolTier.RARE]: [ Species.DRAGALGE, Species.SNEASLER ] + [TrainerPoolTier.COMMON]: [ + Species.NIDOQUEEN, + Species.GENGAR, + Species.KOFFING, + Species.CROBAT, + Species.ROSERADE, + Species.SKUNTANK, + Species.TOXICROAK, + Species.SCOLIPEDE, + Species.TOXAPEX, + Species.LURANTIS, + Species.ALOLA_MUK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.DRAPION, + Species.MANDIBUZZ, + Species.OVERQWIL, + Species.GLIMMORA, + Species.CLODSIRE, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.SNEASLER], }; } case "macro": { return { - [TrainerPoolTier.COMMON]: [ Species.NINETALES, Species.BELLOSSOM, Species.MILOTIC, Species.FROSLASS, Species.GOTHITELLE, Species.JELLICENT, Species.SALAZZLE, Species.TSAREENA, Species.POLTEAGEIST, Species.HATTERENE, Species.GALAR_RAPIDASH ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.MANDIBUZZ, Species.TOXAPEX, Species.APPLETUN, Species.CURSOLA, Species.ALOLA_NINETALES ], - [TrainerPoolTier.RARE]: [ Species.TINKATON, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ + Species.NINETALES, + Species.BELLOSSOM, + Species.MILOTIC, + Species.FROSLASS, + Species.GOTHITELLE, + Species.JELLICENT, + Species.SALAZZLE, + Species.TSAREENA, + Species.POLTEAGEIST, + Species.HATTERENE, + Species.GALAR_RAPIDASH, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.MANDIBUZZ, + Species.TOXAPEX, + Species.APPLETUN, + Species.CURSOLA, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.TINKATON, Species.HISUI_LILLIGANT], }; } case "star_1": { return { - [TrainerPoolTier.COMMON]: [ Species.SHIFTRY, Species.CACTURNE, Species.HONCHKROW, Species.SKUNTANK, Species.KROOKODILE, Species.OBSTAGOON, Species.LOKIX, Species.MABOSSTIFF ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.CRAWDAUNT, Species.WEAVILE, Species.ZOROARK, Species.MALAMAR, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.HYDREIGON, Species.MEOWSCARADA ] + [TrainerPoolTier.COMMON]: [ + Species.SHIFTRY, + Species.CACTURNE, + Species.HONCHKROW, + Species.SKUNTANK, + Species.KROOKODILE, + Species.OBSTAGOON, + Species.LOKIX, + Species.MABOSSTIFF, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.UMBREON, + Species.CRAWDAUNT, + Species.WEAVILE, + Species.ZOROARK, + Species.MALAMAR, + Species.BOMBIRDIER, + ], + [TrainerPoolTier.RARE]: [Species.HYDREIGON, Species.MEOWSCARADA], }; } case "star_2": { return { - [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.HOUNDOOM, Species.CAMERUPT, Species.CHANDELURE, Species.TALONFLAME, Species.PYROAR, Species.COALOSSAL, Species.SCOVILLAIN ], - [TrainerPoolTier.UNCOMMON]: [ Species.RAPIDASH, Species.FLAREON, Species.TORKOAL, Species.MAGMORTAR, Species.SALAZZLE, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.VOLCARONA, Species.SKELEDIRGE ] + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.HOUNDOOM, + Species.CAMERUPT, + Species.CHANDELURE, + Species.TALONFLAME, + Species.PYROAR, + Species.COALOSSAL, + Species.SCOVILLAIN, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.RAPIDASH, + Species.FLAREON, + Species.TORKOAL, + Species.MAGMORTAR, + Species.SALAZZLE, + Species.TURTONATOR, + ], + [TrainerPoolTier.RARE]: [Species.VOLCARONA, Species.SKELEDIRGE], }; } case "star_3": { return { - [TrainerPoolTier.COMMON]: [ Species.MUK, Species.CROBAT, Species.SKUNTANK, Species.AMOONGUSS, Species.TOXAPEX, Species.TOXTRICITY, Species.GRAFAIAI, Species.CLODSIRE ], - [TrainerPoolTier.UNCOMMON]: [ Species.GENGAR, Species.SEVIPER, Species.DRAGALGE, Species.OVERQWIL, Species.ALOLA_MUK, Species.GALAR_SLOWBRO ], - [TrainerPoolTier.RARE]: [ Species.GLIMMORA, Species.VENUSAUR ] + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.CROBAT, + Species.SKUNTANK, + Species.AMOONGUSS, + Species.TOXAPEX, + Species.TOXTRICITY, + Species.GRAFAIAI, + Species.CLODSIRE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.GENGAR, + Species.SEVIPER, + Species.DRAGALGE, + Species.OVERQWIL, + Species.ALOLA_MUK, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.GLIMMORA, Species.VENUSAUR], }; } case "star_4": { return { - [TrainerPoolTier.COMMON]: [ Species.CLEFABLE, Species.WIGGLYTUFF, Species.AZUMARILL, Species.WHIMSICOTT, Species.FLORGES, Species.HATTERENE, Species.GRIMMSNARL, Species.TINKATON ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_NINETALES ], - [TrainerPoolTier.RARE]: [ Species.GALAR_RAPIDASH, Species.PRIMARINA ] + [TrainerPoolTier.COMMON]: [ + Species.CLEFABLE, + Species.WIGGLYTUFF, + Species.AZUMARILL, + Species.WHIMSICOTT, + Species.FLORGES, + Species.HATTERENE, + Species.GRIMMSNARL, + Species.TINKATON, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.GARDEVOIR, + Species.SYLVEON, + Species.KLEFKI, + Species.MIMIKYU, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.GALAR_RAPIDASH, Species.PRIMARINA], }; } case "star_5": { return { - [TrainerPoolTier.COMMON]: [ Species.BRELOOM, Species.HARIYAMA, Species.MEDICHAM, Species.TOXICROAK, Species.SCRAFTY, Species.MIENSHAO, Species.PAWMOT, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.LUCARIO, Species.CONKELDURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.KOMMO_O, Species.QUAQUAVAL ] + [TrainerPoolTier.COMMON]: [ + Species.BRELOOM, + Species.HARIYAMA, + Species.MEDICHAM, + Species.TOXICROAK, + Species.SCRAFTY, + Species.MIENSHAO, + Species.PAWMOT, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.LUCARIO, + Species.CONKELDURR, + Species.HAWLUCHA, + Species.PASSIMIAN, + Species.FALINKS, + Species.FLAMIGO, + ], + [TrainerPoolTier.RARE]: [Species.KOMMO_O, Species.QUAQUAVAL], }; } } @@ -782,14 +1182,19 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for an evil team admin. - * @param title The title of the evil team admin. - * @param poolName The evil team the admin belongs to. - * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param specialtyType The specialty Type of the admin, if they have one - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[], specialtyType?: PokemonType): TrainerConfig { + * Initializes the trainer configuration for an evil team admin. + * @param title The title of the evil team admin. + * @param poolName The evil team the admin belongs to. + * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param specialtyType The specialty Type of the admin, if they have one + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForEvilTeamAdmin( + title: string, + poolName: string, + signatureSpecies: (Species | Species[])[], + specialtyType?: PokemonType, + ): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -805,7 +1210,7 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); @@ -825,10 +1230,10 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. - * @param isMale Whether the stat trainer is Male or Female (for localization of the title). + * @param _isMale Whether the stat trainer is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForStatTrainer(isMale: boolean = false): TrainerConfig { + initForStatTrainer(_isMale = false): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -849,13 +1254,18 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. - * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param {PokemonType} specialtyType The specialty type for the evil team Leader. - * @param boolean Whether or not this is the rematch fight - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, specialtyType?: PokemonType): TrainerConfig { + * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. + * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param {PokemonType} specialtyType The specialty type for the evil team Leader. + * @param boolean Whether or not this is the rematch fight + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForEvilTeamLeader( + title: string, + signatureSpecies: (Species | Species[])[], + rematch = false, + specialtyType?: PokemonType, + ): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -866,7 +1276,7 @@ export class TrainerConfig { } signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); @@ -888,15 +1298,21 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for a Gym Leader. - * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. - * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). - * @param {PokemonType} specialtyType The specialty type for the Gym Leader. - * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. - * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType: PokemonType, ignoreMinTeraWave: boolean = false, teraSlot?: number): TrainerConfig { + * Initializes the trainer configuration for a Gym Leader. + * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. + * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). + * @param {PokemonType} specialtyType The specialty type for the Gym Leader. + * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForGymLeader( + signatureSpecies: (Species | Species[])[], + isMale: boolean, + specialtyType: PokemonType, + ignoreMinTeraWave = false, + teraSlot?: number, + ): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -909,7 +1325,7 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { // Ensure speciesPool is an array. if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } // Set a function to get a random party member from the species pool. this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); @@ -936,20 +1352,28 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setRandomTeraModifiers(() => (ignoreMinTeraWave || globalScene.currentBattle.waveIndex >= GYM_LEADER_TERA_WAVE) ? 1 : 0, teraSlot); + this.setRandomTeraModifiers( + () => (ignoreMinTeraWave || globalScene.currentBattle.waveIndex >= GYM_LEADER_TERA_WAVE ? 1 : 0), + teraSlot, + ); return this; } /** - * Initializes the trainer configuration for an Elite Four member. - * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). - * @param specialtyType {PokemonType} The specialty type for the Elite Four member. - * @param teraSlot Optional, sets the party member in this slot to Terastallize. - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType?: PokemonType, teraSlot?: number): TrainerConfig { + * Initializes the trainer configuration for an Elite Four member. + * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. + * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param specialtyType {PokemonType} The specialty type for the Elite Four member. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ + initForEliteFour( + signatureSpecies: (Species | Species[])[], + isMale: boolean, + specialtyType?: PokemonType, + teraSlot?: number, + ): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -962,7 +1386,7 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { // Ensure speciesPool is an array. if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } // Set a function to get a random party member from the species pool. this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); @@ -999,11 +1423,11 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for a Champion. - * @param {Species | Species[]} signatureSpecies The signature species for the Champion. - * @param isMale Whether the Champion is Male or Female (for localization of the title). - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + * Initializes the trainer configuration for a Champion. + * @param {Species | Species[]} signatureSpecies The signature species for the Champion. + * @param isMale Whether the Champion is Male or Female (for localization of the title). + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ initForChampion(isMale: boolean): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { @@ -1023,7 +1447,6 @@ export class TrainerConfig { this.setTitle("champion_female"); } - // Configure various properties for the Champion. this.setMoneyMultiplier(10); this.setBoss(); @@ -1050,11 +1473,11 @@ export class TrainerConfig { } /** - * Retrieves the title for the trainer based on the provided trainer slot and variant. - * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. - * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. - * @returns {string} - The title of the trainer. - **/ + * Retrieves the title for the trainer based on the provided trainer slot and variant. + * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. + * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. + * @returns {string} - The title of the trainer. + **/ getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { const ret = this.name; @@ -1068,24 +1491,24 @@ export class TrainerConfig { // If the name is already set if (this.nameFemale) { // Check if the variant is either female or this is for the partner in a double battle - if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) { + if ( + variant === TrainerVariant.FEMALE || + (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER) + ) { return this.nameFemale; } - } else + } // Check if !variant is true, if so return the name, else return the name with _female appended - if (variant) { - if (!getIsInitialized()) { - initI18n(); - } - // Check if the female version exists in the i18n file - if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) { - // If it does, return - return ret + "_female"; - } else { - // If it doesn't, we do not do anything and go to the normal return - // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization - } + else if (variant) { + if (!getIsInitialized()) { + initI18n(); } + // Check if the female version exists in the i18n file + if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) { + // If it does, return + return ret + "_female"; + } + } } return ret; @@ -1103,37 +1526,36 @@ export class TrainerConfig { globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot - console.warn = () => { - }; + console.warn = () => {}; const frameNames = globalScene.anims.generateFrameNames(trainerKey, { zeroPad: 4, suffix: ".png", start: 1, - end: 128 + end: 128, }); const partnerFrameNames = isDouble ? globalScene.anims.generateFrameNames(partnerTrainerKey, { - zeroPad: 4, - suffix: ".png", - start: 1, - end: 128 - }) + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128, + }) : ""; console.warn = originalWarn; - if (!(globalScene.anims.exists(trainerKey))) { + if (!globalScene.anims.exists(trainerKey)) { globalScene.anims.create({ key: trainerKey, frames: frameNames, frameRate: 24, - repeat: -1 + repeat: -1, }); } - if (isDouble && !(globalScene.anims.exists(partnerTrainerKey))) { + if (isDouble && !globalScene.anims.exists(partnerTrainerKey)) { globalScene.anims.create({ key: partnerTrainerKey, frames: partnerFrameNames, frameRate: 24, - repeat: -1 + repeat: -1, }); } resolve(); @@ -1186,8 +1608,8 @@ export class TrainerConfig { clone = this.partyTemplateFunc ? clone.setPartyTemplateFunc(this.partyTemplateFunc) : clone; if (this.partyMemberFuncs) { - Object.keys(this.partyMemberFuncs).forEach((index) => { - clone = clone.setPartyMemberFunc(parseInt(index, 10), this.partyMemberFuncs[index]); + Object.keys(this.partyMemberFuncs).forEach(index => { + clone = clone.setPartyMemberFunc(Number.parseInt(index, 10), this.partyMemberFuncs[index]); }); } @@ -1214,7 +1636,7 @@ export class TrainerConfig { let t = 0; interface TrainerConfigs { - [key: number]: TrainerConfig + [key: number]: TrainerConfig; } /** @@ -1225,23 +1647,42 @@ function getEvilGruntPartyTemplate(): TrainerPartyTemplate { const waveIndex = globalScene.currentBattle?.waveIndex; if (waveIndex < 40) { return trainerPartyTemplates.TWO_AVG; - } else if (waveIndex < 63) { - return trainerPartyTemplates.THREE_AVG; - } else if (waveIndex < 65) { - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - } else if (waveIndex < 112) { - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } else { - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } + if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } + if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } + if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger + } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } function getWavePartyTemplate(...templates: TrainerPartyTemplate[]) { - return templates[Math.min(Math.max(Math.ceil((globalScene.gameMode.getWaveForDifficulty(globalScene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)]; + return templates[ + Math.min( + Math.max( + Math.ceil( + (globalScene.gameMode.getWaveForDifficulty(globalScene.currentBattle?.waveIndex || startingWave, true) - 20) / + 30, + ), + 0, + ), + templates.length - 1, + ) + ]; } function getGymLeaderPartyTemplate() { - return getWavePartyTemplate(trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5); + return getWavePartyTemplate( + trainerPartyTemplates.GYM_LEADER_1, + trainerPartyTemplates.GYM_LEADER_2, + trainerPartyTemplates.GYM_LEADER_3, + trainerPartyTemplates.GYM_LEADER_4, + trainerPartyTemplates.GYM_LEADER_5, + ); } /** @@ -1252,13 +1693,31 @@ function getGymLeaderPartyTemplate() { * @param ignoreEvolution * @param postProcess */ -export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { +export function getRandomPartyMemberFunc( + speciesPool: Species[], + trainerSlot: TrainerSlot = TrainerSlot.TRAINER, + ignoreEvolution = false, + postProcess?: (enemyPokemon: EnemyPokemon) => void, +) { return (level: number, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); if (!ignoreEvolution) { - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex); + species = getPokemonSpecies(species).getTrainerSpeciesForLevel( + level, + true, + strength, + globalScene.currentBattle.waveIndex, + ); } - return globalScene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, false, undefined, postProcess); + return globalScene.addEnemyPokemon( + getPokemonSpecies(species), + level, + trainerSlot, + undefined, + false, + undefined, + postProcess, + ); }; } @@ -1266,9 +1725,8 @@ function getSpeciesFilterRandomPartyMemberFunc( originalSpeciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, - postProcess?: (EnemyPokemon: EnemyPokemon) => void + postProcess?: (EnemyPokemon: EnemyPokemon) => void, ): PartyMemberFunc { - const speciesFilter = (species: PokemonSpecies): boolean => { const notLegendary = !species.legendary && !species.subLegendary && !species.mythical; return (allowLegendaries || notLegendary) && !species.isTrainerForbidden() && originalSpeciesFilter(species); @@ -1276,16 +1734,18 @@ function getSpeciesFilterRandomPartyMemberFunc( return (level: number, strength: PartyMemberStrength) => { const waveIndex = globalScene.currentBattle.waveIndex; - const species = getPokemonSpecies(globalScene.randomSpecies(waveIndex, level, false, speciesFilter) - .getTrainerSpeciesForLevel(level, true, strength, waveIndex)); + const species = getPokemonSpecies( + globalScene + .randomSpecies(waveIndex, level, false, speciesFilter) + .getTrainerSpeciesForLevel(level, true, strength, waveIndex), + ); return globalScene.addEnemyPokemon(species, level, trainerSlot, undefined, false, undefined, postProcess); }; } - type SignatureSpecies = { - [key in string]: (Species | Species[])[]; + [key in string]: (Species | Species[])[]; }; /* @@ -1294,1639 +1754,4223 @@ type SignatureSpecies = { * This is in a separate const so it can be accessed from other places and not just the trainerConfigs */ export const signatureSpecies: SignatureSpecies = { - BROCK: [ Species.GEODUDE, Species.ONIX ], - MISTY: [ Species.STARYU, Species.PSYDUCK ], - LT_SURGE: [ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], - ERIKA: [ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], - JANINE: [ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], - SABRINA: [ Species.ABRA, Species.MR_MIME, Species.ESPEON ], - BLAINE: [ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], - GIOVANNI: [ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], - FALKNER: [ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], - BUGSY: [ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], - WHITNEY: [ Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG ], - MORTY: [ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], - CHUCK: [ Species.POLIWRATH, Species.MANKEY ], - JASMINE: [ Species.MAGNEMITE, Species.STEELIX ], - PRYCE: [ Species.SEEL, Species.SWINUB ], - CLAIR: [ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], - ROXANNE: [ Species.GEODUDE, Species.NOSEPASS ], - BRAWLY: [ Species.MACHOP, Species.MAKUHITA ], - WATTSON: [ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], - FLANNERY: [ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], - NORMAN: [ Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON ], - WINONA: [ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], - TATE: [ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], - LIZA: [ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], - JUAN: [ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], - ROARK: [ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], - GARDENIA: [ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], - MAYLENE: [ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], - CRASHER_WAKE: [ Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP ], - FANTINA: [ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], - BYRON: [ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], - CANDICE: [ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], - VOLKNER: [ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], - CILAN: [ Species.PANSAGE, Species.FOONGUS, Species.PETILIL ], - CHILI: [ Species.PANSEAR, Species.DARUMAKA, Species.NUMEL ], - CRESS: [ Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE ], - CHEREN: [ Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE ], - LENORA: [ Species.PATRAT, Species.DEERLING, Species.AUDINO ], - ROXIE: [ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ], - BURGH: [ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ], - ELESA: [ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ], - CLAY: [ Species.DRILBUR, Species.SANDILE, Species.GOLETT ], - SKYLA: [ Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET ], - BRYCEN: [ Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO ], - DRAYDEN: [ Species.DRUDDIGON, Species.AXEW, Species.DEINO ], - MARLON: [ Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA ], - VIOLA: [ Species.SURSKIT, Species.SCATTERBUG ], - GRANT: [ Species.AMAURA, Species.TYRUNT ], - KORRINA: [ Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO ], - RAMOS: [ Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT ], - CLEMONT: [ Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA ], - VALERIE: [ Species.SYLVEON, Species.MAWILE, Species.MR_MIME ], - OLYMPIA: [ Species.ESPURR, Species.SIGILYPH, Species.SLOWKING ], - WULFRIC: [ Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL ], - MILO: [ Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET ], - NESSA: [ Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD ], - KABU: [ Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL ], - BEA: [ Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS ], - ALLISTER: [ Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY ], - OPAL: [ Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING ], - BEDE: [ Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR ], - GORDIE: [ Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE ], - MELONY: [ Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME ], - PIERS: [ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], - MARNIE: [ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], - RAIHAN: [ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], - KATY: [ Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA ], // Tera Bug Teddiursa - BRASSIUS: [ Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV ], // Tera Grass Sudowoodo - IONO: [ Species.MISDREAVUS, Species.TADBULB, Species.WATTREL ], // Tera Ghost Misdreavus - KOFU: [ Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL ], // Tera Water Crabrawler - LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ], // Tera Normal Starly - RYME: [ Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], // Tera Ghost Toxel - TULIP: [ Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG ], // Tera Psychic Flabebe - GRUSHA: [ Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX ], // Tera Ice Swablu - LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.CLOYSTER, Species.ALOLA_SANDSLASH ]], - BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.GOLEM, Species.ALOLA_GOLEM ]], - AGATHA: [ Species.GENGAR, [ Species.ARBOK, Species.WEEZING ], Species.CROBAT, Species.ALOLA_MAROWAK ], - LANCE: [ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], - WILL: [ Species.XATU, Species.JYNX, [ Species.SLOWBRO, Species.SLOWKING ], Species.EXEGGUTOR ], - KOGA: [[ Species.MUK, Species.WEEZING ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], - KAREN: [ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], - SIDNEY: [[ Species.SHIFTRY, Species.CACTURNE ], [ Species.SHARPEDO, Species.CRAWDAUNT ], Species.ABSOL, Species.MIGHTYENA ], - PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.DRIFBLIM, Species.MISMAGIUS ]], - GLACIA: [ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], - DRAKE: [ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], - AARON: [[ Species.SCIZOR, Species.KLEAVOR ], Species.HERACROSS, [ Species.VESPIQUEN, Species.YANMEGA ], Species.DRAPION ], - BERTHA: [ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], - FLINT: [[ Species.RAPIDASH, Species.FLAREON ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], // Tera Fire Steelix or Lopunny - LUCIAN: [ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [ Species.ALAKAZAM, Species.ESPEON ]], - SHAUNTAL: [ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT ], - MARSHAL: [ Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK ], - GRIMSLEY: [ Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE ], - CAITLIN: [ Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS ], - MALVA: [ Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME ], - SIEBOLD: [ Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE ], - WIKSTROM: [ Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH ], - DRASNA: [ Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN ], - HALA: [ Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [ Species.POLIWRATH, Species.ANNIHILAPE ]], - MOLAYNE: [ Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO ], - OLIVIA: [ Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC ], - ACEROLA: [[ Species.BANETTE, Species.DRIFBLIM ], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND ], - KAHILI: [[ Species.BRAVIARY, Species.MANDIBUZZ ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], - MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, [ Species.TOXICROAK, Species.SCRAFTY ], Species.GRIMMSNARL ], - NESSA_ELITE: [ Species.GOLISOPOD, [ Species.QUAGSIRE, Species.PELIPPER ], Species.TOXAPEX, Species.DREDNAW ], - BEA_ELITE: [ Species.HAWLUCHA, [ Species.GRAPPLOCT, Species.SIRFETCHD ], Species.FALINKS, Species.MACHAMP ], - ALLISTER_ELITE: [ Species.DUSKNOIR, [ Species.POLTEAGEIST, Species.RUNERIGUS ], Species.CURSOLA, Species.GENGAR ], - RAIHAN_ELITE: [ Species.GOODRA, [ Species.TORKOAL, Species.TURTONATOR ], Species.FLYGON, Species.ARCHALUDON ], - RIKA: [ Species.CLODSIRE, [ Species.DUGTRIO, Species.DONPHAN ], Species.CAMERUPT, Species.WHISCASH ], // Tera Ground Clodsire - POPPY: [ Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH ], // Tera Steel Tinkaton - LARRY_ELITE: [ Species.FLAMIGO, Species.STARAPTOR, [ Species.ALTARIA, Species.TROPIUS ], Species.ORICORIO ], // Tera Flying Flamigo; random Oricorio - HASSEL: [ Species.BAXCALIBUR, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.NOIVERN ], // Tera Dragon Baxcalibur - CRISPIN: [ Species.BLAZIKEN, Species.MAGMORTAR, [ Species.CAMERUPT, Species.TALONFLAME ], Species.ROTOM ], // Tera Fire Blaziken; Heat Rotom - AMARYS: [ Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY ], // Tera Steel Metagross - LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.WHIMSICOTT, Species.ALCREMIE ], Species.GRANBULL ], // Tera Fairy Excadrill - DRAYTON: [ Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE ], // Tera Dragon Archaludon + BROCK: [Species.GEODUDE, Species.ONIX], + MISTY: [Species.STARYU, Species.PSYDUCK], + LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ], + ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP], + JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT], + SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON], + BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR], + GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F], + FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO], + BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR], + WHITNEY: [Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG], + MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE], + CHUCK: [Species.POLIWRATH, Species.MANKEY], + JASMINE: [Species.MAGNEMITE, Species.STEELIX], + PRYCE: [Species.SEEL, Species.SWINUB], + CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS], + ROXANNE: [Species.GEODUDE, Species.NOSEPASS], + BRAWLY: [Species.MACHOP, Species.MAKUHITA], + WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE], + FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL], + NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON], + WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY], + TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE], + LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR], + JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH], + ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE], + GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG], + MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR], + CRASHER_WAKE: [Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP], + FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB], + BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON], + CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT], + VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM], + CILAN: [Species.PANSAGE, Species.FOONGUS, Species.PETILIL], + CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL], + CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE], + CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE], + LENORA: [Species.PATRAT, Species.DEERLING, Species.AUDINO], + ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI], + BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST], + ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK], + CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT], + SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET], + BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO], + DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO], + MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA], + VIOLA: [Species.SURSKIT, Species.SCATTERBUG], + GRANT: [Species.AMAURA, Species.TYRUNT], + KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO], + RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT], + CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA], + VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME], + OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING], + WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL], + MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET], + NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD], + KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL], + BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS], + ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY], + OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING], + BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR], + GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE], + MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME], + PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY], + MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO], + RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY], + KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa + BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo + IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus + KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler + LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly + RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel + TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe + GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu + LORELEI: [ + Species.JYNX, + [Species.SLOWBRO, Species.GALAR_SLOWBRO], + Species.LAPRAS, + [Species.CLOYSTER, Species.ALOLA_SANDSLASH], + ], + BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]], + AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK], + LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR], + WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR], + KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL], + KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE], + SIDNEY: [ + [Species.SHIFTRY, Species.CACTURNE], + [Species.SHARPEDO, Species.CRAWDAUNT], + Species.ABSOL, + Species.MIGHTYENA, + ], + PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]], + GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW], + DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA], + AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION], + BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR], + FLINT: [ + [Species.RAPIDASH, Species.FLAREON], + Species.MAGMORTAR, + [Species.STEELIX, Species.LOPUNNY], + Species.INFERNAPE, + ], // Tera Fire Steelix or Lopunny + LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]], + SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT], + MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK], + GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE], + CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS], + MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME], + SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE], + WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH], + DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN], + HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]], + MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO], + OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC], + ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND], + KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON], + MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL], + NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW], + BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP], + ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR], + RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON], + RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire + POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton + LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio + HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur + CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom + AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross + LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill + DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon }; export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), - [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) - .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)), - [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) - .setSpeciesPools([ Species.SMEARGLE ]), - [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(PokemonType.FLYING) || s.isOfType(PokemonType.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) - .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG) + [TrainerType.ACE_TRAINER]: new TrainerConfig(++t) + .setHasGenders("Ace Trainer Female") + .setHasDouble("Ace Duo") + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.THREE_WEAK_BALANCED, + trainerPartyTemplates.FOUR_WEAK_BALANCED, + trainerPartyTemplates.FIVE_WEAK_BALANCED, + trainerPartyTemplates.SIX_WEAK_BALANCED, + ), + ), + [TrainerType.ARTIST]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.RICH) + .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) + .setSpeciesPools([Species.SMEARGLE]), + [TrainerType.BACKERS]: new TrainerConfig(++t) + .setHasGenders("Backers") + .setDoubleOnly() + .setEncounterBgm(TrainerType.CYCLIST), + [TrainerType.BACKPACKER]: new TrainerConfig(++t) + .setHasGenders("Backpacker Female") + .setHasDouble("Backpackers") + .setSpeciesFilter(s => s.isOfType(PokemonType.FLYING) || s.isOfType(PokemonType.ROCK)) + .setEncounterBgm(TrainerType.BACKPACKER) + .setPartyTemplates( + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.ONE_WEAK_ONE_STRONG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ], - [TrainerPoolTier.UNCOMMON]: [ Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY ], - [TrainerPoolTier.RARE]: [ Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.GALAR_DARUMAKA, Species.TEDDIURSA ] + [TrainerPoolTier.COMMON]: [ + Species.RHYHORN, + Species.AIPOM, + Species.MAKUHITA, + Species.MAWILE, + Species.NUMEL, + Species.LILLIPUP, + Species.SANDILE, + Species.WOOLOO, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.GIRAFARIG, + Species.ZANGOOSE, + Species.SEVIPER, + Species.CUBCHOO, + Species.PANCHAM, + Species.SKIDDO, + Species.MUDBRAY, + ], + [TrainerPoolTier.RARE]: [ + Species.TAUROS, + Species.STANTLER, + Species.DARUMAKA, + Species.BOUFFALANT, + Species.DEERLING, + Species.IMPIDIMP, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA], }), - [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(PokemonType.GRASS) || s.isOfType(PokemonType.FIRE)), + [TrainerType.BAKER]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.CLERK) + .setMoneyMultiplier(1.35) + .setSpeciesFilter(s => s.isOfType(PokemonType.GRASS) || s.isOfType(PokemonType.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), - [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(PokemonType.FIGHTING) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) + [TrainerType.BIKER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.POISON)), + [TrainerType.BLACK_BELT]: new TrainerConfig(++t) + .setHasGenders("Battle Girl", TrainerType.PSYCHIC) + .setHasDouble("Crush Kin") + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpecialtyType(PokemonType.FIGHTING) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_STRONG, + trainerPartyTemplates.THREE_AVG, + trainerPartyTemplates.TWO_AVG_ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER ], - [TrainerPoolTier.RARE]: [ Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.KUBFU ] + [TrainerPoolTier.COMMON]: [ + Species.NIDORAN_F, + Species.NIDORAN_M, + Species.MACHOP, + Species.MAKUHITA, + Species.MEDITITE, + Species.CROAGUNK, + Species.TIMBURR, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MANKEY, + Species.POLIWRATH, + Species.TYROGUE, + Species.BRELOOM, + Species.SCRAGGY, + Species.MIENFOO, + Species.PANCHAM, + Species.STUFFUL, + Species.CRABRAWLER, + ], + [TrainerPoolTier.RARE]: [ + Species.HERACROSS, + Species.RIOLU, + Species.THROH, + Species.SAWK, + Species.PASSIMIAN, + Species.CLOBBOPUS, + ], + [TrainerPoolTier.SUPER_RARE]: [ + Species.HITMONTOP, + Species.INFERNAPE, + Species.GALLADE, + Species.HAWLUCHA, + Species.HAKAMO_O, + ], + [TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU], }), - [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders") - .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER)) + [TrainerType.BREEDER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.325) + .setEncounterBgm(TrainerType.POKEFAN) + .setHasGenders("Breeder Female") + .setHasDouble("Breeders") + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.FIVE_WEAKER, + trainerPartyTemplates.SIX_WEAKER, + ), + ) .setSpeciesFilter(s => s.baseTotal < 450), - [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG) + [TrainerType.CLERK]: new TrainerConfig(++t) + .setHasGenders("Clerk Female") + .setHasDouble("Colleagues") + .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO ], - [TrainerPoolTier.UNCOMMON]: [ Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO ], - [TrainerPoolTier.RARE]: [ Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE ] + [TrainerPoolTier.COMMON]: [ + Species.MEOWTH, + Species.PSYDUCK, + Species.BUDEW, + Species.PIDOVE, + Species.CINCCINO, + Species.LITLEO, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.JIGGLYPUFF, + Species.MAGNEMITE, + Species.MARILL, + Species.COTTONEE, + Species.SKIDDO, + ], + [TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE], }), - [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST) + [TrainerType.CYCLIST]: new TrainerConfig(++t) + .setMoneyMultiplier(1.3) + .setHasGenders("Cyclist Female") + .setHasDouble("Cyclists") + .setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND ], - [TrainerPoolTier.UNCOMMON]: [ Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL ], - [TrainerPoolTier.RARE]: [ Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ACCELGOR, Species.DREEPY ] + [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND], + [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL], + [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA], + [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY], }), - [TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME) + [TrainerType.DANCER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.CYCLIST) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW ], - [TrainerPoolTier.UNCOMMON]: [ Species.SPINDA, Species.SWABLU, Species.MARACTUS, ], - [TrainerPoolTier.RARE]: [ Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW], + [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS], + [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO], + [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO], }), [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK), - [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) + [TrainerType.DOCTOR]: new TrainerConfig(++t) + .setHasGenders("Nurse", "lass") + .setHasDouble("Medical Team") + .setMoneyMultiplier(3) + .setEncounterBgm(TrainerType.CLERK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), - [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK) + [TrainerType.FIREBREATHER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(PokemonType.FIRE)), - [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyType(PokemonType.WATER) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) + [TrainerType.FISHERMAN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.25) + .setEncounterBgm(TrainerType.BACKPACKER) + .setSpecialtyType(PokemonType.WATER) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.THREE_WEAK_SAME, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.SIX_WEAKER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY ], - [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] + [TrainerPoolTier.COMMON]: [ + Species.TENTACOOL, + Species.MAGIKARP, + Species.GOLDEEN, + Species.STARYU, + Species.REMORAID, + Species.SKRELP, + Species.CLAUNCHER, + Species.ARROKUDA, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POLIWAG, + Species.SHELLDER, + Species.KRABBY, + Species.HORSEA, + Species.CARVANHA, + Species.BARBOACH, + Species.CORPHISH, + Species.FINNEON, + Species.TYMPOLE, + Species.BASCULIN, + Species.FRILLISH, + Species.INKAY, + ], + [TrainerPoolTier.RARE]: [ + Species.CHINCHOU, + Species.CORSOLA, + Species.WAILMER, + Species.BARBOACH, + Species.CLAMPERL, + Species.LUVDISC, + Species.MANTYKE, + Species.ALOMOMOLA, + Species.TATSUGIRI, + Species.VELUZA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO], }), - [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(PokemonType.ELECTRIC).setSpeciesFilter(s => s.isOfType(PokemonType.ELECTRIC)), - [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), - [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) - .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) + [TrainerType.GUITARIST]: new TrainerConfig(++t) + .setMoneyMultiplier(1.2) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpecialtyType(PokemonType.ELECTRIC) + .setSpeciesFilter(s => s.isOfType(PokemonType.ELECTRIC)), + [TrainerType.HARLEQUIN]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.PSYCHIC) + .setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), + [TrainerType.HIKER]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.BACKPACKER) + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI ], - [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER ], - [TrainerPoolTier.SUPER_RARE]: [ Species.MAGBY, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ + Species.SANDSHREW, + Species.DIGLETT, + Species.GEODUDE, + Species.MACHOP, + Species.ARON, + Species.ROGGENROLA, + Species.DRILBUR, + Species.NACLI, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.RHYHORN, + Species.ONIX, + Species.CUBONE, + Species.WOOBAT, + Species.SWINUB, + Species.NOSEPASS, + Species.HIPPOPOTAS, + Species.DWEBBLE, + Species.KLAWF, + Species.TOEDSCOOL, + ], + [TrainerPoolTier.RARE]: [ + Species.TORKOAL, + Species.TRAPINCH, + Species.BARBOACH, + Species.GOLETT, + Species.ALOLA_DIGLETT, + Species.ALOLA_GEODUDE, + Species.GALAR_STUNFISK, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR], }), - [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), + [TrainerType.HOOLIGANS]: new TrainerConfig(++t) + .setDoubleOnly() + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.JANITOR]: new TrainerConfig(++t).setMoneyMultiplier(1.1).setEncounterBgm(TrainerType.CLERK), [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH), - [TrainerType.MUSICIAN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), - [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC) - .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG) + [TrainerType.MUSICIAN]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), + [TrainerType.HEX_MANIAC]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.PSYCHIC) + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.THREE_AVG, + trainerPartyTemplates.TWO_STRONG, + ) .setSpeciesFilter(s => s.isOfType(PokemonType.GHOST)), [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), - [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK) - .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG) + [TrainerType.OFFICER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH ], - [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF ], - [TrainerPoolTier.RARE]: [ Species.JOLTEON, Species.RIOLU ], + [TrainerPoolTier.COMMON]: [ + Species.VULPIX, + Species.GROWLITHE, + Species.SNUBBULL, + Species.POOCHYENA, + Species.ELECTRIKE, + Species.LILLIPUP, + Species.YAMPER, + Species.FIDOUGH, + ], + [TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF], + [TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU], [TrainerPoolTier.SUPER_RARE]: [], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU ] + [TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU], }), - [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), - [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), - [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN) - .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME), - [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers") - .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER) + [TrainerType.PARASOL_LADY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.PARASOL_LADY) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), + [TrainerType.PILOT]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.CLERK) + .setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), + [TrainerType.POKEFAN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setName("PokéFan") + .setHasGenders("PokéFan Female") + .setHasDouble("PokéFan Family") + .setEncounterBgm(TrainerType.POKEFAN) + .setPartyTemplates( + trainerPartyTemplates.SIX_WEAKER, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.FOUR_WEAK_SAME, + trainerPartyTemplates.FIVE_WEAK, + trainerPartyTemplates.SIX_WEAKER_SAME, + ), + [TrainerType.PRESCHOOLER]: new TrainerConfig(++t) + .setMoneyMultiplier(0.2) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("Preschooler Female", "lass") + .setHasDouble("Preschoolers") + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.FIVE_WEAKER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV ], - [TrainerPoolTier.UNCOMMON]: [ Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DARUMAKA, Species.TINKATINK ], + [TrainerPoolTier.COMMON]: [ + Species.CATERPIE, + Species.PICHU, + Species.SANDSHREW, + Species.LEDYBA, + Species.BUDEW, + Species.BURMY, + Species.WOOLOO, + Species.PAWMI, + Species.SMOLIV, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.EEVEE, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.SWINUB, + Species.WOOPER, + Species.DRIFLOON, + Species.DEDENNE, + Species.STUFFUL, + ], + [TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS], + [TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK], }), - [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER) + [TrainerType.PSYCHIC]: new TrainerConfig(++t) + .setHasGenders("Psychic Female") + .setHasDouble("Psychics") + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.PSYCHIC) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, + trainerPartyTemplates.ONE_STRONGER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA ], - [TrainerPoolTier.UNCOMMON]: [ Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU ], - [TrainerPoolTier.RARE]: [ Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC ], - [TrainerPoolTier.SUPER_RARE]: [ Species.BELDUM, Species.ESPEON, Species.STANTLER ], + [TrainerPoolTier.COMMON]: [ + Species.ABRA, + Species.DROWZEE, + Species.RALTS, + Species.SPOINK, + Species.GOTHITA, + Species.SOLOSIS, + Species.BLIPBUG, + Species.ESPURR, + Species.HATENNA, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MIME_JR, + Species.EXEGGCUTE, + Species.MEDITITE, + Species.NATU, + Species.EXEGGCUTE, + Species.WOOBAT, + Species.INKAY, + Species.ORANGURU, + ], + [TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC], + [TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER], }), - [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers") + [TrainerType.RANGER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setName("Pokémon Ranger") + .setEncounterBgm(TrainerType.BACKPACKER) + .setHasGenders("Pokémon Ranger Female") + .setHasDouble("Pokémon Rangers") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LARVESTA ], + [TrainerPoolTier.COMMON]: [ + Species.PICHU, + Species.GROWLITHE, + Species.PONYTA, + Species.ZIGZAGOON, + Species.SEEDOT, + Species.BIDOOF, + Species.RIOLU, + Species.SEWADDLE, + Species.SKIDDO, + Species.SALANDIT, + Species.YAMPER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.AZURILL, + Species.TAUROS, + Species.MAREEP, + Species.FARFETCHD, + Species.TEDDIURSA, + Species.SHROOMISH, + Species.ELECTRIKE, + Species.BUDEW, + Species.BUIZEL, + Species.MUDBRAY, + Species.STUFFUL, + ], + [TrainerPoolTier.RARE]: [ + Species.EEVEE, + Species.SCYTHER, + Species.KANGASKHAN, + Species.RALTS, + Species.MUNCHLAX, + Species.ZORUA, + Species.PALDEA_TAUROS, + Species.TINKATINK, + Species.CYCLIZAR, + Species.FLAMIGO, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA], }), - [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"), - [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH), - [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.DARK)), - [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(PokemonType.WATER) || s.isOfType(PokemonType.FIGHTING)), - [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) + [TrainerType.RICH]: new TrainerConfig(++t) + .setMoneyMultiplier(5) + .setName("Gentleman") + .setHasGenders("Madame") + .setHasDouble("Rich Couple"), + [TrainerType.RICH_KID]: new TrainerConfig(++t) + .setMoneyMultiplier(3.75) + .setName("Rich Boy") + .setHasGenders("Lady") + .setHasDouble("Rich Kids") + .setEncounterBgm(TrainerType.RICH), + [TrainerType.ROUGHNECK]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.DARK)), + [TrainerType.SAILOR]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.BACKPACKER) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER) || s.isOfType(PokemonType.FIGHTING)), + [TrainerType.SCIENTIST]: new TrainerConfig(++t) + .setHasGenders("Scientist Female") + .setHasDouble("Scientists") + .setMoneyMultiplier(1.7) + .setEncounterBgm(TrainerType.SCIENTIST) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ], - [TrainerPoolTier.UNCOMMON]: [ Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE ], - [TrainerPoolTier.RARE]: [ Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING ], - [TrainerPoolTier.SUPER_RARE]: [ Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ] + [TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING], + [TrainerPoolTier.UNCOMMON]: [ + Species.BALTOY, + Species.BRONZOR, + Species.FERROSEED, + Species.KLINK, + Species.CHARJABUG, + Species.BLIPBUG, + Species.HELIOPTILE, + ], + [TrainerPoolTier.RARE]: [ + Species.ABRA, + Species.DITTO, + Species.PORYGON, + Species.ELEKID, + Species.SOLOSIS, + Species.GALAR_WEEZING, + ], + [TrainerPoolTier.SUPER_RARE]: [ + Species.OMANYTE, + Species.KABUTO, + Species.AERODACTYL, + Species.LILEEP, + Species.ANORITH, + Species.CRANIDOS, + Species.SHIELDON, + Species.TIRTOUGA, + Species.ARCHEN, + Species.ARCTOVISH, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.DRACOZOLT, + ], + [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN], }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(PokemonType.ICE) || s.isOfType(PokemonType.STEEL)), + [TrainerType.SNOW_WORKER]: new TrainerConfig(++t) + .setName("Worker") + .setHasDouble("Workers") + .setMoneyMultiplier(1.7) + .setEncounterBgm(TrainerType.CLERK) + .setSpeciesFilter(s => s.isOfType(PokemonType.ICE) || s.isOfType(PokemonType.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") + [TrainerType.SCHOOL_KID]: new TrainerConfig(++t) + .setMoneyMultiplier(0.75) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("School Kid Female", "lass") + .setHasDouble("School Kids") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ], - [TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ], - [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] + [TrainerPoolTier.COMMON]: [ + Species.ODDISH, + Species.EXEGGCUTE, + Species.TEDDIURSA, + Species.WURMPLE, + Species.RALTS, + Species.SHROOMISH, + Species.FLETCHLING, + ], + [TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE], + [TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA], + [TrainerPoolTier.SUPER_RARE]: [Species.TADBULB], }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyType(PokemonType.WATER).setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), - [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() - .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER)) + [TrainerType.SWIMMER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.3) + .setEncounterBgm(TrainerType.PARASOL_LADY) + .setHasGenders("Swimmer Female") + .setHasDouble("Swimmers") + .setSpecialtyType(PokemonType.WATER) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), + [TrainerType.TWINS]: new TrainerConfig(++t) + .setDoubleOnly() + .setMoneyMultiplier(0.65) + .setUseSameSeedForAllMembers() + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_STRONG, + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([ + Species.PLUSLE, + Species.VOLBEAT, + Species.PACHIRISU, + Species.SILCOON, + Species.METAPOD, + Species.IGGLYBUFF, + Species.PETILIL, + Species.EEVEE, + ]), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.MINUN, + Species.ILLUMISE, + Species.EMOLGA, + Species.CASCOON, + Species.KAKUNA, + Species.CLEFFA, + Species.COTTONEE, + Species.EEVEE, + ], + TrainerSlot.TRAINER_PARTNER, + ), + ) .setEncounterBgm(TrainerType.TWINS), - [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(PokemonType.DRAGON)), - [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) + [TrainerType.VETERAN]: new TrainerConfig(++t) + .setHasGenders("Veteran Female") + .setHasDouble("Veteran Duo") + .setMoneyMultiplier(2.5) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setSpeciesFilter(s => s.isOfType(PokemonType.DRAGON)), + [TrainerType.WAITER]: new TrainerConfig(++t) + .setHasGenders("Waitress") + .setHasDouble("Restaurant Staff") + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.CLERK) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ], - [TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ], - [TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ] + [TrainerPoolTier.COMMON]: [ + Species.CLEFFA, + Species.CHATOT, + Species.PANSAGE, + Species.PANSEAR, + Species.PANPOUR, + Species.MINCCINO, + ], + [TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE], + [TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST], }), - [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(PokemonType.ROCK) || s.isOfType(PokemonType.STEEL)), - [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) - .setSpeciesPools( - [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] + [TrainerType.WORKER]: new TrainerConfig(++t) + .setHasGenders("Worker Female") + .setHasDouble("Workers") + .setEncounterBgm(TrainerType.CLERK) + .setMoneyMultiplier(1.7) + .setSpeciesFilter(s => s.isOfType(PokemonType.ROCK) || s.isOfType(PokemonType.STEEL)), + [TrainerType.YOUNGSTER]: new TrainerConfig(++t) + .setMoneyMultiplier(0.5) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("Lass", "lass") + .setHasDouble("Beginners") + .setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) + .setSpeciesPools([ + Species.CATERPIE, + Species.WEEDLE, + Species.RATTATA, + Species.SENTRET, + Species.POOCHYENA, + Species.ZIGZAGOON, + Species.WURMPLE, + Species.BIDOOF, + Species.PATRAT, + Species.LILLIPUP, + ]), + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Rocket Grunt Female") + .setHasDouble("Rocket Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.WEEDLE, + Species.RATTATA, + Species.EKANS, + Species.SANDSHREW, + Species.ZUBAT, + Species.ODDISH, + Species.GEODUDE, + Species.SLOWPOKE, + Species.GRIMER, + Species.KOFFING, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MANKEY, + Species.GROWLITHE, + Species.MAGNEMITE, + Species.GASTLY, + Species.VOLTORB, + Species.EXEGGCUTE, + Species.CUBONE, + Species.LICKITUNG, + Species.SCYTHER, + Species.TAUROS, + Species.GYARADOS, + Species.MURKROW, + Species.ELEKID, + Species.MAGBY, + ], + [TrainerPoolTier.RARE]: [ + Species.PORYGON, + Species.OMANYTE, + Species.KABUTO, + Species.ALOLA_RATTATA, + Species.ALOLA_SANDSHREW, + Species.ALOLA_MEOWTH, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRIMER, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR], + }), + [TrainerType.ARCHER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.HOUNDOOM]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.ARIANA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin_female", "rocket", [Species.ARBOK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PROTON]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.CROBAT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PETREL]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.WEEZING]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Magma Grunt Female") + .setHasDouble("Magma Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.DIGLETT, + Species.GROWLITHE, + Species.SLUGMA, + Species.MAGBY, + Species.POOCHYENA, + Species.ZIGZAGOON, + Species.NUMEL, + Species.TORKOAL, + Species.BALTOY, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.RHYHORN, + Species.GLIGAR, + Species.PHANPY, + Species.SOLROCK, + Species.HIPPOPOTAS, + Species.HEATMOR, + Species.ROLYCOLY, + Species.SILICOBRA, + ], + [TrainerPoolTier.RARE]: [ + Species.ARON, + Species.TRAPINCH, + Species.LILEEP, + Species.ANORITH, + Species.TURTONATOR, + Species.TOEDSCOOL, + Species.HISUI_GROWLITHE, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.CHARCADET, Species.CAPSAKID], + }), + [TrainerType.TABITHA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.COURTNEY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Aqua Grunt Female") + .setHasDouble("Aqua Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.QWILFISH, + Species.REMORAID, + Species.ZIGZAGOON, + Species.LOTAD, + Species.CARVANHA, + Species.WAILMER, + Species.BARBOACH, + Species.CORPHISH, + Species.SPHEAL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TENTACOOL, + Species.HORSEA, + Species.CHINCHOU, + Species.WOOPER, + Species.WINGULL, + Species.AZURILL, + Species.CLAMPERL, + Species.CLOBBOPUS, + ], + [TrainerPoolTier.RARE]: [ + Species.MANTYKE, + Species.SKRELP, + Species.DHELMISE, + Species.ARROKUDA, + Species.HISUI_QWILFISH, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.BASCULEGION, Species.DONDOZO], + }), + [TrainerType.MATT]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SHELLY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aqua_admin_female", "aqua", [Species.SHARPEDO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Galactic Grunt Female") + .setHasDouble("Galactic Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.WURMPLE, + Species.SHINX, + Species.BURMY, + Species.DRIFLOON, + Species.GLAMEOW, + Species.STUNKY, + Species.BRONZOR, + Species.CROAGUNK, + Species.CARNIVINE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.LICKITUNG, + Species.RHYHORN, + Species.TANGELA, + Species.YANMA, + Species.GLIGAR, + Species.SWINUB, + Species.SKORUPI, + ], + [TrainerPoolTier.RARE]: [ + Species.SNEASEL, + Species.ELEKID, + Species.MAGBY, + Species.DUSKULL, + Species.HISUI_GROWLITHE, + Species.HISUI_QWILFISH, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL], + }), + [TrainerType.JUPITER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MARS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SATURN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Plasma Grunt Female") + .setHasDouble("Plasma Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_plasma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.PATRAT, + Species.LILLIPUP, + Species.PURRLOIN, + Species.WOOBAT, + Species.TYMPOLE, + Species.SANDILE, + Species.SCRAGGY, + Species.TRUBBISH, + Species.VANILLITE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TIMBURR, + Species.VENIPEDE, + Species.DARUMAKA, + Species.FOONGUS, + Species.FRILLISH, + Species.JOLTIK, + Species.KLINK, + Species.CUBCHOO, + Species.GOLETT, + ], + [TrainerPoolTier.RARE]: [ + Species.DRILBUR, + Species.ZORUA, + Species.MIENFOO, + Species.PAWNIARD, + Species.BOUFFALANT, + Species.RUFFLET, + Species.VULLABY, + Species.DURANT, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA], + }), + [TrainerType.ZINZOLIN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_plasma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.COLRESS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("plasma_boss", "plasma_2", [Species.KLINKLANG]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_colress") + .setMixedBattleBgm("battle_colress") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Flare Grunt Female") + .setHasDouble("Flare Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.PONYTA, + Species.HOUNDOUR, + Species.SKORUPI, + Species.CROAGUNK, + Species.SCRAGGY, + Species.FLETCHLING, + Species.SCATTERBUG, + Species.LITLEO, + Species.ESPURR, + Species.INKAY, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POOCHYENA, + Species.ELECTRIKE, + Species.PURRLOIN, + Species.FOONGUS, + Species.PANCHAM, + Species.BINACLE, + Species.SKRELP, + Species.CLAUNCHER, + Species.HELIOPTILE, + Species.PHANTUMP, + Species.PUMPKABOO, + ], + [TrainerPoolTier.RARE]: [Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG], + }), + [TrainerType.BRYONY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.XEROSIC]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Aether Grunt Female") + .setHasDouble("Aether Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aether_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.CORSOLA, + Species.LILLIPUP, + Species.PIKIPEK, + Species.YUNGOOS, + Species.ROCKRUFF, + Species.MORELULL, + Species.BOUNSWEET, + Species.COMFEY, + Species.KOMALA, + Species.TOGEDEMARU, + Species.ALOLA_RAICHU, + Species.ALOLA_DIGLETT, + Species.ALOLA_GEODUDE, + Species.ALOLA_EXEGGUTOR, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POLIWAG, + Species.CRABRAWLER, + Species.ORICORIO, + Species.CUTIEFLY, + Species.WISHIWASHI, + Species.MUDBRAY, + Species.STUFFUL, + Species.ORANGURU, + Species.PASSIMIAN, + Species.PYUKUMUKU, + Species.MINIOR, + Species.BRUXISH, + Species.ALOLA_SANDSHREW, + Species.ALOLA_VULPIX, + Species.ALOLA_MAROWAK, + ], + [TrainerPoolTier.RARE]: [ + Species.MAGNEMITE, + Species.TURTONATOR, + Species.MIMIKYU, + Species.DRAMPA, + Species.GALAR_CORSOLA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.JANGMO_O], + }), + [TrainerType.FABA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aether_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Skull Grunt Female") + .setHasDouble("Skull Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_skull_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.EKANS, + Species.DROWZEE, + Species.KOFFING, + Species.SPINARAK, + Species.SCRAGGY, + Species.TRUBBISH, + Species.MAREANIE, + Species.SALANDIT, + Species.ALOLA_RATTATA, + Species.ALOLA_MEOWTH, + Species.ALOLA_GRIMER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.GASTLY, + Species.HOUNDOUR, + Species.SABLEYE, + Species.VENIPEDE, + Species.SANDILE, + Species.VULLABY, + Species.PANCHAM, + Species.FOMANTIS, + Species.ALOLA_MAROWAK, + ], + [TrainerPoolTier.RARE]: [ + Species.PAWNIARD, + Species.WISHIWASHI, + Species.SANDYGAST, + Species.MIMIKYU, + Species.DHELMISE, + Species.NYMBLE, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER], + }), + [TrainerType.PLUMERIA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_skull_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Macro Grunt Female") + .setHasDouble("Macro Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_macro_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.STEELIX, + Species.MAWILE, + Species.FERROSEED, + Species.KLINK, + Species.SKWOVET, + Species.ROOKIDEE, + Species.CRAMORANT, + Species.CUFANT, + Species.GALAR_MEOWTH, + Species.GALAR_ZIGZAGOON, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MAGNEMITE, + Species.RIOLU, + Species.DRILBUR, + Species.APPLIN, + Species.ARROKUDA, + Species.SINISTEA, + Species.HATENNA, + Species.GALAR_PONYTA, + Species.GALAR_YAMASK, + ], + [TrainerPoolTier.RARE]: [ + Species.SCIZOR, + Species.BELDUM, + Species.HONEDGE, + Species.FALINKS, + Species.GALAR_FARFETCHD, + Species.GALAR_MR_MIME, + Species.GALAR_DARUMAKA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY], + }), + [TrainerType.OLEANA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_oleana") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.STAR_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Star Grunt Female") + .setHasDouble("Star Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.DUNSPARCE, + Species.HOUNDOUR, + Species.AZURILL, + Species.GULPIN, + Species.FOONGUS, + Species.FLETCHLING, + Species.LITLEO, + Species.FLABEBE, + Species.CRABRAWLER, + Species.NYMBLE, + Species.PAWMI, + Species.FIDOUGH, + Species.SQUAWKABILLY, + Species.MASCHIFF, + Species.SHROODLE, + Species.KLAWF, + Species.WIGLETT, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.KOFFING, + Species.EEVEE, + Species.GIRAFARIG, + Species.RALTS, + Species.TORKOAL, + Species.SEVIPER, + Species.SCRAGGY, + Species.ZORUA, + Species.MIMIKYU, + Species.IMPIDIMP, + Species.FALINKS, + Species.CAPSAKID, + Species.TINKATINK, + Species.BOMBIRDIER, + Species.CYCLIZAR, + Species.FLAMIGO, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.RARE]: [ + Species.MANKEY, + Species.PAWNIARD, + Species.CHARCADET, + Species.FLITTLE, + Species.VAROOM, + Species.ORTHWORM, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO, Species.GIMMIGHOUL], + }), + [TrainerType.GIACOMO]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_1", [Species.KINGAMBIT], PokemonType.DARK) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Segin Starmobile + p.moveset = [ + new PokemonMove(Moves.WICKED_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.MELA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_2", [Species.ARMAROUGE], PokemonType.FIRE) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 2; // Schedar Starmobile + p.moveset = [ + new PokemonMove(Moves.BLAZING_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ATTICUS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_3", [Species.REVAVROOM], PokemonType.POISON) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 3; // Navi Starmobile + p.moveset = [ + new PokemonMove(Moves.NOXIOUS_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ORTEGA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_4", [Species.DACHSBUN], PokemonType.FAIRY) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 4; // Ruchbah Starmobile + p.moveset = [ + new PokemonMove(Moves.MAGICAL_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ERI]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_5", [Species.ANNIHILAPE], PokemonType.FIGHTING) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 5; // Caph Starmobile + p.moveset = [ + new PokemonMove(Moves.COMBAT_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), ), - [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.ODDISH, Species.GEODUDE, Species.SLOWPOKE, Species.GRIMER, Species.KOFFING ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.GROWLITHE, Species.MAGNEMITE, Species.GASTLY, Species.VOLTORB, Species.EXEGGCUTE, Species.CUBONE, Species.LICKITUNG, Species.SCYTHER, Species.TAUROS, Species.GYARADOS, Species.MURKROW, Species.ELEKID, Species.MAGBY ], - [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.OMANYTE, Species.KABUTO, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GEODUDE, Species.ALOLA_GRIMER, Species.PALDEA_TAUROS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ] - }), - [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.ARIANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin_female", "rocket", [ Species.ARBOK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.PROTON]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.CROBAT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.DIGLETT, Species.GROWLITHE, Species.SLUGMA, Species.MAGBY, Species.POOCHYENA, Species.ZIGZAGOON, Species.NUMEL, Species.TORKOAL, Species.BALTOY ], - [TrainerPoolTier.UNCOMMON]: [ Species.RHYHORN, Species.GLIGAR, Species.PHANPY, Species.SOLROCK, Species.HIPPOPOTAS, Species.HEATMOR, Species.ROLYCOLY, Species.SILICOBRA ], - [TrainerPoolTier.RARE]: [ Species.ARON, Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.TURTONATOR, Species.TOEDSCOOL, Species.HISUI_GROWLITHE ], - [TrainerPoolTier.SUPER_RARE]: [ Species.CHARCADET, Species.CAPSAKID ] - }), - [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.QWILFISH, Species.REMORAID, Species.ZIGZAGOON, Species.LOTAD, Species.CARVANHA, Species.WAILMER, Species.BARBOACH, Species.CORPHISH, Species.SPHEAL ], - [TrainerPoolTier.UNCOMMON]: [ Species.TENTACOOL, Species.HORSEA, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.AZURILL, Species.CLAMPERL, Species.CLOBBOPUS ], - [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.SKRELP, Species.DHELMISE, Species.ARROKUDA, Species.HISUI_QWILFISH, Species.PALDEA_WOOPER ], - [TrainerPoolTier.SUPER_RARE]: [ Species.BASCULEGION, Species.DONDOZO ] - }), - [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WURMPLE, Species.SHINX, Species.BURMY, Species.DRIFLOON, Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CROAGUNK, Species.CARNIVINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.YANMA, Species.GLIGAR, Species.SWINUB, Species.SKORUPI ], - [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL, Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.SUPER_RARE]: [ Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL ] - }), - [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.WOOBAT, Species.TYMPOLE, Species.SANDILE, Species.SCRAGGY, Species.TRUBBISH, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.TIMBURR, Species.VENIPEDE, Species.DARUMAKA, Species.FOONGUS, Species.FRILLISH, Species.JOLTIK, Species.KLINK, Species.CUBCHOO, Species.GOLETT ], - [TrainerPoolTier.RARE]: [ Species.DRILBUR, Species.ZORUA, Species.MIENFOO, Species.PAWNIARD, Species.BOUFFALANT, Species.RUFFLET, Species.VULLABY, Species.DURANT ], - [TrainerPoolTier.SUPER_RARE]: [ Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA ] - }), - [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.COLRESS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_boss", "plasma_2", [ Species.KLINKLANG ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_colress").setMixedBattleBgm("battle_colress").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PONYTA, Species.HOUNDOUR, Species.SKORUPI, Species.CROAGUNK, Species.SCRAGGY, Species.FLETCHLING, Species.SCATTERBUG, Species.LITLEO, Species.ESPURR, Species.INKAY ], - [TrainerPoolTier.UNCOMMON]: [ Species.POOCHYENA, Species.ELECTRIKE, Species.PURRLOIN, Species.FOONGUS, Species.PANCHAM, Species.BINACLE, Species.SKRELP, Species.CLAUNCHER, Species.HELIOPTILE, Species.PHANTUMP, Species.PUMPKABOO ], - [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ] - }), - [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CORSOLA, Species.LILLIPUP, Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF, Species.MORELULL, Species.BOUNSWEET, Species.COMFEY, Species.KOMALA, Species.TOGEDEMARU, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.ALOLA_EXEGGUTOR ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.CRABRAWLER, Species.ORICORIO, Species.CUTIEFLY, Species.WISHIWASHI, Species.MUDBRAY, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.PYUKUMUKU, Species.MINIOR, Species.BRUXISH, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.MAGNEMITE, Species.TURTONATOR, Species.MIMIKYU, Species.DRAMPA, Species.GALAR_CORSOLA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.PORYGON, Species.JANGMO_O ] - }), - [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.EKANS, Species.DROWZEE, Species.KOFFING, Species.SPINARAK, Species.SCRAGGY, Species.TRUBBISH, Species.MAREANIE, Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER ], - [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.GASTLY, Species.HOUNDOUR, Species.SABLEYE, Species.VENIPEDE, Species.SANDILE, Species.VULLABY, Species.PANCHAM, Species.FOMANTIS, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.WISHIWASHI, Species.SANDYGAST, Species.MIMIKYU, Species.DHELMISE, Species.NYMBLE ], - [TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ] - }), - [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.STEELIX, Species.MAWILE, Species.FERROSEED, Species.KLINK, Species.SKWOVET, Species.ROOKIDEE, Species.CRAMORANT, Species.CUFANT, Species.GALAR_MEOWTH, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.MAGNEMITE, Species.RIOLU, Species.DRILBUR, Species.APPLIN, Species.ARROKUDA, Species.SINISTEA, Species.HATENNA, Species.GALAR_PONYTA, Species.GALAR_YAMASK ], - [TrainerPoolTier.RARE]: [ Species.SCIZOR, Species.BELDUM, Species.HONEDGE, Species.FALINKS, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ] - }), - [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), - [TrainerType.STAR_GRUNT]: new TrainerConfig(++t).setHasGenders("Star Grunt Female").setHasDouble("Star Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.DUNSPARCE, Species.HOUNDOUR, Species.AZURILL, Species.GULPIN, Species.FOONGUS, Species.FLETCHLING, Species.LITLEO, Species.FLABEBE, Species.CRABRAWLER, Species.NYMBLE, Species.PAWMI, Species.FIDOUGH, Species.SQUAWKABILLY, Species.MASCHIFF, Species.SHROODLE, Species.KLAWF, Species.WIGLETT, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.KOFFING, Species.EEVEE, Species.GIRAFARIG, Species.RALTS, Species.TORKOAL, Species.SEVIPER, Species.SCRAGGY, Species.ZORUA, Species.MIMIKYU, Species.IMPIDIMP, Species.FALINKS, Species.CAPSAKID, Species.TINKATINK, Species.BOMBIRDIER, Species.CYCLIZAR, Species.FLAMIGO, Species.PALDEA_TAUROS ], - [TrainerPoolTier.RARE]: [ Species.MANKEY, Species.PAWNIARD, Species.CHARCADET, Species.FLITTLE, Species.VAROOM, Species.ORTHWORM ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.GIMMIGHOUL ] - }), - [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ], PokemonType.DARK).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Segin Starmobile - p.moveset = [ new PokemonMove(Moves.WICKED_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ], PokemonType.FIRE).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 2; // Schedar Starmobile - p.moveset = [ new PokemonMove(Moves.BLAZING_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ], PokemonType.POISON).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 3; // Navi Starmobile - p.moveset = [ new PokemonMove(Moves.NOXIOUS_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ], PokemonType.FAIRY).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 4; // Ruchbah Starmobile - p.moveset = [ new PokemonMove(Moves.MAGICAL_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ], PokemonType.FIGHTING).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 5; // Caph Starmobile - p.moveset = [ new PokemonMove(Moves.COMBAT_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, PokemonType.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, PokemonType.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, PokemonType.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, PokemonType.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, PokemonType.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, PokemonType.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, PokemonType.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, PokemonType.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, PokemonType.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, PokemonType.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, PokemonType.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, PokemonType.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, PokemonType.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, PokemonType.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, PokemonType.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, PokemonType.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, PokemonType.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, PokemonType.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, PokemonType.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, PokemonType.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, PokemonType.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, PokemonType.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, PokemonType.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"), - [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, PokemonType.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"), - [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, PokemonType.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, PokemonType.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, PokemonType.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, PokemonType.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, PokemonType.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, PokemonType.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, PokemonType.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, PokemonType.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, PokemonType.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, PokemonType.GRASS).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, PokemonType.FIRE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, PokemonType.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, PokemonType.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, PokemonType.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, PokemonType.POISON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, PokemonType.BUG).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, PokemonType.ELECTRIC).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, PokemonType.GROUND).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, PokemonType.FLYING).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, PokemonType.ICE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, PokemonType.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, PokemonType.BUG).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, PokemonType.ROCK).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, PokemonType.GRASS).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, PokemonType.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, PokemonType.FAIRY).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, PokemonType.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, PokemonType.ICE).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, PokemonType.GRASS).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, PokemonType.WATER).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, PokemonType.FIRE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, PokemonType.GHOST).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, PokemonType.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, PokemonType.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, PokemonType.ROCK).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, PokemonType.ICE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, PokemonType.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, PokemonType.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, PokemonType.BUG, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, PokemonType.GRASS, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, PokemonType.ELECTRIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, PokemonType.WATER, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, PokemonType.NORMAL, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, PokemonType.GHOST, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, PokemonType.PSYCHIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, PokemonType.ICE, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)) + .initForGymLeader(signatureSpecies["BROCK"], true, PokemonType.ROCK) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.MISTY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MISTY"], false, PokemonType.WATER) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LT_SURGE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LT_SURGE"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.ERIKA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ERIKA"], false, PokemonType.GRASS) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.JANINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JANINE"], false, PokemonType.POISON) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.SABRINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["SABRINA"], false, PokemonType.PSYCHIC) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BLAINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BLAINE"], true, PokemonType.FIRE) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.GIOVANNI]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GIOVANNI"], true, PokemonType.DARK) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.FALKNER]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FALKNER"], true, PokemonType.FLYING) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.BUGSY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BUGSY"], true, PokemonType.BUG) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.WHITNEY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WHITNEY"], false, PokemonType.NORMAL) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.MORTY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MORTY"], true, PokemonType.GHOST) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CHUCK]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHUCK"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.JASMINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JASMINE"], false, PokemonType.STEEL) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.PRYCE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["PRYCE"], true, PokemonType.ICE) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CLAIR]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLAIR"], false, PokemonType.DRAGON) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.ROXANNE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROXANNE"], false, PokemonType.ROCK) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.BRAWLY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRAWLY"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WATTSON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WATTSON"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.FLANNERY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FLANNERY"], false, PokemonType.FIRE) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.NORMAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["NORMAN"], true, PokemonType.NORMAL) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WINONA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WINONA"], false, PokemonType.FLYING) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.TATE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["TATE"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym") + .setHasDouble("tate_liza_double") + .setDoubleTrainerType(TrainerType.LIZA) + .setDoubleTitle("gym_leader_double"), + [TrainerType.LIZA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LIZA"], false, PokemonType.PSYCHIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym") + .setHasDouble("liza_tate_double") + .setDoubleTrainerType(TrainerType.TATE) + .setDoubleTitle("gym_leader_double"), + [TrainerType.JUAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JUAN"], true, PokemonType.WATER) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.ROARK]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROARK"], true, PokemonType.ROCK) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.GARDENIA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GARDENIA"], false, PokemonType.GRASS) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.MAYLENE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MAYLENE"], false, PokemonType.FIGHTING) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, PokemonType.WATER) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FANTINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FANTINA"], false, PokemonType.GHOST) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BYRON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BYRON"], true, PokemonType.STEEL) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CANDICE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CANDICE"], false, PokemonType.ICE) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.VOLKNER]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VOLKNER"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CILAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CILAN"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHILI]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHILI"], true, PokemonType.FIRE) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CRESS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CRESS"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHEREN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHEREN"], true, PokemonType.NORMAL) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.LENORA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LENORA"], false, PokemonType.NORMAL) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ROXIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROXIE"], false, PokemonType.POISON) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BURGH]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BURGH"], true, PokemonType.BUG) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ELESA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ELESA"], false, PokemonType.ELECTRIC) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CLAY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLAY"], true, PokemonType.GROUND) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.SKYLA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["SKYLA"], false, PokemonType.FLYING) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BRYCEN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRYCEN"], true, PokemonType.ICE) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.DRAYDEN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["DRAYDEN"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.MARLON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MARLON"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.VIOLA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VIOLA"], false, PokemonType.BUG) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.GRANT]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GRANT"], true, PokemonType.ROCK) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.KORRINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KORRINA"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.RAMOS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["RAMOS"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.CLEMONT]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLEMONT"], true, PokemonType.ELECTRIC) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.VALERIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VALERIE"], false, PokemonType.FAIRY) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.OLYMPIA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["OLYMPIA"], false, PokemonType.PSYCHIC) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.WULFRIC]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WULFRIC"], true, PokemonType.ICE) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.MILO]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MILO"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.NESSA]: new TrainerConfig(++t) + .setName("Nessa") + .initForGymLeader(signatureSpecies["NESSA"], false, PokemonType.WATER) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KABU]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KABU"], true, PokemonType.FIRE) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEA]: new TrainerConfig(++t) + .setName("Bea") + .initForGymLeader(signatureSpecies["BEA"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.ALLISTER]: new TrainerConfig(++t) + .setName("Allister") + .initForGymLeader(signatureSpecies["ALLISTER"], true, PokemonType.GHOST) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.OPAL]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["OPAL"], false, PokemonType.FAIRY) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEDE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BEDE"], true, PokemonType.FAIRY) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.GORDIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GORDIE"], true, PokemonType.ROCK) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MELONY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MELONY"], false, PokemonType.ICE) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.PIERS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["PIERS"], true, PokemonType.DARK) + .setHasDouble("piers_marnie_double") + .setDoubleTrainerType(TrainerType.MARNIE) + .setDoubleTitle("gym_leader_double") + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MARNIE]: new TrainerConfig(++t) + .setName("Marnie") + .initForGymLeader(signatureSpecies["MARNIE"], false, PokemonType.DARK) + .setHasDouble("marnie_piers_double") + .setDoubleTrainerType(TrainerType.PIERS) + .setDoubleTitle("gym_leader_double") + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.RAIHAN]: new TrainerConfig(++t) + .setName("Raihan") + .initForGymLeader(signatureSpecies["RAIHAN"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KATY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KATY"], false, PokemonType.BUG, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BRASSIUS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRASSIUS"], true, PokemonType.GRASS, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.IONO]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["IONO"], false, PokemonType.ELECTRIC, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KOFU]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KOFU"], true, PokemonType.WATER, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.LARRY]: new TrainerConfig(++t) + .setName("Larry") + .initForGymLeader(signatureSpecies["LARRY"], true, PokemonType.NORMAL, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.RYME]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["RYME"], false, PokemonType.GHOST, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.TULIP]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["TULIP"], false, PokemonType.PSYCHIC, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.GRUSHA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GRUSHA"], true, PokemonType.ICE, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, PokemonType.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, PokemonType.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, PokemonType.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, PokemonType.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, PokemonType.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, PokemonType.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, PokemonType.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, PokemonType.DARK).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, PokemonType.GHOST).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, PokemonType.ICE).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, PokemonType.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, PokemonType.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, PokemonType.FIRE, 3).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, PokemonType.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, PokemonType.GHOST).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, PokemonType.FIGHTING).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, PokemonType.DARK).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, PokemonType.PSYCHIC).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, PokemonType.FIRE).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, PokemonType.WATER).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, PokemonType.STEEL).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, PokemonType.DRAGON).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, PokemonType.FIGHTING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, PokemonType.STEEL).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, PokemonType.ROCK).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, PokemonType.GHOST).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, PokemonType.FLYING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, PokemonType.DARK).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, PokemonType.WATER).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, PokemonType.GHOST).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, PokemonType.GROUND, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, PokemonType.STEEL, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, PokemonType.FLYING, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, PokemonType.DRAGON, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, PokemonType.FIRE, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, PokemonType.STEEL, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, PokemonType.FAIRY, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, PokemonType.DRAGON, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)) + .initForEliteFour(signatureSpecies["LORELEI"], false, PokemonType.ICE) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BRUNO]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["BRUNO"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.AGATHA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AGATHA"], false, PokemonType.GHOST) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LANCE]: new TrainerConfig(++t) + .setName("Lance") + .initForEliteFour(signatureSpecies["LANCE"], true, PokemonType.DRAGON) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.WILL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["WILL"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KOGA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KOGA"], true, PokemonType.POISON) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KAREN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KAREN"], false, PokemonType.DARK) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.SIDNEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SIDNEY"], true, PokemonType.DARK) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.PHOEBE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["PHOEBE"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.GLACIA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["GLACIA"], false, PokemonType.ICE) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.DRAKE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRAKE"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.AARON]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AARON"], true, PokemonType.BUG) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BERTHA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["BERTHA"], false, PokemonType.GROUND) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FLINT]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["FLINT"], true, PokemonType.FIRE, 3) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.LUCIAN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["LUCIAN"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.SHAUNTAL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SHAUNTAL"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MARSHAL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MARSHAL"], true, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.GRIMSLEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["GRIMSLEY"], true, PokemonType.DARK) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.CAITLIN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["CAITLIN"], false, PokemonType.PSYCHIC) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MALVA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MALVA"], false, PokemonType.FIRE) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.SIEBOLD]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SIEBOLD"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.WIKSTROM]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["WIKSTROM"], true, PokemonType.STEEL) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.DRASNA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRASNA"], false, PokemonType.DRAGON) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.HALA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["HALA"], true, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MOLAYNE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MOLAYNE"], true, PokemonType.STEEL) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.OLIVIA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["OLIVIA"], false, PokemonType.ROCK) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.ACEROLA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["ACEROLA"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.KAHILI]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KAHILI"], false, PokemonType.FLYING) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t) + .setName("Marnie") + .initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, PokemonType.DARK) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.NESSA_ELITE]: new TrainerConfig(++t) + .setName("Nessa") + .initForEliteFour(signatureSpecies["NESSA_ELITE"], false, PokemonType.WATER) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.BEA_ELITE]: new TrainerConfig(++t) + .setName("Bea") + .initForEliteFour(signatureSpecies["BEA_ELITE"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t) + .setName("Allister") + .initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, PokemonType.GHOST) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t) + .setName("Raihan") + .initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RIKA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["RIKA"], false, PokemonType.GROUND, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.POPPY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["POPPY"], false, PokemonType.STEEL, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t) + .setName("Larry") + .initForEliteFour(signatureSpecies["LARRY_ELITE"], true, PokemonType.FLYING, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.HASSEL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["HASSEL"], true, PokemonType.DRAGON, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.CRISPIN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["CRISPIN"], true, PokemonType.FIRE, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.AMARYS]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AMARYS"], false, PokemonType.STEEL, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LACEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["LACEY"], false, PokemonType.FAIRY, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.DRAYTON]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRAYTON"], true, PokemonType.DRAGON, 5) + .setMixedBattleBgm("battle_bb_elite"), - [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MACHAMP ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HO_OH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR, Species.ELECTIVIRE, Species.MAGMORTAR ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARCANINE, Species.EXEGGUTOR, Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.PIDGEOT ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Pidgeot - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.MALE; - })) + [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)) + .initForChampion(true) + .setBattleBgm("battle_kanto_champion") + .setMixedBattleBgm("battle_kanto_champion") + .setHasDouble("blue_red_double") + .setDoubleTrainerType(TrainerType.RED) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALAKAZAM])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MACHAMP])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.HO_OH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.RHYPERIOR, Species.ELECTIVIRE, Species.MAGMORTAR])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.ARCANINE, Species.EXEGGUTOR, Species.GYARADOS], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Pidgeot + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar - [TrainerType.RED]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PIKACHU ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 8; // G-Max Pikachu - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESPEON, Species.UMBREON, Species.SYLVEON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.LUGIA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SNORLAX ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Venusaur, Mega Charizard X, or Mega Blastoise - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.MALE; - })) + [TrainerType.RED]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_johto_champion") + .setMixedBattleBgm("battle_johto_champion") + .setHasDouble("red_blue_double") + .setDoubleTrainerType(TrainerType.BLUE) + .setDoubleTitle("champion_double") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => { + p.formIndex = 8; // G-Max Pikachu + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ESPEON, Species.UMBREON, Species.SYLVEON])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.LUGIA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SNORLAX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc( + [Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], + TrainerSlot.TRAINER, + true, + p => { + p.formIndex = 1; // Mega Venusaur, Mega Charizard X, or Mega Blastoise + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }, + ), + ) .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr - [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.KINGDRA ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AERODACTYL ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Salamence - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { - p.teraType = PokemonType.DRAGON; - p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.setBoss(true, 2); - })) + [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t) + .setName("Lance") + .initForChampion(true) + .setBattleBgm("battle_johto_champion") + .setMixedBattleBgm("battle_johto_champion") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GYARADOS, Species.KINGDRA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.AERODACTYL])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SALAMENCE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Salamence + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.CHARIZARD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O], TrainerSlot.TRAINER, true, p => { + p.teraType = PokemonType.DRAGON; + p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DRAGONITE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) .setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o - [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SKARMORY ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CRADILY, Species.ARMALDO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AGGRON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOLURK, Species.RUNERIGUS ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.REGIROCK, Species.REGICE, Species.REGISTEEL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.METAGROSS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Metagross - p.generateAndPopulateMoveset(); - p.generateName(); - })) + [TrainerType.STEVEN]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_hoenn_champion_g5") + .setMixedBattleBgm("battle_hoenn_champion_g6") + .setHasDouble("steven_wallace_double") + .setDoubleTrainerType(TrainerType.WALLACE) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CRADILY, Species.ARMALDO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AGGRON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOLURK, Species.RUNERIGUS])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.REGIROCK, Species.REGICE, Species.REGISTEEL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Metagross + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel - [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 1; // Drizzle - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LUDICOLO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.LATIAS, Species.LATIOS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Latios or Mega Latias - p.generateAndPopulateMoveset(); - p.generateName(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SWAMPERT, Species.GASTRODON, Species.SEISMITOAD ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.REGIELEKI, Species.REGIDRAGO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MILOTIC ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - p.setBoss(true, 2); - })) + [TrainerType.WALLACE]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_hoenn_champion_g5") + .setMixedBattleBgm("battle_hoenn_champion_g6") + .setHasDouble("wallace_steven_double") + .setDoubleTrainerType(TrainerType.STEVEN) + .setDoubleTitle("champion_double") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Drizzle + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LUDICOLO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Latios or Mega Latias + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SWAMPERT, Species.GASTRODON, Species.SEISMITOAD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.REGIELEKI, Species.REGIDRAGO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.MILOTIC], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + p.setBoss(true, 2); + }), + ) .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago - [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SPIRITOMB ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LUCARIO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GIRATINA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.type1; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TOGEKISS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GARCHOMP ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Garchomp - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.FEMALE; - })) + [TrainerType.CYNTHIA]: new TrainerConfig(++t) + .initForChampion(false) + .setBattleBgm("battle_sinnoh_champion") + .setMixedBattleBgm("battle_sinnoh_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.SPIRITOMB], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LUCARIO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GIRATINA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc( + [Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.TOGEKISS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Garchomp + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.FEMALE; + }), + ) .setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine - [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BOUFFALANT, Species.BRAVIARY ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.ZEKROM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KELDEO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.speciesId === Species.KROOKODILE ? PokemonType.DARK : p.species.type1; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.VOLCARONA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.setBoss(true, 2); - })) + [TrainerType.ALDER]: new TrainerConfig(++t) + .initForChampion(true) + .setHasDouble("alder_iris_double") + .setDoubleTrainerType(TrainerType.IRIS) + .setDoubleTitle("champion_double") + .setBattleBgm("battle_champion_alder") + .setMixedBattleBgm("battle_champion_alder") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }, + ), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.ZEKROM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.KELDEO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = p.species.speciesId === Species.KROOKODILE ? PokemonType.DARK : p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.VOLCARONA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) .setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr - [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.DRUDDIGON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ARCHEOPS ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RESHIRAM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { - p.teraType = PokemonType.DRAGON; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // G-Max Lapras - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HAXORUS ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 1; // Mold Breaker - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - p.setBoss(true, 2); - })) + [TrainerType.IRIS]: new TrainerConfig(++t) + .initForChampion(false) + .setBattleBgm("battle_champion_iris") + .setMixedBattleBgm("battle_champion_iris") + .setHasDouble("iris_alder_double") + .setDoubleTrainerType(TrainerType.ALDER) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRUDDIGON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ARCHEOPS])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.RESHIRAM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc( + [Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = PokemonType.DRAGON; + }, + ), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // G-Max Lapras + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HAXORUS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Mold Breaker + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + p.setBoss(true, 2); + }), + ) .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon - [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_kalos_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.HAWLUCHA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TREVENANT, Species.GOURGEIST ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.XERNEAS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TYRANTRUM, Species.AURORUS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus - p.teraType = p.species.type2!; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GARDEVOIR ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Gardevoir - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.FEMALE; - })) + [TrainerType.DIANTHA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_kalos_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.HAWLUCHA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TREVENANT, Species.GOURGEIST])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.XERNEAS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TYRANTRUM, Species.AURORUS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus + p.teraType = p.species.type2!; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GOODRA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Gardevoir + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.FEMALE; + }), + ) .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus - [TrainerType.KUKUI]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kukui") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 2; // Dusk Lycanroc - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE, Species.ALOLA_NINETALES ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Therian Formes - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TAPU_KOKO, Species.TAPU_FINI ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SNORLAX ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // G-Max Snorlax - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.HISUI_DECIDUEYE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.teraType = p.species.type2!; - })) + [TrainerType.KUKUI]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_champion_kukui") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 2; // Dusk Lycanroc + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MAGNEZONE, Species.ALOLA_NINETALES])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc( + [Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS], + TrainerSlot.TRAINER, + true, + p => { + p.formIndex = 1; // Therian Formes + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }, + ), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TAPU_KOKO, Species.TAPU_FINI], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SNORLAX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Snorlax + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.INCINEROAR, Species.HISUI_DECIDUEYE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.teraType = p.species.type2!; + }), + ) .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye - [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_alola_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NOIVERN ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SOLGALEO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TAPU_LELE, Species.TAPU_BULU ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = p.species.type1; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ZYGARDE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Zygarde 10% forme, Aura Break - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DECIDUEYE, Species.PRIMARINA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; - })) + [TrainerType.HAU]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_alola_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.NOIVERN])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SOLGALEO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TAPU_LELE, Species.TAPU_BULU], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = p.species.type1; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ZYGARDE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Zygarde 10% forme, Aura Break + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DECIDUEYE, Species.PRIMARINA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; + }), + ) .setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu - [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_galar_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.RHYPERIOR, Species.SEISMITOAD, Species.MR_RIME ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.ZACIAN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGAPULT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CHARIZARD ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 3; // G-Max Charizard - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.MALE; - })) + [TrainerType.LEON]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_galar_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.AEGISLASH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.RHYPERIOR, Species.SEISMITOAD, Species.MR_RIME])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.ZACIAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAGAPULT])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.RILLABOOM, Species.CINDERACE, Species.INTELEON], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => { + p.formIndex = 3; // G-Max Charizard + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) .setInstantTera(3), // Tera Dragapult to Ghost or Dragon - [TrainerType.MUSTARD]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_mustard") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = PokemonType.PSYCHIC; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_DARMANITAN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BLASTOISE, Species.VENUSAUR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.URSHIFU ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(2, 2); // Random G-Max Urshifu - p.generateAndPopulateMoveset(); - p.generateName(); - p.gender = Gender.MALE; - p.pokeball = PokeballType.ULTRA_BALL; - })) + [TrainerType.MUSTARD]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_mustard") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.KOMMO_O], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = PokemonType.PSYCHIC; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.GALAR_DARMANITAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.BLASTOISE, Species.VENUSAUR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.URSHIFU], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(2, 2); // Random G-Max Urshifu + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) .setInstantTera(2), // Tera Psychic Galar-Slowbro / Galar-Slowking - [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_geeta") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.setBoss(true, 2); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESPATHRA, Species.VELUZA ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MIRAIDON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.BAXCALIBUR ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KINGAMBIT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Supreme Overlord - p.teraType = PokemonType.FLYING; - })) + [TrainerType.GEETA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_champion_geeta") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ESPATHRA, Species.VELUZA])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.MIRAIDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.BAXCALIBUR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KINGAMBIT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Supreme Overlord + p.teraType = PokemonType.FLYING; + }), + ) .setInstantTera(5), // Tera Flying Kingambit - [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_nemona") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 0; // Midday form - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PAWMOT ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KORAIDON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GHOLDENGO ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.type2!; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.setBoss(true, 2); - })) + [TrainerType.NEMONA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_champion_nemona") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => { + p.formIndex = 0; // Midday form + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PAWMOT])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.KORAIDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GHOLDENGO])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ARMAROUGE, Species.CERULEDGE], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type2!; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc( + [Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }, + ), + ) .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge - [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kieran") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.GRIMMSNARL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = p.species.speciesId === Species.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TERAPAGOS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.URSALUNA, Species.BLOODMOON_URSALUNA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.OGERPON ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(4); // Random Ogerpon Tera Mask - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.IVY_CUDGEL)) { // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. - p.moveset[0] = new PokemonMove(Moves.IVY_CUDGEL); - } - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDRAPPLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.setBoss(true, 2); - })) + [TrainerType.KIERAN]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_champion_kieran") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.POLIWRATH, Species.POLITOED], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.INCINEROAR, Species.GRIMMSNARL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = p.species.speciesId === Species.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.TERAPAGOS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.URSALUNA, Species.BLOODMOON_URSALUNA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.OGERPON], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(4); // Random Ogerpon Tera Mask + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.IVY_CUDGEL)) { + // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. + p.moveset[0] = new PokemonMove(Moves.IVY_CUDGEL); + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HYDRAPPLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) .setInstantTera(4), // Tera Ogerpon - [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) - .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) - .setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM, () => modifierTypes.CATCHING_CHARM) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true, - (p => p.abilityIndex = 0))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)), - [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) + [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL) + .setModifierRewardFuncs( + () => modifierTypes.SUPER_EXP_CHARM, + () => modifierTypes.EXP_SHARE, + ) + .setEventModifierRewardFuncs( + () => modifierTypes.SHINY_CHARM, + () => modifierTypes.ABILITY_CHARM, + () => modifierTypes.CATCHING_CHARM, + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.CHIKORITA, + Species.CYNDAQUIL, + Species.TOTODILE, + Species.TREECKO, + Species.TORCHIC, + Species.MUDKIP, + Species.TURTWIG, + Species.CHIMCHAR, + Species.PIPLUP, + Species.SNIVY, + Species.TEPIG, + Species.OSHAWOTT, + Species.CHESPIN, + Species.FENNEKIN, + Species.FROAKIE, + Species.ROWLET, + Species.LITTEN, + Species.POPPLIO, + Species.GROOKEY, + Species.SCORBUNNY, + Species.SOBBLE, + Species.SPRIGATITO, + Species.FUECOCO, + Species.QUAXLY, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEY, + Species.HOOTHOOT, + Species.TAILLOW, + Species.STARLY, + Species.PIDOVE, + Species.FLETCHLING, + Species.PIKIPEK, + Species.ROOKIDEE, + Species.WATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ), + [TrainerType.RIVAL_2]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setMoneyMultiplier(1.25) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL_2) .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) .setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true, - (p => p.abilityIndex = 0))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), - [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - (p => p.abilityIndex = 0))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.IVYSAUR, + Species.CHARMELEON, + Species.WARTORTLE, + Species.BAYLEEF, + Species.QUILAVA, + Species.CROCONAW, + Species.GROVYLE, + Species.COMBUSKEN, + Species.MARSHTOMP, + Species.GROTLE, + Species.MONFERNO, + Species.PRINPLUP, + Species.SERVINE, + Species.PIGNITE, + Species.DEWOTT, + Species.QUILLADIN, + Species.BRAIXEN, + Species.FROGADIER, + Species.DARTRIX, + Species.TORRACAT, + Species.BRIONNE, + Species.THWACKEY, + Species.RABOOT, + Species.DRIZZILE, + Species.FLORAGATO, + Species.CROCALOR, + Species.QUAXWELL, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOTTO, + Species.HOOTHOOT, + Species.TAILLOW, + Species.STARAVIA, + Species.TRANQUILL, + Species.FLETCHINDER, + Species.TRUMBEAK, + Species.CORVISQUIRE, + Species.WATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ), + [TrainerType.RIVAL_3]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL_3) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) .setSpeciesFilter(species => species.baseTotal >= 540), - [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) + [TrainerType.RIVAL_4]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(1.75) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival_2") + .setMixedBattleBgm("battle_rival_2") + .setPartyTemplates(trainerPartyTemplates.RIVAL_4) .setModifierRewardFuncs(() => modifierTypes.TERA_ORB) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - (p => { - p.abilityIndex = 0; - p.teraType = p.species.type1; - }))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 0; + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) .setSpeciesFilter(species => species.baseTotal >= 540) .setInstantTera(0), // Tera starter to primary type - [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - p => { - p.setBoss(true, 2); - p.abilityIndex = 0; - p.teraType = p.species.type1; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) + [TrainerType.RIVAL_5]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival_3") + .setMixedBattleBgm("battle_rival_3") + .setPartyTemplates(trainerPartyTemplates.RIVAL_5) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.abilityIndex = 0; + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.pokeball = PokeballType.MASTER_BALL; - p.shiny = true; - p.variant = 1; - })) - .setInstantTera(0), // Tera starter to primary type - [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - p => { + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); - p.abilityIndex = 0; - p.teraType = p.species.type1; - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, - p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) + p.pokeball = PokeballType.MASTER_BALL; + p.shiny = true; + p.variant = 1; + }), + ) + .setInstantTera(0), // Tera starter to primary type + [TrainerType.RIVAL_6]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(3) + .setEncounterBgm("final") + .setBattleBgm("battle_rival_3") + .setMixedBattleBgm("battle_rival_3") + .setPartyTemplates(trainerPartyTemplates.RIVAL_6) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 3); + p.abilityIndex = 0; + p.teraType = p.species.type1; + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - p.shiny = true; - p.variant = 1; - p.formIndex = 1; // Mega Rayquaza - p.generateName(); - })) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { + p.setBoss(); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.shiny = true; + p.variant = 1; + p.formIndex = 1; // Mega Rayquaza + p.generateName(); + }), + ) .setInstantTera(0), // Tera starter to primary type - [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOQUEEN, Species.NIDOKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Kangaskhan - p.generateName(); - })), - [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { - if (p.species.speciesId === Species.GASTRODON) { - p.abilityIndex = 0; // Storm Drain - } else if (p.species.speciesId === Species.SEISMITOAD) { - p.abilityIndex = 2; // Water Absorb - } - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (p.species.speciesId === Species.GARCHOMP) { - p.abilityIndex = 2; // Rough Skin - } else if (p.species.speciesId === Species.EXCADRILL) { - p.abilityIndex = 0; // Sand Rush - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.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([ Species.MEWTWO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TALONFLAME ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Drought - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DONPHAN ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Camerupt - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYPHLOSION, Species.SOLROCK ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NINETALES, Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.NINETALES) { - p.abilityIndex = 2; // Drought - } else if (p.species.speciesId === Species.TORKOAL) { - p.abilityIndex = 1; // Drought - } - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Chlorophyll - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Camerupt - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUDICOLO ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Drizzle - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.WAILORD ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.QWILFISH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Swift Swim - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Sharpedo - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUDICOLO, Species.EMPOLEON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.POLITOED) { - p.abilityIndex = 2; // Drizzle - } else if (p.species.speciesId === Species.PELIPPER) { - p.abilityIndex = 1; // Drizzle - } - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DHELMISE ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Swift Swim - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Sharpedo - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MAGNEZONE ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })), - [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", [], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CROBAT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DIALGA, Species.PALKIA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", []).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SEISMITOAD ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.EELEKTROSS ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAPION, Species.TOXICROAK ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })), - [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.RUNERIGUS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.JELLICENT, Species.BASCULEGION ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.formIndex = 0; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (p.species.speciesId === Species.HYDREIGON) { + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig((t = TrainerType.ROCKET_BOSS_GIOVANNI_1)) + .setName("Giovanni") + .initForEvilTeamLeader("Rocket Boss", []) + .setMixedBattleBgm("battle_rocket_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PERSIAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); p.gender = Gender.MALE; - } else if (p.species.speciesId === Species.IRON_JUGULIS) { - p.gender = Gender.GENDERLESS; - } - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === Species.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Sharpness - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyarados - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", [], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === Species.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.HISUI_GOODRA ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.IRON_VALIANT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyarados - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZYGARDE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - p.formIndex = 0; // 50% Forme, Aura Break - })), - [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })), - [TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SILVALLY ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(18); // Random Silvally Form - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.MULTI_ATTACK)) { // Check if Multi Attack is in the moveset, if not, replace the first move with Multi Attack. - p.moveset[0] = new PokemonMove(Moves.MULTI_ATTACK); - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 2; // Dawn Wings - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.YANMEGA, Species.LOKIX ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.YANMEGA) { - p.abilityIndex = 1; // Tinted Lens - } else if (p.species.speciesId === Species.LOKIX) { - p.abilityIndex = 2; // Tinted Lens - } - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.SCIZOR) { - p.abilityIndex = 1; // Technician - } else if (p.species.speciesId === Species.KLEAVOR) { - p.abilityIndex = 2; // Sharpness - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega Pinsir - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })), - [TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Anticipation - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CRAWDAUNT, Species.HISUI_SAMUROTT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Sharpness Hisuian Samurott, Adaptability Crawdaunt - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = Utils.randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive - if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.TECHNO_BLAST)) { // Check if Techno Blast is in the moveset, if not, replace the first move with Techno Blast. - p.moveset[0] = new PokemonMove(Moves.TECHNO_BLAST); - } - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; // Mega Pinsir - p.generateAndPopulateMoveset(); - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - })), - [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.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.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOZOLT, Species.DRACOVISH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.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([ Species.JOLTEON, Species.LEAFEON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.VAPOREON, Species.UMBREON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.ESPEON, Species.GLACEON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.FLAREON ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 2; // Pixilate - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.EEVEE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 2; // G-Max Eevee - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.HONCHKROW])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.NIDOQUEEN, Species.NIDOKING])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Kangaskhan + p.generateName(); + }), + ), + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t) + .setName("Giovanni") + .initForEvilTeamLeader("Rocket Boss", [], true) + .setMixedBattleBgm("battle_rocket_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.TYRANITAR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.GASTRODON, Species.SEISMITOAD], TrainerSlot.TRAINER, true, p => { + if (p.species.speciesId === Species.GASTRODON) { + p.abilityIndex = 0; // Storm Drain + } else if (p.species.speciesId === Species.SEISMITOAD) { + p.abilityIndex = 2; // Water Absorb + } + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GARCHOMP, Species.EXCADRILL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.GARCHOMP) { + p.abilityIndex = 2; // Rough Skin + } else if (p.species.speciesId === Species.EXCADRILL) { + p.abilityIndex = 0; // Sand Rush + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.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([Species.MEWTWO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MAXIE]: new TrainerConfig(++t) + .setName("Maxie") + .initForEvilTeamLeader("Magma Boss", []) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SOLROCK])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TALONFLAME])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.WEEZING, Species.GALAR_WEEZING])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drought + }), + ) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.DONPHAN])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Camerupt + p.generateName(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.MAXIE_2]: new TrainerConfig(++t) + .setName("Maxie") + .initForEvilTeamLeader("Magma Boss", [], true) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.TYPHLOSION, Species.SOLROCK], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.NINETALES, Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.NINETALES) { + p.abilityIndex = 2; // Drought + } else if (p.species.speciesId === Species.TORKOAL) { + p.abilityIndex = 1; // Drought + } + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SCOVILLAIN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Chlorophyll + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.GREAT_TUSK], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Camerupt + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GROUDON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.ARCHIE]: new TrainerConfig(++t) + .setName("Archie") + .initForEvilTeamLeader("Aqua Boss", []) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LUDICOLO])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drizzle + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MUK, Species.ALOLA_MUK])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.WAILORD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.QWILFISH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Swift Swim + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Sharpedo + p.generateName(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.ARCHIE_2]: new TrainerConfig(++t) + .setName("Archie") + .initForEvilTeamLeader("Aqua Boss", [], true) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LUDICOLO, Species.EMPOLEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.POLITOED, Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.POLITOED) { + p.abilityIndex = 2; // Drizzle + } else if (p.species.speciesId === Species.PELIPPER) { + p.abilityIndex = 1; // Drizzle + } + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DHELMISE])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.OVERQWIL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Swift Swim + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Sharpedo + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KYOGRE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.CYRUS]: new TrainerConfig(++t) + .setName("Cyrus") + .initForEvilTeamLeader("Galactic Boss", []) + .setMixedBattleBgm("battle_galactic_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GYARADOS])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.HISUI_BRAVIARY])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MAGNEZONE])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.UXIE, Species.MESPRIT, Species.AZELF])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Houndoom + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ), + [TrainerType.CYRUS_2]: new TrainerConfig(++t) + .setName("Cyrus") + .initForEvilTeamLeader("Galactic Boss", [], true) + .setMixedBattleBgm("battle_galactic_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CROBAT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MAGNEZONE])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.UXIE, Species.MESPRIT, Species.AZELF], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Houndoom + p.generateName(); + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DIALGA, Species.PALKIA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.GHETSIS]: new TrainerConfig(++t) + .setName("Ghetsis") + .initForEvilTeamLeader("Plasma Boss", []) + .setMixedBattleBgm("battle_plasma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.COFAGRIGUS])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.SEISMITOAD])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GALVANTULA, Species.EELEKTROSS])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAPION, Species.TOXICROAK])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.KINGAMBIT])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ), + [TrainerType.GHETSIS_2]: new TrainerConfig(++t) + .setName("Ghetsis") + .initForEvilTeamLeader("Plasma Boss", [], true) + .setMixedBattleBgm("battle_plasma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.RUNERIGUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.JELLICENT, Species.BASCULEGION], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.formIndex = 0; + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.KINGAMBIT])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.VOLCARONA, Species.IRON_MOTH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.HYDREIGON, Species.IRON_JUGULIS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.HYDREIGON) { + p.gender = Gender.MALE; + } else if (p.species.speciesId === Species.IRON_JUGULIS) { + p.gender = Gender.GENDERLESS; + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KYUREM], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.LYSANDRE]: new TrainerConfig(++t) + .setName("Lysandre") + .initForEvilTeamLeader("Flare Boss", []) + .setMixedBattleBgm("battle_flare_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MIENSHAO])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.TALONFLAME])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.PYROAR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.DRAGALGE, Species.CLAWITZER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GALLADE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Sharpness + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Gyarados + p.generateName(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t) + .setName("Lysandre") + .initForEvilTeamLeader("Flare Boss", [], true) + .setMixedBattleBgm("battle_flare_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PYROAR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.DRAGALGE, Species.CLAWITZER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.AEGISLASH, Species.HISUI_GOODRA])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.IRON_VALIANT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Gyarados + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.ZYGARDE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.formIndex = 0; // 50% Forme, Aura Break + }), + ), + [TrainerType.LUSAMINE]: new TrainerConfig(++t) + .setName("Lusamine") + .initForEvilTeamLeader("Aether Boss", []) + .setMixedBattleBgm("battle_aether_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLEFABLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LILLIGANT, Species.HISUI_LILLIGANT])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MILOTIC, Species.PRIMARINA])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.BEWEAR])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.NIHILEGO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ), + [TrainerType.LUSAMINE_2]: new TrainerConfig(++t) + .setName("Lusamine") + .initForEvilTeamLeader("Aether Boss", [], true) + .setMixedBattleBgm("battle_aether_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLEFABLE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MILOTIC, Species.PRIMARINA])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SILVALLY], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(18); // Random Silvally Form + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.MULTI_ATTACK)) { + // Check if Multi Attack is in the moveset, if not, replace the first move with Multi Attack. + p.moveset[0] = new PokemonMove(Moves.MULTI_ATTACK); + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.PHEROMOSA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.NIHILEGO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.NECROZMA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 2; // Dawn Wings + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.GUZMA]: new TrainerConfig(++t) + .setName("Guzma") + .initForEvilTeamLeader("Skull Boss", []) + .setMixedBattleBgm("battle_skull_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.YANMEGA, Species.LOKIX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.YANMEGA) { + p.abilityIndex = 1; // Tinted Lens + } else if (p.species.speciesId === Species.LOKIX) { + p.abilityIndex = 2; // Tinted Lens + } + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HERACROSS])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SCIZOR, Species.KLEAVOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.SCIZOR) { + p.abilityIndex = 1; // Technician + } else if (p.species.speciesId === Species.KLEAVOR) { + p.abilityIndex = 2; // Sharpness + } + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GALVANTULA, Species.VIKAVOLT])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.PINSIR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega Pinsir + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GOLISOPOD], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.GUZMA_2]: new TrainerConfig(++t) + .setName("Guzma") + .initForEvilTeamLeader("Skull Boss", [], true) + .setMixedBattleBgm("battle_skull_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.GOLISOPOD], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Anticipation + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUZZWOLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.CRAWDAUNT, Species.HISUI_SAMUROTT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Sharpness Hisuian Samurott, Adaptability Crawdaunt + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.XURKITREE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GENESECT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = Utils.randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.TECHNO_BLAST)) { + // Check if Techno Blast is in the moveset, if not, replace the first move with Techno Blast. + p.moveset[0] = new PokemonMove(Moves.TECHNO_BLAST); + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.PINSIR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; // Mega Pinsir + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ), + [TrainerType.ROSE]: new TrainerConfig(++t) + .setName("Rose") + .initForEvilTeamLeader("Macro Boss", []) + .setMixedBattleBgm("battle_macro_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.ESCAVALIER, Species.FERROTHORN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SIRFETCHD, Species.MR_RIME], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.KLINKLANG, Species.PERRSERKER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.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.ROSE_2]: new TrainerConfig(++t) + .setName("Rose") + .initForEvilTeamLeader("Macro Boss", [], true) + .setMixedBattleBgm("battle_macro_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.AEGISLASH, Species.GHOLDENGO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.DRACOZOLT, Species.DRACOVISH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.MELMETAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.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([Species.JOLTEON, Species.LEAFEON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VAPOREON, Species.UMBREON])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.ESPEON, Species.GLACEON])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.FLAREON])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Pixilate + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.EEVEE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 2; // G-Max Eevee + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) .setInstantTera(4), // Tera Fairy Sylveon - [TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.abilityIndex = 2; // Pixilate - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ROTOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.EEVEE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 2; - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - })) + [TrainerType.PENNY_2]: new TrainerConfig(++t) + .setName("Cassiopeia") + .initForEvilTeamLeader("Star Boss", [], true) + .setMixedBattleBgm("battle_star_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.abilityIndex = 2; // Pixilate + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.ROTOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.RAIKOU, Species.ENTEI, Species.SUICUNE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ZAMAZENTA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.EEVEE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 2; + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) .setInstantTera(0), // Tera Fairy Sylveon - [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer(true) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.COALOSSAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - if (p.species.speciesId === Species.VENUSAUR) { - p.formIndex = 2; // Gmax - p.abilityIndex = 2; // Venusaur gets Chlorophyll - } else { + [TrainerType.BUCK]: new TrainerConfig(++t) + .setName("Buck") + .initForStatTrainer(true) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLAYDOL], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.VENUSAUR, Species.COALOSSAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + if (p.species.speciesId === Species.VENUSAUR) { + p.formIndex = 2; // Gmax + p.abilityIndex = 2; // Venusaur gets Chlorophyll + } else { + p.formIndex = 1; // Gmax + } + p.generateName(); + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AGGRON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drought + }), + ) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GREAT_TUSK], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HEATRAN], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.CHERYL]: new TrainerConfig(++t) + .setName("Cheryl") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BLISSEY], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.SNORLAX, Species.LAPRAS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; p.formIndex = 1; // Gmax - } - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AGGRON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Drought - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HEATRAN ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer() - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BLISSEY ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SNORLAX, Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AUDINO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_HANDS ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CRESSELIA, Species.ENAMORUS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.ENAMORUS) { - p.formIndex = 1; // Therian p.generateName(); - } - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer() - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCANINE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CINDERACE, Species.INTELEON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AERODACTYL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGAPULT ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_BUNDLE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIELEKI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer() - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GENGAR, Species.HATTERENE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = p.species.speciesId === Species.GENGAR ? 2 : 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.MAGNEZONE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.LATIOS, Species.LATIAS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer(true) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUCARIO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.RILLABOOM, Species.CENTISKORCH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.ROARING_MOON ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.URSALUNA ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIGIGAS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.LANDORUS) { - p.formIndex = 1; // Therian + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AUDINO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega p.generateName(); - } - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.VICTOR]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victor") + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOODRA], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.IRON_HANDS], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CRESSELIA, Species.ENAMORUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.ENAMORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MARLEY]: new TrainerConfig(++t) + .setName("Marley") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCANINE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.CINDERACE, Species.INTELEON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAGAPULT], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.IRON_BUNDLE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.REGIELEKI], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MIRA]: new TrainerConfig(++t) + .setName("Mira") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ALAKAZAM], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.GENGAR, Species.HATTERENE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = p.species.speciesId === Species.GENGAR ? 2 : 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.FLUTTER_MANE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAGNEZONE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.LATIOS, Species.LATIAS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.RILEY]: new TrainerConfig(++t) + .setName("Riley") + .initForStatTrainer(true) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LUCARIO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.RILLABOOM, Species.CENTISKORCH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.TYRANITAR], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ROARING_MOON], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.URSALUNA], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.REGIGIGAS, Species.LANDORUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.LANDORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.VICTOR]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Victor") .setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6 .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VICTORIA]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victoria") + [TrainerType.VICTORIA]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Victoria") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VIVI]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vivi") + [TrainerType.VIVI]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vivi") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), - [TrainerType.VICKY]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vicky") + [TrainerType.VICKY]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vicky") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG), - [TrainerType.VITO]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vito") + [TrainerType.VITO]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vito") .setMoneyMultiplier(2) - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))), - [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + ), + ), + [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t) + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE)), - [TrainerType.EXPERT_POKEMON_BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(3).setEncounterBgm(TrainerType.ACE_TRAINER).setLocalizedName("Expert Pokemon Breeder") + [TrainerType.EXPERT_POKEMON_BREEDER]: new TrainerConfig(++t) + .setMoneyMultiplier(3) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setLocalizedName("Expert Pokemon Breeder") .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)), [TrainerType.FUTURE_SELF_M]: new TrainerConfig(++t) .setMoneyMultiplier(0) @@ -2943,6 +5987,5 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("mystery_encounter_weird_dream") .setVictoryBgm("mystery_encounter_weird_dream") .setLocalizedName("Future Self F") - .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)) + .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)), }; - diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index 8b0091d4398..c72356d88ae 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -6,7 +6,7 @@ class TrainerNameConfig { public femaleUrls: string[] | null; constructor(type: TrainerType, ...urls: string[]) { - this.urls = urls.length ? urls : [ Utils.toReadableString(TrainerType[type]).replace(/ /g, "_") ]; + this.urls = urls.length ? urls : [Utils.toReadableString(TrainerType[type]).replace(/ /g, "_")]; } hasGenderVariant(...femaleUrls: string[]): TrainerNameConfig { @@ -16,11 +16,11 @@ class TrainerNameConfig { } interface TrainerNameConfigs { - [key: number]: TrainerNameConfig + [key: number]: TrainerNameConfig; } // used in a commented code -// eslint-disable-next-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: Used by commented code const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.ACE_TRAINER]: new TrainerNameConfig(TrainerType.ACE_TRAINER), [TrainerType.ARTIST]: new TrainerNameConfig(TrainerType.ARTIST), @@ -71,65 +71,2663 @@ const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.VETERAN]: new TrainerNameConfig(TrainerType.VETERAN), [TrainerType.WAITER]: new TrainerNameConfig(TrainerType.WAITER).hasGenderVariant("Waitress"), [TrainerType.WORKER]: new TrainerNameConfig(TrainerType.WORKER), - [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass") + [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass"), }; export const trainerNamePools = { - [TrainerType.ACE_TRAINER]: [[ "Aaron", "Allen", "Blake", "Brian", "Gaven", "Jake", "Kevin", "Mike", "Nick", "Paul", "Ryan", "Sean", "Darin", "Albert", "Berke", "Clyde", "Edgar", "George", "Leroy", "Owen", "Parker", "Randall", "Ruben", "Samuel", "Vincent", "Warren", "Wilton", "Zane", "Alfred", "Braxton", "Felix", "Gerald", "Jonathan", "Leonel", "Marcel", "Mitchell", "Quincy", "Roderick", "Colby", "Rolando", "Yuji", "Abel", "Anton", "Arthur", "Cesar", "Dalton", "Dennis", "Ernest", "Garrett", "Graham", "Henry", "Isaiah", "Jonah", "Jose", "Keenan", "Micah", "Omar", "Quinn", "Rodolfo", "Saul", "Sergio", "Skylar", "Stefan", "Zachery", "Alton", "Arabella", "Bonita", "Cal", "Cody", "French", "Kobe", "Paulo", "Shaye", "Austin", "Beckett", "Charlie", "Corky", "David", "Dwayne", "Elmer", "Jesse", "Jared", "Johan", "Jordan", "Kipp", "Lou", "Terry", "Tom", "Webster", "Billy", "Doyle", "Enzio", "Geoff", "Grant", "Kelsey", "Miguel", "Pierce", "Ray", "Santino", "Shel", "Adelbert", "Bence", "Emil", "Evan", "Mathis", "Maxim", "Neil", "Rico", "Robbie", "Theo", "Viktor", "Benedict", "Cornelius", "Hisato", "Leopold", "Neville", "Vito", "Chase", "Cole", "Hiroshi", "Jackson", "Jim", "Kekoa", "Makana", "Yuki", "Elwood", "Seth", "Alvin", "Arjun", "Arnold", "Cameron", "Carl", "Carlton", "Christopher", "Dave", "Dax", "Dominic", "Edmund", "Finn", "Fred", "Garret", "Grayson", "Jace", "Jaxson", "Jay", "Jirard", "Johnson", "Kayden", "Kite", "Louis", "Mac", "Marty", "Percy", "Raymond", "Ronnie", "Satch", "Tim", "Zach", "Conner", "Vince", "Bedro", "Boda", "Botan", "Daras", "Dury", "Herton", "Rewn", "Stum", "Tock", "Trilo", "Berki", "Cruik", "Dazon", "Desid", "Dillot", "Farfin", "Forgon", "Hebel", "Morfon", "Moril", "Shadd", "Vanhub", "Bardo", "Carben", "Degin", "Gorps", "Klept", "Lask", "Malex", "Mopar", "Niled", "Noxon", "Teslor", "Tetil" ], [ "Beth", "Carol", "Cybil", "Emma", "Fran", "Gwen", "Irene", "Jenn", "Joyce", "Kate", "Kelly", "Lois", "Lola", "Megan", "Quinn", "Reena", "Cara", "Alexa", "Brooke", "Caroline", "Elaine", "Hope", "Jennifer", "Jody", "Julie", "Lori", "Mary", "Michelle", "Shannon", "Wendy", "Alexia", "Alicia", "Athena", "Carolina", "Cristin", "Darcy", "Dianne", "Halle", "Jazmyn", "Katelynn", "Keira", "Marley", "Allyson", "Kathleen", "Naomi", "Alyssa", "Ariana", "Brandi", "Breanna", "Brenda", "Brenna", "Catherine", "Clarice", "Dana", "Deanna", "Destiny", "Jamie", "Jasmin", "Kassandra", "Laura", "Maria", "Mariah", "Maya", "Meagan", "Mikayla", "Monique", "Natasha", "Olivia", "Sandra", "Savannah", "Sydney", "Moira", "Piper", "Salma", "Allison", "Beverly", "Cathy", "Cheyenne", "Clara", "Dara", "Eileen", "Glinda", "Junko", "Lena", "Lucille", "Mariana", "Olwen", "Shanta", "Stella", "Angi", "Belle", "Chandra", "Cora", "Eve", "Jacqueline", "Jeanne", "Juliet", "Kathrine", "Layla", "Lucca", "Melina", "Miki", "Nina", "Sable", "Shelly", "Summer", "Trish", "Vicki", "Alanza", "Cordelia", "Hilde", "Imelda", "Michele", "Mireille", "Claudia", "Constance", "Harriet", "Honor", "Melba", "Portia", "Alexis", "Angela", "Karla", "Lindsey", "Tori", "Sheri", "Jada", "Kailee", "Amanda", "Annie", "Kindra", "Kyla", "Sofia", "Yvette", "Becky", "Flora", "Gloria", "Buna", "Ferda", "Lehan", "Liqui", "Lomen", "Neira", "Atilo", "Detta", "Gilly", "Gosney", "Levens", "Moden", "Rask", "Rateis", "Rosno", "Tynan", "Veron", "Zoel", "Cida", "Dibsin", "Dodin", "Ebson", "Equin", "Flostin", "Gabsen", "Halsion", "Hileon", "Quelor", "Rapeel", "Roze", "Tensin" ]], - [TrainerType.ARTIST]: [[ "Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan" ], [ "Georgia" ]], - [TrainerType.BACKERS]: [[ "Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art" ], [ "Ai & Ciel", "Ami & Eira", "Cam & Abby", "Fey & Sue", "Kat & Phae", "Kay & Ali", "Ava & Aya", "Cleo & Rio", "May & Mal" ]], - [TrainerType.BACKPACKER]: [[ "Alexander", "Carlos", "Herman", "Jerome", "Keane", "Kelsey", "Kiyo", "Michael", "Nate", "Peter", "Sam", "Stephen", "Talon", "Terrance", "Toru", "Waylon", "Boone", "Clifford", "Ivan", "Kendall", "Lowell", "Randall", "Reece", "Roland", "Shane", "Walt", "Farid", "Heike", "Joren", "Lane", "Roderick", "Darnell", "Deon", "Emory", "Graeme", "Grayson", "Aitor", "Alex", "Arturo", "Asier", "Jaime", "Jonathan", "Julio", "Kevin", "Kosuke", "Lander", "Markel", "Mateo", "Nil", "Pau", "Samuel" ], [ "Anna", "Corin", "Elaine", "Emi", "Jill", "Kumiko", "Liz", "Lois", "Lora", "Molly", "Patty", "Ruth", "Vicki", "Annie", "Blossom", "Clara", "Eileen", "Mae", "Myra", "Rachel", "Tami", "Ashley", "Mikiko", "Kiana", "Perdy", "Maria", "Yuho", "Peren", "Barbara", "Diane" ]], - [TrainerType.BAKER]: [ "Chris", "Jenn", "Lilly" ], - [TrainerType.BEAUTY]: [ "Cassie", "Julia", "Olivia", "Samantha", "Valerie", "Victoria", "Bridget", "Connie", "Jessica", "Johanna", "Melissa", "Sheila", "Shirley", "Tiffany", "Namiko", "Thalia", "Grace", "Lola", "Lori", "Maura", "Tamia", "Cyndy", "Devon", "Gabriella", "Harley", "Lindsay", "Nicola", "Callie", "Charlotte", "Kassandra", "December", "Fleming", "Nikola", "Aimee", "Anais", "Brigitte", "Cassandra", "Andrea", "Brittney", "Carolyn", "Krystal", "Alexis", "Alice", "Aina", "Anya", "Arianna", "Aubrey", "Beverly", "Camille", "Beauty", "Evette", "Hansol", "Haruka", "Jill", "Jo", "Lana", "Lois", "Lucy", "Mai", "Nickie", "Nicole", "Prita", "Rose", "Shelly", "Suzy", "Tessa", "Anita", "Alissa", "Rita", "Cudsy", "Eloff", "Miru", "Minot", "Nevah", "Niven", "Ogoin" ], - [TrainerType.BIKER]: [ "Charles", "Dwayne", "Glenn", "Harris", "Joel", "Riley", "Zeke", "Alex", "Billy", "Ernest", "Gerald", "Hideo", "Isaac", "Jared", "Jaren", "Jaxon", "Jordy", "Lao", "Lukas", "Malik", "Nikolas", "Ricardo", "Ruben", "Virgil", "William", "Aiden", "Dale", "Dan", "Jacob", "Markey", "Reese", "Teddy", "Theron", "Jeremy", "Morgann", "Phillip", "Philip", "Stanley", "Dillon" ], - [TrainerType.BLACK_BELT]: [[ "Kenji", "Lao", "Lung", "Nob", "Wai", "Yoshi", "Atsushi", "Daisuke", "Hideki", "Hitoshi", "Kiyo", "Koichi", "Koji", "Yuji", "Cristian", "Rhett", "Takao", "Theodore", "Zander", "Aaron", "Hugh", "Mike", "Nicolas", "Shea", "Takashi", "Adam", "Carl", "Colby", "Darren", "David", "Davon", "Derek", "Eddie", "Gregory", "Griffin", "Jarrett", "Jeffery", "Kendal", "Kyle", "Luke", "Miles", "Nathaniel", "Philip", "Rafael", "Ray", "Ricky", "Sean", "Willie", "Ander", "Manford", "Benjamin", "Corey", "Edward", "Grant", "Jay", "Kendrew", "Kentaro", "Ryder", "Teppei", "Thomas", "Tyrone", "Andrey", "Donny", "Drago", "Gordon", "Grigor", "Jeriel", "Kenneth", "Martell", "Mathis", "Rich", "Rocky", "Rodrigo", "Wesley", "Zachery", "Alonzo", "Cadoc", "Gunnar", "Igor", "Killian", "Markus", "Ricardo", "Yanis", "Banting", "Clayton", "Duane", "Earl", "Greg", "Roy", "Terry", "Tracy", "Walter", "Alvaro", "Curtis", "Francis", "Ross", "Brice", "Cheng", "Dudley", "Eric", "Kano", "Masahiro", "Randy", "Ryuji", "Steve", "Tadashi", "Wong", "Yuen", "Brian", "Carter", "Reece", "Nick", "Yang" ], [ "Cora", "Cyndy", "Jill", "Laura", "Sadie", "Tessa", "Vivian", "Aisha", "Callie", "Danielle", "Helene", "Jocelyn", "Lilith", "Paula", "Reyna", "Helen", "Kelsey", "Tyler", "Amy", "Chandra", "Hillary", "Janie", "Lee", "Maggie", "Mikiko", "Miriam", "Sharon", "Susie", "Xiao", "Alize", "Azra", "Brenda", "Chalina", "Chan", "Glinda", "Maki", "Tia", "Tiffany", "Wendy", "Andrea", "Gabrielle", "Gerardine", "Hailey", "Hedvig", "Justine", "Kinsey", "Sigrid", "Veronique", "Tess" ]], - [TrainerType.BREEDER]: [[ "Isaac", "Myles", "Salvadore", "Albert", "Kahlil", "Eustace", "Galen", "Owen", "Addison", "Marcus", "Foster", "Cory", "Glenn", "Jay", "Wesley", "William", "Adrian", "Bradley", "Jaime" ], [ "Allison", "Alize", "Bethany", "Lily", "Lydia", "Gabrielle", "Jayden", "Pat", "Veronica", "Amber", "Jennifer", "Kaylee", "Adelaide", "Brooke", "Ethel", "April", "Irene", "Magnolia", "Amala", "Mercy", "Amanda", "Ikue", "Savannah", "Yuka", "Chloe", "Debra", "Denise", "Elena" ]], - [TrainerType.CLERK]: [[ "Chaz", "Clemens", "Doug", "Fredric", "Ivan", "Isaac", "Nelson", "Wade", "Warren", "Augustin", "Gilligan", "Cody", "Jeremy", "Shane", "Dugal", "Royce", "Ronald" ], [ "Alberta", "Ingrid", "Katie", "Piper", "Trisha", "Wren", "Britney", "Lana", "Jessica", "Kristen", "Michelle", "Gabrielle" ]], - [TrainerType.CYCLIST]: [[ "Axel", "James", "John", "Ryan", "Hector", "Jeremiah" ], [ "Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide" ]], - [TrainerType.DANCER]: [ "Brian", "Davey", "Dirk", "Edmond", "Mickey", "Raymond", "Cara", "Julia", "Maika", "Mireille", "Ronda", "Zoe" ], - [TrainerType.DEPOT_AGENT]: [ "Josh", "Hank", "Vincent" ], - [TrainerType.DOCTOR]: [[ "Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham" ], [ "Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah" ]], - [TrainerType.FIREBREATHER]: [ "Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt" ], - [TrainerType.FISHERMAN]: [ "Andre", "Arnold", "Barney", "Chris", "Edgar", "Henry", "Jonah", "Justin", "Kyle", "Martin", "Marvin", "Ralph", "Raymond", "Scott", "Stephen", "Wilton", "Tully", "Andrew", "Barny", "Carter", "Claude", "Dale", "Elliot", "Eugene", "Ivan", "Ned", "Nolan", "Roger", "Ronald", "Wade", "Wayne", "Darian", "Kai", "Chip", "Hank", "Kaden", "Tommy", "Tylor", "Alec", "Brett", "Cameron", "Cody", "Cole", "Cory", "Erick", "George", "Joseph", "Juan", "Kenneth", "Luc", "Miguel", "Travis", "Walter", "Zachary", "Josh", "Gideon", "Kyler", "Liam", "Murphy", "Bruce", "Damon", "Devon", "Hubert", "Jones", "Lydon", "Mick", "Pete", "Sean", "Sid", "Vince", "Bucky", "Dean", "Eustace", "Kenzo", "Leroy", "Mack", "Ryder", "Ewan", "Finn", "Murray", "Seward", "Shad", "Wharton", "Finley", "Fisher", "Fisk", "River", "Sheaffer", "Timin", "Carl", "Ernest", "Hal", "Herbert", "Hisato", "Mike", "Vernon", "Harriet", "Marina", "Chase" ], - [TrainerType.GUITARIST]: [ "Anna", "Beverly", "January", "Tina", "Alicia", "Claudia", "Julia", "Lidia", "Mireia", "Noelia", "Sara", "Sheila", "Tatiana" ], - [TrainerType.HARLEQUIN]: [ "Charley", "Ian", "Jack", "Kerry", "Louis", "Pat", "Paul", "Rick", "Anders", "Clarence", "Gary" ], - [TrainerType.HIKER]: [ "Anthony", "Bailey", "Benjamin", "Daniel", "Erik", "Jim", "Kenny", "Leonard", "Michael", "Parry", "Phillip", "Russell", "Sidney", "Tim", "Timothy", "Alan", "Brice", "Clark", "Eric", "Lenny", "Lucas", "Mike", "Trent", "Devan", "Eli", "Marc", "Sawyer", "Allen", "Daryl", "Dudley", "Earl", "Franklin", "Jeremy", "Marcos", "Nob", "Oliver", "Wayne", "Alexander", "Damon", "Jonathan", "Justin", "Kevin", "Lorenzo", "Louis", "Maurice", "Nicholas", "Reginald", "Robert", "Theodore", "Bruce", "Clarke", "Devin", "Dwight", "Edwin", "Eoin", "Noland", "Russel", "Andy", "Bret", "Darrell", "Gene", "Hardy", "Hugh", "Jebediah", "Jeremiah", "Kit", "Neil", "Terrell", "Don", "Doug", "Hunter", "Jared", "Jerome", "Keith", "Manuel", "Markus", "Otto", "Shelby", "Stephen", "Teppei", "Tobias", "Wade", "Zaiem", "Aaron", "Alain", "Bergin", "Bernard", "Brent", "Corwin", "Craig", "Delmon", "Dunstan", "Orestes", "Ross", "Davian", "Calhoun", "David", "Gabriel", "Ryan", "Thomas", "Travis", "Zachary", "Anuhea", "Barnaby", "Claus", "Collin", "Colson", "Dexter", "Dillan", "Eugine", "Farkas", "Hisato", "Julius", "Kenji", "Irwin", "Lionel", "Paul", "Richter", "Valentino", "Donald", "Douglas", "Kevyn", "Chester" ], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] - [TrainerType.HOOLIGANS]: [ "Jim & Cas", "Rob & Sal" ], - [TrainerType.HOOPSTER]: [ "Bobby", "John", "Lamarcus", "Derrick", "Nicolas" ], - [TrainerType.INFIELDER]: [ "Alex", "Connor", "Todd" ], - [TrainerType.JANITOR]: [ "Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn" ], - [TrainerType.LINEBACKER]: [ "Bob", "Dan", "Jonah" ], - [TrainerType.MAID]: [ "Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy" ], - [TrainerType.MUSICIAN]: [ "Boris", "Preston", "Charles", "Clyde", "Vincent", "Dalton", "Kirk", "Shawn", "Fabian", "Fernando", "Joseph", "Marcos", "Arturo", "Jerry", "Lonnie", "Tony" ], - [TrainerType.NURSERY_AIDE]: [ "Autumn", "Briana", "Leah", "Miho", "Ethel", "Hollie", "Ilse", "June", "Kimya", "Rosalyn" ], - [TrainerType.OFFICER]: [ "Dirk", "Keith", "Alex", "Bobby", "Caleb", "Danny", "Dylan", "Thomas", "Daniel", "Jeff", "Braven", "Dell", "Neagle", "Haruki", "Mitchell", "Raymond" ], - [TrainerType.PARASOL_LADY]: [ "Angelica", "Clarissa", "Madeline", "Akari", "Annabell", "Kayley", "Rachel", "Alexa", "Sabrina", "April", "Gwyneth", "Laura", "Lumi", "Mariah", "Melita", "Nicole", "Tihana", "Ingrid", "Tyra" ], - [TrainerType.PILOT]: [ "Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow" ], - [TrainerType.POKEFAN]: [[ "Alex", "Allan", "Brandon", "Carter", "Colin", "Derek", "Jeremy", "Joshua", "Rex", "Robert", "Trevor", "William", "Colton", "Miguel", "Francisco", "Kaleb", "Leonard", "Boone", "Elliot", "Jude", "Norbert", "Corey", "Gabe", "Baxter" ], [ "Beverly", "Georgia", "Jaime", "Ruth", "Isabel", "Marissa", "Vanessa", "Annika", "Bethany", "Kimberly", "Meredith", "Rebekah", "Eleanor", "Darcy", "Lydia", "Sachiko", "Abigail", "Agnes", "Lydie", "Roisin", "Tara", "Carmen", "Janet" ]], - [TrainerType.PRESCHOOLER]: [[ "Billy", "Doyle", "Evan", "Homer", "Tully", "Albert", "Buster", "Greg", "Ike", "Jojo", "Tyrone", "Adrian", "Oliver", "Hayden", "Hunter", "Kaleb", "Liam", "Dylan" ], [ "Juliet", "Mia", "Sarah", "Wendy", "Winter", "Chrissy", "Eva", "Lin", "Samantha", "Ella", "Lily", "Natalie", "Ailey", "Hannah", "Malia", "Kindra", "Nancy" ]], - [TrainerType.PSYCHIC]: [[ "Fidel", "Franklin", "Gilbert", "Greg", "Herman", "Jared", "Mark", "Nathan", "Norman", "Phil", "Richard", "Rodney", "Cameron", "Edward", "Fritz", "Joshua", "Preston", "Virgil", "William", "Alvaro", "Blake", "Cedric", "Keenan", "Nicholas", "Dario", "Johan", "Lorenzo", "Tyron", "Bryce", "Corbin", "Deandre", "Elijah", "Kody", "Landon", "Maxwell", "Mitchell", "Sterling", "Eli", "Nelson", "Vernon", "Gaven", "Gerard", "Low", "Micki", "Perry", "Rudolf", "Tommy", "Al", "Nandor", "Tully", "Arthur", "Emanuel", "Franz", "Harry", "Paschal", "Robert", "Sayid", "Angelo", "Anton", "Arin", "Avery", "Danny", "Frasier", "Harrison", "Jaime", "Ross", "Rui", "Vlad", "Mason" ], [ "Alexis", "Hannah", "Jacki", "Jaclyn", "Kayla", "Maura", "Samantha", "Alix", "Brandi", "Edie", "Macey", "Mariella", "Marlene", "Laura", "Rodette", "Abigail", "Brittney", "Chelsey", "Daisy", "Desiree", "Kendra", "Lindsey", "Rachael", "Valencia", "Belle", "Cybil", "Doreen", "Dua", "Future", "Lin", "Madhu", "Alia", "Ena", "Joyce", "Lynette", "Olesia", "Sarah" ]], - [TrainerType.RANGER]: [[ "Carlos", "Jackson", "Sebastian", "Gav", "Lorenzo", "Logan", "Nicolas", "Trenton", "Deshawn", "Dwayne", "Jeffery", "Kyler", "Taylor", "Alain", "Claude", "Crofton", "Forrest", "Harry", "Jaden", "Keith", "Lewis", "Miguel", "Pedro", "Ralph", "Richard", "Bret", "Daryl", "Eddie", "Johan", "Leaf", "Louis", "Maxwell", "Parker", "Rick", "Steve", "Bjorn", "Chaise", "Dean", "Lee", "Maurice", "Nash", "Ralf", "Reed", "Shinobu", "Silas" ], [ "Catherine", "Jenna", "Sophia", "Merdith", "Nora", "Beth", "Chelsea", "Katelyn", "Madeline", "Allison", "Ashlee", "Felicia", "Krista", "Annie", "Audra", "Brenda", "Chloris", "Eliza", "Heidi", "Irene", "Mary", "Mylene", "Shanti", "Shelly", "Thalia", "Anja", "Briana", "Dianna", "Elaine", "Elle", "Hillary", "Katie", "Lena", "Lois", "Malory", "Melita", "Mikiko", "Naoko", "Serenity", "Ambre", "Brooke", "Clementine", "Melina", "Petra", "Twiggy" ]], - [TrainerType.RICH]: [[ "Alfred", "Edward", "Gregory", "Preston", "Thomas", "Tucker", "Walter", "Clifford", "Everett", "Micah", "Nate", "Pierre", "Terrance", "Arthur", "Brooks", "Emanuel", "Lamar", "Jeremy", "Leonardo", "Milton", "Frederic", "Renaud", "Robert", "Yan", "Daniel", "Sheldon", "Stonewall", "Gerald", "Ronald", "Smith", "Stanley", "Reginald", "Orson", "Wilco", "Caden", "Glenn" ], [ "Rebecca", "Reina", "Cassandra", "Emilia", "Grace", "Marian", "Elizabeth", "Kathleen", "Sayuri", "Caroline", "Judy" ]], - [TrainerType.RICH_KID]: [[ "Garret", "Winston", "Dawson", "Enrique", "Jason", "Roman", "Trey", "Liam", "Anthony", "Brad", "Cody", "Manuel", "Martin", "Pierce", "Rolan", "Keenan", "Filbert", "Antoin", "Cyus", "Diek", "Dugo", "Flitz", "Jurek", "Lond", "Perd", "Quint", "Basto", "Benit", "Brot", "Denc", "Guyit", "Marcon", "Perc", "Puros", "Roex", "Sainz", "Symin", "Tark", "Venak" ], [ "Anette", "Brianna", "Cindy", "Colleen", "Daphne", "Elizabeth", "Naomi", "Sarah", "Charlotte", "Gillian", "Jacki", "Lady", "Melissa", "Celeste", "Colette", "Elizandra", "Isabel", "Lynette", "Magnolia", "Sophie", "Lina", "Dulcie", "Auro", "Brin", "Caril", "Eloos", "Gwin", "Illa", "Kowly", "Rima", "Ristin", "Vesey", "Brena", "Deasy", "Denslon", "Kylet", "Nemi", "Rene", "Sanol", "Stouner", "Sturk", "Talmen", "Zoila" ]], - [TrainerType.ROUGHNECK]: [ "Camron", "Corey", "Gabriel", "Isaiah", "Jamal", "Koji", "Luke", "Paxton", "Raul", "Zeek", "Kirby", "Chance", "Dave", "Fletcher", "Johnny", "Reese", "Joey", "Ricky", "Silvester", "Martin" ], - [TrainerType.SAILOR]: [ "Alberto", "Bost", "Brennan", "Brenden", "Claude", "Cory", "Damian", "Dirk", "Duncan", "Dwayne", "Dylan", "Eddie", "Edmond", "Elijah", "Ernest", "Eugene", "Garrett", "Golos", "Gratin", "Grestly", "Harry", "Hols", "Hudson", "Huey", "Jebol", "Jeff", "Leonald", "Luther", "Kelvin", "Kenneth", "Kent", "Knook", "Marc", "Mifis", "Monar", "Morkor", "Ordes", "Oxlin", "Parker", "Paul", "Philip", "Roberto", "Samson", "Skyler", "Stanly", "Tebu", "Terrell", "Trevor", "Yasu", "Zachariah" ], - [TrainerType.SCIENTIST]: [[ "Jed", "Marc", "Mitch", "Rich", "Ross", "Beau", "Braydon", "Connor", "Ed", "Ivan", "Jerry", "Jose", "Joshua", "Parker", "Rodney", "Taylor", "Ted", "Travis", "Zackery", "Darrius", "Emilio", "Fredrick", "Shaun", "Stefano", "Travon", "Daniel", "Garett", "Gregg", "Linden", "Lowell", "Trenton", "Dudley", "Luke", "Markus", "Nathan", "Orville", "Randall", "Ron", "Ronald", "Simon", "Steve", "William", "Franklin", "Clarke", "Jacques", "Terrance", "Ernst", "Justus", "Ikaika", "Jayson", "Kyle", "Reid", "Tyrone", "Adam", "Albert", "Alphonse", "Cory", "Donnie", "Elton", "Francis", "Gordon", "Herbert", "Humphrey", "Jordan", "Julian", "Keaton", "Levi", "Melvin", "Murray", "West", "Craig", "Coren", "Dubik", "Kotan", "Lethco", "Mante", "Mort", "Myron", "Odlow", "Ribek", "Roeck", "Vogi", "Vonder", "Zogo", "Doimo", "Doton", "Durel", "Hildon", "Kukla", "Messa", "Nanot", "Platen", "Raburn", "Reman", "Acrod", "Coffy", "Elrok", "Foss", "Hardig", "Hombol", "Hospel", "Kaller", "Klots", "Krilok", "Limar", "Loket", "Mesak", "Morbit", "Newin", "Orill", "Tabor", "Tekot" ], [ "Blythe", "Chan", "Kathrine", "Marie", "Maria", "Naoko", "Samantha", "Satomi", "Shannon", "Athena", "Caroline", "Lumi", "Lumina", "Marissa", "Sonia" ]], - [TrainerType.SMASHER]: [ "Aspen", "Elena", "Mari", "Amy", "Lizzy" ], - [TrainerType.SNOW_WORKER]: [[ "Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix" ], [ "Georgia", "Sandra", "Yvonne" ]], - [TrainerType.STRIKER]: [ "Marco", "Roberto", "Tony" ], - [TrainerType.SCHOOL_KID]: [[ "Alan", "Billy", "Chad", "Danny", "Dudley", "Jack", "Joe", "Johnny", "Kipp", "Nate", "Ricky", "Tommy", "Jerry", "Paul", "Ted", "Chance", "Esteban", "Forrest", "Harrison", "Connor", "Sherman", "Torin", "Travis", "Al", "Carter", "Edgar", "Jem", "Sammy", "Shane", "Shayne", "Alvin", "Keston", "Neil", "Seymour", "William", "Carson", "Clark", "Nolan" ], [ "Georgia", "Karen", "Meiko", "Christine", "Mackenzie", "Tiera", "Ann", "Gina", "Lydia", "Marsha", "Millie", "Sally", "Serena", "Silvia", "Alberta", "Cassie", "Mara", "Rita", "Georgie", "Meena", "Nitzel" ]], - [TrainerType.SWIMMER]: [[ "Berke", "Cameron", "Charlie", "George", "Harold", "Jerome", "Kirk", "Mathew", "Parker", "Randall", "Seth", "Simon", "Tucker", "Austin", "Barry", "Chad", "Cody", "Darrin", "David", "Dean", "Douglas", "Franklin", "Gilbert", "Herman", "Jack", "Luis", "Matthew", "Reed", "Richard", "Rodney", "Roland", "Spencer", "Stan", "Tony", "Clarence", "Declan", "Dominik", "Harrison", "Kevin", "Leonardo", "Nolen", "Pete", "Santiago", "Axle", "Braden", "Finn", "Garrett", "Mymo", "Reece", "Samir", "Toby", "Adrian", "Colton", "Dillon", "Erik", "Evan", "Francisco", "Glenn", "Kurt", "Oscar", "Ricardo", "Sam", "Sheltin", "Troy", "Vincent", "Wade", "Wesley", "Duane", "Elmo", "Esteban", "Frankie", "Ronald", "Tyson", "Bart", "Matt", "Tim", "Wright", "Jeffery", "Kyle", "Alessandro", "Estaban", "Kieran", "Ramses", "Casey", "Dakota", "Jared", "Kalani", "Keoni", "Lawrence", "Logan", "Robert", "Roddy", "Yasu", "Derek", "Jacob", "Bruce", "Clayton" ], [ "Briana", "Dawn", "Denise", "Diana", "Elaine", "Kara", "Kaylee", "Lori", "Nicole", "Nikki", "Paula", "Susie", "Wendy", "Alice", "Beth", "Beverly", "Brenda", "Dana", "Debra", "Grace", "Jenny", "Katie", "Laurel", "Linda", "Missy", "Sharon", "Tanya", "Tara", "Tisha", "Carlee", "Imani", "Isabelle", "Kyla", "Sienna", "Abigail", "Amara", "Anya", "Connie", "Maria", "Melissa", "Nora", "Shirley", "Shania", "Tiffany", "Aubree", "Cassandra", "Claire", "Crystal", "Erica", "Gabrielle", "Haley", "Jessica", "Joanna", "Lydia", "Mallory", "Mary", "Miranda", "Paige", "Sophia", "Vanessa", "Chelan", "Debbie", "Joy", "Kendra", "Leona", "Mina", "Caroline", "Joyce", "Larissa", "Rebecca", "Tyra", "Dara", "Desiree", "Kaoru", "Ruth", "Coral", "Genevieve", "Isla", "Marissa", "Romy", "Sheryl", "Alexandria", "Alicia", "Chelsea", "Jade", "Kelsie", "Laura", "Portia", "Shelby", "Sara", "Tiare", "Kyra", "Natasha", "Layla", "Scarlett", "Cora" ]], - [TrainerType.TWINS]: [ "Amy & May", "Jo & Zoe", "Meg & Peg", "Ann & Anne", "Lea & Pia", "Amy & Liv", "Gina & Mia", "Miu & Yuki", "Tori & Tia", "Eli & Anne", "Jen & Kira", "Joy & Meg", "Kiri & Jan", "Miu & Mia", "Emma & Lil", "Liv & Liz", "Teri & Tia", "Amy & Mimi", "Clea & Gil", "Day & Dani", "Kay & Tia", "Tori & Til", "Saya & Aya", "Emy & Lin", "Kumi & Amy", "Mayo & May", "Ally & Amy", "Lia & Lily", "Rae & Ula", "Sola & Ana", "Tara & Val", "Faith & Joy", "Nana & Nina" ], - [TrainerType.VETERAN]: [[ "Armando", "Brenden", "Brian", "Clayton", "Edgar", "Emanuel", "Grant", "Harlan", "Terrell", "Arlen", "Chester", "Hugo", "Martell", "Ray", "Shaun", "Abraham", "Carter", "Claude", "Jerry", "Lucius", "Murphy", "Rayne", "Ron", "Sinan", "Sterling", "Vincent", "Zach", "Gerard", "Gilles", "Louis", "Timeo", "Akira", "Don", "Eric", "Harry", "Leon", "Roger", "Angus", "Aristo", "Brone", "Johnny" ], [ "Julia", "Karla", "Kim", "Sayuri", "Tiffany", "Cathy", "Cecile", "Chloris", "Denae", "Gina", "Maya", "Oriana", "Portia", "Rhona", "Rosaline", "Catrina", "Inga", "Trisha", "Heather", "Lynn", "Sheri", "Alonsa", "Ella", "Leticia", "Kiara" ]], - [TrainerType.WAITER]: [[ "Bert", "Clint", "Maxwell", "Lou" ], [ "Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia" ]], - [TrainerType.WORKER]: [[ "Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix" ], [ "Georgia", "Sandra", "Yvonne" ]], - [TrainerType.YOUNGSTER]: [[ "Albert", "Gordon", "Ian", "Jason", "Jimmy", "Mikey", "Owen", "Samuel", "Warren", "Allen", "Ben", "Billy", "Calvin", "Dillion", "Eddie", "Joey", "Josh", "Neal", "Timmy", "Tommy", "Breyden", "Deandre", "Demetrius", "Dillon", "Jaylen", "Johnson", "Shigenobu", "Chad", "Cole", "Cordell", "Dan", "Dave", "Destin", "Nash", "Tyler", "Yasu", "Austin", "Dallas", "Darius", "Donny", "Jonathon", "Logan", "Michael", "Oliver", "Sebastian", "Tristan", "Wayne", "Norman", "Roland", "Regis", "Abe", "Astor", "Keita", "Kenneth", "Kevin", "Kyle", "Lester", "Masao", "Nicholas", "Parker", "Wes", "Zachary", "Cody", "Henley", "Jaye", "Karl", "Kenny", "Masahiro", "Pedro", "Petey", "Sinclair", "Terrell", "Waylon", "Aidan", "Anthony", "David", "Jacob", "Jayden", "Cutler", "Ham", "Caleb", "Kai", "Honus", "Kenway", "Bret", "Chris", "Cid", "Dennis", "Easton", "Ken", "Robby", "Ronny", "Shawn", "Benjamin", "Jake", "Travis", "Adan", "Aday", "Beltran", "Elian", "Hernan", "Julen", "Luka", "Roi", "Bernie", "Dustin", "Jonathan", "Wyatt" ], [ "Alice", "Bridget", "Carrie", "Connie", "Dana", "Ellen", "Krise", "Laura", "Linda", "Michelle", "Shannon", "Andrea", "Crissy", "Janice", "Robin", "Sally", "Tiana", "Haley", "Ali", "Ann", "Dalia", "Dawn", "Iris", "Joana", "Julia", "Kay", "Lisa", "Megan", "Mikaela", "Miriam", "Paige", "Reli", "Blythe", "Briana", "Caroline", "Cassidy", "Kaitlin", "Madeline", "Molly", "Natalie", "Samantha", "Sarah", "Cathy", "Dye", "Eri", "Eva", "Fey", "Kara", "Lurleen", "Maki", "Mali", "Maya", "Miki", "Sibyl", "Daya", "Diana", "Flo", "Helia", "Henrietta", "Isabel", "Mai", "Persephone", "Serena", "Anna", "Charlotte", "Elin", "Elsa", "Lise", "Sara", "Suzette", "Audrey", "Emmy", "Isabella", "Madison", "Rika", "Rylee", "Salla", "Ellie", "Alexandra", "Amy", "Lass", "Brittany", "Chel", "Cindy", "Dianne", "Emily", "Emma", "Evelyn", "Hana", "Harleen", "Hazel", "Jocelyn", "Katrina", "Kimberly", "Lina", "Marge", "Mila", "Mizuki", "Rena", "Sal", "Satoko", "Summer", "Tomoe", "Vicky", "Yue", "Yumi", "Lauren", "Rei", "Riley", "Lois", "Nancy", "Tammy", "Terry" ]], - [TrainerType.HEX_MANIAC]: [ "Kindra", "Patricia", "Tammy", "Tasha", "Valerie", "Alaina", "Kathleen", "Leah", "Makie", "Sylvia", "Anina", "Arachna", "Carrie", "Desdemona", "Josette", "Luna", "Melanie", "Osanna", "Raziah" ], + [TrainerType.ACE_TRAINER]: [ + [ + "Aaron", + "Allen", + "Blake", + "Brian", + "Gaven", + "Jake", + "Kevin", + "Mike", + "Nick", + "Paul", + "Ryan", + "Sean", + "Darin", + "Albert", + "Berke", + "Clyde", + "Edgar", + "George", + "Leroy", + "Owen", + "Parker", + "Randall", + "Ruben", + "Samuel", + "Vincent", + "Warren", + "Wilton", + "Zane", + "Alfred", + "Braxton", + "Felix", + "Gerald", + "Jonathan", + "Leonel", + "Marcel", + "Mitchell", + "Quincy", + "Roderick", + "Colby", + "Rolando", + "Yuji", + "Abel", + "Anton", + "Arthur", + "Cesar", + "Dalton", + "Dennis", + "Ernest", + "Garrett", + "Graham", + "Henry", + "Isaiah", + "Jonah", + "Jose", + "Keenan", + "Micah", + "Omar", + "Quinn", + "Rodolfo", + "Saul", + "Sergio", + "Skylar", + "Stefan", + "Zachery", + "Alton", + "Arabella", + "Bonita", + "Cal", + "Cody", + "French", + "Kobe", + "Paulo", + "Shaye", + "Austin", + "Beckett", + "Charlie", + "Corky", + "David", + "Dwayne", + "Elmer", + "Jesse", + "Jared", + "Johan", + "Jordan", + "Kipp", + "Lou", + "Terry", + "Tom", + "Webster", + "Billy", + "Doyle", + "Enzio", + "Geoff", + "Grant", + "Kelsey", + "Miguel", + "Pierce", + "Ray", + "Santino", + "Shel", + "Adelbert", + "Bence", + "Emil", + "Evan", + "Mathis", + "Maxim", + "Neil", + "Rico", + "Robbie", + "Theo", + "Viktor", + "Benedict", + "Cornelius", + "Hisato", + "Leopold", + "Neville", + "Vito", + "Chase", + "Cole", + "Hiroshi", + "Jackson", + "Jim", + "Kekoa", + "Makana", + "Yuki", + "Elwood", + "Seth", + "Alvin", + "Arjun", + "Arnold", + "Cameron", + "Carl", + "Carlton", + "Christopher", + "Dave", + "Dax", + "Dominic", + "Edmund", + "Finn", + "Fred", + "Garret", + "Grayson", + "Jace", + "Jaxson", + "Jay", + "Jirard", + "Johnson", + "Kayden", + "Kite", + "Louis", + "Mac", + "Marty", + "Percy", + "Raymond", + "Ronnie", + "Satch", + "Tim", + "Zach", + "Conner", + "Vince", + "Bedro", + "Boda", + "Botan", + "Daras", + "Dury", + "Herton", + "Rewn", + "Stum", + "Tock", + "Trilo", + "Berki", + "Cruik", + "Dazon", + "Desid", + "Dillot", + "Farfin", + "Forgon", + "Hebel", + "Morfon", + "Moril", + "Shadd", + "Vanhub", + "Bardo", + "Carben", + "Degin", + "Gorps", + "Klept", + "Lask", + "Malex", + "Mopar", + "Niled", + "Noxon", + "Teslor", + "Tetil", + ], + [ + "Beth", + "Carol", + "Cybil", + "Emma", + "Fran", + "Gwen", + "Irene", + "Jenn", + "Joyce", + "Kate", + "Kelly", + "Lois", + "Lola", + "Megan", + "Quinn", + "Reena", + "Cara", + "Alexa", + "Brooke", + "Caroline", + "Elaine", + "Hope", + "Jennifer", + "Jody", + "Julie", + "Lori", + "Mary", + "Michelle", + "Shannon", + "Wendy", + "Alexia", + "Alicia", + "Athena", + "Carolina", + "Cristin", + "Darcy", + "Dianne", + "Halle", + "Jazmyn", + "Katelynn", + "Keira", + "Marley", + "Allyson", + "Kathleen", + "Naomi", + "Alyssa", + "Ariana", + "Brandi", + "Breanna", + "Brenda", + "Brenna", + "Catherine", + "Clarice", + "Dana", + "Deanna", + "Destiny", + "Jamie", + "Jasmin", + "Kassandra", + "Laura", + "Maria", + "Mariah", + "Maya", + "Meagan", + "Mikayla", + "Monique", + "Natasha", + "Olivia", + "Sandra", + "Savannah", + "Sydney", + "Moira", + "Piper", + "Salma", + "Allison", + "Beverly", + "Cathy", + "Cheyenne", + "Clara", + "Dara", + "Eileen", + "Glinda", + "Junko", + "Lena", + "Lucille", + "Mariana", + "Olwen", + "Shanta", + "Stella", + "Angi", + "Belle", + "Chandra", + "Cora", + "Eve", + "Jacqueline", + "Jeanne", + "Juliet", + "Kathrine", + "Layla", + "Lucca", + "Melina", + "Miki", + "Nina", + "Sable", + "Shelly", + "Summer", + "Trish", + "Vicki", + "Alanza", + "Cordelia", + "Hilde", + "Imelda", + "Michele", + "Mireille", + "Claudia", + "Constance", + "Harriet", + "Honor", + "Melba", + "Portia", + "Alexis", + "Angela", + "Karla", + "Lindsey", + "Tori", + "Sheri", + "Jada", + "Kailee", + "Amanda", + "Annie", + "Kindra", + "Kyla", + "Sofia", + "Yvette", + "Becky", + "Flora", + "Gloria", + "Buna", + "Ferda", + "Lehan", + "Liqui", + "Lomen", + "Neira", + "Atilo", + "Detta", + "Gilly", + "Gosney", + "Levens", + "Moden", + "Rask", + "Rateis", + "Rosno", + "Tynan", + "Veron", + "Zoel", + "Cida", + "Dibsin", + "Dodin", + "Ebson", + "Equin", + "Flostin", + "Gabsen", + "Halsion", + "Hileon", + "Quelor", + "Rapeel", + "Roze", + "Tensin", + ], + ], + [TrainerType.ARTIST]: [ + ["Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan"], + ["Georgia"], + ], + [TrainerType.BACKERS]: [ + ["Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art"], + [ + "Ai & Ciel", + "Ami & Eira", + "Cam & Abby", + "Fey & Sue", + "Kat & Phae", + "Kay & Ali", + "Ava & Aya", + "Cleo & Rio", + "May & Mal", + ], + ], + [TrainerType.BACKPACKER]: [ + [ + "Alexander", + "Carlos", + "Herman", + "Jerome", + "Keane", + "Kelsey", + "Kiyo", + "Michael", + "Nate", + "Peter", + "Sam", + "Stephen", + "Talon", + "Terrance", + "Toru", + "Waylon", + "Boone", + "Clifford", + "Ivan", + "Kendall", + "Lowell", + "Randall", + "Reece", + "Roland", + "Shane", + "Walt", + "Farid", + "Heike", + "Joren", + "Lane", + "Roderick", + "Darnell", + "Deon", + "Emory", + "Graeme", + "Grayson", + "Aitor", + "Alex", + "Arturo", + "Asier", + "Jaime", + "Jonathan", + "Julio", + "Kevin", + "Kosuke", + "Lander", + "Markel", + "Mateo", + "Nil", + "Pau", + "Samuel", + ], + [ + "Anna", + "Corin", + "Elaine", + "Emi", + "Jill", + "Kumiko", + "Liz", + "Lois", + "Lora", + "Molly", + "Patty", + "Ruth", + "Vicki", + "Annie", + "Blossom", + "Clara", + "Eileen", + "Mae", + "Myra", + "Rachel", + "Tami", + "Ashley", + "Mikiko", + "Kiana", + "Perdy", + "Maria", + "Yuho", + "Peren", + "Barbara", + "Diane", + ], + ], + [TrainerType.BAKER]: ["Chris", "Jenn", "Lilly"], + [TrainerType.BEAUTY]: [ + "Cassie", + "Julia", + "Olivia", + "Samantha", + "Valerie", + "Victoria", + "Bridget", + "Connie", + "Jessica", + "Johanna", + "Melissa", + "Sheila", + "Shirley", + "Tiffany", + "Namiko", + "Thalia", + "Grace", + "Lola", + "Lori", + "Maura", + "Tamia", + "Cyndy", + "Devon", + "Gabriella", + "Harley", + "Lindsay", + "Nicola", + "Callie", + "Charlotte", + "Kassandra", + "December", + "Fleming", + "Nikola", + "Aimee", + "Anais", + "Brigitte", + "Cassandra", + "Andrea", + "Brittney", + "Carolyn", + "Krystal", + "Alexis", + "Alice", + "Aina", + "Anya", + "Arianna", + "Aubrey", + "Beverly", + "Camille", + "Beauty", + "Evette", + "Hansol", + "Haruka", + "Jill", + "Jo", + "Lana", + "Lois", + "Lucy", + "Mai", + "Nickie", + "Nicole", + "Prita", + "Rose", + "Shelly", + "Suzy", + "Tessa", + "Anita", + "Alissa", + "Rita", + "Cudsy", + "Eloff", + "Miru", + "Minot", + "Nevah", + "Niven", + "Ogoin", + ], + [TrainerType.BIKER]: [ + "Charles", + "Dwayne", + "Glenn", + "Harris", + "Joel", + "Riley", + "Zeke", + "Alex", + "Billy", + "Ernest", + "Gerald", + "Hideo", + "Isaac", + "Jared", + "Jaren", + "Jaxon", + "Jordy", + "Lao", + "Lukas", + "Malik", + "Nikolas", + "Ricardo", + "Ruben", + "Virgil", + "William", + "Aiden", + "Dale", + "Dan", + "Jacob", + "Markey", + "Reese", + "Teddy", + "Theron", + "Jeremy", + "Morgann", + "Phillip", + "Philip", + "Stanley", + "Dillon", + ], + [TrainerType.BLACK_BELT]: [ + [ + "Kenji", + "Lao", + "Lung", + "Nob", + "Wai", + "Yoshi", + "Atsushi", + "Daisuke", + "Hideki", + "Hitoshi", + "Kiyo", + "Koichi", + "Koji", + "Yuji", + "Cristian", + "Rhett", + "Takao", + "Theodore", + "Zander", + "Aaron", + "Hugh", + "Mike", + "Nicolas", + "Shea", + "Takashi", + "Adam", + "Carl", + "Colby", + "Darren", + "David", + "Davon", + "Derek", + "Eddie", + "Gregory", + "Griffin", + "Jarrett", + "Jeffery", + "Kendal", + "Kyle", + "Luke", + "Miles", + "Nathaniel", + "Philip", + "Rafael", + "Ray", + "Ricky", + "Sean", + "Willie", + "Ander", + "Manford", + "Benjamin", + "Corey", + "Edward", + "Grant", + "Jay", + "Kendrew", + "Kentaro", + "Ryder", + "Teppei", + "Thomas", + "Tyrone", + "Andrey", + "Donny", + "Drago", + "Gordon", + "Grigor", + "Jeriel", + "Kenneth", + "Martell", + "Mathis", + "Rich", + "Rocky", + "Rodrigo", + "Wesley", + "Zachery", + "Alonzo", + "Cadoc", + "Gunnar", + "Igor", + "Killian", + "Markus", + "Ricardo", + "Yanis", + "Banting", + "Clayton", + "Duane", + "Earl", + "Greg", + "Roy", + "Terry", + "Tracy", + "Walter", + "Alvaro", + "Curtis", + "Francis", + "Ross", + "Brice", + "Cheng", + "Dudley", + "Eric", + "Kano", + "Masahiro", + "Randy", + "Ryuji", + "Steve", + "Tadashi", + "Wong", + "Yuen", + "Brian", + "Carter", + "Reece", + "Nick", + "Yang", + ], + [ + "Cora", + "Cyndy", + "Jill", + "Laura", + "Sadie", + "Tessa", + "Vivian", + "Aisha", + "Callie", + "Danielle", + "Helene", + "Jocelyn", + "Lilith", + "Paula", + "Reyna", + "Helen", + "Kelsey", + "Tyler", + "Amy", + "Chandra", + "Hillary", + "Janie", + "Lee", + "Maggie", + "Mikiko", + "Miriam", + "Sharon", + "Susie", + "Xiao", + "Alize", + "Azra", + "Brenda", + "Chalina", + "Chan", + "Glinda", + "Maki", + "Tia", + "Tiffany", + "Wendy", + "Andrea", + "Gabrielle", + "Gerardine", + "Hailey", + "Hedvig", + "Justine", + "Kinsey", + "Sigrid", + "Veronique", + "Tess", + ], + ], + [TrainerType.BREEDER]: [ + [ + "Isaac", + "Myles", + "Salvadore", + "Albert", + "Kahlil", + "Eustace", + "Galen", + "Owen", + "Addison", + "Marcus", + "Foster", + "Cory", + "Glenn", + "Jay", + "Wesley", + "William", + "Adrian", + "Bradley", + "Jaime", + ], + [ + "Allison", + "Alize", + "Bethany", + "Lily", + "Lydia", + "Gabrielle", + "Jayden", + "Pat", + "Veronica", + "Amber", + "Jennifer", + "Kaylee", + "Adelaide", + "Brooke", + "Ethel", + "April", + "Irene", + "Magnolia", + "Amala", + "Mercy", + "Amanda", + "Ikue", + "Savannah", + "Yuka", + "Chloe", + "Debra", + "Denise", + "Elena", + ], + ], + [TrainerType.CLERK]: [ + [ + "Chaz", + "Clemens", + "Doug", + "Fredric", + "Ivan", + "Isaac", + "Nelson", + "Wade", + "Warren", + "Augustin", + "Gilligan", + "Cody", + "Jeremy", + "Shane", + "Dugal", + "Royce", + "Ronald", + ], + [ + "Alberta", + "Ingrid", + "Katie", + "Piper", + "Trisha", + "Wren", + "Britney", + "Lana", + "Jessica", + "Kristen", + "Michelle", + "Gabrielle", + ], + ], + [TrainerType.CYCLIST]: [ + ["Axel", "James", "John", "Ryan", "Hector", "Jeremiah"], + ["Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide"], + ], + [TrainerType.DANCER]: [ + "Brian", + "Davey", + "Dirk", + "Edmond", + "Mickey", + "Raymond", + "Cara", + "Julia", + "Maika", + "Mireille", + "Ronda", + "Zoe", + ], + [TrainerType.DEPOT_AGENT]: ["Josh", "Hank", "Vincent"], + [TrainerType.DOCTOR]: [ + ["Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham"], + ["Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah"], + ], + [TrainerType.FIREBREATHER]: ["Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt"], + [TrainerType.FISHERMAN]: [ + "Andre", + "Arnold", + "Barney", + "Chris", + "Edgar", + "Henry", + "Jonah", + "Justin", + "Kyle", + "Martin", + "Marvin", + "Ralph", + "Raymond", + "Scott", + "Stephen", + "Wilton", + "Tully", + "Andrew", + "Barny", + "Carter", + "Claude", + "Dale", + "Elliot", + "Eugene", + "Ivan", + "Ned", + "Nolan", + "Roger", + "Ronald", + "Wade", + "Wayne", + "Darian", + "Kai", + "Chip", + "Hank", + "Kaden", + "Tommy", + "Tylor", + "Alec", + "Brett", + "Cameron", + "Cody", + "Cole", + "Cory", + "Erick", + "George", + "Joseph", + "Juan", + "Kenneth", + "Luc", + "Miguel", + "Travis", + "Walter", + "Zachary", + "Josh", + "Gideon", + "Kyler", + "Liam", + "Murphy", + "Bruce", + "Damon", + "Devon", + "Hubert", + "Jones", + "Lydon", + "Mick", + "Pete", + "Sean", + "Sid", + "Vince", + "Bucky", + "Dean", + "Eustace", + "Kenzo", + "Leroy", + "Mack", + "Ryder", + "Ewan", + "Finn", + "Murray", + "Seward", + "Shad", + "Wharton", + "Finley", + "Fisher", + "Fisk", + "River", + "Sheaffer", + "Timin", + "Carl", + "Ernest", + "Hal", + "Herbert", + "Hisato", + "Mike", + "Vernon", + "Harriet", + "Marina", + "Chase", + ], + [TrainerType.GUITARIST]: [ + "Anna", + "Beverly", + "January", + "Tina", + "Alicia", + "Claudia", + "Julia", + "Lidia", + "Mireia", + "Noelia", + "Sara", + "Sheila", + "Tatiana", + ], + [TrainerType.HARLEQUIN]: [ + "Charley", + "Ian", + "Jack", + "Kerry", + "Louis", + "Pat", + "Paul", + "Rick", + "Anders", + "Clarence", + "Gary", + ], + [TrainerType.HIKER]: [ + "Anthony", + "Bailey", + "Benjamin", + "Daniel", + "Erik", + "Jim", + "Kenny", + "Leonard", + "Michael", + "Parry", + "Phillip", + "Russell", + "Sidney", + "Tim", + "Timothy", + "Alan", + "Brice", + "Clark", + "Eric", + "Lenny", + "Lucas", + "Mike", + "Trent", + "Devan", + "Eli", + "Marc", + "Sawyer", + "Allen", + "Daryl", + "Dudley", + "Earl", + "Franklin", + "Jeremy", + "Marcos", + "Nob", + "Oliver", + "Wayne", + "Alexander", + "Damon", + "Jonathan", + "Justin", + "Kevin", + "Lorenzo", + "Louis", + "Maurice", + "Nicholas", + "Reginald", + "Robert", + "Theodore", + "Bruce", + "Clarke", + "Devin", + "Dwight", + "Edwin", + "Eoin", + "Noland", + "Russel", + "Andy", + "Bret", + "Darrell", + "Gene", + "Hardy", + "Hugh", + "Jebediah", + "Jeremiah", + "Kit", + "Neil", + "Terrell", + "Don", + "Doug", + "Hunter", + "Jared", + "Jerome", + "Keith", + "Manuel", + "Markus", + "Otto", + "Shelby", + "Stephen", + "Teppei", + "Tobias", + "Wade", + "Zaiem", + "Aaron", + "Alain", + "Bergin", + "Bernard", + "Brent", + "Corwin", + "Craig", + "Delmon", + "Dunstan", + "Orestes", + "Ross", + "Davian", + "Calhoun", + "David", + "Gabriel", + "Ryan", + "Thomas", + "Travis", + "Zachary", + "Anuhea", + "Barnaby", + "Claus", + "Collin", + "Colson", + "Dexter", + "Dillan", + "Eugine", + "Farkas", + "Hisato", + "Julius", + "Kenji", + "Irwin", + "Lionel", + "Paul", + "Richter", + "Valentino", + "Donald", + "Douglas", + "Kevyn", + "Chester", + ], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] + [TrainerType.HOOLIGANS]: ["Jim & Cas", "Rob & Sal"], + [TrainerType.HOOPSTER]: ["Bobby", "John", "Lamarcus", "Derrick", "Nicolas"], + [TrainerType.INFIELDER]: ["Alex", "Connor", "Todd"], + [TrainerType.JANITOR]: ["Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn"], + [TrainerType.LINEBACKER]: ["Bob", "Dan", "Jonah"], + [TrainerType.MAID]: ["Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy"], + [TrainerType.MUSICIAN]: [ + "Boris", + "Preston", + "Charles", + "Clyde", + "Vincent", + "Dalton", + "Kirk", + "Shawn", + "Fabian", + "Fernando", + "Joseph", + "Marcos", + "Arturo", + "Jerry", + "Lonnie", + "Tony", + ], + [TrainerType.NURSERY_AIDE]: [ + "Autumn", + "Briana", + "Leah", + "Miho", + "Ethel", + "Hollie", + "Ilse", + "June", + "Kimya", + "Rosalyn", + ], + [TrainerType.OFFICER]: [ + "Dirk", + "Keith", + "Alex", + "Bobby", + "Caleb", + "Danny", + "Dylan", + "Thomas", + "Daniel", + "Jeff", + "Braven", + "Dell", + "Neagle", + "Haruki", + "Mitchell", + "Raymond", + ], + [TrainerType.PARASOL_LADY]: [ + "Angelica", + "Clarissa", + "Madeline", + "Akari", + "Annabell", + "Kayley", + "Rachel", + "Alexa", + "Sabrina", + "April", + "Gwyneth", + "Laura", + "Lumi", + "Mariah", + "Melita", + "Nicole", + "Tihana", + "Ingrid", + "Tyra", + ], + [TrainerType.PILOT]: ["Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow"], + [TrainerType.POKEFAN]: [ + [ + "Alex", + "Allan", + "Brandon", + "Carter", + "Colin", + "Derek", + "Jeremy", + "Joshua", + "Rex", + "Robert", + "Trevor", + "William", + "Colton", + "Miguel", + "Francisco", + "Kaleb", + "Leonard", + "Boone", + "Elliot", + "Jude", + "Norbert", + "Corey", + "Gabe", + "Baxter", + ], + [ + "Beverly", + "Georgia", + "Jaime", + "Ruth", + "Isabel", + "Marissa", + "Vanessa", + "Annika", + "Bethany", + "Kimberly", + "Meredith", + "Rebekah", + "Eleanor", + "Darcy", + "Lydia", + "Sachiko", + "Abigail", + "Agnes", + "Lydie", + "Roisin", + "Tara", + "Carmen", + "Janet", + ], + ], + [TrainerType.PRESCHOOLER]: [ + [ + "Billy", + "Doyle", + "Evan", + "Homer", + "Tully", + "Albert", + "Buster", + "Greg", + "Ike", + "Jojo", + "Tyrone", + "Adrian", + "Oliver", + "Hayden", + "Hunter", + "Kaleb", + "Liam", + "Dylan", + ], + [ + "Juliet", + "Mia", + "Sarah", + "Wendy", + "Winter", + "Chrissy", + "Eva", + "Lin", + "Samantha", + "Ella", + "Lily", + "Natalie", + "Ailey", + "Hannah", + "Malia", + "Kindra", + "Nancy", + ], + ], + [TrainerType.PSYCHIC]: [ + [ + "Fidel", + "Franklin", + "Gilbert", + "Greg", + "Herman", + "Jared", + "Mark", + "Nathan", + "Norman", + "Phil", + "Richard", + "Rodney", + "Cameron", + "Edward", + "Fritz", + "Joshua", + "Preston", + "Virgil", + "William", + "Alvaro", + "Blake", + "Cedric", + "Keenan", + "Nicholas", + "Dario", + "Johan", + "Lorenzo", + "Tyron", + "Bryce", + "Corbin", + "Deandre", + "Elijah", + "Kody", + "Landon", + "Maxwell", + "Mitchell", + "Sterling", + "Eli", + "Nelson", + "Vernon", + "Gaven", + "Gerard", + "Low", + "Micki", + "Perry", + "Rudolf", + "Tommy", + "Al", + "Nandor", + "Tully", + "Arthur", + "Emanuel", + "Franz", + "Harry", + "Paschal", + "Robert", + "Sayid", + "Angelo", + "Anton", + "Arin", + "Avery", + "Danny", + "Frasier", + "Harrison", + "Jaime", + "Ross", + "Rui", + "Vlad", + "Mason", + ], + [ + "Alexis", + "Hannah", + "Jacki", + "Jaclyn", + "Kayla", + "Maura", + "Samantha", + "Alix", + "Brandi", + "Edie", + "Macey", + "Mariella", + "Marlene", + "Laura", + "Rodette", + "Abigail", + "Brittney", + "Chelsey", + "Daisy", + "Desiree", + "Kendra", + "Lindsey", + "Rachael", + "Valencia", + "Belle", + "Cybil", + "Doreen", + "Dua", + "Future", + "Lin", + "Madhu", + "Alia", + "Ena", + "Joyce", + "Lynette", + "Olesia", + "Sarah", + ], + ], + [TrainerType.RANGER]: [ + [ + "Carlos", + "Jackson", + "Sebastian", + "Gav", + "Lorenzo", + "Logan", + "Nicolas", + "Trenton", + "Deshawn", + "Dwayne", + "Jeffery", + "Kyler", + "Taylor", + "Alain", + "Claude", + "Crofton", + "Forrest", + "Harry", + "Jaden", + "Keith", + "Lewis", + "Miguel", + "Pedro", + "Ralph", + "Richard", + "Bret", + "Daryl", + "Eddie", + "Johan", + "Leaf", + "Louis", + "Maxwell", + "Parker", + "Rick", + "Steve", + "Bjorn", + "Chaise", + "Dean", + "Lee", + "Maurice", + "Nash", + "Ralf", + "Reed", + "Shinobu", + "Silas", + ], + [ + "Catherine", + "Jenna", + "Sophia", + "Merdith", + "Nora", + "Beth", + "Chelsea", + "Katelyn", + "Madeline", + "Allison", + "Ashlee", + "Felicia", + "Krista", + "Annie", + "Audra", + "Brenda", + "Chloris", + "Eliza", + "Heidi", + "Irene", + "Mary", + "Mylene", + "Shanti", + "Shelly", + "Thalia", + "Anja", + "Briana", + "Dianna", + "Elaine", + "Elle", + "Hillary", + "Katie", + "Lena", + "Lois", + "Malory", + "Melita", + "Mikiko", + "Naoko", + "Serenity", + "Ambre", + "Brooke", + "Clementine", + "Melina", + "Petra", + "Twiggy", + ], + ], + [TrainerType.RICH]: [ + [ + "Alfred", + "Edward", + "Gregory", + "Preston", + "Thomas", + "Tucker", + "Walter", + "Clifford", + "Everett", + "Micah", + "Nate", + "Pierre", + "Terrance", + "Arthur", + "Brooks", + "Emanuel", + "Lamar", + "Jeremy", + "Leonardo", + "Milton", + "Frederic", + "Renaud", + "Robert", + "Yan", + "Daniel", + "Sheldon", + "Stonewall", + "Gerald", + "Ronald", + "Smith", + "Stanley", + "Reginald", + "Orson", + "Wilco", + "Caden", + "Glenn", + ], + [ + "Rebecca", + "Reina", + "Cassandra", + "Emilia", + "Grace", + "Marian", + "Elizabeth", + "Kathleen", + "Sayuri", + "Caroline", + "Judy", + ], + ], + [TrainerType.RICH_KID]: [ + [ + "Garret", + "Winston", + "Dawson", + "Enrique", + "Jason", + "Roman", + "Trey", + "Liam", + "Anthony", + "Brad", + "Cody", + "Manuel", + "Martin", + "Pierce", + "Rolan", + "Keenan", + "Filbert", + "Antoin", + "Cyus", + "Diek", + "Dugo", + "Flitz", + "Jurek", + "Lond", + "Perd", + "Quint", + "Basto", + "Benit", + "Brot", + "Denc", + "Guyit", + "Marcon", + "Perc", + "Puros", + "Roex", + "Sainz", + "Symin", + "Tark", + "Venak", + ], + [ + "Anette", + "Brianna", + "Cindy", + "Colleen", + "Daphne", + "Elizabeth", + "Naomi", + "Sarah", + "Charlotte", + "Gillian", + "Jacki", + "Lady", + "Melissa", + "Celeste", + "Colette", + "Elizandra", + "Isabel", + "Lynette", + "Magnolia", + "Sophie", + "Lina", + "Dulcie", + "Auro", + "Brin", + "Caril", + "Eloos", + "Gwin", + "Illa", + "Kowly", + "Rima", + "Ristin", + "Vesey", + "Brena", + "Deasy", + "Denslon", + "Kylet", + "Nemi", + "Rene", + "Sanol", + "Stouner", + "Sturk", + "Talmen", + "Zoila", + ], + ], + [TrainerType.ROUGHNECK]: [ + "Camron", + "Corey", + "Gabriel", + "Isaiah", + "Jamal", + "Koji", + "Luke", + "Paxton", + "Raul", + "Zeek", + "Kirby", + "Chance", + "Dave", + "Fletcher", + "Johnny", + "Reese", + "Joey", + "Ricky", + "Silvester", + "Martin", + ], + [TrainerType.SAILOR]: [ + "Alberto", + "Bost", + "Brennan", + "Brenden", + "Claude", + "Cory", + "Damian", + "Dirk", + "Duncan", + "Dwayne", + "Dylan", + "Eddie", + "Edmond", + "Elijah", + "Ernest", + "Eugene", + "Garrett", + "Golos", + "Gratin", + "Grestly", + "Harry", + "Hols", + "Hudson", + "Huey", + "Jebol", + "Jeff", + "Leonald", + "Luther", + "Kelvin", + "Kenneth", + "Kent", + "Knook", + "Marc", + "Mifis", + "Monar", + "Morkor", + "Ordes", + "Oxlin", + "Parker", + "Paul", + "Philip", + "Roberto", + "Samson", + "Skyler", + "Stanly", + "Tebu", + "Terrell", + "Trevor", + "Yasu", + "Zachariah", + ], + [TrainerType.SCIENTIST]: [ + [ + "Jed", + "Marc", + "Mitch", + "Rich", + "Ross", + "Beau", + "Braydon", + "Connor", + "Ed", + "Ivan", + "Jerry", + "Jose", + "Joshua", + "Parker", + "Rodney", + "Taylor", + "Ted", + "Travis", + "Zackery", + "Darrius", + "Emilio", + "Fredrick", + "Shaun", + "Stefano", + "Travon", + "Daniel", + "Garett", + "Gregg", + "Linden", + "Lowell", + "Trenton", + "Dudley", + "Luke", + "Markus", + "Nathan", + "Orville", + "Randall", + "Ron", + "Ronald", + "Simon", + "Steve", + "William", + "Franklin", + "Clarke", + "Jacques", + "Terrance", + "Ernst", + "Justus", + "Ikaika", + "Jayson", + "Kyle", + "Reid", + "Tyrone", + "Adam", + "Albert", + "Alphonse", + "Cory", + "Donnie", + "Elton", + "Francis", + "Gordon", + "Herbert", + "Humphrey", + "Jordan", + "Julian", + "Keaton", + "Levi", + "Melvin", + "Murray", + "West", + "Craig", + "Coren", + "Dubik", + "Kotan", + "Lethco", + "Mante", + "Mort", + "Myron", + "Odlow", + "Ribek", + "Roeck", + "Vogi", + "Vonder", + "Zogo", + "Doimo", + "Doton", + "Durel", + "Hildon", + "Kukla", + "Messa", + "Nanot", + "Platen", + "Raburn", + "Reman", + "Acrod", + "Coffy", + "Elrok", + "Foss", + "Hardig", + "Hombol", + "Hospel", + "Kaller", + "Klots", + "Krilok", + "Limar", + "Loket", + "Mesak", + "Morbit", + "Newin", + "Orill", + "Tabor", + "Tekot", + ], + [ + "Blythe", + "Chan", + "Kathrine", + "Marie", + "Maria", + "Naoko", + "Samantha", + "Satomi", + "Shannon", + "Athena", + "Caroline", + "Lumi", + "Lumina", + "Marissa", + "Sonia", + ], + ], + [TrainerType.SMASHER]: ["Aspen", "Elena", "Mari", "Amy", "Lizzy"], + [TrainerType.SNOW_WORKER]: [ + [ + "Braden", + "Brendon", + "Colin", + "Conrad", + "Dillan", + "Gary", + "Gerardo", + "Holden", + "Jackson", + "Mason", + "Quentin", + "Willy", + "Noel", + "Arnold", + "Brady", + "Brand", + "Cairn", + "Cliff", + "Don", + "Eddie", + "Felix", + "Filipe", + "Glenn", + "Gus", + "Heath", + "Matthew", + "Patton", + "Rich", + "Rob", + "Ryan", + "Scott", + "Shelby", + "Sterling", + "Tyler", + "Victor", + "Zack", + "Friedrich", + "Herman", + "Isaac", + "Leo", + "Maynard", + "Mitchell", + "Morgann", + "Nathan", + "Niel", + "Pasqual", + "Paul", + "Tavarius", + "Tibor", + "Dimitri", + "Narek", + "Yusif", + "Frank", + "Jeff", + "Vaclav", + "Ovid", + "Francis", + "Keith", + "Russel", + "Sangon", + "Toway", + "Bomber", + "Chean", + "Demit", + "Hubor", + "Kebile", + "Laber", + "Ordo", + "Retay", + "Ronix", + "Wagel", + "Dobit", + "Kaster", + "Lobel", + "Releo", + "Saken", + "Rustix", + ], + ["Georgia", "Sandra", "Yvonne"], + ], + [TrainerType.STRIKER]: ["Marco", "Roberto", "Tony"], + [TrainerType.SCHOOL_KID]: [ + [ + "Alan", + "Billy", + "Chad", + "Danny", + "Dudley", + "Jack", + "Joe", + "Johnny", + "Kipp", + "Nate", + "Ricky", + "Tommy", + "Jerry", + "Paul", + "Ted", + "Chance", + "Esteban", + "Forrest", + "Harrison", + "Connor", + "Sherman", + "Torin", + "Travis", + "Al", + "Carter", + "Edgar", + "Jem", + "Sammy", + "Shane", + "Shayne", + "Alvin", + "Keston", + "Neil", + "Seymour", + "William", + "Carson", + "Clark", + "Nolan", + ], + [ + "Georgia", + "Karen", + "Meiko", + "Christine", + "Mackenzie", + "Tiera", + "Ann", + "Gina", + "Lydia", + "Marsha", + "Millie", + "Sally", + "Serena", + "Silvia", + "Alberta", + "Cassie", + "Mara", + "Rita", + "Georgie", + "Meena", + "Nitzel", + ], + ], + [TrainerType.SWIMMER]: [ + [ + "Berke", + "Cameron", + "Charlie", + "George", + "Harold", + "Jerome", + "Kirk", + "Mathew", + "Parker", + "Randall", + "Seth", + "Simon", + "Tucker", + "Austin", + "Barry", + "Chad", + "Cody", + "Darrin", + "David", + "Dean", + "Douglas", + "Franklin", + "Gilbert", + "Herman", + "Jack", + "Luis", + "Matthew", + "Reed", + "Richard", + "Rodney", + "Roland", + "Spencer", + "Stan", + "Tony", + "Clarence", + "Declan", + "Dominik", + "Harrison", + "Kevin", + "Leonardo", + "Nolen", + "Pete", + "Santiago", + "Axle", + "Braden", + "Finn", + "Garrett", + "Mymo", + "Reece", + "Samir", + "Toby", + "Adrian", + "Colton", + "Dillon", + "Erik", + "Evan", + "Francisco", + "Glenn", + "Kurt", + "Oscar", + "Ricardo", + "Sam", + "Sheltin", + "Troy", + "Vincent", + "Wade", + "Wesley", + "Duane", + "Elmo", + "Esteban", + "Frankie", + "Ronald", + "Tyson", + "Bart", + "Matt", + "Tim", + "Wright", + "Jeffery", + "Kyle", + "Alessandro", + "Estaban", + "Kieran", + "Ramses", + "Casey", + "Dakota", + "Jared", + "Kalani", + "Keoni", + "Lawrence", + "Logan", + "Robert", + "Roddy", + "Yasu", + "Derek", + "Jacob", + "Bruce", + "Clayton", + ], + [ + "Briana", + "Dawn", + "Denise", + "Diana", + "Elaine", + "Kara", + "Kaylee", + "Lori", + "Nicole", + "Nikki", + "Paula", + "Susie", + "Wendy", + "Alice", + "Beth", + "Beverly", + "Brenda", + "Dana", + "Debra", + "Grace", + "Jenny", + "Katie", + "Laurel", + "Linda", + "Missy", + "Sharon", + "Tanya", + "Tara", + "Tisha", + "Carlee", + "Imani", + "Isabelle", + "Kyla", + "Sienna", + "Abigail", + "Amara", + "Anya", + "Connie", + "Maria", + "Melissa", + "Nora", + "Shirley", + "Shania", + "Tiffany", + "Aubree", + "Cassandra", + "Claire", + "Crystal", + "Erica", + "Gabrielle", + "Haley", + "Jessica", + "Joanna", + "Lydia", + "Mallory", + "Mary", + "Miranda", + "Paige", + "Sophia", + "Vanessa", + "Chelan", + "Debbie", + "Joy", + "Kendra", + "Leona", + "Mina", + "Caroline", + "Joyce", + "Larissa", + "Rebecca", + "Tyra", + "Dara", + "Desiree", + "Kaoru", + "Ruth", + "Coral", + "Genevieve", + "Isla", + "Marissa", + "Romy", + "Sheryl", + "Alexandria", + "Alicia", + "Chelsea", + "Jade", + "Kelsie", + "Laura", + "Portia", + "Shelby", + "Sara", + "Tiare", + "Kyra", + "Natasha", + "Layla", + "Scarlett", + "Cora", + ], + ], + [TrainerType.TWINS]: [ + "Amy & May", + "Jo & Zoe", + "Meg & Peg", + "Ann & Anne", + "Lea & Pia", + "Amy & Liv", + "Gina & Mia", + "Miu & Yuki", + "Tori & Tia", + "Eli & Anne", + "Jen & Kira", + "Joy & Meg", + "Kiri & Jan", + "Miu & Mia", + "Emma & Lil", + "Liv & Liz", + "Teri & Tia", + "Amy & Mimi", + "Clea & Gil", + "Day & Dani", + "Kay & Tia", + "Tori & Til", + "Saya & Aya", + "Emy & Lin", + "Kumi & Amy", + "Mayo & May", + "Ally & Amy", + "Lia & Lily", + "Rae & Ula", + "Sola & Ana", + "Tara & Val", + "Faith & Joy", + "Nana & Nina", + ], + [TrainerType.VETERAN]: [ + [ + "Armando", + "Brenden", + "Brian", + "Clayton", + "Edgar", + "Emanuel", + "Grant", + "Harlan", + "Terrell", + "Arlen", + "Chester", + "Hugo", + "Martell", + "Ray", + "Shaun", + "Abraham", + "Carter", + "Claude", + "Jerry", + "Lucius", + "Murphy", + "Rayne", + "Ron", + "Sinan", + "Sterling", + "Vincent", + "Zach", + "Gerard", + "Gilles", + "Louis", + "Timeo", + "Akira", + "Don", + "Eric", + "Harry", + "Leon", + "Roger", + "Angus", + "Aristo", + "Brone", + "Johnny", + ], + [ + "Julia", + "Karla", + "Kim", + "Sayuri", + "Tiffany", + "Cathy", + "Cecile", + "Chloris", + "Denae", + "Gina", + "Maya", + "Oriana", + "Portia", + "Rhona", + "Rosaline", + "Catrina", + "Inga", + "Trisha", + "Heather", + "Lynn", + "Sheri", + "Alonsa", + "Ella", + "Leticia", + "Kiara", + ], + ], + [TrainerType.WAITER]: [ + ["Bert", "Clint", "Maxwell", "Lou"], + ["Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia"], + ], + [TrainerType.WORKER]: [ + [ + "Braden", + "Brendon", + "Colin", + "Conrad", + "Dillan", + "Gary", + "Gerardo", + "Holden", + "Jackson", + "Mason", + "Quentin", + "Willy", + "Noel", + "Arnold", + "Brady", + "Brand", + "Cairn", + "Cliff", + "Don", + "Eddie", + "Felix", + "Filipe", + "Glenn", + "Gus", + "Heath", + "Matthew", + "Patton", + "Rich", + "Rob", + "Ryan", + "Scott", + "Shelby", + "Sterling", + "Tyler", + "Victor", + "Zack", + "Friedrich", + "Herman", + "Isaac", + "Leo", + "Maynard", + "Mitchell", + "Morgann", + "Nathan", + "Niel", + "Pasqual", + "Paul", + "Tavarius", + "Tibor", + "Dimitri", + "Narek", + "Yusif", + "Frank", + "Jeff", + "Vaclav", + "Ovid", + "Francis", + "Keith", + "Russel", + "Sangon", + "Toway", + "Bomber", + "Chean", + "Demit", + "Hubor", + "Kebile", + "Laber", + "Ordo", + "Retay", + "Ronix", + "Wagel", + "Dobit", + "Kaster", + "Lobel", + "Releo", + "Saken", + "Rustix", + ], + ["Georgia", "Sandra", "Yvonne"], + ], + [TrainerType.YOUNGSTER]: [ + [ + "Albert", + "Gordon", + "Ian", + "Jason", + "Jimmy", + "Mikey", + "Owen", + "Samuel", + "Warren", + "Allen", + "Ben", + "Billy", + "Calvin", + "Dillion", + "Eddie", + "Joey", + "Josh", + "Neal", + "Timmy", + "Tommy", + "Breyden", + "Deandre", + "Demetrius", + "Dillon", + "Jaylen", + "Johnson", + "Shigenobu", + "Chad", + "Cole", + "Cordell", + "Dan", + "Dave", + "Destin", + "Nash", + "Tyler", + "Yasu", + "Austin", + "Dallas", + "Darius", + "Donny", + "Jonathon", + "Logan", + "Michael", + "Oliver", + "Sebastian", + "Tristan", + "Wayne", + "Norman", + "Roland", + "Regis", + "Abe", + "Astor", + "Keita", + "Kenneth", + "Kevin", + "Kyle", + "Lester", + "Masao", + "Nicholas", + "Parker", + "Wes", + "Zachary", + "Cody", + "Henley", + "Jaye", + "Karl", + "Kenny", + "Masahiro", + "Pedro", + "Petey", + "Sinclair", + "Terrell", + "Waylon", + "Aidan", + "Anthony", + "David", + "Jacob", + "Jayden", + "Cutler", + "Ham", + "Caleb", + "Kai", + "Honus", + "Kenway", + "Bret", + "Chris", + "Cid", + "Dennis", + "Easton", + "Ken", + "Robby", + "Ronny", + "Shawn", + "Benjamin", + "Jake", + "Travis", + "Adan", + "Aday", + "Beltran", + "Elian", + "Hernan", + "Julen", + "Luka", + "Roi", + "Bernie", + "Dustin", + "Jonathan", + "Wyatt", + ], + [ + "Alice", + "Bridget", + "Carrie", + "Connie", + "Dana", + "Ellen", + "Krise", + "Laura", + "Linda", + "Michelle", + "Shannon", + "Andrea", + "Crissy", + "Janice", + "Robin", + "Sally", + "Tiana", + "Haley", + "Ali", + "Ann", + "Dalia", + "Dawn", + "Iris", + "Joana", + "Julia", + "Kay", + "Lisa", + "Megan", + "Mikaela", + "Miriam", + "Paige", + "Reli", + "Blythe", + "Briana", + "Caroline", + "Cassidy", + "Kaitlin", + "Madeline", + "Molly", + "Natalie", + "Samantha", + "Sarah", + "Cathy", + "Dye", + "Eri", + "Eva", + "Fey", + "Kara", + "Lurleen", + "Maki", + "Mali", + "Maya", + "Miki", + "Sibyl", + "Daya", + "Diana", + "Flo", + "Helia", + "Henrietta", + "Isabel", + "Mai", + "Persephone", + "Serena", + "Anna", + "Charlotte", + "Elin", + "Elsa", + "Lise", + "Sara", + "Suzette", + "Audrey", + "Emmy", + "Isabella", + "Madison", + "Rika", + "Rylee", + "Salla", + "Ellie", + "Alexandra", + "Amy", + "Lass", + "Brittany", + "Chel", + "Cindy", + "Dianne", + "Emily", + "Emma", + "Evelyn", + "Hana", + "Harleen", + "Hazel", + "Jocelyn", + "Katrina", + "Kimberly", + "Lina", + "Marge", + "Mila", + "Mizuki", + "Rena", + "Sal", + "Satoko", + "Summer", + "Tomoe", + "Vicky", + "Yue", + "Yumi", + "Lauren", + "Rei", + "Riley", + "Lois", + "Nancy", + "Tammy", + "Terry", + ], + ], + [TrainerType.HEX_MANIAC]: [ + "Kindra", + "Patricia", + "Tammy", + "Tasha", + "Valerie", + "Alaina", + "Kathleen", + "Leah", + "Makie", + "Sylvia", + "Anina", + "Arachna", + "Carrie", + "Desdemona", + "Josette", + "Luna", + "Melanie", + "Osanna", + "Raziah", + ], }; // function used in a commented code -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNames: Set, femaleTrainerNames: Set, forceFemale: boolean = false) { +// biome-ignore lint/correctness/noUnusedVariables: TODO make this into a script instead of having it be in src/data... +function fetchAndPopulateTrainerNames( + url: string, + parser: DOMParser, + trainerNames: Set, + femaleTrainerNames: Set, + forceFemale = false, +) { return new Promise(resolve => { fetch(`https://bulbapedia.bulbagarden.net/wiki/${url}_(Trainer_class)`) .then(response => response.text()) @@ -140,19 +2738,21 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam if (!trainerListHeader) { return []; } - const elements = [ ...(trainerListHeader?.parentElement?.childNodes ?? []) ]; + const elements = [...(trainerListHeader?.parentElement?.childNodes ?? [])]; const startChildIndex = elements.indexOf(trainerListHeader); const endChildIndex = elements.findIndex(h => h.nodeName === "H2" && elements.indexOf(h) > startChildIndex); - const tables = elements.filter(t => { - if (t.nodeName !== "TABLE" || t["className"] !== "expandable") { - return false; - } - const childIndex = elements.indexOf(t); - return childIndex > startChildIndex && childIndex < endChildIndex; - }).map(t => t as Element); + const tables = elements + .filter(t => { + if (t.nodeName !== "TABLE" || t["className"] !== "expandable") { + return false; + } + const childIndex = elements.indexOf(t); + return childIndex > startChildIndex && childIndex < endChildIndex; + }) + .map(t => t as Element); console.log(url, tables); for (const table of tables) { - const trainerRows = [ ...table.querySelectorAll("tr:not(:first-child)") ].filter(r => r.children.length === 9); + const trainerRows = [...table.querySelectorAll("tr:not(:first-child)")].filter(r => r.children.length === 9); for (const row of trainerRows) { const nameCell = row.firstElementChild; if (!nameCell) { diff --git a/src/data/type.ts b/src/data/type.ts index c57fd3b94a3..c9bf346fb85 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -271,7 +271,10 @@ export function getTypeDamageMultiplier(attackType: PokemonType, defType: Pokemo * Retrieve the color corresponding to a specific damage multiplier * @returns A color or undefined if the default color should be used */ -export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, side: "defense" | "offense"): string | undefined { +export function getTypeDamageMultiplierColor( + multiplier: TypeDamageMultiplier, + side: "defense" | "offense", +): string | undefined { if (side === "offense") { switch (multiplier) { case 0: @@ -291,7 +294,8 @@ export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, s case 8: return "#52C200"; } - } else if (side === "defense") { + } + if (side === "defense") { switch (multiplier) { case 0: return "#B1B100"; @@ -313,47 +317,47 @@ export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, s } } -export function getTypeRgb(type: PokemonType): [ number, number, number ] { +export function getTypeRgb(type: PokemonType): [number, number, number] { switch (type) { case PokemonType.NORMAL: - return [ 168, 168, 120 ]; + return [168, 168, 120]; case PokemonType.FIGHTING: - return [ 192, 48, 40 ]; + return [192, 48, 40]; case PokemonType.FLYING: - return [ 168, 144, 240 ]; + return [168, 144, 240]; case PokemonType.POISON: - return [ 160, 64, 160 ]; + return [160, 64, 160]; case PokemonType.GROUND: - return [ 224, 192, 104 ]; + return [224, 192, 104]; case PokemonType.ROCK: - return [ 184, 160, 56 ]; + return [184, 160, 56]; case PokemonType.BUG: - return [ 168, 184, 32 ]; + return [168, 184, 32]; case PokemonType.GHOST: - return [ 112, 88, 152 ]; + return [112, 88, 152]; case PokemonType.STEEL: - return [ 184, 184, 208 ]; + return [184, 184, 208]; case PokemonType.FIRE: - return [ 240, 128, 48 ]; + return [240, 128, 48]; case PokemonType.WATER: - return [ 104, 144, 240 ]; + return [104, 144, 240]; case PokemonType.GRASS: - return [ 120, 200, 80 ]; + return [120, 200, 80]; case PokemonType.ELECTRIC: - return [ 248, 208, 48 ]; + return [248, 208, 48]; case PokemonType.PSYCHIC: - return [ 248, 88, 136 ]; + return [248, 88, 136]; case PokemonType.ICE: - return [ 152, 216, 216 ]; + return [152, 216, 216]; case PokemonType.DRAGON: - return [ 112, 56, 248 ]; + return [112, 56, 248]; case PokemonType.DARK: - return [ 112, 88, 72 ]; + return [112, 88, 72]; case PokemonType.FAIRY: - return [ 232, 136, 200 ]; + return [232, 136, 200]; case PokemonType.STELLAR: - return [ 255, 255, 255 ]; + return [255, 255, 255]; default: - return [ 0, 0, 0 ]; + return [0, 0, 0]; } } diff --git a/src/data/weather.ts b/src/data/weather.ts index 2b7333de7dd..c2b0263c9f6 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -106,9 +106,13 @@ export class Weather { const field = globalScene.getField(true); for (const pokemon of field) { - let suppressWeatherEffectAbAttr: SuppressWeatherEffectAbAttr | null = pokemon.getAbility().getAttrs(SuppressWeatherEffectAbAttr)[0]; + let suppressWeatherEffectAbAttr: SuppressWeatherEffectAbAttr | null = pokemon + .getAbility() + .getAttrs(SuppressWeatherEffectAbAttr)[0]; if (!suppressWeatherEffectAbAttr) { - suppressWeatherEffectAbAttr = pokemon.hasPassive() ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr)[0] : null; + suppressWeatherEffectAbAttr = pokemon.hasPassive() + ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr)[0] + : null; } if (suppressWeatherEffectAbAttr && (!this.isImmutable() || suppressWeatherEffectAbAttr.affectsImmutable)) { return true; @@ -172,9 +176,13 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string | null export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string | null { switch (weatherType) { case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("weather:sandstormDamageMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); case WeatherType.HAIL: - return i18next.t("weather:hailDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("weather:hailDamageMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } return null; @@ -261,9 +269,14 @@ export function getTerrainClearMessage(terrainType: TerrainType): string | null export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainType): string { if (terrainType === TerrainType.MISTY) { - return i18next.t("terrain:mistyBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("terrain:mistyBlockMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } - return i18next.t("terrain:defaultBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), terrainName: getTerrainName(terrainType) }); + return i18next.t("terrain:defaultBlockMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + terrainName: getTerrainName(terrainType), + }); } export interface WeatherPoolEntry { @@ -276,9 +289,7 @@ export function getRandomWeatherType(arena: Arena): WeatherType { const hasSun = arena.getTimeOfDay() < 2; switch (arena.biomeType) { case Biome.GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 7 } - ]; + weatherPool = [{ weatherType: WeatherType.NONE, weight: 7 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); } @@ -295,26 +306,26 @@ export function getRandomWeatherType(arena: Arena): WeatherType { case Biome.FOREST: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 } + { weatherType: WeatherType.RAIN, weight: 5 }, ]; break; case Biome.SEA: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 12 } + { weatherType: WeatherType.RAIN, weight: 12 }, ]; break; case Biome.SWAMP: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, { weatherType: WeatherType.RAIN, weight: 4 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.BEACH: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 3 } + { weatherType: WeatherType.RAIN, weight: 3 }, ]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); @@ -324,27 +335,23 @@ export function getRandomWeatherType(arena: Arena): WeatherType { weatherPool = [ { weatherType: WeatherType.NONE, weight: 10 }, { weatherType: WeatherType.RAIN, weight: 5 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.SEABED: - weatherPool = [ - { weatherType: WeatherType.RAIN, weight: 1 } - ]; + weatherPool = [{ weatherType: WeatherType.RAIN, weight: 1 }]; break; case Biome.BADLANDS: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.SANDSTORM, weight: 2 } + { weatherType: WeatherType.SANDSTORM, weight: 2 }, ]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); } break; case Biome.DESERT: - weatherPool = [ - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; + weatherPool = [{ weatherType: WeatherType.SANDSTORM, weight: 2 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); } @@ -353,37 +360,38 @@ export function getRandomWeatherType(arena: Arena): WeatherType { weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, { weatherType: WeatherType.SNOW, weight: 4 }, - { weatherType: WeatherType.HAIL, weight: 1 } + { weatherType: WeatherType.HAIL, weight: 1 }, ]; break; case Biome.MEADOW: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 2 } - ]; + weatherPool = [{ weatherType: WeatherType.NONE, weight: 2 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); } case Biome.VOLCANO: weatherPool = [ - { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } + { + weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, + weight: 1, + }, ]; break; case Biome.GRAVEYARD: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.JUNGLE: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 2 } + { weatherType: WeatherType.RAIN, weight: 2 }, ]; break; case Biome.SNOWY_FOREST: weatherPool = [ { weatherType: WeatherType.SNOW, weight: 7 }, - { weatherType: WeatherType.HAIL, weight: 1 } + { weatherType: WeatherType.HAIL, weight: 1 }, ]; break; case Biome.ISLAND: @@ -403,7 +411,9 @@ export function getRandomWeatherType(arena: Arena): WeatherType { if (weatherPool.length > 1) { let totalWeight = 0; - weatherPool.forEach(w => totalWeight += w.weight); + for (const w of weatherPool) { + totalWeight += w.weight; + } const rand = Utils.randSeedInt(totalWeight); let w = 0; @@ -415,7 +425,5 @@ export function getRandomWeatherType(arena: Arena): WeatherType { } } - return weatherPool.length - ? weatherPool[0].weatherType - : WeatherType.NONE; + return weatherPool.length ? weatherPool[0].weatherType : WeatherType.NONE; } diff --git a/src/debug.js b/src/debug.js index e0f27332d3d..6ddf6046c7a 100644 --- a/src/debug.js +++ b/src/debug.js @@ -3,7 +3,9 @@ export function getData() { if (!dataStr) { return null; } - return JSON.parse(atob(dataStr), (k, v) => k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v) : v); + return JSON.parse(atob(dataStr), (k, v) => + k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v) : v, + ); } export function getSession() { diff --git a/src/enums/stat.ts b/src/enums/stat.ts index 6b3f7dc6d79..a2b81b7e64b 100644 --- a/src/enums/stat.ts +++ b/src/enums/stat.ts @@ -48,9 +48,11 @@ export type TempBattleStat = typeof TEMP_BATTLE_STATS[number]; export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boolean) { if (stages === 1) { return isIncrease ? "battle:statRose" : "battle:statFell"; - } else if (stages === 2) { + } + if (stages === 2) { return isIncrease ? "battle:statSharplyRose" : "battle:statHarshlyFell"; - } else if (stages > 2 && stages <= 6) { + } + if (stages > 2 && stages <= 6) { return isIncrease ? "battle:statRoseDrastically" : "battle:statSeverelyFell"; } return isIncrease ? "battle:statWontGoAnyHigher" : "battle:statWontGoAnyLower"; diff --git a/src/events/arena.ts b/src/events/arena.ts index 660a113f96b..ad77289b76b 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -32,7 +32,7 @@ export class ArenaEvent extends Event { /** * Container class for {@linkcode ArenaEventType.WEATHER_CHANGED} events * @extends ArenaEvent -*/ + */ export class WeatherChangedEvent extends ArenaEvent { /** The {@linkcode WeatherType} being overridden */ public oldWeatherType: WeatherType; @@ -48,7 +48,7 @@ export class WeatherChangedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TERRAIN_CHANGED} events * @extends ArenaEvent -*/ + */ export class TerrainChangedEvent extends ArenaEvent { /** The {@linkcode TerrainType} being overridden */ public oldTerrainType: TerrainType; @@ -65,7 +65,7 @@ export class TerrainChangedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TAG_ADDED} events * @extends ArenaEvent -*/ + */ export class TagAddedEvent extends ArenaEvent { /** The {@linkcode ArenaTagType} being added */ public arenaTagType: ArenaTagType; @@ -76,7 +76,13 @@ export class TagAddedEvent extends ArenaEvent { /** The maximum amount of layers of the arena trap. */ public arenaTagMaxLayers: number; - constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number, arenaTagLayers?: number, arenaTagMaxLayers?: number) { + constructor( + arenaTagType: ArenaTagType, + arenaTagSide: ArenaTagSide, + duration: number, + arenaTagLayers?: number, + arenaTagMaxLayers?: number, + ) { super(ArenaEventType.TAG_ADDED, duration); this.arenaTagType = arenaTagType; @@ -88,7 +94,7 @@ export class TagAddedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TAG_REMOVED} events * @extends ArenaEvent -*/ + */ export class TagRemovedEvent extends ArenaEvent { /** The {@linkcode ArenaTagType} being removed */ public arenaTagType: ArenaTagType; diff --git a/src/events/battle-scene.ts b/src/events/battle-scene.ts index 4ed0e60cdc7..83d260bd7d2 100644 --- a/src/events/battle-scene.ts +++ b/src/events/battle-scene.ts @@ -34,7 +34,7 @@ export enum BattleSceneEventType { * Triggers after a turn ends in battle * @see {@linkcode TurnEndEvent} */ - TURN_END = "onTurnEnd", + TURN_END = "onTurnEnd", /** * Triggers when a new {@linkcode Arena} is created during initialization @@ -46,7 +46,7 @@ export enum BattleSceneEventType { /** * Container class for {@linkcode BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED} events * @extends Event -*/ + */ export class CandyUpgradeNotificationChangedEvent extends Event { /** The new value the setting was changed to */ public newValue: number; @@ -60,7 +60,7 @@ export class CandyUpgradeNotificationChangedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.MOVE_USED} events * @extends Event -*/ + */ export class MoveUsedEvent extends Event { /** The ID of the {@linkcode Pokemon} that used the {@linkcode Move} */ public pokemonId: number; @@ -79,7 +79,7 @@ export class MoveUsedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.BERRY_USED} events * @extends Event -*/ + */ export class BerryUsedEvent extends Event { /** The {@linkcode BerryModifier} being used */ public berryModifier: BerryModifier; @@ -93,7 +93,7 @@ export class BerryUsedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.ENCOUNTER_PHASE} events * @extends Event -*/ + */ export class EncounterPhaseEvent extends Event { constructor() { super(BattleSceneEventType.ENCOUNTER_PHASE); @@ -102,7 +102,7 @@ export class EncounterPhaseEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.TURN_INIT} events * @extends Event -*/ + */ export class TurnInitEvent extends Event { constructor() { super(BattleSceneEventType.TURN_INIT); @@ -111,7 +111,7 @@ export class TurnInitEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.TURN_END} events * @extends Event -*/ + */ export class TurnEndEvent extends Event { /** The amount of turns in the current battle */ public turnCount: number; @@ -124,7 +124,7 @@ export class TurnEndEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.NEW_ARENA} events * @extends Event -*/ + */ export class NewArenaEvent extends Event { constructor() { super(BattleSceneEventType.NEW_ARENA); diff --git a/src/events/egg.ts b/src/events/egg.ts index dc3d2b55ffe..a0c26c82883 100644 --- a/src/events/egg.ts +++ b/src/events/egg.ts @@ -3,13 +3,13 @@ export enum EggEventType { * Triggers when egg count is changed. * @see {@linkcode MoveUsedEvent} */ - EGG_COUNT_CHANGED = "onEggCountChanged" + EGG_COUNT_CHANGED = "onEggCountChanged", } /** * Container class for {@linkcode EggEventType.EGG_COUNT_CHANGED} events * @extends Event -*/ + */ export class EggCountChangedEvent extends Event { /** The updated egg count. */ public eggCount: number; diff --git a/src/field/anims.ts b/src/field/anims.ts index 9ffaae59bbc..cd6209dddff 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -24,13 +24,17 @@ export function addPokeballOpenParticles(x: number, y: number, pokeballType: Pok } function doDefaultPbOpenParticles(x: number, y: number, radius: number) { - const pbOpenParticlesFrameNames = globalScene.anims.generateFrameNames("pb_particles", { start: 0, end: 3, suffix: ".png" }); - if (!(globalScene.anims.exists("pb_open_particle"))) { + const pbOpenParticlesFrameNames = globalScene.anims.generateFrameNames("pb_particles", { + start: 0, + end: 3, + suffix: ".png", + }); + if (!globalScene.anims.exists("pb_open_particle")) { globalScene.anims.create({ key: "pb_open_particle", frames: pbOpenParticlesFrameNames, frameRate: 16, - repeat: -1 + repeat: -1, }); } @@ -38,17 +42,17 @@ function doDefaultPbOpenParticles(x: number, y: number, radius: number) { const particle = globalScene.add.sprite(x, y, "pb_open_particle"); globalScene.field.add(particle); const angle = index * 45; - const [ xCoord, yCoord ] = [ radius * Math.cos(angle * Math.PI / 180), radius * Math.sin(angle * Math.PI / 180) ]; + const [xCoord, yCoord] = [radius * Math.cos((angle * Math.PI) / 180), radius * Math.sin((angle * Math.PI) / 180)]; globalScene.tweens.add({ targets: particle, x: x + xCoord, y: y + yCoord, - duration: 575 + duration: 575, }); particle.play({ key: "pb_open_particle", startFrame: (index + 3) % 4, - frameRate: Math.floor(16 * globalScene.gameSpeed) + frameRate: Math.floor(16 * globalScene.gameSpeed), }); globalScene.tweens.add({ targets: particle, @@ -56,7 +60,7 @@ function doDefaultPbOpenParticles(x: number, y: number, radius: number) { duration: 75, alpha: 0, ease: "Sine.easeIn", - onComplete: () => particle.destroy() + onComplete: () => particle.destroy(), }); }; @@ -64,7 +68,7 @@ function doDefaultPbOpenParticles(x: number, y: number, radius: number) { globalScene.time.addEvent({ delay: 20, repeat: 16, - callback: () => addParticle(++particleCount) + callback: () => addParticle(++particleCount), }); } @@ -84,7 +88,7 @@ function doUbOpenParticles(x: number, y: number, frameIndex: number) { for (const particle of particles) { particle.destroy(); } - } + }, }); } @@ -105,12 +109,20 @@ function doMbOpenParticles(x: number, y: number) { for (const particle of particles) { particle.destroy(); } - } + }, }); } } -function doFanOutParticle(trigIndex: number, x: number, y: number, xSpeed: number, ySpeed: number, angle: number, frameIndex: number): Phaser.GameObjects.Image { +function doFanOutParticle( + trigIndex: number, + x: number, + y: number, + xSpeed: number, + ySpeed: number, + angle: number, + frameIndex: number, +): Phaser.GameObjects.Image { let f = 0; const particle = globalScene.add.image(x, y, "pb_particles", `${frameIndex}.png`); @@ -122,7 +134,7 @@ function doFanOutParticle(trigIndex: number, x: number, y: number, xSpeed: numbe } particle.x = x + sin(trigIndex, f * xSpeed); particle.y = y + cos(trigIndex, f * ySpeed); - trigIndex = (trigIndex + angle); + trigIndex = trigIndex + angle; f++; }; @@ -131,7 +143,7 @@ function doFanOutParticle(trigIndex: number, x: number, y: number, xSpeed: numbe duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); return particle; @@ -155,16 +167,16 @@ export function addPokeballCaptureStars(pokeball: Phaser.GameObjects.Sprite): vo y: pokeball.y, alpha: 0, ease: "Sine.easeIn", - duration: 250 + duration: 250, }); - } + }, }); const dist = randGauss(25); globalScene.tweens.add({ targets: particle, x: pokeball.x + dist, - duration: 500 + duration: 500, }); globalScene.tweens.add({ @@ -172,7 +184,7 @@ export function addPokeballCaptureStars(pokeball: Phaser.GameObjects.Sprite): vo alpha: 0, delay: 425, duration: 75, - onComplete: () => particle.destroy() + onComplete: () => particle.destroy(), }); }; @@ -200,7 +212,10 @@ export function doShinySparkleAnim(sparkleSprite: Phaser.GameObjects.Sprite, var // Make sure the animation exists, and create it if not if (!globalScene.anims.exists(animationKey)) { - const frameNames = globalScene.anims.generateFrameNames(spriteKey, { suffix: ".png", end: 34 }); + const frameNames = globalScene.anims.generateFrameNames(spriteKey, { + suffix: ".png", + end: 34, + }); globalScene.anims.create({ key: `sparkle${keySuffix}`, frames: frameNames, diff --git a/src/field/arena.ts b/src/field/arena.ts index aedb0c1c5f8..2ed94e0e3e3 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -5,7 +5,14 @@ import type { Constructor } from "#app/utils"; import * as Utils from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, getLegendaryWeatherContinuesMessage, Weather } from "#app/data/weather"; +import { + getTerrainClearMessage, + getTerrainStartMessage, + getWeatherClearMessage, + getWeatherStartMessage, + getLegendaryWeatherContinuesMessage, + Weather, +} from "#app/data/weather"; import { CommonAnim } from "#app/data/battle-anims"; import type { PokemonType } from "#enums/pokemon-type"; import type Move from "#app/data/moves/move"; @@ -19,7 +26,7 @@ import { applyPostWeatherChangeAbAttrs, PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, - TerrainEventTypeChangeAbAttr + TerrainEventTypeChangeAbAttr, } from "#app/data/ability"; import type Pokemon from "#app/field/pokemon"; import Overrides from "#app/overrides"; @@ -58,7 +65,7 @@ export class Arena { public readonly eventTarget: EventTarget = new EventTarget(); - constructor(biome: Biome, bgm: string, playerFaints: number = 0) { + constructor(biome: Biome, bgm: string, playerFaints = 0) { this.biomeType = biome; this.tags = []; this.bgm = bgm; @@ -88,19 +95,29 @@ export class Arena { if (timeOfDay !== this.lastTimeOfDay) { this.pokemonPool = {}; for (const tier of Object.keys(biomePokemonPools[this.biomeType])) { - this.pokemonPool[tier] = Object.assign([], biomePokemonPools[this.biomeType][tier][TimeOfDay.ALL]).concat(biomePokemonPools[this.biomeType][tier][timeOfDay]); + this.pokemonPool[tier] = Object.assign([], biomePokemonPools[this.biomeType][tier][TimeOfDay.ALL]).concat( + biomePokemonPools[this.biomeType][tier][timeOfDay], + ); } this.lastTimeOfDay = timeOfDay; } } - randomSpecies(waveIndex: number, level: number, attempt?: number, luckValue?: number, isBoss?: boolean): PokemonSpecies { + randomSpecies( + waveIndex: number, + level: number, + attempt?: number, + luckValue?: number, + isBoss?: boolean, + ): PokemonSpecies { const overrideSpecies = globalScene.gameMode.getOverrideSpecies(waveIndex); if (overrideSpecies) { return overrideSpecies; } - const isBossSpecies = !!globalScene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length - && (this.biomeType !== Biome.END || globalScene.gameMode.isClassic || globalScene.gameMode.isWaveFinal(waveIndex)); + const isBossSpecies = + !!globalScene.getEncounterBossSegments(waveIndex, level) && + !!this.pokemonPool[BiomePoolTier.BOSS].length && + (this.biomeType !== Biome.END || globalScene.gameMode.isClassic || globalScene.gameMode.isWaveFinal(waveIndex)); const randVal = isBossSpecies ? 64 : 512; // luck influences encounter rarity let luckModifier = 0; @@ -109,8 +126,22 @@ export class Arena { } const tierValue = Utils.randSeedInt(randVal - luckModifier); let tier = !isBossSpecies - ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE - : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + ? tierValue >= 156 + ? BiomePoolTier.COMMON + : tierValue >= 32 + ? BiomePoolTier.UNCOMMON + : tierValue >= 6 + ? BiomePoolTier.RARE + : tierValue >= 1 + ? BiomePoolTier.SUPER_RARE + : BiomePoolTier.ULTRA_RARE + : tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); while (!this.pokemonPool[tier].length) { console.log(`Downgraded rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); @@ -129,7 +160,7 @@ export class Arena { } else { const levelThresholds = Object.keys(entry); for (let l = levelThresholds.length - 1; l >= 0; l--) { - const levelThreshold = parseInt(levelThresholds[l]); + const levelThreshold = Number.parseInt(levelThresholds[l]); if (level >= levelThreshold) { const speciesIds = entry[levelThreshold]; if (speciesIds.length > 1) { @@ -146,13 +177,13 @@ export class Arena { if (ret.subLegendary || ret.legendary || ret.mythical) { switch (true) { - case (ret.baseTotal >= 720): + case ret.baseTotal >= 720: regen = level < 90; break; - case (ret.baseTotal >= 670): + case ret.baseTotal >= 670: regen = level < 70; break; - case (ret.baseTotal >= 580): + case ret.baseTotal >= 580: regen = level < 50; break; default: @@ -175,14 +206,29 @@ export class Arena { return ret; } - randomTrainerType(waveIndex: number, isBoss: boolean = false): TrainerType { - const isTrainerBoss = !!this.trainerPool[BiomePoolTier.BOSS].length - && (globalScene.gameMode.isTrainerBoss(waveIndex, this.biomeType, globalScene.offsetGym) || isBoss); + randomTrainerType(waveIndex: number, isBoss = false): TrainerType { + const isTrainerBoss = + !!this.trainerPool[BiomePoolTier.BOSS].length && + (globalScene.gameMode.isTrainerBoss(waveIndex, this.biomeType, globalScene.offsetGym) || isBoss); console.log(isBoss, this.trainerPool); const tierValue = Utils.randSeedInt(!isTrainerBoss ? 512 : 64); let tier = !isTrainerBoss - ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE - : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + ? tierValue >= 156 + ? BiomePoolTier.COMMON + : tierValue >= 32 + ? BiomePoolTier.UNCOMMON + : tierValue >= 6 + ? BiomePoolTier.RARE + : tierValue >= 1 + ? BiomePoolTier.SUPER_RARE + : BiomePoolTier.ULTRA_RARE + : tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); while (tier && !this.trainerPool[tier].length) { console.log(`Downgraded trainer rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); @@ -274,14 +320,21 @@ export class Arena { const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; - if (this.weather?.isImmutable() && ![ WeatherType.HARSH_SUN, WeatherType.HEAVY_RAIN, WeatherType.STRONG_WINDS, WeatherType.NONE ].includes(weather)) { - globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (oldWeatherType - 1), true)); + if ( + this.weather?.isImmutable() && + ![WeatherType.HARSH_SUN, WeatherType.HEAVY_RAIN, WeatherType.STRONG_WINDS, WeatherType.NONE].includes(weather) + ) { + globalScene.unshiftPhase( + new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (oldWeatherType - 1), true), + ); globalScene.queueMessage(getLegendaryWeatherContinuesMessage(oldWeatherType)!); return false; } this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!)); // TODO: is this bang correct? + this.eventTarget.dispatchEvent( + new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!), + ); // TODO: is this bang correct? if (this.weather) { globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (weather - 1), true)); @@ -290,10 +343,15 @@ export class Arena { globalScene.queueMessage(getWeatherClearMessage(oldWeatherType)!); // TODO: is this bang correct? } - globalScene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather)); - applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); - }); + globalScene + .getField(true) + .filter(p => p.isOnField()) + .map(pokemon => { + pokemon.findAndRemoveTags( + t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather), + ); + applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); + }); return true; } @@ -302,9 +360,9 @@ export class Arena { * Function to trigger all weather based form changes */ triggerWeatherBasedFormChanges(): void { - globalScene.getField(true).forEach( p => { - const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM); - const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM); + globalScene.getField(true).forEach(p => { + const isCastformWithForecast = p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM; + const isCherrimWithFlowerGift = p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM; if (isCastformWithForecast || isCherrimWithFlowerGift) { new ShowAbilityPhase(p.getBattlerIndex()); @@ -317,9 +375,11 @@ export class Arena { * Function to trigger all weather based form changes back into their normal forms */ triggerWeatherBasedFormChangesToNormal(): void { - globalScene.getField(true).forEach( p => { - const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM); - const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM); + globalScene.getField(true).forEach(p => { + const isCastformWithForecast = + p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM; + const isCherrimWithFlowerGift = + p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM; if (isCastformWithForecast || isCherrimWithFlowerGift) { new ShowAbilityPhase(p.getBattlerIndex()); @@ -328,7 +388,7 @@ export class Arena { }); } - trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim: boolean = false): boolean { + trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim = false): boolean { if (this.terrain?.terrainType === (terrain || undefined)) { return false; } @@ -336,7 +396,9 @@ export class Arena { const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!)); // TODO: are those bangs correct? + this.eventTarget.dispatchEvent( + new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!), + ); // TODO: are those bangs correct? if (this.terrain) { if (!ignoreAnim) { @@ -347,11 +409,16 @@ export class Arena { globalScene.queueMessage(getTerrainClearMessage(oldTerrainType)!); // TODO: is this bang correct? } - globalScene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); - applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); - applyAbAttrs(TerrainEventTypeChangeAbAttr, pokemon, null, false); - }); + globalScene + .getField(true) + .filter(p => p.isOnField()) + .map(pokemon => { + pokemon.findAndRemoveTags( + t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain), + ); + applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); + applyAbAttrs(TerrainEventTypeChangeAbAttr, pokemon, null, false); + }); return true; } @@ -478,16 +545,13 @@ export class Arena { overrideTint(): [number, number, number] { switch (Overrides.ARENA_TINT_OVERRIDE) { case TimeOfDay.DUSK: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [number, number, number]; - break; - case (TimeOfDay.NIGHT): - return [ 64, 64, 64 ]; - break; + return [98, 48, 73].map(c => Math.round((c + 128) / 2)) as [number, number, number]; + case TimeOfDay.NIGHT: + return [64, 64, 64]; case TimeOfDay.DAWN: case TimeOfDay.DAY: default: - return [ 128, 128, 128 ]; - break; + return [128, 128, 128]; } } @@ -497,9 +561,9 @@ export class Arena { } switch (this.biomeType) { case Biome.ABYSS: - return [ 64, 64, 64 ]; + return [64, 64, 64]; default: - return [ 128, 128, 128 ]; + return [128, 128, 128]; } } @@ -508,12 +572,12 @@ export class Arena { return this.overrideTint(); } if (!this.isOutside()) { - return [ 0, 0, 0 ]; + return [0, 0, 0]; } switch (this.biomeType) { default: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [number, number, number]; + return [98, 48, 73].map(c => Math.round((c + 128) / 2)) as [number, number, number]; } } @@ -529,12 +593,12 @@ export class Arena { } if (!this.isOutside()) { - return [ 64, 64, 64 ]; + return [64, 64, 64]; } switch (this.biomeType) { default: - return [ 48, 48, 98 ]; + return [48, 48, 98]; } } @@ -550,10 +614,16 @@ export class Arena { * @param simulated if `true`, this applies arena tags without changing game state * @param args array of parameters that the called upon tags may need */ - applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, simulated: boolean, ...args: unknown[]): void { - let tags = typeof tagType === "string" - ? this.tags.filter(t => t.tagType === tagType) - : this.tags.filter(t => t instanceof tagType); + applyTagsForSide( + tagType: ArenaTagType | Constructor, + side: ArenaTagSide, + simulated: boolean, + ...args: unknown[] + ): void { + let tags = + typeof tagType === "string" + ? this.tags.filter(t => t.tagType === tagType) + : this.tags.filter(t => t instanceof tagType); if (side !== ArenaTagSide.BOTH) { tags = tags.filter(t => t.side === side); } @@ -582,7 +652,15 @@ export class Arena { * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon * @returns `false` if there already exists a tag of this type in the Arena */ - addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { + addTag( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves | undefined, + sourceId: number, + side: ArenaTagSide = ArenaTagSide.BOTH, + quiet = false, + targetIndex?: BattlerIndex, + ): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { existingTag.onOverlap(this); @@ -603,7 +681,9 @@ export class Arena { const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; - this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers)); + this.eventTarget.dispatchEvent( + new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers), + ); } return true; @@ -618,7 +698,7 @@ export class Arena { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } - hasTag(tagType: ArenaTagType) : boolean { + hasTag(tagType: ArenaTagType): boolean { return !!this.getTag(tagType); } @@ -631,9 +711,13 @@ export class Arena { * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there */ getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag | undefined { - return typeof(tagType) === "string" - ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) - : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); + return typeof tagType === "string" + ? this.tags.find( + t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ) + : this.tags.find( + t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ); } /** @@ -652,16 +736,20 @@ export class Arena { * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side */ findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] { - return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); + return this.tags.filter( + t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ); } lapseTags(): void { - this.tags.filter(t => !(t.lapse(this))).forEach(t => { - t.onRemove(this); - this.tags.splice(this.tags.indexOf(t), 1); + this.tags + .filter(t => !t.lapse(this)) + .forEach(t => { + t.onRemove(this); + this.tags.splice(this.tags.indexOf(t), 1); - this.eventTarget.dispatchEvent(new TagRemovedEvent(t.tagType, t.side, t.turnCount)); - }); + this.eventTarget.dispatchEvent(new TagRemovedEvent(t.tagType, t.side, t.turnCount)); + }); } removeTag(tagType: ArenaTagType): boolean { @@ -676,7 +764,7 @@ export class Arena { return !!tag; } - removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet: boolean = false): boolean { + removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet = false): boolean { const tag = this.getTagOnSide(tagType, side); if (tag) { tag.onRemove(this, quiet); @@ -687,11 +775,12 @@ export class Arena { return !!tag; } - removeAllTags(): void { while (this.tags.length) { this.tags[0].onRemove(this); - this.eventTarget.dispatchEvent(new TagRemovedEvent(this.tags[0].tagType, this.tags[0].side, this.tags[0].turnCount)); + this.eventTarget.dispatchEvent( + new TagRemovedEvent(this.tags[0].tagType, this.tags[0].side, this.tags[0].turnCount), + ); this.tags.splice(0, 1); } @@ -726,7 +815,7 @@ export class Arena { case Biome.TALL_GRASS: return 9.608; case Biome.METROPOLIS: - return 141.470; + return 141.47; case Biome.FOREST: return 0.341; case Biome.SEA: @@ -738,17 +827,17 @@ export class Arena { case Biome.LAKE: return 7.215; case Biome.SEABED: - return 2.600; + return 2.6; case Biome.MOUNTAIN: return 4.018; case Biome.BADLANDS: - return 17.790; + return 17.79; case Biome.CAVE: - return 14.240; + return 14.24; case Biome.DESERT: return 1.143; case Biome.ICE_CAVE: - return 0.000; + return 0.0; case Biome.MEADOW: return 3.891; case Biome.POWER_PLANT: @@ -762,17 +851,17 @@ export class Arena { case Biome.FACTORY: return 4.985; case Biome.RUINS: - return 0.000; + return 0.0; case Biome.WASTELAND: return 6.336; case Biome.ABYSS: - return 5.130; + return 5.13; case Biome.SPACE: return 20.036; case Biome.CONSTRUCTION_SITE: return 1.222; case Biome.JUNGLE: - return 0.000; + return 0.0; case Biome.FAIRY_CAVE: return 4.542; case Biome.TEMPLE: @@ -782,7 +871,7 @@ export class Arena { case Biome.LABORATORY: return 114.862; case Biome.SLUM: - return 0.000; + return 0.0; case Biome.SNOWY_FOREST: return 3.047; case Biome.END: @@ -850,13 +939,14 @@ export class ArenaBase extends Phaser.GameObjects.Container { this.base = globalScene.addFieldSprite(0, 0, "plains_a", undefined, 1); this.base.setOrigin(0, 0); - this.props = !player ? - new Array(3).fill(null).map(() => { - const ret = globalScene.addFieldSprite(0, 0, "plains_b", undefined, 1); - ret.setOrigin(0, 0); - ret.setVisible(false); - return ret; - }) : []; + this.props = !player + ? new Array(3).fill(null).map(() => { + const ret = globalScene.addFieldSprite(0, 0, "plains_b", undefined, 1); + ret.setOrigin(0, 0); + ret.setVisible(false); + return ret; + }) + : []; } setBiome(biome: Biome, propValue?: number): void { @@ -868,13 +958,18 @@ export class ArenaBase extends Phaser.GameObjects.Container { this.base.setTexture(baseKey); if (this.base.texture.frameTotal > 1) { - const baseFrameNames = globalScene.anims.generateFrameNames(baseKey, { zeroPad: 4, suffix: ".png", start: 1, end: this.base.texture.frameTotal - 1 }); - if (!(globalScene.anims.exists(baseKey))) { + const baseFrameNames = globalScene.anims.generateFrameNames(baseKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: this.base.texture.frameTotal - 1, + }); + if (!globalScene.anims.exists(baseKey)) { globalScene.anims.create({ key: baseKey, frames: baseFrameNames, frameRate: 12, - repeat: -1 + repeat: -1, }); } this.base.play(baseKey); @@ -886,33 +981,40 @@ export class ArenaBase extends Phaser.GameObjects.Container { } if (!this.player) { - globalScene.executeWithSeedOffset(() => { - this.propValue = propValue === undefined - ? hasProps ? Utils.randSeedInt(8) : 0 - : propValue; - this.props.forEach((prop, p) => { - const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; - prop.setTexture(propKey); + globalScene.executeWithSeedOffset( + () => { + this.propValue = propValue === undefined ? (hasProps ? Utils.randSeedInt(8) : 0) : propValue; + this.props.forEach((prop, p) => { + const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; + prop.setTexture(propKey); - if (hasProps && prop.texture.frameTotal > 1) { - const propFrameNames = globalScene.anims.generateFrameNames(propKey, { zeroPad: 4, suffix: ".png", start: 1, end: prop.texture.frameTotal - 1 }); - if (!(globalScene.anims.exists(propKey))) { - globalScene.anims.create({ - key: propKey, - frames: propFrameNames, - frameRate: 12, - repeat: -1 + if (hasProps && prop.texture.frameTotal > 1) { + const propFrameNames = globalScene.anims.generateFrameNames(propKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: prop.texture.frameTotal - 1, }); + if (!globalScene.anims.exists(propKey)) { + globalScene.anims.create({ + key: propKey, + frames: propFrameNames, + frameRate: 12, + repeat: -1, + }); + } + prop.play(propKey); + } else { + prop.stop(); } - prop.play(propKey); - } else { - prop.stop(); - } - prop.setVisible(hasProps && !!(this.propValue & (1 << p))); - this.add(prop); - }); - }, globalScene.currentBattle?.waveIndex || 0, globalScene.waveSeed); + prop.setVisible(hasProps && !!(this.propValue & (1 << p))); + this.add(prop); + }); + }, + globalScene.currentBattle?.waveIndex || 0, + globalScene.waveSeed, + ); } } } diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 1551edc9697..63da641a114 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -6,7 +6,7 @@ import * as Utils from "../utils"; import type { BattlerIndex } from "../battle"; import { globalScene } from "#app/global-scene"; -type TextAndShadowArr = [ string | null, string | null ]; +type TextAndShadowArr = [string | null, string | null]; export default class DamageNumberHandler { private damageNumbers: Map; @@ -15,35 +15,45 @@ export default class DamageNumberHandler { this.damageNumbers = new Map(); } - add(target: Pokemon, amount: number, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void { + add( + target: Pokemon, + amount: number, + result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, + critical = false, + ): void { if (!globalScene?.damageNumbersMode) { return; } const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; - const damageNumber = addTextObject(target.x, -(globalScene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, Utils.formatStat(amount, true), TextStyle.SUMMARY); + const damageNumber = addTextObject( + target.x, + -(globalScene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, + Utils.formatStat(amount, true), + TextStyle.SUMMARY, + ); damageNumber.setName("text-damage-number"); damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); - let [ textColor, shadowColor ] : TextAndShadowArr = [ null, null ]; + let [textColor, shadowColor]: TextAndShadowArr = [null, null]; switch (result) { case HitResult.SUPER_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f8d030", "#b8a038" ]; + [textColor, shadowColor] = ["#f8d030", "#b8a038"]; break; case HitResult.NOT_VERY_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f08030", "#c03028" ]; + [textColor, shadowColor] = ["#f08030", "#c03028"]; break; case HitResult.ONE_HIT_KO: - [ textColor, shadowColor ] = [ "#a040a0", "#483850" ]; + [textColor, shadowColor] = ["#a040a0", "#483850"]; break; case HitResult.HEAL: - [ textColor, shadowColor ] = [ "#78c850", "#588040" ]; + [textColor, shadowColor] = ["#78c850", "#588040"]; break; default: - [ textColor, shadowColor ] = [ "#ffffff", "#636363" ]; + [textColor, shadowColor] = ["#ffffff", "#636363"]; break; } @@ -77,7 +87,7 @@ export default class DamageNumberHandler { targets: damageNumber, duration: Utils.fixedInt(750), alpha: 1, - y: "-=32" + y: "-=32", }); globalScene.tweens.add({ delay: 375, @@ -88,7 +98,7 @@ export default class DamageNumberHandler { onComplete: () => { this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); - } + }, }); return; } @@ -104,7 +114,7 @@ export default class DamageNumberHandler { scaleX: 0.75 * baseScale, scaleY: 1.25 * baseScale, y: "-=16", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), @@ -112,69 +122,71 @@ export default class DamageNumberHandler { scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, y: "+=16", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.25 * baseScale, scaleY: 0.75 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, y: "-=8", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(50), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, y: "+=8", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.125 * baseScale, scaleY: 0.875 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, y: "-=4", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(50), scaleX: 0.975 * baseScale, scaleY: 1.025 * baseScale, y: "+=4", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.075 * baseScale, scaleY: 0.925 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(25), scaleX: baseScale, scaleY: baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { delay: Utils.fixedInt(500), alpha: 0, onComplete: () => { - this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); + this.damageNumbers + .get(battlerIndex)! + .splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); - } - } - ] + }, + }, + ], }); } } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 1ea8f16e8f7..649a969d415 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -36,7 +36,7 @@ export class MysteryEncounterSpriteConfig { /** The sprite key (which is the image file name). e.g. "ace_trainer_f" */ spriteKey: string; /** Refer to [/public/images](../../public/images) directorty for all folder names */ - fileRoot: KnownFileRoot & string | string; + fileRoot: (KnownFileRoot & string) | string; /** Optional replacement for `spriteKey`/`fileRoot`. Just know this defaults to male/genderless, form 0, no shiny */ species?: Species; /** Enable shadow. Defaults to `false` */ @@ -80,7 +80,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con public encounter: MysteryEncounter; public spriteConfigs: MysteryEncounterSpriteConfig[]; public enterFromRight: boolean; - private shinySparkleSprites: { sprite: Phaser.GameObjects.Sprite, variant: Variant }[]; + private shinySparkleSprites: { + sprite: Phaser.GameObjects.Sprite; + variant: Variant; + }[]; constructor(encounter: MysteryEncounter) { super(globalScene, -72, 76); @@ -89,7 +92,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con // Shallow copy configs to allow visual config updates at runtime without dirtying master copy of Encounter this.spriteConfigs = encounter.spriteConfigs.map(config => { const result = { - ...config + ...config, }; if (!isNullOrUndefined(result.species)) { @@ -108,14 +111,22 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const getSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { const ret = globalScene.addFieldSprite(0, 0, spriteKey); ret.setOrigin(0.5, 1); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + yShadowOffset: yShadow ?? 0, + }); return ret; }; const getItemSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { const icon = globalScene.add.sprite(-19, 2, "items", spriteKey); icon.setOrigin(0.5, 1); - icon.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); + icon.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + yShadowOffset: yShadow ?? 0, + }); return icon; }; @@ -129,7 +140,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.shinySparkleSprites = []; const shinySparkleSprites = globalScene.add.container(0, 0); - this.spriteConfigs?.forEach((config) => { + this.spriteConfigs?.forEach(config => { const { spriteKey, isItem, hasShadow, scale, x, y, yShadow, alpha, isPokemon, isShiny, variant } = config; let sprite: GameObjects.Sprite; @@ -154,7 +165,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con pokemonShinySparkle = globalScene.add.sprite(sprite.x, sprite.y, "shiny"); pokemonShinySparkle.setOrigin(0.5, 1); pokemonShinySparkle.setVisible(false); - this.shinySparkleSprites.push({ sprite: pokemonShinySparkle, variant: variant ?? 0 }); + this.shinySparkleSprites.push({ + sprite: pokemonShinySparkle, + variant: variant ?? 0, + }); shinySparkleSprites.add(pokemonShinySparkle); } } @@ -216,7 +230,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const shinyPromises: Promise[] = []; - this.spriteConfigs.forEach((config) => { + this.spriteConfigs.forEach(config => { if (config.isPokemon) { globalScene.loadPokemonAtlas(config.spriteKey, config.fileRoot); if (config.isShiny) { @@ -230,7 +244,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con }); globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { - this.spriteConfigs.every((config) => { + this.spriteConfigs.every(config => { if (config.isItem) { return true; } @@ -238,17 +252,21 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot - console.warn = () => { - }; - const frameNames = globalScene.anims.generateFrameNames(config.spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 128 }); + console.warn = () => {}; + const frameNames = globalScene.anims.generateFrameNames(config.spriteKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128, + }); console.warn = originalWarn; - if (!(globalScene.anims.exists(config.spriteKey))) { + if (!globalScene.anims.exists(config.spriteKey)) { globalScene.anims.create({ key: config.spriteKey, frames: frameNames, frameRate: 10, - repeat: -1 + repeat: -1, }); } @@ -313,7 +331,11 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param animConfig {@linkcode Phaser.Types.Animations.PlayAnimationConfig} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + animConfig: Phaser.Types.Animations.PlayAnimationConfig, + ): boolean { // Show an error in the console if there isn't a texture loaded if (sprite.texture.key === "__MISSING") { console.error(`No texture found for '${animConfig.key}'!`); @@ -359,7 +381,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const trainerAnimConfig: PlayAnimationConfig = { key: config.spriteKey, repeat: config?.repeat ? -1 : 0, - startFrame: config?.startFrame ?? 0 + startFrame: config?.startFrame ?? 0, }; this.tryPlaySprite(sprites[i], tintSprites[i], trainerAnimConfig); @@ -392,7 +414,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const ret: Phaser.GameObjects.Sprite[] = []; - this.spriteConfigs.forEach((config, i) => { + this.spriteConfigs.forEach((_, i) => { ret.push(this.getAt(i * 2)); }); return ret; @@ -407,7 +429,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const ret: Phaser.GameObjects.Sprite[] = []; - this.spriteConfigs.forEach((config, i) => { + this.spriteConfigs.forEach((_, i) => { ret.push(this.getAt(i * 2 + 1)); }); @@ -434,7 +456,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con targets: sprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { sprite.setAlpha(alpha); @@ -471,7 +493,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con onComplete: () => { sprite.setVisible(false); sprite.setAlpha(1); - } + }, }); } else { sprite.setVisible(false); @@ -497,9 +519,9 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param value - true for visible, false for hidden */ setVisible(value: boolean): this { - this.getSprites().forEach(sprite => { + for (const sprite of this.getSprites()) { sprite.setVisible(value); - }); + } return super.setVisible(value); } } diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index d1803cc036e..0d5dcca7989 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -14,12 +14,14 @@ export default class PokemonSpriteSparkleHandler { to: 1, yoyo: true, repeat: -1, - onRepeat: () => this.onLapse() + onRepeat: () => this.onLapse(), }); } onLapse(): void { - Array.from(this.sprites.values()).filter(s => !s.scene).map(s => this.sprites.delete(s)); + Array.from(this.sprites.values()) + .filter(s => !s.scene) + .map(s => this.sprites.delete(s)); for (const s of this.sprites.values()) { if (!s.pipelineData["teraColor"] || !(s.pipelineData["teraColor"] as number[]).find(c => c)) { continue; @@ -30,17 +32,21 @@ export default class PokemonSpriteSparkleHandler { if (!(s.parentContainer instanceof Pokemon) || !(s.parentContainer as Pokemon).isTerastallized) { continue; } - const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; + const pokemon = s.parentContainer instanceof Pokemon ? (s.parentContainer as Pokemon) : null; const parent = (pokemon || s).parentContainer; const texture = s.texture; - const [ width, height ] = [ texture.source[0].width, texture.source[0].height ]; - const [ pixelX, pixelY ] = [ Utils.randInt(width), Utils.randInt(height) ]; + const [width, height] = [texture.source[0].width, texture.source[0].height]; + const [pixelX, pixelY] = [Utils.randInt(width), Utils.randInt(height)]; const ratioX = s.width / width; const ratioY = s.height / height; const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE"); if (pixel?.alpha) { - const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height ]; - const sparkle = globalScene.addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); + const [xOffset, yOffset] = [-s.originX * s.width, -s.originY * s.height]; + const sparkle = globalScene.addFieldSprite( + (pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset, + (pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset, + "tera_sparkle", + ); sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; sparkle.setName("sprite-tera-sparkle"); sparkle.play("tera_sparkle"); @@ -52,7 +58,7 @@ export default class PokemonSpriteSparkleHandler { add(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { if (!Array.isArray(sprites)) { - sprites = [ sprites ]; + sprites = [sprites]; } for (const s of sprites) { if (this.sprites.has(s)) { @@ -64,7 +70,7 @@ export default class PokemonSpriteSparkleHandler { remove(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { if (!Array.isArray(sprites)) { - sprites = [ sprites ]; + sprites = [sprites]; } for (const s of sprites) { this.sprites.delete(s); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index bc0490372bc..3cd25e4d10a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -5,7 +5,10 @@ import { globalScene } from "#app/global-scene"; import type { Variant, VariantSet } from "#app/data/variant"; import { variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; -import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; +import BattleInfo, { + PlayerBattleInfo, + EnemyBattleInfo, +} from "#app/ui/battle-info"; import type Move from "#app/data/moves/move"; import { HighCritAttr, @@ -37,13 +40,21 @@ import { RespectAttackTypeImmunityAttr, CombinedPledgeStabBoostAttr, VariableMoveTypeChartAttr, - HpSplitAttr + HpSplitAttr, } from "#app/data/moves/move"; import { MoveTarget } from "#enums/MoveTarget"; import { MoveCategory } from "#enums/MoveCategory"; import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; -import { default as PokemonSpecies, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; +import { + default as PokemonSpecies, + getFusedSpeciesName, + getPokemonSpecies, + getPokemonSpeciesForm, +} from "#app/data/pokemon-species"; +import { + getStarterValueFriendshipCap, + speciesStarterCosts, +} from "#app/data/balance/starters"; import type { Constructor } from "#app/utils"; import { isNullOrUndefined, randSeedInt, type nil } from "#app/utils"; import * as Utils from "#app/utils"; @@ -51,21 +62,137 @@ import type { TypeDamageMultiplier } from "#app/data/type"; import { getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; import { PokemonType } from "#enums/pokemon-type"; import { getLevelTotalExp } from "#app/data/exp"; -import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; +import { + Stat, + type PermanentStat, + type BattleStat, + type EffectiveStat, + PERMANENT_STATS, + BATTLE_STATS, + EFFECTIVE_STATS, +} from "#enums/stat"; +import { + DamageMoneyRewardModifier, + EnemyDamageBoosterModifier, + EnemyDamageReducerModifier, + EnemyEndureChanceModifier, + EnemyFusionChanceModifier, + HiddenAbilityRateBoosterModifier, + BaseStatModifier, + PokemonFriendshipBoosterModifier, + PokemonHeldItemModifier, + PokemonNatureWeightModifier, + ShinyRateBoosterModifier, + SurviveDamageModifier, + TempStatStageBoosterModifier, + TempCritBoosterModifier, + StatBoosterModifier, + CritBoosterModifier, + PokemonBaseStatFlatModifier, + PokemonBaseStatTotalModifier, + PokemonIncrementingStatModifier, + EvoTrackerModifier, + PokemonMultiHitModifier, +} from "#app/modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { Gender } from "#app/data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; import { Status, getRandomStatus } from "#app/data/status-effect"; -import type { SpeciesFormEvolution, SpeciesEvolutionCondition } from "#app/data/balance/pokemon-evolutions"; -import { pokemonEvolutions, pokemonPrevolutions, FusionSpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; -import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/tms"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag, PowerTrickTag } from "../data/battler-tags"; +import type { + SpeciesFormEvolution, + SpeciesEvolutionCondition, +} from "#app/data/balance/pokemon-evolutions"; +import { + pokemonEvolutions, + pokemonPrevolutions, + FusionSpeciesFormEvolution, +} from "#app/data/balance/pokemon-evolutions"; +import { + reverseCompatibleTms, + tmSpecies, + tmPoolTiers, +} from "#app/data/balance/tms"; +import { + BattlerTag, + BattlerTagLapseType, + EncoreTag, + GroundedTag, + HighestStatBoostTag, + SubstituteTag, + TypeImmuneTag, + getBattlerTag, + SemiInvulnerableTag, + TypeBoostTag, + MoveRestrictionBattlerTag, + ExposedTag, + DragonCheerTag, + CritBoostTag, + TrappedTag, + TarShotTag, + AutotomizedTag, + PowerTrickTag, +} from "../data/battler-tags"; import { WeatherType } from "#enums/weather-type"; -import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; +import { + ArenaTagSide, + NoCritTag, + WeakenMoveScreenTag, +} from "#app/data/arena-tag"; import type { SuppressAbilitiesTag } from "#app/data/arena-tag"; import type { Ability, AbAttr } from "#app/data/ability"; -import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseAbAttrs, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr } from "#app/data/ability"; +import { + StatMultiplierAbAttr, + BlockCritAbAttr, + BonusCritAbAttr, + BypassBurnDamageReductionAbAttr, + FieldPriorityMoveImmunityAbAttr, + IgnoreOpponentStatStagesAbAttr, + MoveImmunityAbAttr, + PreDefendFullHpEndureAbAttr, + ReceivedMoveDamageMultiplierAbAttr, + StabBoostAbAttr, + StatusEffectImmunityAbAttr, + TypeImmunityAbAttr, + WeightMultiplierAbAttr, + allAbilities, + applyAbAttrs, + applyStatMultiplierAbAttrs, + applyPreApplyBattlerTagAbAttrs, + applyPreAttackAbAttrs, + applyPreDefendAbAttrs, + applyPreSetStatusAbAttrs, + UnsuppressableAbilityAbAttr, + NoFusionAbilityAbAttr, + MultCritAbAttr, + IgnoreTypeImmunityAbAttr, + DamageBoostAbAttr, + IgnoreTypeStatusEffectImmunityAbAttr, + ConditionalCritAbAttr, + applyFieldStatMultiplierAbAttrs, + FieldMultiplyStatAbAttr, + AddSecondStrikeAbAttr, + UserFieldStatusEffectImmunityAbAttr, + UserFieldBattlerTagImmunityAbAttr, + BattlerTagImmunityAbAttr, + MoveTypeChangeAbAttr, + FullHpResistTypeAbAttr, + applyCheckTrappedAbAttrs, + CheckTrappedAbAttr, + PostSetStatusAbAttr, + applyPostSetStatusAbAttrs, + InfiltratorAbAttr, + AlliedFieldDamageReductionAbAttr, + PostDamageAbAttr, + applyPostDamageAbAttrs, + CommanderAbAttr, + applyPostItemLostAbAttrs, + PostItemLostAbAttr, + applyOnGainAbAttrs, + PreLeaveFieldAbAttr, + applyPreLeaveFieldAbAttrs, + applyOnLoseAbAttrs, + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, +} from "#app/data/ability"; import type PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; @@ -73,14 +200,27 @@ import type { PartyOption } from "#app/ui/party-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; -import { EVOLVE_MOVE, RELEARN_MOVE } from "#app/data/balance/pokemon-level-moves"; +import { + EVOLVE_MOVE, + RELEARN_MOVE, +} from "#app/data/balance/pokemon-level-moves"; import { DamageAchv, achvs } from "#app/system/achv"; import type { StarterDataEntry, StarterMoveset } from "#app/system/game-data"; import { DexAttr } from "#app/system/game-data"; -import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; +import { + QuantizerCelebi, + argbFromRgba, + rgbaFromArgb, +} from "@material/material-color-utilities"; import { getNatureStatMultiplier } from "#app/data/nature"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; -import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; +import { + SpeciesFormChangeActiveTrigger, + SpeciesFormChangeLapseTeraTrigger, + SpeciesFormChangeMoveLearnedTrigger, + SpeciesFormChangePostMoveTrigger, + SpeciesFormChangeStatusEffectTrigger, +} from "#app/data/pokemon-forms"; import { TerrainType } from "#app/data/terrain"; import type { TrainerSlot } from "#app/data/trainer-config"; import Overrides from "#app/overrides"; @@ -111,7 +251,12 @@ import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { SwitchType } from "#enums/switch-type"; import { SpeciesFormKey } from "#enums/species-form-key"; -import { BASE_HIDDEN_ABILITY_CHANCE, BASE_SHINY_CHANCE, SHINY_EPIC_CHANCE, SHINY_VARIANT_CHANCE } from "#app/data/balance/rates"; +import { + BASE_HIDDEN_ABILITY_CHANCE, + BASE_SHINY_CHANCE, + SHINY_EPIC_CHANCE, + SHINY_VARIANT_CHANCE, +} from "#app/data/balance/rates"; import { Nature } from "#enums/nature"; import { StatusEffect } from "#enums/status-effect"; import { doShinySparkleAnim } from "#app/field/anims"; @@ -122,13 +267,13 @@ export enum LearnMoveSituation { RELEARN, EVOLUTION, EVOLUTION_FUSED, // If fusionSpecies has Evolved - EVOLUTION_FUSED_BASE // If fusion's base species has Evolved + EVOLUTION_FUSED_BASE, // If fusion's base species has Evolved } export enum FieldPosition { CENTER, LEFT, - RIGHT + RIGHT, } export default abstract class Pokemon extends Phaser.GameObjects.Container { @@ -197,16 +342,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { private shinySparkle: Phaser.GameObjects.Sprite; - constructor(x: number, y: number, species: PokemonSpecies, level: number, abilityIndex?: number, formIndex?: number, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: number[], nature?: Nature, dataSource?: Pokemon | PokemonData) { + constructor( + x: number, + y: number, + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + ) { super(globalScene, x, y); if (!species.isObtainable() && this.isPlayer()) { throw `Cannot create a player Pokemon for species '${species.getName(formIndex)}'`; } - const hiddenAbilityChance = new Utils.NumberHolder(BASE_HIDDEN_ABILITY_CHANCE); + const hiddenAbilityChance = new Utils.NumberHolder( + BASE_HIDDEN_ABILITY_CHANCE, + ); if (!this.hasTrainer()) { - globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + hiddenAbilityChance, + ); } this.species = species; @@ -226,7 +390,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.abilityIndex = 2; } else { // If there is no hidden ability or species does not have a hidden ability - this.abilityIndex = species.ability2 !== species.ability1 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 + this.abilityIndex = + species.ability2 !== species.ability1 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 } } if (formIndex !== undefined) { @@ -241,7 +406,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (variant !== undefined) { this.variant = variant; } - this.exp = dataSource?.exp || getLevelTotalExp(this.level, species.growthRate); + this.exp = + dataSource?.exp || getLevelTotalExp(this.level, species.growthRate); this.levelExp = dataSource?.levelExp || 0; if (dataSource) { this.id = dataSource.id; @@ -252,20 +418,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.variant === undefined) { this.variant = 0; } - this.nature = dataSource.nature || 0 as Nature; + this.nature = dataSource.nature || (0 as Nature); this.nickname = dataSource.nickname; this.moveset = dataSource.moveset; this.status = dataSource.status!; // TODO: is this bang correct? - this.friendship = dataSource.friendship !== undefined ? dataSource.friendship : this.species.baseFriendship; + this.friendship = + dataSource.friendship !== undefined + ? dataSource.friendship + : this.species.baseFriendship; this.metLevel = dataSource.metLevel || 5; this.luck = dataSource.luck; this.metBiome = dataSource.metBiome; - this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); + this.metSpecies = + dataSource.metSpecies ?? + (this.metBiome !== -1 + ? this.species.speciesId + : this.species.getRootSpeciesId(true)); this.metWave = dataSource.metWave ?? (this.metBiome === -1 ? -1 : 0); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; this.evoCounter = dataSource.evoCounter ?? 0; - this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : dataSource.fusionSpecies ? getPokemonSpecies(dataSource.fusionSpecies) : null; + this.fusionSpecies = + dataSource.fusionSpecies instanceof PokemonSpecies + ? dataSource.fusionSpecies + : dataSource.fusionSpecies + ? getPokemonSpecies(dataSource.fusionSpecies) + : null; this.fusionFormIndex = dataSource.fusionFormIndex; this.fusionAbilityIndex = dataSource.fusionAbilityIndex; this.fusionShiny = dataSource.fusionShiny; @@ -275,7 +453,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; this.fusionTeraType = dataSource.fusionTeraType; this.usedTMs = dataSource.usedTMs ?? []; - this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); + this.customPokemonData = new CustomPokemonData( + dataSource.customPokemonData, + ); this.teraType = dataSource.teraType; this.isTerastallized = dataSource.isTerastallized; this.stellarTypesBoosted = dataSource.stellarTypesBoosted ?? []; @@ -288,7 +468,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (this.formIndex === undefined) { - this.formIndex = globalScene.getSpeciesFormIndex(species, this.gender, this.nature, this.isPlayer()); + this.formIndex = globalScene.getSpeciesFormIndex( + species, + this.gender, + this.nature, + this.isPlayer(), + ); } if (this.shiny === undefined) { @@ -309,13 +494,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.friendship = species.baseFriendship; this.metLevel = level; - this.metBiome = globalScene.currentBattle ? globalScene.arena.biomeType : -1; + this.metBiome = globalScene.currentBattle + ? globalScene.arena.biomeType + : -1; this.metSpecies = species.speciesId; - this.metWave = globalScene.currentBattle ? globalScene.currentBattle.waveIndex : -1; + this.metWave = globalScene.currentBattle + ? globalScene.currentBattle.waveIndex + : -1; this.pokerus = false; if (level > 1) { - const fused = new Utils.BooleanHolder(globalScene.gameMode.isSplicedOnly); + const fused = new Utils.BooleanHolder( + globalScene.gameMode.isSplicedOnly, + ); if (!fused.value && !this.isPlayer() && !this.hasTrainer()) { globalScene.applyModifier(EnemyFusionChanceModifier, false, fused); } @@ -325,7 +516,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.generateFusionSpecies(); } } - this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); + this.luck = + (this.shiny ? this.variant + 1 : 0) + + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.fusionLuck = this.luck; this.teraType = Utils.randSeedItem(this.getTypes(false, false, true)); @@ -344,7 +537,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - getNameToRender() { try { if (this.nickname) { @@ -365,9 +557,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.fieldUI.addAt(this.battleInfo, 0); const getSprite = (hasShadow?: boolean) => { - const ret = globalScene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? "back__" : ""}sub`, undefined, true); + const ret = globalScene.addPokemonSprite( + this, + 0, + 0, + `pkmn__${this.isPlayer() ? "back__" : ""}sub`, + undefined, + true, + ); ret.setOrigin(0.5, 1); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()), isTerastallized: this.isTerastallized }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + teraColor: getTypeRgb(this.getTeraType()), + isTerastallized: this.isTerastallized, + }); return ret; }; @@ -404,8 +608,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param checkStatus `true` to also check that the pokemon's status is {@linkcode StatusEffect.FAINT} * @returns `true` if the pokemon is fainted */ - public isFainted(checkStatus: boolean = false): boolean { - return this.hp <= 0 && (!checkStatus || this.status?.effect === StatusEffect.FAINT); + public isFainted(checkStatus = false): boolean { + return ( + this.hp <= 0 && + (!checkStatus || this.status?.effect === StatusEffect.FAINT) + ); } /** @@ -423,7 +630,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ public isAllowedInChallenge(): boolean { const challengeAllowed = new Utils.BooleanHolder(true); - applyChallenges(globalScene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); + applyChallenges( + globalScene.gameMode, + ChallengeType.POKEMON_IN_BATTLE, + this, + challengeAllowed, + ); return challengeAllowed.value; } @@ -432,7 +644,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param onField `true` to also check if the pokemon is currently on the field, defaults to `false` * @returns `true` if the pokemon is "active". Returns `false` if there is no active {@linkcode BattleScene} */ - public isActive(onField: boolean = false): boolean { + public isActive(onField = false): boolean { if (!globalScene) { return false; } @@ -443,7 +655,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let ret = 0n; ret |= this.gender !== Gender.FEMALE ? DexAttr.MALE : DexAttr.FEMALE; ret |= !this.shiny ? DexAttr.NON_SHINY : DexAttr.SHINY; - ret |= this.variant >= 2 ? DexAttr.VARIANT_3 : this.variant === 1 ? DexAttr.VARIANT_2 : DexAttr.DEFAULT_VARIANT; + ret |= + this.variant >= 2 + ? DexAttr.VARIANT_3 + : this.variant === 1 + ? DexAttr.VARIANT_2 + : DexAttr.DEFAULT_VARIANT; ret |= globalScene.gameData.getFormAttr(this.formIndex); return ret; } @@ -458,7 +675,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.name = this.species.getName(this.formIndex); return; } - this.name = getFusedSpeciesName(this.species.getName(this.formIndex), this.fusionSpecies.getName(this.fusionFormIndex)); + this.name = getFusedSpeciesName( + this.species.getName(this.formIndex), + this.fusionSpecies.getName(this.fusionFormIndex), + ); if (this.battleInfo) { this.updateInfo(true); } @@ -472,74 +692,114 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract getBattlerIndex(): BattlerIndex; - loadAssets(ignoreOverride: boolean = true): Promise { + loadAssets(ignoreOverride = true): Promise { return new Promise(resolve => { const moveIds = this.getMoveset().map(m => m!.getMove().id); // TODO: is this bang correct? - Promise.allSettled(moveIds.map(m => initMoveAnim(m))) - .then(() => { - loadMoveAnimAssets(moveIds); - this.getSpeciesForm().loadAssets(this.getGender() === Gender.FEMALE, this.formIndex, this.shiny, this.variant); - if (this.isPlayer() || this.getFusionSpeciesForm()) { - globalScene.loadPokemonAtlas(this.getBattleSpriteKey(true, ignoreOverride), this.getBattleSpriteAtlasPath(true, ignoreOverride)); - } - if (this.getFusionSpeciesForm()) { - this.getFusionSpeciesForm().loadAssets(this.getFusionGender() === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); - globalScene.loadPokemonAtlas(this.getFusionBattleSpriteKey(true, ignoreOverride), this.getFusionBattleSpriteAtlasPath(true, ignoreOverride)); - } - globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { - if (this.isPlayer()) { - const originalWarn = console.warn; - // Ignore warnings for missing frames, because there will be a lot - console.warn = () => {}; - const battleFrameNames = globalScene.anims.generateFrameNames(this.getBattleSpriteKey(), { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); - console.warn = originalWarn; - if (!(globalScene.anims.exists(this.getBattleSpriteKey()))) { - globalScene.anims.create({ - key: this.getBattleSpriteKey(), - frames: battleFrameNames, - frameRate: 10, - repeat: -1 - }); - } + Promise.allSettled(moveIds.map(m => initMoveAnim(m))).then(() => { + loadMoveAnimAssets(moveIds); + this.getSpeciesForm().loadAssets( + this.getGender() === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); + if (this.isPlayer() || this.getFusionSpeciesForm()) { + globalScene.loadPokemonAtlas( + this.getBattleSpriteKey(true, ignoreOverride), + this.getBattleSpriteAtlasPath(true, ignoreOverride), + ); + } + if (this.getFusionSpeciesForm()) { + this.getFusionSpeciesForm().loadAssets( + this.getFusionGender() === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); + globalScene.loadPokemonAtlas( + this.getFusionBattleSpriteKey(true, ignoreOverride), + this.getFusionBattleSpriteAtlasPath(true, ignoreOverride), + ); + } + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { + if (this.isPlayer()) { + const originalWarn = console.warn; + // Ignore warnings for missing frames, because there will be a lot + console.warn = () => {}; + const battleFrameNames = globalScene.anims.generateFrameNames( + this.getBattleSpriteKey(), + { zeroPad: 4, suffix: ".png", start: 1, end: 400 }, + ); + console.warn = originalWarn; + if (!globalScene.anims.exists(this.getBattleSpriteKey())) { + globalScene.anims.create({ + key: this.getBattleSpriteKey(), + frames: battleFrameNames, + frameRate: 10, + repeat: -1, + }); } - this.playAnim(); - const updateFusionPaletteAndResolve = () => { - this.updateFusionPalette(); - if (this.summonData?.speciesForm) { - this.updateFusionPalette(true); - } - resolve(); - }; - if (this.shiny) { - const populateVariantColors = (isBackSprite: boolean = false): Promise => { - return new Promise(async resolve => { - const battleSpritePath = this.getBattleSpriteAtlasPath(isBackSprite, ignoreOverride).replace("variant/", "").replace(/_[1-3]$/, ""); - let config = variantData; - const useExpSprite = globalScene.experimentalSprites && globalScene.hasExpSprite(this.getBattleSpriteKey(isBackSprite, ignoreOverride)); - battleSpritePath.split("/").map(p => config ? config = config[p] : null); - const variantSet: VariantSet = config as VariantSet; - if (variantSet && variantSet[this.variant] === 1) { - const cacheKey = this.getBattleSpriteKey(isBackSprite); - if (!variantColorCache.hasOwnProperty(cacheKey)) { - await this.populateVariantColorCache(cacheKey, useExpSprite, battleSpritePath); - } + } + this.playAnim(); + const updateFusionPaletteAndResolve = () => { + this.updateFusionPalette(); + if (this.summonData?.speciesForm) { + this.updateFusionPalette(true); + } + resolve(); + }; + if (this.shiny) { + const populateVariantColors = ( + isBackSprite = false, + ): Promise => { + return new Promise(async resolve => { + const battleSpritePath = this.getBattleSpriteAtlasPath( + isBackSprite, + ignoreOverride, + ) + .replace("variant/", "") + .replace(/_[1-3]$/, ""); + let config = variantData; + const useExpSprite = + globalScene.experimentalSprites && + globalScene.hasExpSprite( + this.getBattleSpriteKey(isBackSprite, ignoreOverride), + ); + battleSpritePath + .split("/") + .map(p => (config ? (config = config[p]) : null)); + const variantSet: VariantSet = config as VariantSet; + if (variantSet && variantSet[this.variant] === 1) { + const cacheKey = this.getBattleSpriteKey(isBackSprite); + if (!variantColorCache.hasOwnProperty(cacheKey)) { + await this.populateVariantColorCache( + cacheKey, + useExpSprite, + battleSpritePath, + ); } - resolve(); - }); - }; - if (this.isPlayer()) { - Promise.all([ populateVariantColors(false), populateVariantColors(true) ]).then(() => updateFusionPaletteAndResolve()); - } else { - populateVariantColors(false).then(() => updateFusionPaletteAndResolve()); - } + } + resolve(); + }); + }; + if (this.isPlayer()) { + Promise.all([ + populateVariantColors(false), + populateVariantColors(true), + ]).then(() => updateFusionPaletteAndResolve()); } else { - updateFusionPaletteAndResolve(); + populateVariantColors(false).then(() => + updateFusionPaletteAndResolve(), + ); } - }); - if (!globalScene.load.isLoading()) { - globalScene.load.start(); + } else { + updateFusionPaletteAndResolve(); } }); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); + } + }); }); } @@ -553,7 +813,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param battleSpritePath the filename of the sprite * @param optionalParams any additional params to log */ - async fallbackVariantColor(cacheKey: string, attemptedSpritePath: string, useExpSprite: boolean, battleSpritePath: string, ...optionalParams: any[]) { + async fallbackVariantColor( + cacheKey: string, + attemptedSpritePath: string, + useExpSprite: boolean, + battleSpritePath: string, + ...optionalParams: any[] + ) { console.warn(`Could not load ${attemptedSpritePath}!`, ...optionalParams); if (useExpSprite) { await this.populateVariantColorCache(cacheKey, false, battleSpritePath); @@ -567,25 +833,49 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param useExpSprite should the experimental sprite be used * @param battleSpritePath the filename of the sprite */ - async populateVariantColorCache(cacheKey: string, useExpSprite: boolean, battleSpritePath: string) { + async populateVariantColorCache( + cacheKey: string, + useExpSprite: boolean, + battleSpritePath: string, + ) { const spritePath = `./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`; - return globalScene.cachedFetch(spritePath).then(res => { - // Prevent the JSON from processing if it failed to load - if (!res.ok) { - return this.fallbackVariantColor(cacheKey, res.url, useExpSprite, battleSpritePath, res.status, res.statusText); - } - return res.json(); - }).catch(error => { - return this.fallbackVariantColor(cacheKey, spritePath, useExpSprite, battleSpritePath, error); - }).then(c => { - if (!isNullOrUndefined(c)) { - variantColorCache[cacheKey] = c; - } - }); + return globalScene + .cachedFetch(spritePath) + .then(res => { + // Prevent the JSON from processing if it failed to load + if (!res.ok) { + return this.fallbackVariantColor( + cacheKey, + res.url, + useExpSprite, + battleSpritePath, + res.status, + res.statusText, + ); + } + return res.json(); + }) + .catch(error => { + return this.fallbackVariantColor( + cacheKey, + spritePath, + useExpSprite, + battleSpritePath, + error, + ); + }) + .then(c => { + if (!isNullOrUndefined(c)) { + variantColorCache[cacheKey] = c; + } + }); } getFormKey(): string { - if (!this.species.forms.length || this.species.forms.length <= this.formIndex) { + if ( + !this.species.forms.length || + this.species.forms.length <= this.formIndex + ) { return ""; } return this.species.forms[this.formIndex].formKey; @@ -595,7 +885,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.fusionSpecies) { return null; } - if (!this.fusionSpecies.forms.length || this.fusionSpecies.forms.length <= this.fusionFormIndex) { + if ( + !this.fusionSpecies.forms.length || + this.fusionSpecies.forms.length <= this.fusionFormIndex + ) { return ""; } return this.fusionSpecies.forms[this.fusionFormIndex].formKey; @@ -607,23 +900,42 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace( + /\_{2}/g, + "/", + ); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getSpriteId(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getSpriteId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getSpriteId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { if (back === undefined) { back = this.isPlayer(); } - return this.getSpeciesForm(ignoreOverride).getSpriteId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant, back); + return this.getSpeciesForm(ignoreOverride).getSpriteId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + back, + ); } getSpriteKey(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getSpriteKey(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getSpriteKey( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getBattleSpriteKey(back?: boolean, ignoreOverride?: boolean): string { @@ -631,38 +943,73 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionSpriteId(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getSpriteId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getFusionBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { if (back === undefined) { back = this.isPlayer(); } - return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant, back); + return this.getFusionSpeciesForm(ignoreOverride).getSpriteId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + back, + ); } getFusionBattleSpriteKey(back?: boolean, ignoreOverride?: boolean): string { return `pkmn__${this.getFusionBattleSpriteId(back, ignoreOverride)}`; } - getFusionBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + getFusionBattleSpriteAtlasPath( + back?: boolean, + ignoreOverride?: boolean, + ): string { + return this.getFusionBattleSpriteId(back, ignoreOverride).replace( + /\_{2}/g, + "/", + ); } getIconAtlasKey(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getIconAtlasKey(this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getIconAtlasKey( + this.formIndex, + this.shiny, + this.variant, + ); } getFusionIconAtlasKey(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getIconAtlasKey(this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getIconAtlasKey( + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getIconId(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getIconId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getIconId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getFusionIconId(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getIconId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getIconId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm { @@ -680,7 +1027,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!ignoreOverride && this.summonData?.speciesForm) { return this.summonData.fusionSpeciesForm; } - if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length) { + if ( + !this.fusionSpecies?.forms?.length || + this.fusionFormIndex >= this.fusionSpecies?.forms.length + ) { //@ts-ignore return this.fusionSpecies; // TODO: I don't even know how to fix this... A complete cluster of classes involved + null } @@ -693,15 +1043,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getTintSprite(): Phaser.GameObjects.Sprite | null { return !this.maskEnabled - ? this.getAt(1) as Phaser.GameObjects.Sprite + ? (this.getAt(1) as Phaser.GameObjects.Sprite) : this.maskSprite; } getSpriteScale(): number { const formKey = this.getFormKey(); - if (this.isMax() === true || formKey === "segin-starmobile" || formKey === "schedar-starmobile" || formKey === "navi-starmobile" || formKey === "ruchbah-starmobile" || formKey === "caph-starmobile") { + if ( + this.isMax() === true || + formKey === "segin-starmobile" || + formKey === "schedar-starmobile" || + formKey === "navi-starmobile" || + formKey === "ruchbah-starmobile" || + formKey === "caph-starmobile" + ) { return 1.5; - } else if (this.customPokemonData.spriteScale > 0) { + } + if (this.customPokemonData.spriteScale > 0) { return this.customPokemonData.spriteScale; } return 1; @@ -727,7 +1085,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!globalScene) { return []; } - return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; + return globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, + this.isPlayer(), + ) as PokemonHeldItemModifier[]; } updateScale(): void { @@ -735,10 +1096,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { - s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType()); - s.pipelineData["isTerastallized"] = this.isTerastallized; - }); + [this.getSprite(), this.getTintSprite()] + .filter(s => !!s) + .map(s => { + s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType()); + s.pipelineData["isTerastallized"] = this.isTerastallized; + }); this.updateInfo(true); } @@ -759,13 +1122,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param animConfig {@linkcode String} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, key: string): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + key: string, + ): boolean { // Catch errors when trying to play an animation that doesn't exist try { sprite.play(key); tintSprite.play(key); } catch (error: unknown) { - console.error(`Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, error); + console.error( + `Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, + error, + ); return false; } @@ -774,17 +1144,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } playAnim(): void { - this.tryPlaySprite(this.getSprite(), this.getTintSprite()!, this.getBattleSpriteKey()); // TODO: is the bag correct? + this.tryPlaySprite( + this.getSprite(), + this.getTintSprite()!, + this.getBattleSpriteKey(), + ); // TODO: is the bag correct? } - getFieldPositionOffset(): [ number, number ] { + getFieldPositionOffset(): [number, number] { switch (this.fieldPosition) { case FieldPosition.CENTER: - return [ 0, 0 ]; + return [0, 0]; case FieldPosition.LEFT: - return [ -32, -8 ]; + return [-32, -8]; case FieldPosition.RIGHT: - return [ 32, 0 ]; + return [32, 0]; } } @@ -794,8 +1168,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @see {@linkcode SubstituteTag} * @see {@linkcode getFieldPositionOffset} */ - getSubstituteOffset(): [ number, number ] { - return this.isPlayer() ? [ -30, 10 ] : [ 30, -10 ]; + getSubstituteOffset(): [number, number] { + return this.isPlayer() ? [-30, 10] : [30, -10]; } /** @@ -812,7 +1186,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // During the Pokemon's MoveEffect phase, the offset is removed to put the Pokemon "in focus" const currentPhase = globalScene.getCurrentPhase(); - if (currentPhase instanceof MoveEffectPhase && currentPhase.getPokemon() === this) { + if ( + currentPhase instanceof MoveEffectPhase && + currentPhase.getPokemon() === this + ) { return false; } return true; @@ -829,7 +1206,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - setFieldPosition(fieldPosition: FieldPosition, duration?: number): Promise { + setFieldPosition( + fieldPosition: FieldPosition, + duration?: number, + ): Promise { return new Promise(resolve => { if (fieldPosition === this.fieldPosition) { resolve(); @@ -852,7 +1232,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (duration) { // TODO: can this use stricter typing? - const targets: any[] = [ this ]; + const targets: any[] = [this]; if (subTag?.sprite) { targets.push(subTag.sprite); } @@ -862,7 +1242,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { y: (_target, _key, value: number) => value + relY, duration: duration, ease: "Sine.easeOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); } else { this.x += relX; @@ -880,7 +1260,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overriden stats (`false`) * @returns the numeric values of the {@linkcode Pokemon}'s stats */ - getStats(bypassSummonData: boolean = true): number[] { + getStats(bypassSummonData = true): number[] { if (!bypassSummonData && this.summonData?.stats) { return this.summonData.stats; } @@ -893,8 +1273,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overridden stats (`false`) * @returns the numeric value of the desired {@linkcode Stat} */ - getStat(stat: PermanentStat, bypassSummonData: boolean = true): number { - if (!bypassSummonData && this.summonData && (this.summonData.stats[stat] !== 0)) { + getStat(stat: PermanentStat, bypassSummonData = true): number { + if ( + !bypassSummonData && + this.summonData && + this.summonData.stats[stat] !== 0 + ) { return this.summonData.stats[stat]; } return this.stats[stat]; @@ -908,7 +1292,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param value the desired numeric value * @param bypassSummonData write to actual stats (`true` by default) or in-battle overridden stats (`false`) */ - setStat(stat: PermanentStat, value: number, bypassSummonData: boolean = true): void { + setStat(stat: PermanentStat, value: number, bypassSummonData = true): void { if (value >= 0) { if (!bypassSummonData && this.summonData) { this.summonData.stats[stat] = value; @@ -923,7 +1307,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns the numeric values of the {@linkcode Pokemon}'s in-battle stat stages if available, a fresh stat stage array otherwise */ getStatStages(): number[] { - return this.summonData ? this.summonData.statStages : [ 0, 0, 0, 0, 0, 0, 0 ]; + return this.summonData ? this.summonData.statStages : [0, 0, 0, 0, 0, 0, 0]; } /** @@ -962,11 +1346,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getCritStage(source: Pokemon, move: Move): number { const critStage = new Utils.NumberHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critStage); - globalScene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage); - globalScene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage); + globalScene.applyModifiers( + CritBoosterModifier, + source.isPlayer(), + source, + critStage, + ); + globalScene.applyModifiers( + TempCritBoosterModifier, + source.isPlayer(), + critStage, + ); const bonusCrit = new Utils.BooleanHolder(false); //@ts-ignore - if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus. + if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { + // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus. if (bonusCrit.value) { critStage.value += 1; } @@ -974,7 +1368,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const critBoostTag = source.getTag(CritBoostTag); if (critBoostTag) { if (critBoostTag instanceof DragonCheerTag) { - critStage.value += critBoostTag.typesOnAdd.includes(PokemonType.DRAGON) ? 2 : 1; + critStage.value += critBoostTag.typesOnAdd.includes(PokemonType.DRAGON) + ? 2 + : 1; } else { critStage.value += 2; } @@ -998,25 +1394,64 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @returns the final in-battle value of a stat */ - getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { + getEffectiveStat( + stat: EffectiveStat, + opponent?: Pokemon, + move?: Move, + ignoreAbility = false, + ignoreOppAbility = false, + isCritical = false, + simulated = true, + ignoreHeldItems = false, + ): number { const statValue = new Utils.NumberHolder(this.getStat(stat, false)); if (!ignoreHeldItems) { - globalScene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + globalScene.applyModifiers( + StatBoosterModifier, + this.isPlayer(), + this, + stat, + statValue, + ); } // The Ruin abilities here are never ignored, but they reveal themselves on summon anyway const fieldApplied = new Utils.BooleanHolder(false); for (const pokemon of globalScene.getField(true)) { - applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied, simulated); + applyFieldStatMultiplierAbAttrs( + FieldMultiplyStatAbAttr, + pokemon, + stat, + statValue, + this, + fieldApplied, + simulated, + ); if (fieldApplied.value) { break; } } if (!ignoreAbility) { - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue, simulated); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + this, + stat, + statValue, + simulated, + ); } - let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated, ignoreHeldItems); + let ret = + statValue.value * + this.getStatStageMultiplier( + stat, + opponent, + move, + ignoreOppAbility, + isCritical, + simulated, + ignoreHeldItems, + ); switch (stat) { case Stat.ATK: @@ -1025,14 +1460,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case Stat.DEF: - if (this.isOfType(PokemonType.ICE) && globalScene.arena.weather?.weatherType === WeatherType.SNOW) { + if ( + this.isOfType(PokemonType.ICE) && + globalScene.arena.weather?.weatherType === WeatherType.SNOW + ) { ret *= 1.5; } break; case Stat.SPATK: break; case Stat.SPDEF: - if (this.isOfType(PokemonType.ROCK) && globalScene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + if ( + this.isOfType(PokemonType.ROCK) && + globalScene.arena.weather?.weatherType === WeatherType.SANDSTORM + ) { ret *= 1.5; } break; @@ -1041,7 +1482,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (globalScene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { ret *= 2; } - if (globalScene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) { + if ( + globalScene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side) + ) { ret >>= 2; } @@ -1051,13 +1494,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.status && this.status.effect === StatusEffect.PARALYSIS) { ret >>= 1; } - if (this.getTag(BattlerTagType.UNBURDEN) && this.hasAbility(Abilities.UNBURDEN)) { + if ( + this.getTag(BattlerTagType.UNBURDEN) && + this.hasAbility(Abilities.UNBURDEN) + ) { ret *= 2; } break; } - const highestStatBoost = this.findTag(t => t instanceof HighestStatBoostTag && (t as HighestStatBoostTag).stat === stat) as HighestStatBoostTag; + const highestStatBoost = this.findTag( + t => + t instanceof HighestStatBoostTag && + (t as HighestStatBoostTag).stat === stat, + ) as HighestStatBoostTag; if (highestStatBoost) { ret *= highestStatBoost.multiplier; } @@ -1067,17 +1517,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { calculateStats(): void { if (!this.stats) { - this.stats = [ 0, 0, 0, 0, 0, 0 ]; + this.stats = [0, 0, 0, 0, 0, 0]; } // Get and manipulate base stats const baseStats = this.calculateBaseStats(); // Using base stats, calculate and store stats one by one for (const s of PERMANENT_STATS) { - const statHolder = new Utils.NumberHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); + const statHolder = new Utils.NumberHolder( + Math.floor((2 * baseStats[s] + this.ivs[s]) * this.level * 0.01), + ); if (s === Stat.HP) { statHolder.value = statHolder.value + this.level + 10; - globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); + globalScene.applyModifier( + PokemonIncrementingStatModifier, + this.isPlayer(), + this, + s, + statHolder, + ); if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) { statHolder.value = 1; } @@ -1091,15 +1549,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } else { statHolder.value += 5; - const natureStatMultiplier = new Utils.NumberHolder(getNatureStatMultiplier(this.getNature(), s)); - globalScene.applyModifier(PokemonNatureWeightModifier, this.isPlayer(), this, natureStatMultiplier); + const natureStatMultiplier = new Utils.NumberHolder( + getNatureStatMultiplier(this.getNature(), s), + ); + globalScene.applyModifier( + PokemonNatureWeightModifier, + this.isPlayer(), + this, + natureStatMultiplier, + ); if (natureStatMultiplier.value !== 1) { - statHolder.value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](statHolder.value * natureStatMultiplier.value), 1); + statHolder.value = Math.max( + Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"]( + statHolder.value * natureStatMultiplier.value, + ), + 1, + ); } - globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); + globalScene.applyModifier( + PokemonIncrementingStatModifier, + this.isPlayer(), + this, + s, + statHolder, + ); } - statHolder.value = Phaser.Math.Clamp(statHolder.value, 1, Number.MAX_SAFE_INTEGER); + statHolder.value = Phaser.Math.Clamp( + statHolder.value, + 1, + Number.MAX_SAFE_INTEGER, + ); this.setStat(s, statHolder.value); } @@ -1107,14 +1587,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { calculateBaseStats(): number[] { const baseStats = this.getSpeciesForm(true).baseStats.slice(0); - applyChallenges(globalScene.gameMode, ChallengeType.FLIP_STAT, this, baseStats); + applyChallenges( + globalScene.gameMode, + ChallengeType.FLIP_STAT, + this, + baseStats, + ); // Shuckle Juice - globalScene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + PokemonBaseStatTotalModifier, + this.isPlayer(), + this, + baseStats, + ); // Old Gateau - globalScene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + PokemonBaseStatFlatModifier, + this.isPlayer(), + this, + baseStats, + ); if (this.isFusion()) { const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats; - applyChallenges(globalScene.gameMode, ChallengeType.FLIP_STAT, this, fusionBaseStats); + applyChallenges( + globalScene.gameMode, + ChallengeType.FLIP_STAT, + this, + fusionBaseStats, + ); for (const s of PERMANENT_STATS) { baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); @@ -1125,13 +1625,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } // Vitamins - globalScene.applyModifiers(BaseStatModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + BaseStatModifier, + this.isPlayer(), + this, + baseStats, + ); return baseStats; } getNature(): Nature { - return this.customPokemonData.nature !== -1 ? this.customPokemonData.nature : this.nature; + return this.customPokemonData.nature !== -1 + ? this.customPokemonData.nature + : this.nature; } setNature(nature: Nature): void { @@ -1165,7 +1672,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.getMaxHp() - this.hp; } - getHpRatio(precise: boolean = false): number { + getHpRatio(precise = false): number { return precise ? this.hp / this.getMaxHp() : Math.round((this.hp / this.getMaxHp()) * 100) / 100; @@ -1203,7 +1710,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getVariant(): Variant { - return !this.isFusion() ? this.variant : Math.max(this.variant, this.fusionVariant) as Variant; + return !this.isFusion() + ? this.variant + : (Math.max(this.variant, this.fusionVariant) as Variant); } getLuck(): number { @@ -1231,7 +1740,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ hasSpecies(species: Species, formKey?: string): boolean { if (Utils.isNullOrUndefined(formKey)) { - return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + return ( + this.species.speciesId === species || + this.fusionSpecies?.speciesId === species + ); } return (this.species.speciesId === species && this.getFormKey() === formKey) || (this.fusionSpecies?.speciesId === species && this.getFusionFormKey() === formKey); @@ -1240,14 +1752,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract isBoss(): boolean; getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { - const ret = !ignoreOverride && this.summonData?.moveset - ? this.summonData.moveset - : this.moveset; + const ret = + !ignoreOverride && this.summonData?.moveset + ? this.summonData.moveset + : this.moveset; // Overrides moveset based on arrays specified in overrides.ts - let overrideArray: Moves | Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; + let overrideArray: Moves | Array = this.isPlayer() + ? Overrides.MOVESET_OVERRIDE + : Overrides.OPP_MOVESET_OVERRIDE; if (!Array.isArray(overrideArray)) { - overrideArray = [ overrideArray ]; + overrideArray = [overrideArray]; } if (overrideArray.length > 0) { if (!this.isPlayer()) { @@ -1255,7 +1770,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } overrideArray.forEach((move: Moves, index: number) => { const ppUsed = this.moveset[index]?.ppUsed ?? 0; - this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)); + this.moveset[index] = new PokemonMove( + move, + Math.min(ppUsed, allMoves[move].pp), + ); }); } @@ -1271,7 +1789,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ getUnlockedEggMoves(): Moves[] { const moves: Moves[] = []; - const species = this.metSpecies in speciesEggMoves ? this.metSpecies : this.getSpeciesForm(true).getRootSpeciesId(true); + const species = + this.metSpecies in speciesEggMoves + ? this.metSpecies + : this.getSpeciesForm(true).getRootSpeciesId(true); if (species in speciesEggMoves) { for (let i = 0; i < 4; i++) { if (globalScene.gameData.starterData[species].eggMoves & (1 << i)) { @@ -1293,13 +1814,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ public getLearnableLevelMoves(): Moves[] { let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]); - if (this.metBiome === -1 && !globalScene.gameMode.isFreshStartChallenge() && !globalScene.gameMode.isDaily) { + if ( + this.metBiome === -1 && + !globalScene.gameMode.isFreshStartChallenge() && + !globalScene.gameMode.isDaily + ) { levelMoves = this.getUnlockedEggMoves().concat(levelMoves); } if (Array.isArray(this.usedTMs) && this.usedTMs.length > 0) { - levelMoves = this.usedTMs.filter(m => !levelMoves.includes(m)).concat(levelMoves); + levelMoves = this.usedTMs + .filter(m => !levelMoves.includes(m)) + .concat(levelMoves); } - levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm)); + levelMoves = levelMoves.filter( + lm => !this.moveset.some(m => m?.moveId === lm), + ); return levelMoves; } @@ -1310,12 +1839,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` * @returns array of {@linkcode PokemonType} */ - public getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride: boolean = false): PokemonType[] { + public getTypes( + includeTeraType = false, + forDefend = false, + ignoreOverride = false, + ): PokemonType[] { const types: PokemonType[] = []; if (includeTeraType && this.isTerastallized) { const teraType = this.getTeraType(); - if (this.isTerastallized && !(forDefend && teraType === PokemonType.STELLAR)) { // Stellar tera uses its original types defensively + if (this.isTerastallized && !(forDefend && teraType === PokemonType.STELLAR)) { + // Stellar tera uses its original types defensively types.push(teraType); if (forDefend) { return types; @@ -1324,7 +1858,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (!types.length || !includeTeraType) { - if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) { + if ( + !ignoreOverride && + this.summonData?.types && + this.summonData.types.length > 0 + ) { this.summonData.types.forEach(t => types.push(t)); } else { const speciesForm = this.getSpeciesForm(ignoreOverride); @@ -1332,7 +1870,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const customTypes = this.customPokemonData.types?.length > 0; // First type, checking for "permanently changed" types from ME - const firstType = (customTypes && this.customPokemonData.types[0] !== PokemonType.UNKNOWN) ? this.customPokemonData.types[0] : speciesForm.type1; + const firstType = + customTypes && this.customPokemonData.types[0] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[0] + : speciesForm.type1; types.push(firstType); // Second type @@ -1340,10 +1881,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (fusionSpeciesForm) { // Check if the fusion Pokemon also has permanent changes from ME when determining the fusion types - const fusionType1 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 0 && this.fusionCustomPokemonData.types[0] !== PokemonType.UNKNOWN) - ? this.fusionCustomPokemonData.types[0] : fusionSpeciesForm.type1; - const fusionType2 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 1 && this.fusionCustomPokemonData.types[1] !== PokemonType.UNKNOWN) - ? this.fusionCustomPokemonData.types[1] : fusionSpeciesForm.type2; + const fusionType1 = + this.fusionCustomPokemonData?.types && + this.fusionCustomPokemonData.types.length > 0 && + this.fusionCustomPokemonData.types[0] !== PokemonType.UNKNOWN + ? this.fusionCustomPokemonData.types[0] + : fusionSpeciesForm.type1; + const fusionType2 = + this.fusionCustomPokemonData?.types && + this.fusionCustomPokemonData.types.length > 1 && + this.fusionCustomPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.fusionCustomPokemonData.types[1] + : fusionSpeciesForm.type2; // Assign second type if the fusion can provide one if (fusionType2 !== null && fusionType2 !== types[0]) { @@ -1352,15 +1901,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { secondType = fusionType1; } - - if (secondType === PokemonType.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type - secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== PokemonType.UNKNOWN) - ? this.customPokemonData.types[1] : (speciesForm.type2 ?? PokemonType.UNKNOWN); + if ( + secondType === PokemonType.UNKNOWN && + Utils.isNullOrUndefined(fusionType2) + ) { + // If second pokemon was monotype and shared its primary type + secondType = + customTypes && + this.customPokemonData.types.length > 1 && + this.customPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[1] + : (speciesForm.type2 ?? PokemonType.UNKNOWN); } } else { // If not a fusion, just get the second type from the species, checking for permanent changes from ME - secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== PokemonType.UNKNOWN) - ? this.customPokemonData.types[1] : (speciesForm.type2 ?? PokemonType.UNKNOWN); + secondType = + customTypes && + this.customPokemonData.types.length > 1 && + this.customPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[1] + : (speciesForm.type2 ?? PokemonType.UNKNOWN); } if (secondType !== PokemonType.UNKNOWN) { @@ -1383,7 +1943,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // the type added to Pokemon from moves like Forest's Curse or Trick Or Treat - if (!ignoreOverride && this.summonData && this.summonData.addedType && !types.includes(this.summonData.addedType)) { + if ( + !ignoreOverride && + this.summonData && + this.summonData.addedType && + !types.includes(this.summonData.addedType) + ) { types.push(this.summonData.addedType); } @@ -1403,8 +1968,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` * @returns `true` if the Pokemon's type matches */ - public isOfType(type: PokemonType, includeTeraType: boolean = true, forDefend: boolean = false, ignoreOverride: boolean = false): boolean { - return this.getTypes(includeTeraType, forDefend, ignoreOverride).some((t) => t === type); + public isOfType( + type: PokemonType, + includeTeraType = true, + forDefend = false, + ignoreOverride = false, + ): boolean { + return this.getTypes(includeTeraType, forDefend, ignoreOverride).some( + t => t === type, + ); } /** @@ -1415,7 +1987,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` * @returns The non-passive {@linkcode Ability} of the pokemon */ - public getAbility(ignoreOverride: boolean = false): Ability { + public getAbility(ignoreOverride = false): Ability { if (!ignoreOverride && this.summonData?.ability) { return allAbilities[this.summonData.ability]; } @@ -1426,16 +1998,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; } if (this.isFusion()) { - if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) { + if ( + !isNullOrUndefined(this.fusionCustomPokemonData?.ability) && + this.fusionCustomPokemonData.ability !== -1 + ) { return allAbilities[this.fusionCustomPokemonData.ability]; - } else { - return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; } + return allAbilities[ + this.getFusionSpeciesForm(ignoreOverride).getAbility( + this.fusionAbilityIndex, + ) + ]; } - if (!isNullOrUndefined(this.customPokemonData.ability) && this.customPokemonData.ability !== -1) { + if ( + !isNullOrUndefined(this.customPokemonData.ability) && + this.customPokemonData.ability !== -1 + ) { return allAbilities[this.customPokemonData.ability]; } - let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex); + let abilityId = this.getSpeciesForm(ignoreOverride).getAbility( + this.abilityIndex, + ); if (abilityId === Abilities.NONE) { abilityId = this.species.ability1; } @@ -1456,7 +2039,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; } - if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) { + if ( + !isNullOrUndefined(this.customPokemonData.passive) && + this.customPokemonData.passive !== -1 + ) { return allAbilities[this.customPokemonData.passive]; } @@ -1472,11 +2058,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOverride - If `true`, it ignores ability changing effects; Default `false` * @returns An array of all the ability attributes on this ability. */ - public getAbilityAttrs(attrType: { new(...args: any[]): T }, canApply: boolean = true, ignoreOverride: boolean = false): T[] { + public getAbilityAttrs( + attrType: { new (...args: any[]): T }, + canApply = true, + ignoreOverride = false, + ): T[] { const abilityAttrs: T[] = []; if (!canApply || this.canApplyAbility()) { - abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs(attrType)); + abilityAttrs.push( + ...this.getAbility(ignoreOverride).getAttrs(attrType), + ); } if (!canApply || this.canApplyAbility(true)) { @@ -1492,7 +2084,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Also clears primal weather if it is from the ability being changed * @param ability New Ability */ - public setTempAbility(ability: Ability, passive: boolean = false): void { + public setTempAbility(ability: Ability, passive = false): void { applyOnLoseAbAttrs(this, passive); if (passive) { this.summonData.passiveAbility = ability.id; @@ -1506,7 +2098,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Suppresses an ability and calls its onlose attributes */ public suppressAbility() { - [ true, false ].forEach((passive) => applyOnLoseAbAttrs(this, passive)); + [true, false].forEach(passive => applyOnLoseAbAttrs(this, passive)); this.summonData.abilitySuppressed = true; } @@ -1520,14 +2112,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public hasPassive(): boolean { // returns override if valid for current case if ( - (Overrides.HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isPlayer()) - || (Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE === false && !this.isPlayer()) + (Overrides.HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isPlayer()) || + (Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE === false && !this.isPlayer()) ) { return false; } if ( - ((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) && this.isPlayer()) - || ((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) && !this.isPlayer()) + ((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || + Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) && + this.isPlayer()) || + ((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || + Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) && + !this.isPlayer()) ) { return true; } @@ -1535,10 +2131,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Classic Final boss and Endless Minor/Major bosses do not have passive const { currentBattle, gameMode } = globalScene; const waveIndex = currentBattle?.waveIndex; - if (this instanceof EnemyPokemon && + if ( + this instanceof EnemyPokemon && (currentBattle?.battleSpec === BattleSpec.FINAL_BOSS || - gameMode.isEndlessMinorBoss(waveIndex) || - gameMode.isEndlessMajorBoss(waveIndex))) { + gameMode.isEndlessMinorBoss(waveIndex) || + gameMode.isEndlessMajorBoss(waveIndex)) + ) { return false; } @@ -1552,34 +2150,58 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param passive If true, check if passive can be applied instead of non-passive * @returns `true` if the ability can be applied */ - public canApplyAbility(passive: boolean = false): boolean { + public canApplyAbility(passive = false): boolean { if (passive && !this.hasPassive()) { return false; } - const ability = (!passive ? this.getAbility() : this.getPassiveAbility()); + const ability = !passive ? this.getAbility() : this.getPassiveAbility(); if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) { return false; } const arena = globalScene?.arena; - if (arena.ignoreAbilities && arena.ignoringEffectSource !== this.getBattlerIndex() && ability.isIgnorable) { + if ( + arena.ignoreAbilities && + arena.ignoringEffectSource !== this.getBattlerIndex() && + ability.isIgnorable + ) { return false; } - if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) { + if ( + this.summonData?.abilitySuppressed && + !ability.hasAttr(UnsuppressableAbilityAbAttr) + ) { return false; } - const suppressAbilitiesTag = arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; - if (this.isOnField() && suppressAbilitiesTag && !suppressAbilitiesTag.isBeingRemoved()) { - const thisAbilitySuppressing = ability.hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr); - const hasSuppressingAbility = this.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false); + const suppressAbilitiesTag = arena.getTag( + ArenaTagType.NEUTRALIZING_GAS, + ) as SuppressAbilitiesTag; + if ( + this.isOnField() && + suppressAbilitiesTag && + !suppressAbilitiesTag.isBeingRemoved() + ) { + const thisAbilitySuppressing = ability.hasAttr( + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + ); + const hasSuppressingAbility = this.hasAbilityWithAttr( + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + false, + ); // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas // (Balance decided that the other ability of a neutralizing gas pokemon should not be neutralized) // If the ability itself is neutralizing gas, don't suppress it (handled through arena tag) - const unsuppressable = ability.hasAttr(UnsuppressableAbilityAbAttr) || thisAbilitySuppressing || (hasSuppressingAbility && !suppressAbilitiesTag.shouldApplyToSelf()); + const unsuppressable = + ability.hasAttr(UnsuppressableAbilityAbAttr) || + thisAbilitySuppressing || + (hasSuppressingAbility && !suppressAbilitiesTag.shouldApplyToSelf()); if (!unsuppressable) { return false; } } - return (this.hp > 0 || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this)); + return ( + (this.hp > 0 || ability.isBypassFaint) && + !ability.conditions.find(condition => !condition(this)) + ); } /** @@ -1591,11 +2213,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether the ability is present and active */ - public hasAbility(ability: Abilities, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if (this.getAbility(ignoreOverride).id === ability && (!canApply || this.canApplyAbility())) { + public hasAbility( + ability: Abilities, + canApply = true, + ignoreOverride?: boolean, + ): boolean { + if ( + this.getAbility(ignoreOverride).id === ability && + (!canApply || this.canApplyAbility()) + ) { return true; } - if (this.getPassiveAbility().id === ability && this.hasPassive() && (!canApply || this.canApplyAbility(true))) { + if ( + this.getPassiveAbility().id === ability && + this.hasPassive() && + (!canApply || this.canApplyAbility(true)) + ) { return true; } return false; @@ -1611,11 +2244,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether an ability with that attribute is present and active */ - public hasAbilityWithAttr(attrType: Constructor, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) { + public hasAbilityWithAttr( + attrType: Constructor, + canApply = true, + ignoreOverride?: boolean, + ): boolean { + if ( + (!canApply || this.canApplyAbility()) && + this.getAbility(ignoreOverride).hasAttr(attrType) + ) { return true; } - if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().hasAttr(attrType)) { + if ( + this.hasPassive() && + (!canApply || this.canApplyAbility(true)) && + this.getPassiveAbility().hasAttr(attrType) + ) { return true; } return false; @@ -1646,8 +2290,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getTeraType(): PokemonType { if (this.hasSpecies(Species.TERAPAGOS)) { return PokemonType.STELLAR; - } else if (this.hasSpecies(Species.OGERPON)) { - const ogerponForm = this.species.speciesId === Species.OGERPON ? this.formIndex : this.fusionFormIndex; + } + if (this.hasSpecies(Species.OGERPON)) { + const ogerponForm = + this.species.speciesId === Species.OGERPON + ? this.formIndex + : this.fusionFormIndex; switch (ogerponForm) { case 0: case 4: @@ -1662,14 +2310,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case 7: return PokemonType.ROCK; } - } else if (this.hasSpecies(Species.SHEDINJA)) { + } + if (this.hasSpecies(Species.SHEDINJA)) { return PokemonType.BUG; } return this.teraType; } public isGrounded(): boolean { - return !!this.getTag(GroundedTag) || (!this.isOfType(PokemonType.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.FLOATING) && !this.getTag(SemiInvulnerableTag)); + return ( + !!this.getTag(GroundedTag) || + (!this.isOfType(PokemonType.FLYING, true, true) && + !this.hasAbility(Abilities.LEVITATE) && + !this.getTag(BattlerTagType.FLOATING) && + !this.getTag(SemiInvulnerableTag)) + ); } /** @@ -1680,7 +2335,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param simulated - If `true`, applies abilities via simulated calls. * @returns `true` if the pokemon is trapped */ - public isTrapped(trappedAbMessages: string[] = [], simulated: boolean = true): boolean { + public isTrapped( + trappedAbMessages: string[] = [], + simulated = true, + ): boolean { const commandedTag = this.getTag(BattlerTagType.COMMANDED); if (commandedTag?.getSourcePokemon()?.isActive(true)) { return true; @@ -1695,15 +2353,30 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Contains opposing Pokemon (Enemy/Player Pokemon) depending on perspective * Afterwards, it filters out Pokemon that have been switched out of the field so trapped abilities/moves do not trigger */ - const opposingFieldUnfiltered = this.isPlayer() ? globalScene.getEnemyField() : globalScene.getPlayerField(); - const opposingField = opposingFieldUnfiltered.filter(enemyPkm => enemyPkm.switchOutStatus === false); - - opposingField.forEach((opponent) => - applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated) + const opposingFieldUnfiltered = this.isPlayer() + ? globalScene.getEnemyField() + : globalScene.getPlayerField(); + const opposingField = opposingFieldUnfiltered.filter( + enemyPkm => enemyPkm.switchOutStatus === false, ); + for (const opponent of opposingField) { + applyCheckTrappedAbAttrs( + CheckTrappedAbAttr, + opponent, + trappedByAbility, + this, + trappedAbMessages, + simulated, + ); + } + const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - return (trappedByAbility.value || !!this.getTag(TrappedTag) || !!globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, side)); + return ( + trappedByAbility.value || + !!this.getTag(TrappedTag) || + !!globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, side) + ); } /** @@ -1713,13 +2386,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param simulated - If `true`, prevents showing abilities applied in this calculation. * @returns The {@linkcode PokemonType} of the move after attributes are applied */ - public getMoveType(move: Move, simulated: boolean = true): PokemonType { + public getMoveType(move: Move, simulated = true): PokemonType { const moveTypeHolder = new Utils.NumberHolder(move.type); applyMoveAttrs(VariableMoveTypeAttr, this, null, move, moveTypeHolder); - applyPreAttackAbAttrs(MoveTypeChangeAbAttr, this, null, move, simulated, moveTypeHolder); + applyPreAttackAbAttrs( + MoveTypeChangeAbAttr, + this, + null, + move, + simulated, + moveTypeHolder, + ); - globalScene.arena.applyTags(ArenaTagType.ION_DELUGE, simulated, moveTypeHolder); + globalScene.arena.applyTags( + ArenaTagType.ION_DELUGE, + simulated, + moveTypeHolder, + ); if (this.getTag(BattlerTagType.ELECTRIFIED)) { moveTypeHolder.value = PokemonType.ELECTRIC; } @@ -1727,7 +2411,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return moveTypeHolder.value as PokemonType; } - /** * Calculates the effectiveness of a move against the Pokémon. * This includes modifiers from move and ability attributes. @@ -1739,7 +2422,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Currently only used by {@linkcode Pokemon.apply} to determine whether a "No effect" message should be shown. * @returns The type damage multiplier, indicating the effectiveness of the move */ - getMoveEffectiveness(source: Pokemon, move: Move, ignoreAbility: boolean = false, simulated: boolean = true, cancelled?: Utils.BooleanHolder): TypeDamageMultiplier { + getMoveEffectiveness( + source: Pokemon, + move: Move, + ignoreAbility = false, + simulated = true, + cancelled?: Utils.BooleanHolder, + ): TypeDamageMultiplier { if (!Utils.isNullOrUndefined(this.turnData?.moveEffectiveness)) { return this.turnData?.moveEffectiveness; } @@ -1749,36 +2438,84 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const moveType = source.getMoveType(move); - const typeMultiplier = new Utils.NumberHolder((move.category !== MoveCategory.STATUS || move.hasAttr(RespectAttackTypeImmunityAttr)) - ? this.getAttackTypeEffectiveness(moveType, source, false, simulated, move) - : 1); + const typeMultiplier = new Utils.NumberHolder( + move.category !== MoveCategory.STATUS || + move.hasAttr(RespectAttackTypeImmunityAttr) + ? this.getAttackTypeEffectiveness( + moveType, + source, + false, + simulated, + move, + ) + : 1, + ); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) { + applyMoveAttrs( + VariableMoveTypeMultiplierAttr, + source, + this, + move, + typeMultiplier, + ); + if ( + this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t)) + ) { typeMultiplier.value = 0; } - if (this.getTag(TarShotTag) && (this.getMoveType(move) === PokemonType.FIRE)) { + if (this.getTag(TarShotTag) && this.getMoveType(move) === PokemonType.FIRE) { typeMultiplier.value *= 2; } const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false); if (!ignoreAbility) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + TypeImmunityAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); if (!cancelledHolder.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + MoveImmunityAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); } if (!cancelledHolder.value) { - const defendingSidePlayField = this.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelledHolder)); + const defendingSidePlayField = this.isPlayer() + ? globalScene.getPlayerField() + : globalScene.getEnemyField(); + defendingSidePlayField.forEach(p => + applyPreDefendAbAttrs( + FieldPriorityMoveImmunityAbAttr, + p, + source, + move, + cancelledHolder, + ), + ); } } - const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); + const immuneTags = this.findTags( + tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType, + ); for (const tag of immuneTags) { - if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + if ( + move && + !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType) + ) { typeMultiplier.value = 0; break; } @@ -1786,14 +2523,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Apply Tera Shell's effect to attacks after all immunities are accounted for if (!ignoreAbility && move.category !== MoveCategory.STATUS) { - applyPreDefendAbAttrs(FullHpResistTypeAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + FullHpResistTypeAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); } - if (move.category === MoveCategory.STATUS && move.hitsSubstitute(source, this)) { + if ( + move.category === MoveCategory.STATUS && + move.hitsSubstitute(source, this) + ) { typeMultiplier.value = 0; } - return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; + return ( + !cancelledHolder.value ? typeMultiplier.value : 0 + ) as TypeDamageMultiplier; } /** @@ -1805,7 +2555,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param move (optional) the move whose type effectiveness is to be checked. Used for applying {@linkcode VariableMoveTypeChartAttr} * @returns a multiplier for the type effectiveness */ - getAttackTypeEffectiveness(moveType: PokemonType, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true, move?: Move): TypeDamageMultiplier { + getAttackTypeEffectiveness( + moveType: PokemonType, + source?: Pokemon, + ignoreStrongWinds = false, + simulated = true, + move?: Move, + ): TypeDamageMultiplier { if (moveType === PokemonType.STELLAR) { return this.isTerastallized ? 2 : 1; } @@ -1814,44 +2570,86 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Handle flying v ground type immunity without removing flying type so effective types are still effective // Related to https://github.com/pagefaultgames/pokerogue/issues/524 - if (moveType === PokemonType.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) { + if ( + moveType === PokemonType.GROUND && + (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY)) + ) { const flyingIndex = types.indexOf(PokemonType.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); } } - let multiplier = types.map(defType => { - const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType)); - applyChallenges(globalScene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); - if (move) { - applyMoveAttrs(VariableMoveTypeChartAttr, null, this, move, multiplier, defType); - } - if (source) { - const ignoreImmunity = new Utils.BooleanHolder(false); - if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { - applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); + let multiplier = types + .map(defType => { + const multiplier = new Utils.NumberHolder( + getTypeDamageMultiplier(moveType, defType), + ); + applyChallenges( + globalScene.gameMode, + ChallengeType.TYPE_EFFECTIVENESS, + multiplier, + ); + if (move) { + applyMoveAttrs( + VariableMoveTypeChartAttr, + null, + this, + move, + multiplier, + defType, + ); } - if (ignoreImmunity.value) { - if (multiplier.value === 0) { - return 1; + if (source) { + const ignoreImmunity = new Utils.BooleanHolder(false); + if ( + source.isActive(true) && + source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr) + ) { + applyAbAttrs( + IgnoreTypeImmunityAbAttr, + source, + ignoreImmunity, + simulated, + moveType, + defType, + ); + } + if (ignoreImmunity.value) { + if (multiplier.value === 0) { + return 1; + } + } + + const exposedTags = this.findTags( + tag => tag instanceof ExposedTag, + ) as ExposedTag[]; + if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { + if (multiplier.value === 0) { + return 1; + } } } + return multiplier.value; + }) + .reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; - const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[]; - if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { - if (multiplier.value === 0) { - return 1; - } - } - } - return multiplier.value; - }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; - - const typeMultiplierAgainstFlying = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, PokemonType.FLYING)); - applyChallenges(globalScene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, typeMultiplierAgainstFlying); + const typeMultiplierAgainstFlying = new Utils.NumberHolder( + getTypeDamageMultiplier(moveType, PokemonType.FLYING), + ); + applyChallenges( + globalScene.gameMode, + ChallengeType.TYPE_EFFECTIVENESS, + typeMultiplierAgainstFlying, + ); // Handle strong winds lowering effectiveness of types super effective against pure flying - if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed() && this.isOfType(PokemonType.FLYING) && typeMultiplierAgainstFlying.value === 2) { + if ( + !ignoreStrongWinds && + arena.weather?.weatherType === WeatherType.STRONG_WINDS && + !arena.weather.isEffectSuppressed() && + this.isOfType(PokemonType.FLYING) && + typeMultiplierAgainstFlying.value === 2 + ) { multiplier /= 2; if (!simulated) { globalScene.queueMessage(i18next.t("weather:strongWindsEffectMessage")); @@ -1870,22 +2668,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const types = this.getTypes(true); const enemyTypes = opponent.getTypes(true, true); /** Is this Pokemon faster than the opponent? */ - const outspeed = (this.isActive(true) ? this.getEffectiveStat(Stat.SPD, opponent) : this.getStat(Stat.SPD, false)) >= opponent.getEffectiveStat(Stat.SPD, this); + const outspeed = + (this.isActive(true) + ? this.getEffectiveStat(Stat.SPD, opponent) + : this.getStat(Stat.SPD, false)) >= + opponent.getEffectiveStat(Stat.SPD, this); /** * Based on how effective this Pokemon's types are offensively against the opponent's types. * This score is increased by 25 percent if this Pokemon is faster than the opponent. */ - let atkScore = opponent.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); + let atkScore = + opponent.getAttackTypeEffectiveness(types[0], this) * + (outspeed ? 1.25 : 1); /** * Based on how effectively this Pokemon defends against the opponent's types. * This score cannot be higher than 4. */ - let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], opponent), 0.25); + let defScore = + 1 / + Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], opponent), 0.25); if (types.length > 1) { atkScore *= opponent.getAttackTypeEffectiveness(types[1], this); } if (enemyTypes.length > 1) { - defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], opponent), 0.25)); + defScore *= + 1 / + Math.max( + this.getAttackTypeEffectiveness(enemyTypes[1], opponent), + 0.25, + ); } /** * Based on this Pokemon's HP ratio compared to that of the opponent. @@ -1903,19 +2714,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (pokemonEvolutions.hasOwnProperty(this.species.speciesId)) { const evolutions = pokemonEvolutions[this.species.speciesId]; for (const e of evolutions) { - if (!e.item && this.level >= e.level && (isNullOrUndefined(e.preFormKey) || this.getFormKey() === e.preFormKey)) { - if (e.condition === null || (e.condition as SpeciesEvolutionCondition).predicate(this)) { + if ( + !e.item && + this.level >= e.level && + (isNullOrUndefined(e.preFormKey) || + this.getFormKey() === e.preFormKey) + ) { + if ( + e.condition === null || + (e.condition as SpeciesEvolutionCondition).predicate(this) + ) { return e; } } } } - if (this.isFusion() && this.fusionSpecies && pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId)) { - const fusionEvolutions = pokemonEvolutions[this.fusionSpecies.speciesId].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); + if ( + this.isFusion() && + this.fusionSpecies && + pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId) + ) { + const fusionEvolutions = pokemonEvolutions[ + this.fusionSpecies.speciesId + ].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); for (const fe of fusionEvolutions) { - if (!fe.item && this.level >= fe.level && (isNullOrUndefined(fe.preFormKey) || this.getFusionFormKey() === fe.preFormKey)) { - if (fe.condition === null || (fe.condition as SpeciesEvolutionCondition).predicate(this)) { + if ( + !fe.item && + this.level >= fe.level && + (isNullOrUndefined(fe.preFormKey) || + this.getFusionFormKey() === fe.preFormKey) + ) { + if ( + fe.condition === null || + (fe.condition as SpeciesEvolutionCondition).predicate(this) + ) { return fe; } } @@ -1933,48 +2766,125 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} includeRelearnerMoves Whether to include moves that would require a relearner. Note the move relearner inherently allows evolution moves * @returns {LevelMoves} A list of moves and the levels they can be learned at */ - getLevelMoves(startingLevel?: number, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false, includeRelearnerMoves: boolean = false, learnSituation: LearnMoveSituation = LearnMoveSituation.MISC): LevelMoves { + getLevelMoves( + startingLevel?: number, + includeEvolutionMoves = false, + simulateEvolutionChain = false, + includeRelearnerMoves = false, + learnSituation: LearnMoveSituation = LearnMoveSituation.MISC, + ): LevelMoves { const ret: LevelMoves = []; let levelMoves: LevelMoves = []; if (!startingLevel) { startingLevel = this.level; } - if (learnSituation === LearnMoveSituation.EVOLUTION_FUSED && this.fusionSpecies) { // For fusion evolutions, get ONLY the moves of the component mon that evolved - levelMoves = this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0); + if ( + learnSituation === LearnMoveSituation.EVOLUTION_FUSED && + this.fusionSpecies + ) { + // For fusion evolutions, get ONLY the moves of the component mon that evolved + levelMoves = this.getFusionSpeciesForm(true) + .getLevelMoves() + .filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || + lm[0] > 0, + ); } else { if (simulateEvolutionChain) { - const evolutionChain = this.species.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); + const evolutionChain = this.species.getSimulatedEvolutionChain( + this.level, + this.hasTrainer(), + this.isBoss(), + this.isPlayer(), + ); for (let e = 0; e < evolutionChain.length; e++) { // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(evolutionChain[e][0], this.formIndex).getLevelMoves(); + const speciesLevelMoves = getPokemonSpeciesForm( + evolutionChain[e][0], + this.formIndex, + ).getLevelMoves(); if (includeRelearnerMoves) { levelMoves.push(...speciesLevelMoves); } else { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || ((!e || lm[0] > 1) && (e === evolutionChain.length - 1 || lm[0] <= evolutionChain[e + 1][1])))); + levelMoves.push( + ...speciesLevelMoves.filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + ((!e || lm[0] > 1) && + (e === evolutionChain.length - 1 || + lm[0] <= evolutionChain[e + 1][1])), + ), + ); } } } else { - levelMoves = this.getSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0); + levelMoves = this.getSpeciesForm(true) + .getLevelMoves() + .filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || + lm[0] > 0, + ); } - if (this.fusionSpecies && learnSituation !== LearnMoveSituation.EVOLUTION_FUSED_BASE) { // For fusion evolutions, get ONLY the moves of the component mon that evolved + if ( + this.fusionSpecies && + learnSituation !== LearnMoveSituation.EVOLUTION_FUSED_BASE + ) { + // For fusion evolutions, get ONLY the moves of the component mon that evolved if (simulateEvolutionChain) { - const fusionEvolutionChain = this.fusionSpecies.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); + const fusionEvolutionChain = + this.fusionSpecies.getSimulatedEvolutionChain( + this.level, + this.hasTrainer(), + this.isBoss(), + this.isPlayer(), + ); for (let e = 0; e < fusionEvolutionChain.length; e++) { // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(fusionEvolutionChain[e][0], this.fusionFormIndex).getLevelMoves(); + const speciesLevelMoves = getPokemonSpeciesForm( + fusionEvolutionChain[e][0], + this.fusionFormIndex, + ).getLevelMoves(); if (includeRelearnerMoves) { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || lm[0] !== EVOLVE_MOVE)); + levelMoves.push( + ...speciesLevelMoves.filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + lm[0] !== EVOLVE_MOVE, + ), + ); } else { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || ((!e || lm[0] > 1) && (e === fusionEvolutionChain.length - 1 || lm[0] <= fusionEvolutionChain[e + 1][1])))); + levelMoves.push( + ...speciesLevelMoves.filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + ((!e || lm[0] > 1) && + (e === fusionEvolutionChain.length - 1 || + lm[0] <= fusionEvolutionChain[e + 1][1])), + ), + ); } } } else { - levelMoves.push(...this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0)); + levelMoves.push( + ...this.getFusionSpeciesForm(true) + .getLevelMoves() + .filter( + lm => + (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || + (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || + lm[0] > 0, + ), + ); } } } - levelMoves.sort((lma: [number, number], lmb: [number, number]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); - + levelMoves.sort((lma: [number, number], lmb: [number, number]) => + lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0, + ); /** * Filter out moves not within the correct level range(s) @@ -1984,10 +2894,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { levelMoves = levelMoves.filter(lm => { const level = lm[0]; const isRelearner = level < startingLevel; - const allowedEvolutionMove = (level === 0) && includeEvolutionMoves; + const allowedEvolutionMove = level === 0 && includeEvolutionMoves; - return !(level > this.level) - && (includeRelearnerMoves || !isRelearner || allowedEvolutionMove); + return ( + !(level > this.level) && + (includeRelearnerMoves || !isRelearner || allowedEvolutionMove) + ); }); /** @@ -2010,8 +2922,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param levelMoves the input array to search for non-duplicates from * @param ret the output array to be pushed into. */ - private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves ): void { - const uniqueMoves : Moves[] = []; + private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves): void { + const uniqueMoves: Moves[] = []; for (const lm of levelMoves) { if (!uniqueMoves.find(m => m === lm[1])) { uniqueMoves.push(lm[1]); @@ -2020,13 +2932,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - /** * Get a list of all egg moves * * @returns list of egg moves */ - getEggMoves() : Moves[] | undefined { + getEggMoves(): Moves[] | undefined { return speciesEggMoves[this.getSpeciesForm().getRootSpeciesId()]; } @@ -2051,12 +2962,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ trySetShiny(thresholdOverride?: number): boolean { // Shiny Pokemon should not spawn in the end biome in endless - if (globalScene.gameMode.isEndless && globalScene.arena.biomeType === Biome.END) { + if ( + globalScene.gameMode.isEndless && + globalScene.arena.biomeType === Biome.END + ) { return false; } - const rand1 = (this.id & 0xFFFF0000) >>> 16; - const rand2 = (this.id & 0x0000FFFF); + const rand1 = (this.id & 0xffff0000) >>> 16; + const rand2 = this.id & 0x0000ffff; const E = globalScene.gameData.trainerId ^ globalScene.gameData.secretId; const F = rand1 ^ rand2; @@ -2067,7 +2981,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } if (!this.hasTrainer()) { - globalScene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + globalScene.applyModifiers( + ShinyRateBoosterModifier, + true, + shinyThreshold, + ); } } else { shinyThreshold.value = thresholdOverride; @@ -2092,7 +3010,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param applyModifiersToOverride If {@linkcode thresholdOverride} is set and this is true, will apply Shiny Charm and event modifiers to {@linkcode thresholdOverride} * @returns `true` if the Pokemon has been set as a shiny, `false` otherwise */ - public trySetShinySeed(thresholdOverride?: number, applyModifiersToOverride?: boolean): boolean { + public trySetShinySeed( + thresholdOverride?: number, + applyModifiersToOverride?: boolean, + ): boolean { const shinyThreshold = new Utils.NumberHolder(BASE_SHINY_CHANCE); if (thresholdOverride === undefined || applyModifiersToOverride) { if (thresholdOverride !== undefined && applyModifiersToOverride) { @@ -2102,7 +3023,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } if (!this.hasTrainer()) { - globalScene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + globalScene.applyModifiers( + ShinyRateBoosterModifier, + true, + shinyThreshold, + ); } } else { shinyThreshold.value = thresholdOverride; @@ -2112,7 +3037,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.shiny) { this.variant = this.generateShinyVariant(); - this.luck = this.variant + 1 + (this.fusionShiny ? this.fusionVariant + 1 : 0); + this.luck = + this.variant + 1 + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.initShinySparkle(); } @@ -2136,20 +3062,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } // Checks if there is no variant data for both the index or index with form - if (!this.shiny || (!variantData.hasOwnProperty(variantDataIndex) && !variantData.hasOwnProperty(this.species.speciesId))) { + if ( + !this.shiny || + (!variantData.hasOwnProperty(variantDataIndex) && + !variantData.hasOwnProperty(this.species.speciesId)) + ) { return 0; } const rand = new Utils.NumberHolder(0); - globalScene.executeWithSeedOffset(() => { - rand.value = Utils.randSeedInt(10); - }, this.id, globalScene.waveSeed); + globalScene.executeWithSeedOffset( + () => { + rand.value = Utils.randSeedInt(10); + }, + this.id, + globalScene.waveSeed, + ); if (rand.value >= SHINY_VARIANT_CHANCE) { - return 0; // 6/10 - } else if (rand.value >= SHINY_EPIC_CHANCE) { - return 1; // 3/10 - } else { - return 2; // 1/10 + return 0; // 6/10 } + if (rand.value >= SHINY_EPIC_CHANCE) { + return 1; // 3/10 + } + return 2; // 1/10 } /** @@ -2161,7 +3095,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param applyModifiersToOverride If {@linkcode thresholdOverride} is set and this is true, will apply Ability Charm to {@linkcode thresholdOverride} * @returns `true` if the Pokemon has been set to have its hidden ability, `false` otherwise */ - public tryRerollHiddenAbilitySeed(thresholdOverride?: number, applyModifiersToOverride?: boolean): boolean { + public tryRerollHiddenAbilitySeed( + thresholdOverride?: number, + applyModifiersToOverride?: boolean, + ): boolean { if (!this.species.abilityHidden) { return false; } @@ -2171,7 +3108,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { haThreshold.value = thresholdOverride; } if (!this.hasTrainer()) { - globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, haThreshold); + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + haThreshold, + ); } } else { haThreshold.value = thresholdOverride; @@ -2185,37 +3126,67 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } public generateFusionSpecies(forStarter?: boolean): void { - const hiddenAbilityChance = new Utils.NumberHolder(BASE_HIDDEN_ABILITY_CHANCE); + const hiddenAbilityChance = new Utils.NumberHolder( + BASE_HIDDEN_ABILITY_CHANCE, + ); if (!this.hasTrainer()) { - globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + hiddenAbilityChance, + ); } const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const randAbilityIndex = Utils.randSeedInt(2); - const filter = !forStarter ? - this.species.getCompatibleFusionSpeciesFilter() + const filter = !forStarter + ? this.species.getCompatibleFusionSpeciesFilter() : (species: PokemonSpecies) => { - return pokemonEvolutions.hasOwnProperty(species.speciesId) - && !pokemonPrevolutions.hasOwnProperty(species.speciesId) - && !species.subLegendary - && !species.legendary - && !species.mythical - && !species.isTrainerForbidden() - && species.speciesId !== this.species.speciesId - && species.speciesId !== Species.DITTO; - }; + return ( + pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + !species.subLegendary && + !species.legendary && + !species.mythical && + !species.isTrainerForbidden() && + species.speciesId !== this.species.speciesId && + species.speciesId !== Species.DITTO + ); + }; let fusionOverride: PokemonSpecies | undefined = undefined; - if (forStarter && this instanceof PlayerPokemon && Overrides.STARTER_FUSION_SPECIES_OVERRIDE) { - fusionOverride = getPokemonSpecies(Overrides.STARTER_FUSION_SPECIES_OVERRIDE); - } else if (this instanceof EnemyPokemon && Overrides.OPP_FUSION_SPECIES_OVERRIDE) { + if ( + forStarter && + this instanceof PlayerPokemon && + Overrides.STARTER_FUSION_SPECIES_OVERRIDE + ) { + fusionOverride = getPokemonSpecies( + Overrides.STARTER_FUSION_SPECIES_OVERRIDE, + ); + } else if ( + this instanceof EnemyPokemon && + Overrides.OPP_FUSION_SPECIES_OVERRIDE + ) { fusionOverride = getPokemonSpecies(Overrides.OPP_FUSION_SPECIES_OVERRIDE); } - this.fusionSpecies = fusionOverride ?? globalScene.randomSpecies(globalScene.currentBattle?.waveIndex || 0, this.level, false, filter, true); - this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? 2 : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 ? randAbilityIndex : 0); + this.fusionSpecies = + fusionOverride ?? + globalScene.randomSpecies( + globalScene.currentBattle?.waveIndex || 0, + this.level, + false, + filter, + true, + ); + this.fusionAbilityIndex = + this.fusionSpecies.abilityHidden && hasHiddenAbility + ? 2 + : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 + ? randAbilityIndex + : 0; this.fusionShiny = this.shiny; this.fusionVariant = this.variant; @@ -2230,7 +3201,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - this.fusionFormIndex = globalScene.getSpeciesFormIndex(this.fusionSpecies, this.fusionGender, this.getNature(), true); + this.fusionFormIndex = globalScene.getSpeciesFormIndex( + this.fusionSpecies, + this.fusionGender, + this.getNature(), + true, + ); this.fusionLuck = this.luck; this.generateName(); @@ -2256,7 +3232,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let movePool: [Moves, number][] = []; const allLevelMoves = this.getLevelMoves(1, true, true); if (!allLevelMoves) { - console.warn("Error encountered trying to generate moveset for:", this.species.name); + console.warn( + "Error encountered trying to generate moveset for:", + this.species.name, + ); return; } @@ -2274,34 +3253,55 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (weight === 1 && allMoves[levelMove[1]].power >= 80) { weight = 40; } - if (!movePool.some(m => m[0] === levelMove[1]) && !allMoves[levelMove[1]].name.endsWith(" (N)")) { - movePool.push([ levelMove[1], weight ]); + if ( + !movePool.some(m => m[0] === levelMove[1]) && + !allMoves[levelMove[1]].name.endsWith(" (N)") + ) { + movePool.push([levelMove[1], weight]); } } if (this.hasTrainer()) { const tms = Object.keys(tmSpecies); for (const tm of tms) { - const moveId = parseInt(tm) as Moves; + const moveId = Number.parseInt(tm) as Moves; let compatible = false; for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { - if (p[0] === this.species.speciesId || (this.fusionSpecies && p[0] === this.fusionSpecies.speciesId) && p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) { + if ( + p[0] === this.species.speciesId || + (this.fusionSpecies && + p[0] === this.fusionSpecies.speciesId && + p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) + ) { compatible = true; break; } - } else if (p === this.species.speciesId || (this.fusionSpecies && p === this.fusionSpecies.speciesId)) { + } else if ( + p === this.species.speciesId || + (this.fusionSpecies && p === this.fusionSpecies.speciesId) + ) { compatible = true; break; } } - if (compatible && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { + if ( + compatible && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { if (tmPoolTiers[moveId] === ModifierTier.COMMON && this.level >= 15) { - movePool.push([ moveId, 4 ]); - } else if (tmPoolTiers[moveId] === ModifierTier.GREAT && this.level >= 30) { - movePool.push([ moveId, 8 ]); - } else if (tmPoolTiers[moveId] === ModifierTier.ULTRA && this.level >= 50) { - movePool.push([ moveId, 14 ]); + movePool.push([moveId, 4]); + } else if ( + tmPoolTiers[moveId] === ModifierTier.GREAT && + this.level >= 30 + ) { + movePool.push([moveId, 8]); + } else if ( + tmPoolTiers[moveId] === ModifierTier.ULTRA && + this.level >= 50 + ) { + movePool.push([moveId, 14]); } } } @@ -2310,26 +3310,44 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.level >= 60) { for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([ moveId, 40 ]); + if ( + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { + movePool.push([moveId, 40]); } } const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; // No rare egg moves before e4 - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) { - movePool.push([ moveId, 30 ]); + if ( + this.level >= 170 && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") && + !this.isBoss() + ) { + movePool.push([moveId, 30]); } if (this.fusionSpecies) { for (let i = 0; i < 3; i++) { - const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([ moveId, 40 ]); + const moveId = + speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; + if ( + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { + movePool.push([moveId, 40]); } } - const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; + const moveId = + speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; // No rare egg moves before e4 - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) { - movePool.push([ moveId, 30 ]); + if ( + this.level >= 170 && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") && + !this.isBoss() + ) { + movePool.push([moveId, 30]); } } } @@ -2340,33 +3358,79 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttr)); movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(HpSplitAttr)); } - movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit)); + movePool = movePool.filter( + m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit), + ); if (this.hasTrainer()) { // Trainers never get OHKO moves movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(OneHitKOAttr)); // Half the weight of self KO moves - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1) ]); - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * (allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1), + ]); + movePool = movePool.map(m => [ + m[0], + m[1] * (allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1), + ]); // Trainers get a weight bump to stat buffing moves - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].getAttrs(StatStageChangeAttr).some(a => a.stages > 1 && a.selfTarget) ? 1.25 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]] + .getAttrs(StatStageChangeAttr) + .some(a => a.stages > 1 && a.selfTarget) + ? 1.25 + : 1), + ]); // Trainers get a weight decrease to multiturn moves - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].isChargingMove() || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * + (!!allMoves[m[0]].isChargingMove() || + !!allMoves[m[0]].hasAttr(RechargeAttr) + ? 0.7 + : 1), + ]); } // Weight towards higher power moves, by reducing the power of moves below the highest power. // Caps max power at 90 to avoid something like hyper beam ruining the stats. // This is a pretty soft weighting factor, although it is scaled with the weight multiplier. - const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].calculateEffectivePower(), v), 40), 90); - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].calculateEffectivePower() / maxPower, 1), 0.5)) ]); + const maxPower = Math.min( + movePool.reduce( + (v, m) => Math.max(allMoves[m[0]].calculateEffectivePower(), v), + 40, + ), + 90, + ); + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]].category === MoveCategory.STATUS + ? 1 + : Math.max( + Math.min(allMoves[m[0]].calculateEffectivePower() / maxPower, 1), + 0.5, + )), + ]); // Weight damaging moves against the lower stat. This uses a non-linear relationship. // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. // One third weight at ~1.58x higher, one quarter weight at ~1.73x higher, one fifth at ~1.87x, and one tenth at ~2.35x higher. const atk = this.getStat(Stat.ATK); const spAtk = this.getStat(Stat.SPATK); - const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; - const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? Math.min(Math.pow(statRatio, 3) * 1.3, 1) : 1) ]); + const worseCategory: MoveCategory = + atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; + const statRatio = + worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]].category === worseCategory + ? Math.min(Math.pow(statRatio, 3) * 1.3, 1) + : 1), + ]); /** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */ let weightMultiplier = 0.9; @@ -2376,11 +3440,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.isBoss()) { weightMultiplier += 0.4; } - const baseWeights: [Moves, number][] = movePool.map(m => [ m[0], Math.ceil(Math.pow(m[1], weightMultiplier) * 100) ]); + const baseWeights: [Moves, number][] = movePool.map(m => [ + m[0], + Math.ceil(Math.pow(m[1], weightMultiplier) * 100), + ]); // Trainers and bosses always force a stab move if (this.hasTrainer() || this.isBoss()) { - const stabMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS && this.isOfType(allMoves[m[0]].type)); + const stabMovePool = baseWeights.filter( + m => + allMoves[m[0]].category !== MoveCategory.STATUS && + this.isOfType(allMoves[m[0]].type), + ); if (stabMovePool.length) { const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0); @@ -2391,8 +3462,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.moveset.push(new PokemonMove(stabMovePool[index][0], 0, 0)); } - } else { // Normal wild pokemon just force a random damaging move - const attackMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS); + } else { + // Normal wild pokemon just force a random damaging move + const attackMovePool = baseWeights.filter( + m => allMoves[m[0]].category !== MoveCategory.STATUS, + ); if (attackMovePool.length) { const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -2404,25 +3478,49 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { + while ( + baseWeights.length > this.moveset.length && + this.moveset.length < 4 + ) { if (this.hasTrainer()) { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map((m) => { - let ret: number; - if (this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type)) { - ret = Math.ceil(Math.sqrt(m[1])); - } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { - ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 20 : 1)); - } else { - ret = m[1]; - } - return [ m[0], ret ]; - }); + movePool = baseWeights + .filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)) + .map(m => { + let ret: number; + if ( + this.moveset.some( + mo => + mo?.getMove().category !== MoveCategory.STATUS && + mo?.getMove().type === allMoves[m[0]].type, + ) + ) { + ret = Math.ceil(Math.sqrt(m[1])); + } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { + ret = Math.ceil( + (m[1] / + Math.max( + Math.pow( + 4, + this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1) + .length, + ) / 8, + 0.5, + )) * + (this.isOfType(allMoves[m[0]].type) ? 20 : 1), + ); + } else { + ret = m[1]; + } + return [m[0], ret]; + }); } else { // Non-trainer pokemon just use normal weights - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)); + movePool = baseWeights.filter( + m => !this.moveset.some(mo => m[0] === mo?.moveId), + ); } const totalWeight = movePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -2434,37 +3532,56 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // Trigger FormChange, except for enemy Pokemon during Mystery Encounters, to avoid crashes - if (this.isPlayer() || !globalScene.currentBattle?.isBattleMysteryEncounter() || !globalScene.currentBattle?.mysteryEncounter) { - globalScene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + if ( + this.isPlayer() || + !globalScene.currentBattle?.isBattleMysteryEncounter() || + !globalScene.currentBattle?.mysteryEncounter + ) { + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeMoveLearnedTrigger, + ); } } public trySelectMove(moveIndex: number, ignorePp?: boolean): boolean { - const move = this.getMoveset().length > moveIndex - ? this.getMoveset()[moveIndex] - : null; + const move = + this.getMoveset().length > moveIndex + ? this.getMoveset()[moveIndex] + : null; return move?.isUsable(this, ignorePp) ?? false; } showInfo(): void { if (!this.battleInfo.visible) { - const otherBattleInfo = globalScene.fieldUI.getAll().slice(0, 4).filter(ui => ui instanceof BattleInfo && ((ui as BattleInfo) instanceof PlayerBattleInfo) === this.isPlayer()).find(() => true); + const otherBattleInfo = globalScene.fieldUI + .getAll() + .slice(0, 4) + .filter( + ui => + ui instanceof BattleInfo && + (ui as BattleInfo) instanceof PlayerBattleInfo === this.isPlayer(), + ) + .find(() => true); if (!otherBattleInfo || !this.getFieldIndex()) { globalScene.fieldUI.sendToBack(this.battleInfo); globalScene.sendTextToBack(); // Push the top right text objects behind everything else } else { globalScene.fieldUI.moveAbove(this.battleInfo, otherBattleInfo); } - this.battleInfo.setX(this.battleInfo.x + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); + this.battleInfo.setX( + this.battleInfo.x + + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198), + ); this.battleInfo.setVisible(true); if (this.isPlayer()) { this.battleInfo.expMaskRect.x += 150; } globalScene.tweens.add({ - targets: [ this.battleInfo, this.battleInfo.expMaskRect ], + targets: [this.battleInfo, this.battleInfo.expMaskRect], x: this.isPlayer() ? "-=150" : `+=${!this.isBoss() ? 150 : 246}`, duration: 1000, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }); } } @@ -2473,7 +3590,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return new Promise(resolve => { if (this.battleInfo && this.battleInfo.visible) { globalScene.tweens.add({ - targets: [ this.battleInfo, this.battleInfo.expMaskRect ], + targets: [this.battleInfo, this.battleInfo.expMaskRect], x: this.isPlayer() ? "+=150" : `-=${!this.isBoss() ? 150 : 246}`, duration: 500, ease: "Cubic.easeIn", @@ -2482,9 +3599,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleInfo.expMaskRect.x -= 150; } this.battleInfo.setVisible(false); - this.battleInfo.setX(this.battleInfo.x - (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); + this.battleInfo.setX( + this.battleInfo.x - + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198), + ); resolve(); - } + }, }); } else { resolve(); @@ -2525,18 +3645,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param exp The amount of experience to add * @param ignoreLevelCap Whether to ignore level caps when adding experience (defaults to false) */ - addExp(exp: number, ignoreLevelCap: boolean = false) { + addExp(exp: number, ignoreLevelCap = false) { const maxExpLevel = globalScene.getMaxExpLevel(ignoreLevelCap); const initialExp = this.exp; this.exp += exp; - while (this.level < maxExpLevel && this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate)) { + while ( + this.level < maxExpLevel && + this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate) + ) { this.level++; } if (this.level >= maxExpLevel) { - console.log(initialExp, this.exp, getLevelTotalExp(this.level, this.species.growthRate)); - this.exp = Math.max(getLevelTotalExp(this.level, this.species.growthRate), initialExp); + console.log( + initialExp, + this.exp, + getLevelTotalExp(this.level, this.species.growthRate), + ); + this.exp = Math.max( + getLevelTotalExp(this.level, this.species.growthRate), + initialExp, + ); } - this.levelExp = this.exp - getLevelTotalExp(this.level, this.species.growthRate); + this.levelExp = + this.exp - getLevelTotalExp(this.level, this.species.growthRate); } /** @@ -2557,7 +3688,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getOpponents(): Pokemon[] { - return ((this.isPlayer() ? globalScene.getEnemyField() : globalScene.getPlayerField()) as Pokemon[]).filter(p => p.isActive()); + return ( + (this.isPlayer() + ? globalScene.getEnemyField() + : globalScene.getPlayerField()) as Pokemon[] + ).filter(p => p.isActive()); } getOpponentDescriptor(): string { @@ -2565,11 +3700,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (opponents.length === 1) { return opponents[0].name; } - return this.isPlayer() ? i18next.t("arenaTag:opposingTeam") : i18next.t("arenaTag:yourTeam"); + return this.isPlayer() + ? i18next.t("arenaTag:opposingTeam") + : i18next.t("arenaTag:yourTeam"); } getAlly(): Pokemon { - return (this.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField())[this.getFieldIndex() ? 0 : 1]; + return ( + this.isPlayer() + ? globalScene.getPlayerField() + : globalScene.getEnemyField() + )[this.getFieldIndex() ? 0 : 1]; } /** @@ -2578,7 +3719,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns An array of Pokémon on the allied field. */ getAlliedField(): Pokemon[] { - return this instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); + return this instanceof PlayerPokemon + ? globalScene.getPlayerField() + : globalScene.getEnemyField(); } /** @@ -2595,7 +3738,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @return the stat stage multiplier to be used for effective stat calculation */ - getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { + getStatStageMultiplier( + stat: EffectiveStat, + opponent?: Pokemon, + move?: Move, + ignoreOppAbility = false, + isCritical = false, + simulated = true, + ignoreHeldItems = false, + ): number { const statStage = new Utils.NumberHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); @@ -2613,17 +3764,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } if (!ignoreOppAbility) { - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, simulated, stat, ignoreStatStage); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + opponent, + null, + simulated, + stat, + ignoreStatStage, + ); } if (move) { - applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage); + applyMoveAttrs( + IgnoreOpponentStatStagesAttr, + this, + opponent, + move, + ignoreStatStage, + ); } } if (!ignoreStatStage.value) { - const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value)); + const statStageMultiplier = new Utils.NumberHolder( + Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value), + ); if (!ignoreHeldItems) { - globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + globalScene.applyModifiers( + TempStatStageBoosterModifier, + this.isPlayer(), + stat, + statStageMultiplier, + ); } return Math.min(statStageMultiplier.value, 4); } @@ -2647,18 +3818,47 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const userAccStage = new Utils.NumberHolder(this.getStatStage(Stat.ACC)); - const targetEvaStage = new Utils.NumberHolder(target.getStatStage(Stat.EVA)); + const targetEvaStage = new Utils.NumberHolder( + target.getStatStage(Stat.EVA), + ); const ignoreAccStatStage = new Utils.BooleanHolder(false); const ignoreEvaStatStage = new Utils.BooleanHolder(false); - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, target, null, false, Stat.ACC, ignoreAccStatStage); - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, this, null, false, Stat.EVA, ignoreEvaStatStage); - applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, target, sourceMove, ignoreEvaStatStage); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + target, + null, + false, + Stat.ACC, + ignoreAccStatStage, + ); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + this, + null, + false, + Stat.EVA, + ignoreEvaStatStage, + ); + applyMoveAttrs( + IgnoreOpponentStatStagesAttr, + this, + target, + sourceMove, + ignoreEvaStatStage, + ); - globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), Stat.ACC, userAccStage); + globalScene.applyModifiers( + TempStatStageBoosterModifier, + this.isPlayer(), + Stat.ACC, + userAccStage, + ); - userAccStage.value = ignoreAccStatStage.value ? 0 : Math.min(userAccStage.value, 6); + userAccStage.value = ignoreAccStatStage.value + ? 0 + : Math.min(userAccStage.value, 6); targetEvaStage.value = ignoreEvaStatStage.value ? 0 : targetEvaStage.value; if (target.findTag(t => t instanceof ExposedTag)) { @@ -2667,15 +3867,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const accuracyMultiplier = new Utils.NumberHolder(1); if (userAccStage.value !== targetEvaStage.value) { - accuracyMultiplier.value = userAccStage.value > targetEvaStage.value - ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3 - : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6)); + accuracyMultiplier.value = + userAccStage.value > targetEvaStage.value + ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3 + : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6)); } - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + this, + Stat.ACC, + accuracyMultiplier, + false, + sourceMove, + ); const evasionMultiplier = new Utils.NumberHolder(1); - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + target, + Stat.EVA, + evasionMultiplier, + ); return accuracyMultiplier.value / evasionMultiplier.value; } @@ -2692,11 +3905,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param simulated if `true`, suppresses changes to game state during calculation (defaults to `true`). * @returns The move's base damage against this Pokemon when used by the source Pokemon. */ - getBaseDamage(source: Pokemon, move: Move, moveCategory: MoveCategory, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getBaseDamage( + source: Pokemon, + move: Move, + moveCategory: MoveCategory, + ignoreAbility = false, + ignoreSourceAbility = false, + isCritical = false, + simulated = true, + ): number { const isPhysical = moveCategory === MoveCategory.PHYSICAL; /** A base damage multiplier based on the source's level */ - const levelMultiplier = (2 * source.level / 5 + 2); + const levelMultiplier = (2 * source.level) / 5 + 2; /** The power of the move after power boosts from abilities, etc. have applied */ const power = move.calculateBattlePower(source, this, simulated); @@ -2705,25 +3926,53 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The attacker's offensive stat for the given move's category. * Critical hits cause negative stat stages to be ignored. */ - const sourceAtk = new Utils.NumberHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, ignoreSourceAbility, ignoreAbility, isCritical, simulated)); + const sourceAtk = new Utils.NumberHolder( + source.getEffectiveStat( + isPhysical ? Stat.ATK : Stat.SPATK, + this, + undefined, + ignoreSourceAbility, + ignoreAbility, + isCritical, + simulated, + ), + ); applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); /** * This Pokemon's defensive stat for the given move's category. * Critical hits cause positive stat stages to be ignored. */ - const targetDef = new Utils.NumberHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, ignoreAbility, ignoreSourceAbility, isCritical, simulated)); + const targetDef = new Utils.NumberHolder( + this.getEffectiveStat( + isPhysical ? Stat.DEF : Stat.SPDEF, + source, + move, + ignoreAbility, + ignoreSourceAbility, + isCritical, + simulated, + ), + ); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); /** * The attack's base damage, as determined by the source's level, move power * and Attack stat as well as this Pokemon's Defense stat */ - const baseDamage = ((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2; + const baseDamage = + (levelMultiplier * power * sourceAtk.value) / targetDef.value / 50 + 2; /** Debug message for non-simulated calls (i.e. when damage is actually dealt) */ if (!simulated) { - console.log("base damage", baseDamage, move.name, power, sourceAtk.value, targetDef.value); + console.log( + "base damage", + baseDamage, + move.name, + power, + sourceAtk.value, + targetDef.value, + ); } return baseDamage; @@ -2742,12 +3991,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * - `result`: {@linkcode HitResult} indicates the attack's type effectiveness. * - `damage`: `number` the attack's final damage output. */ - getAttackDamage(source: Pokemon, move: Move, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): DamageCalculationResult { + getAttackDamage( + source: Pokemon, + move: Move, + ignoreAbility = false, + ignoreSourceAbility = false, + isCritical = false, + simulated = true, + ): DamageCalculationResult { const damage = new Utils.NumberHolder(0); - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; const variableCategory = new Utils.NumberHolder(move.category); - applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); + applyMoveAttrs( + VariableMoveCategoryAttr, + source, + this, + move, + variableCategory, + ); const moveCategory = variableCategory.value as MoveCategory; /** The move's type after type-changing effects are applied */ @@ -2763,21 +4027,36 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * * Note that the source's abilities are not ignored here */ - const typeMultiplier = this.getMoveEffectiveness(source, move, ignoreAbility, simulated, cancelled); + const typeMultiplier = this.getMoveEffectiveness( + source, + move, + ignoreAbility, + simulated, + cancelled, + ); const isPhysical = moveCategory === MoveCategory.PHYSICAL; /** Combined damage multiplier from field effects such as weather, terrain, etc. */ - const arenaAttackTypeMultiplier = new Utils.NumberHolder(globalScene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); - applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); + const arenaAttackTypeMultiplier = new Utils.NumberHolder( + globalScene.arena.getAttackTypeMultiplier(moveType, source.isGrounded()), + ); + applyMoveAttrs( + IgnoreWeatherTypeDebuffAttr, + source, + this, + move, + arenaAttackTypeMultiplier, + ); - const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; + const isTypeImmune = typeMultiplier * arenaAttackTypeMultiplier.value === 0; if (cancelled.value || isTypeImmune) { return { cancelled: cancelled.value, - result: move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT, - damage: 0 + result: + move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT, + damage: 0, }; } @@ -2786,13 +4065,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); if (fixedDamage.value) { const multiLensMultiplier = new Utils.NumberHolder(1); - globalScene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, move.id, null, multiLensMultiplier); - fixedDamage.value = Utils.toDmgValue(fixedDamage.value * multiLensMultiplier.value); + globalScene.applyModifiers( + PokemonMultiHitModifier, + source.isPlayer(), + source, + move.id, + null, + multiLensMultiplier, + ); + fixedDamage.value = Utils.toDmgValue( + fixedDamage.value * multiLensMultiplier.value, + ); return { cancelled: false, result: HitResult.EFFECTIVE, - damage: fixedDamage.value + damage: fixedDamage.value, }; } @@ -2803,7 +4091,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return { cancelled: false, result: HitResult.ONE_HIT_KO, - damage: this.hp + damage: this.hp, }; } @@ -2811,18 +4099,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The attack's base damage, as determined by the source's level, move power * and Attack stat as well as this Pokemon's Defense stat */ - const baseDamage = this.getBaseDamage(source, move, moveCategory, ignoreAbility, ignoreSourceAbility, isCritical, simulated); + const baseDamage = this.getBaseDamage( + source, + move, + moveCategory, + ignoreAbility, + ignoreSourceAbility, + isCritical, + simulated, + ); /** 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) */ const { targets, multiple } = getMoveTargets(source, move.id); const numTargets = multiple ? targets.length : 1; - const targetMultiplier = (numTargets > 1) ? 0.75 : 1; + const targetMultiplier = numTargets > 1 ? 0.75 : 1; /** Multiplier for moves enhanced by Multi-Lens and/or Parental Bond */ const multiStrikeEnhancementMultiplier = new Utils.NumberHolder(1); - globalScene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, move.id, null, multiStrikeEnhancementMultiplier); + globalScene.applyModifiers( + PokemonMultiHitModifier, + source.isPlayer(), + source, + move.id, + null, + multiStrikeEnhancementMultiplier, + ); if (!ignoreSourceAbility) { - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, simulated, null, multiStrikeEnhancementMultiplier); + applyPreAttackAbAttrs( + AddSecondStrikeAbAttr, + source, + this, + move, + simulated, + null, + multiStrikeEnhancementMultiplier, + ); } /** Doubles damage if this Pokemon's last move was Glaive Rush */ @@ -2839,7 +4150,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * A multiplier for random damage spread in the range [0.85, 1] * This is always 1 for simulated calls. */ - const randomMultiplier = simulated ? 1 : ((this.randSeedIntRange(85, 100)) / 100); + const randomMultiplier = simulated + ? 1 + : this.randSeedIntRange(85, 100) / 100; const sourceTypes = source.getTypes(); const sourceTeraType = source.getTeraType(); @@ -2854,13 +4167,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyAbAttrs(StabBoostAbAttr, source, null, simulated, stabMultiplier); } - applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); + applyMoveAttrs( + CombinedPledgeStabBoostAttr, + source, + this, + move, + stabMultiplier, + ); - if (source.isTerastallized && sourceTeraType === moveType && moveType !== PokemonType.STELLAR) { + if ( + source.isTerastallized && + sourceTeraType === moveType && + moveType !== PokemonType.STELLAR + ) { stabMultiplier.value += 0.5; } - if (source.isTerastallized && source.getTeraType() === PokemonType.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if ( + source.isTerastallized && + source.getTeraType() === PokemonType.STELLAR && + (!source.stellarTypesBoosted.includes(moveType) || + source.hasSpecies(Species.TERAPAGOS)) + ) { if (matchesSourceType) { stabMultiplier.value += 0.5; } else { @@ -2872,11 +4200,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** Halves damage if the attacker is using a physical attack while burned */ const burnMultiplier = new Utils.NumberHolder(1); - if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { + if ( + isPhysical && + source.status && + source.status.effect === StatusEffect.BURN + ) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); if (!ignoreSourceAbility) { - applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, simulated); + applyAbAttrs( + BypassBurnDamageReductionAbAttr, + source, + burnDamageReductionCancelled, + simulated, + ); } if (!burnDamageReductionCancelled.value) { burnMultiplier.value = 0.5; @@ -2889,7 +4226,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Critical hits should bypass screens if (!isCritical) { - globalScene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, source, moveCategory, screenMultiplier); + globalScene.arena.applyTagsForSide( + WeakenMoveScreenTag, + defendingSide, + simulated, + source, + moveCategory, + screenMultiplier, + ); } /** @@ -2899,36 +4243,49 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The move doubles damage when used against that tag */ const hitsTagMultiplier = new Utils.NumberHolder(1); - move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { - if (this.getTag(hta.tagType)) { - hitsTagMultiplier.value *= 2; - } - }); + move + .getAttrs(HitsTagAttr) + .filter(hta => hta.doubleDamage) + .forEach(hta => { + if (this.getTag(hta.tagType)) { + hitsTagMultiplier.value *= 2; + } + }); /** Halves damage if this Pokemon is grounded in Misty Terrain against a Dragon-type attack */ - const mistyTerrainMultiplier = (globalScene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === PokemonType.DRAGON) - ? 0.5 - : 1; + const mistyTerrainMultiplier = + globalScene.arena.terrain?.terrainType === TerrainType.MISTY && + this.isGrounded() && + moveType === PokemonType.DRAGON + ? 0.5 + : 1; damage.value = Utils.toDmgValue( - baseDamage - * targetMultiplier - * multiStrikeEnhancementMultiplier.value - * arenaAttackTypeMultiplier.value - * glaiveRushMultiplier.value - * criticalMultiplier.value - * randomMultiplier - * stabMultiplier.value - * typeMultiplier - * burnMultiplier.value - * screenMultiplier.value - * hitsTagMultiplier.value - * mistyTerrainMultiplier + baseDamage * + targetMultiplier * + multiStrikeEnhancementMultiplier.value * + arenaAttackTypeMultiplier.value * + glaiveRushMultiplier.value * + criticalMultiplier.value * + randomMultiplier * + stabMultiplier.value * + typeMultiplier * + burnMultiplier.value * + screenMultiplier.value * + hitsTagMultiplier.value * + mistyTerrainMultiplier, ); /** Doubles damage if the attacker has Tinted Lens and is using a resisted move */ if (!ignoreSourceAbility) { - applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, simulated, damage); + applyPreAttackAbAttrs( + DamageBoostAbAttr, + source, + this, + move, + simulated, + damage, + ); } /** Apply the enemy's Damage and Resistance tokens */ @@ -2939,14 +4296,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.applyModifiers(EnemyDamageReducerModifier, false, damage); } - /** Apply this Pokemon's post-calc defensive modifiers (e.g. Fur Coat) */ if (!ignoreAbility) { - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, simulated, damage); + applyPreDefendAbAttrs( + ReceivedMoveDamageMultiplierAbAttr, + this, + source, + move, + cancelled, + simulated, + damage, + ); /** Additionally apply friend guard damage reduction if ally has it. */ if (globalScene.currentBattle.double && this.getAlly()?.isActive(true)) { - applyPreDefendAbAttrs(AlliedFieldDamageReductionAbAttr, this.getAlly(), source, move, cancelled, simulated, damage); + applyPreDefendAbAttrs( + AlliedFieldDamageReductionAbAttr, + this.getAlly(), + source, + move, + cancelled, + simulated, + damage, + ); } } @@ -2954,7 +4326,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); if (this.isFullHp() && !ignoreAbility) { - applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage); + applyPreDefendAbAttrs( + PreDefendFullHpEndureAbAttr, + this, + source, + move, + cancelled, + false, + damage, + ); } // debug message for when damage is applied (i.e. not simulated) @@ -2974,7 +4354,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return { cancelled: cancelled.value, result: hitResult, - damage: damage.value + damage: damage.value, }; } @@ -2985,139 +4365,211 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns The {@linkcode HitResult} of the attack */ apply(source: Pokemon, move: Move): HitResult { - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; const moveCategory = new Utils.NumberHolder(move.category); applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, moveCategory); if (moveCategory.value === MoveCategory.STATUS) { const cancelled = new Utils.BooleanHolder(false); - const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); + const typeMultiplier = this.getMoveEffectiveness( + source, + move, + false, + false, + cancelled, + ); if (!cancelled.value && typeMultiplier === 0) { - globalScene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); + globalScene.queueMessage( + i18next.t("battle:hitResultNoEffect", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); } - return (typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; + return typeMultiplier === 0 ? HitResult.NO_EFFECT : HitResult.STATUS; + } + /** Determines whether the attack critically hits */ + let isCritical: boolean; + const critOnly = new Utils.BooleanHolder(false); + const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); + applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); + applyAbAttrs( + ConditionalCritAbAttr, + source, + null, + false, + critOnly, + this, + move, + ); + if (critOnly.value || critAlways) { + isCritical = true; } else { - /** Determines whether the attack critically hits */ - let isCritical: boolean; - const critOnly = new Utils.BooleanHolder(false); - const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); - applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); - applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move); - if (critOnly.value || critAlways) { - isCritical = true; - } else { - const critChance = [ 24, 8, 2, 1 ][Math.max(0, Math.min(this.getCritStage(source, move), 3))]; - isCritical = critChance === 1 || !globalScene.randBattleSeedInt(critChance); - } + const critChance = [24, 8, 2, 1][ + Math.max(0, Math.min(this.getCritStage(source, move), 3)) + ]; + isCritical = + critChance === 1 || !globalScene.randBattleSeedInt(critChance); + } - const noCritTag = globalScene.arena.getTagOnSide(NoCritTag, defendingSide); - const blockCrit = new Utils.BooleanHolder(false); - applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); - if (noCritTag || blockCrit.value || Overrides.NEVER_CRIT_OVERRIDE) { - isCritical = false; + const noCritTag = globalScene.arena.getTagOnSide(NoCritTag, defendingSide); + const blockCrit = new Utils.BooleanHolder(false); + applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); + if (noCritTag || blockCrit.value || Overrides.NEVER_CRIT_OVERRIDE) { + isCritical = false; + } + + /** + * Applies stat changes from {@linkcode move} and gives it to {@linkcode source} + * before damage calculation + */ + applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move); + + const { + cancelled, + result, + damage: dmg, + } = this.getAttackDamage(source, move, false, false, isCritical, false); + + const typeBoost = source.findTag( + t => + t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move), + ) as TypeBoostTag; + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); + } + + if ( + cancelled || + result === HitResult.IMMUNE || + result === HitResult.NO_EFFECT + ) { + source.stopMultiHit(this); + + if (!cancelled) { + if (result === HitResult.IMMUNE) { + globalScene.queueMessage( + i18next.t("battle:hitResultImmune", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); + } else { + globalScene.queueMessage( + i18next.t("battle:hitResultNoEffect", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); + } + } + return result; + } + + // In case of fatal damage, this tag would have gotten cleared before we could lapse it. + const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); + const grudgeTag = this.getTag(BattlerTagType.GRUDGE); + + const isOneHitKo = result === HitResult.ONE_HIT_KO; + + if (dmg) { + this.lapseTags(BattlerTagLapseType.HIT); + + const substitute = this.getTag(SubstituteTag); + const isBlockedBySubstitute = + !!substitute && move.hitsSubstitute(source, this); + if (isBlockedBySubstitute) { + substitute.hp -= dmg; + } + if (!this.isPlayer() && dmg >= this.hp) { + globalScene.applyModifiers(EnemyEndureChanceModifier, false, this); } /** - * Applies stat changes from {@linkcode move} and gives it to {@linkcode source} - * before damage calculation + * We explicitly require to ignore the faint phase here, as we want to show the messages + * about the critical hit and the super effective/not very effective messages before the faint phase. */ - applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move); + const damage = this.damageAndUpdate( + isBlockedBySubstitute ? 0 : dmg, + result as DamageResult, + isCritical, + isOneHitKo, + isOneHitKo, + true, + source, + ); - const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false); - - const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag; - if (typeBoost?.oneUse) { - source.removeTag(typeBoost.tagType); - } - - if (cancelled || result === HitResult.IMMUNE || result === HitResult.NO_EFFECT) { - source.stopMultiHit(this); - - if (!cancelled) { - if (result === HitResult.IMMUNE) { - globalScene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: getPokemonNameWithAffix(this) })); - } else { - globalScene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); + if (damage > 0) { + if (source.isPlayer()) { + globalScene.validateAchvs(DamageAchv, new Utils.NumberHolder(damage)); + if (damage > globalScene.gameData.gameStats.highestDamage) { + globalScene.gameData.gameStats.highestDamage = damage; } } - return result; - } + source.turnData.totalDamageDealt += damage; + source.turnData.singleHitDamageDealt = damage; + this.turnData.damageTaken += damage; + this.battleData.hitCount++; - // In case of fatal damage, this tag would have gotten cleared before we could lapse it. - const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - const grudgeTag = this.getTag(BattlerTagType.GRUDGE); - - const isOneHitKo = result === HitResult.ONE_HIT_KO; - - if (dmg) { - this.lapseTags(BattlerTagLapseType.HIT); - - const substitute = this.getTag(SubstituteTag); - const isBlockedBySubstitute = !!substitute && move.hitsSubstitute(source, this); - if (isBlockedBySubstitute) { - substitute.hp -= dmg; - } - if (!this.isPlayer() && dmg >= this.hp) { - globalScene.applyModifiers(EnemyEndureChanceModifier, false, this); - } - - /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true, source); - - if (damage > 0) { - if (source.isPlayer()) { - globalScene.validateAchvs(DamageAchv, new Utils.NumberHolder(damage)); - if (damage > globalScene.gameData.gameStats.highestDamage) { - globalScene.gameData.gameStats.highestDamage = damage; - } - } - source.turnData.totalDamageDealt += damage; - source.turnData.singleHitDamageDealt = damage; - this.turnData.damageTaken += damage; - this.battleData.hitCount++; - - const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; - this.turnData.attacksReceived.unshift(attackResult); - if (source.isPlayer() && !this.isPlayer()) { - globalScene.applyModifiers(DamageMoneyRewardModifier, true, source, new Utils.NumberHolder(damage)); - } + const attackResult = { + move: move.id, + result: result as DamageResult, + damage: damage, + critical: isCritical, + sourceId: source.id, + sourceBattlerIndex: source.getBattlerIndex(), + }; + this.turnData.attacksReceived.unshift(attackResult); + if (source.isPlayer() && !this.isPlayer()) { + globalScene.applyModifiers( + DamageMoneyRewardModifier, + true, + source, + new Utils.NumberHolder(damage), + ); } } - - if (isCritical) { - globalScene.queueMessage(i18next.t("battle:hitResultCriticalHit")); - } - - // want to include is.Fainted() in case multi hit move ends early, still want to render message - if (source.turnData.hitsLeft === 1 || this.isFainted()) { - switch (result) { - case HitResult.SUPER_EFFECTIVE: - globalScene.queueMessage(i18next.t("battle:hitResultSuperEffective")); - break; - case HitResult.NOT_VERY_EFFECTIVE: - globalScene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); - break; - case HitResult.ONE_HIT_KO: - globalScene.queueMessage(i18next.t("battle:hitResultOneHitKO")); - break; - } - } - - if (this.isFainted()) { - // set splice index here, so future scene queues happen before FaintedPhase - globalScene.setPhaseQueueSplice(); - globalScene.unshiftPhase(new FaintPhase(this.getBattlerIndex(), isOneHitKo, destinyTag, grudgeTag, source)); - - this.destroySubstitute(); - this.lapseTag(BattlerTagType.COMMANDED); - this.resetSummonData(); - } - - return result; } + + if (isCritical) { + globalScene.queueMessage(i18next.t("battle:hitResultCriticalHit")); + } + + // want to include is.Fainted() in case multi hit move ends early, still want to render message + if (source.turnData.hitsLeft === 1 || this.isFainted()) { + switch (result) { + case HitResult.SUPER_EFFECTIVE: + globalScene.queueMessage(i18next.t("battle:hitResultSuperEffective")); + break; + case HitResult.NOT_VERY_EFFECTIVE: + globalScene.queueMessage( + i18next.t("battle:hitResultNotVeryEffective"), + ); + break; + case HitResult.ONE_HIT_KO: + globalScene.queueMessage(i18next.t("battle:hitResultOneHitKO")); + break; + } + } + + if (this.isFainted()) { + // set splice index here, so future scene queues happen before FaintedPhase + globalScene.setPhaseQueueSplice(); + globalScene.unshiftPhase( + new FaintPhase( + this.getBattlerIndex(), + isOneHitKo, + destinyTag, + grudgeTag, + source, + ), + ); + + this.destroySubstitute(); + this.lapseTag(BattlerTagType.COMMANDED); + this.resetSummonData(); + } + + return result; } /** @@ -3128,7 +4580,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreFaintPhase flag on wheter to add FaintPhase if pokemon after applying damage faints * @returns integer representing damage */ - damage(damage: number, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): number { + damage( + damage: number, + _ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + ): number { if (this.isFainted()) { return 0; } @@ -3143,7 +4600,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { surviveDamage.value = this.lapseTag(BattlerTagType.ENDURE_TOKEN); } if (!surviveDamage.value) { - globalScene.applyModifiers(SurviveDamageModifier, this.isPlayer(), this, surviveDamage); + globalScene.applyModifiers( + SurviveDamageModifier, + this.isPlayer(), + this, + surviveDamage, + ); } if (surviveDamage.value) { damage = this.hp - 1; @@ -3161,7 +4623,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Once the MoveEffectPhase is over (and calls it's .end() function, shiftPhase() will reset the PhaseQueueSplice via clearPhaseQueueSplice() ) */ globalScene.setPhaseQueueSplice(); - globalScene.unshiftPhase(new FaintPhase(this.getBattlerIndex(), preventEndure)); + globalScene.unshiftPhase( + new FaintPhase(this.getBattlerIndex(), preventEndure), + ); this.destroySubstitute(); this.lapseTag(BattlerTagType.COMMANDED); this.resetSummonData(); @@ -3179,13 +4643,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreFaintPhase boolean to ignore adding a FaintPhase, passsed to damage() * @returns integer of damage done */ - damageAndUpdate(damage: number, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false, source?: Pokemon): number { - const damagePhase = new DamageAnimPhase(this.getBattlerIndex(), damage, result as DamageResult, critical); + damageAndUpdate( + damage: number, + result?: DamageResult, + critical = false, + ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + source?: Pokemon, + ): number { + const damagePhase = new DamageAnimPhase( + this.getBattlerIndex(), + damage, + result as DamageResult, + critical, + ); globalScene.unshiftPhase(damagePhase); if (this.switchOutStatus && source) { damage = 0; } - damage = this.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); + damage = this.damage( + damage, + ignoreSegments, + preventEndure, + ignoreFaintPhase, + ); // Damage amount may have changed, but needed to be queued before calling damage function damagePhase.updateAmount(damage); /** @@ -3193,7 +4675,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Multi-hits are handled in move-effect-phase.ts for PostDamageAbAttr */ if (!source || source.turnData.hitCount <= 1) { - applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); + applyPostDamageAbAttrs( + PostDamageAbAttr, + this, + damage, + this.hasPassive(), + false, + [], + source, + ); } return damage; } @@ -3226,15 +4716,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const stubTag = new BattlerTag(tagType, 0, 0); const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, stubTag, cancelled, true); + applyPreApplyBattlerTagAbAttrs( + BattlerTagImmunityAbAttr, + this, + stubTag, + cancelled, + true, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, stubTag, cancelled, true)); + userField.forEach(pokemon => + applyPreApplyBattlerTagAbAttrs( + UserFieldBattlerTagImmunityAbAttr, + pokemon, + stubTag, + cancelled, + true, + ), + ); return !cancelled.value; } - addTag(tagType: BattlerTagType, turnCount: number = 0, sourceMove?: Moves, sourceId?: number): boolean { + addTag( + tagType: BattlerTagType, + turnCount = 0, + sourceMove?: Moves, + sourceId?: number, + ): boolean { const existingTag = this.getTag(tagType); if (existingTag) { existingTag.onOverlap(this); @@ -3244,10 +4753,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const newTag = getBattlerTag(tagType, turnCount, sourceMove!, sourceId!); // TODO: are the bangs correct? const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, newTag, cancelled); + applyPreApplyBattlerTagAbAttrs( + BattlerTagImmunityAbAttr, + this, + newTag, + cancelled, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, newTag, cancelled)); + userField.forEach(pokemon => + applyPreApplyBattlerTagAbAttrs( + UserFieldBattlerTagImmunityAbAttr, + pokemon, + newTag, + cancelled, + ), + ); if (!cancelled.value && newTag.canAdd(this)) { this.summonData.tags.push(newTag); @@ -3269,20 +4790,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.summonData) { return null; } - return (tagType instanceof Function + return tagType instanceof Function ? this.summonData.tags.find(t => t instanceof tagType) - : this.summonData.tags.find(t => t.tagType === tagType) - ); + : this.summonData.tags.find(t => t.tagType === tagType); } - findTag(tagFilter: ((tag: BattlerTag) => boolean)) { + findTag(tagFilter: (tag: BattlerTag) => boolean) { if (!this.summonData) { return null; } return this.summonData.tags.find(t => tagFilter(t)); } - findTags(tagFilter: ((tag: BattlerTag) => boolean)): BattlerTag[] { + findTags(tagFilter: (tag: BattlerTag) => boolean): BattlerTag[] { if (!this.summonData) { return []; } @@ -3295,7 +4815,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const tags = this.summonData.tags; const tag = tags.find(t => t.tagType === tagType); - if (tag && !(tag.lapse(this, BattlerTagLapseType.CUSTOM))) { + if (tag && !tag.lapse(this, BattlerTagLapseType.CUSTOM)) { tag.onRemove(this); tags.splice(tags.indexOf(tag), 1); } @@ -3307,10 +4827,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return; } const tags = this.summonData.tags; - tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseTypes.some(lType => lType === lapseType)) && !(t.lapse(this, lapseType)))).forEach(t => { - t.onRemove(this); - tags.splice(tags.indexOf(t), 1); - }); + tags + .filter( + t => + lapseType === BattlerTagLapseType.FAINT || + (t.lapseTypes.some(lType => lType === lapseType) && + !t.lapse(this, lapseType)), + ) + .forEach(t => { + t.onRemove(this); + tags.splice(tags.indexOf(t), 1); + }); } removeTag(tagType: BattlerTagType): boolean { @@ -3326,7 +4853,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return !!tag; } - findAndRemoveTags(tagFilter: ((tag: BattlerTag) => boolean)): boolean { + findAndRemoveTags(tagFilter: (tag: BattlerTag) => boolean): boolean { if (!this.summonData) { return false; } @@ -3349,7 +4876,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return; } const tags = this.summonData.tags; - tags.filter(t => t.sourceId === sourceId).forEach(t => t.sourceId = newSourceId); + tags + .filter(t => t.sourceId === sourceId) + .forEach(t => (t.sourceId = newSourceId)); } /** @@ -3360,14 +4889,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Copy all stat stages for (const s of BATTLE_STATS) { const sourceStage = source.getStatStage(s); - if ((this instanceof PlayerPokemon) && (sourceStage === 6)) { + if (this instanceof PlayerPokemon && sourceStage === 6) { globalScene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE); } this.setStatStage(s, sourceStage); } for (const tag of source.summonData.tags) { - if (!tag.isBatonPassable || (tag.tagType === BattlerTagType.TELEKINESIS && this.species.speciesId === Species.GENGAR && this.getFormKey() === "mega")) { + if ( + !tag.isBatonPassable || + (tag.tagType === BattlerTagType.TELEKINESIS && + this.species.speciesId === Species.GENGAR && + this.getFormKey() === "mega") + ) { continue; } @@ -3404,10 +4938,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * * @see {@linkcode MoveRestrictionBattlerTag} */ - isMoveTargetRestricted(moveId: Moves, user: Pokemon, target: Pokemon): boolean { - for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) { - if ((tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) { - return (tag as MoveRestrictionBattlerTag !== null); + isMoveTargetRestricted( + moveId: Moves, + user: Pokemon, + target: Pokemon, + ): boolean { + for (const tag of this.findTags( + t => t instanceof MoveRestrictionBattlerTag, + )) { + if ( + (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted( + moveId, + user, + target, + ) + ) { + return (tag as MoveRestrictionBattlerTag) !== null; } } return false; @@ -3421,11 +4967,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {Pokemon} target {@linkcode Pokemon} the target of the move, optional and used when the target is a factor in the move's restricted status * @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted. */ - getRestrictingTag(moveId: Moves, user?: Pokemon, target?: Pokemon): MoveRestrictionBattlerTag | null { - for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) { + getRestrictingTag( + moveId: Moves, + user?: Pokemon, + target?: Pokemon, + ): MoveRestrictionBattlerTag | null { + for (const tag of this.findTags( + t => t instanceof MoveRestrictionBattlerTag, + )) { if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId, user)) { return tag as MoveRestrictionBattlerTag; - } else if (user && target && (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) { + } + if ( + user && + target && + (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted( + moveId, + user, + target, + ) + ) { return tag as MoveRestrictionBattlerTag; } } @@ -3452,13 +5013,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Default is `1`. * @returns A list of {@linkcode TurnMove}, as specified above. */ - getLastXMoves(moveCount: number = 1): TurnMove[] { + getLastXMoves(moveCount = 1): TurnMove[] { const moveHistory = this.getMoveHistory(); if (moveCount >= 0) { - return moveHistory.slice(Math.max(moveHistory.length - moveCount, 0)).reverse(); - } else { - return moveHistory.slice(0).reverse(); + return moveHistory + .slice(Math.max(moveHistory.length - moveCount, 0)) + .reverse(); } + return moveHistory.slice(0).reverse(); } getMoveQueue(): TurnMove[] { @@ -3471,17 +5033,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ stopMultiHit(target?: Pokemon): void { const effectPhase = globalScene.getCurrentPhase(); - if (effectPhase instanceof MoveEffectPhase && effectPhase.getUserPokemon() === this) { + if ( + effectPhase instanceof MoveEffectPhase && + effectPhase.getUserPokemon() === this + ) { effectPhase.stopMultiHit(target); } } changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) {// Shouldn't happen + if (this.abilityIndex >= abilityCount) { + // Shouldn't happen this.abilityIndex = abilityCount - 1; } globalScene.gameData.setPokemonSeen(this, false); @@ -3489,24 +5058,47 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.loadAssets().then(() => { this.calculateStats(); globalScene.updateModifiers(this.isPlayer(), true); - Promise.all([ this.updateInfo(), globalScene.updateFieldScale() ]).then(() => resolve()); + Promise.all([this.updateInfo(), globalScene.updateFieldScale()]).then( + () => resolve(), + ); }); }); } - cry(soundConfig?: Phaser.Types.Sound.SoundConfig, sceneOverride?: BattleScene): AnySound { + cry( + soundConfig?: Phaser.Types.Sound.SoundConfig, + sceneOverride?: BattleScene, + ): AnySound { const scene = sceneOverride ?? globalScene; // TODO: is `sceneOverride` needed? const cry = this.getSpeciesForm().cry(soundConfig); let duration = cry.totalDuration * 1000; - if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { + if ( + this.fusionSpecies && + this.getSpeciesForm() !== this.getFusionSpeciesForm() + ) { let fusionCry = this.getFusionSpeciesForm().cry(soundConfig, true); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); scene.time.delayedCall(Utils.fixedInt(Math.ceil(duration * 0.4)), () => { try { - SoundFade.fadeOut(scene, cry, Utils.fixedInt(Math.ceil(duration * 0.2))); - fusionCry = this.getFusionSpeciesForm().cry(Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, soundConfig)); - SoundFade.fadeIn(scene, fusionCry, Utils.fixedInt(Math.ceil(duration * 0.2)), scene.masterVolume * scene.fieldVolume, 0); + SoundFade.fadeOut( + scene, + cry, + Utils.fixedInt(Math.ceil(duration * 0.2)), + ); + fusionCry = this.getFusionSpeciesForm().cry( + Object.assign( + { seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, + soundConfig, + ), + ); + SoundFade.fadeIn( + scene, + fusionCry, + Utils.fixedInt(Math.ceil(duration * 0.2)), + scene.masterVolume * scene.fieldVolume, + 0, + ); } catch (err) { console.error(err); } @@ -3516,8 +5108,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return cry; } + // biome-ignore lint: there are a ton of issues.. faintCry(callback: Function): void { - if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { + if ( + this.fusionSpecies && + this.getSpeciesForm() !== this.getFusionSpeciesForm() + ) { return this.fusionFaintCry(callback); } @@ -3537,31 +5133,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sprite.anims.pause(); tintSprite?.anims.pause(); - let faintCryTimer : Phaser.Time.TimerEvent | null = globalScene.time.addEvent({ - delay: Utils.fixedInt(delay), - repeat: -1, - callback: () => { - frameThreshold = sprite.anims.msPerFrame / rate; - frameProgress += delay; - while (frameProgress > frameThreshold) { - if (sprite.anims.duration) { - sprite.anims.nextFrame(); - tintSprite?.anims.nextFrame(); + let faintCryTimer: Phaser.Time.TimerEvent | null = + globalScene.time.addEvent({ + delay: Utils.fixedInt(delay), + repeat: -1, + callback: () => { + frameThreshold = sprite.anims.msPerFrame / rate; + frameProgress += delay; + while (frameProgress > frameThreshold) { + if (sprite.anims.duration) { + sprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); + } + frameProgress -= frameThreshold; } - frameProgress -= frameThreshold; - } - if (cry && !cry.pendingRemove) { - rate *= 0.99; - cry.setRate(rate); - } else { - faintCryTimer?.destroy(); - faintCryTimer = null; - if (callback) { - callback(); + if (cry && !cry.pendingRemove) { + rate *= 0.99; + cry.setRate(rate); + } else { + faintCryTimer?.destroy(); + faintCryTimer = null; + if (callback) { + callback(); + } } - } - } - }); + }, + }); // Failsafe globalScene.time.delayedCall(Utils.fixedInt(3000), () => { @@ -3578,6 +5175,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + // biome-ignore lint/complexity/noBannedTypes: Consider refactoring to change type of Function private fusionFaintCry(callback: Function): void { const key = this.species.getCryKey(this.formIndex); let i = 0; @@ -3588,7 +5186,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let duration = cry.totalDuration * 1000; const fusionCryKey = this.fusionSpecies!.getCryKey(this.fusionFormIndex); - let fusionCry = globalScene.playSound(fusionCryKey, { rate: rate }) as AnySound; + let fusionCry = globalScene.playSound(fusionCryKey, { + rate: rate, + }) as AnySound; if (!cry || !fusionCry || globalScene.fieldVolume === 0) { return callback(); } @@ -3618,41 +5218,61 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sprite.anims.pause(); tintSprite?.anims.pause(); - let faintCryTimer: Phaser.Time.TimerEvent | null = globalScene.time.addEvent({ - delay: Utils.fixedInt(delay), - repeat: -1, - callback: () => { - ++i; - frameThreshold = sprite.anims.msPerFrame / rate; - frameProgress += delay; - while (frameProgress > frameThreshold) { - if (sprite.anims.duration) { - sprite.anims.nextFrame(); - tintSprite?.anims.nextFrame(); + let faintCryTimer: Phaser.Time.TimerEvent | null = + globalScene.time.addEvent({ + delay: Utils.fixedInt(delay), + repeat: -1, + callback: () => { + ++i; + frameThreshold = sprite.anims.msPerFrame / rate; + frameProgress += delay; + while (frameProgress > frameThreshold) { + if (sprite.anims.duration) { + sprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); + } + frameProgress -= frameThreshold; } - frameProgress -= frameThreshold; - } - if (i === transitionIndex && fusionCryKey) { - SoundFade.fadeOut(globalScene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = globalScene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); - SoundFade.fadeIn(globalScene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), globalScene.masterVolume * globalScene.fieldVolume, 0); - } - rate *= 0.99; - if (cry && !cry.pendingRemove) { - cry.setRate(rate); - } - if (fusionCry && !fusionCry.pendingRemove) { - fusionCry.setRate(rate); - } - if ((!cry || cry.pendingRemove) && (!fusionCry || fusionCry.pendingRemove)) { - faintCryTimer?.destroy(); - faintCryTimer = null; - if (callback) { - callback(); + if (i === transitionIndex && fusionCryKey) { + SoundFade.fadeOut( + globalScene, + cry, + Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), + ); + fusionCry = globalScene.playSound( + fusionCryKey, + Object.assign({ + seek: Math.max(fusionCry.totalDuration * 0.4, 0), + rate: rate, + }), + ); + SoundFade.fadeIn( + globalScene, + fusionCry, + Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), + globalScene.masterVolume * globalScene.fieldVolume, + 0, + ); } - } - } - }); + rate *= 0.99; + if (cry && !cry.pendingRemove) { + cry.setRate(rate); + } + if (fusionCry && !fusionCry.pendingRemove) { + fusionCry.setRate(rate); + } + if ( + (!cry || cry.pendingRemove) && + (!fusionCry || fusionCry.pendingRemove) + ) { + faintCryTimer?.destroy(); + faintCryTimer = null; + if (callback) { + callback(); + } + } + }, + }); // Failsafe globalScene.time.delayedCall(Utils.fixedInt(3000), () => { @@ -3673,7 +5293,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isOppositeGender(pokemon: Pokemon): boolean { - return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE); + return ( + this.gender !== Gender.GENDERLESS && + pokemon.gender === + (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE) + ); } /** @@ -3685,17 +5309,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param sourcePokemon The Pokemon that is setting the status effect * @param ignoreField Whether any field effects (weather, terrain, etc.) should be considered */ - canSetStatus(effect: StatusEffect | undefined, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon | null = null, ignoreField: boolean = false): boolean { + canSetStatus( + effect: StatusEffect | undefined, + quiet = false, + overrideStatus = false, + sourcePokemon: Pokemon | null = null, + ignoreField = false, + ): boolean { if (effect !== StatusEffect.FAINT) { if (overrideStatus ? this.status?.effect === effect : this.status) { return false; } - if (this.isGrounded() && (!ignoreField && globalScene.arena.terrain?.terrainType === TerrainType.MISTY)) { + if ( + this.isGrounded() && + !ignoreField && + globalScene.arena.terrain?.terrainType === TerrainType.MISTY + ) { return false; } } - if (sourcePokemon && sourcePokemon !== this && this.isSafeguarded(sourcePokemon)) { + if ( + sourcePokemon && + sourcePokemon !== this && + this.isSafeguarded(sourcePokemon) + ) { return false; } @@ -3704,9 +5342,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { switch (effect) { case StatusEffect.POISON: case StatusEffect.TOXIC: - // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity + // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity const poisonImmunity = types.map(defType => { - // Check if the Pokemon is not immune to Poison/Toxic + // Check if the Pokemon is not immune to Poison/Toxic if (defType !== PokemonType.POISON && defType !== PokemonType.STEEL) { return false; } @@ -3714,7 +5352,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity const cancelImmunity = new Utils.BooleanHolder(false); if (sourcePokemon) { - applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType); + applyAbAttrs( + IgnoreTypeStatusEffectImmunityAbAttr, + sourcePokemon, + cancelImmunity, + false, + effect, + defType, + ); if (cancelImmunity.value) { return false; } @@ -3735,12 +5380,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case StatusEffect.SLEEP: - if (this.isGrounded() && globalScene.arena.terrain?.terrainType === TerrainType.ELECTRIC) { + if ( + this.isGrounded() && + globalScene.arena.terrain?.terrainType === TerrainType.ELECTRIC + ) { return false; } break; case StatusEffect.FREEZE: - if (this.isOfType(PokemonType.ICE) || (!ignoreField && (globalScene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather.weatherType)))) { + if ( + this.isOfType(PokemonType.ICE) || + (!ignoreField && + globalScene?.arena?.weather?.weatherType && + [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes( + globalScene.arena.weather.weatherType, + )) + ) { return false; } break; @@ -3752,10 +5407,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const cancelled = new Utils.BooleanHolder(false); - applyPreSetStatusAbAttrs(StatusEffectImmunityAbAttr, this, effect, cancelled, quiet); + applyPreSetStatusAbAttrs( + StatusEffectImmunityAbAttr, + this, + effect, + cancelled, + quiet, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreSetStatusAbAttrs(UserFieldStatusEffectImmunityAbAttr, pokemon, effect, cancelled, quiet)); + userField.forEach(pokemon => + applyPreSetStatusAbAttrs( + UserFieldStatusEffectImmunityAbAttr, + pokemon, + effect, + cancelled, + quiet, + ), + ); if (cancelled.value) { return false; @@ -3764,7 +5433,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - trySetStatus(effect?: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon | null = null, turnsRemaining: number = 0, sourceText: string | null = null): boolean { + trySetStatus( + effect?: StatusEffect, + asPhase = false, + sourcePokemon: Pokemon | null = null, + turnsRemaining = 0, + sourceText: string | null = null, + ): boolean { if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; } @@ -3781,7 +5456,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (asPhase) { - globalScene.unshiftPhase(new ObtainStatusEffectPhase(this.getBattlerIndex(), effect, turnsRemaining, sourceText, sourcePokemon)); + globalScene.unshiftPhase( + new ObtainStatusEffectPhase( + this.getBattlerIndex(), + effect, + turnsRemaining, + sourceText, + sourcePokemon, + ), + ); return true; } @@ -3797,10 +5480,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { BattlerTagType.UNDERGROUND, BattlerTagType.UNDERWATER, BattlerTagType.HIDDEN, - BattlerTagType.FLYING + BattlerTagType.FLYING, ]; - const tag = invulnerableTags.find((t) => this.getTag(t)); + const tag = invulnerableTags.find(t => this.getTag(t)); if (tag) { this.removeTag(tag); @@ -3813,20 +5496,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.status = new Status(effect, 0, sleepTurnsRemaining?.value); if (effect !== StatusEffect.FAINT) { - globalScene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true); - applyPostSetStatusAbAttrs(PostSetStatusAbAttr, this, effect, sourcePokemon); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeStatusEffectTrigger, + true, + ); + applyPostSetStatusAbAttrs( + PostSetStatusAbAttr, + this, + effect, + sourcePokemon, + ); } return true; } /** - * Resets the status of a pokemon. - * @param revive Whether revive should be cured; defaults to true. - * @param confusion Whether resetStatus should include confusion or not; defaults to false. - * @param reloadAssets Whether to reload the assets or not; defaults to false. - */ - resetStatus(revive: boolean = true, confusion: boolean = false, reloadAssets: boolean = false): void { + * Resets the status of a pokemon. + * @param revive Whether revive should be cured; defaults to true. + * @param confusion Whether resetStatus should include confusion or not; defaults to false. + * @param reloadAssets Whether to reload the assets or not; defaults to false. + */ + resetStatus(revive = true, confusion = false, reloadAssets = false): void { const lastStatus = this.status?.effect; if (!revive && lastStatus === StatusEffect.FAINT) { return; @@ -3854,7 +5546,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns `true` if this Pokemon is protected by Safeguard; `false` otherwise. */ isSafeguarded(attacker: Pokemon): boolean { - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; if (globalScene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) { const bypassed = new Utils.BooleanHolder(false); if (attacker) { @@ -3888,14 +5582,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // If this Pokemon has a Substitute when loading in, play an animation to add its sprite if (this.getTag(SubstituteTag)) { - globalScene.triggerPokemonBattleAnim(this, PokemonAnimType.SUBSTITUTE_ADD); + globalScene.triggerPokemonBattleAnim( + this, + PokemonAnimType.SUBSTITUTE_ADD, + ); this.getTag(SubstituteTag)!.sourceInFocus = false; } // If this Pokemon has Commander and Dondozo as an active ally, hide this Pokemon's sprite. - if (this.hasAbilityWithAttr(CommanderAbAttr) - && globalScene.currentBattle.double - && this.getAlly()?.species.speciesId === Species.DONDOZO) { + if ( + this.hasAbilityWithAttr(CommanderAbAttr) && + globalScene.currentBattle.double && + this.getAlly()?.species.speciesId === Species.DONDOZO + ) { this.setVisible(false); } this.summonDataPrimer = null; @@ -3913,7 +5612,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.lapseTag(BattlerTagType.SEEDED); } if (globalScene) { - globalScene.triggerPokemonFormChange(this, SpeciesFormChangePostMoveTrigger, true); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangePostMoveTrigger, + true, + ); } } @@ -3923,7 +5626,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.stellarTypesBoosted = []; if (wasTerastallized) { this.updateSpritePipelineData(); - globalScene.triggerPokemonFormChange(this, SpeciesFormChangeLapseTeraTrigger); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeLapseTeraTrigger, + ); } } @@ -3933,7 +5639,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getExpValue(): number { // Logic to factor in victor level has been removed for balancing purposes, so the player doesn't have to focus on EXP maxxing - return ((this.getSpeciesForm().getBaseExp() * this.level) / 5 + 1); + return (this.getSpeciesForm().getBaseExp() * this.level) / 5 + 1; } setFrameRate(frameRate: number) { @@ -3941,12 +5647,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { try { this.getSprite().play(this.getBattleSpriteKey()); } catch (err: unknown) { - console.error(`Failed to play animation for ${this.getBattleSpriteKey()}`, err); + console.error( + `Failed to play animation for ${this.getBattleSpriteKey()}`, + err, + ); } try { this.getTintSprite()?.play(this.getBattleSpriteKey()); } catch (err: unknown) { - console.error(`Failed to play animation for ${this.getBattleSpriteKey()}`, err); + console.error( + `Failed to play animation for ${this.getBattleSpriteKey()}`, + err, + ); } } @@ -3962,7 +5674,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { tintSprite?.setAlpha(alpha); @@ -3981,7 +5693,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { onComplete: () => { tintSprite?.setVisible(false); tintSprite?.setAlpha(1); - } + }, }); } else { tintSprite?.setVisible(false); @@ -3993,9 +5705,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.maskEnabled) { this.maskSprite = this.getTintSprite(); this.maskSprite?.setVisible(true); - this.maskSprite?.setPosition(this.x * this.parentContainer.scale + this.parentContainer.x, - this.y * this.parentContainer.scale + this.parentContainer.y); - this.maskSprite?.setScale(this.getSpriteScale() * this.parentContainer.scale); + this.maskSprite?.setPosition( + this.x * this.parentContainer.scale + this.parentContainer.x, + this.y * this.parentContainer.scale + this.parentContainer.y, + ); + this.maskSprite?.setScale( + this.getSpriteScale() * this.parentContainer.scale, + ); this.maskEnabled = true; } } @@ -4018,28 +5734,68 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { updateFusionPalette(ignoreOveride?: boolean): void { if (!this.getFusionSpeciesForm(ignoreOveride)) { - [ 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" : ""}`] = []; - }); + [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" : ""}` + ] = []; + }); return; } const speciesForm = this.getSpeciesForm(ignoreOveride); const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOveride); - const spriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant); - const backSpriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant).replace("pkmn__", "pkmn__back__"); - const fusionSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant); - const fusionBackSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant).replace("pkmn__", "pkmn__back__"); + const spriteKey = speciesForm.getSpriteKey( + this.getGender(ignoreOveride) === Gender.FEMALE, + speciesForm.formIndex, + this.shiny, + this.variant, + ); + const backSpriteKey = speciesForm + .getSpriteKey( + this.getGender(ignoreOveride) === Gender.FEMALE, + speciesForm.formIndex, + this.shiny, + this.variant, + ) + .replace("pkmn__", "pkmn__back__"); + const fusionSpriteKey = fusionSpeciesForm.getSpriteKey( + this.getFusionGender(ignoreOveride) === Gender.FEMALE, + fusionSpeciesForm.formIndex, + this.fusionShiny, + this.fusionVariant, + ); + const fusionBackSpriteKey = fusionSpeciesForm + .getSpriteKey( + this.getFusionGender(ignoreOveride) === Gender.FEMALE, + fusionSpeciesForm.formIndex, + this.fusionShiny, + this.fusionVariant, + ) + .replace("pkmn__", "pkmn__back__"); const sourceTexture = globalScene.textures.get(spriteKey); const sourceBackTexture = globalScene.textures.get(backSpriteKey); const fusionTexture = globalScene.textures.get(fusionSpriteKey); const fusionBackTexture = globalScene.textures.get(fusionBackSpriteKey); - const [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(texture => texture.frames[texture.firstFrame]); - const [ sourceImage, sourceBackImage, fusionImage, fusionBackImage ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(i => i.getSourceImage() as HTMLImageElement); + const [sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame] = [ + sourceTexture, + sourceBackTexture, + fusionTexture, + fusionBackTexture, + ].map(texture => texture.frames[texture.firstFrame]); + const [sourceImage, sourceBackImage, fusionImage, fusionBackImage] = [ + sourceTexture, + sourceBackTexture, + fusionTexture, + fusionBackTexture, + ].map(i => i.getSourceImage() as HTMLImageElement); const canvas = document.createElement("canvas"); const backCanvas = document.createElement("canvas"); @@ -4049,43 +5805,70 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const spriteColors: number[][] = []; const pixelData: Uint8ClampedArray[] = []; - [ canvas, backCanvas, fusionCanvas, fusionBackCanvas ].forEach((canv: HTMLCanvasElement, c: number) => { - const context = canv.getContext("2d"); - const frame = [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ][c]; - canv.width = frame.width; - canv.height = frame.height; + [canvas, backCanvas, fusionCanvas, fusionBackCanvas].forEach( + (canv: HTMLCanvasElement, c: number) => { + const context = canv.getContext("2d"); + const frame = [ + sourceFrame, + sourceBackFrame, + fusionFrame, + fusionBackFrame, + ][c]; + canv.width = frame.width; + canv.height = frame.height; - if (context) { - context.drawImage([ sourceImage, sourceBackImage, fusionImage, fusionBackImage ][c], frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); - const imageData = context.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); - pixelData.push(imageData.data); - } - }); + if (context) { + context.drawImage( + [sourceImage, sourceBackImage, fusionImage, fusionBackImage][c], + frame.cutX, + frame.cutY, + frame.width, + frame.height, + 0, + 0, + frame.width, + frame.height, + ); + const imageData = context.getImageData( + frame.cutX, + frame.cutY, + frame.width, + frame.height, + ); + pixelData.push(imageData.data); + } + }, + ); for (let f = 0; f < 2; f++) { const variantColors = variantColorCache[!f ? spriteKey : backSpriteKey]; const variantColorSet = new Map(); if (this.shiny && variantColors && variantColors[this.variant]) { Object.keys(variantColors[this.variant]).forEach(k => { - variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.variant][k])))); + variantColorSet.set( + Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), + Array.from( + Object.values(Utils.rgbHexToRgba(variantColors[this.variant][k])), + ), + ); }); } for (let i = 0; i < pixelData[f].length; i += 4) { if (pixelData[f][i + 3]) { const pixel = pixelData[f].slice(i, i + 4); - let [ r, g, b, a ] = pixel; + let [r, g, b, a] = pixel; if (variantColors) { - const color = Utils.rgbaToInt([ r, g, b, a ]); + const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); if (mappedPixel) { - [ r, g, b, a ] = mappedPixel; + [r, g, b, a] = mappedPixel; } } } if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { - spriteColors.push([ r, g, b, a ]); + spriteColors.push([r, g, b, a]); } } } @@ -4096,35 +5879,63 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const pixelColors: number[] = []; for (let f = 0; f < 2; f++) { for (let i = 0; i < pixelData[f].length; i += 4) { - const total = pixelData[f].slice(i, i + 3).reduce((total: number, value: number) => total + value, 0); + const total = pixelData[f] + .slice(i, i + 3) + .reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } - pixelColors.push(argbFromRgba({ r: pixelData[f][i], g: pixelData[f][i + 1], b: pixelData[f][i + 2], a: pixelData[f][i + 3] })); + pixelColors.push( + argbFromRgba({ + r: pixelData[f][i], + g: pixelData[f][i + 1], + b: pixelData[f][i + 2], + a: pixelData[f][i + 3], + }), + ); } } - const fusionPixelColors : number[] = []; + const fusionPixelColors: number[] = []; for (let f = 0; f < 2; f++) { - const variantColors = variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; + const variantColors = + variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; const variantColorSet = new Map(); - if (this.fusionShiny && variantColors && variantColors[this.fusionVariant]) { - Object.keys(variantColors[this.fusionVariant]).forEach(k => { - variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.fusionVariant][k])))); - }); + if ( + this.fusionShiny && + variantColors && + variantColors[this.fusionVariant] + ) { + for (const k of Object.keys(variantColors[this.fusionVariant])) { + variantColorSet.set( + Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), + Array.from( + Object.values( + Utils.rgbHexToRgba(variantColors[this.fusionVariant][k]), + ), + ), + ); + } } for (let i = 0; i < pixelData[2 + f].length; i += 4) { - const total = pixelData[2 + f].slice(i, i + 3).reduce((total: number, value: number) => total + value, 0); + const total = pixelData[2 + f] + .slice(i, i + 3) + .reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } - let [ r, g, b, a ] = [ pixelData[2 + f][i], pixelData[2 + f][i + 1], pixelData[2 + f][i + 2], pixelData[2 + f][i + 3] ]; + let [r, g, b, a] = [ + pixelData[2 + f][i], + pixelData[2 + f][i + 1], + pixelData[2 + f][i + 2], + pixelData[2 + f][i + 3], + ]; if (variantColors) { - const color = Utils.rgbaToInt([ r, g, b, a ]); + const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); if (mappedPixel) { - [ r, g, b, a ] = mappedPixel; + [r, g, b, a] = mappedPixel; } } } @@ -4132,7 +5943,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (fusionPixelColors.length === 0) { // ERROR HANDLING IS NOT OPTIONAL BUDDY + if (fusionPixelColors.length === 0) { + // ERROR HANDLING IS NOT OPTIONAL BUDDY console.log("Failed to create fusion palette"); return; } @@ -4143,18 +5955,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - globalScene.executeWithSeedOffset(() => { - paletteColors = QuantizerCelebi.quantize(pixelColors, 4); - fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); - }, 0, "This result should not vary"); + globalScene.executeWithSeedOffset( + () => { + paletteColors = QuantizerCelebi.quantize(pixelColors, 4); + fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); + }, + 0, + "This result should not vary", + ); Math.random = originalRandom; paletteColors = paletteColors!; // erroneously tell TS compiler that paletteColors is defined! fusionPaletteColors = fusionPaletteColors!; // mischievously misinform TS compiler that fusionPaletteColors is defined! - const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] - .map(paletteColors => { - let keys = Array.from(paletteColors.keys()).sort((a: number, b: number) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); + const [palette, fusionPalette] = [paletteColors, fusionPaletteColors].map( + paletteColors => { + let keys = Array.from(paletteColors.keys()).sort( + (a: number, b: number) => + paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1, + ); let rgbaColors: Map; let hsvColors: Map; @@ -4164,13 +5983,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { mappedColors.clear(); rgbaColors = keys.reduce((map: Map, k: number) => { - map.set(k, Object.values(rgbaFromArgb(k))); return map; - }, new Map()); - hsvColors = Array.from(rgbaColors.keys()).reduce((map: Map, k: number) => { - const rgb = rgbaColors.get(k)!.slice(0, 3); - map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); + map.set(k, Object.values(rgbaFromArgb(k))); return map; }, new Map()); + hsvColors = Array.from(rgbaColors.keys()).reduce( + (map: Map, k: number) => { + const rgb = rgbaColors.get(k)!.slice(0, 3); + map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); + return map; + }, + new Map(), + ); for (let c = keys.length - 1; c >= 0; c--) { const hsv = hsvColors.get(keys[c])!; @@ -4181,7 +6004,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (mappedColors.has(keys[c])) { mappedColors.get(keys[c])!.push(keys[c2]); } else { - mappedColors.set(keys[c], [ keys[c2] ]); + mappedColors.set(keys[c], [keys[c2]]); } break; } @@ -4202,7 +6025,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } for (let c = 0; c < 3; c++) { - color[c] *= (paletteColors.get(key)! / count); + color[c] *= paletteColors.get(key)! / count; values.forEach((value: number, i: number) => { if (paletteColors.has(value)) { const valueCount = paletteColors.get(value)!; @@ -4220,15 +6043,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - paletteColors.set(argbFromRgba({ r: color[0], g: color[1], b: color[2], a: color[3] }), count); + paletteColors.set( + argbFromRgba({ + r: color[0], + g: color[1], + b: color[2], + a: color[3], + }), + count, + ); }); - keys = Array.from(paletteColors.keys()).sort((a: number, b: number) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); + keys = Array.from(paletteColors.keys()).sort( + (a: number, b: number) => + paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1, + ); } while (mappedColors.size); return keys.map(c => Object.values(rgbaFromArgb(c))); - } - ); + }, + ); const paletteDeltas: number[][] = []; @@ -4243,21 +6077,33 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { for (let sc = 0; sc < spriteColors.length; sc++) { const delta = Math.min(...paletteDeltas[sc]); - const paletteIndex = Math.min(paletteDeltas[sc].findIndex(pd => pd === delta), fusionPalette.length - 1); + const paletteIndex = Math.min( + paletteDeltas[sc].findIndex(pd => pd === delta), + fusionPalette.length - 1, + ); if (delta < 255) { const ratio = easeFunc(delta / 255); - const color = [ 0, 0, 0, fusionSpriteColors[sc][3] ]; + const color = [0, 0, 0, fusionSpriteColors[sc][3]]; for (let c = 0; c < 3; c++) { - color[c] = Math.round((fusionSpriteColors[sc][c] * ratio) + (fusionPalette[paletteIndex][c] * (1 - ratio))); + color[c] = Math.round( + fusionSpriteColors[sc][c] * ratio + + fusionPalette[paletteIndex][c] * (1 - ratio), + ); } fusionSpriteColors[sc] = color; } } - [ 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" : ""}`] = fusionSpriteColors; - }); + [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" : ""}` + ] = fusionSpriteColors; + }); canvas.remove(); fusionCanvas.remove(); @@ -4275,7 +6121,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randSeedInt(range: number, min: number = 0): number { + randSeedInt(range: number, min = 0): number { return globalScene.currentBattle ? globalScene.randBattleSeedInt(range, min) : Utils.randSeedInt(range, min); @@ -4288,7 +6134,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns a random integer between {@linkcode min} and {@linkcode max} inclusive */ randSeedIntRange(min: number, max: number): number { - return this.randSeedInt((max - min) + 1, min); + return this.randSeedInt(max - min + 1, min); } /** @@ -4298,10 +6144,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param hideInfo Indicates if this should also play the animation to hide the Pokemon's * info container. */ - leaveField(clearEffects: boolean = true, hideInfo: boolean = true, destroy: boolean = false) { + leaveField(clearEffects = true, hideInfo = true, destroy = false) { this.resetSprite(); this.resetTurnData(); - globalScene.getField(true).filter(p => p !== this).forEach(p => p.removeTagsBySourceId(this.id)); + globalScene + .getField(true) + .filter(p => p !== this) + .forEach(p => p.removeTagsBySourceId(this.id)); if (clearEffects) { this.destroySubstitute(); @@ -4313,7 +6162,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Trigger abilities that activate upon leaving the field applyPreLeaveFieldAbAttrs(PreLeaveFieldAbAttr, this); this.setSwitchOutStatus(true); - globalScene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeActiveTrigger, + true, + ); globalScene.field.remove(this, destroy); } @@ -4335,7 +6188,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { hasSameAbilityInRootForm(abilityIndex: number): boolean { const currentAbilityIndex = this.abilityIndex; const rootForm = getPokemonSpecies(this.species.getRootSpeciesId()); - return rootForm.getAbility(abilityIndex) === rootForm.getAbility(currentAbilityIndex); + return ( + rootForm.getAbility(abilityIndex) === + rootForm.getAbility(currentAbilityIndex) + ); } /** @@ -4364,7 +6220,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param forBattle If `false`, do not trigger in-battle effects (such as Unburden) from losing the item. For example, set this to `false` if the Pokemon is giving away the held item for a Mystery Encounter. Default is `true`. * @returns `true` if the item was removed successfully, `false` otherwise. */ - public loseHeldItem(heldItem: PokemonHeldItemModifier, forBattle: boolean = true): boolean { + public loseHeldItem( + heldItem: PokemonHeldItemModifier, + forBattle = true, + ): boolean { if (heldItem.pokemonId === -1 || heldItem.pokemonId === this.id) { heldItem.stackCount--; if (heldItem.stackCount <= 0) { @@ -4383,8 +6242,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { export class PlayerPokemon extends Pokemon { public compatibleTms: Moves[]; - constructor(species: PokemonSpecies, level: number, abilityIndex?: number, formIndex?: number, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: number[], nature?: Nature, dataSource?: Pokemon | PokemonData) { - super(106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + constructor( + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + ) { + super( + 106, + 148, + species, + level, + abilityIndex, + formIndex, + gender, + shiny, + variant, + ivs, + nature, + dataSource, + ); if (Overrides.STATUS_OVERRIDE) { this.status = new Status(Overrides.STATUS_OVERRIDE, 0, 4); @@ -4441,16 +6324,23 @@ export class PlayerPokemon extends Pokemon { const tms = Object.keys(tmSpecies); for (const tm of tms) { - const moveId = parseInt(tm) as Moves; + const moveId = Number.parseInt(tm) as Moves; let compatible = false; for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { - const [ pkm, form ] = p; - if ((pkm === this.species.speciesId || this.fusionSpecies && pkm === this.fusionSpecies.speciesId) && form === this.getFormKey()) { + const [pkm, form] = p; + if ( + (pkm === this.species.speciesId || + (this.fusionSpecies && pkm === this.fusionSpecies.speciesId)) && + form === this.getFormKey() + ) { compatible = true; break; } - } else if (p === this.species.speciesId || (this.fusionSpecies && p === this.fusionSpecies.speciesId)) { + } else if ( + p === this.species.speciesId || + (this.fusionSpecies && p === this.fusionSpecies.speciesId) + ) { compatible = true; break; } @@ -4465,7 +6355,13 @@ export class PlayerPokemon extends Pokemon { } tryPopulateMoveset(moveset: StarterMoveset): boolean { - if (!this.getSpeciesForm().validateStarterMoveset(moveset, globalScene.gameData.starterData[this.species.getRootSpeciesId()].eggMoves)) { + if ( + !this.getSpeciesForm().validateStarterMoveset( + moveset, + globalScene.gameData.starterData[this.species.getRootSpeciesId()] + .eggMoves, + ) + ) { return false; } @@ -4485,31 +6381,65 @@ export class PlayerPokemon extends Pokemon { return new Promise(resolve => { this.leaveField(switchType === SwitchType.SWITCH); - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: number, option: PartyOption) => { - if (slotIndex >= globalScene.currentBattle.getBattlerCount() && slotIndex < 6) { - globalScene.prependToPhase(new SwitchSummonPhase(switchType, this.getFieldIndex(), slotIndex, false), MoveEndPhase); - } - globalScene.ui.setMode(Mode.MESSAGE).then(resolve); - }, PartyUiHandler.FilterNonFainted); + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.FAINT_SWITCH, + this.getFieldIndex(), + (slotIndex: number, option: PartyOption) => { + if ( + slotIndex >= globalScene.currentBattle.getBattlerCount() && + slotIndex < 6 + ) { + globalScene.prependToPhase( + new SwitchSummonPhase( + switchType, + this.getFieldIndex(), + slotIndex, + false, + ), + MoveEndPhase, + ); + } + globalScene.ui.setMode(Mode.MESSAGE).then(resolve); + }, + PartyUiHandler.FilterNonFainted, + ); }); } addFriendship(friendship: number): void { if (friendship > 0) { const starterSpeciesId = this.species.getRootSpeciesId(); - const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0; + const fusionStarterSpeciesId = + this.isFusion() && this.fusionSpecies + ? this.fusionSpecies.getRootSpeciesId() + : 0; const starterData = [ globalScene.gameData.starterData[starterSpeciesId], - fusionStarterSpeciesId ? globalScene.gameData.starterData[fusionStarterSpeciesId] : null + fusionStarterSpeciesId + ? globalScene.gameData.starterData[fusionStarterSpeciesId] + : null, ].filter(d => !!d); const amount = new Utils.NumberHolder(friendship); - globalScene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); - const candyFriendshipMultiplier = globalScene.gameMode.isClassic ? globalScene.eventManager.getClassicFriendshipMultiplier() : 1; + globalScene.applyModifier( + PokemonFriendshipBoosterModifier, + true, + this, + amount, + ); + const candyFriendshipMultiplier = globalScene.gameMode.isClassic + ? globalScene.eventManager.getClassicFriendshipMultiplier() + : 1; const fusionReduction = fusionStarterSpeciesId - ? globalScene.eventManager.areFusionsBoosted() ? 1.5 // Divide candy gain for fusions by 1.5 during events - : 2 // 2 for fusions outside events - : 1; // 1 for non-fused mons - const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * candyFriendshipMultiplier / fusionReduction)); + ? globalScene.eventManager.areFusionsBoosted() + ? 1.5 // Divide candy gain for fusions by 1.5 during events + : 2 // 2 for fusions outside events + : 1; // 1 for non-fused mons + const starterAmount = new Utils.NumberHolder( + Math.floor( + (amount.value * candyFriendshipMultiplier) / fusionReduction, + ), + ); // Add friendship to this PlayerPokemon this.friendship = Math.min(this.friendship + amount.value, 255); @@ -4518,9 +6448,14 @@ export class PlayerPokemon extends Pokemon { } // Add to candy progress for this mon's starter species and its fused species (if it has one) starterData.forEach((sd: StarterDataEntry, i: number) => { - const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species; + const speciesId = !i + ? starterSpeciesId + : (fusionStarterSpeciesId as Species); sd.friendship = (sd.friendship || 0) + starterAmount.value; - if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) { + if ( + sd.friendship >= + getStarterValueFriendshipCap(speciesStarterCosts[speciesId]) + ) { globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1); sd.friendship = 0; } @@ -4531,7 +6466,9 @@ export class PlayerPokemon extends Pokemon { } } - getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { + getPossibleEvolution( + evolution: SpeciesFormEvolution | null, + ): Promise { if (!evolution) { return new Promise(resolve => resolve(this)); } @@ -4543,19 +6480,60 @@ export class PlayerPokemon extends Pokemon { const originalFusionSpecies = this.fusionSpecies; const originalFusionFormIndex = this.fusionFormIndex; this.fusionSpecies = evolutionSpecies; - this.fusionFormIndex = evolution.evoFormKey !== null ? Math.max(evolutionSpecies.forms.findIndex(f => f.formKey === evolution.evoFormKey), 0) : this.fusionFormIndex; - ret = globalScene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + this.fusionFormIndex = + evolution.evoFormKey !== null + ? Math.max( + evolutionSpecies.forms.findIndex( + f => f.formKey === evolution.evoFormKey, + ), + 0, + ) + : this.fusionFormIndex; + ret = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); this.fusionSpecies = originalFusionSpecies; this.fusionFormIndex = originalFusionFormIndex; } else { - const formIndex = evolution.evoFormKey !== null && !isFusion ? Math.max(evolutionSpecies.forms.findIndex(f => f.formKey === evolution.evoFormKey), 0) : this.formIndex; - ret = globalScene.addPlayerPokemon(!isFusion ? evolutionSpecies : this.species, this.level, this.abilityIndex, formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const formIndex = + evolution.evoFormKey !== null && !isFusion + ? Math.max( + evolutionSpecies.forms.findIndex( + f => f.formKey === evolution.evoFormKey, + ), + 0, + ) + : this.formIndex; + ret = globalScene.addPlayerPokemon( + !isFusion ? evolutionSpecies : this.species, + this.level, + this.abilityIndex, + formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); } ret.loadAssets().then(() => resolve(ret)); }); } - evolve(evolution: SpeciesFormEvolution | null, preEvolution: PokemonSpeciesForm): Promise { + evolve( + evolution: SpeciesFormEvolution | null, + preEvolution: PokemonSpeciesForm, + ): Promise { if (!evolution) { return new Promise(resolve => resolve()); } @@ -4570,7 +6548,13 @@ export class PlayerPokemon extends Pokemon { this.fusionSpecies = getPokemonSpecies(evolution.speciesId); } if (evolution.preFormKey !== null) { - const formIndex = Math.max((!isFusion || !this.fusionSpecies ? this.species : this.fusionSpecies).forms.findIndex(f => f.formKey === evolution.evoFormKey), 0); + const formIndex = Math.max( + (!isFusion || !this.fusionSpecies + ? this.species + : this.fusionSpecies + ).forms.findIndex(f => f.formKey === evolution.evoFormKey), + 0, + ); if (!isFusion) { this.formIndex = formIndex; } else { @@ -4581,25 +6565,39 @@ export class PlayerPokemon extends Pokemon { if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); const preEvoAbilityCount = preEvolution.getAbilityCount(); - if ([ 0, 1, 2 ].includes(this.abilityIndex)) { + if ([0, 1, 2].includes(this.abilityIndex)) { // Handles cases where a Pokemon with 3 abilities evolves into a Pokemon with 2 abilities (ie: Eevee -> any Eeveelution) - if (this.abilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + if ( + this.abilityIndex === 2 && + preEvoAbilityCount === 3 && + abilityCount === 2 + ) { this.abilityIndex = 1; } - } else { // Prevent pokemon with an illegal ability value from breaking things - console.warn("this.abilityIndex is somehow an illegal value, please report this"); + } else { + // Prevent pokemon with an illegal ability value from breaking things + console.warn( + "this.abilityIndex is somehow an illegal value, please report this", + ); console.warn(this.abilityIndex); this.abilityIndex = 0; } - } else { // Do the same as above, but for fusions + } else { + // Do the same as above, but for fusions const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); const preEvoAbilityCount = preEvolution.getAbilityCount(); - if ([ 0, 1, 2 ].includes(this.fusionAbilityIndex)) { - if (this.fusionAbilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + if ([0, 1, 2].includes(this.fusionAbilityIndex)) { + if ( + this.fusionAbilityIndex === 2 && + preEvoAbilityCount === 3 && + abilityCount === 2 + ) { this.fusionAbilityIndex = 1; } } else { - console.warn("this.fusionAbilityIndex is somehow an illegal value, please report this"); + console.warn( + "this.fusionAbilityIndex is somehow an illegal value, please report this", + ); console.warn(this.fusionAbilityIndex); this.fusionAbilityIndex = 0; } @@ -4613,15 +6611,22 @@ export class PlayerPokemon extends Pokemon { }); }; if (preEvolution.speciesId === Species.GIMMIGHOUL) { - const evotracker = this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? null; + const evotracker = + this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? + null; if (evotracker) { globalScene.removeModifier(evotracker); } } if (!globalScene.gameMode.isDaily || this.metBiome > -1) { - globalScene.gameData.updateSpeciesDexIvs(this.species.speciesId, this.ivs); + globalScene.gameData.updateSpeciesDexIvs( + this.species.speciesId, + this.ivs, + ); globalScene.gameData.setPokemonSeen(this, false); - globalScene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); + globalScene.gameData + .setPokemonCaught(this, false) + .then(() => updateAndResolve()); } else { updateAndResolve(); } @@ -4631,12 +6636,25 @@ export class PlayerPokemon extends Pokemon { private handleSpecialEvolutions(evolution: SpeciesFormEvolution) { const isFusion = evolution instanceof FusionSpeciesFormEvolution; - const evoSpecies = (!isFusion ? this.species : this.fusionSpecies); - if (evoSpecies?.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { + const evoSpecies = !isFusion ? this.species : this.fusionSpecies; + if ( + evoSpecies?.speciesId === Species.NINCADA && + evolution.speciesId === Species.NINJASK + ) { const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; if (newEvolution.condition?.predicate(this)) { - const newPokemon = globalScene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); + const newPokemon = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + undefined, + this.shiny, + this.variant, + this.ivs, + this.nature, + ); newPokemon.passive = this.passive; newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.copyMoveset(); @@ -4658,9 +6676,16 @@ export class PlayerPokemon extends Pokemon { newPokemon.evoCounter = this.evoCounter; globalScene.getPlayerParty().push(newPokemon); - newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); - const modifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === this.id, true) as PokemonHeldItemModifier[]; + newPokemon.evolve( + !isFusion + ? newEvolution + : new FusionSpeciesFormEvolution(this.id, newEvolution), + evoSpecies, + ); + const modifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, + true, + ) as PokemonHeldItemModifier[]; modifiers.forEach(m => { const clonedModifier = m.clone() as PokemonHeldItemModifier; clonedModifier.pokemonId = newPokemon.id; @@ -4673,18 +6698,36 @@ export class PlayerPokemon extends Pokemon { getPossibleForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - const formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); - const ret = globalScene.addPlayerPokemon(this.species, this.level, this.abilityIndex, formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); + const ret = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); ret.loadAssets().then(() => resolve(ret)); }); } changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) { // Shouldn't happen + if (this.abilityIndex >= abilityCount) { + // Shouldn't happen this.abilityIndex = abilityCount - 1; } @@ -4699,7 +6742,9 @@ export class PlayerPokemon extends Pokemon { }; if (!globalScene.gameMode.isDaily || this.metBiome > -1) { globalScene.gameData.setPokemonSeen(this, false); - globalScene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); + globalScene.gameData + .setPokemonCaught(this, false) + .then(() => updateAndResolve()); } else { updateAndResolve(); } @@ -4734,7 +6779,8 @@ export class PlayerPokemon extends Pokemon { // Store the average HP% that each Pokemon has const maxHp = this.getMaxHp(); - const newHpPercent = (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; + const newHpPercent = + (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; this.generateName(); this.calculateStats(); @@ -4758,15 +6804,32 @@ export class PlayerPokemon extends Pokemon { if (partyMemberIndex > fusedPartyMemberIndex) { partyMemberIndex--; } - const fusedPartyMemberHeldModifiers = globalScene.findModifiers((m) => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const fusedPartyMemberHeldModifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; for (const modifier of fusedPartyMemberHeldModifiers) { - globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false); + globalScene.tryTransferHeldItemModifier( + modifier, + this, + false, + modifier.getStackCount(), + true, + true, + false, + ); } globalScene.updateModifiers(true, true); globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); - pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); + pokemon + .getMoveset(true) + .map((m: PokemonMove) => + globalScene.unshiftPhase( + new LearnMovePhase(newPartyMemberIndex, m.getMove().id), + ), + ); pokemon.destroy(); this.updateFusionPalette(); } @@ -4782,11 +6845,19 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { - const newMoveset : PokemonMove[] = []; - this.moveset.forEach((move) => { + const newMoveset: PokemonMove[] = []; + this.moveset.forEach(move => { // TODO: refactor `moveset` to not accept `null`s if (move) { - newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual, move.maxPpOverride)); + newMoveset.push( + new PokemonMove( + move.moveId, + 0, + move.ppUp, + move.virtual, + move.maxPpOverride, + ), + ); } }); @@ -4803,10 +6874,28 @@ export class EnemyPokemon extends Pokemon { /** To indicate if the instance was populated with a dataSource -> e.g. loaded & populated from session data */ public readonly isPopulatedFromDataSource: boolean; - constructor(species: PokemonSpecies, level: number, trainerSlot: TrainerSlot, boss: boolean, shinyLock: boolean = false, dataSource?: PokemonData) { - super(236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, dataSource?.gender, - (!shinyLock && dataSource) ? dataSource.shiny : false, (!shinyLock && dataSource) ? dataSource.variant : undefined, - undefined, dataSource ? dataSource.nature : undefined, dataSource); + constructor( + species: PokemonSpecies, + level: number, + trainerSlot: TrainerSlot, + boss: boolean, + shinyLock = false, + dataSource?: PokemonData, + ) { + super( + 236, + 84, + species, + level, + dataSource?.abilityIndex, + dataSource?.formIndex, + dataSource?.gender, + !shinyLock && dataSource ? dataSource.shiny : false, + !shinyLock && dataSource ? dataSource.variant : undefined, + undefined, + dataSource ? dataSource.nature : undefined, + dataSource, + ); this.trainerSlot = trainerSlot; this.initialTeamIndex = globalScene.currentBattle?.enemyParty.length ?? 0; @@ -4826,9 +6915,9 @@ export class EnemyPokemon extends Pokemon { const speciesId = this.species.speciesId; if ( - speciesId in Overrides.OPP_FORM_OVERRIDES - && Overrides.OPP_FORM_OVERRIDES[speciesId] - && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] + speciesId in Overrides.OPP_FORM_OVERRIDES && + Overrides.OPP_FORM_OVERRIDES[speciesId] && + this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] ) { this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; } @@ -4854,12 +6943,18 @@ export class EnemyPokemon extends Pokemon { } } - this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); + this.luck = + (this.shiny ? this.variant + 1 : 0) + + (this.fusionShiny ? this.fusionVariant + 1 : 0); let prevolution: Species; let speciesId = species.speciesId; while ((prevolution = pokemonPrevolutions[speciesId])) { - const evolution = pokemonEvolutions[prevolution].find(pe => pe.speciesId === speciesId && (!pe.evoFormKey || pe.evoFormKey === this.getFormKey())); + const evolution = pokemonEvolutions[prevolution].find( + pe => + pe.speciesId === speciesId && + (!pe.evoFormKey || pe.evoFormKey === this.getFormKey()), + ); if (evolution?.condition?.enforceFunc) { evolution.condition.enforceFunc(this); } @@ -4867,7 +6962,8 @@ export class EnemyPokemon extends Pokemon { } } - this.aiType = boss || this.hasTrainer() ? AiType.SMART : AiType.SMART_RANDOM; + this.aiType = + boss || this.hasTrainer() ? AiType.SMART : AiType.SMART_RANDOM; } initBattleInfo(): void { @@ -4887,9 +6983,16 @@ export class EnemyPokemon extends Pokemon { * @param boss if the pokemon is a boss * @param bossSegments amount of boss segments (health-bar segments) */ - setBoss(boss: boolean = true, bossSegments: number = 0): void { + setBoss(boss = true, bossSegments = 0): void { if (boss) { - this.bossSegments = bossSegments || globalScene.getEncounterBossSegments(globalScene.currentBattle.waveIndex, this.level, this.species, true); + this.bossSegments = + bossSegments || + globalScene.getEncounterBossSegments( + globalScene.currentBattle.waveIndex, + this.level, + this.species, + true, + ); this.bossSegmentIndex = this.bossSegments - 1; } else { this.bossSegments = 0; @@ -4899,28 +7002,28 @@ export class EnemyPokemon extends Pokemon { generateAndPopulateMoveset(formIndex?: number): void { switch (true) { - case (this.species.speciesId === Species.SMEARGLE): + case this.species.speciesId === Species.SMEARGLE: this.moveset = [ new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH) + new PokemonMove(Moves.SKETCH), ]; break; - case (this.species.speciesId === Species.ETERNATUS): + case this.species.speciesId === Species.ETERNATUS: this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) ? [ - new PokemonMove(Moves.DYNAMAX_CANNON), - new PokemonMove(Moves.CROSS_POISON), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.RECOVER, 0, -4) - ] + new PokemonMove(Moves.DYNAMAX_CANNON), + new PokemonMove(Moves.CROSS_POISON), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.RECOVER, 0, -4), + ] : [ - new PokemonMove(Moves.ETERNABEAM), - new PokemonMove(Moves.SLUDGE_BOMB), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.COSMIC_POWER) - ]; + new PokemonMove(Moves.ETERNABEAM), + new PokemonMove(Moves.SLUDGE_BOMB), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.COSMIC_POWER), + ]; if (globalScene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) { this.moveset[2] = new PokemonMove(Moves.THUNDERBOLT); } @@ -4942,8 +7045,17 @@ export class EnemyPokemon extends Pokemon { if (moveQueue.length !== 0) { const queuedMove = moveQueue[0]; if (queuedMove) { - const moveIndex = this.getMoveset().findIndex(m => m?.moveId === queuedMove.move); - if ((moveIndex > -1 && this.getMoveset()[moveIndex]!.isUsable(this, queuedMove.ignorePP)) || queuedMove.virtual) { + const moveIndex = this.getMoveset().findIndex( + m => m?.moveId === queuedMove.move, + ); + if ( + (moveIndex > -1 && + this.getMoveset()[moveIndex]!.isUsable( + this, + queuedMove.ignorePP, + )) || + queuedMove.virtual + ) { return queuedMove; } else { this.getMoveQueue().shift(); @@ -4958,27 +7070,34 @@ export class EnemyPokemon extends Pokemon { if (movePool.length) { // If there's only 1 move in the move pool, use it. if (movePool.length === 1) { - return { move: movePool[0]!.moveId, targets: this.getNextTargets(movePool[0]!.moveId) }; // TODO: are the bangs correct? + return { + move: movePool[0]!.moveId, + targets: this.getNextTargets(movePool[0]!.moveId), + }; // TODO: are the bangs correct? } // If a move is forced because of Encore, use it. const encoreTag = this.getTag(EncoreTag) as EncoreTag; if (encoreTag) { const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId); if (encoreMove) { - return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) }; + return { + move: encoreMove.moveId, + targets: this.getNextTargets(encoreMove.moveId), + }; } } switch (this.aiType) { case AiType.RANDOM: // No enemy should spawn with this AI type in-game - const moveId = movePool[globalScene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? + const moveId = + movePool[globalScene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: - /** - * Search this Pokemon's move pool for moves that will KO an opposing target. - * If there are any moves that can KO an opponent (i.e. a player Pokemon), - * those moves are the only ones considered for selection on this turn. - */ + /** + * Search this Pokemon's move pool for moves that will KO an opposing target. + * If there are any moves that can KO an opponent (i.e. a player Pokemon), + * those moves are the only ones considered for selection on this turn. + */ const koMoves = movePool.filter(pkmnMove => { if (!pkmnMove) { return false; @@ -4990,17 +7109,36 @@ export class EnemyPokemon extends Pokemon { } const fieldPokemon = globalScene.getField(); - const moveTargets = getMoveTargets(this, move.id).targets - .map(ind => fieldPokemon[ind]) + const moveTargets = getMoveTargets(this, move.id) + .targets.map(ind => fieldPokemon[ind]) .filter(p => this.isPlayer() !== p.isPlayer()); // Only considers critical hits for crit-only moves or when this Pokemon is under the effect of Laser Focus - const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); + const isCritical = + move.hasAttr(CritOnlyAttr) || + !!this.getTag(BattlerTagType.ALWAYS_CRIT); - return move.category !== MoveCategory.STATUS - && moveTargets.some(p => { - const doesNotFail = move.applyConditions(this, p, move) || [ Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP ].includes(move.id); - return doesNotFail && p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp; - }); + return ( + move.category !== MoveCategory.STATUS && + moveTargets.some(p => { + const doesNotFail = + move.applyConditions(this, p, move) || + [ + Moves.SUCKER_PUNCH, + Moves.UPPER_HAND, + Moves.THUNDERCLAP, + ].includes(move.id); + return ( + doesNotFail && + p.getAttackDamage( + this, + move, + !p.battleData.abilityRevealed, + false, + isCritical, + ).damage >= p.hp + ); + }) + ); }, this); if (koMoves.length > 0) { @@ -5008,12 +7146,14 @@ export class EnemyPokemon extends Pokemon { } /** - * Move selection is based on the move's calculated "benefit score" against the - * best possible target(s) (as determined by {@linkcode getNextTargets}). - * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. - */ + * Move selection is based on the move's calculated "benefit score" against the + * best possible target(s) (as determined by {@linkcode getNextTargets}). + * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. + */ const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries(movePool.map(m => [ m!.moveId, this.getNextTargets(m!.moveId) ])); // TODO: are those bangs correct? + const moveTargets = Object.fromEntries( + movePool.map(m => [m!.moveId, this.getNextTargets(m!.moveId)]), + ); // TODO: are those bangs correct? for (const m in movePool) { const pokemonMove = movePool[m]!; // TODO: is the bang correct? const move = pokemonMove.getMove(); @@ -5022,33 +7162,48 @@ export class EnemyPokemon extends Pokemon { const targetScores: number[] = []; for (const mt of moveTargets[move.id]) { - // Prevent a target score from being calculated when the target is whoever attacks the user + // Prevent a target score from being calculated when the target is whoever attacks the user if (mt === BattlerIndex.ATTACKER) { break; } const target = globalScene.getField()[mt]; /** - * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. - * If the target is an ally, the target benefit score is multiplied by -1. - */ - let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); + * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. + * If the target is an ally, the target benefit score is multiplied by -1. + */ + let targetScore = + move.getUserBenefitScore(this, target, move) + + move.getTargetBenefitScore(this, target, move) * + (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); if (Number.isNaN(targetScore)) { console.error(`Move ${move.name} returned score of NaN`); targetScore = 0; } /** - * If this move is unimplemented, or the move is known to fail when used, set its - * target score to -20 - */ - if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![ Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP ].includes(move.id)) { + * If this move is unimplemented, or the move is known to fail when used, set its + * target score to -20 + */ + if ( + (move.name.endsWith(" (N)") || + !move.applyConditions(this, target, move)) && + ![ + Moves.SUCKER_PUNCH, + Moves.UPPER_HAND, + Moves.THUNDERCLAP, + ].includes(move.id) + ) { targetScore = -20; } else if (move instanceof AttackMove) { - /** - * Attack moves are given extra multipliers to their base benefit score based on - * the move's type effectiveness against the target and whether the move is a STAB move. - */ - const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); + /** + * Attack moves are given extra multipliers to their base benefit score based on + * the move's type effectiveness against the target and whether the move is a STAB move. + */ + const effectiveness = target.getMoveEffectiveness( + this, + move, + !target.battleData?.abilityRevealed, + ); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; if (this.isOfType(move.type)) { @@ -5085,23 +7240,47 @@ export class EnemyPokemon extends Pokemon { }); let r = 0; if (this.aiType === AiType.SMART_RANDOM) { - // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) - while (r < sortedMovePool.length - 1 && globalScene.randBattleSeedInt(8) >= 5) { + // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) + while ( + r < sortedMovePool.length - 1 && + globalScene.randBattleSeedInt(8) >= 5 + ) { r++; } } else if (this.aiType === AiType.SMART) { - // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. - while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 - && globalScene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { + // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. + while ( + r < sortedMovePool.length - 1 && + moveScores[movePool.indexOf(sortedMovePool[r + 1])] / + moveScores[movePool.indexOf(sortedMovePool[r])] >= + 0 && + globalScene.randBattleSeedInt(100) < + Math.round( + (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / + moveScores[movePool.indexOf(sortedMovePool[r])]) * + 50, + ) + ) { r++; } } - console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); // TODO: are those bangs correct? - return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; + console.log( + movePool.map(m => m!.getName()), + moveScores, + r, + sortedMovePool.map(m => m!.getName()), + ); // TODO: are those bangs correct? + return { + move: sortedMovePool[r]!.moveId, + targets: moveTargets[sortedMovePool[r]!.moveId], + }; } } - return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) }; + return { + move: Moves.STRUGGLE, + targets: this.getNextTargets(Moves.STRUGGLE), + }; } /** @@ -5111,7 +7290,9 @@ export class EnemyPokemon extends Pokemon { */ getNextTargets(moveId: Moves): BattlerIndex[] { const moveTargets = getMoveTargets(this, moveId); - const targets = globalScene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); + const targets = globalScene + .getField(true) + .filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); // If the move is multi-target, return all targets' indexes if (moveTargets.multiple) { return targets.map(p => p.getBattlerIndex()); @@ -5123,8 +7304,11 @@ export class EnemyPokemon extends Pokemon { * Get the move's target benefit score against each potential target. * For allies, this score is multiplied by -1. */ - const benefitScores = targets - .map(p => [ p.getBattlerIndex(), move.getTargetBenefitScore(this, p, move) * (p.isPlayer() === this.isPlayer() ? 1 : -1) ]); + const benefitScores = targets.map(p => [ + p.getBattlerIndex(), + move.getTargetBenefitScore(this, p, move) * + (p.isPlayer() === this.isPlayer() ? 1 : -1), + ]); const sortedBenefitScores = benefitScores.slice(0); sortedBenefitScores.sort((a, b) => { @@ -5137,7 +7321,7 @@ export class EnemyPokemon extends Pokemon { // Set target to BattlerIndex.ATTACKER when using a counter move // This is the same as when the player does so if (move.hasAttr(CounterDamageAttr)) { - return [ BattlerIndex.ATTACKER ]; + return [BattlerIndex.ATTACKER]; } return []; @@ -5154,13 +7338,15 @@ export class EnemyPokemon extends Pokemon { } // Remove any targets whose weights are less than half the max of the target weights from consideration - const benefitCutoffIndex = targetWeights.findIndex(s => s < targetWeights[0] / 2); + const benefitCutoffIndex = targetWeights.findIndex( + s => s < targetWeights[0] / 2, + ); if (benefitCutoffIndex > -1) { targetWeights = targetWeights.slice(0, benefitCutoffIndex); } const thresholds: number[] = []; - let totalWeight: number = 0; + let totalWeight = 0; targetWeights.reduce((total: number, w: number) => { total += w; thresholds.push(total); @@ -5174,7 +7360,7 @@ export class EnemyPokemon extends Pokemon { * is greater than that random number. */ const randValue = globalScene.randBattleSeedInt(totalWeight); - let targetIndex: number = 0; + let targetIndex = 0; thresholds.every((t, i) => { if (randValue >= t) { @@ -5185,7 +7371,7 @@ export class EnemyPokemon extends Pokemon { return false; }); - return [ sortedBenefitScores[targetIndex][0] ]; + return [sortedBenefitScores[targetIndex][0]]; } isPlayer() { @@ -5213,14 +7399,17 @@ export class EnemyPokemon extends Pokemon { return 0; } - damage(damage: number, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): number { + damage( + damage: number, + ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + ): number { if (this.isFainted()) { return 0; } - let clearedBossSegmentIndex = this.isBoss() - ? this.bossSegmentIndex + 1 - : 0; + let clearedBossSegmentIndex = this.isBoss() ? this.bossSegmentIndex + 1 : 0; if (this.isBoss() && !ignoreSegments) { const segmentSize = this.getMaxHp() / this.bossSegments; @@ -5231,12 +7420,19 @@ export class EnemyPokemon extends Pokemon { if (this.hp - damage <= roundedHpThreshold) { const hpRemainder = this.hp - roundedHpThreshold; let segmentsBypassed = 0; - while (segmentsBypassed < this.bossSegmentIndex && this.canBypassBossSegments(segmentsBypassed + 1) && (damage - hpRemainder) >= Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))) { + while ( + segmentsBypassed < this.bossSegmentIndex && + this.canBypassBossSegments(segmentsBypassed + 1) && + damage - hpRemainder >= + Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)) + ) { segmentsBypassed++; //console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))); } - damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed); + damage = Utils.toDmgValue( + this.hp - hpThreshold + segmentSize * segmentsBypassed, + ); clearedBossSegmentIndex = s - segmentsBypassed; } break; @@ -5251,7 +7447,12 @@ export class EnemyPokemon extends Pokemon { } } - const ret = super.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); + const ret = super.damage( + damage, + ignoreSegments, + preventEndure, + ignoreFaintPhase, + ); if (this.isBoss()) { if (ignoreSegments) { @@ -5267,9 +7468,9 @@ export class EnemyPokemon extends Pokemon { return ret; } - canBypassBossSegments(segmentCount: number = 1): boolean { + canBypassBossSegments(segmentCount = 1): boolean { if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - if (!this.formIndex && (this.bossSegmentIndex - segmentCount) < 1) { + if (!this.formIndex && this.bossSegmentIndex - segmentCount < 1) { return false; } } @@ -5285,10 +7486,17 @@ export class EnemyPokemon extends Pokemon { * @param segmentIndex index of the segment to get down to (0 = no shield left, 1 = 1 shield left, etc.) */ handleBossSegmentCleared(segmentIndex: number): void { - while (this.bossSegmentIndex > 0 && segmentIndex - 1 < this.bossSegmentIndex) { + while ( + this.bossSegmentIndex > 0 && + segmentIndex - 1 < this.bossSegmentIndex + ) { // Filter out already maxed out stat stages and weigh the rest based on existing stats - const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6); - const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false)); + const leftoverStats = EFFECTIVE_STATS.filter( + (s: EffectiveStat) => this.getStatStage(s) < 6, + ); + const statWeights = leftoverStats.map((s: EffectiveStat) => + this.getStat(s, false), + ); let boostedStat: EffectiveStat; const statThresholds: number[] = []; @@ -5319,7 +7527,16 @@ export class EnemyPokemon extends Pokemon { stages++; } - globalScene.unshiftPhase(new StatStageChangePhase(this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true)); + globalScene.unshiftPhase( + new StatStageChangePhase( + this.getBattlerIndex(), + true, + [boostedStat!], + stages, + true, + true, + ), + ); this.bossSegmentIndex--; } } @@ -5339,7 +7556,7 @@ export class EnemyPokemon extends Pokemon { * @param slotIndex an optional index to place the pokemon in the party * @returns the pokemon that was added or null if the pokemon could not be added */ - addToParty(pokeballType: PokeballType, slotIndex: number = -1) { + addToParty(pokeballType: PokeballType, slotIndex = -1) { const party = globalScene.getPlayerParty(); let ret: PlayerPokemon | null = null; @@ -5349,7 +7566,18 @@ export class EnemyPokemon extends Pokemon { this.metBiome = globalScene.arena.biomeType; this.metWave = globalScene.currentBattle.waveIndex; this.metSpecies = this.species.speciesId; - const newPokemon = globalScene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const newPokemon = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); if (Utils.isBetween(slotIndex, 0, PLAYER_PARTY_MAX_SIZE - 1)) { party.splice(slotIndex, 0, newPokemon); @@ -5361,7 +7589,11 @@ export class EnemyPokemon extends Pokemon { newPokemon.setVisible(false); ret = newPokemon; - globalScene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true); + globalScene.triggerPokemonFormChange( + newPokemon, + SpeciesFormChangeActiveTrigger, + true, + ); } return ret; @@ -5388,10 +7620,10 @@ export interface AttackMoveResult { export class PokemonSummonData { /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */ - public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ]; + public statStages: number[] = [0, 0, 0, 0, 0, 0, 0]; public moveQueue: TurnMove[] = []; public tags: BattlerTag[] = []; - public abilitySuppressed: boolean = false; + public abilitySuppressed = false; public abilitiesApplied: Abilities[] = []; public speciesForm: PokemonSpeciesForm | null; public fusionSpeciesForm: PokemonSpeciesForm; @@ -5399,7 +7631,7 @@ export class PokemonSummonData { public passiveAbility: Abilities = Abilities.NONE; public gender: Gender; public fusionGender: Gender; - public stats: number[] = [ 0, 0, 0, 0, 0, 0 ]; + public stats: number[] = [0, 0, 0, 0, 0, 0]; public moveset: (PokemonMove | null)[]; // If not initialized this value will not be populated from save data. public types: PokemonType[] = []; @@ -5408,57 +7640,57 @@ export class PokemonSummonData { export class PokemonBattleData { /** counts the hits the pokemon received */ - public hitCount: number = 0; + public hitCount = 0; /** used for {@linkcode Moves.RAGE_FIST} in order to save hit Counts received before Rage Fist is applied */ - public prevHitCount: number = 0; - public endured: boolean = false; + public prevHitCount = 0; + public endured = false; public berriesEaten: BerryType[] = []; public abilitiesApplied: Abilities[] = []; - public abilityRevealed: boolean = false; + public abilityRevealed = false; } export class PokemonBattleSummonData { /** The number of turns the pokemon has passed since entering the battle */ - public turnCount: number = 1; + public turnCount = 1; /** The number of turns the pokemon has passed since the start of the wave */ - public waveTurnCount: number = 1; + public waveTurnCount = 1; /** The list of moves the pokemon has used since entering the battle */ public moveHistory: TurnMove[] = []; } export class PokemonTurnData { - public flinched: boolean = false; - public acted: boolean = false; + public flinched = false; + public acted = false; /** How many times the move should hit the target(s) */ - public hitCount: number = 0; + public hitCount = 0; /** * - `-1` = Calculate how many hits are left * - `0` = Move is finished */ - public hitsLeft: number = -1; - public totalDamageDealt: number = 0; - public singleHitDamageDealt: number = 0; - public damageTaken: number = 0; + public hitsLeft = -1; + public totalDamageDealt = 0; + public singleHitDamageDealt = 0; + public damageTaken = 0; public attacksReceived: AttackMoveResult[] = []; public order: number; - public statStagesIncreased: boolean = false; - public statStagesDecreased: boolean = false; + public statStagesIncreased = false; + public statStagesDecreased = false; public moveEffectiveness: TypeDamageMultiplier | null = null; public combiningPledge?: Moves; - public switchedInThisTurn: boolean = false; - public failedRunAway: boolean = false; - public joinedRound: boolean = false; + public switchedInThisTurn = false; + public failedRunAway = false; + public joinedRound = false; /** * Used to make sure multi-hits occur properly when the user is * forced to act again in the same turn */ - public extraTurns: number = 0; + public extraTurns = 0; } export enum AiType { RANDOM, SMART_RANDOM, - SMART + SMART, } export enum MoveResult { @@ -5466,7 +7698,7 @@ export enum MoveResult { SUCCESS, FAIL, MISS, - OTHER + OTHER, } export enum HitResult { @@ -5480,10 +7712,15 @@ export enum HitResult { FAIL, MISS, OTHER, - IMMUNE + IMMUNE, } -export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER; +export type DamageResult = + | HitResult.EFFECTIVE + | HitResult.SUPER_EFFECTIVE + | HitResult.NOT_VERY_EFFECTIVE + | HitResult.ONE_HIT_KO + | HitResult.OTHER; /** Interface containing the results of a damage calculation for a given move */ export interface DamageCalculationResult { @@ -5520,7 +7757,13 @@ export class PokemonMove { */ public maxPpOverride?: number; - constructor(moveId: Moves, ppUsed: number = 0, ppUp: number = 0, virtual: boolean = false, maxPpOverride?: number) { + constructor( + moveId: Moves, + ppUsed = 0, + ppUp = 0, + virtual = false, + maxPpOverride?: number, + ) { this.moveId = moveId; this.ppUsed = ppUsed; this.ppUp = ppUp; @@ -5537,8 +7780,16 @@ export class PokemonMove { * @param {boolean} ignoreRestrictionTags If `true`, skips the check for move restriction tags (see {@link MoveRestrictionBattlerTag}) * @returns `true` if the move can be selected and used by the Pokemon, otherwise `false`. */ - isUsable(pokemon: Pokemon, ignorePp: boolean = false, ignoreRestrictionTags: boolean = false): boolean { - if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId, pokemon)) { + isUsable( + pokemon: Pokemon, + ignorePp = false, + ignoreRestrictionTags = false, + ): boolean { + if ( + this.moveId && + !ignoreRestrictionTags && + pokemon.isMoveRestricted(this.moveId, pokemon) + ) { return false; } @@ -5546,7 +7797,9 @@ export class PokemonMove { return false; } - return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1); + return ( + ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1 + ); } getMove(): Move { @@ -5557,16 +7810,19 @@ export class PokemonMove { * Sets {@link ppUsed} for this move and ensures the value does not exceed {@link getMovePp} * @param {number} count Amount of PP to use */ - usePp(count: number = 1) { + usePp(count = 1) { this.ppUsed = Math.min(this.ppUsed + count, this.getMovePp()); } getMovePp(): number { - return this.maxPpOverride || (this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5)); + return ( + this.maxPpOverride || + this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5) + ); } getPpRatio(): number { - return 1 - (this.ppUsed / this.getMovePp()); + return 1 - this.ppUsed / this.getMovePp(); } getName(): string { @@ -5574,11 +7830,17 @@ export class PokemonMove { } /** - * Copies an existing move or creates a valid PokemonMove object from json representing one - * @param {PokemonMove | any} source The data for the move to copy - * @return {PokemonMove} A valid pokemonmove object - */ + * Copies an existing move or creates a valid PokemonMove object from json representing one + * @param {PokemonMove | any} source The data for the move to copy + * @return {PokemonMove} A valid pokemonmove object + */ static loadMove(source: PokemonMove | any): PokemonMove { - return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual, source.maxPpOverride); + return new PokemonMove( + source.moveId, + source.ppUsed, + source.ppUp, + source.virtual, + source.maxPpOverride, + ); } } diff --git a/src/field/trainer.ts b/src/field/trainer.ts index ab247716e15..4325b54a783 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -2,9 +2,7 @@ import { globalScene } from "#app/global-scene"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import type { - TrainerConfig, - TrainerPartyTemplate } from "#app/data/trainer-config"; +import type { TrainerConfig, TrainerPartyTemplate } from "#app/data/trainer-config"; import { TrainerPartyCompoundTemplate, TrainerPoolTier, @@ -12,7 +10,7 @@ import { trainerConfigs, trainerPartyTemplates, signatureSpecies, - TeraAIMode + TeraAIMode, } from "#app/data/trainer-config"; import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; @@ -26,9 +24,9 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; export enum TrainerVariant { - DEFAULT, - FEMALE, - DOUBLE + DEFAULT, + FEMALE, + DOUBLE, } export default class Trainer extends Phaser.GameObjects.Container { @@ -39,7 +37,14 @@ export default class Trainer extends Phaser.GameObjects.Container { public partnerName: string; public originalIndexes: { [key: number]: number } = {}; - constructor(trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: number, name?: string, partnerName?: string, trainerConfigOverride?: TrainerConfig) { + constructor( + trainerType: TrainerType, + variant: TrainerVariant, + partyTemplateIndex?: number, + name?: string, + partnerName?: string, + trainerConfigOverride?: TrainerConfig, + ) { super(globalScene, -72, 80); this.config = trainerConfigs.hasOwnProperty(trainerType) ? trainerConfigs[trainerType] @@ -50,17 +55,23 @@ export default class Trainer extends Phaser.GameObjects.Container { } this.variant = variant; - this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), - this.config.partyTemplates.length - 1); + this.partyTemplateIndex = Math.min( + partyTemplateIndex !== undefined + ? partyTemplateIndex + : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), + this.config.partyTemplates.length - 1, + ); if (trainerNamePools.hasOwnProperty(trainerType)) { const namePool = trainerNamePools[trainerType]; - this.name = name || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); + this.name = + name || + Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); if (variant === TrainerVariant.DOUBLE) { if (this.config.doubleOnly) { if (partnerName) { this.partnerName = partnerName; } else { - [ this.name, this.partnerName ] = this.name.split(" & "); + [this.name, this.partnerName] = this.name.split(" & "); } } else { this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); @@ -81,12 +92,21 @@ export default class Trainer extends Phaser.GameObjects.Container { break; } - console.log(Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())]); + console.log( + Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())], + ); const getSprite = (hasShadow?: boolean, forceFemale?: boolean) => { - const ret = globalScene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale, this.isDouble())); + const ret = globalScene.addFieldSprite( + 0, + 0, + this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale, this.isDouble()), + ); ret.setOrigin(0.5, 1); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + }); return ret; }; @@ -124,13 +144,13 @@ export default class Trainer extends Phaser.GameObjects.Container { * @param {boolean} includeTitle - Whether to include the title in the returned name. Defaults to false. * @returns {string} - The formatted name of the trainer. **/ - getName(trainerSlot: TrainerSlot = TrainerSlot.NONE, includeTitle: boolean = false): string { + getName(trainerSlot: TrainerSlot = TrainerSlot.NONE, includeTitle = false): string { // Get the base title based on the trainer slot and variant. let name = this.config.getTitle(trainerSlot, this.variant); // Determine the title to include based on the configuration and includeTitle flag. let title = includeTitle && this.config.title ? this.config.title : null; - const evilTeamTitles = [ "grunt" ]; + 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, "_")}`); @@ -180,7 +200,6 @@ export default class Trainer extends Phaser.GameObjects.Container { return title ? `${title} ${name}` : name; } - isDouble(): boolean { return this.config.doubleOnly || this.variant === TrainerVariant.DOUBLE; } @@ -194,19 +213,34 @@ export default class Trainer extends Phaser.GameObjects.Container { } getEncounterBgm(): string { - return !this.variant ? this.config.encounterBgm : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterBgm : this.config.femaleEncounterBgm) || this.config.encounterBgm; + return !this.variant + ? this.config.encounterBgm + : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterBgm : this.config.femaleEncounterBgm) || + this.config.encounterBgm; } getEncounterMessages(): string[] { - return !this.variant ? this.config.encounterMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterMessages : this.config.femaleEncounterMessages) || this.config.encounterMessages; + return !this.variant + ? this.config.encounterMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleEncounterMessages + : this.config.femaleEncounterMessages) || this.config.encounterMessages; } getVictoryMessages(): string[] { - return !this.variant ? this.config.victoryMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleVictoryMessages : this.config.femaleVictoryMessages) || this.config.victoryMessages; + return !this.variant + ? this.config.victoryMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleVictoryMessages + : this.config.femaleVictoryMessages) || this.config.victoryMessages; } getDefeatMessages(): string[] { - return !this.variant ? this.config.defeatMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleDefeatMessages : this.config.femaleDefeatMessages) || this.config.defeatMessages; + return !this.variant + ? this.config.defeatMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleDefeatMessages + : this.config.femaleDefeatMessages) || this.config.defeatMessages; } getPartyTemplate(): TrainerPartyTemplate { @@ -270,119 +304,136 @@ export default class Trainer extends Phaser.GameObjects.Container { let ret: EnemyPokemon; - globalScene.executeWithSeedOffset(() => { - const template = this.getPartyTemplate(); - const strength: PartyMemberStrength = template.getStrength(index); + globalScene.executeWithSeedOffset( + () => { + const template = this.getPartyTemplate(); + const strength: PartyMemberStrength = template.getStrength(index); - - // If the battle is not one of the named trainer doubles - if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) { - - if (this.config.partyMemberFuncs.hasOwnProperty(index)) { - ret = this.config.partyMemberFuncs[index](level, strength); - return; - } - if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { - ret = this.config.partyMemberFuncs[index - template.size](level, template.getStrength(index)); - return; - } - } - let offset = 0; - - if (template instanceof TrainerPartyCompoundTemplate) { - for (const innerTemplate of template.templates) { - if (offset + innerTemplate.size > index) { - break; + // If the battle is not one of the named trainer doubles + if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) { + if (this.config.partyMemberFuncs.hasOwnProperty(index)) { + ret = this.config.partyMemberFuncs[index](level, strength); + return; + } + if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { + ret = this.config.partyMemberFuncs[index - template.size](level, template.getStrength(index)); + return; } - offset += innerTemplate.size; } - } + let offset = 0; - // Create an empty species pool (which will be set to one of the species pools based on the index) - let newSpeciesPool: Species[] = []; - let useNewSpeciesPool = false; - - // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) - if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) { - - // Use the new species pool for this party generation - useNewSpeciesPool = true; - - - // Get the species pool for the partner trainer and the current trainer - const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]]; - const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]]; - - - // Get the species that are already in the enemy party so we dont generate the same species twice - const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId); - - // Filter out the species that are already in the enemy party from the main trainer species pool - const speciesPoolFiltered = speciesPool.filter(species => { - // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is - if (Array.isArray(species)) { - return !species.some(s => AlreadyUsedSpecies.includes(s)); + if (template instanceof TrainerPartyCompoundTemplate) { + for (const innerTemplate of template.templates) { + if (offset + innerTemplate.size > index) { + break; + } + offset += innerTemplate.size; } - return !AlreadyUsedSpecies.includes(species); - }).flat(); + } - // Filter out the species that are already in the enemy party from the partner trainer species pool - const speciesPoolPartnerFiltered = speciesPoolPartner.filter(species => { - // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is - if (Array.isArray(species)) { - return !species.some(s => AlreadyUsedSpecies.includes(s)); - } - return !AlreadyUsedSpecies.includes(species); - }).flat(); + // Create an empty species pool (which will be set to one of the species pools based on the index) + let newSpeciesPool: Species[] = []; + let useNewSpeciesPool = false; + // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) + if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) { + // Use the new species pool for this party generation + useNewSpeciesPool = true; - // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) - if (!(index % 2)) { - // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza - if (index === 0 && (TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE])) { - newSpeciesPool = [ Species.SOLROCK ]; - } else if (index === 0 && (TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA])) { - newSpeciesPool = [ Species.LUNATONE ]; + // Get the species pool for the partner trainer and the current trainer + const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]]; + const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]]; + + // Get the species that are already in the enemy party so we dont generate the same species twice + const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId); + + // Filter out the species that are already in the enemy party from the main trainer species pool + const speciesPoolFiltered = speciesPool + .filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }) + .flat(); + + // Filter out the species that are already in the enemy party from the partner trainer species pool + const speciesPoolPartnerFiltered = speciesPoolPartner + .filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }) + .flat(); + + // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) + if (!(index % 2)) { + // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza + if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE]) { + newSpeciesPool = [Species.SOLROCK]; + } else if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA]) { + newSpeciesPool = [Species.LUNATONE]; + } else { + newSpeciesPool = speciesPoolFiltered; + } } else { - newSpeciesPool = speciesPoolFiltered; + // If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle) + // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza + if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE]) { + newSpeciesPool = [Species.SOLROCK]; + } else if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA]) { + newSpeciesPool = [Species.LUNATONE]; + } else { + newSpeciesPool = speciesPoolPartnerFiltered; + } } - } else { - // If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle) - // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza - if (index === 1 && (TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE])) { - newSpeciesPool = [ Species.SOLROCK ]; - } else if (index === 1 && (TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA])) { - newSpeciesPool = [ Species.LUNATONE ]; - } else { - newSpeciesPool = speciesPoolPartnerFiltered; + // Fallback for when the species pool is empty + if (newSpeciesPool.length === 0) { + // If all pokemon from this pool are already in the party, generate a random species + useNewSpeciesPool = false; } } - // Fallback for when the species pool is empty - if (newSpeciesPool.length === 0) { - // If all pokemon from this pool are already in the party, generate a random species - useNewSpeciesPool = false; + + // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species + let species = useNewSpeciesPool + ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))]) + : template.isSameSpecies(index) && index > offset + ? getPokemonSpecies( + battle.enemyParty[offset].species.getTrainerSpeciesForLevel( + level, + false, + template.getStrength(offset), + globalScene.currentBattle.waveIndex, + ), + ) + : this.genNewPartyMemberSpecies(level, strength); + + // If the species is from newSpeciesPool, we need to adjust it based on the level and strength + if (newSpeciesPool) { + species = getPokemonSpecies( + species.getSpeciesForLevel(level, true, true, strength, globalScene.currentBattle.waveIndex), + ); } - } - // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species - let species = useNewSpeciesPool - ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))]) - : template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), globalScene.currentBattle.waveIndex)) - : this.genNewPartyMemberSpecies(level, strength); - - // If the species is from newSpeciesPool, we need to adjust it based on the level and strength - if (newSpeciesPool) { - species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, globalScene.currentBattle.waveIndex)); - } - - ret = globalScene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - }, this.config.hasStaticParty ? this.config.getDerivedType() + ((index + 1) << 8) : globalScene.currentBattle.waveIndex + (this.config.getDerivedType() << 10) + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8)); + ret = globalScene.addEnemyPokemon( + species, + level, + !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); + }, + this.config.hasStaticParty + ? this.config.getDerivedType() + ((index + 1) << 8) + : globalScene.currentBattle.waveIndex + + (this.config.getDerivedType() << 10) + + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8), + ); return ret!; // TODO: is this bang correct? } - genNewPartyMemberSpecies(level: number, strength: PartyMemberStrength, attempt?: number): PokemonSpecies { const battle = globalScene.currentBattle; const template = this.getPartyTemplate(); @@ -390,10 +441,21 @@ export default class Trainer extends Phaser.GameObjects.Container { let baseSpecies: PokemonSpecies; if (this.config.speciesPools) { const tierValue = Utils.randSeedInt(512); - let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE; + let tier = + tierValue >= 156 + ? TrainerPoolTier.COMMON + : tierValue >= 32 + ? TrainerPoolTier.UNCOMMON + : tierValue >= 6 + ? TrainerPoolTier.RARE + : tierValue >= 1 + ? TrainerPoolTier.SUPER_RARE + : TrainerPoolTier.ULTRA_RARE; console.log(TrainerPoolTier[tier]); while (!this.config.speciesPools.hasOwnProperty(tier) || !this.config.speciesPools[tier].length) { - console.log(`Downgraded trainer Pokemon rarity tier from ${TrainerPoolTier[tier]} to ${TrainerPoolTier[tier - 1]}`); + console.log( + `Downgraded trainer Pokemon rarity tier from ${TrainerPoolTier[tier]} to ${TrainerPoolTier[tier - 1]}`, + ); tier--; } const tierPool = this.config.speciesPools[tier]; @@ -402,7 +464,9 @@ export default class Trainer extends Phaser.GameObjects.Container { baseSpecies = globalScene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); } - let ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex)); + let ret = getPokemonSpecies( + baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex), + ); let retry = false; console.log(ret.getName()); @@ -410,8 +474,11 @@ export default class Trainer extends Phaser.GameObjects.Container { if (pokemonPrevolutions.hasOwnProperty(baseSpecies.speciesId) && ret.speciesId !== baseSpecies.speciesId) { retry = true; } else if (template.isBalanced(battle.enemyParty.length)) { - const partyMemberTypes = battle.enemyParty.map(p => p.getTypes(true)).flat(); - if (partyMemberTypes.indexOf(ret.type1) > -1 || (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1)) { + const partyMemberTypes = battle.enemyParty.flatMap(p => p.getTypes(true)); + if ( + partyMemberTypes.indexOf(ret.type1) > -1 || + (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1) + ) { retry = true; } } @@ -423,7 +490,9 @@ export default class Trainer extends Phaser.GameObjects.Container { console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { - ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex)); + ret = getPokemonSpecies( + baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex), + ); console.log(ret.name); if (ret.isOfType(this.config.specialtyType)) { retry = false; @@ -466,13 +535,16 @@ export default class Trainer extends Phaser.GameObjects.Container { return currentSpecies.includes(baseSpecies) || staticSpecies.includes(baseSpecies); } - getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch: boolean = false): [number, number][] { + getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch = false): [number, number][] { if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; } const party = globalScene.getEnemyParty(); - const nonFaintedLegalPartyMembers = party.slice(globalScene.currentBattle.getBattlerCount()).filter(p => p.isAllowedInBattle()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); + const nonFaintedLegalPartyMembers = party + .slice(globalScene.currentBattle.getBattlerCount()) + .filter(p => p.isAllowedInBattle()) + .filter(p => !trainerSlot || p.trainerSlot === trainerSlot); const partyMemberScores = nonFaintedLegalPartyMembers.map(p => { const playerField = globalScene.getPlayerField().filter(p => p.isAllowedInBattle()); let score = 0; @@ -486,11 +558,13 @@ export default class Trainer extends Phaser.GameObjects.Container { } score /= playerField.length; if (forSwitch && !p.isOnField()) { - globalScene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); + globalScene.arena + .findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY) + .map(t => (score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p))); } } - return [ party.indexOf(p), score ]; + return [party.indexOf(p), score]; }) as [number, number][]; return partyMemberScores; @@ -507,18 +581,26 @@ export default class Trainer extends Phaser.GameObjects.Container { return sortedPartyMemberScores; } - getNextSummonIndex(trainerSlot: TrainerSlot = TrainerSlot.NONE, partyMemberScores: [number, number][] = this.getPartyMemberMatchupScores(trainerSlot)): number { + getNextSummonIndex( + trainerSlot: TrainerSlot = TrainerSlot.NONE, + partyMemberScores: [number, number][] = this.getPartyMemberMatchupScores(trainerSlot), + ): number { if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; } const sortedPartyMemberScores = this.getSortedPartyMemberMatchupScores(partyMemberScores); - const maxScorePartyMemberIndexes = partyMemberScores.filter(pms => pms[1] === sortedPartyMemberScores[0][1]).map(pms => pms[0]); + const maxScorePartyMemberIndexes = partyMemberScores + .filter(pms => pms[1] === sortedPartyMemberScores[0][1]) + .map(pms => pms[0]); if (maxScorePartyMemberIndexes.length > 1) { let rand: number; - globalScene.executeWithSeedOffset(() => rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length), globalScene.currentBattle.turn << 2); + globalScene.executeWithSeedOffset( + () => (rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length)), + globalScene.currentBattle.turn << 2, + ); return maxScorePartyMemberIndexes[rand!]; } @@ -574,7 +656,11 @@ export default class Trainer extends Phaser.GameObjects.Container { * @param animConfig {@linkcode Phaser.Types.Animations.PlayAnimationConfig} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + animConfig: Phaser.Types.Animations.PlayAnimationConfig, + ): boolean { // Show an error in the console if there isn't a texture loaded if (sprite.texture.key === "__MISSING") { console.error(`No texture found for '${animConfig.key}'!`); @@ -598,7 +684,7 @@ export default class Trainer extends Phaser.GameObjects.Container { const trainerAnimConfig = { key: this.getKey(), repeat: 0, - startFrame: 0 + startFrame: 0, }; const sprites = this.getSprites(); const tintSprites = this.getTintSprites(); @@ -610,7 +696,7 @@ export default class Trainer extends Phaser.GameObjects.Container { const partnerTrainerAnimConfig = { key: this.getKey(true), repeat: 0, - startFrame: 0 + startFrame: 0, }; this.tryPlaySprite(sprites[1], tintSprites[1], partnerTrainerAnimConfig); @@ -618,9 +704,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } getSprites(): Phaser.GameObjects.Sprite[] { - const ret: Phaser.GameObjects.Sprite[] = [ - this.getAt(0) - ]; + const ret: Phaser.GameObjects.Sprite[] = [this.getAt(0)]; if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(2)); } @@ -628,9 +712,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } getTintSprites(): Phaser.GameObjects.Sprite[] { - const ret: Phaser.GameObjects.Sprite[] = [ - this.getAt(1) - ]; + const ret: Phaser.GameObjects.Sprite[] = [this.getAt(1)]; if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(3)); } @@ -650,7 +732,7 @@ export default class Trainer extends Phaser.GameObjects.Container { targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { tintSprite.setAlpha(alpha); @@ -670,7 +752,7 @@ export default class Trainer extends Phaser.GameObjects.Container { onComplete: () => { tintSprite.setVisible(false); tintSprite.setAlpha(1); - } + }, }); } else { tintSprite.setVisible(false); diff --git a/src/game-mode.ts b/src/game-mode.ts index 1da125ea55a..9ab1674bcce 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -19,7 +19,7 @@ export enum GameModes { ENDLESS, SPLICED_ENDLESS, DAILY, - CHALLENGE + CHALLENGE, } interface GameModeConfig { @@ -37,8 +37,8 @@ interface GameModeConfig { } // Describes min and max waves for MEs in specific game modes -export const CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [ 10, 180 ]; -export const CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [ 10, 180 ]; +export const CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [10, 180]; +export const CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [10, 180]; export class GameMode implements GameModeConfig { public modeId: GameModes; @@ -127,7 +127,7 @@ export class GameMode implements GameModeConfig { } } - getWaveForDifficulty(waveIndex: number, ignoreCurveChanges: boolean = false): number { + getWaveForDifficulty(waveIndex: number, ignoreCurveChanges = false): number { switch (this.modeId) { case GameModes.DAILY: return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); @@ -149,9 +149,10 @@ export class GameMode implements GameModeConfig { if (this.isDaily) { return waveIndex % 10 === 5 || (!(waveIndex % 10) && waveIndex > 10 && !this.isWaveFinal(waveIndex)); } - if ((waveIndex % 30) === (globalScene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { + if (waveIndex % 30 === (globalScene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { return true; - } else if (waveIndex % 10 !== 1 && waveIndex % 10) { + } + if (waveIndex % 10 !== 1 && waveIndex % 10) { /** * Do not check X1 floors since there's a bug that stops trainer sprites from appearing * after a X0 full party heal @@ -165,10 +166,11 @@ export class GameMode implements GameModeConfig { if (w === waveIndex) { continue; } - if ((w % 30) === (globalScene.offsetGym ? 0 : 20) || this.isFixedBattle(w)) { + if (w % 30 === (globalScene.offsetGym ? 0 : 20) || this.isFixedBattle(w)) { allowTrainerBattle = false; break; - } else if (w < waveIndex) { + } + if (w < waveIndex) { globalScene.executeWithSeedOffset(() => { const waveTrainerChance = arena.getTrainerChance(); if (!Utils.randSeedInt(waveTrainerChance)) { @@ -191,14 +193,22 @@ export class GameMode implements GameModeConfig { case GameModes.DAILY: return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); default: - return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); + return ( + waveIndex % 30 === (offsetGym ? 0 : 20) && + (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)) + ); } } getOverrideSpecies(waveIndex: number): PokemonSpecies | null { if (this.isDaily && this.isWaveFinal(waveIndex)) { - const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical) - && s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS); + const allFinalBossSpecies = allSpecies.filter( + s => + (s.subLegendary || s.legendary || s.mythical) && + s.baseTotal >= 600 && + s.speciesId !== Species.ETERNATUS && + s.speciesId !== Species.ARCEUS, + ); return Utils.randSeedItem(allFinalBossSpecies); } @@ -225,9 +235,9 @@ export class GameMode implements GameModeConfig { } /** - * Every 10 waves is a boss battle - * @returns true if waveIndex is a multiple of 10 - */ + * Every 10 waves is a boss battle + * @returns true if waveIndex is a multiple of 10 + */ isBoss(waveIndex: number): boolean { return waveIndex % 10 === 0; } @@ -240,33 +250,30 @@ export class GameMode implements GameModeConfig { } /** - * Every 50 waves of an Endless mode is a boss - * At this time it is paradox pokemon - * @returns true if waveIndex is a multiple of 50 in Endless - */ + * Every 50 waves of an Endless mode is a boss + * At this time it is paradox pokemon + * @returns true if waveIndex is a multiple of 50 in Endless + */ isEndlessBoss(waveIndex: number): boolean { - return waveIndex % 50 === 0 && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + return waveIndex % 50 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } /** - * Every 250 waves of an Endless mode is a minor boss - * At this time it is Eternatus - * @returns true if waveIndex is a multiple of 250 in Endless - */ + * Every 250 waves of an Endless mode is a minor boss + * At this time it is Eternatus + * @returns true if waveIndex is a multiple of 250 in Endless + */ isEndlessMinorBoss(waveIndex: number): boolean { - return waveIndex % 250 === 0 && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + return waveIndex % 250 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } /** - * Every 1000 waves of an Endless mode is a major boss - * At this time it is Eternamax Eternatus - * @returns true if waveIndex is a multiple of 1000 in Endless - */ + * Every 1000 waves of an Endless mode is a major boss + * At this time it is Eternamax Eternatus + * @returns true if waveIndex is a multiple of 1000 in Endless + */ isEndlessMajorBoss(waveIndex: number): boolean { - return waveIndex % 1000 === 0 && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + return waveIndex % 1000 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } /** @@ -276,7 +283,10 @@ export class GameMode implements GameModeConfig { */ isFixedBattle(waveIndex: number): boolean { const dummyConfig = new FixedBattleConfig(); - return this.battleConfig.hasOwnProperty(waveIndex) || applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, dummyConfig); + return ( + this.battleConfig.hasOwnProperty(waveIndex) || + applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, dummyConfig) + ); } /** @@ -288,12 +298,10 @@ export class GameMode implements GameModeConfig { const challengeConfig = new FixedBattleConfig(); if (applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, challengeConfig)) { return challengeConfig; - } else { - return this.battleConfig[waveIndex]; } + return this.battleConfig[waveIndex]; } - getClearScoreBonus(): number { switch (this.modeId) { case GameModes.CLASSIC: @@ -338,12 +346,12 @@ export class GameMode implements GameModeConfig { */ getMysteryEncounterLegalWaves(): [number, number] { switch (this.modeId) { - default: - return [ 0, 0 ]; case GameModes.CLASSIC: return CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES; case GameModes.CHALLENGE: return CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES; + default: + return [0, 0]; } } @@ -366,14 +374,40 @@ export class GameMode implements GameModeConfig { export function getGameMode(gameMode: GameModes): GameMode { switch (gameMode) { case GameModes.CLASSIC: - return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, classicFixedBattles); + return new GameMode( + GameModes.CLASSIC, + { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, + classicFixedBattles, + ); case GameModes.ENDLESS: - return new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }); + return new GameMode(GameModes.ENDLESS, { + isEndless: true, + hasShortBiomes: true, + hasRandomBosses: true, + }); case GameModes.SPLICED_ENDLESS: - return new GameMode(GameModes.SPLICED_ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true, isSplicedOnly: true }); + return new GameMode(GameModes.SPLICED_ENDLESS, { + isEndless: true, + hasShortBiomes: true, + hasRandomBosses: true, + isSplicedOnly: true, + }); case GameModes.DAILY: - return new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }); + return new GameMode(GameModes.DAILY, { + isDaily: true, + hasTrainers: true, + hasNoShop: true, + }); case GameModes.CHALLENGE: - return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true, hasMysteryEncounters: true }, classicFixedBattles); + return new GameMode( + GameModes.CHALLENGE, + { + isClassic: true, + hasTrainers: true, + isChallenge: true, + hasMysteryEncounters: true, + }, + classicFixedBattles, + ); } } diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 392761cf8e4..fb4555084ee 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -10,11 +10,7 @@ import { Mode } from "./ui/ui"; import type SettingsGamepadUiHandler from "./ui/settings/settings-gamepad-ui-handler"; import type SettingsKeyboardUiHandler from "./ui/settings/settings-keyboard-ui-handler"; import cfg_keyboard_qwerty from "./configs/inputs/cfg_keyboard_qwerty"; -import { - assign, - getButtonWithKeycode, - getIconForLatestInput, swap, -} from "#app/configs/inputs/configHandler"; +import { assign, getButtonWithKeycode, getIconForLatestInput, swap } from "#app/configs/inputs/configHandler"; import { globalScene } from "#app/global-scene"; import type { SettingGamepad } from "#app/system/settings/settings-gamepad"; import type { SettingKeyboard } from "#app/system/settings/settings-keyboard"; @@ -24,29 +20,29 @@ import { Device } from "#enums/devices"; import MoveTouchControlsHandler from "./ui/settings/move-touch-controls-handler"; export interface DeviceMapping { - [key: string]: number; + [key: string]: number; } export interface IconsMapping { - [key: string]: string; + [key: string]: string; } export interface SettingMapping { - [key: string]: Button; + [key: string]: Button; } export interface MappingLayout { - [key: string]: SettingGamepad | SettingKeyboard | number; + [key: string]: SettingGamepad | SettingKeyboard | number; } export interface InterfaceConfig { - padID: string; - padType: string; - deviceMapping: DeviceMapping; - icons: IconsMapping; - settings: SettingMapping; - default: MappingLayout; - custom?: MappingLayout; + padID: string; + padType: string; + deviceMapping: DeviceMapping; + icons: IconsMapping; + settings: SettingMapping; + default: MappingLayout; + custom?: MappingLayout; } const repeatInputDelayMillis = 250; @@ -81,30 +77,29 @@ export class InputsController { private interactions: Map> = new Map(); private configs: Map = new Map(); - public gamepadSupport: boolean = true; + public gamepadSupport = true; public selectedDevice; - private disconnectedGamepads: Array = new Array(); + private disconnectedGamepads: Array = new Array(); - - public lastSource: string = "keyboard"; + public lastSource = "keyboard"; private inputInterval: NodeJS.Timeout[] = new Array(); private touchControls: TouchControl; public moveTouchControlsHandler: MoveTouchControlsHandler; /** - * Initializes a new instance of the game control system, setting up initial state and configurations. - * - * @remarks - * This constructor initializes the game control system with necessary setups for handling inputs. - * It prepares an interactions array indexed by button identifiers and configures default states for each button. - * Specific buttons like MENU and STATS are set not to repeat their actions. - * It concludes by calling the `init` method to complete the setup. - */ + * Initializes a new instance of the game control system, setting up initial state and configurations. + * + * @remarks + * This constructor initializes the game control system with necessary setups for handling inputs. + * It prepares an interactions array indexed by button identifiers and configures default states for each button. + * Specific buttons like MENU and STATS are set not to repeat their actions. + * It concludes by calling the `init` method to complete the setup. + */ constructor() { this.selectedDevice = { [Device.GAMEPAD]: null, - [Device.KEYBOARD]: "default" + [Device.KEYBOARD]: "default", }; for (const b of Utils.getEnumValues(Button)) { @@ -121,13 +116,13 @@ export class InputsController { } /** - * Sets up event handlers and initializes gamepad and keyboard controls. - * - * @remarks - * This method configures event listeners for both gamepad and keyboard inputs. - * It handles gamepad connections/disconnections and button press events, and ensures keyboard controls are set up. - * Additionally, it manages the game's behavior when it loses focus to prevent unwanted game actions during this state. - */ + * Sets up event handlers and initializes gamepad and keyboard controls. + * + * @remarks + * This method configures event listeners for both gamepad and keyboard inputs. + * It handles gamepad connections/disconnections and button press events, and ensures keyboard controls are set up. + * Additionally, it manages the game's behavior when it loses focus to prevent unwanted game actions during this state. + */ init(): void { this.events = globalScene.game.events; @@ -136,18 +131,26 @@ export class InputsController { }); if (typeof globalScene.input.gamepad !== "undefined") { - globalScene.input.gamepad?.on("connected", function (thisGamepad) { - if (!thisGamepad) { - return; - } - this.refreshGamepads(); - this.setupGamepad(thisGamepad); - this.onReconnect(thisGamepad); - }, this); + globalScene.input.gamepad?.on( + "connected", + function (thisGamepad) { + if (!thisGamepad) { + return; + } + this.refreshGamepads(); + this.setupGamepad(thisGamepad); + this.onReconnect(thisGamepad); + }, + this, + ); - globalScene.input.gamepad?.on("disconnected", function (thisGamepad) { - this.onDisconnect(thisGamepad); // when a gamepad is disconnected - }, this); + globalScene.input.gamepad?.on( + "disconnected", + function (thisGamepad) { + this.onDisconnect(thisGamepad); // when a gamepad is disconnected + }, + this, + ); // Check to see if the gamepad has already been setup by the browser globalScene.input.gamepad?.refreshPads(); @@ -168,24 +171,24 @@ export class InputsController { } /** - * Handles actions to take when the game loses focus, such as deactivating pressed keys. - * - * @remarks - * This method is triggered when the game or the browser tab loses focus. It ensures that any keys pressed are deactivated to prevent stuck keys affecting gameplay when the game is not active. - */ + * Handles actions to take when the game loses focus, such as deactivating pressed keys. + * + * @remarks + * This method is triggered when the game or the browser tab loses focus. It ensures that any keys pressed are deactivated to prevent stuck keys affecting gameplay when the game is not active. + */ loseFocus(): void { this.deactivatePressedKey(); this.touchControls.deactivatePressedKey(); } /** - * Enables or disables support for gamepad input. - * - * @param value - A boolean indicating whether gamepad support should be enabled (true) or disabled (false). - * - * @remarks - * This method toggles gamepad support. If disabled, it also ensures that all currently pressed gamepad buttons are deactivated to avoid stuck inputs. - */ + * Enables or disables support for gamepad input. + * + * @param value - A boolean indicating whether gamepad support should be enabled (true) or disabled (false). + * + * @remarks + * This method toggles gamepad support. If disabled, it also ensures that all currently pressed gamepad buttons are deactivated to avoid stuck inputs. + */ setGamepadSupport(value: boolean): void { if (value) { this.gamepadSupport = true; @@ -196,92 +199,92 @@ export class InputsController { } /** - * Sets the currently chosen gamepad and initializes related settings. - * This method first deactivates any active key presses and then initializes the gamepad settings. - * - * @param gamepad - The identifier of the gamepad to set as chosen. - */ - setChosenGamepad(gamepad: String): void { + * Sets the currently chosen gamepad and initializes related settings. + * This method first deactivates any active key presses and then initializes the gamepad settings. + * + * @param gamepad - The identifier of the gamepad to set as chosen. + */ + setChosenGamepad(gamepad: string): void { this.deactivatePressedKey(); this.initChosenGamepad(gamepad); } /** - * Sets the currently chosen keyboard layout and initializes related settings. - * - * @param layoutKeyboard - The identifier of the keyboard layout to set as chosen. - */ - setChosenKeyboardLayout(layoutKeyboard: String): void { + * Sets the currently chosen keyboard layout and initializes related settings. + * + * @param layoutKeyboard - The identifier of the keyboard layout to set as chosen. + */ + setChosenKeyboardLayout(layoutKeyboard: string): void { this.deactivatePressedKey(); this.initChosenLayoutKeyboard(layoutKeyboard); } /** - * Retrieves the identifiers of all connected gamepads, excluding any that are currently marked as disconnected. - * @returns Array An array of strings representing the IDs of the connected gamepads. - */ - getGamepadsName(): Array { + * Retrieves the identifiers of all connected gamepads, excluding any that are currently marked as disconnected. + * @returns Array An array of strings representing the IDs of the connected gamepads. + */ + getGamepadsName(): Array { return this.gamepads.filter(g => !this.disconnectedGamepads.includes(g.id)).map(g => g.id); } /** - * Initializes the chosen gamepad by setting its identifier in the local storage and updating the UI to reflect the chosen gamepad. - * If a gamepad name is provided, it uses that as the chosen gamepad; otherwise, it defaults to the currently chosen gamepad. - * @param gamepadName Optional parameter to specify the name of the gamepad to initialize as chosen. - */ - initChosenGamepad(gamepadName?: String): void { + * Initializes the chosen gamepad by setting its identifier in the local storage and updating the UI to reflect the chosen gamepad. + * If a gamepad name is provided, it uses that as the chosen gamepad; otherwise, it defaults to the currently chosen gamepad. + * @param gamepadName Optional parameter to specify the name of the gamepad to initialize as chosen. + */ + initChosenGamepad(gamepadName?: string): void { if (gamepadName) { this.selectedDevice[Device.GAMEPAD] = gamepadName.toLowerCase(); } const handler = globalScene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; - handler && handler.updateChosenGamepadDisplay(); + handler?.updateChosenGamepadDisplay(); } /** - * Initializes the chosen keyboard layout by setting its identifier in the local storage and updating the UI to reflect the chosen layout. - * If a layout name is provided, it uses that as the chosen layout; otherwise, it defaults to the currently chosen layout. - * @param layoutKeyboard Optional parameter to specify the name of the keyboard layout to initialize as chosen. - */ - initChosenLayoutKeyboard(layoutKeyboard?: String): void { + * Initializes the chosen keyboard layout by setting its identifier in the local storage and updating the UI to reflect the chosen layout. + * If a layout name is provided, it uses that as the chosen layout; otherwise, it defaults to the currently chosen layout. + * @param layoutKeyboard Optional parameter to specify the name of the keyboard layout to initialize as chosen. + */ + initChosenLayoutKeyboard(layoutKeyboard?: string): void { if (layoutKeyboard) { this.selectedDevice[Device.KEYBOARD] = layoutKeyboard.toLowerCase(); } const handler = globalScene.ui?.handlers[Mode.SETTINGS_KEYBOARD] as SettingsKeyboardUiHandler; - handler && handler.updateChosenKeyboardDisplay(); + handler?.updateChosenKeyboardDisplay(); } /** - * Handles the disconnection of a gamepad by adding its identifier to a list of disconnected gamepads. - * This is necessary because Phaser retains memory of previously connected gamepads, and without tracking - * disconnections, it would be impossible to determine the connection status of gamepads. This method ensures - * that disconnected gamepads are recognized and can be appropriately hidden in the gamepad selection menu. - * - * @param thisGamepad The gamepad that has been disconnected. - */ + * Handles the disconnection of a gamepad by adding its identifier to a list of disconnected gamepads. + * This is necessary because Phaser retains memory of previously connected gamepads, and without tracking + * disconnections, it would be impossible to determine the connection status of gamepads. This method ensures + * that disconnected gamepads are recognized and can be appropriately hidden in the gamepad selection menu. + * + * @param thisGamepad The gamepad that has been disconnected. + */ onDisconnect(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { this.disconnectedGamepads.push(thisGamepad.id); } /** - * Updates the tracking of disconnected gamepads when a gamepad is reconnected. - * It removes the reconnected gamepad's identifier from the `disconnectedGamepads` array, - * effectively updating its status to connected. - * - * @param thisGamepad The gamepad that has been reconnected. - */ + * Updates the tracking of disconnected gamepads when a gamepad is reconnected. + * It removes the reconnected gamepad's identifier from the `disconnectedGamepads` array, + * effectively updating its status to connected. + * + * @param thisGamepad The gamepad that has been reconnected. + */ onReconnect(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { this.disconnectedGamepads = this.disconnectedGamepads.filter(g => g !== thisGamepad.id); } /** - * Initializes or updates configurations for connected gamepads. - * It retrieves the names of all connected gamepads, sets up their configurations according to stored or default settings, - * and ensures these configurations are saved. If the connected gamepad is the currently chosen one, - * it reinitializes the chosen gamepad settings. - * - * @param thisGamepad The gamepad that is being set up. - */ - setupGamepad(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { + * Initializes or updates configurations for connected gamepads. + * It retrieves the names of all connected gamepads, sets up their configurations according to stored or default settings, + * and ensures these configurations are saved. If the connected gamepad is the currently chosen one, + * it reinitializes the chosen gamepad settings. + * + * @param thisGamepad The gamepad that is being set up. + */ + setupGamepad(_thisGamepad: Phaser.Input.Gamepad.Gamepad): void { const allGamepads = this.getGamepadsName(); for (const gamepad of allGamepads) { const gamepadID = gamepad.toLowerCase(); @@ -295,14 +298,14 @@ export class InputsController { } this.lastSource = "gamepad"; const handler = globalScene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; - handler && handler.updateChosenGamepadDisplay(); + handler?.updateChosenGamepadDisplay(); } /** - * Initializes or updates configurations for connected keyboards. - */ + * Initializes or updates configurations for connected keyboards. + */ setupKeyboard(): void { - for (const layout of [ "default" ]) { + for (const layout of ["default"]) { const config = deepCopy(this.getConfigKeyboard(layout)) as InterfaceConfig; config.custom = this.configs[layout]?.custom || { ...config.default }; this.configs[layout] = config; @@ -312,28 +315,26 @@ export class InputsController { } /** - * Refreshes and re-indexes the list of connected gamepads. - * - * @remarks - * This method updates the list of gamepads to exclude any that are undefined. - * It corrects the index of each gamepad to account for any previously undefined entries, - * ensuring that all gamepads are properly indexed and can be accurately referenced within the game. - */ + * Refreshes and re-indexes the list of connected gamepads. + * + * @remarks + * This method updates the list of gamepads to exclude any that are undefined. + * It corrects the index of each gamepad to account for any previously undefined entries, + * ensuring that all gamepads are properly indexed and can be accurately referenced within the game. + */ refreshGamepads(): void { // Sometimes, gamepads are undefined. For some reason. - this.gamepads = globalScene.input.gamepad?.gamepads.filter(function (el) { - return el !== null; - }) ?? []; + this.gamepads = globalScene.input.gamepad?.gamepads.filter(el => el !== null) ?? []; - for (const [ index, thisGamepad ] of this.gamepads.entries()) { + for (const [index, thisGamepad] of this.gamepads.entries()) { thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier } } /** - * Ensures the keyboard is initialized by checking if there is an active configuration for the keyboard. - * If not, it sets up the keyboard with default configurations. - */ + * Ensures the keyboard is initialized by checking if there is an active configuration for the keyboard. + * If not, it sets up the keyboard with default configurations. + */ ensureKeyboardIsInit(): void { if (!this.getActiveConfig(Device.KEYBOARD)?.padID) { this.setupKeyboard(); @@ -341,10 +342,10 @@ export class InputsController { } /** - * Handles the keydown event for the keyboard. - * - * @param event The keyboard event. - */ + * Handles the keydown event for the keyboard. + * + * @param event The keyboard event. + */ keyboardKeyDown(event): void { this.lastSource = "keyboard"; this.ensureKeyboardIsInit(); @@ -369,10 +370,10 @@ export class InputsController { } /** - * Handles the keyup event for the keyboard. - * - * @param event The keyboard event. - */ + * Handles the keyup event for the keyboard. + * + * @param event The keyboard event. + */ keyboardKeyUp(event): void { this.lastSource = "keyboard"; const buttonUp = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), event.keyCode); @@ -388,15 +389,15 @@ export class InputsController { } /** - * Handles button press events on a gamepad. This method sets the gamepad as chosen on the first input if no gamepad is currently chosen. - * It checks if gamepad support is enabled and if the event comes from the chosen gamepad. If so, it maps the button press to a specific - * action using a custom configuration, emits an event for the button press, and records the time of the action. - * - * @param pad The gamepad on which the button was pressed. - * @param button The specific button that was pressed. - * @param value The intensity or value of the button press, if applicable. - */ - gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + * Handles button press events on a gamepad. This method sets the gamepad as chosen on the first input if no gamepad is currently chosen. + * It checks if gamepad support is enabled and if the event comes from the chosen gamepad. If so, it maps the button press to a specific + * action using a custom configuration, emits an event for the button press, and records the time of the action. + * + * @param pad The gamepad on which the button was pressed. + * @param button The specific button that was pressed. + * @param value The intensity or value of the button press, if applicable. + */ + gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { if (!this.configs[this.selectedDevice[Device.KEYBOARD]]?.padID) { this.setupKeyboard(); } @@ -404,7 +405,11 @@ export class InputsController { return; } this.lastSource = "gamepad"; - if (!this.selectedDevice[Device.GAMEPAD] || (globalScene.ui.getMode() !== Mode.GAMEPAD_BINDING && this.selectedDevice[Device.GAMEPAD] !== pad.id.toLowerCase())) { + if ( + !this.selectedDevice[Device.GAMEPAD] || + (globalScene.ui.getMode() !== Mode.GAMEPAD_BINDING && + this.selectedDevice[Device.GAMEPAD] !== pad.id.toLowerCase()) + ) { this.setChosenGamepad(pad.id); } if (!this.gamepadSupport || pad.id.toLowerCase() !== this.selectedDevice[Device.GAMEPAD].toLowerCase()) { @@ -436,15 +441,15 @@ export class InputsController { } /** - * Responds to a button release event on a gamepad by checking if the gamepad is supported and currently chosen. - * If conditions are met, it identifies the configured action for the button, emits an event signaling the button release, - * and clears the record of the button. - * - * @param pad The gamepad from which the button was released. - * @param button The specific button that was released. - * @param value The intensity or value of the button release, if applicable. - */ - gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + * Responds to a button release event on a gamepad by checking if the gamepad is supported and currently chosen. + * If conditions are met, it identifies the configured action for the button, emits an event signaling the button release, + * and clears the record of the button. + * + * @param pad The gamepad from which the button was released. + * @param button The specific button that was released. + * @param value The intensity or value of the button release, if applicable. + */ + gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { if (!pad) { return; } @@ -465,23 +470,26 @@ export class InputsController { } /** - * Retrieves the configuration object for a gamepad based on its identifier. The method identifies specific gamepad models - * based on substrings in the identifier and returns predefined configurations for recognized models. - * If no specific configuration matches, it defaults to a generic gamepad configuration. - * - * @param id The identifier string of the gamepad. - * @returns InterfaceConfig The configuration object corresponding to the identified gamepad type. - */ + * Retrieves the configuration object for a gamepad based on its identifier. The method identifies specific gamepad models + * based on substrings in the identifier and returns predefined configurations for recognized models. + * If no specific configuration matches, it defaults to a generic gamepad configuration. + * + * @param id The identifier string of the gamepad. + * @returns InterfaceConfig The configuration object corresponding to the identified gamepad type. + */ getConfig(id: string): InterfaceConfig { id = id.toLowerCase(); if (id.includes("081f") && id.includes("e401")) { return pad_unlicensedSNES; - } else if (id.includes("xbox") && id.includes("360")) { + } + if (id.includes("xbox") && id.includes("360")) { return pad_xbox360; - } else if (id.includes("054c")) { + } + if (id.includes("054c")) { return pad_dualshock; - } else if (id.includes("057e") && id.includes("2009")) { + } + if (id.includes("057e") && id.includes("2009")) { return pad_procon; } @@ -489,11 +497,11 @@ export class InputsController { } /** - * Retrieves the configuration object for a keyboard layout based on its identifier. - * - * @param id The identifier string of the keyboard layout. - * @returns InterfaceConfig The configuration object corresponding to the identified keyboard layout. - */ + * Retrieves the configuration object for a keyboard layout based on its identifier. + * + * @param id The identifier string of the keyboard layout. + * @returns InterfaceConfig The configuration object corresponding to the identified keyboard layout. + */ getConfigKeyboard(id: string): InterfaceConfig { if (id === "default") { return cfg_keyboard_qwerty; @@ -503,8 +511,8 @@ export class InputsController { } /** - * Deactivates all currently pressed keys. - */ + * Deactivates all currently pressed keys. + */ deactivatePressedKey(): void { for (const key of Object.keys(this.inputInterval)) { clearInterval(this.inputInterval[key]); @@ -513,11 +521,11 @@ export class InputsController { } /** - * Retrieves the active configuration for the currently chosen device. - * It checks if a specific device ID is stored in configurations and returns it. - * - * @returns InterfaceConfig The configuration object for the active gamepad, or null if not set. - */ + * Retrieves the active configuration for the currently chosen device. + * It checks if a specific device ID is stored in configurations and returns it. + * + * @returns InterfaceConfig The configuration object for the active gamepad, or null if not set. + */ getActiveConfig(device: Device) { if (this.configs[this.selectedDevice[device]]?.padID) { return this.configs[this.selectedDevice[device]]; @@ -535,9 +543,8 @@ export class InputsController { getLastSourceDevice(): Device { if (this.lastSource === "gamepad") { return Device.GAMEPAD; - } else { - return Device.KEYBOARD; } + return Device.KEYBOARD; } getLastSourceConfig() { @@ -554,19 +561,19 @@ export class InputsController { } /** - * Injects a custom mapping configuration into the configuration for a specific gamepad. - * If the device does not have an existing configuration, it initializes one first. - * - * @param selectedDevice The identifier of the device to configure. - * @param mappingConfigs The mapping configuration to apply to the device. - */ + * Injects a custom mapping configuration into the configuration for a specific gamepad. + * If the device does not have an existing configuration, it initializes one first. + * + * @param selectedDevice The identifier of the device to configure. + * @param mappingConfigs The mapping configuration to apply to the device. + */ injectConfig(selectedDevice: string, mappingConfigs): void { if (!this.configs[selectedDevice]) { this.configs[selectedDevice] = {}; } // A proper way of handling migrating keybinds would be much better const mappingOverrides = { - "BUTTON_CYCLE_VARIANT": "BUTTON_CYCLE_TERA", + BUTTON_CYCLE_VARIANT: "BUTTON_CYCLE_TERA", }; for (const key in mappingConfigs.custom) { if (mappingConfigs.custom[key] in mappingOverrides) { @@ -585,18 +592,17 @@ export class InputsController { } /** - * Swaps a binding in the configuration. - * - * @param config The configuration object. - * @param settingName The name of the setting to swap. - * @param pressedButton The button that was pressed. - */ + * Swaps a binding in the configuration. + * + * @param config The configuration object. + * @param settingName The name of the setting to swap. + * @param pressedButton The button that was pressed. + */ assignBinding(config, settingName, pressedButton): boolean { this.deactivatePressedKey(); if (config.padType === "keyboard") { return assign(config, settingName, pressedButton); - } else { - return swap(config, settingName, pressedButton); } + return swap(config, settingName, pressedButton); } } diff --git a/src/interfaces/locales.ts b/src/interfaces/locales.ts index 4405095e0fe..2d26911f82f 100644 --- a/src/interfaces/locales.ts +++ b/src/interfaces/locales.ts @@ -1,93 +1,93 @@ export interface Localizable { - localize(): void; - } + localize(): void; +} export interface TranslationEntries { - [key: string]: string | { [key: string]: string } + [key: string]: string | { [key: string]: string }; } export interface SimpleTranslationEntries { - [key: string]: string - } + [key: string]: string; +} export interface MoveTranslationEntry { - name: string, - effect: string - } + name: string; + effect: string; +} export interface MoveTranslationEntries { - [key: string]: MoveTranslationEntry - } + [key: string]: MoveTranslationEntry; +} export interface AbilityTranslationEntry { - name: string, - description: string - } + name: string; + description: string; +} export interface AbilityTranslationEntries { - [key: string]: AbilityTranslationEntry - } + [key: string]: AbilityTranslationEntry; +} export interface ModifierTypeTranslationEntry { - name?: string, - description?: string, - extra?: SimpleTranslationEntries - } + name?: string; + description?: string; + extra?: SimpleTranslationEntries; +} export interface ModifierTypeTranslationEntries { - ModifierType: { [key: string]: ModifierTypeTranslationEntry }, - SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }, - AttackTypeBoosterItem: SimpleTranslationEntries, - TempStatStageBoosterItem: SimpleTranslationEntries, - BaseStatBoosterItem: SimpleTranslationEntries, - EvolutionItem: SimpleTranslationEntries, - FormChangeItem: SimpleTranslationEntries, - } + ModifierType: { [key: string]: ModifierTypeTranslationEntry }; + SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }; + AttackTypeBoosterItem: SimpleTranslationEntries; + TempStatStageBoosterItem: SimpleTranslationEntries; + BaseStatBoosterItem: SimpleTranslationEntries; + EvolutionItem: SimpleTranslationEntries; + FormChangeItem: SimpleTranslationEntries; +} export interface PokemonInfoTranslationEntries { - Stat: SimpleTranslationEntries, - Type: SimpleTranslationEntries, - } + Stat: SimpleTranslationEntries; + Type: SimpleTranslationEntries; +} export interface BerryTranslationEntry { - name: string, - effect: string, - } + name: string; + effect: string; +} export interface BerryTranslationEntries { - [key: string]: BerryTranslationEntry - } + [key: string]: BerryTranslationEntry; +} export interface StatusEffectTranslationEntries { - [key: string]: StatusEffectTranslationEntry + [key: string]: StatusEffectTranslationEntry; } export interface StatusEffectTranslationEntry { - name: string, - obtain: string, - obtainSource: string, - activation: string, - overlap: string, - heal: string - description: string, + name: string; + obtain: string; + obtainSource: string; + activation: string; + overlap: string; + heal: string; + description: string; } export interface AchievementTranslationEntry { - name?: string, - description?: string, - } + name?: string; + description?: string; +} export interface AchievementTranslationEntries { - [key: string]: AchievementTranslationEntry; - } + [key: string]: AchievementTranslationEntry; +} export interface DialogueTranslationEntry { - [key: number]: string; - } + [key: number]: string; +} export interface DialogueTranslationCategory { - [category: string]: DialogueTranslationEntry; - } + [category: string]: DialogueTranslationEntry; +} export interface DialogueTranslationEntries { - [trainertype: string]: DialogueTranslationCategory; - } + [trainertype: string]: DialogueTranslationCategory; +} diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 02bd849f66c..1e98c175487 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -138,10 +138,10 @@ export class LoadingScene extends SceneBase { this.loadImage("summary_bg", "ui"); this.loadImage("summary_overlay_shiny", "ui"); this.loadImage("summary_profile", "ui"); - this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt - this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt - this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' - this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' + this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt + this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt + this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' + this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' this.loadImage("summary_status", "ui"); this.loadImage("summary_stats", "ui"); this.loadImage("summary_stats_overlay_exp", "ui"); @@ -193,7 +193,7 @@ export class LoadingScene extends SceneBase { } if (getBiomeHasProps(bt)) { for (let p = 1; p <= 3; p++) { - const isPropAnimated = p === 3 && [ "power_plant", "end" ].find(b => b === btKey); + const isPropAnimated = p === 3 && ["power_plant", "end"].find(b => b === btKey); const propKey = `${btKey}_b_${p}`; if (!isPropAnimated) { this.loadImage(propKey, "arenas"); @@ -249,9 +249,9 @@ export class LoadingScene extends SceneBase { this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } - const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; + const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"]; if (lang && availableLangs.includes(lang)) { - this.loadImage("pkmnday2025event-" + lang, "events"); + this.loadImage(`pkmnday2025event-${lang}`, "events"); } else { this.loadImage("pkmnday2025event-en", "events"); } @@ -264,11 +264,11 @@ export class LoadingScene extends SceneBase { this.loadAtlas("egg_icons", "egg"); this.loadAtlas("egg_shard", "egg"); this.loadAtlas("egg_lightrays", "egg"); - Utils.getEnumKeys(GachaType).forEach(gt => { + for (const gt of Utils.getEnumKeys(GachaType)) { const key = gt.toLowerCase(); this.loadImage(`gacha_${key}`, "egg"); this.loadAtlas(`gacha_underlay_${key}`, "egg"); - }); + } this.loadImage("gacha_glass", "egg"); this.loadImage("gacha_eggs", "egg"); this.loadAtlas("gacha_hatch", "egg"); @@ -351,7 +351,11 @@ export class LoadingScene extends SceneBase { this.loadBgm("evolution", "bw/evolution.mp3"); this.loadBgm("evolution_fanfare", "bw/evolution_fanfare.mp3"); - this.load.plugin("rextexteditplugin", "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", true); + this.load.plugin( + "rextexteditplugin", + "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", + true, + ); this.loadLoadingScreen(); @@ -441,12 +445,22 @@ export class LoadingScene extends SceneBase { style: { font: "48px emerald", color: "#ffffff", - align: "center" + align: "center", }, }); disclaimerDescriptionText.setOrigin(0.5, 0.5); - loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText, disclaimerText, disclaimerDescriptionText); + loadingGraphics.push( + bg, + graphics, + progressBar, + progressBox, + logo, + percentText, + assetText, + disclaimerText, + disclaimerDescriptionText, + ); if (!mobile) { loadingGraphics.map(g => g.setVisible(false)); @@ -461,7 +475,9 @@ export class LoadingScene extends SceneBase { ease: "Sine.easeIn", onComplete: () => video.destroy(), }); - loadingGraphics.forEach(g => g.setVisible(true)); + for (const g of loadingGraphics) { + g.setVisible(true); + } }); intro.setOrigin(0, 0); intro.setScale(3); @@ -502,7 +518,9 @@ export class LoadingScene extends SceneBase { }); this.load.on(this.LOAD_EVENTS.COMPLETE, () => { - loadingGraphics.forEach(go => go.destroy()); + for (const go of loadingGraphics) { + go.destroy(); + } intro.destroy(); }); } diff --git a/src/main.ts b/src/main.ts index 993bd1018ae..3d3965cad08 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,9 +7,8 @@ import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin"; import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin"; import { initI18n } from "./plugins/i18n"; - // Catch global errors and display them in an alert so users can report the issue. -window.onerror = function (message, source, lineno, colno, error) { +window.onerror = (_message, _source, _lineno, _colno, error) => { console.error(error); // const errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`; //alert(errorString); @@ -18,7 +17,7 @@ window.onerror = function (message, source, lineno, colno, error) { }; // Catch global promise rejections and display them in an alert so users can report the issue. -window.addEventListener("unhandledrejection", (event) => { +window.addEventListener("unhandledrejection", event => { // const errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`; console.error(event.reason); //alert(errorString); @@ -41,7 +40,7 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); - +// biome-ignore lint/suspicious/noImplicitAnyLet: TODO let game; const startGame = async (manifest?: any) => { @@ -54,44 +53,50 @@ const startGame = async (manifest?: any) => { scale: { width: 1920, height: 1080, - mode: Phaser.Scale.FIT + mode: Phaser.Scale.FIT, }, plugins: { - global: [{ - key: "rexInputTextPlugin", - plugin: InputTextPlugin, - start: true - }, { - key: "rexBBCodeTextPlugin", - plugin: BBCodeTextPlugin, - start: true - }, { - key: "rexTransitionImagePackPlugin", - plugin: TransitionImagePackPlugin, - start: true - }], - scene: [{ - key: "rexUI", - plugin: UIPlugin, - mapping: "rexUI" - }] + global: [ + { + key: "rexInputTextPlugin", + plugin: InputTextPlugin, + start: true, + }, + { + key: "rexBBCodeTextPlugin", + plugin: BBCodeTextPlugin, + start: true, + }, + { + key: "rexTransitionImagePackPlugin", + plugin: TransitionImagePackPlugin, + start: true, + }, + ], + scene: [ + { + key: "rexUI", + plugin: UIPlugin, + mapping: "rexUI", + }, + ], }, input: { mouse: { - target: "app" + target: "app", }, touch: { - target: "app" + target: "app", }, - gamepad: true + gamepad: true, }, dom: { - createContainer: true + createContainer: true, }, pixelArt: true, - pipeline: [ InvertPostFX ] as unknown as Phaser.Types.Core.PipelineConfig, - scene: [ LoadingScene, BattleScene ], - version: version + pipeline: [InvertPostFX] as unknown as Phaser.Types.Core.PipelineConfig, + scene: [LoadingScene, BattleScene], + version: version, }); game.sound.pauseOnBlur = false; if (manifest) { @@ -103,7 +108,8 @@ fetch("/manifest.json") .then(res => res.json()) .then(jsonResponse => { startGame(jsonResponse.manifest); - }).catch(() => { + }) + .catch(() => { // Manifest not found (likely local build) startGame(); }); diff --git a/src/messages.ts b/src/messages.ts index 26fd3353cc6..e35b48f7226 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -18,15 +18,17 @@ export function getPokemonNameWithAffix(pokemon: Pokemon | undefined): string { return !pokemon.isPlayer() ? pokemon.hasTrainer() ? i18next.t("battle:foePokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) + pokemonName: pokemon.getNameToRender(), + }) : i18next.t("battle:wildPokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) + pokemonName: pokemon.getNameToRender(), + }) : pokemon.getNameToRender(); case BattleSpec.FINAL_BOSS: return !pokemon.isPlayer() - ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) + ? i18next.t("battle:foePokemonWithAffix", { + pokemonName: pokemon.getNameToRender(), + }) : pokemon.getNameToRender(); default: return pokemon.getNameToRender(); diff --git a/src/modifier/modifier-tier.ts b/src/modifier/modifier-tier.ts index 81bb1ad8ae5..d8a75e41b0a 100644 --- a/src/modifier/modifier-tier.ts +++ b/src/modifier/modifier-tier.ts @@ -4,5 +4,5 @@ export enum ModifierTier { ULTRA, ROGUE, MASTER, - LUXURY + LUXURY, } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 6cb8051518d..7ceba13440d 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -5,13 +5,99 @@ import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; import { allMoves, AttackMove } from "#app/data/moves/move"; import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; +import { + FormChangeItem, + pokemonFormChanges, + SpeciesFormChangeCondition, + SpeciesFormChangeItemTrigger, +} from "#app/data/pokemon-forms"; import { getStatusEffectDescriptor } from "#app/data/status-effect"; import { PokemonType } from "#enums/pokemon-type"; import type { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerrastalizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; +import { + AddPokeballModifier, + AddVoucherModifier, + AttackTypeBoosterModifier, + BaseStatModifier, + BerryModifier, + BoostBugSpawnModifier, + BypassSpeedChanceModifier, + ContactHeldItemTransferChanceModifier, + CritBoosterModifier, + DamageMoneyRewardModifier, + DoubleBattleChanceBoosterModifier, + EnemyAttackStatusEffectChanceModifier, + EnemyDamageBoosterModifier, + EnemyDamageReducerModifier, + EnemyEndureChanceModifier, + EnemyFusionChanceModifier, + EnemyStatusEffectHealChanceModifier, + EnemyTurnHealModifier, + EvolutionItemModifier, + EvolutionStatBoosterModifier, + EvoTrackerModifier, + ExpBalanceModifier, + ExpBoosterModifier, + ExpShareModifier, + ExtraModifierModifier, + FlinchChanceModifier, + FusePokemonModifier, + GigantamaxAccessModifier, + HealingBoosterModifier, + HealShopCostModifier, + HiddenAbilityRateBoosterModifier, + HitHealModifier, + IvScannerModifier, + LevelIncrementBoosterModifier, + LockModifierTiersModifier, + MapModifier, + MegaEvolutionAccessModifier, + MoneyInterestModifier, + MoneyMultiplierModifier, + MoneyRewardModifier, + MultipleParticipantExpBonusModifier, + PokemonAllMovePpRestoreModifier, + PokemonBaseStatFlatModifier, + PokemonBaseStatTotalModifier, + PokemonExpBoosterModifier, + PokemonFormChangeItemModifier, + PokemonFriendshipBoosterModifier, + PokemonHeldItemModifier, + PokemonHpRestoreModifier, + PokemonIncrementingStatModifier, + PokemonInstantReviveModifier, + PokemonLevelIncrementModifier, + PokemonMoveAccuracyBoosterModifier, + PokemonMultiHitModifier, + PokemonNatureChangeModifier, + PokemonNatureWeightModifier, + PokemonPpRestoreModifier, + PokemonPpUpModifier, + PokemonStatusHealModifier, + PreserveBerryModifier, + RememberMoveModifier, + ResetNegativeStatStageModifier, + ShinyRateBoosterModifier, + SpeciesCritBoosterModifier, + SpeciesStatBoosterModifier, + SurviveDamageModifier, + SwitchEffectTransferModifier, + TempCritBoosterModifier, + TempStatStageBoosterModifier, + TerastallizeAccessModifier, + TerrastalizeModifier, + TmModifier, + TurnHealModifier, + TurnHeldItemTransferModifier, + TurnStatusEffectModifier, + type EnemyPersistentModifier, + type Modifier, + type PersistentModifier, + TempExtraModifierModifier, + CriticalCatchChanceBoosterModifier, +} from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; import { Unlockables } from "#app/system/unlockables"; @@ -19,7 +105,15 @@ import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import PartyUiHandler from "#app/ui/party-ui-handler"; import { getModifierTierTextTint } from "#app/ui/text"; -import { formatMoney, getEnumKeys, getEnumValues, isNullOrUndefined, NumberHolder, padInt, randSeedInt } from "#app/utils"; +import { + formatMoney, + getEnumKeys, + getEnumValues, + isNullOrUndefined, + NumberHolder, + padInt, + randSeedInt, +} from "#app/utils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -41,7 +135,7 @@ export enum ModifierPoolType { WILD, TRAINER, ENEMY_BUFF, - DAILY_STARTER + DAILY_STARTER, } type NewModifierFunc = (type: ModifierType, args: any[]) => Modifier; @@ -55,7 +149,13 @@ export class ModifierType { public tier: ModifierTier; protected newModifierFunc: NewModifierFunc | null; - constructor(localeKey: string | null, iconImage: string | null, newModifierFunc: NewModifierFunc | null, group?: string, soundName?: string) { + constructor( + localeKey: string | null, + iconImage: string | null, + newModifierFunc: NewModifierFunc | null, + group?: string, + soundName?: string, + ) { this.localeKey = localeKey!; // TODO: is this bang correct? this.iconImage = iconImage!; // TODO: is this bang correct? this.group = group!; // TODO: is this bang correct? @@ -85,16 +185,16 @@ export class ModifierType { let poolTypes: ModifierPoolType[]; switch (poolType) { case ModifierPoolType.PLAYER: - poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; + poolTypes = [poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD]; break; case ModifierPoolType.WILD: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; + poolTypes = [poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER]; break; case ModifierPoolType.TRAINER: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; + poolTypes = [poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD]; break; default: - poolTypes = [ poolType ]; + poolTypes = [poolType]; break; } // Try multiple pool types in case of stolen items @@ -133,7 +233,11 @@ export class ModifierType { * if not provided or empty, the weight check will be ignored * @param rerollCount Default `0`. Used to check the weight of modifiers with conditional weight (see {@linkcode WeightedModifierTypeWeightFunc}) */ - withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER, party?: PlayerPokemon[], rerollCount: number = 0): ModifierType { + withTierFromPool( + poolType: ModifierPoolType = ModifierPoolType.PLAYER, + party?: PlayerPokemon[], + rerollCount = 0, + ): ModifierType { let defaultTier: undefined | ModifierTier; for (const tier of Object.values(getModifierPoolForType(poolType))) { for (const modifier of tier) { @@ -147,7 +251,8 @@ export class ModifierType { if (weight > 0) { this.tier = modifier.modifierType.tier; return this; - } else if (isNullOrUndefined(defaultTier)) { + } + if (isNullOrUndefined(defaultTier)) { // If weight is 0, keep track of the first tier where the item was found defaultTier = modifier.modifierType.tier; } @@ -164,6 +269,7 @@ export class ModifierType { } newModifier(...args: any[]): Modifier | null { + // biome-ignore lint/complexity/useOptionalChain: Changing to optional would coerce null return into undefined return this.newModifierFunc && this.newModifierFunc(this, args); } } @@ -171,7 +277,7 @@ export class ModifierType { type ModifierTypeGeneratorFunc = (party: Pokemon[], pregenArgs?: any[]) => ModifierType | null; export class ModifierTypeGenerator extends ModifierType { - private genTypeFunc: ModifierTypeGeneratorFunc; + private genTypeFunc: ModifierTypeGeneratorFunc; constructor(genTypeFunc: ModifierTypeGeneratorFunc) { super(null, null, null); @@ -204,17 +310,20 @@ class AddPokeballModifierType extends ModifierType { get name(): string { return i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { - "modifierCount": this.count, - "pokeballName": getPokeballName(this.pokeballType), + modifierCount: this.count, + pokeballName: getPokeballName(this.pokeballType), }); } getDescription(): string { return i18next.t("modifierType:ModifierType.AddPokeballModifierType.description", { - "modifierCount": this.count, - "pokeballName": getPokeballName(this.pokeballType), - "catchRate": getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : "100%", - "pokeballAmount": `${globalScene.pokeballCounts[this.pokeballType]}`, + modifierCount: this.count, + pokeballName: getPokeballName(this.pokeballType), + catchRate: + getPokeballCatchMultiplier(this.pokeballType) > -1 + ? `${getPokeballCatchMultiplier(this.pokeballType)}x` + : "100%", + pokeballAmount: `${globalScene.pokeballCounts[this.pokeballType]}`, }); } } @@ -224,22 +333,27 @@ class AddVoucherModifierType extends ModifierType { private count: number; constructor(voucherType: VoucherType, count: number) { - super("", getVoucherTypeIcon(voucherType), (_type, _args) => new AddVoucherModifier(this, voucherType, count), "voucher"); + super( + "", + getVoucherTypeIcon(voucherType), + (_type, _args) => new AddVoucherModifier(this, voucherType, count), + "voucher", + ); this.count = count; this.voucherType = voucherType; } get name(): string { return i18next.t("modifierType:ModifierType.AddVoucherModifierType.name", { - "modifierCount": this.count, - "voucherTypeName": getVoucherTypeName(this.voucherType), + modifierCount: this.count, + voucherTypeName: getVoucherTypeName(this.voucherType), }); } getDescription(): string { return i18next.t("modifierType:ModifierType.AddVoucherModifierType.description", { - "modifierCount": this.count, - "voucherTypeName": getVoucherTypeName(this.voucherType), + modifierCount: this.count, + voucherTypeName: getVoucherTypeName(this.voucherType), }); } } @@ -247,7 +361,14 @@ class AddVoucherModifierType extends ModifierType { export class PokemonModifierType extends ModifierType { public selectFilter: PokemonSelectFilter | undefined; - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string, soundName?: string) { + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + group?: string, + soundName?: string, + ) { super(localeKey, iconImage, newModifierFunc, group, soundName); this.selectFilter = selectFilter; @@ -255,19 +376,38 @@ export class PokemonModifierType extends ModifierType { } export class PokemonHeldItemModifierType extends PokemonModifierType { - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { - super(localeKey, iconImage, newModifierFunc, (pokemon: PlayerPokemon) => { - const dummyModifier = this.newModifier(pokemon); - const matchingModifier = globalScene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier)) as PokemonHeldItemModifier; - const maxStackCount = dummyModifier.getMaxStackCount(); - if (!maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": getPokemonNameWithAffix(pokemon) }); - } - if (matchingModifier && matchingModifier.stackCount === maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": getPokemonNameWithAffix(pokemon) }); - } - return null; - }, group, soundName); + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + group?: string, + soundName?: string, + ) { + super( + localeKey, + iconImage, + newModifierFunc, + (pokemon: PlayerPokemon) => { + const dummyModifier = this.newModifier(pokemon); + const matchingModifier = globalScene.findModifier( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier), + ) as PokemonHeldItemModifier; + const maxStackCount = dummyModifier.getMaxStackCount(); + if (!maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + } + if (matchingModifier && matchingModifier.stackCount === maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + } + return null; + }, + group, + soundName, + ); } newModifier(...args: any[]): PokemonHeldItemModifier { @@ -275,33 +415,44 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { } } - export class TerastallizeModifierType extends PokemonModifierType { private teraType: PokemonType; constructor(teraType: PokemonType) { - super("", `${PokemonType[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + super( + "", + `${PokemonType[teraType].toLowerCase()}_tera_shard`, + (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), (pokemon: PlayerPokemon) => { - if ([ pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length > 0) { + if ( + [pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId].filter( + s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA, + ).length > 0 + ) { return PartyUiHandler.NoEffectMessage; } return null; }, - "tera_shard"); + "tera_shard", + ); this.teraType = teraType; } get name(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { + teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), + }); } getDescription(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { + teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), + }); } getPregenArgs(): any[] { - return [ this.teraType ]; + return [this.teraType]; } } @@ -310,14 +461,41 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { protected restorePercent: number; protected healStatus: boolean; - constructor(localeKey: string, iconImage: string, restorePoints: number, restorePercent: number, healStatus: boolean = false, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string) { - super(localeKey, iconImage, newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.restorePercent, this.healStatus, false)), - selectFilter || ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { - return PartyUiHandler.NoEffectMessage; - } - return null; - }), group || "potion"); + constructor( + localeKey: string, + iconImage: string, + restorePoints: number, + restorePercent: number, + healStatus = false, + newModifierFunc?: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + group?: string, + ) { + super( + localeKey, + iconImage, + newModifierFunc || + ((_type, args) => + new PokemonHpRestoreModifier( + this, + (args[0] as PlayerPokemon).id, + this.restorePoints, + this.restorePercent, + this.healStatus, + false, + )), + selectFilter || + ((pokemon: PlayerPokemon) => { + if ( + !pokemon.hp || + (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED)))) + ) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }), + group || "potion", + ); this.restorePoints = restorePoints; this.restorePercent = restorePercent; @@ -327,9 +505,9 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { getDescription(): string { return this.restorePoints ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.description", { - restorePoints: this.restorePoints, - restorePercent: this.restorePercent, - }) + restorePoints: this.restorePoints, + restorePercent: this.restorePercent, + }) : this.healStatus ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fullyWithStatus") : i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fully"); @@ -338,13 +516,22 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { constructor(localeKey: string, iconImage: string, restorePercent: number) { - super(localeKey, iconImage, 0, restorePercent, false, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, 0, this.restorePercent, false, true), - ((pokemon: PlayerPokemon) => { + super( + localeKey, + iconImage, + 0, + restorePercent, + false, + (_type, args) => + new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, 0, this.restorePercent, false, true), + (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { return PartyUiHandler.NoEffectMessage; } return null; - }), "revive"); + }, + "revive", + ); this.selectFilter = (pokemon: PlayerPokemon) => { if (pokemon.hp) { @@ -355,19 +542,25 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { } getDescription(): string { - return i18next.t("modifierType:ModifierType.PokemonReviveModifierType.description", { restorePercent: this.restorePercent }); + return i18next.t("modifierType:ModifierType.PokemonReviveModifierType.description", { + restorePercent: this.restorePercent, + }); } } export class PokemonStatusHealModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, ((_type, args) => new PokemonStatusHealModifier(this, (args[0] as PlayerPokemon).id)), - ((pokemon: PlayerPokemon) => { + super( + localeKey, + iconImage, + (_type, args) => new PokemonStatusHealModifier(this, (args[0] as PlayerPokemon).id), + (pokemon: PlayerPokemon) => { if (!pokemon.hp || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))) { return PartyUiHandler.NoEffectMessage; } return null; - })); + }, + ); } getDescription(): string { @@ -378,7 +571,14 @@ export class PokemonStatusHealModifierType extends PokemonModifierType { export abstract class PokemonMoveModifierType extends PokemonModifierType { public moveSelectFilter: PokemonMoveSelectFilter | undefined; - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, moveSelectFilter?: PokemonMoveSelectFilter, group?: string) { + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + moveSelectFilter?: PokemonMoveSelectFilter, + group?: string, + ) { super(localeKey, iconImage, newModifierFunc, selectFilter, group); this.moveSelectFilter = moveSelectFilter; @@ -389,24 +589,32 @@ export class PokemonPpRestoreModifierType extends PokemonMoveModifierType { protected restorePoints: number; constructor(localeKey: string, iconImage: string, restorePoints: number) { - super(localeKey, iconImage, (_type, args) => new PokemonPpRestoreModifier(this, (args[0] as PlayerPokemon).id, (args[1] as number), this.restorePoints), + super( + localeKey, + iconImage, + (_type, args) => + new PokemonPpRestoreModifier(this, (args[0] as PlayerPokemon).id, args[1] as number, this.restorePoints), (_pokemon: PlayerPokemon) => { return null; - }, (pokemonMove: PokemonMove) => { + }, + (pokemonMove: PokemonMove) => { if (!pokemonMove.ppUsed) { return PartyUiHandler.NoEffectMessage; } return null; - }, "ether"); + }, + "ether", + ); this.restorePoints = restorePoints; } getDescription(): string { return this.restorePoints > -1 - ? i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.description", { restorePoints: this.restorePoints }) - : i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully") - ; + ? i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.description", { + restorePoints: this.restorePoints, + }) + : i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully"); } } @@ -414,22 +622,28 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { protected restorePoints: number; constructor(localeKey: string, iconImage: string, restorePoints: number) { - super(localeKey, iconImage, (_type, args) => new PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), + super( + localeKey, + iconImage, + (_type, args) => new PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), (pokemon: PlayerPokemon) => { if (!pokemon.getMoveset().filter(m => m?.ppUsed).length) { return PartyUiHandler.NoEffectMessage; } return null; - }, "elixir"); + }, + "elixir", + ); this.restorePoints = restorePoints; } getDescription(): string { return this.restorePoints > -1 - ? i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description", { restorePoints: this.restorePoints }) - : i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully") - ; + ? i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description", { + restorePoints: this.restorePoints, + }) + : i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully"); } } @@ -437,15 +651,21 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType { protected upPoints: number; constructor(localeKey: string, iconImage: string, upPoints: number) { - super(localeKey, iconImage, (_type, args) => new PokemonPpUpModifier(this, (args[0] as PlayerPokemon).id, (args[1] as number), this.upPoints), + super( + localeKey, + iconImage, + (_type, args) => new PokemonPpUpModifier(this, (args[0] as PlayerPokemon).id, args[1] as number, this.upPoints), (_pokemon: PlayerPokemon) => { return null; - }, (pokemonMove: PokemonMove) => { + }, + (pokemonMove: PokemonMove) => { if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3 || pokemonMove.maxPpOverride) { return PartyUiHandler.NoEffectMessage; } return null; - }, "ppUp"); + }, + "ppUp", + ); this.upPoints = upPoints; } @@ -459,35 +679,53 @@ export class PokemonNatureChangeModifierType extends PokemonModifierType { protected nature: Nature; constructor(nature: Nature) { - super("", `mint_${getEnumKeys(Stat).find(s => getNatureStatMultiplier(nature, Stat[s]) > 1)?.toLowerCase() || "neutral" }`, ((_type, args) => new PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)), - ((pokemon: PlayerPokemon) => { + super( + "", + `mint_${ + getEnumKeys(Stat) + .find(s => getNatureStatMultiplier(nature, Stat[s]) > 1) + ?.toLowerCase() || "neutral" + }`, + (_type, args) => new PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature), + (pokemon: PlayerPokemon) => { if (pokemon.getNature() === this.nature) { return PartyUiHandler.NoEffectMessage; } return null; - }), "mint"); + }, + "mint", + ); this.nature = nature; } get name(): string { - return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.name", { natureName: getNatureName(this.nature) }); + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.name", { + natureName: getNatureName(this.nature), + }); } getDescription(): string { - return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.description", { natureName: getNatureName(this.nature, true, true, true) }); + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.description", { + natureName: getNatureName(this.nature, true, true, true), + }); } } export class RememberMoveModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, group?: string) { - super(localeKey, iconImage, (type, args) => new RememberMoveModifier(type, (args[0] as PlayerPokemon).id, (args[1] as number)), + super( + localeKey, + iconImage, + (type, args) => new RememberMoveModifier(type, (args[0] as PlayerPokemon).id, args[1] as number), (pokemon: PlayerPokemon) => { if (!pokemon.getLearnableLevelMoves().length) { return PartyUiHandler.NoEffectMessage; } return null; - }, group); + }, + group, + ); } } @@ -502,7 +740,7 @@ export class DoubleBattleChanceBoosterModifierType extends ModifierType { getDescription(): string { return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { - battleCount: this.maxBattles + battleCount: this.maxBattles, }); } } @@ -518,7 +756,7 @@ export class TempStatStageBoosterModifierType extends ModifierType implements Ge this.stat = stat; this.nameKey = nameKey; - this.quantityKey = (stat !== Stat.ACC) ? "percentage" : "stage"; + this.quantityKey = stat !== Stat.ACC ? "percentage" : "stage"; } get name(): string { @@ -528,12 +766,12 @@ export class TempStatStageBoosterModifierType extends ModifierType implements Ge getDescription(): string { return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)), - amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`) + amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`), }); } getPregenArgs(): any[] { - return [ this.stat ]; + return [this.stat]; } } @@ -541,7 +779,12 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge private berryType: BerryType; constructor(berryType: BerryType) { - super("", `${BerryType[berryType].toLowerCase()}_berry`, (type, args) => new BerryModifier(type, (args[0] as Pokemon).id, berryType), "berry"); + super( + "", + `${BerryType[berryType].toLowerCase()}_berry`, + (type, args) => new BerryModifier(type, (args[0] as Pokemon).id, berryType), + "berry", + ); this.berryType = berryType; } @@ -555,7 +798,7 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge } getPregenArgs(): any[] { - return [ this.berryType ]; + return [this.berryType]; } } @@ -577,16 +820,22 @@ enum AttackTypeBoosterItem { NEVER_MELT_ICE, DRAGON_FANG, BLACK_GLASSES, - FAIRY_FEATHER + FAIRY_FEATHER, } -export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class AttackTypeBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ public moveType: PokemonType; public boostPercent: number; constructor(moveType: PokemonType, boostPercent: number) { - super("", `${AttackTypeBoosterItem[moveType]?.toLowerCase()}`, - (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); + super( + "", + `${AttackTypeBoosterItem[moveType]?.toLowerCase()}`, + (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent), + ); this.moveType = moveType; this.boostPercent = boostPercent; @@ -598,11 +847,13 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i getDescription(): string { // TODO: Need getTypeName? - return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`) }); + return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { + moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), + }); } getPregenArgs(): any[] { - return [ this.moveType ]; + return [this.moveType]; } } @@ -613,24 +864,37 @@ export type SpeciesStatBoosterItem = keyof typeof SpeciesStatBoosterModifierType * @extends PokemonHeldItemModifierType * @implements GeneratedPersistentModifierType */ -export class SpeciesStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class SpeciesStatBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private key: SpeciesStatBoosterItem; constructor(key: SpeciesStatBoosterItem) { const item = SpeciesStatBoosterModifierTypeGenerator.items[key]; - super(`modifierType:SpeciesBoosterItem.${key}`, key.toLowerCase(), (type, args) => new SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species)); + super( + `modifierType:SpeciesBoosterItem.${key}`, + key.toLowerCase(), + (type, args) => + new SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species), + ); this.key = key; } getPregenArgs(): any[] { - return [ this.key ]; + return [this.key]; } } export class PokemonLevelIncrementModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (_type, args) => new PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), (_pokemon: PlayerPokemon) => null); + super( + localeKey, + iconImage, + (_type, args) => new PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), + (_pokemon: PlayerPokemon) => null, + ); } getDescription(): string { @@ -658,7 +922,10 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { } } -export class BaseStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class BaseStatBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private stat: PermanentStat; private key: string; @@ -675,47 +942,71 @@ export class BaseStatBoosterModifierType extends PokemonHeldItemModifierType imp } getDescription(): string { - return i18next.t("modifierType:ModifierType.BaseStatBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)) }); + return i18next.t("modifierType:ModifierType.BaseStatBoosterModifierType.description", { + stat: i18next.t(getStatKey(this.stat)), + }); } getPregenArgs(): any[] { - return [ this.stat ]; + return [this.stat]; } } /** * Shuckle Juice item */ -export class PokemonBaseStatTotalModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class PokemonBaseStatTotalModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private readonly statModifier: number; constructor(statModifier: number) { - super("modifierType:ModifierType.MYSTERY_ENCOUNTER_SHUCKLE_JUICE", "berry_juice", (_type, args) => new PokemonBaseStatTotalModifier(this, (args[0] as Pokemon).id, this.statModifier)); + super( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_SHUCKLE_JUICE", + "berry_juice", + (_type, args) => new PokemonBaseStatTotalModifier(this, (args[0] as Pokemon).id, this.statModifier), + ); this.statModifier = statModifier; } override getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonBaseStatTotalModifierType.description", { - increaseDecrease: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.increase" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.decrease"), - blessCurse: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.blessed" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.cursed"), + increaseDecrease: i18next.t( + this.statModifier >= 0 + ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.increase" + : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.decrease", + ), + blessCurse: i18next.t( + this.statModifier >= 0 + ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.blessed" + : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.cursed", + ), statValue: this.statModifier, }); } public getPregenArgs(): any[] { - return [ this.statModifier ]; + return [this.statModifier]; } } /** * Old Gateau item */ -export class PokemonBaseStatFlatModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class PokemonBaseStatFlatModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private readonly statModifier: number; private readonly stats: Stat[]; constructor(statModifier: number, stats: Stat[]) { - super("modifierType:ModifierType.MYSTERY_ENCOUNTER_OLD_GATEAU", "old_gateau", (_type, args) => new PokemonBaseStatFlatModifier(this, (args[0] as Pokemon).id, this.statModifier, this.stats)); + super( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_OLD_GATEAU", + "old_gateau", + (_type, args) => new PokemonBaseStatFlatModifier(this, (args[0] as Pokemon).id, this.statModifier, this.stats), + ); this.statModifier = statModifier; this.stats = stats; } @@ -728,7 +1019,7 @@ export class PokemonBaseStatFlatModifierType extends PokemonHeldItemModifierType } public getPregenArgs(): any[] { - return [ this.statModifier, this.stats ]; + return [this.statModifier, this.stats]; } } @@ -736,19 +1027,30 @@ class AllPokemonFullHpRestoreModifierType extends ModifierType { private descriptionKey: string; constructor(localeKey: string, iconImage: string, descriptionKey?: string, newModifierFunc?: NewModifierFunc) { - super(localeKey, iconImage, newModifierFunc || ((_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false))); + super( + localeKey, + iconImage, + newModifierFunc || ((_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false)), + ); this.descriptionKey = descriptionKey!; // TODO: is this bang correct? } getDescription(): string { - return i18next.t(`${this.descriptionKey || "modifierType:ModifierType.AllPokemonFullHpRestoreModifierType"}.description` as any); + return i18next.t( + `${this.descriptionKey || "modifierType:ModifierType.AllPokemonFullHpRestoreModifierType"}.description` as any, + ); } } class AllPokemonFullReviveModifierType extends AllPokemonFullHpRestoreModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, "modifierType:ModifierType.AllPokemonFullReviveModifierType", (_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false, true)); + super( + localeKey, + iconImage, + "modifierType:ModifierType.AllPokemonFullReviveModifierType", + (_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false, true), + ); } } @@ -785,7 +1087,9 @@ export class ExpBoosterModifierType extends ModifierType { } getDescription(): string { - return i18next.t("modifierType:ModifierType.ExpBoosterModifierType.description", { boostPercent: this.boostPercent }); + return i18next.t("modifierType:ModifierType.ExpBoosterModifierType.description", { + boostPercent: this.boostPercent, + }); } } @@ -793,13 +1097,19 @@ export class PokemonExpBoosterModifierType extends PokemonHeldItemModifierType { private boostPercent: number; constructor(localeKey: string, iconImage: string, boostPercent: number) { - super(localeKey, iconImage, (_type, args) => new PokemonExpBoosterModifier(this, (args[0] as Pokemon).id, boostPercent)); + super( + localeKey, + iconImage, + (_type, args) => new PokemonExpBoosterModifier(this, (args[0] as Pokemon).id, boostPercent), + ); this.boostPercent = boostPercent; } getDescription(): string { - return i18next.t("modifierType:ModifierType.PokemonExpBoosterModifierType.description", { boostPercent: this.boostPercent }); + return i18next.t("modifierType:ModifierType.PokemonExpBoosterModifierType.description", { + boostPercent: this.boostPercent, + }); } } @@ -817,19 +1127,31 @@ export class PokemonMoveAccuracyBoosterModifierType extends PokemonHeldItemModif private amount: number; constructor(localeKey: string, iconImage: string, amount: number, group?: string, soundName?: string) { - super(localeKey, iconImage, (_type, args) => new PokemonMoveAccuracyBoosterModifier(this, (args[0] as Pokemon).id, amount), group, soundName); + super( + localeKey, + iconImage, + (_type, args) => new PokemonMoveAccuracyBoosterModifier(this, (args[0] as Pokemon).id, amount), + group, + soundName, + ); this.amount = amount; } getDescription(): string { - return i18next.t("modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description", { accuracyAmount: this.amount }); + return i18next.t("modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description", { + accuracyAmount: this.amount, + }); } } export class PokemonMultiHitModifierType extends PokemonHeldItemModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (type, args) => new PokemonMultiHitModifier(type as PokemonMultiHitModifierType, (args[0] as Pokemon).id)); + super( + localeKey, + iconImage, + (type, args) => new PokemonMultiHitModifier(type as PokemonMultiHitModifierType, (args[0] as Pokemon).id), + ); } getDescription(): string { @@ -841,13 +1163,21 @@ export class TmModifierType extends PokemonModifierType { public moveId: Moves; constructor(moveId: Moves) { - super("", `tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), + super( + "", + `tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`, + (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.getMoveset().filter(m => m?.moveId === moveId).length) { + if ( + pokemon.compatibleTms.indexOf(moveId) === -1 || + pokemon.getMoveset().filter(m => m?.moveId === moveId).length + ) { return PartyUiHandler.NoEffectMessage; } return null; - }, "tm"); + }, + "tm", + ); this.moveId = moveId; } @@ -860,7 +1190,12 @@ export class TmModifierType extends PokemonModifierType { } getDescription(): string { - return i18next.t(globalScene.enableMoveInfo ? "modifierType:ModifierType.TmModifierTypeWithInfo.description" : "modifierType:ModifierType.TmModifierType.description", { moveName: allMoves[this.moveId].name }); + return i18next.t( + globalScene.enableMoveInfo + ? "modifierType:ModifierType.TmModifierTypeWithInfo.description" + : "modifierType:ModifierType.TmModifierType.description", + { moveName: allMoves[this.moveId].name }, + ); } } @@ -868,18 +1203,41 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge public evolutionItem: EvolutionItem; constructor(evolutionItem: EvolutionItem) { - super("", EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), + super( + "", + EvolutionItem[evolutionItem].toLowerCase(), + (_type, args) => new EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFormKey())).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && + pokemonEvolutions[pokemon.species.speciesId].filter( + e => + e.item === this.evolutionItem && + (!e.condition || e.condition.predicate(pokemon)) && + (e.preFormKey === null || e.preFormKey === pokemon.getFormKey()), + ).length && + pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return null; - } else if (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + } + if ( + pokemon.isFusion() && + pokemon.fusionSpecies && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && + pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter( + e => + e.item === this.evolutionItem && + (!e.condition || e.condition.predicate(pokemon)) && + (e.preFormKey === null || e.preFormKey === pokemon.getFusionFormKey()), + ).length && + pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return null; } return PartyUiHandler.NoEffectMessage; - }); + }, + ); this.evolutionItem = evolutionItem; } @@ -893,7 +1251,7 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge } getPregenArgs(): any[] { - return [ this.evolutionItem ]; + return [this.evolutionItem]; } } @@ -904,21 +1262,30 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G public formChangeItem: FormChangeItem; constructor(formChangeItem: FormChangeItem) { - super("", FormChangeItem[formChangeItem].toLowerCase(), (_type, args) => new PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), + super( + "", + FormChangeItem[formChangeItem].toLowerCase(), + (_type, args) => new PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), (pokemon: PlayerPokemon) => { // Make sure the Pokemon has alternate forms - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) + if ( + pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && (fc.preFormKey === pokemon.getFormKey())) - // Returns true if any form changes match this item - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .flat().flatMap(fc => fc.item).includes(this.formChangeItem) + pokemonFormChanges[pokemon.species.speciesId] + .filter( + fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && fc.preFormKey === pokemon.getFormKey(), + ) + // Returns true if any form changes match this item + .flatMap(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flatMap(fc => fc.item) + .includes(this.formChangeItem) ) { return null; } return PartyUiHandler.NoEffectMessage; - }); + }, + ); this.formChangeItem = formChangeItem; } @@ -932,19 +1299,23 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G } getPregenArgs(): any[] { - return [ this.formChangeItem ]; + return [this.formChangeItem]; } } export class FusePokemonModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (_type, args) => new FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), + super( + localeKey, + iconImage, + (_type, args) => new FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { if (pokemon.isFusion()) { return PartyUiHandler.NoEffectMessage; } return null; - }); + }, + ); } getDescription(): string { @@ -955,11 +1326,17 @@ export class FusePokemonModifierType extends PokemonModifierType { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in PokemonType)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in PokemonType) { return new AttackTypeBoosterModifierType(pregenArgs[0] as PokemonType, 20); } - const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); + const attackMoveTypes = party.flatMap(p => + p + .getMoveset() + .map(m => m?.getMove()) + .filter(m => m instanceof AttackMove) + .map(m => m.type), + ); if (!attackMoveTypes.length) { return null; } @@ -968,7 +1345,8 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { let totalWeight = 0; for (const t of attackMoveTypes) { if (attackMoveTypeWeights.has(t)) { - if (attackMoveTypeWeights.get(t)! < 3) { // attackMoveTypeWeights.has(t) was checked before + if (attackMoveTypeWeights.get(t)! < 3) { + // attackMoveTypeWeights.has(t) was checked before attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t)! + 1); } else { continue; @@ -1009,7 +1387,7 @@ class BaseStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { [Stat.DEF]: "iron", [Stat.SPATK]: "calcium", [Stat.SPDEF]: "zinc", - [Stat.SPD]: "carbos" + [Stat.SPD]: "carbos", }; constructor() { @@ -1030,12 +1408,12 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator { [Stat.SPATK]: "x_sp_atk", [Stat.SPDEF]: "x_sp_def", [Stat.SPD]: "x_speed", - [Stat.ACC]: "x_accuracy" + [Stat.ACC]: "x_accuracy", }; constructor() { super((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && TEMP_BATTLE_STATS.includes(pregenArgs[0])) { + if (pregenArgs && pregenArgs.length === 1 && TEMP_BATTLE_STATS.includes(pregenArgs[0])) { return new TempStatStageBoosterModifierType(pregenArgs[0]); } const randStat: TempBattleStat = randSeedInt(Stat.ACC, Stat.ATK); @@ -1053,16 +1431,32 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator { class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { /** Object comprised of the currently available species-based stat boosting held items */ public static readonly items = { - LIGHT_BALL: { stats: [ Stat.ATK, Stat.SPATK ], multiplier: 2, species: [ Species.PIKACHU ]}, - THICK_CLUB: { stats: [ Stat.ATK ], multiplier: 2, species: [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]}, - METAL_POWDER: { stats: [ Stat.DEF ], multiplier: 2, species: [ Species.DITTO ]}, - QUICK_POWDER: { stats: [ Stat.SPD ], multiplier: 2, species: [ Species.DITTO ]}, + LIGHT_BALL: { + stats: [Stat.ATK, Stat.SPATK], + multiplier: 2, + species: [Species.PIKACHU], + }, + THICK_CLUB: { + stats: [Stat.ATK], + multiplier: 2, + species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK], + }, + METAL_POWDER: { + stats: [Stat.DEF], + multiplier: 2, + species: [Species.DITTO], + }, + QUICK_POWDER: { + stats: [Stat.SPD], + multiplier: 2, + species: [Species.DITTO], + }, }; constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { const items = SpeciesStatBoosterModifierTypeGenerator.items; - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in items)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in items) { return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); } @@ -1081,8 +1475,13 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { const checkedStats = values[i].stats; // If party member already has the item being weighted currently, skip to the next item - const hasItem = p.getHeldItems().some(m => m instanceof SpeciesStatBoosterModifier - && (m as SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0])); + const hasItem = p + .getHeldItems() + .some( + m => + m instanceof SpeciesStatBoosterModifier && + (m as SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0]), + ); if (!hasItem) { if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) { @@ -1124,14 +1523,20 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in Moves) { return new TmModifierType(pregenArgs[0] as Moves); } const partyMemberCompatibleTms = party.map(p => { const previousLevelMoves = p.getLearnableLevelMoves(); - return (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm) && !previousLevelMoves.find(lm=>lm === tm)); + return (p as PlayerPokemon).compatibleTms.filter( + tm => !p.moveset.find(m => m?.moveId === tm) && !previousLevelMoves.find(lm => lm === tm), + ); }); - const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); + const tierUniqueCompatibleTms = partyMemberCompatibleTms + .flat() + .filter(tm => tmPoolTiers[tm] === tier) + .filter(tm => !allMoves[tm].name.endsWith(" (N)")) + .filter((tm, i, array) => array.indexOf(tm) === i); if (!tierUniqueCompatibleTms.length) { return null; } @@ -1144,20 +1549,49 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in EvolutionItem)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in EvolutionItem) { return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); } const evolutionItemPool = [ - party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId) && (!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE)).map(p => { - const evolutions = pokemonEvolutions[p.species.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); - }).flat(), - party.filter(p => p.isFusion() && p.fusionSpecies && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) && (!p.pauseEvolutions || p.fusionSpecies.speciesId === Species.SLOWPOKE || p.fusionSpecies.speciesId === Species.EEVEE)).map(p => { - const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); - }).flat() - ].flat().flatMap(e => e.item).filter(i => (!!i && i > 50) === rare); + party + .filter( + p => + pokemonEvolutions.hasOwnProperty(p.species.speciesId) && + (!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE), + ) + .flatMap(p => { + const evolutions = pokemonEvolutions[p.species.speciesId]; + return evolutions.filter( + e => + e.item !== EvolutionItem.NONE && + (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && + (!e.condition || e.condition.predicate(p)), + ); + }), + party + .filter( + p => + p.isFusion() && + p.fusionSpecies && + pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) && + (!p.pauseEvolutions || + p.fusionSpecies.speciesId === Species.SLOWPOKE || + p.fusionSpecies.speciesId === Species.EEVEE), + ) + .flatMap(p => { + const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; + return evolutions.filter( + e => + e.item !== EvolutionItem.NONE && + (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && + (!e.condition || e.condition.predicate(p)), + ); + }), + ] + .flat() + .flatMap(e => e.item) + .filter(i => (!!i && i > 50) === rare); if (!evolutionItemPool.length) { return null; @@ -1171,48 +1605,77 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(isRareFormChangeItem: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in FormChangeItem) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); } - const formChangeItemPool = [ ...new Set(party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { - const formChanges = pokemonFormChanges[p.species.speciesId]; - let formChangeItemTriggers = formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || globalScene.getModifiers(MegaEvolutionAccessModifier).length) - && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || globalScene.getModifiers(GigantamaxAccessModifier).length) - && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length) - && (fc.preFormKey === p.getFormKey())) - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .filter(t => t && t.active && !globalScene.findModifier(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); + const formChangeItemPool = [ + ...new Set( + party + .filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)) + .flatMap(p => { + const formChanges = pokemonFormChanges[p.species.speciesId]; + let formChangeItemTriggers = formChanges + .filter( + fc => + ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && + fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || + globalScene.getModifiers(MegaEvolutionAccessModifier).length) && + ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && + fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || + globalScene.getModifiers(GigantamaxAccessModifier).length) && + (!fc.conditions.length || + fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)) + .length) && + fc.preFormKey === p.getFormKey(), + ) + .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .filter( + t => + t?.active && + !globalScene.findModifier( + m => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === p.id && + m.formChangeItem === t.item, + ), + ); - if (p.species.speciesId === Species.NECROZMA) { - // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... - let foundULTRA_Z = false, - foundN_LUNA = false, - foundN_SOLAR = false; - formChangeItemTriggers.forEach((fc, _i) => { - console.log("Checking ", fc.item); - switch (fc.item) { - case FormChangeItem.ULTRANECROZIUM_Z: - foundULTRA_Z = true; - break; - case FormChangeItem.N_LUNARIZER: - foundN_LUNA = true; - break; - case FormChangeItem.N_SOLARIZER: - foundN_SOLAR = true; - break; - } - }); - if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { - // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. - formChangeItemTriggers = formChangeItemTriggers.filter(fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z); - } else { - console.log("DID NOT FIND "); - } - } - return formChangeItemTriggers; - }).flat()) - ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === isRareFormChangeItem); + if (p.species.speciesId === Species.NECROZMA) { + // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... + let foundULTRA_Z = false, + foundN_LUNA = false, + foundN_SOLAR = false; + formChangeItemTriggers.forEach((fc, _i) => { + console.log("Checking ", fc.item); + switch (fc.item) { + case FormChangeItem.ULTRANECROZIUM_Z: + foundULTRA_Z = true; + break; + case FormChangeItem.N_LUNARIZER: + foundN_LUNA = true; + break; + case FormChangeItem.N_SOLARIZER: + foundN_SOLAR = true; + break; + } + }); + if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { + // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. + formChangeItemTriggers = formChangeItemTriggers.filter( + fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z, + ); + } else { + console.log("DID NOT FIND "); + } + } + return formChangeItemTriggers; + }), + ), + ] + .flat() + .flatMap(fc => fc.item) + .filter(i => (i && i < 100) === isRareFormChangeItem); // convert it into a set to remove duplicate values, which can appear when the same species with a potential form change is in the party. if (!formChangeItemPool.length) { @@ -1228,19 +1691,33 @@ export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemMo private chancePercent: number; constructor(localeKey: string, iconImage: string, chancePercent: number, group?: string, soundName?: string) { - super(localeKey, iconImage, (type, args) => new ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), group, soundName); + super( + localeKey, + iconImage, + (type, args) => new ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), + group, + soundName, + ); this.chancePercent = chancePercent; } getDescription(): string { - return i18next.t("modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description", { chancePercent: this.chancePercent }); + return i18next.t("modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description", { + chancePercent: this.chancePercent, + }); } } export class TurnHeldItemTransferModifierType extends PokemonHeldItemModifierType { constructor(localeKey: string, iconImage: string, group?: string, soundName?: string) { - super(localeKey, iconImage, (type, args) => new TurnHeldItemTransferModifier(type, (args[0] as Pokemon).id), group, soundName); + super( + localeKey, + iconImage, + (type, args) => new TurnHeldItemTransferModifier(type, (args[0] as Pokemon).id), + group, + soundName, + ); } getDescription(): string { @@ -1253,7 +1730,12 @@ export class EnemyAttackStatusEffectChanceModifierType extends ModifierType { private effect: StatusEffect; constructor(localeKey: string, iconImage: string, chancePercent: number, effect: StatusEffect, stackCount?: number) { - super(localeKey, iconImage, (type, _args) => new EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent, stackCount), "enemy_status_chance"); + super( + localeKey, + iconImage, + (type, _args) => new EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent, stackCount), + "enemy_status_chance", + ); this.chancePercent = chancePercent; this.effect = effect; @@ -1277,7 +1759,9 @@ export class EnemyEndureChanceModifierType extends ModifierType { } getDescription(): string { - return i18next.t("modifierType:ModifierType.EnemyEndureChanceModifierType.description", { chancePercent: this.chancePercent }); + return i18next.t("modifierType:ModifierType.EnemyEndureChanceModifierType.description", { + chancePercent: this.chancePercent, + }); } } @@ -1293,7 +1777,7 @@ type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: number) = */ function skipInClassicAfterWave(wave: number, defaultWeight: number): WeightedModifierTypeWeightFunc { return () => { - const gameMode = globalScene.gameMode; + const gameMode = globalScene.gameMode; const currentWave = globalScene.currentBattle.waveIndex; return gameMode.isClassic && currentWave >= wave ? 0 : defaultWeight; }; @@ -1305,7 +1789,7 @@ function skipInClassicAfterWave(wave: number, defaultWeight: number): WeightedMo * @param defaultWeight ModifierType default weight * @returns A WeightedModifierTypeWeightFunc */ -function skipInLastClassicWaveOrDefault(defaultWeight: number) : WeightedModifierTypeWeightFunc { +function skipInLastClassicWaveOrDefault(defaultWeight: number): WeightedModifierTypeWeightFunc { return skipInClassicAfterWave(199, defaultWeight); } @@ -1319,7 +1803,11 @@ function skipInLastClassicWaveOrDefault(defaultWeight: number) : WeightedModifie function lureWeightFunc(maxBattles: number, weight: number): WeightedModifierTypeWeightFunc { return () => { const lures = globalScene.getModifiers(DoubleBattleChanceBoosterModifier); - return !(globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 199) && (lures.length === 0 || lures.filter(m => m.getMaxBattles() === maxBattles && m.getBattleCount() >= maxBattles * 0.6).length === 0) ? weight : 0; + return !(globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 199) && + (lures.length === 0 || + lures.filter(m => m.getMaxBattles() === maxBattles && m.getBattleCount() >= maxBattles * 0.6).length === 0) + ? weight + : 0; }; } class WeightedModifierType { @@ -1327,7 +1815,11 @@ class WeightedModifierType { public weight: number | WeightedModifierTypeWeightFunc; public maxWeight: number | WeightedModifierTypeWeightFunc; - constructor(modifierTypeFunc: ModifierTypeFunc, weight: number | WeightedModifierTypeWeightFunc, maxWeight?: number | WeightedModifierTypeWeightFunc) { + constructor( + modifierTypeFunc: ModifierTypeFunc, + weight: number | WeightedModifierTypeWeightFunc, + maxWeight?: number | WeightedModifierTypeWeightFunc, + ) { this.modifierType = modifierTypeFunc(); this.modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc)!; // TODO: is this bang correct? this.weight = weight; @@ -1406,20 +1898,42 @@ export const modifierTypes = { FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false), RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true), - EVOLUTION_TRACKER_GIMMIGHOUL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL", "relic_gold", - (type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, Species.GIMMIGHOUL, 10)), + EVOLUTION_TRACKER_GIMMIGHOUL: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL", + "relic_gold", + (type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, Species.GIMMIGHOUL, 10), + ), - MEGA_BRACELET: () => new ModifierType("modifierType:ModifierType.MEGA_BRACELET", "mega_bracelet", (type, _args) => new MegaEvolutionAccessModifier(type)), - DYNAMAX_BAND: () => new ModifierType("modifierType:ModifierType.DYNAMAX_BAND", "dynamax_band", (type, _args) => new GigantamaxAccessModifier(type)), - TERA_ORB: () => new ModifierType("modifierType:ModifierType.TERA_ORB", "tera_orb", (type, _args) => new TerastallizeAccessModifier(type)), + MEGA_BRACELET: () => + new ModifierType( + "modifierType:ModifierType.MEGA_BRACELET", + "mega_bracelet", + (type, _args) => new MegaEvolutionAccessModifier(type), + ), + DYNAMAX_BAND: () => + new ModifierType( + "modifierType:ModifierType.DYNAMAX_BAND", + "dynamax_band", + (type, _args) => new GigantamaxAccessModifier(type), + ), + TERA_ORB: () => + new ModifierType( + "modifierType:ModifierType.TERA_ORB", + "tera_orb", + (type, _args) => new TerastallizeAccessModifier(type), + ), MAP: () => new ModifierType("modifierType:ModifierType.MAP", "map", (type, _args) => new MapModifier(type)), POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.POTION", "potion", 20, 10), - SUPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.SUPER_POTION", "super_potion", 50, 25), - HYPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), + SUPER_POTION: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.SUPER_POTION", "super_potion", 50, 25), + HYPER_POTION: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), MAX_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.MAX_POTION", "max_potion", 0, 100), - FULL_RESTORE: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), + FULL_RESTORE: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.REVIVE", "revive", 50), MAX_REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.MAX_REVIVE", "max_revive", 100), @@ -1428,8 +1942,18 @@ export const modifierTypes = { SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"), - REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), - WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)), + REVIVER_SEED: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.REVIVER_SEED", + "reviver_seed", + (type, args) => new PokemonInstantReviveModifier(type, (args[0] as Pokemon).id), + ), + WHITE_HERB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.WHITE_HERB", + "white_herb", + (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id), + ), ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10), MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1), @@ -1452,68 +1976,72 @@ export const modifierTypes = { TEMP_STAT_STAGE_BOOSTER: () => new TempStatStageBoosterModifierTypeGenerator(), - DIRE_HIT: () => new class extends ModifierType { - getDescription(): string { - return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { - stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises"), - amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage") - }); - } - }("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new TempCritBoosterModifier(type, 5)), + DIRE_HIT: () => + new (class extends ModifierType { + getDescription(): string { + return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { + stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises"), + amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage"), + }); + } + })("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new TempCritBoosterModifier(type, 5)), BASE_STAT_BOOSTER: () => new BaseStatBoosterModifierTypeGenerator(), ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), - MINT: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) { - return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); - } - return new PokemonNatureChangeModifierType(randSeedInt(getEnumValues(Nature).length) as Nature); - }), - - TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in PokemonType)) { - return new TerastallizeModifierType(pregenArgs[0] as PokemonType); - } - if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { - return null; - } - const teraTypes: PokemonType[] = []; - party.forEach(p => { - if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { - teraTypes.push(p.teraType); + MINT: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in Nature) { + return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); } - }); - let excludedType = PokemonType.UNKNOWN; - if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { - excludedType = teraTypes[0]; - } - let shardType = randSeedInt(64) ? randSeedInt(18) as PokemonType : PokemonType.STELLAR; - while (shardType === excludedType) { - shardType = randSeedInt(64) ? randSeedInt(18) as PokemonType : PokemonType.STELLAR; - } - return new TerastallizeModifierType(shardType); - }), + return new PokemonNatureChangeModifierType(randSeedInt(getEnumValues(Nature).length) as Nature); + }), - BERRY: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in BerryType)) { - return new BerryModifierType(pregenArgs[0] as BerryType); - } - const berryTypes = getEnumValues(BerryType); - let randBerryType: BerryType; - const rand = randSeedInt(12); - if (rand < 2) { - randBerryType = BerryType.SITRUS; - } else if (rand < 4) { - randBerryType = BerryType.LUM; - } else if (rand < 6) { - randBerryType = BerryType.LEPPA; - } else { - randBerryType = berryTypes[randSeedInt(berryTypes.length - 3) + 2]; - } - return new BerryModifierType(randBerryType); - }), + TERA_SHARD: () => + new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in PokemonType) { + return new TerastallizeModifierType(pregenArgs[0] as PokemonType); + } + if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { + return null; + } + const teraTypes: PokemonType[] = []; + for (const p of party) { + if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { + teraTypes.push(p.teraType); + } + } + let excludedType = PokemonType.UNKNOWN; + if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { + excludedType = teraTypes[0]; + } + let shardType = randSeedInt(64) ? (randSeedInt(18) as PokemonType) : PokemonType.STELLAR; + while (shardType === excludedType) { + shardType = randSeedInt(64) ? (randSeedInt(18) as PokemonType) : PokemonType.STELLAR; + } + return new TerastallizeModifierType(shardType); + }), + + BERRY: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in BerryType) { + return new BerryModifierType(pregenArgs[0] as BerryType); + } + const berryTypes = getEnumValues(BerryType); + let randBerryType: BerryType; + const rand = randSeedInt(12); + if (rand < 2) { + randBerryType = BerryType.SITRUS; + } else if (rand < 4) { + randBerryType = BerryType.LUM; + } else if (rand < 6) { + randBerryType = BerryType.LEPPA; + } else { + randBerryType = berryTypes[randSeedInt(berryTypes.length - 3) + 2]; + } + return new BerryModifierType(randBerryType); + }), TM_COMMON: () => new TmModifierTypeGenerator(ModifierTier.COMMON), TM_GREAT: () => new TmModifierTypeGenerator(ModifierTier.GREAT), @@ -1521,113 +2049,343 @@ export const modifierTypes = { MEMORY_MUSHROOM: () => new RememberMoveModifierType("modifierType:ModifierType.MEMORY_MUSHROOM", "big_mushroom"), - EXP_SHARE: () => new ModifierType("modifierType:ModifierType.EXP_SHARE", "exp_share", (type, _args) => new ExpShareModifier(type)), - EXP_BALANCE: () => new ModifierType("modifierType:ModifierType.EXP_BALANCE", "exp_balance", (type, _args) => new ExpBalanceModifier(type)), + EXP_SHARE: () => + new ModifierType("modifierType:ModifierType.EXP_SHARE", "exp_share", (type, _args) => new ExpShareModifier(type)), + EXP_BALANCE: () => + new ModifierType( + "modifierType:ModifierType.EXP_BALANCE", + "exp_balance", + (type, _args) => new ExpBalanceModifier(type), + ), - OVAL_CHARM: () => new ModifierType("modifierType:ModifierType.OVAL_CHARM", "oval_charm", (type, _args) => new MultipleParticipantExpBonusModifier(type)), + OVAL_CHARM: () => + new ModifierType( + "modifierType:ModifierType.OVAL_CHARM", + "oval_charm", + (type, _args) => new MultipleParticipantExpBonusModifier(type), + ), EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.EXP_CHARM", "exp_charm", 25), SUPER_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.SUPER_EXP_CHARM", "super_exp_charm", 60), - GOLDEN_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EXP_CHARM", "golden_exp_charm", 100), + GOLDEN_EXP_CHARM: () => + new ExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EXP_CHARM", "golden_exp_charm", 100), LUCKY_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.LUCKY_EGG", "lucky_egg", 40), GOLDEN_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EGG", "golden_egg", 100), SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), - SCOPE_LENS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SCOPE_LENS", "scope_lens", (type, args) => new CritBoosterModifier(type, (args[0] as Pokemon).id, 1)), - LEEK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEEK", "leek", (type, args) => new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ])), + SCOPE_LENS: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SCOPE_LENS", + "scope_lens", + (type, args) => new CritBoosterModifier(type, (args[0] as Pokemon).id, 1), + ), + LEEK: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.LEEK", + "leek", + (type, args) => + new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [ + Species.FARFETCHD, + Species.GALAR_FARFETCHD, + Species.SIRFETCHD, + ]), + ), - EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [ Stat.DEF, Stat.SPDEF ], 1.5)), + EVIOLITE: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.EVIOLITE", + "eviolite", + (type, args) => new EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5), + ), - SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), + SOUL_DEW: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SOUL_DEW", + "soul_dew", + (type, args) => new PokemonNatureWeightModifier(type, (args[0] as Pokemon).id), + ), - NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), - BIG_NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.BIG_NUGGET", "big_nugget", 2.5, "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate"), - RELIC_GOLD: () => new MoneyRewardModifierType("modifierType:ModifierType.RELIC_GOLD", "relic_gold", 10, "modifierType:ModifierType.MoneyRewardModifierType.extra.large"), + NUGGET: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.NUGGET", + "nugget", + 1, + "modifierType:ModifierType.MoneyRewardModifierType.extra.small", + ), + BIG_NUGGET: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.BIG_NUGGET", + "big_nugget", + 2.5, + "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate", + ), + RELIC_GOLD: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.RELIC_GOLD", + "relic_gold", + 10, + "modifierType:ModifierType.MoneyRewardModifierType.extra.large", + ), - AMULET_COIN: () => new ModifierType("modifierType:ModifierType.AMULET_COIN", "amulet_coin", (type, _args) => new MoneyMultiplierModifier(type)), - GOLDEN_PUNCH: () => new PokemonHeldItemModifierType("modifierType:ModifierType.GOLDEN_PUNCH", "golden_punch", (type, args) => new DamageMoneyRewardModifier(type, (args[0] as Pokemon).id)), - COIN_CASE: () => new ModifierType("modifierType:ModifierType.COIN_CASE", "coin_case", (type, _args) => new MoneyInterestModifier(type)), + AMULET_COIN: () => + new ModifierType( + "modifierType:ModifierType.AMULET_COIN", + "amulet_coin", + (type, _args) => new MoneyMultiplierModifier(type), + ), + GOLDEN_PUNCH: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.GOLDEN_PUNCH", + "golden_punch", + (type, args) => new DamageMoneyRewardModifier(type, (args[0] as Pokemon).id), + ), + COIN_CASE: () => + new ModifierType( + "modifierType:ModifierType.COIN_CASE", + "coin_case", + (type, _args) => new MoneyInterestModifier(type), + ), - LOCK_CAPSULE: () => new ModifierType("modifierType:ModifierType.LOCK_CAPSULE", "lock_capsule", (type, _args) => new LockModifierTiersModifier(type)), + LOCK_CAPSULE: () => + new ModifierType( + "modifierType:ModifierType.LOCK_CAPSULE", + "lock_capsule", + (type, _args) => new LockModifierTiersModifier(type), + ), - GRIP_CLAW: () => new ContactHeldItemTransferChanceModifierType("modifierType:ModifierType.GRIP_CLAW", "grip_claw", 10), + GRIP_CLAW: () => + new ContactHeldItemTransferChanceModifierType("modifierType:ModifierType.GRIP_CLAW", "grip_claw", 10), WIDE_LENS: () => new PokemonMoveAccuracyBoosterModifierType("modifierType:ModifierType.WIDE_LENS", "wide_lens", 5), MULTI_LENS: () => new PokemonMultiHitModifierType("modifierType:ModifierType.MULTI_LENS", "zoom_lens"), - HEALING_CHARM: () => new ModifierType("modifierType:ModifierType.HEALING_CHARM", "healing_charm", (type, _args) => new HealingBoosterModifier(type, 1.1)), - CANDY_JAR: () => new ModifierType("modifierType:ModifierType.CANDY_JAR", "candy_jar", (type, _args) => new LevelIncrementBoosterModifier(type)), + HEALING_CHARM: () => + new ModifierType( + "modifierType:ModifierType.HEALING_CHARM", + "healing_charm", + (type, _args) => new HealingBoosterModifier(type, 1.1), + ), + CANDY_JAR: () => + new ModifierType( + "modifierType:ModifierType.CANDY_JAR", + "candy_jar", + (type, _args) => new LevelIncrementBoosterModifier(type), + ), - BERRY_POUCH: () => new ModifierType("modifierType:ModifierType.BERRY_POUCH", "berry_pouch", (type, _args) => new PreserveBerryModifier(type)), + BERRY_POUCH: () => + new ModifierType( + "modifierType:ModifierType.BERRY_POUCH", + "berry_pouch", + (type, _args) => new PreserveBerryModifier(type), + ), - FOCUS_BAND: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FOCUS_BAND", "focus_band", (type, args) => new SurviveDamageModifier(type, (args[0] as Pokemon).id)), + FOCUS_BAND: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.FOCUS_BAND", + "focus_band", + (type, args) => new SurviveDamageModifier(type, (args[0] as Pokemon).id), + ), - QUICK_CLAW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.QUICK_CLAW", "quick_claw", (type, args) => new BypassSpeedChanceModifier(type, (args[0] as Pokemon).id)), + QUICK_CLAW: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.QUICK_CLAW", + "quick_claw", + (type, args) => new BypassSpeedChanceModifier(type, (args[0] as Pokemon).id), + ), - KINGS_ROCK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.KINGS_ROCK", "kings_rock", (type, args) => new FlinchChanceModifier(type, (args[0] as Pokemon).id)), + KINGS_ROCK: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.KINGS_ROCK", + "kings_rock", + (type, args) => new FlinchChanceModifier(type, (args[0] as Pokemon).id), + ), - LEFTOVERS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEFTOVERS", "leftovers", (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id)), - SHELL_BELL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SHELL_BELL", "shell_bell", (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id)), + LEFTOVERS: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.LEFTOVERS", + "leftovers", + (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id), + ), + SHELL_BELL: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SHELL_BELL", + "shell_bell", + (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id), + ), - TOXIC_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.TOXIC_ORB", "toxic_orb", (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), - FLAME_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FLAME_ORB", "flame_orb", (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), + TOXIC_ORB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.TOXIC_ORB", + "toxic_orb", + (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id), + ), + FLAME_ORB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.FLAME_ORB", + "flame_orb", + (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id), + ), - BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "baton", (type, args) => new SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), + BATON: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.BATON", + "baton", + (type, args) => new SwitchEffectTransferModifier(type, (args[0] as Pokemon).id), + ), - SHINY_CHARM: () => new ModifierType("modifierType:ModifierType.SHINY_CHARM", "shiny_charm", (type, _args) => new ShinyRateBoosterModifier(type)), - ABILITY_CHARM: () => new ModifierType("modifierType:ModifierType.ABILITY_CHARM", "ability_charm", (type, _args) => new HiddenAbilityRateBoosterModifier(type)), - CATCHING_CHARM: () => new ModifierType("modifierType:ModifierType.CATCHING_CHARM", "catching_charm", (type, _args) => new CriticalCatchChanceBoosterModifier(type)), + SHINY_CHARM: () => + new ModifierType( + "modifierType:ModifierType.SHINY_CHARM", + "shiny_charm", + (type, _args) => new ShinyRateBoosterModifier(type), + ), + ABILITY_CHARM: () => + new ModifierType( + "modifierType:ModifierType.ABILITY_CHARM", + "ability_charm", + (type, _args) => new HiddenAbilityRateBoosterModifier(type), + ), + CATCHING_CHARM: () => + new ModifierType( + "modifierType:ModifierType.CATCHING_CHARM", + "catching_charm", + (type, _args) => new CriticalCatchChanceBoosterModifier(type), + ), - IV_SCANNER: () => new ModifierType("modifierType:ModifierType.IV_SCANNER", "scanner", (type, _args) => new IvScannerModifier(type)), + IV_SCANNER: () => + new ModifierType("modifierType:ModifierType.IV_SCANNER", "scanner", (type, _args) => new IvScannerModifier(type)), DNA_SPLICERS: () => new FusePokemonModifierType("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"), - MINI_BLACK_HOLE: () => new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), + MINI_BLACK_HOLE: () => + new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), VOUCHER: () => new AddVoucherModifierType(VoucherType.REGULAR, 1), VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), - GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new ExtraModifierModifier(type), undefined, "se/pb_bounce_1"), - SILVER_POKEBALL: () => new ModifierType("modifierType:ModifierType.SILVER_POKEBALL", "pb_silver", (type, _args) => new TempExtraModifierModifier(type, 100), undefined, "se/pb_bounce_1"), + GOLDEN_POKEBALL: () => + new ModifierType( + "modifierType:ModifierType.GOLDEN_POKEBALL", + "pb_gold", + (type, _args) => new ExtraModifierModifier(type), + undefined, + "se/pb_bounce_1", + ), + SILVER_POKEBALL: () => + new ModifierType( + "modifierType:ModifierType.SILVER_POKEBALL", + "pb_silver", + (type, _args) => new TempExtraModifierModifier(type, 100), + undefined, + "se/pb_bounce_1", + ), - ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new EnemyDamageBoosterModifier(type, 5)), - ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new EnemyDamageReducerModifier(type, 2.5)), + ENEMY_DAMAGE_BOOSTER: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", + "wl_item_drop", + (type, _args) => new EnemyDamageBoosterModifier(type, 5), + ), + ENEMY_DAMAGE_REDUCTION: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", + "wl_guard_spec", + (type, _args) => new EnemyDamageReducerModifier(type, 2.5), + ), //ENEMY_SUPER_EFFECT_BOOSTER: () => new ModifierType('Type Advantage Token', 'Increases damage of super effective attacks by 30%', (type, _args) => new EnemySuperEffectiveDamageBoosterModifier(type, 30), 'wl_custom_super_effective'), - ENEMY_HEAL: () => new ModifierType("modifierType:ModifierType.ENEMY_HEAL", "wl_potion", (type, _args) => new EnemyTurnHealModifier(type, 2, 10)), - ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", "wl_antidote", 5, StatusEffect.POISON, 10), - ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", "wl_paralyze_heal", 2.5, StatusEffect.PARALYSIS, 10), - ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", "wl_burn_heal", 5, StatusEffect.BURN, 10), - ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new EnemyStatusEffectHealChanceModifier(type, 2.5, 10)), - ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2), - ENEMY_FUSED_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_FUSED_CHANCE", "wl_custom_spliced", (type, _args) => new EnemyFusionChanceModifier(type, 1)), + ENEMY_HEAL: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_HEAL", + "wl_potion", + (type, _args) => new EnemyTurnHealModifier(type, 2, 10), + ), + ENEMY_ATTACK_POISON_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", + "wl_antidote", + 5, + StatusEffect.POISON, + 10, + ), + ENEMY_ATTACK_PARALYZE_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", + "wl_paralyze_heal", + 2.5, + StatusEffect.PARALYSIS, + 10, + ), + ENEMY_ATTACK_BURN_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", + "wl_burn_heal", + 5, + StatusEffect.BURN, + 10, + ), + ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", + "wl_full_heal", + (type, _args) => new EnemyStatusEffectHealChanceModifier(type, 2.5, 10), + ), + ENEMY_ENDURE_CHANCE: () => + new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2), + ENEMY_FUSED_CHANCE: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_FUSED_CHANCE", + "wl_custom_spliced", + (type, _args) => new EnemyFusionChanceModifier(type, 1), + ), - MYSTERY_ENCOUNTER_SHUCKLE_JUICE: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new PokemonBaseStatTotalModifierType(pregenArgs[0] as number); - } - return new PokemonBaseStatTotalModifierType(randSeedInt(20, 1)); - }), - MYSTERY_ENCOUNTER_OLD_GATEAU: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new PokemonBaseStatFlatModifierType(pregenArgs[0] as number, pregenArgs[1] as Stat[]); - } - return new PokemonBaseStatFlatModifierType(randSeedInt(20, 1), [ Stat.HP, Stat.ATK, Stat.DEF ]); - }), - MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new HealShopCostModifier(type, pregenArgs[0] as number)); - } - return new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new HealShopCostModifier(type, 2.5)); - }), - MYSTERY_ENCOUNTER_MACHO_BRACE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", "macho_brace", (type, args) => new PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id)), - MYSTERY_ENCOUNTER_GOLDEN_BUG_NET: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET", "golden_net", (type, _args) => new BoostBugSpawnModifier(type)), + MYSTERY_ENCOUNTER_SHUCKLE_JUICE: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatTotalModifierType(pregenArgs[0] as number); + } + return new PokemonBaseStatTotalModifierType(randSeedInt(20, 1)); + }), + MYSTERY_ENCOUNTER_OLD_GATEAU: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatFlatModifierType(pregenArgs[0] as number, pregenArgs[1] as Stat[]); + } + return new PokemonBaseStatFlatModifierType(randSeedInt(20, 1), [Stat.HP, Stat.ATK, Stat.DEF]); + }), + MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", + "black_sludge", + (type, _args) => new HealShopCostModifier(type, pregenArgs[0] as number), + ); + } + return new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", + "black_sludge", + (type, _args) => new HealShopCostModifier(type, 2.5), + ); + }), + MYSTERY_ENCOUNTER_MACHO_BRACE: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", + "macho_brace", + (type, args) => new PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id), + ), + MYSTERY_ENCOUNTER_GOLDEN_BUG_NET: () => + new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET", + "golden_net", + (type, _args) => new BoostBugSpawnModifier(type), + ), }; interface ModifierPool { - [tier: string]: WeightedModifierType[] + [tier: string]: WeightedModifierType[]; } /** @@ -1636,220 +2394,422 @@ interface ModifierPool { * @returns boolean: true if the player has the maximum of a given ball type */ function hasMaximumBalls(ballType: PokeballType): boolean { - return (globalScene.gameMode.isClassic && globalScene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS); + return globalScene.gameMode.isClassic && globalScene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS; } const modifierPool: ModifierPool = { [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.POKEBALL, () => (hasMaximumBalls(PokeballType.POKEBALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.POKEBALL, () => (hasMaximumBalls(PokeballType.POKEBALL) ? 0 : 6), 6), new WeightedModifierType(modifierTypes.RARE_CANDY, 2), - new WeightedModifierType(modifierTypes.POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 10 && p.getHpRatio() <= 0.875) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.SUPER_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 25 && p.getHpRatio() <= 0.75) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) - && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) - && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount; - }, 3), + new WeightedModifierType( + modifierTypes.POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 10 && p.getHpRatio() <= 0.875 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.SUPER_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 25 && p.getHpRatio() <= 0.75 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.ETHER, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_ETHER, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), new WeightedModifierType(modifierTypes.LURE, lureWeightFunc(10, 2)), new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 2), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.GREAT_BALL, () => (hasMaximumBalls(PokeballType.GREAT_BALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.GREAT_BALL, () => (hasMaximumBalls(PokeballType.GREAT_BALL) ? 0 : 6), 6), new WeightedModifierType(modifierTypes.PP_UP, 2), - new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { - const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { - if (i instanceof TurnStatusEffectModifier) { - return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; - } - return false; - })).length, 3); - return statusEffectPartyMemberCount * 6; - }, 18), - new WeightedModifierType(modifierTypes.REVIVE, (party: Pokemon[]) => { - const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); - return faintedPartyMemberCount * 9; - }, 27), - new WeightedModifierType(modifierTypes.MAX_REVIVE, (party: Pokemon[]) => { - const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); - return faintedPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.SACRED_ASH, (party: Pokemon[]) => { - return party.filter(p => p.isFainted()).length >= Math.ceil(party.length / 2) ? 1 : 0; - }, 1), - new WeightedModifierType(modifierTypes.HYPER_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 100 && p.getHpRatio() <= 0.625) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.FULL_RESTORE, (party: Pokemon[]) => { - const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { - if (i instanceof TurnStatusEffectModifier) { - return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; - } - return false; - })).length, 3); - const thresholdPartyMemberCount = Math.floor((Math.min(party.filter(p => (p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5) && !p.isFainted()).length, 3) + statusEffectPartyMemberCount) / 2); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) - && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) - && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount; - }, 3), + new WeightedModifierType( + modifierTypes.FULL_HEAL, + (party: Pokemon[]) => { + const statusEffectPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !!p.status && + !p.getHeldItems().some(i => { + if (i instanceof TurnStatusEffectModifier) { + return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; + } + return false; + }), + ).length, + 3, + ); + return statusEffectPartyMemberCount * 6; + }, + 18, + ), + new WeightedModifierType( + modifierTypes.REVIVE, + (party: Pokemon[]) => { + const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); + return faintedPartyMemberCount * 9; + }, + 27, + ), + new WeightedModifierType( + modifierTypes.MAX_REVIVE, + (party: Pokemon[]) => { + const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); + return faintedPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.SACRED_ASH, + (party: Pokemon[]) => { + return party.filter(p => p.isFainted()).length >= Math.ceil(party.length / 2) ? 1 : 0; + }, + 1, + ), + new WeightedModifierType( + modifierTypes.HYPER_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.625 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.FULL_RESTORE, + (party: Pokemon[]) => { + const statusEffectPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !!p.status && + !p.getHeldItems().some(i => { + if (i instanceof TurnStatusEffectModifier) { + return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; + } + return false; + }), + ).length, + 3, + ); + const thresholdPartyMemberCount = Math.floor( + (Math.min(party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5 && !p.isFainted()).length, 3) + + statusEffectPartyMemberCount) / + 2, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.ELIXIR, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_ELIXIR, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), new WeightedModifierType(modifierTypes.DIRE_HIT, 4), new WeightedModifierType(modifierTypes.SUPER_LURE, lureWeightFunc(15, 4)), new WeightedModifierType(modifierTypes.NUGGET, skipInLastClassicWaveOrDefault(5)), - new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, () => { - return Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15), 8); - }, 8), - new WeightedModifierType(modifierTypes.MAP, () => globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex < 180 ? 2 : 0, 2), + new WeightedModifierType( + modifierTypes.EVOLUTION_ITEM, + () => { + return Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15), 8); + }, + 8, + ), + new WeightedModifierType( + modifierTypes.MAP, + () => (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex < 180 ? 2 : 0), + 2, + ), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 2), new WeightedModifierType(modifierTypes.TM_GREAT, 3), - new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { - if (!party.find(p => p.getLearnableLevelMoves().length)) { - return 0; - } - const highestPartyLevel = party.map(p => p.level).reduce((highestLevel: number, level: number) => Math.max(highestLevel, level), 1); - return Math.min(Math.ceil(highestPartyLevel / 20), 4); - }, 4), - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) => party.filter(p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))).length > 0 ? 1 : 0), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => { - if (party.filter(p => !p.fusionSpecies).length > 1) { - if (globalScene.gameMode.isSplicedOnly) { - return 4; - } else if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { - return 2; + new WeightedModifierType( + modifierTypes.MEMORY_MUSHROOM, + (party: Pokemon[]) => { + if (!party.find(p => p.getLearnableLevelMoves().length)) { + return 0; } - } - return 0; - }, 4), - new WeightedModifierType(modifierTypes.VOUCHER, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), + const highestPartyLevel = party + .map(p => p.level) + .reduce((highestLevel: number, level: number) => Math.max(highestLevel, level), 1); + return Math.min(Math.ceil(highestPartyLevel / 20), 4); + }, + 4, + ), + new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), + new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) => + party.filter( + p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA)), + ).length > 0 + ? 1 + : 0, + ), + new WeightedModifierType( + modifierTypes.DNA_SPLICERS, + (party: Pokemon[]) => { + if (party.filter(p => !p.fusionSpecies).length > 1) { + if (globalScene.gameMode.isSplicedOnly) { + return 4; + } + if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { + return 2; + } + } + return 0; + }, + 4, + ), + new WeightedModifierType( + modifierTypes.VOUCHER, + (_party: Pokemon[], rerollCount: number) => (!globalScene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0), + 1, + ), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ULTRA_BALL, () => (hasMaximumBalls(PokeballType.ULTRA_BALL)) ? 0 : 15, 15), + new WeightedModifierType(modifierTypes.ULTRA_BALL, () => (hasMaximumBalls(PokeballType.ULTRA_BALL) ? 0 : 15), 15), new WeightedModifierType(modifierTypes.MAX_LURE, lureWeightFunc(30, 4)), new WeightedModifierType(modifierTypes.BIG_NUGGET, skipInLastClassicWaveOrDefault(12)), new WeightedModifierType(modifierTypes.PP_MAX, 3), new WeightedModifierType(modifierTypes.MINT, 4), - new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15) * 4, 32), 32), - new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType( + modifierTypes.RARE_EVOLUTION_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15) * 4, 32), + 32, + ), + new WeightedModifierType( + modifierTypes.FORM_CHANGE_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, + 24, + ), new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { const { gameMode, gameData } = globalScene; if (gameMode.isDaily || (!gameMode.isFreshStartChallenge() && gameData.isUnlocked(Unlockables.EVIOLITE))) { return party.some(p => { // Check if Pokemon's species (or fusion species, if applicable) can evolve or if they're G-Max'd - if (!p.isMax() && ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions)))) { + if ( + !p.isMax() && + (p.getSpeciesForm(true).speciesId in pokemonEvolutions || + (p.isFusion() && p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions)) + ) { // Check if Pokemon is already holding an Eviolite return !p.getHeldItems().some(i => i.type.id === "EVIOLITE"); } return false; - }) ? 10 : 0; + }) + ? 10 + : 0; } return 0; }), new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), - new WeightedModifierType(modifierTypes.LEEK, (party: Pokemon[]) => { - const checkedSpecies = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; - // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof SpeciesCritBoosterModifier) - && (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) - || (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId)))) ? 12 : 0; - }, 12), - new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { - return party.some(p => { - const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + new WeightedModifierType( + modifierTypes.LEEK, + (party: Pokemon[]) => { + const checkedSpecies = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; + // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear + return party.some( + p => + !p.getHeldItems().some(i => i instanceof SpeciesCritBoosterModifier) && + (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) || + (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId))), + ) + ? 12 + : 0; + }, + 12, + ), + new WeightedModifierType( + modifierTypes.TOXIC_ORB, + (party: Pokemon[]) => { + return party.some(p => { + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); - if (!isHoldingOrb) { - const moveset = p.getMoveset(true).filter(m => !isNullOrUndefined(m)).map(m => m.moveId); - const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true); + if (!isHoldingOrb) { + const moveset = p + .getMoveset(true) + .filter(m => !isNullOrUndefined(m)) + .map(m => m.moveId); + const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true); - // Moves that take advantage of obtaining the actual status effect - const hasStatusMoves = [ Moves.FACADE, Moves.PSYCHO_SHIFT ] - .some(m => moveset.includes(m)); - // Moves that take advantage of being able to give the target a status orb - // TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented - const hasItemMoves = [ /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ ] - .some(m => moveset.includes(m)); + // Moves that take advantage of obtaining the actual status effect + const hasStatusMoves = [Moves.FACADE, Moves.PSYCHO_SHIFT].some(m => moveset.includes(m)); + // Moves that take advantage of being able to give the target a status orb + // TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented + const hasItemMoves = [ + /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ + ].some(m => moveset.includes(m)); - if (canSetStatus) { - // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb - const hasGeneralAbility = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.MAGIC_GUARD ] - .some(a => p.hasAbility(a, false, true)); - const hasSpecificAbility = [ Abilities.TOXIC_BOOST, Abilities.POISON_HEAL ] - .some(a => p.hasAbility(a, false, true)); - const hasOppositeAbility = [ Abilities.FLARE_BOOST ] - .some(a => p.hasAbility(a, false, true)); + if (canSetStatus) { + // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb + const hasGeneralAbility = [ + Abilities.QUICK_FEET, + Abilities.GUTS, + Abilities.MARVEL_SCALE, + Abilities.MAGIC_GUARD, + ].some(a => p.hasAbility(a, false, true)); + const hasSpecificAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a => + p.hasAbility(a, false, true), + ); + const hasOppositeAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true)); - return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; - } else { + return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; + } return hasItemMoves; } - } - return false; - }) ? 10 : 0; - }, 10), - new WeightedModifierType(modifierTypes.FLAME_ORB, (party: Pokemon[]) => { - return party.some(p => { - const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + return false; + }) + ? 10 + : 0; + }, + 10, + ), + new WeightedModifierType( + modifierTypes.FLAME_ORB, + (party: Pokemon[]) => { + return party.some(p => { + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); - if (!isHoldingOrb) { - const moveset = p.getMoveset(true).filter(m => !isNullOrUndefined(m)).map(m => m.moveId); - const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true); + if (!isHoldingOrb) { + const moveset = p + .getMoveset(true) + .filter(m => !isNullOrUndefined(m)) + .map(m => m.moveId); + const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true); - // Moves that take advantage of obtaining the actual status effect - const hasStatusMoves = [ Moves.FACADE, Moves.PSYCHO_SHIFT ] - .some(m => moveset.includes(m)); - // Moves that take advantage of being able to give the target a status orb - // TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented - const hasItemMoves = [ /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ ] - .some(m => moveset.includes(m)); + // Moves that take advantage of obtaining the actual status effect + const hasStatusMoves = [Moves.FACADE, Moves.PSYCHO_SHIFT].some(m => moveset.includes(m)); + // Moves that take advantage of being able to give the target a status orb + // TODO: Take moves (Trick, Fling, Switcheroo) from comment when they are implemented + const hasItemMoves = [ + /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ + ].some(m => moveset.includes(m)); - if (canSetStatus) { - // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb - const hasGeneralAbility = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.MAGIC_GUARD ] - .some(a => p.hasAbility(a, false, true)); - const hasSpecificAbility = [ Abilities.FLARE_BOOST ] - .some(a => p.hasAbility(a, false, true)); - const hasOppositeAbility = [ Abilities.TOXIC_BOOST, Abilities.POISON_HEAL ] - .some(a => p.hasAbility(a, false, true)); + if (canSetStatus) { + // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb + const hasGeneralAbility = [ + Abilities.QUICK_FEET, + Abilities.GUTS, + Abilities.MARVEL_SCALE, + Abilities.MAGIC_GUARD, + ].some(a => p.hasAbility(a, false, true)); + const hasSpecificAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true)); + const hasOppositeAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a => + p.hasAbility(a, false, true), + ); - return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; - } else { + return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; + } return hasItemMoves; } - } - return false; - }) ? 10 : 0; - }, 10), + return false; + }) + ? 10 + : 0; + }, + 10, + ), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1859,14 +2819,22 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.TERA_ORB, () => !globalScene.gameMode.isClassic ? Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4) : 0, 4), + new WeightedModifierType( + modifierTypes.TERA_ORB, + () => + !globalScene.gameMode.isClassic + ? Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4) + : 0, + 4, + ), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.ROGUE_BALL, () => (hasMaximumBalls(PokeballType.ROGUE_BALL)) ? 0 : 16, 16), + new WeightedModifierType(modifierTypes.ROGUE_BALL, () => (hasMaximumBalls(PokeballType.ROGUE_BALL) ? 0 : 16), 16), new WeightedModifierType(modifierTypes.RELIC_GOLD, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.LEFTOVERS, 3), new WeightedModifierType(modifierTypes.SHELL_BELL, 3), @@ -1875,79 +2843,119 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), - new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => !globalScene.gameMode.isClassic ? 4 : 0, 4), + new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => (!globalScene.gameMode.isClassic ? 4 : 0), 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), - new WeightedModifierType(modifierTypes.LOCK_CAPSULE, () => globalScene.gameMode.isClassic ? 0 : 3), + new WeightedModifierType(modifierTypes.LOCK_CAPSULE, () => (globalScene.gameMode.isClassic ? 0 : 3)), new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)), - new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, 24), - new WeightedModifierType(modifierTypes.MEGA_BRACELET, () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.DYNAMAX_BAND, () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), + new WeightedModifierType( + modifierTypes.RARE_FORM_CHANGE_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, + 24, + ), + new WeightedModifierType( + modifierTypes.MEGA_BRACELET, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, + 36, + ), + new WeightedModifierType( + modifierTypes.DYNAMAX_BAND, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, + 36, + ), + new WeightedModifierType( + modifierTypes.VOUCHER_PLUS, + (_party: Pokemon[], rerollCount: number) => + !globalScene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, + 3, + ), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.MASTER_BALL, () => (hasMaximumBalls(PokeballType.MASTER_BALL)) ? 0 : 24, 24), + new WeightedModifierType(modifierTypes.MASTER_BALL, () => (hasMaximumBalls(PokeballType.MASTER_BALL) ? 0 : 24), 24), new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (_party: Pokemon[], rerollCount: number) => - !globalScene.gameMode.isDaily && !globalScene.gameMode.isEndless && !globalScene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !(globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) && !globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), - new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, () => (globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE))) ? 1 : 0, 1), + new WeightedModifierType( + modifierTypes.VOUCHER_PREMIUM, + (_party: Pokemon[], rerollCount: number) => + !globalScene.gameMode.isDaily && !globalScene.gameMode.isEndless && !globalScene.gameMode.isSplicedOnly + ? Math.max(5 - rerollCount * 2, 0) + : 0, + 5, + ), + new WeightedModifierType( + modifierTypes.DNA_SPLICERS, + (party: Pokemon[]) => + !(globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) && + !globalScene.gameMode.isSplicedOnly && + party.filter(p => !p.fusionSpecies).length > 1 + ? 24 + : 0, + 24, + ), + new WeightedModifierType( + modifierTypes.MINI_BLACK_HOLE, + () => + globalScene.gameMode.isDaily || + (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE)) + ? 1 + : 0, + 1, + ), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; const wildModifierPool: ModifierPool = { - [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.BERRY, 1) - ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + [ModifierTier.COMMON]: [new WeightedModifierType(modifierTypes.BERRY, 1)].map(m => { + m.setTier(ModifierTier.COMMON); + return m; }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1) - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; - }), - [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, 0) - ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; - }), - [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), - ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; - }), - [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1) - ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) -}; - -const trainerModifierPool: ModifierPool = { - [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.BERRY, 8), - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3) - ].map(m => { - m.setTier(ModifierTier.COMMON); return m; - }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), new WeightedModifierType(modifierTypes.WHITE_HERB, 0), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; + }), + [ModifierTier.ROGUE]: [new WeightedModifierType(modifierTypes.LUCKY_EGG, 4)].map(m => { + m.setTier(ModifierTier.ROGUE); + return m; + }), + [ModifierTier.MASTER]: [new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1)].map(m => { + m.setTier(ModifierTier.MASTER); + return m; + }), +}; + +const trainerModifierPool: ModifierPool = { + [ModifierTier.COMMON]: [ + new WeightedModifierType(modifierTypes.BERRY, 8), + new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), + ].map(m => { + m.setTier(ModifierTier.COMMON); + return m; + }), + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; + }), + [ModifierTier.ULTRA]: [ + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 0), + ].map(m => { + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), @@ -1956,7 +2964,8 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.GRIP_CLAW, 1), new WeightedModifierType(modifierTypes.WIDE_LENS, 1), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), @@ -1964,8 +2973,9 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHELL_BELL, 1), new WeightedModifierType(modifierTypes.SCOPE_LENS, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; const enemyBuffModifierPool: ModifierPool = { @@ -1977,18 +2987,20 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 3), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 9), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 4), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 5), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 5), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10), @@ -1996,16 +3008,19 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_HEAL, 10), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), - [ModifierTier.ROGUE]: [ ].map((m: WeightedModifierType) => { - m.setTier(ModifierTier.ROGUE); return m; + [ModifierTier.ROGUE]: [].map((m: WeightedModifierType) => { + m.setTier(ModifierTier.ROGUE); + return m; + }), + [ModifierTier.MASTER]: [].map((m: WeightedModifierType) => { + m.setTier(ModifierTier.MASTER); + return m; }), - [ModifierTier.MASTER]: [ ].map((m: WeightedModifierType) => { - m.setTier(ModifierTier.MASTER); return m; - }) }; const dailyStarterModifierPool: ModifierPool = { @@ -2013,12 +3028,12 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1), new WeightedModifierType(modifierTypes.BERRY, 3), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), @@ -2026,7 +3041,8 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SOUL_DEW, 1), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 1), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), @@ -2035,14 +3051,16 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; export function getModifierType(modifierTypeFunc: ModifierTypeFunc): ModifierType { @@ -2057,13 +3075,16 @@ let modifierPoolThresholds = {}; let ignoredPoolIndexes = {}; let dailyStarterModifierPoolThresholds = {}; -let ignoredDailyStarterPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let ignoredDailyStarterPoolIndexes = {}; let enemyModifierPoolThresholds = {}; -let enemyIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let enemyIgnoredPoolIndexes = {}; let enemyBuffModifierPoolThresholds = {}; -let enemyBuffIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let enemyBuffIgnoredPoolIndexes = {}; export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool { let pool: ModifierPool; @@ -2087,13 +3108,13 @@ export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool return pool; } -const tierWeights = [ 768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; +const tierWeights = [768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024]; /** * Allows a unit test to check if an item exists in the Modifier Pool. Checks the pool directly, rather than attempting to reroll for the item. */ export const itemPoolChecks: Map = new Map(); -export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount: number = 0) { +export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount = 0) { const pool = getModifierPoolForType(poolType); itemPoolChecks.forEach((_v, k) => { itemPoolChecks.set(k, false); @@ -2101,52 +3122,68 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod const ignoredIndexes = {}; const modifierTableData = {}; - const thresholds = Object.fromEntries(new Map(Object.keys(pool).map(t => { - ignoredIndexes[t] = []; - const thresholds = new Map(); - const tierModifierIds: string[] = []; - let tierMaxWeight = 0; - let i = 0; - pool[t].reduce((total: number, modifierType: WeightedModifierType) => { - const weightedModifierType = modifierType as WeightedModifierType; - const existingModifiers = globalScene.findModifiers(m => m.type.id === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); - const itemModifierType = weightedModifierType.modifierType instanceof ModifierTypeGenerator - ? weightedModifierType.modifierType.generateType(party) - : weightedModifierType.modifierType; - const weight = !existingModifiers.length - || itemModifierType instanceof PokemonHeldItemModifierType - || itemModifierType instanceof FormChangeItemModifierType - || existingModifiers.find(m => m.stackCount < m.getMaxStackCount(true)) - ? weightedModifierType.weight instanceof Function - ? (weightedModifierType.weight as Function)(party, rerollCount) - : weightedModifierType.weight as number - : 0; - if (weightedModifierType.maxWeight) { - const modifierId = weightedModifierType.modifierType.id; - tierModifierIds.push(modifierId); - const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; - modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; - tierMaxWeight += outputWeight; - } - if (weight) { - total += weight; - } else { - ignoredIndexes[t].push(i++); - return total; - } - if (itemPoolChecks.has(modifierType.modifierType.id as ModifierTypeKeys)) { - itemPoolChecks.set(modifierType.modifierType.id as ModifierTypeKeys, true); - } - thresholds.set(total, i++); - return total; - }, 0); - for (const id of tierModifierIds) { - modifierTableData[id].tierPercent = Math.floor((modifierTableData[id].weight / tierMaxWeight) * 10000) / 100; - } - return [ t, Object.fromEntries(thresholds) ]; - }))); + const thresholds = Object.fromEntries( + new Map( + Object.keys(pool).map(t => { + ignoredIndexes[t] = []; + const thresholds = new Map(); + const tierModifierIds: string[] = []; + let tierMaxWeight = 0; + let i = 0; + pool[t].reduce((total: number, modifierType: WeightedModifierType) => { + const weightedModifierType = modifierType as WeightedModifierType; + const existingModifiers = globalScene.findModifiers( + m => m.type.id === weightedModifierType.modifierType.id, + poolType === ModifierPoolType.PLAYER, + ); + const itemModifierType = + weightedModifierType.modifierType instanceof ModifierTypeGenerator + ? weightedModifierType.modifierType.generateType(party) + : weightedModifierType.modifierType; + const weight = + !existingModifiers.length || + itemModifierType instanceof PokemonHeldItemModifierType || + itemModifierType instanceof FormChangeItemModifierType || + existingModifiers.find(m => m.stackCount < m.getMaxStackCount(true)) + ? weightedModifierType.weight instanceof Function + ? // biome-ignore lint/complexity/noBannedTypes: TODO: refactor to not use Function type + (weightedModifierType.weight as Function)(party, rerollCount) + : (weightedModifierType.weight as number) + : 0; + if (weightedModifierType.maxWeight) { + const modifierId = weightedModifierType.modifierType.id; + tierModifierIds.push(modifierId); + const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; + modifierTableData[modifierId] = { + weight: outputWeight, + tier: Number.parseInt(t), + tierPercent: 0, + totalPercent: 0, + }; + tierMaxWeight += outputWeight; + } + if (weight) { + total += weight; + } else { + ignoredIndexes[t].push(i++); + return total; + } + if (itemPoolChecks.has(modifierType.modifierType.id as ModifierTypeKeys)) { + itemPoolChecks.set(modifierType.modifierType.id as ModifierTypeKeys, true); + } + thresholds.set(total, i++); + return total; + }, 0); + for (const id of tierModifierIds) { + modifierTableData[id].tierPercent = Math.floor((modifierTableData[id].weight / tierMaxWeight) * 10000) / 100; + } + return [t, Object.fromEntries(thresholds)]; + }), + ), + ); for (const id of Object.keys(modifierTableData)) { - modifierTableData[id].totalPercent = Math.floor(modifierTableData[id].tierPercent * tierWeights[modifierTableData[id].tier] * 100) / 100; + modifierTableData[id].totalPercent = + Math.floor(modifierTableData[id].tierPercent * tierWeights[modifierTableData[id].tier] * 100) / 100; modifierTableData[id].tier = ModifierTier[modifierTableData[id].tier]; } if (outputModifierData) { @@ -2203,21 +3240,39 @@ export function getModifierTypeFuncById(id: string): ModifierTypeFunc { * - `rerollMultiplier?: number` If specified, can adjust the amount of money required for a shop reroll. If set to a negative value, the shop will not allow rerolls at all. * - `allowLuckUpgrades?: boolean` Default `true`, if `false` will prevent set item tiers from upgrading via luck */ -export function getPlayerModifierTypeOptions(count: number, party: PlayerPokemon[], modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings): ModifierTypeOption[] { +export function getPlayerModifierTypeOptions( + count: number, + party: PlayerPokemon[], + modifierTiers?: ModifierTier[], + customModifierSettings?: CustomModifierSettings, +): ModifierTypeOption[] { const options: ModifierTypeOption[] = []; const retryCount = Math.min(count * 5, 50); if (!customModifierSettings) { new Array(count).fill(0).map((_, i) => { - options.push(getModifierTypeOptionWithRetry(options, retryCount, party, modifierTiers && modifierTiers.length > i ? modifierTiers[i] : undefined)); + options.push( + getModifierTypeOptionWithRetry( + options, + retryCount, + party, + modifierTiers && modifierTiers.length > i ? modifierTiers[i] : undefined, + ), + ); }); } else { // Guaranteed mod options first - if (customModifierSettings?.guaranteedModifierTypeOptions && customModifierSettings.guaranteedModifierTypeOptions.length > 0) { + if ( + customModifierSettings?.guaranteedModifierTypeOptions && + customModifierSettings.guaranteedModifierTypeOptions.length > 0 + ) { options.push(...customModifierSettings.guaranteedModifierTypeOptions!); } // Guaranteed mod functions second - if (customModifierSettings.guaranteedModifierTypeFuncs && customModifierSettings.guaranteedModifierTypeFuncs.length > 0) { + if ( + customModifierSettings.guaranteedModifierTypeFuncs && + customModifierSettings.guaranteedModifierTypeFuncs.length > 0 + ) { customModifierSettings.guaranteedModifierTypeFuncs!.forEach((mod, _i) => { const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === mod) as string; let guaranteedMod: ModifierType = modifierTypes[modifierId]?.(); @@ -2227,7 +3282,8 @@ export function getPlayerModifierTypeOptions(count: number, party: PlayerPokemon .withIdFromFunc(modifierTypes[modifierId]) .withTierFromPool(ModifierPoolType.PLAYER, party); - const modType = guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; + const modType = + guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; if (modType) { const option = new ModifierTypeOption(modType, 0); options.push(option); @@ -2238,9 +3294,9 @@ export function getPlayerModifierTypeOptions(count: number, party: PlayerPokemon // Guaranteed tiers third if (customModifierSettings.guaranteedModifierTiers && customModifierSettings.guaranteedModifierTiers.length > 0) { const allowLuckUpgrades = customModifierSettings.allowLuckUpgrades ?? true; - customModifierSettings.guaranteedModifierTiers.forEach((tier) => { + for (const tier of customModifierSettings.guaranteedModifierTiers) { options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier, allowLuckUpgrades)); - }); + } } // Fill remaining @@ -2264,12 +3320,29 @@ export function getPlayerModifierTypeOptions(count: number, party: PlayerPokemon * @param tier If specified will generate item of tier * @param allowLuckUpgrades `true` to allow items to upgrade tiers (the little animation that plays and is affected by luck) */ -function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], retryCount: number, party: PlayerPokemon[], tier?: ModifierTier, allowLuckUpgrades?: boolean): ModifierTypeOption { +function getModifierTypeOptionWithRetry( + existingOptions: ModifierTypeOption[], + retryCount: number, + party: PlayerPokemon[], + tier?: ModifierTier, + allowLuckUpgrades?: boolean, +): ModifierTypeOption { allowLuckUpgrades = allowLuckUpgrades ?? true; let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier, undefined, 0, allowLuckUpgrades); let r = 0; - while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type.tier ?? tier, candidate?.upgradeCount, 0, allowLuckUpgrades); + while ( + existingOptions.length && + ++r < retryCount && + existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length + ) { + candidate = getNewModifierTypeOption( + party, + ModifierPoolType.PLAYER, + candidate?.type.tier ?? tier, + candidate?.upgradeCount, + 0, + allowLuckUpgrades, + ); } return candidate!; } @@ -2289,7 +3362,7 @@ export function overridePlayerModifierTypeOptions(options: ModifierTypeOption[], let modifierType: ModifierType | null = modifierFunc(); if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in override) && (override.type !== null) ? [ override.type ] : undefined; + const pregenArgs = "type" in override && override.type !== null ? [override.type] : undefined; modifierType = modifierType.generateType(party, pregenArgs); } @@ -2308,7 +3381,7 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: number, baseC [ new ModifierTypeOption(modifierTypes.POTION(), 0, baseCost * 0.2), new ModifierTypeOption(modifierTypes.ETHER(), 0, baseCost * 0.4), - new ModifierTypeOption(modifierTypes.REVIVE(), 0, baseCost * 2) + new ModifierTypeOption(modifierTypes.REVIVE(), 0, baseCost * 2), ], [ new ModifierTypeOption(modifierTypes.SUPER_POTION(), 0, baseCost * 0.45), @@ -2316,28 +3389,27 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: number, baseC ], [ new ModifierTypeOption(modifierTypes.ELIXIR(), 0, baseCost), - new ModifierTypeOption(modifierTypes.MAX_ETHER(), 0, baseCost) + new ModifierTypeOption(modifierTypes.MAX_ETHER(), 0, baseCost), ], [ new ModifierTypeOption(modifierTypes.HYPER_POTION(), 0, baseCost * 0.8), new ModifierTypeOption(modifierTypes.MAX_REVIVE(), 0, baseCost * 2.75), - new ModifierTypeOption(modifierTypes.MEMORY_MUSHROOM(), 0, baseCost * 4) + new ModifierTypeOption(modifierTypes.MEMORY_MUSHROOM(), 0, baseCost * 4), ], [ new ModifierTypeOption(modifierTypes.MAX_POTION(), 0, baseCost * 1.5), - new ModifierTypeOption(modifierTypes.MAX_ELIXIR(), 0, baseCost * 2.5) + new ModifierTypeOption(modifierTypes.MAX_ELIXIR(), 0, baseCost * 2.5), ], - [ - new ModifierTypeOption(modifierTypes.FULL_RESTORE(), 0, baseCost * 2.25) - ], - [ - new ModifierTypeOption(modifierTypes.SACRED_ASH(), 0, baseCost * 10) - ] + [new ModifierTypeOption(modifierTypes.FULL_RESTORE(), 0, baseCost * 2.25)], + [new ModifierTypeOption(modifierTypes.SACRED_ASH(), 0, baseCost * 10)], ]; return options.slice(0, Math.ceil(Math.max(waveIndex + 10, 0) / 30)).flat(); } -export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: PersistentModifier[]): EnemyPersistentModifier { +export function getEnemyBuffModifierForWave( + tier: ModifierTier, + enemyModifiers: PersistentModifier[], +): EnemyPersistentModifier { let tierStackCount: number; switch (tier) { case ModifierTier.ULTRA: @@ -2355,7 +3427,11 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); let r = 0; let matchingModifier: PersistentModifier | undefined; - while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate?.type?.id)) && matchingModifier.getMaxStackCount() < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) { + while ( + ++r < retryCount && + (matchingModifier = enemyModifiers.find(m => m.type.id === candidate?.type?.id)) && + matchingModifier.getMaxStackCount() < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1) + ) { candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); } @@ -2365,8 +3441,20 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: return modifier; } -export function getEnemyModifierTypesForWave(waveIndex: number, count: number, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: number = 0): PokemonHeldItemModifierType[] { - const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !randSeedInt(upgradeChance) ? 1 : 0)?.type as PokemonHeldItemModifierType); +export function getEnemyModifierTypesForWave( + waveIndex: number, + count: number, + party: EnemyPokemon[], + poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, + upgradeChance = 0, +): PokemonHeldItemModifierType[] { + const ret = new Array(count) + .fill(0) + .map( + () => + getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !randSeedInt(upgradeChance) ? 1 : 0) + ?.type as PokemonHeldItemModifierType, + ); if (!(waveIndex % 1000)) { ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); } @@ -2392,7 +3480,9 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): PokemonHeld tier = ModifierTier.MASTER; } - const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier(p) as PokemonHeldItemModifier; + const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier( + p, + ) as PokemonHeldItemModifier; ret.push(modifier); } } @@ -2409,7 +3499,14 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): PokemonHeld * @param retryCount Max allowed tries before the next tier down is checked for a valid ModifierType * @param allowLuckUpgrades Default true. If false, will not allow ModifierType to randomly upgrade to next tier */ -function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: number, retryCount: number = 0, allowLuckUpgrades: boolean = true): ModifierTypeOption | null { +function getNewModifierTypeOption( + party: Pokemon[], + poolType: ModifierPoolType, + tier?: ModifierTier, + upgradeCount?: number, + retryCount = 0, + allowLuckUpgrades = true, +): ModifierTypeOption | null { const player = !poolType; const pool = getModifierPoolForType(poolType); let thresholds: object; @@ -2486,11 +3583,11 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } const tierThresholds = Object.keys(thresholds[tier]); - const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]); + const totalWeight = Number.parseInt(tierThresholds[tierThresholds.length - 1]); const value = randSeedInt(totalWeight); let index: number | undefined; for (const t of tierThresholds) { - const threshold = parseInt(t); + const threshold = Number.parseInt(t); if (value < threshold) { index = thresholds[tier][threshold]; break; @@ -2504,7 +3601,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, if (player) { console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); } - let modifierType: ModifierType | null = (pool[tier][index]).modifierType; + let modifierType: ModifierType | null = pool[tier][index].modifierType; if (modifierType instanceof ModifierTypeGenerator) { modifierType = (modifierType as ModifierTypeGenerator).generateType(party); if (modifierType === null) { @@ -2533,7 +3630,7 @@ export class ModifierTypeOption { public upgradeCount: number; public cost: number; - constructor(type: ModifierType, upgradeCount: number, cost: number = 0) { + constructor(type: ModifierType, upgradeCount: number, cost = 0) { this.type = type; this.upgradeCount = upgradeCount; this.cost = Math.min(Math.round(cost), Number.MAX_SAFE_INTEGER); @@ -2548,19 +3645,28 @@ export class ModifierTypeOption { export function getPartyLuckValue(party: Pokemon[]): number { if (globalScene.gameMode.isDaily) { const DailyLuck = new NumberHolder(0); - globalScene.executeWithSeedOffset(() => { - DailyLuck.value = randSeedInt(15); // Random number between 0 and 14 - }, 0, globalScene.seed); + globalScene.executeWithSeedOffset( + () => { + DailyLuck.value = randSeedInt(15); // Random number between 0 and 14 + }, + 0, + globalScene.seed, + ); return DailyLuck.value; } const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0) - .reduce((total: number, value: number) => total += value, 0), 0, 14); + const luck = Phaser.Math.Clamp( + party + .map(p => (p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0)) + .reduce((total: number, value: number) => (total += value), 0), + 0, + 14, + ); return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } export function getLuckString(luckValue: number): string { - return [ "D", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "A++", "S", "S+", "SS", "SS+", "SSS" ][luckValue]; + return ["D", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "A++", "S", "S+", "SS", "SS+", "SSS"][luckValue]; } export function getLuckTextTint(luckValue: number): number { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 1f8d1eb0322..a084474ddac 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -27,7 +27,25 @@ import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTL import { StatusEffect } from "#enums/status-effect"; import type { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; -import { type DoubleBattleChanceBoosterModifierType, type EvolutionItemModifierType, type FormChangeItemModifierType, type ModifierOverride, type ModifierType, type PokemonBaseStatTotalModifierType, type PokemonExpBoosterModifierType, type PokemonFriendshipBoosterModifierType, type PokemonMoveAccuracyBoosterModifierType, type PokemonMultiHitModifierType, type TerastallizeModifierType, type TmModifierType, getModifierType, ModifierPoolType, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType } from "./modifier-type"; +import { + type DoubleBattleChanceBoosterModifierType, + type EvolutionItemModifierType, + type FormChangeItemModifierType, + type ModifierOverride, + type ModifierType, + type PokemonBaseStatTotalModifierType, + type PokemonExpBoosterModifierType, + type PokemonFriendshipBoosterModifierType, + type PokemonMoveAccuracyBoosterModifierType, + type PokemonMultiHitModifierType, + type TerastallizeModifierType, + type TmModifierType, + getModifierType, + ModifierPoolType, + ModifierTypeGenerator, + modifierTypes, + PokemonHeldItemModifierType, +} from "./modifier-type"; import { Color, ShadowColor } from "#enums/color"; import { FRIENDSHIP_GAIN_FROM_RARE_CANDY } from "#app/data/balance/starters"; import { applyAbAttrs, CommanderAbAttr } from "#app/data/ability"; @@ -46,19 +64,19 @@ export const modifierSortFunc = (a: Modifier, b: Modifier): number => { //First sort by pokemonID if (aId < bId) { return 1; - } else if (aId > bId) { + } + if (aId > bId) { return -1; - } else if (aId === bId) { + } + if (aId === bId) { //Then sort by item type if (typeNameMatch === 0) { return itemNameMatch; //Finally sort by item name - } else { - return typeNameMatch; } - } else { - return 0; + return typeNameMatch; } + return 0; }; export class ModifierBar extends Phaser.GameObjects.Container { @@ -77,16 +95,20 @@ export class ModifierBar extends Phaser.GameObjects.Container { * @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar} * @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed */ - updateModifiers(modifiers: PersistentModifier[], hideHeldItems: boolean = false) { + updateModifiers(modifiers: PersistentModifier[], hideHeldItems = false) { this.removeAll(true); const visibleIconModifiers = modifiers.filter(m => m.isIconVisible()); - const nonPokemonSpecificModifiers = visibleIconModifiers.filter(m => !(m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); - const pokemonSpecificModifiers = visibleIconModifiers.filter(m => (m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); + const nonPokemonSpecificModifiers = visibleIconModifiers + .filter(m => !(m as PokemonHeldItemModifier).pokemonId) + .sort(modifierSortFunc); + const pokemonSpecificModifiers = visibleIconModifiers + .filter(m => (m as PokemonHeldItemModifier).pokemonId) + .sort(modifierSortFunc); - const sortedVisibleIconModifiers = hideHeldItems ? nonPokemonSpecificModifiers : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); - - const thisArg = this; + const sortedVisibleIconModifiers = hideHeldItems + ? nonPokemonSpecificModifiers + : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); sortedVisibleIconModifiers.forEach((modifier: PersistentModifier, i: number) => { const icon = modifier.getIcon(); @@ -99,13 +121,13 @@ export class ModifierBar extends Phaser.GameObjects.Container { icon.on("pointerover", () => { globalScene.ui.showTooltip(modifier.type.name, modifier.type.getDescription()); if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { - thisArg.updateModifierOverflowVisibility(true); + this.updateModifierOverflowVisibility(true); } }); icon.on("pointerout", () => { globalScene.ui.hideTooltip(); if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { - thisArg.updateModifierOverflowVisibility(false); + this.updateModifierOverflowVisibility(false); } }); }); @@ -125,9 +147,9 @@ export class ModifierBar extends Phaser.GameObjects.Container { } setModifierIconPosition(icon: Phaser.GameObjects.Container, modifierCount: number) { - const rowIcons: number = 12 + 6 * Math.max((Math.ceil(Math.min(modifierCount, 24) / 12) - 2), 0); + const rowIcons: number = 12 + 6 * Math.max(Math.ceil(Math.min(modifierCount, 24) / 12) - 2, 0); - const x = (this.getIndex(icon) % rowIcons) * 26 / (rowIcons / 12); + const x = ((this.getIndex(icon) % rowIcons) * 26) / (rowIcons / 12); const y = Math.floor(this.getIndex(icon) / rowIcons) * 20; icon.setPosition(this.player ? x : -x, y); @@ -165,7 +187,7 @@ export abstract class PersistentModifier extends Modifier { public stackCount: number; public virtualStackCount: number; - constructor(type: ModifierType, stackCount: number = 1) { + constructor(type: ModifierType, stackCount = 1) { super(type); this.stackCount = stackCount; this.virtualStackCount = 0; @@ -215,7 +237,7 @@ export abstract class PersistentModifier extends Modifier { return true; } - getIcon(forSummary?: boolean): Phaser.GameObjects.Container { + getIcon(_forSummary?: boolean): Phaser.GameObjects.Container { const container = globalScene.add.container(0, 0); const item = globalScene.add.sprite(0, 12, "items"); @@ -253,10 +275,6 @@ export abstract class PersistentModifier extends Modifier { } export abstract class ConsumableModifier extends Modifier { - constructor(type: ModifierType) { - super(type); - } - add(_modifiers: Modifier[]): boolean { return true; } @@ -280,7 +298,10 @@ export class AddPokeballModifier extends ConsumableModifier { */ override apply(): boolean { const pokeballCounts = globalScene.pokeballCounts; - pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, MAX_PER_TYPE_POKEBALLS); + pokeballCounts[this.pokeballType] = Math.min( + pokeballCounts[this.pokeballType] + this.count, + MAX_PER_TYPE_POKEBALLS, + ); return true; } @@ -418,7 +439,7 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.maxBattles, this.battleCount ]; + return [this.maxBattles, this.battleCount]; } getMaxStackCount(_forThreshold?: boolean): number { @@ -436,16 +457,17 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { public override type: DoubleBattleChanceBoosterModifierType; - constructor(type: ModifierType, maxBattles:number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - match(modifier: Modifier): boolean { - return (modifier instanceof DoubleBattleChanceBoosterModifier) && (modifier.getMaxBattles() === this.getMaxBattles()); + return modifier instanceof DoubleBattleChanceBoosterModifier && modifier.getMaxBattles() === this.getMaxBattles(); } clone(): DoubleBattleChanceBoosterModifier { - return new DoubleBattleChanceBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + return new DoubleBattleChanceBoosterModifier( + this.type, + this.getMaxBattles(), + this.getBattleCount(), + this.stackCount, + ); } /** @@ -481,23 +503,29 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { this.stat = stat; // Note that, because we want X Accuracy to maintain its original behavior, // it will increment as it did previously, directly to the stat stage. - this.boost = (stat !== Stat.ACC) ? 0.3 : 1; + this.boost = stat !== Stat.ACC ? 0.3 : 1; } match(modifier: Modifier): boolean { if (modifier instanceof TempStatStageBoosterModifier) { const modifierInstance = modifier as TempStatStageBoosterModifier; - return (modifierInstance.stat === this.stat); + return modifierInstance.stat === this.stat; } return false; } clone() { - return new TempStatStageBoosterModifier(this.type, this.stat, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + return new TempStatStageBoosterModifier( + this.type, + this.stat, + this.getMaxBattles(), + this.getBattleCount(), + this.stackCount, + ); } getArgs(): any[] { - return [ this.stat, ...super.getArgs() ]; + return [this.stat, ...super.getArgs()]; } /** @@ -508,7 +536,9 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { * @returns `true` if the modifier can be applied, false otherwise */ override shouldApply(tempBattleStat?: TempBattleStat, statLevel?: NumberHolder): boolean { - return !!tempBattleStat && !!statLevel && TEMP_BATTLE_STATS.includes(tempBattleStat) && (tempBattleStat === this.stat); + return ( + !!tempBattleStat && !!statLevel && TEMP_BATTLE_STATS.includes(tempBattleStat) && tempBattleStat === this.stat + ); } /** @@ -529,16 +559,12 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { * @see {@linkcode apply} */ export class TempCritBoosterModifier extends LapsingPersistentModifier { - constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - clone() { return new TempCritBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); } match(modifier: Modifier): boolean { - return (modifier instanceof TempCritBoosterModifier); + return modifier instanceof TempCritBoosterModifier; } /** @@ -562,10 +588,6 @@ export class TempCritBoosterModifier extends LapsingPersistentModifier { } export class MapModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): MapModifier { return new MapModifier(this.type, this.stackCount); } @@ -580,10 +602,6 @@ export class MapModifier extends PersistentModifier { } export class MegaEvolutionAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): MegaEvolutionAccessModifier { return new MegaEvolutionAccessModifier(this.type, this.stackCount); } @@ -598,10 +616,6 @@ export class MegaEvolutionAccessModifier extends PersistentModifier { } export class GigantamaxAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): GigantamaxAccessModifier { return new GigantamaxAccessModifier(this.type, this.stackCount); } @@ -621,10 +635,6 @@ export class GigantamaxAccessModifier extends PersistentModifier { } export class TerastallizeAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): TerastallizeAccessModifier { return new TerastallizeAccessModifier(this.type, this.stackCount); } @@ -645,7 +655,7 @@ export class TerastallizeAccessModifier extends PersistentModifier { export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: number; - public isTransferable: boolean = true; + public isTransferable = true; constructor(type: ModifierType, pokemonId: number, stackCount?: number) { super(type, stackCount); @@ -660,7 +670,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.pokemonId ]; + return [this.pokemonId]; } /** @@ -681,7 +691,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { } isIconVisible(): boolean { - return !!(this.getPokemon()?.isOnField()); + return !!this.getPokemon()?.isOnField(); } getIcon(forSummary?: boolean): Phaser.GameObjects.Container { @@ -718,7 +728,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { } getPokemon(): Pokemon | undefined { - return this.pokemonId ? globalScene.getPokemonById(this.pokemonId) ?? undefined : undefined; + return this.pokemonId ? (globalScene.getPokemonById(this.pokemonId) ?? undefined) : undefined; } getScoreMultiplier(): number { @@ -731,7 +741,10 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return 0; } if (pokemon.isPlayer() && forThreshold) { - return globalScene.getPlayerParty().map(p => this.getMaxHeldItemCount(p)).reduce((stackCount: number, maxStackCount: number) => Math.max(stackCount, maxStackCount), 0); + return globalScene + .getPlayerParty() + .map(p => this.getMaxHeldItemCount(p)) + .reduce((stackCount: number, maxStackCount: number) => Math.max(stackCount, maxStackCount), 0); } return this.getMaxHeldItemCount(pokemon); } @@ -741,7 +754,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { protected battlesLeft: number; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, battlesLeft?: number, stackCount?: number) { super(type, pokemonId, stackCount); @@ -767,7 +780,10 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi const container = super.getIcon(forSummary); if (this.getPokemon()?.isPlayer()) { - const battleCountText = addTextObject(27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: Color.PINK }); + const battleCountText = addTextObject(27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { + fontSize: "66px", + color: Color.PINK, + }); battleCountText.setShadow(0, 0); battleCountText.setStroke(ShadowColor.RED, 16); battleCountText.setOrigin(1, 0); @@ -781,7 +797,7 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi return this.battlesLeft; } - getMaxStackCount(forThreshold?: boolean): number { + getMaxStackCount(_forThreshold?: boolean): number { return 1; } } @@ -794,7 +810,7 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi */ export class BaseStatModifier extends PokemonHeldItemModifier { protected stat: PermanentStat; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, stat: PermanentStat, stackCount?: number) { super(type, pokemonId, stackCount); @@ -849,7 +865,7 @@ export class BaseStatModifier extends PokemonHeldItemModifier { export class EvoTrackerModifier extends PokemonHeldItemModifier { protected species: Species; protected required: number; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, species: Species, required: number, stackCount?: number) { super(type, pokemonId, stackCount); @@ -858,7 +874,9 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } matchType(modifier: Modifier): boolean { - return modifier instanceof EvoTrackerModifier && modifier.species === this.species && modifier.required === this.required; + return ( + modifier instanceof EvoTrackerModifier && modifier.species === this.species && modifier.required === this.required + ); } clone(): PersistentModifier { @@ -866,7 +884,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } getArgs(): any[] { - return super.getArgs().concat([ this.species, this.required ]); + return super.getArgs().concat([this.species, this.required]); } /** @@ -885,8 +903,14 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { const pokemon = globalScene.getPokemonById(this.pokemonId); this.stackCount = pokemon - ? pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + globalScene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length + ? pokemon.evoCounter + + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + + globalScene.findModifiers( + m => + m instanceof MoneyMultiplierModifier || + m instanceof ExtraModifierModifier || + m instanceof TempExtraModifierModifier, + ).length : this.stackCount; const text = globalScene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); @@ -900,8 +924,15 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } getMaxHeldItemCount(pokemon: Pokemon): number { - this.stackCount = pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + globalScene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length; + this.stackCount = + pokemon.evoCounter + + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + + globalScene.findModifiers( + m => + m instanceof MoneyMultiplierModifier || + m instanceof ExtraModifierModifier || + m instanceof TempExtraModifierModifier, + ).length; return 999; } } @@ -911,7 +942,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { */ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { public override type: PokemonBaseStatTotalModifierType; - public isTransferable: boolean = false; + public isTransferable = false; private statModifier: number; @@ -963,7 +994,7 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { return 1.2; } - override getMaxHeldItemCount(pokemon: Pokemon): number { + override getMaxHeldItemCount(_pokemon: Pokemon): number { return 2; } } @@ -974,9 +1005,9 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { private statModifier: number; private stats: Stat[]; - public isTransferable: boolean = false; + public isTransferable = false; - constructor (type: ModifierType, pokemonId: number, statModifier: number, stats: Stat[], stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, statModifier: number, stats: Stat[], stackCount?: number) { super(type, pokemonId, stackCount); this.statModifier = statModifier; @@ -984,7 +1015,11 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { } override matchType(modifier: Modifier): boolean { - return modifier instanceof PokemonBaseStatFlatModifier && modifier.statModifier === this.statModifier && this.stats.every(s => modifier.stats.some(stat => s === stat)); + return ( + modifier instanceof PokemonBaseStatFlatModifier && + modifier.statModifier === this.statModifier && + this.stats.every(s => modifier.stats.some(stat => s === stat)) + ); } override clone(): PersistentModifier { @@ -992,7 +1027,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { } override getArgs(): any[] { - return [ ...super.getArgs(), this.statModifier, this.stats ]; + return [...super.getArgs(), this.statModifier, this.stats]; } /** @@ -1027,7 +1062,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { return 1.1; } - override getMaxHeldItemCount(pokemon: Pokemon): number { + override getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -1036,11 +1071,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { * Currently used by Macho Brace item */ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { - public isTransferable: boolean = false; - - constructor (type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } + public isTransferable = false; matchType(modifier: Modifier): boolean { return modifier instanceof PokemonIncrementingStatModifier; @@ -1096,7 +1127,7 @@ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { return 1.2; } - getMaxHeldItemCount(pokemon?: Pokemon): number { + getMaxHeldItemCount(_pokemon?: Pokemon): number { return 50; } } @@ -1125,13 +1156,13 @@ export class StatBoosterModifier extends PokemonHeldItemModifier { } getArgs(): any[] { - return [ ...super.getArgs(), this.stats, this.multiplier ]; + return [...super.getArgs(), this.stats, this.multiplier]; } matchType(modifier: Modifier): boolean { if (modifier instanceof StatBoosterModifier) { const modifierInstance = modifier as StatBoosterModifier; - if ((modifierInstance.multiplier === this.multiplier) && (modifierInstance.stats.length === this.stats.length)) { + if (modifierInstance.multiplier === this.multiplier && modifierInstance.stats.length === this.stats.length) { return modifierInstance.stats.every((e, i) => e === this.stats[i]); } } @@ -1211,11 +1242,12 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier { override apply(pokemon: Pokemon, stat: Stat, statValue: NumberHolder): boolean { const isUnevolved = pokemon.getSpeciesForm(true).speciesId in pokemonEvolutions; - if (pokemon.isFusion() && (pokemon.getFusionSpeciesForm(true).speciesId in pokemonEvolutions) !== isUnevolved) { + if (pokemon.isFusion() && pokemon.getFusionSpeciesForm(true).speciesId in pokemonEvolutions !== isUnevolved) { // Half boost applied if pokemon is fused and either part of fusion is fully evolved statValue.value *= 1 + (this.multiplier - 1) / 2; return true; - } else if (isUnevolved) { + } + if (isUnevolved) { // Full boost applied if holder is unfused and unevolved or, if fused, both parts of fusion are unevolved return super.apply(pokemon, stat, statValue); } @@ -1234,18 +1266,32 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { /** The species that the held item's stat boost(s) apply to */ private species: Species[]; - constructor(type: ModifierType, pokemonId: number, stats: Stat[], multiplier: number, species: Species[], stackCount?: number) { + constructor( + type: ModifierType, + pokemonId: number, + stats: Stat[], + multiplier: number, + species: Species[], + stackCount?: number, + ) { super(type, pokemonId, stats, multiplier, stackCount); this.species = species; } clone() { - return new SpeciesStatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.species, this.stackCount); + return new SpeciesStatBoosterModifier( + this.type, + this.pokemonId, + this.stats, + this.multiplier, + this.species, + this.stackCount, + ); } getArgs(): any[] { - return [ ...super.getArgs(), this.species ]; + return [...super.getArgs(), this.species]; } matchType(modifier: Modifier): boolean { @@ -1268,7 +1314,11 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { * @returns `true` if the stat could be boosted, false otherwise */ override shouldApply(pokemon: Pokemon, stat: Stat, statValue: NumberHolder): boolean { - return super.shouldApply(pokemon, stat, statValue) && (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))); + return ( + super.shouldApply(pokemon, stat, statValue) && + (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || + (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))) + ); } /** @@ -1346,11 +1396,17 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { } clone() { - return new SpeciesCritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.species, this.stackCount); + return new SpeciesCritBoosterModifier( + this.type, + this.pokemonId, + this.stageIncrement, + this.species, + this.stackCount, + ); } getArgs(): any[] { - return [ ...super.getArgs(), this.species ]; + return [...super.getArgs(), this.species]; } matchType(modifier: Modifier): boolean { @@ -1365,7 +1421,11 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { * @returns `true` if the critical-hit level can be incremented, false otherwise */ override shouldApply(pokemon: Pokemon, critStage: NumberHolder): boolean { - return super.shouldApply(pokemon, critStage) && (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))); + return ( + super.shouldApply(pokemon, critStage) && + (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || + (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))) + ); } } @@ -1386,18 +1446,27 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { matchType(modifier: Modifier): boolean { if (modifier instanceof AttackTypeBoosterModifier) { const attackTypeBoosterModifier = modifier as AttackTypeBoosterModifier; - return attackTypeBoosterModifier.moveType === this.moveType && attackTypeBoosterModifier.boostMultiplier === this.boostMultiplier; + return ( + attackTypeBoosterModifier.moveType === this.moveType && + attackTypeBoosterModifier.boostMultiplier === this.boostMultiplier + ); } return false; } clone() { - return new AttackTypeBoosterModifier(this.type, this.pokemonId, this.moveType, this.boostMultiplier * 100, this.stackCount); + return new AttackTypeBoosterModifier( + this.type, + this.pokemonId, + this.moveType, + this.boostMultiplier * 100, + this.stackCount, + ); } getArgs(): any[] { - return super.getArgs().concat([ this.moveType, this.boostMultiplier * 100 ]); + return super.getArgs().concat([this.moveType, this.boostMultiplier * 100]); } /** @@ -1408,7 +1477,11 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { * @returns `true` if boosts should be applied to the move. */ override shouldApply(pokemon?: Pokemon, moveType?: PokemonType, movePower?: NumberHolder): boolean { - return super.shouldApply(pokemon, moveType, movePower) && typeof moveType === "number" && movePower instanceof NumberHolder; + return ( + super.shouldApply(pokemon, moveType, movePower) && + typeof moveType === "number" && + movePower instanceof NumberHolder + ); } /** @@ -1420,7 +1493,9 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { */ override apply(_pokemon: Pokemon, moveType: PokemonType, movePower: NumberHolder): boolean { if (moveType === this.moveType && movePower.value >= 1) { - (movePower as NumberHolder).value = Math.floor((movePower as NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); + (movePower as NumberHolder).value = Math.floor( + (movePower as NumberHolder).value * (1 + this.getStackCount() * this.boostMultiplier), + ); return true; } @@ -1431,16 +1506,12 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { return 1.2; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 99; } } export class SurviveDamageModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof SurviveDamageModifier; } @@ -1469,23 +1540,24 @@ export class SurviveDamageModifier extends PokemonHeldItemModifier { if (!surviveDamage.value && pokemon.randSeedInt(10) < this.getStackCount()) { surviveDamage.value = true; - globalScene.queueMessage(i18next.t("modifier:surviveDamageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + globalScene.queueMessage( + i18next.t("modifier:surviveDamageApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + ); return true; } return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof BypassSpeedChanceModifier; } @@ -1513,11 +1585,17 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { override apply(pokemon: Pokemon, doBypassSpeed: BooleanHolder): boolean { if (!doBypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) { doBypassSpeed.value = true; - const isCommandFight = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT; + const isCommandFight = + globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT; const hasQuickClaw = this.type instanceof PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW"; if (isCommandFight && hasQuickClaw) { - globalScene.queueMessage(i18next.t("modifier:bypassSpeedChanceApply", { pokemonName: getPokemonNameWithAffix(pokemon), itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name") })); + globalScene.queueMessage( + i18next.t("modifier:bypassSpeedChanceApply", { + pokemonName: getPokemonNameWithAffix(pokemon), + itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name"), + }), + ); } return true; } @@ -1525,7 +1603,7 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } @@ -1568,7 +1646,7 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon, flinched: BooleanHolder): boolean { // The check for pokemon.battleSummonData is to ensure that a crash doesn't occur when a Pokemon with King's Rock procs a flinch - if (pokemon.battleSummonData && !flinched.value && pokemon.randSeedInt(100) < (this.getStackCount() * this.chance)) { + if (pokemon.battleSummonData && !flinched.value && pokemon.randSeedInt(100) < this.getStackCount() * this.chance) { flinched.value = true; return true; } @@ -1582,10 +1660,6 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { } export class TurnHealModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof TurnHealModifier; } @@ -1601,15 +1675,24 @@ export class TurnHealModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon): boolean { if (!pokemon.isFullHp()) { - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, + i18next.t("modifier:turnHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + true, + ), + ); return true; } return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 4; } } @@ -1624,7 +1707,7 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { /** The status effect to be applied by the held item */ private effect: StatusEffect; - constructor (type: ModifierType, pokemonId: number, stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, stackCount?: number) { super(type, pokemonId, stackCount); switch (type.id) { @@ -1664,7 +1747,7 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { return pokemon.trySetStatus(this.effect, true, undefined, undefined, this.type.name); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } @@ -1674,10 +1757,6 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { } export class HitHealModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof HitHealModifier; } @@ -1693,23 +1772,28 @@ export class HitHealModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon): boolean { if (pokemon.turnData.totalDamageDealt && !pokemon.isFullHp()) { - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - toDmgValue(pokemon.turnData.totalDamageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.turnData.totalDamageDealt / 8) * this.stackCount, + i18next.t("modifier:hitHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + true, + ), + ); } return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 4; } } export class LevelIncrementBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier) { return modifier instanceof LevelIncrementBoosterModifier; } @@ -1738,7 +1822,7 @@ export class LevelIncrementBoosterModifier extends PersistentModifier { return true; } - getMaxStackCount(forThreshold?: boolean): number { + getMaxStackCount(_forThreshold?: boolean): number { return 99; } } @@ -1792,8 +1876,8 @@ export class BerryModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { - if ([ BerryType.LUM, BerryType.LEPPA, BerryType.SITRUS, BerryType.ENIGMA ].includes(this.berryType)) { + getMaxHeldItemCount(_pokemon: Pokemon): number { + if ([BerryType.LUM, BerryType.LEPPA, BerryType.SITRUS, BerryType.ENIGMA].includes(this.berryType)) { return 2; } return 3; @@ -1801,10 +1885,6 @@ export class BerryModifier extends PokemonHeldItemModifier { } export class PreserveBerryModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier) { return modifier instanceof PreserveBerryModifier; } @@ -1843,10 +1923,6 @@ export class PreserveBerryModifier extends PersistentModifier { } export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof PokemonInstantReviveModifier; } @@ -1862,19 +1938,32 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon): boolean { // Restore the Pokemon to half HP - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - toDmgValue(pokemon.getMaxHp() / 2), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.getMaxHp() / 2), + i18next.t("modifier:pokemonInstantReviveApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + false, + false, + true, + ), + ); // Remove the Pokemon's FAINT status pokemon.resetStatus(true, false, true); // Reapply Commander on the Pokemon's side of the field, if applicable const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + for (const p of field) { + applyAbAttrs(CommanderAbAttr, p, null, false); + } return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -1886,10 +1975,6 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { * @see {@linkcode apply} */ export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof ResetNegativeStatStageModifier; } @@ -1915,7 +2000,12 @@ export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { } if (statRestored) { - globalScene.queueMessage(i18next.t("modifier:resetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + globalScene.queueMessage( + i18next.t("modifier:resetNegativeStatStageApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + ); } return statRestored; } @@ -1972,7 +2062,12 @@ export class TerrastalizeModifier extends ConsumablePokemonModifier { * @returns `true` if the {@linkcode TerrastalizeModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon): boolean { - return super.shouldApply(playerPokemon) && [ playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length === 0; + return ( + super.shouldApply(playerPokemon) && + [playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId].filter( + s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA, + ).length === 0 + ); } /** @@ -1992,7 +2087,14 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { private healStatus: boolean; public fainted: boolean; - constructor(type: ModifierType, pokemonId: number, restorePoints: number, restorePercent: number, healStatus: boolean, fainted?: boolean) { + constructor( + type: ModifierType, + pokemonId: number, + restorePoints: number, + restorePercent: number, + healStatus: boolean, + fainted?: boolean, + ) { super(type, pokemonId); this.restorePoints = restorePoints; @@ -2008,7 +2110,10 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { * @returns `true` if the {@linkcode PokemonHpRestoreModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon, multiplier?: number): boolean { - return super.shouldApply(playerPokemon) && (this.fainted || (!isNullOrUndefined(multiplier) && typeof(multiplier) === "number")); + return ( + super.shouldApply(playerPokemon) && + (this.fainted || (!isNullOrUndefined(multiplier) && typeof multiplier === "number")) + ); } /** @@ -2026,7 +2131,11 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { if (this.fainted || this.healStatus) { pokemon.resetStatus(true, true); } - pokemon.hp = Math.min(pokemon.hp + Math.max(Math.ceil(Math.max(Math.floor((this.restorePercent * 0.01) * pokemon.getMaxHp()), restorePoints)), 1), pokemon.getMaxHp()); + pokemon.hp = Math.min( + pokemon.hp + + Math.max(Math.ceil(Math.max(Math.floor(this.restorePercent * 0.01 * pokemon.getMaxHp()), restorePoints)), 1), + pokemon.getMaxHp(), + ); return true; } return false; @@ -2034,10 +2143,6 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { } export class PokemonStatusHealModifier extends ConsumablePokemonModifier { - constructor(type: ModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode PokemonStatusHealModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that gets healed from the status @@ -2157,10 +2262,6 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { } export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { - constructor(type: ModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode PokemonLevelIncrementModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should get levels incremented @@ -2178,7 +2279,13 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { playerPokemon.addFriendship(FRIENDSHIP_GAIN_FROM_RARE_CANDY); - globalScene.unshiftPhase(new LevelUpPhase(globalScene.getPlayerParty().indexOf(playerPokemon), playerPokemon.level - levelCount.value, playerPokemon.level)); + globalScene.unshiftPhase( + new LevelUpPhase( + globalScene.getPlayerParty().indexOf(playerPokemon), + playerPokemon.level - levelCount.value, + playerPokemon.level, + ), + ); return true; } @@ -2187,18 +2294,15 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { export class TmModifier extends ConsumablePokemonModifier { public override type: TmModifierType; - constructor(type: TmModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode TmModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should learn the TM * @returns always `true` */ override apply(playerPokemon: PlayerPokemon): boolean { - - globalScene.unshiftPhase(new LearnMovePhase(globalScene.getPlayerParty().indexOf(playerPokemon), this.type.moveId, LearnMoveType.TM)); + globalScene.unshiftPhase( + new LearnMovePhase(globalScene.getPlayerParty().indexOf(playerPokemon), this.type.moveId, LearnMoveType.TM), + ); return true; } @@ -2219,8 +2323,14 @@ export class RememberMoveModifier extends ConsumablePokemonModifier { * @returns always `true` */ override apply(playerPokemon: PlayerPokemon, cost?: number): boolean { - - globalScene.unshiftPhase(new LearnMovePhase(globalScene.getPlayerParty().indexOf(playerPokemon), playerPokemon.getLearnableLevelMoves()[this.levelMoveIndex], LearnMoveType.MEMORY, cost)); + globalScene.unshiftPhase( + new LearnMovePhase( + globalScene.getPlayerParty().indexOf(playerPokemon), + playerPokemon.getLearnableLevelMoves()[this.levelMoveIndex], + LearnMoveType.MEMORY, + cost, + ), + ); return true; } @@ -2228,11 +2338,6 @@ export class RememberMoveModifier extends ConsumablePokemonModifier { export class EvolutionItemModifier extends ConsumablePokemonModifier { public override type: EvolutionItemModifierType; - - constructor(type: EvolutionItemModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode EvolutionItemModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should evolve via item @@ -2240,15 +2345,21 @@ export class EvolutionItemModifier extends ConsumablePokemonModifier { */ override apply(playerPokemon: PlayerPokemon): boolean { let matchingEvolution = pokemonEvolutions.hasOwnProperty(playerPokemon.species.speciesId) - ? pokemonEvolutions[playerPokemon.species.speciesId].find(e => e.item === this.type.evolutionItem - && (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFormKey()) - && (!e.condition || e.condition.predicate(playerPokemon))) + ? pokemonEvolutions[playerPokemon.species.speciesId].find( + e => + e.item === this.type.evolutionItem && + (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFormKey()) && + (!e.condition || e.condition.predicate(playerPokemon)), + ) : null; if (!matchingEvolution && playerPokemon.isFusion()) { - matchingEvolution = pokemonEvolutions[playerPokemon.fusionSpecies!.speciesId].find(e => e.item === this.type.evolutionItem // TODO: is the bang correct? - && (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFusionFormKey()) - && (!e.condition || e.condition.predicate(playerPokemon))); + matchingEvolution = pokemonEvolutions[playerPokemon.fusionSpecies!.speciesId].find( + e => + e.item === this.type.evolutionItem && // TODO: is the bang correct? + (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFusionFormKey()) && + (!e.condition || e.condition.predicate(playerPokemon)), + ); if (matchingEvolution) { matchingEvolution = new FusionSpeciesFormEvolution(playerPokemon.species.speciesId, matchingEvolution); } @@ -2279,7 +2390,9 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @returns `true` if {@linkcode FusePokemonModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon, playerPokemon2?: PlayerPokemon): boolean { - return super.shouldApply(playerPokemon, playerPokemon2) && !!playerPokemon2 && this.fusePokemonId === playerPokemon2.id; + return ( + super.shouldApply(playerPokemon, playerPokemon2) && !!playerPokemon2 && this.fusePokemonId === playerPokemon2.id + ); } /** @@ -2295,10 +2408,6 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { } export class MultipleParticipantExpBonusModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MultipleParticipantExpBonusModifier; } @@ -2338,7 +2447,7 @@ export class HealingBoosterModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.multiplier ]; + return [this.multiplier]; } /** @@ -2347,7 +2456,7 @@ export class HealingBoosterModifier extends PersistentModifier { * @returns always `true` */ override apply(healingMultiplier: NumberHolder): boolean { - healingMultiplier.value *= 1 + ((this.multiplier - 1) * this.getStackCount()); + healingMultiplier.value *= 1 + (this.multiplier - 1) * this.getStackCount(); return true; } @@ -2379,7 +2488,7 @@ export class ExpBoosterModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.boostMultiplier * 100 ]; + return [this.boostMultiplier * 100]; } /** @@ -2388,13 +2497,13 @@ export class ExpBoosterModifier extends PersistentModifier { * @returns always `true` */ override apply(boost: NumberHolder): boolean { - boost.value = Math.floor(boost.value * (1 + (this.getStackCount() * this.boostMultiplier))); + boost.value = Math.floor(boost.value * (1 + this.getStackCount() * this.boostMultiplier)); return true; } - getMaxStackCount(forThreshold?: boolean): number { - return this.boostMultiplier < 1 ? this.boostMultiplier < 0.6 ? 99 : 30 : 10; + getMaxStackCount(_forThreshold?: boolean): number { + return this.boostMultiplier < 1 ? (this.boostMultiplier < 0.6 ? 99 : 30) : 10; } } @@ -2441,21 +2550,17 @@ export class PokemonExpBoosterModifier extends PokemonHeldItemModifier { * @returns always `true` */ override apply(_pokemon: Pokemon, boost: NumberHolder): boolean { - boost.value = Math.floor(boost.value * (1 + (this.getStackCount() * this.boostMultiplier))); + boost.value = Math.floor(boost.value * (1 + this.getStackCount() * this.boostMultiplier)); return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 99; } } export class ExpShareModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExpShareModifier; } @@ -2478,10 +2583,6 @@ export class ExpShareModifier extends PersistentModifier { } export class ExpBalanceModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExpBalanceModifier; } @@ -2506,10 +2607,6 @@ export class ExpBalanceModifier extends PersistentModifier { export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { public override type: PokemonFriendshipBoosterModifierType; - constructor(type: PokemonFriendshipBoosterModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonFriendshipBoosterModifier; } @@ -2530,16 +2627,12 @@ export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonNatureWeightModifier; } @@ -2563,7 +2656,7 @@ export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 10; } } @@ -2615,7 +2708,7 @@ export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } @@ -2623,10 +2716,6 @@ export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier export class PokemonMultiHitModifier extends PokemonHeldItemModifier { public override type: PokemonMultiHitModifierType; - constructor(type: PokemonMultiHitModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonMultiHitModifier; } @@ -2643,7 +2732,12 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { * @param damageMultiplier {@linkcode NumberHolder} holding a damage multiplier applied to a strike of this move * @returns always `true` */ - override apply(pokemon: Pokemon, moveId: Moves, count: NumberHolder | null = null, damageMultiplier: NumberHolder | null = null): boolean { + override apply( + pokemon: Pokemon, + moveId: Moves, + count: NumberHolder | null = null, + damageMultiplier: NumberHolder | null = null, + ): boolean { const move = allMoves[moveId]; /** * The move must meet Parental Bond's restrictions for this item @@ -2660,7 +2754,8 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { if (!isNullOrUndefined(count)) { return this.applyHitCountBoost(count); - } else if (!isNullOrUndefined(damageMultiplier)) { + } + if (!isNullOrUndefined(damageMultiplier)) { return this.applyDamageModifier(pokemon, damageMultiplier); } @@ -2683,17 +2778,17 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { // Reduce first hit by 25% for each stack count damageMultiplier.value *= 1 - 0.25 * this.getStackCount(); return true; - } else if (pokemon.turnData.hitCount - pokemon.turnData.hitsLeft !== this.getStackCount() + 1) { + } + if (pokemon.turnData.hitCount - pokemon.turnData.hitsLeft !== this.getStackCount() + 1) { // Deal 25% damage for each remaining Multi Lens hit damageMultiplier.value *= 0.25; return true; - } else { - // An extra hit not caused by Multi Lens -- assume it is Parental Bond - return false; } + // An extra hit not caused by Multi Lens -- assume it is Parental Bond + return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 2; } } @@ -2702,9 +2797,15 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { public override type: FormChangeItemModifierType; public formChangeItem: FormChangeItem; public active: boolean; - public isTransferable: boolean = false; + public isTransferable = false; - constructor(type: FormChangeItemModifierType, pokemonId: number, formChangeItem: FormChangeItem, active: boolean, stackCount?: number) { + constructor( + type: FormChangeItemModifierType, + pokemonId: number, + formChangeItem: FormChangeItem, + active: boolean, + stackCount?: number, + ) { super(type, pokemonId, stackCount); this.formChangeItem = formChangeItem; this.active = active; @@ -2715,7 +2816,13 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { } clone(): PersistentModifier { - return new PokemonFormChangeItemModifier(this.type, this.pokemonId, this.formChangeItem, this.active, this.stackCount); + return new PokemonFormChangeItemModifier( + this.type, + this.pokemonId, + this.formChangeItem, + this.active, + this.stackCount, + ); } getArgs(): any[] { @@ -2744,7 +2851,7 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { return ret; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -2771,8 +2878,12 @@ export class MoneyRewardModifier extends ConsumableModifier { globalScene.getPlayerParty().map(p => { if (p.species?.speciesId === Species.GIMMIGHOUL || p.fusionSpecies?.speciesId === Species.GIMMIGHOUL) { - p.evoCounter ? p.evoCounter += Math.min(Math.floor(this.moneyMultiplier), 3) : p.evoCounter = Math.min(Math.floor(this.moneyMultiplier), 3); - const modifier = getModifierType(modifierTypes.EVOLUTION_TRACKER_GIMMIGHOUL).newModifier(p) as EvoTrackerModifier; + p.evoCounter + ? (p.evoCounter += Math.min(Math.floor(this.moneyMultiplier), 3)) + : (p.evoCounter = Math.min(Math.floor(this.moneyMultiplier), 3)); + const modifier = getModifierType(modifierTypes.EVOLUTION_TRACKER_GIMMIGHOUL).newModifier( + p, + ) as EvoTrackerModifier; globalScene.addModifier(modifier); } }); @@ -2782,10 +2893,6 @@ export class MoneyRewardModifier extends ConsumableModifier { } export class MoneyMultiplierModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MoneyMultiplierModifier; } @@ -2811,10 +2918,6 @@ export class MoneyMultiplierModifier extends PersistentModifier { } export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof DamageMoneyRewardModifier; } @@ -2829,7 +2932,7 @@ export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { * @param multiplier {@linkcode NumberHolder} holding the multiplier value * @returns always `true` */ - override apply(pokemon: Pokemon, multiplier: NumberHolder): boolean { + override apply(_pokemon: Pokemon, multiplier: NumberHolder): boolean { const moneyAmount = new NumberHolder(Math.floor(multiplier.value * (0.5 * this.getStackCount()))); globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); globalScene.addMoney(moneyAmount.value); @@ -2837,16 +2940,12 @@ export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class MoneyInterestModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MoneyInterestModifier; } @@ -2861,7 +2960,10 @@ export class MoneyInterestModifier extends PersistentModifier { const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = interestAmount.toLocaleString(userLocale); - const message = i18next.t("modifier:moneyInterestApply", { moneyAmount: formattedMoneyAmount, typeName: this.type.name }); + const message = i18next.t("modifier:moneyInterestApply", { + moneyAmount: formattedMoneyAmount, + typeName: this.type.name, + }); globalScene.queueMessage(message, undefined, true); return true; @@ -2877,10 +2979,6 @@ export class MoneyInterestModifier extends PersistentModifier { } export class HiddenAbilityRateBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof HiddenAbilityRateBoosterModifier; } @@ -2906,10 +3004,6 @@ export class HiddenAbilityRateBoosterModifier extends PersistentModifier { } export class ShinyRateBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ShinyRateBoosterModifier; } @@ -2935,10 +3029,6 @@ export class ShinyRateBoosterModifier extends PersistentModifier { } export class CriticalCatchChanceBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof CriticalCatchChanceBoosterModifier; } @@ -2967,10 +3057,6 @@ export class CriticalCatchChanceBoosterModifier extends PersistentModifier { } export class LockModifierTiersModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof LockModifierTiersModifier; } @@ -3033,10 +3119,6 @@ export class HealShopCostModifier extends PersistentModifier { } export class BoostBugSpawnModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof BoostBugSpawnModifier; } @@ -3059,10 +3141,6 @@ export class BoostBugSpawnModifier extends PersistentModifier { } export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof SwitchEffectTransferModifier; } @@ -3079,7 +3157,7 @@ export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -3090,10 +3168,6 @@ export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode ContactHeldItemTransferChanceModifier} */ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - /** * Determines the targets to transfer items from when this applies. * @param pokemon the {@linkcode Pokemon} holding this item @@ -3101,9 +3175,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @returns the opponents of the source {@linkcode Pokemon} */ getTargets(pokemon?: Pokemon, ..._args: unknown[]): Pokemon[] { - return pokemon instanceof Pokemon - ? pokemon.getOpponents() - : []; + return pokemon instanceof Pokemon ? pokemon.getOpponents() : []; } /** @@ -3128,12 +3200,20 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { return false; } - const poolType = pokemon.isPlayer() ? ModifierPoolType.PLAYER : pokemon.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const poolType = pokemon.isPlayer() + ? ModifierPoolType.PLAYER + : pokemon.hasTrainer() + ? ModifierPoolType.TRAINER + : ModifierPoolType.WILD; const transferredModifierTypes: ModifierType[] = []; - const itemModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === targetPokemon.id && m.isTransferable, targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; - let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? + const itemModifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === targetPokemon.id && m.isTransferable, + targetPokemon.isPlayer(), + ) as PokemonHeldItemModifier[]; + let highestItemTier = itemModifiers + .map(m => m.type.getOrInferTier(poolType)) + .reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); for (let i = 0; i < transferredItemCount; i++) { @@ -3171,10 +3251,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { - isTransferable: boolean = true; - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } + isTransferable = true; matchType(modifier: Modifier): boolean { return modifier instanceof TurnHeldItemTransferModifier; @@ -3189,10 +3266,15 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierType): string { - return i18next.t("modifier:turnHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: pokemon.getNameToRender(), typeName: this.type.name }); + return i18next.t("modifier:turnHeldItemTransferApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), + itemName: item.name, + pokemonName: pokemon.getNameToRender(), + typeName: this.type.name, + }); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } @@ -3223,7 +3305,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif * @returns The target {@linkcode Pokemon} as array for further use in `apply` implementations */ override getTargets(_holderPokemon: Pokemon, targetPokemon: Pokemon): Pokemon[] { - return !!targetPokemon ? [ targetPokemon ] : []; + return targetPokemon ? [targetPokemon] : []; } matchType(modifier: Modifier): boolean { @@ -3239,20 +3321,25 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif } getTransferredItemCount(): number { - return Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount()) ? 1 : 0; + return Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount() ? 1 : 0; } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierType): string { - return i18next.t("modifier:contactHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: getPokemonNameWithAffix(pokemon), typeName: this.type.name }); + return i18next.t("modifier:contactHeldItemTransferApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), + itemName: item.name, + pokemonName: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class IvScannerModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { + constructor(type: ModifierType, _stackCount?: number) { super(type); } @@ -3278,10 +3365,6 @@ export class IvScannerModifier extends PersistentModifier { } export class ExtraModifierModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExtraModifierModifier; } @@ -3312,10 +3395,6 @@ export class ExtraModifierModifier extends PersistentModifier { * @see {@linkcode apply} */ export class TempExtraModifierModifier extends LapsingPersistentModifier { - constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - /** * Goes through existing modifiers for any that match Silver Pokeball, * which will then add the max count of the new item to the existing count of the current item. @@ -3345,7 +3424,7 @@ export class TempExtraModifierModifier extends LapsingPersistentModifier { } match(modifier: Modifier): boolean { - return (modifier instanceof TempExtraModifierModifier); + return modifier instanceof TempExtraModifierModifier; } /** @@ -3360,10 +3439,6 @@ export class TempExtraModifierModifier extends LapsingPersistentModifier { } export abstract class EnemyPersistentModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - getMaxStackCount(): number { return 5; } @@ -3395,7 +3470,7 @@ abstract class EnemyDamageMultiplierModifier extends EnemyPersistentModifier { } export class EnemyDamageBoosterModifier extends EnemyDamageMultiplierModifier { - constructor(type: ModifierType, boostPercent: number, stackCount?: number) { + constructor(type: ModifierType, _boostPercent: number, stackCount?: number) { //super(type, 1 + ((boostPercent || 10) * 0.01), stackCount); super(type, 1.05, stackCount); // Hardcode multiplier temporarily } @@ -3409,7 +3484,7 @@ export class EnemyDamageBoosterModifier extends EnemyDamageMultiplierModifier { } getArgs(): any[] { - return [ (this.damageMultiplier - 1) * 100 ]; + return [(this.damageMultiplier - 1) * 100]; } getMaxStackCount(): number { @@ -3418,7 +3493,7 @@ export class EnemyDamageBoosterModifier extends EnemyDamageMultiplierModifier { } export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier { - constructor(type: ModifierType, reductionPercent: number, stackCount?: number) { + constructor(type: ModifierType, _reductionPercent: number, stackCount?: number) { //super(type, 1 - ((reductionPercent || 5) * 0.01), stackCount); super(type, 0.975, stackCount); // Hardcode multiplier temporarily } @@ -3432,7 +3507,7 @@ export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier { } getArgs(): any[] { - return [ (1 - this.damageMultiplier) * 100 ]; + return [(1 - this.damageMultiplier) * 100]; } getMaxStackCount(): number { @@ -3443,7 +3518,7 @@ export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier { export class EnemyTurnHealModifier extends EnemyPersistentModifier { public healPercent: number; - constructor(type: ModifierType, healPercent: number, stackCount?: number) { + constructor(type: ModifierType, _healPercent: number, stackCount?: number) { super(type, stackCount); // Hardcode temporarily @@ -3459,7 +3534,7 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { } getArgs(): any[] { - return [ this.healPercent ]; + return [this.healPercent]; } /** @@ -3469,8 +3544,20 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { */ override apply(enemyPokemon: Pokemon): boolean { if (!enemyPokemon.isFullHp()) { - globalScene.unshiftPhase(new PokemonHealPhase(enemyPokemon.getBattlerIndex(), - Math.max(Math.floor(enemyPokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), i18next.t("modifier:enemyTurnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(enemyPokemon) }), true, false, false, false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + enemyPokemon.getBattlerIndex(), + Math.max(Math.floor(enemyPokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), + i18next.t("modifier:enemyTurnHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(enemyPokemon), + }), + true, + false, + false, + false, + true, + ), + ); return true; } @@ -3486,12 +3573,12 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi public effect: StatusEffect; public chance: number; - constructor(type: ModifierType, effect: StatusEffect, chancePercent: number, stackCount?: number) { + constructor(type: ModifierType, effect: StatusEffect, _chancePercent: number, stackCount?: number) { super(type, stackCount); this.effect = effect; //Hardcode temporarily - this.chance = .025 * ((this.effect === StatusEffect.BURN || this.effect === StatusEffect.POISON) ? 2 : 1); + this.chance = 0.025 * (this.effect === StatusEffect.BURN || this.effect === StatusEffect.POISON ? 2 : 1); } match(modifier: Modifier): boolean { @@ -3503,7 +3590,7 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi } getArgs(): any[] { - return [ this.effect, this.chance * 100 ]; + return [this.effect, this.chance * 100]; } /** @@ -3512,7 +3599,7 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi * @returns `true` if the {@linkcode Pokemon} was affected */ override apply(enemyPokemon: Pokemon): boolean { - if (Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { + if (Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount()) { return enemyPokemon.trySetStatus(this.effect, true); } @@ -3527,11 +3614,11 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier { public chance: number; - constructor(type: ModifierType, chancePercent: number, stackCount?: number) { + constructor(type: ModifierType, _chancePercent: number, stackCount?: number) { super(type, stackCount); //Hardcode temporarily - this.chance = .025; + this.chance = 0.025; } match(modifier: Modifier): boolean { @@ -3543,7 +3630,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier } getArgs(): any[] { - return [ this.chance * 100 ]; + return [this.chance * 100]; } /** @@ -3552,8 +3639,10 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier * @returns `true` if the {@linkcode Pokemon} was healed */ override apply(enemyPokemon: Pokemon): boolean { - if (enemyPokemon.status && Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { - globalScene.queueMessage(getStatusEffectHealText(enemyPokemon.status.effect, getPokemonNameWithAffix(enemyPokemon))); + if (enemyPokemon.status && Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount()) { + globalScene.queueMessage( + getStatusEffectHealText(enemyPokemon.status.effect, getPokemonNameWithAffix(enemyPokemon)), + ); enemyPokemon.resetStatus(); enemyPokemon.updateInfo(); return true; @@ -3570,7 +3659,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier export class EnemyEndureChanceModifier extends EnemyPersistentModifier { public chance: number; - constructor(type: ModifierType, chancePercent?: number, stackCount?: number) { + constructor(type: ModifierType, _chancePercent?: number, stackCount?: number) { super(type, stackCount || 10); //Hardcode temporarily @@ -3586,7 +3675,7 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier { } getArgs(): any[] { - return [ this.chance ]; + return [this.chance]; } /** @@ -3595,7 +3684,7 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier { * @returns `true` if {@linkcode Pokemon} endured */ override apply(target: Pokemon): boolean { - if (target.battleData.endured || target.randSeedInt(100) >= (this.chance * this.getStackCount())) { + if (target.battleData.endured || target.randSeedInt(100) >= this.chance * this.getStackCount()) { return false; } @@ -3629,7 +3718,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } getArgs(): any[] { - return [ this.chance * 100 ]; + return [this.chance * 100]; } /** @@ -3638,7 +3727,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { * @returns `true` if the {@linkcode EnemyPokemon} is a fusion */ override apply(isFusion: BooleanHolder): boolean { - if (Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { + if (Phaser.Math.RND.realInRange(0, 1) >= this.chance * this.getStackCount()) { return false; } @@ -3658,8 +3747,10 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { * - The enemy * @param isPlayer {@linkcode boolean} for whether the player (`true`) or enemy (`false`) is being overridden */ -export function overrideModifiers(isPlayer: boolean = true): void { - const modifiersOverride: ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; +export function overrideModifiers(isPlayer = true): void { + const modifiersOverride: ModifierOverride[] = isPlayer + ? Overrides.STARTING_MODIFIER_OVERRIDE + : Overrides.OPP_MODIFIER_OVERRIDE; if (!modifiersOverride || modifiersOverride.length === 0 || !globalScene) { return; } @@ -3669,16 +3760,16 @@ export function overrideModifiers(isPlayer: boolean = true): void { globalScene.clearEnemyModifiers(); } - modifiersOverride.forEach(item => { + for (const item of modifiersOverride) { const modifierFunc = modifierTypes[item.name]; let modifierType: ModifierType | null = modifierFunc(); if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in item) && (item.type !== null) ? [ item.type ] : undefined; + const pregenArgs = "type" in item && item.type !== null ? [item.type] : undefined; modifierType = modifierType.generateType([], pregenArgs); } - const modifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier() as PersistentModifier; + const modifier = modifierType && (modifierType.withIdFromFunc(modifierFunc).newModifier() as PersistentModifier); if (modifier) { modifier.stackCount = item.count || 1; @@ -3688,7 +3779,7 @@ export function overrideModifiers(isPlayer: boolean = true): void { globalScene.addEnemyModifier(modifier, true, true); } } - }); + } } /** @@ -3698,8 +3789,10 @@ export function overrideModifiers(isPlayer: boolean = true): void { * @param pokemon {@linkcode Pokemon} whose held items are being overridden * @param isPlayer {@linkcode boolean} for whether the {@linkcode pokemon} is the player's (`true`) or an enemy (`false`) */ -export function overrideHeldItems(pokemon: Pokemon, isPlayer: boolean = true): void { - const heldItemsOverride: ModifierOverride[] = isPlayer ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; +export function overrideHeldItems(pokemon: Pokemon, isPlayer = true): void { + const heldItemsOverride: ModifierOverride[] = isPlayer + ? Overrides.STARTING_HELD_ITEMS_OVERRIDE + : Overrides.OPP_HELD_ITEMS_OVERRIDE; if (!heldItemsOverride || heldItemsOverride.length === 0 || !globalScene) { return; } @@ -3708,17 +3801,18 @@ export function overrideHeldItems(pokemon: Pokemon, isPlayer: boolean = true): v globalScene.clearEnemyHeldItemModifiers(pokemon); } - heldItemsOverride.forEach(item => { + for (const item of heldItemsOverride) { const modifierFunc = modifierTypes[item.name]; let modifierType: ModifierType | null = modifierFunc(); const qty = item.count || 1; if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in item) && (item.type !== null) ? [ item.type ] : undefined; + const pregenArgs = "type" in item && item.type !== null ? [item.type] : undefined; modifierType = modifierType.generateType([], pregenArgs); } - const heldItemModifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier; + const heldItemModifier = + modifierType && (modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier); if (heldItemModifier) { heldItemModifier.pokemonId = pokemon.id; heldItemModifier.stackCount = qty; @@ -3728,5 +3822,5 @@ export function overrideHeldItems(pokemon: Pokemon, isPlayer: boolean = true): v globalScene.addEnemyModifier(heldItemModifier, true, true); } } - }); + } } diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index f504fd0aaa2..7d91e64382a 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -1,5 +1,9 @@ import { ModifierTier } from "#app/modifier/modifier-tier"; -import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type"; +import { + regenerateModifierPoolThresholds, + ModifierPoolType, + getEnemyBuffModifierForWave, +} from "#app/modifier/modifier-type"; import { EnemyPersistentModifier } from "#app/modifier/modifier"; import { Phase } from "#app/phase"; import { globalScene } from "#app/global-scene"; @@ -13,13 +17,24 @@ export class AddEnemyBuffModifierPhase extends Phase { super.start(); const waveIndex = globalScene.currentBattle.waveIndex; - const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON; + const tier = !(waveIndex % 1000) + ? ModifierTier.ULTRA + : !(waveIndex % 250) + ? ModifierTier.GREAT + : ModifierTier.COMMON; regenerateModifierPoolThresholds(globalScene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); const count = Math.ceil(waveIndex / 250); for (let i = 0; i < count; i++) { - globalScene.addEnemyModifier(getEnemyBuffModifierForWave(tier, globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false)), true, true); + globalScene.addEnemyModifier( + getEnemyBuffModifierForWave( + tier, + globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false), + ), + true, + true, + ); } globalScene.updateModifiers(false, true); this.end(); diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 77a8043aee9..6b905c2a07f 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -1,7 +1,13 @@ import { BattlerIndex } from "#app/battle"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { SubstituteTag } from "#app/data/battler-tags"; -import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, getCriticalCaptureChance } from "#app/data/pokeball"; +import { + doPokeballBounceAnim, + getPokeballAtlasKey, + getPokeballCatchMultiplier, + getPokeballTintColor, + getCriticalCaptureChance, +} from "#app/data/pokeball"; import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; import type { EnemyPokemon } from "#app/field/pokemon"; @@ -54,7 +60,7 @@ export class AttemptCapturePhase extends PokemonPhase { const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; const modifiedCatchRate = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); - const shakeProbability = Math.round(65536 / Math.pow((255 / modifiedCatchRate), 0.1875)); // Formula taken from gen 6 + const shakeProbability = Math.round(65536 / Math.pow(255 / modifiedCatchRate, 0.1875)); // Formula taken from gen 6 const criticalCaptureChance = getCriticalCaptureChance(modifiedCatchRate); const isCritical = pokemon.randSeedInt(256) < criticalCaptureChance; const fpOffset = pokemon.getFieldPositionOffset(); @@ -124,7 +130,12 @@ export class AttemptCapturePhase extends PokemonPhase { this.failCatch(shakeCount); } else if (shakeCount++ < (isCritical ? 1 : 3)) { // Shake check (skip check for critical or guaranteed captures, but still play the sound) - if (pokeballMultiplier === -1 || isCritical || modifiedCatchRate >= 255 || pokemon.randSeedInt(65536) < shakeProbability) { + if ( + pokeballMultiplier === -1 || + isCritical || + modifiedCatchRate >= 255 || + pokemon.randSeedInt(65536) < shakeProbability + ) { globalScene.playSound("se/pb_move"); } else { shakeCounter.stop(); @@ -154,27 +165,29 @@ export class AttemptCapturePhase extends PokemonPhase { alpha: 0, duration: 200, easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() + onComplete: () => pbTint.destroy(), }); - } + }, }); } }, onComplete: () => { this.catch(); - } + }, }); }; // Ball bounces (handled in pokemon.ts) - globalScene.time.delayedCall(250, () => doPokeballBounceAnim(this.pokeball, 16, 72, 350, doShake, isCritical)); - } + globalScene.time.delayedCall(250, () => + doPokeballBounceAnim(this.pokeball, 16, 72, 350, doShake, isCritical), + ); + }, }); - } + }, }); } - failCatch(shakeCount: number) { + failCatch(_shakeCount: number) { const pokemon = this.getPokemon(); globalScene.playSound("se/pb_rel"); @@ -199,7 +212,7 @@ export class AttemptCapturePhase extends PokemonPhase { targets: pokemon, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); globalScene.currentBattle.lastUsedPokeball = this.pokeballType; @@ -212,7 +225,10 @@ export class AttemptCapturePhase extends PokemonPhase { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { globalScene.validateAchv(achvs.HIDDEN_ABILITY); } @@ -232,72 +248,115 @@ export class AttemptCapturePhase extends PokemonPhase { globalScene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - globalScene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - const end = () => { - globalScene.unshiftPhase(new VictoryPhase(this.battlerIndex)); - globalScene.pokemonInfoContainer.hide(); - this.removePb(); - this.end(); - }; - const removePokemon = () => { - globalScene.addFaintedEnemyScore(pokemon); - pokemon.hp = 0; - pokemon.trySetStatus(StatusEffect.FAINT); - globalScene.clearEnemyHeldItemModifiers(); - pokemon.leaveField(true, true, true); - }; - const addToParty = (slotIndex?: number) => { - const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex); - const modifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (globalScene.getPlayerParty().filter(p => p.isShiny()).length === PLAYER_PARTY_MAX_SIZE) { - globalScene.validateAchv(achvs.SHINY_PARTY); - } - Promise.all(modifiers.map(m => globalScene.addModifier(m, true))).then(() => { - globalScene.updateModifiers(true); - removePokemon(); - if (newPokemon) { - newPokemon.loadAssets().then(end); + globalScene.ui.showText( + i18next.t("battle:pokemonCaught", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + const end = () => { + globalScene.unshiftPhase(new VictoryPhase(this.battlerIndex)); + globalScene.pokemonInfoContainer.hide(); + this.removePb(); + this.end(); + }; + const removePokemon = () => { + globalScene.addFaintedEnemyScore(pokemon); + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + globalScene.clearEnemyHeldItemModifiers(); + pokemon.leaveField(true, true, true); + }; + const addToParty = (slotIndex?: number) => { + const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex); + const modifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (globalScene.getPlayerParty().filter(p => p.isShiny()).length === PLAYER_PARTY_MAX_SIZE) { + globalScene.validateAchv(achvs.SHINY_PARTY); + } + Promise.all(modifiers.map(m => globalScene.addModifier(m, true))).then(() => { + globalScene.updateModifiers(true); + removePokemon(); + if (newPokemon) { + newPokemon.loadAssets().then(end); + } else { + end(); + } + }); + }; + Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (globalScene.getPlayerParty().length === PLAYER_PARTY_MAX_SIZE) { + const promptRelease = () => { + globalScene.ui.showText( + i18next.t("battle:partyFull", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => { + globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + const newPokemon = globalScene.addPlayerPokemon( + pokemon.species, + pokemon.level, + pokemon.abilityIndex, + pokemon.formIndex, + pokemon.gender, + pokemon.shiny, + pokemon.variant, + pokemon.ivs, + pokemon.nature, + pokemon, + ); + globalScene.ui.setMode( + Mode.SUMMARY, + newPokemon, + 0, + SummaryUiMode.DEFAULT, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + false, + ); + }, + () => { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.RELEASE, + this.fieldIndex, + (slotIndex: number, _option: PartyOption) => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(slotIndex); + } else { + promptRelease(); + } + }); + }, + ); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }, + "fullParty", + ); + }, + ); + }; + promptRelease(); } else { - end(); + addToParty(); } }); - }; - Promise.all([ pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon) ]).then(() => { - if (globalScene.getPlayerParty().length === PLAYER_PARTY_MAX_SIZE) { - const promptRelease = () => { - globalScene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { - globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); - globalScene.ui.setMode(Mode.CONFIRM, () => { - const newPokemon = globalScene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); - globalScene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - promptRelease(); - }); - }, false); - }, () => { - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: number, _option: PartyOption) => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(slotIndex); - } else { - promptRelease(); - } - }); - }); - }, () => { - globalScene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }, "fullParty"); - }); - }; - promptRelease(); - } else { - addToParty(); - } - }); - }, 0, true); + }, + 0, + true, + ); } removePb() { @@ -307,7 +366,7 @@ export class AttemptCapturePhase extends PokemonPhase { delay: 250, ease: "Sine.easeIn", alpha: 0, - onComplete: () => this.pokeball.destroy() + onComplete: () => this.pokeball.destroy(), }); } } diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index 72a108c1991..c9c0e23dabb 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -11,14 +11,9 @@ import { PokemonPhase } from "./pokemon-phase"; import { globalScene } from "#app/global-scene"; export class AttemptRunPhase extends PokemonPhase { - /** For testing purposes: this is to force the pokemon to fail and escape */ public forceFailEscape = false; - constructor(fieldIndex: number) { - super(fieldIndex); - } - start() { super.start(); @@ -38,15 +33,18 @@ export class AttemptRunPhase extends PokemonPhase { globalScene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); globalScene.tweens.add({ - targets: [ globalScene.arenaEnemy, enemyField ].flat(), + targets: [globalScene.arenaEnemy, enemyField].flat(), alpha: 0, duration: 250, ease: "Sine.easeIn", - onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()) + onComplete: () => + // biome-ignore lint/complexity/noForEach: TODO + enemyField.forEach(enemyPokemon => enemyPokemon.destroy()), }); globalScene.clearEnemyHeldItemModifiers(); + // biome-ignore lint/complexity/noForEach: TODO enemyField.forEach(enemyPokemon => { enemyPokemon.hideInfo().then(() => enemyPokemon.destroy()); enemyPokemon.hp = 0; @@ -65,9 +63,15 @@ export class AttemptRunPhase extends PokemonPhase { attemptRunAway(playerField: PlayerPokemon[], enemyField: EnemyPokemon[], escapeChance: Utils.NumberHolder) { /** Sum of the speed of all enemy pokemon on the field */ - const enemySpeed = enemyField.reduce((total: number, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0); + const enemySpeed = enemyField.reduce( + (total: number, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), + 0, + ); /** Sum of the speed of all player pokemon on the field */ - const playerSpeed = playerField.reduce((total: number, playerPokemon: Pokemon) => total + playerPokemon.getStat(Stat.SPD), 0); + const playerSpeed = playerField.reduce( + (total: number, playerPokemon: Pokemon) => total + playerPokemon.getStat(Stat.SPD), + 0, + ); /* The way the escape chance works is by looking at the difference between your speed and the enemy field's average speed as a ratio. The higher this ratio, the higher your chance of success. * However, there is a cap for the ratio of your speed vs enemy speed which beyond that point, you won't gain any advantage. It also looks at how many times you've tried to escape. @@ -104,6 +108,10 @@ export class AttemptRunPhase extends PokemonPhase { const escapeSlope = (maxChance - minChance) / speedCap; // This will calculate the escape chance given all of the above and clamp it to the range of [`minChance`, `maxChance`] - escapeChance.value = Phaser.Math.Clamp(Math.round((escapeSlope * speedRatio) + minChance + (escapeBonus * globalScene.currentBattle.escapeAttempts++)), minChance, maxChance); + escapeChance.value = Phaser.Math.Clamp( + Math.round(escapeSlope * speedRatio + minChance + escapeBonus * globalScene.currentBattle.escapeAttempts++), + minChance, + maxChance, + ); } } diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index c0922b91809..a7158264ab7 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -18,7 +18,10 @@ export class BattleEndPhase extends BattlePhase { super.start(); globalScene.gameData.gameStats.battles++; - if (globalScene.gameMode.isEndless && globalScene.currentBattle.waveIndex + 1 > globalScene.gameData.gameStats.highestEndlessWave) { + if ( + globalScene.gameMode.isEndless && + globalScene.currentBattle.waveIndex + 1 > globalScene.gameData.gameStats.highestEndlessWave + ) { globalScene.gameData.gameStats.highestEndlessWave = globalScene.currentBattle.waveIndex + 1; } @@ -37,7 +40,7 @@ export class BattleEndPhase extends BattlePhase { } for (const pokemon of globalScene.getField()) { - if (pokemon && pokemon.battleSummonData) { + if (pokemon?.battleSummonData) { pokemon.battleSummonData.waveTurnCount = 1; } } @@ -52,7 +55,9 @@ export class BattleEndPhase extends BattlePhase { globalScene.clearEnemyHeldItemModifiers(); - const lapsingModifiers = globalScene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; + const lapsingModifiers = globalScene.findModifiers( + m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier, + ) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; for (const m of lapsingModifiers) { const args: any[] = []; if (m instanceof LapsingPokemonHeldItemModifier) { diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts index 4fc826b7957..3fc2b9c0467 100644 --- a/src/phases/battle-phase.ts +++ b/src/phases/battle-phase.ts @@ -12,7 +12,7 @@ export class BattlePhase extends Phase { const tintSprites = globalScene.currentBattle.trainer?.getTintSprites()!; // TODO: is this bang correct? for (let i = 0; i < sprites.length; i++) { const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; - [ sprites[i], tintSprites[i] ].map(sprite => { + [sprites[i], tintSprites[i]].map(sprite => { if (visible) { sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; } @@ -30,7 +30,7 @@ export class BattlePhase extends Phase { y: "+=16", alpha: 1, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } @@ -41,7 +41,7 @@ export class BattlePhase extends Phase { y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } } diff --git a/src/phases/berry-phase.ts b/src/phases/berry-phase.ts index dd56e8b37d7..0048f8cd2f2 100644 --- a/src/phases/berry-phase.ts +++ b/src/phases/berry-phase.ts @@ -14,20 +14,24 @@ export class BerryPhase extends FieldPhase { start() { super.start(); - this.executeForAll((pokemon) => { - const hasUsableBerry = !!globalScene.findModifier((m) => { + this.executeForAll(pokemon => { + const hasUsableBerry = !!globalScene.findModifier(m => { return m instanceof BerryModifier && m.shouldApply(pokemon); }, pokemon.isPlayer()); if (hasUsableBerry) { const cancelled = new Utils.BooleanHolder(false); - pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); + pokemon.getOpponents().map(opp => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); if (cancelled.value) { - globalScene.queueMessage(i18next.t("abilityTriggers:preventBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("abilityTriggers:preventBerryUse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } else { globalScene.unshiftPhase( - new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM) + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM), ); for (const berryModifier of globalScene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon)) { diff --git a/src/phases/check-status-effect-phase.ts b/src/phases/check-status-effect-phase.ts index 683c1ea1cd2..f59dfea9f02 100644 --- a/src/phases/check-status-effect-phase.ts +++ b/src/phases/check-status-effect-phase.ts @@ -4,8 +4,8 @@ import type { BattlerIndex } from "#app/battle"; import { globalScene } from "#app/global-scene"; export class CheckStatusEffectPhase extends Phase { - private order : BattlerIndex[]; - constructor(order : BattlerIndex[]) { + private order: BattlerIndex[]; + constructor(order: BattlerIndex[]) { super(); this.order = order; } @@ -13,7 +13,7 @@ export class CheckStatusEffectPhase extends Phase { start() { const field = globalScene.getField(); for (const o of this.order) { - if (field[o].status && field[o].status.isPostTurn()) { + if (field[o].status?.isPostTurn()) { globalScene.unshiftPhase(new PostTurnStatusEffectPhase(o)); } } diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index ea16e91b990..ba4837fd7cc 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -39,26 +39,43 @@ export class CheckSwitchPhase extends BattlePhase { } // ...if there are no other allowed Pokemon in the player's party to switch with - if (!globalScene.getPlayerParty().slice(1).filter(p => p.isActive()).length) { + if ( + !globalScene + .getPlayerParty() + .slice(1) + .filter(p => p.isActive()).length + ) { return super.end(); } // ...or if any player Pokemon has an effect that prevents the checked Pokemon from switching - if (pokemon.getTag(BattlerTagType.FRENZY) - || pokemon.isTrapped() - || globalScene.getPlayerField().some(p => p.getTag(BattlerTagType.COMMANDED))) { + if ( + pokemon.getTag(BattlerTagType.FRENZY) || + pokemon.isTrapped() || + globalScene.getPlayerField().some(p => p.getTag(BattlerTagType.COMMANDED)) + ) { return super.end(); } - globalScene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon") }), null, () => { - globalScene.ui.setMode(Mode.CONFIRM, () => { - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.unshiftPhase(new SwitchPhase(SwitchType.INITIAL_SWITCH, this.fieldIndex, false, true)); - this.end(); - }, () => { - globalScene.ui.setMode(Mode.MESSAGE); - this.end(); - }); - }); + globalScene.ui.showText( + i18next.t("battle:switchQuestion", { + pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon"), + }), + null, + () => { + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.unshiftPhase(new SwitchPhase(SwitchType.INITIAL_SWITCH, this.fieldIndex, false, true)); + this.end(); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + this.end(); + }, + ); + }, + ); } } diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 5f4466d942c..055d52e7a8b 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -41,12 +41,16 @@ export class CommandPhase extends FieldPhase { const commandUiHandler = globalScene.ui.handlers[Mode.COMMAND]; // 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 === Biome.END; + const cursorResetEvent = + globalScene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || + globalScene.currentBattle.battleType === BattleType.TRAINER || + globalScene.arena.biomeType === Biome.END; if (commandUiHandler) { - if ((globalScene.currentBattle.turn === 1 && (!globalScene.commandCursorMemory || cursorResetEvent)) || commandUiHandler.getCursor() === Command.POKEMON) { + if ( + (globalScene.currentBattle.turn === 1 && (!globalScene.commandCursorMemory || cursorResetEvent)) || + commandUiHandler.getCursor() === Command.POKEMON + ) { commandUiHandler.setCursor(Command.FIGHT); } else { commandUiHandler.setCursor(commandUiHandler.getCursor()); @@ -61,14 +65,24 @@ export class CommandPhase extends FieldPhase { } 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 }; + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: allyCommand?.command, + skip: true, + }; } } } // If the Pokemon has applied Commander's effects to its ally, skip this command - if (globalScene.currentBattle?.double && this.getPokemon().getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === this.getPokemon()) { - globalScene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.FIGHT, move: { move: Moves.NONE, targets: []}, skip: true }; + if ( + globalScene.currentBattle?.double && + this.getPokemon().getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === this.getPokemon() + ) { + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: Command.FIGHT, + move: { move: Moves.NONE, targets: [] }, + 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. @@ -85,9 +99,20 @@ export class CommandPhase extends FieldPhase { const moveQueue = playerPokemon.getMoveQueue(); - while (moveQueue.length && moveQueue[0] - && moveQueue[0].move && !moveQueue[0].virtual && (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) - || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable(playerPokemon, moveQueue[0].ignorePP))) { // TODO: is the bang correct? + while ( + moveQueue.length && + moveQueue[0] && + moveQueue[0].move && + !moveQueue[0].virtual && + (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) || + !playerPokemon + .getMoveset() + [playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable( + playerPokemon, + moveQueue[0].ignorePP, + )) + ) { + // TODO: is the bang correct? moveQueue.shift(); } @@ -97,14 +122,21 @@ export class CommandPhase extends FieldPhase { this.handleCommand(Command.FIGHT, -1); } else { const moveIndex = playerPokemon.getMoveset().findIndex(m => m?.moveId === queuedMove.move); - if ((moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) || queuedMove.virtual) { // TODO: is the bang correct? + if ( + (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) || + queuedMove.virtual + ) { + // TODO: is the bang correct? this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, queuedMove); } else { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); } } } else { - if (globalScene.currentBattle.isBattleMysteryEncounter() && globalScene.currentBattle.mysteryEncounter?.skipToFightInput) { + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + globalScene.currentBattle.mysteryEncounter?.skipToFightInput + ) { globalScene.ui.clearText(); globalScene.ui.setMode(Mode.FIGHT, this.fieldIndex); } else { @@ -115,17 +147,18 @@ export class CommandPhase extends FieldPhase { handleCommand(command: Command, cursor: number, ...args: any[]): boolean { const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; - let success: boolean = false; + let success = false; switch (command) { 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, args[0] as boolean) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length)) { - + const turnMove: TurnMove | undefined = args.length === 2 ? (args[1] as TurnMove) : undefined; + if ( + cursor === -1 || + playerPokemon.trySelectMove(cursor, args[0] as boolean) || + (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length) + ) { let moveId: Moves; if (useStruggle) { moveId = Moves.STRUGGLE; @@ -137,11 +170,26 @@ export class CommandPhase extends FieldPhase { moveId = Moves.NONE; } - const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: 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 }; + const turnCommand: TurnCommand = { + command: Command.FIGHT, + cursor: cursor, + move: { move: moveId, targets: [], ignorePP: 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 ]; + turnCommand.targets = [this.fieldIndex]; } console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); if (moveTargets.targets.length > 1 && moveTargets.multiple) { @@ -162,61 +210,122 @@ export class CommandPhase extends FieldPhase { globalScene.ui.setMode(Mode.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 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(Mode.FIGHT, this.fieldIndex); - }, null, true); + globalScene.ui.showText( + i18next.t(errorMessage, { moveName: moveName }), + null, + () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.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 === Biome.END && (!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex )) { + 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 === Biome.END && + (!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex) + ) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + globalScene.ui.showText( + i18next.t("battle:noPokeballForce"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (globalScene.currentBattle.isBattleMysteryEncounter() && !globalScene.currentBattle.mysteryEncounter!.catchAllowed) { + globalScene.ui.showText( + i18next.t("battle:noPokeballTrainer"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } else if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + !globalScene.currentBattle.mysteryEncounter!.catchAllowed + ) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noPokeballMysteryEncounter"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + globalScene.ui.showText( + i18next.t("battle:noPokeballMysteryEncounter"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - const targets = globalScene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); + const targets = globalScene + .getEnemyField() + .filter(p => p.isActive(true)) + .map(p => p.getBattlerIndex()); if (targets.length > 1) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.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(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { + globalScene.ui.showText( + i18next.t("battle:noPokeballMulti"), + null, + () => { globalScene.ui.showText("", 0); globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + }, + null, + true, + ); + } else if (cursor < 5) { + const targetPokemon = globalScene.getEnemyField().find(p => p.isActive(true)); + if ( + targetPokemon?.isBoss() && + targetPokemon?.bossSegmentIndex >= 1 && + !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && + cursor < PokeballType.MASTER_BALL + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballStrong"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - globalScene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; + 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; @@ -231,22 +340,42 @@ export class CommandPhase extends FieldPhase { const isSwitch = command === Command.POKEMON; const { currentBattle, arena } = globalScene; const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed; - if (!isSwitch && (arena.biomeType === Biome.END || (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))) { + if ( + !isSwitch && + (arena.biomeType === Biome.END || + (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed)) + ) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (!isSwitch && (currentBattle.battleType === BattleType.TRAINER || currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE)) { + globalScene.ui.showText( + i18next.t("battle:noEscapeForce"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } else if ( + !isSwitch && + (currentBattle.battleType === BattleType.TRAINER || + currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) + ) { globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + globalScene.ui.showText( + i18next.t("battle:noEscapeTrainer"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - const batonPass = isSwitch && args[0] as boolean; + const batonPass = isSwitch && (args[0] as boolean); const trappedAbMessages: string[] = []; if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { currentBattle.turnCommands[this.fieldIndex] = isSwitch @@ -254,18 +383,24 @@ export class CommandPhase extends FieldPhase { : { command: Command.RUN }; success = true; if (!isSwitch && this.fieldIndex) { - currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; } } else if (trappedAbMessages.length > 0) { if (!isSwitch) { globalScene.ui.setMode(Mode.MESSAGE); } - globalScene.ui.showText(trappedAbMessages[0], null, () => { - globalScene.ui.showText("", 0); - if (!isSwitch) { - globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } - }, null, true); + globalScene.ui.showText( + trappedAbMessages[0], + null, + () => { + globalScene.ui.showText("", 0); + if (!isSwitch) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + }, + null, + true, + ); } else { const trapTag = playerPokemon.getTag(TrappedTag); const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER); @@ -281,9 +416,12 @@ export class CommandPhase extends FieldPhase { const showNoEscapeText = (tag: any) => { globalScene.ui.showText( i18next.t("battle:noEscapePokemon", { - pokemonName: tag.sourceId && globalScene.getPokemonById(tag.sourceId) ? getPokemonNameWithAffix(globalScene.getPokemonById(tag.sourceId)!) : "", + 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") + escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee"), }), null, () => { @@ -293,7 +431,7 @@ export class CommandPhase extends FieldPhase { } }, null, - true + true, ); }; diff --git a/src/phases/common-anim-phase.ts b/src/phases/common-anim-phase.ts index 9ca74ed5a77..d32e93ea6aa 100644 --- a/src/phases/common-anim-phase.ts +++ b/src/phases/common-anim-phase.ts @@ -9,7 +9,7 @@ export class CommonAnimPhase extends PokemonPhase { private targetIndex: number | undefined; private playOnEmptyField: boolean; - constructor(battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex, anim?: CommonAnim, playOnEmptyField: boolean = false) { + constructor(battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex, anim?: CommonAnim, playOnEmptyField = false) { super(battlerIndex); this.anim = anim!; // TODO: is this bang correct? @@ -22,7 +22,10 @@ export class CommonAnimPhase extends PokemonPhase { } start() { - const target = this.targetIndex !== undefined ? (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField())[this.targetIndex] : this.getPokemon(); + const target = + this.targetIndex !== undefined + ? (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField())[this.targetIndex] + : this.getPokemon(); new CommonBattleAnim(this.anim, this.getPokemon(), target).play(false, () => { this.end(); }); diff --git a/src/phases/damage-anim-phase.ts b/src/phases/damage-anim-phase.ts index a21d9d4622a..e31fe8c9475 100644 --- a/src/phases/damage-anim-phase.ts +++ b/src/phases/damage-anim-phase.ts @@ -1,5 +1,5 @@ import { globalScene } from "#app/global-scene"; -import { type BattlerIndex } from "#app/battle"; +import type { BattlerIndex } from "#app/battle"; import { BattleSpec } from "#enums/battle-spec"; import { type DamageResult, HitResult } from "#app/field/pokemon"; import { fixedInt } from "#app/utils"; @@ -10,7 +10,7 @@ export class DamageAnimPhase extends PokemonPhase { private damageResult: DamageResult; private critical: boolean; - constructor(battlerIndex: BattlerIndex, amount: number, damageResult?: DamageResult, critical: boolean = false) { + constructor(battlerIndex: BattlerIndex, amount: number, damageResult?: DamageResult, critical = false) { super(battlerIndex); this.amount = amount; @@ -63,14 +63,20 @@ export class DamageAnimPhase extends PokemonPhase { repeat: 5, startAt: 200, callback: () => { - this.getPokemon().getSprite().setVisible(flashTimer.repeatCount % 2 === 0); + this.getPokemon() + .getSprite() + .setVisible(flashTimer.repeatCount % 2 === 0); if (!flashTimer.repeatCount) { - this.getPokemon().updateInfo().then(() => this.end()); + this.getPokemon() + .updateInfo() + .then(() => this.end()); } - } + }, }); } else { - this.getPokemon().updateInfo().then(() => this.end()); + this.getPokemon() + .updateInfo() + .then(() => this.end()); } } diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index b2844591e33..49a408e8699 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -16,7 +16,6 @@ import type { EggLapsePhase } from "./egg-lapse-phase"; import type { EggHatchData } from "#app/data/egg-hatch-data"; import { doShinySparkleAnim } from "#app/field/anims"; - /** * Class that represents egg hatching */ @@ -78,7 +77,6 @@ export class EggHatchPhase extends Phase { super.start(); globalScene.ui.setModeForceTransition(Mode.EGG_HATCH_SCENE).then(() => { - if (!this.egg) { return this.end(); } @@ -101,13 +99,21 @@ export class EggHatchPhase extends Phase { this.eggHatchBg.setOrigin(0, 0); this.eggHatchContainer.add(this.eggHatchBg); - this.eggContainer = globalScene.add.container(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2); + this.eggContainer = globalScene.add.container( + this.eggHatchBg.displayWidth / 2, + this.eggHatchBg.displayHeight / 2, + ); this.eggSprite = globalScene.add.sprite(0, 0, "egg", `egg_${this.egg.getKey()}`); this.eggCrackSprite = globalScene.add.sprite(0, 0, "egg_crack", "0"); this.eggCrackSprite.setVisible(false); - this.eggLightraysOverlay = globalScene.add.sprite((-this.eggHatchBg.displayWidth / 2) + 4, -this.eggHatchBg.displayHeight / 2, "egg_lightrays", "3"); + this.eggLightraysOverlay = globalScene.add.sprite( + -this.eggHatchBg.displayWidth / 2 + 4, + -this.eggHatchBg.displayHeight / 2, + "egg_lightrays", + "3", + ); this.eggLightraysOverlay.setOrigin(0, 0); this.eggLightraysOverlay.setVisible(false); @@ -120,8 +126,15 @@ export class EggHatchPhase extends Phase { this.eggHatchContainer.add(this.eggCounterContainer); const getPokemonSprite = () => { - const ret = globalScene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.add.sprite( + this.eggHatchBg.displayWidth / 2, + this.eggHatchBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -132,7 +145,13 @@ export class EggHatchPhase extends Phase { this.eggHatchContainer.add(this.pokemonShinySparkle); - this.eggHatchOverlay = globalScene.add.rectangle(0, -globalScene.game.canvas.height / 6, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0xFFFFFF); + this.eggHatchOverlay = globalScene.add.rectangle( + 0, + -globalScene.game.canvas.height / 6, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0xffffff, + ); this.eggHatchOverlay.setOrigin(0, 0); this.eggHatchOverlay.setAlpha(0); globalScene.fieldUI.add(this.eggHatchOverlay); @@ -205,7 +224,7 @@ export class EggHatchPhase extends Phase { } end() { - if (globalScene.findPhase((p) => p instanceof EggHatchPhase)) { + if (globalScene.findPhase(p => p instanceof EggHatchPhase)) { this.eggHatchHandler.clear(); } else { globalScene.time.delayedCall(250, () => globalScene.setModifiersVisible(true)); @@ -242,7 +261,8 @@ export class EggHatchPhase extends Phase { duration: 250, onComplete: () => { count!++; - if (count! < repeatCount!) { // we know they are defined + if (count! < repeatCount!) { + // we know they are defined return this.doEggShake(intensity, repeatCount, count).then(() => resolve()); } globalScene.tweens.add({ @@ -250,11 +270,11 @@ export class EggHatchPhase extends Phase { x: `-=${intensity / 2}`, ease: "Sine.easeInOut", duration: 125, - onComplete: () => resolve() + onComplete: () => resolve(), }); - } + }, }); - } + }, }); }); } @@ -289,7 +309,9 @@ export class EggHatchPhase extends Phase { SoundFade.fadeOut(globalScene, this.evolutionBgm, Utils.fixedInt(100)); } for (let e = 0; e < 5; e++) { - globalScene.time.delayedCall(Utils.fixedInt(375 * e), () => globalScene.playSound("se/egg_hatch", { volume: 1 - (e * 0.2) })); + globalScene.time.delayedCall(Utils.fixedInt(375 * e), () => + globalScene.playSound("se/egg_hatch", { volume: 1 - e * 0.2 }), + ); } this.eggLightraysOverlay.setVisible(true); this.eggLightraysOverlay.play("egg_lightrays"); @@ -301,7 +323,7 @@ export class EggHatchPhase extends Phase { onComplete: () => { this.skipped = false; this.canSkip = true; - } + }, }); globalScene.time.delayedCall(Utils.fixedInt(1500), () => { this.canSkip = false; @@ -350,28 +372,40 @@ export class EggHatchPhase extends Phase { doShinySparkleAnim(this.pokemonShinySparkle, this.pokemon.variant); }); } - globalScene.time.delayedCall(Utils.fixedInt(!this.skipped ? !isShiny ? 1250 : 1750 : !isShiny ? 250 : 750), () => { - this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); + globalScene.time.delayedCall( + Utils.fixedInt(!this.skipped ? (!isShiny ? 1250 : 1750) : !isShiny ? 250 : 750), + () => { + this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); - globalScene.playSoundWithoutBgm("evolution_fanfare"); + globalScene.playSoundWithoutBgm("evolution_fanfare"); - globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => { - globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); - globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { - globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => { - this.eggHatchData.setEggMoveUnlocked(value); - globalScene.ui.showText("", 0); - this.end(); - }); - }); - }, null, true, 3000); - }); + globalScene.ui.showText( + i18next.t("egg:hatchFromTheEgg", { + pokemonName: this.pokemon.species.getExpandedSpeciesName(), + }), + null, + () => { + globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); + globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { + globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(value => { + this.eggHatchData.setEggMoveUnlocked(value); + globalScene.ui.showText("", 0); + this.end(); + }); + }); + }, + null, + true, + 3000, + ); + }, + ); }); globalScene.tweens.add({ duration: Utils.fixedInt(this.skipped ? 500 : 3000), targets: this.eggHatchOverlay, alpha: 0, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }); } @@ -396,7 +430,7 @@ export class EggHatchPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { this.doSprayParticle(Utils.randInt(8), offsetY || 0); - } + }, }); } @@ -422,7 +456,7 @@ export class EggHatchPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -432,7 +466,7 @@ export class EggHatchPhase extends Phase { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -this.sin(trigIndex, amp); if (f > 108) { - particle.setScale((1 - (f - 108) / 20)); + particle.setScale(1 - (f - 108) / 20); } trigIndex += 2 * speedMultiplier; f += speedMultiplier; @@ -445,7 +479,6 @@ export class EggHatchPhase extends Phase { updateParticle(); } - /** * Generates a Pokemon to be hatched by the egg * Also stores the generated pokemon in this.eggHatchData diff --git a/src/phases/egg-lapse-phase.ts b/src/phases/egg-lapse-phase.ts index 62da0edf5b7..397eb970fec 100644 --- a/src/phases/egg-lapse-phase.ts +++ b/src/phases/egg-lapse-phase.ts @@ -16,12 +16,8 @@ import { EggHatchData } from "#app/data/egg-hatch-data"; * Also handles prompts for skipping animation, and calling the egg summary phase */ export class EggLapsePhase extends Phase { - private eggHatchData: EggHatchData[] = []; private readonly minEggsToSkip: number = 2; - constructor() { - super(); - } start() { super.start(); @@ -33,19 +29,37 @@ export class EggLapsePhase extends Phase { if (eggsToHatchCount > 0) { if (eggsToHatchCount >= this.minEggsToSkip && globalScene.eggSkipPreference === 1) { - globalScene.ui.showText(i18next.t("battle:eggHatching"), 0, () => { - // show prompt for skip, blocking inputs for 1 second - globalScene.ui.showText(i18next.t("battle:eggSkipPrompt", { eggsToHatch: eggsToHatchCount }), 0); - globalScene.ui.setModeWithoutClear(Mode.CONFIRM, () => { - this.hatchEggsSkipped(eggsToHatch); - this.showSummary(); - }, () => { - this.hatchEggsRegular(eggsToHatch); - this.end(); + globalScene.ui.showText( + i18next.t("battle:eggHatching"), + 0, + () => { + // show prompt for skip, blocking inputs for 1 second + globalScene.ui.showText( + i18next.t("battle:eggSkipPrompt", { + eggsToHatch: eggsToHatchCount, + }), + 0, + ); + globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + this.hatchEggsSkipped(eggsToHatch); + this.showSummary(); + }, + () => { + this.hatchEggsRegular(eggsToHatch); + this.end(); + }, + null, + null, + null, + 1000, + true, + ); }, - null, null, null, 1000, true - ); - }, 100, true); + 100, + true, + ); } else if (eggsToHatchCount >= this.minEggsToSkip && globalScene.eggSkipPreference === 2) { globalScene.queueMessage(i18next.t("battle:eggHatching")); this.hatchEggsSkipped(eggsToHatch); @@ -118,7 +132,6 @@ export class EggLapsePhase extends Phase { if (pokemon.isShiny()) { globalScene.validateAchv(achvs.HATCH_SHINY); } - } /** @@ -129,14 +142,16 @@ export class EggLapsePhase extends Phase { generatePokemon(egg: Egg): EggHatchData { let ret: PlayerPokemon; let newHatchData: EggHatchData; - globalScene.executeWithSeedOffset(() => { - ret = egg.generatePlayerPokemon(); - newHatchData = new EggHatchData(ret, egg.eggMoveIndex); - newHatchData.setDex(); - this.eggHatchData.push(newHatchData); - - }, egg.id, EGG_SEED.toString()); + globalScene.executeWithSeedOffset( + () => { + ret = egg.generatePlayerPokemon(); + newHatchData = new EggHatchData(ret, egg.eggMoveIndex); + newHatchData.setDex(); + this.eggHatchData.push(newHatchData); + }, + egg.id, + EGG_SEED.toString(), + ); return newHatchData!; } - } diff --git a/src/phases/egg-summary-phase.ts b/src/phases/egg-summary-phase.ts index 56741c5820f..9d9259d1e67 100644 --- a/src/phases/egg-summary-phase.ts +++ b/src/phases/egg-summary-phase.ts @@ -25,7 +25,6 @@ export class EggSummaryPhase extends Phase { globalScene.ui.setModeForceTransition(Mode.EGG_HATCH_SUMMARY, this.eggHatchData).then(() => { globalScene.fadeOutBgm(undefined, false); }); - } else { this.eggHatchData[i].setDex(); this.eggHatchData[i].updatePokemon().then(() => { @@ -36,7 +35,6 @@ export class EggSummaryPhase extends Phase { } }; updateNextPokemon(0); - } end() { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index ea8e43faeeb..5decab522b5 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -88,7 +88,9 @@ export class EncounterPhase extends BattlePhase { // Add any special encounter animations to load if (mysteryEncounter.encounterAnimations && mysteryEncounter.encounterAnimations.length > 0) { - loadEnemyAssets.push(initEncounterAnims(mysteryEncounter.encounterAnimations).then(() => loadEncounterAnimAssets(true))); + loadEnemyAssets.push( + initEncounterAnims(mysteryEncounter.encounterAnimations).then(() => loadEncounterAnimAssets(true)), + ); } // Add intro visuals for mystery encounter @@ -115,19 +117,31 @@ export class EncounterPhase extends BattlePhase { } else { let enemySpecies = globalScene.randomSpecies(battle.waveIndex, level, true); // If player has golden bug net, rolls 10% chance to replace non-boss wave wild species from the golden bug net bug pool - if (globalScene.findModifier(m => m instanceof BoostBugSpawnModifier) - && !globalScene.gameMode.isBoss(battle.waveIndex) - && globalScene.arena.biomeType !== Biome.END - && randSeedInt(10) === 0) { + if ( + globalScene.findModifier(m => m instanceof BoostBugSpawnModifier) && + !globalScene.gameMode.isBoss(battle.waveIndex) && + globalScene.arena.biomeType !== Biome.END && + randSeedInt(10) === 0 + ) { enemySpecies = getGoldenBugNetSpecies(level); } - battle.enemyParty[e] = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!globalScene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); + battle.enemyParty[e] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.NONE, + !!globalScene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies), + ); if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { battle.enemyParty[e].ivs = new Array(6).fill(31); } - globalScene.getPlayerParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => { - applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]); - }); + // biome-ignore lint/complexity/noForEach: Improves readability + globalScene + .getPlayerParty() + .slice(0, !battle.double ? 1 : 2) + .reverse() + .forEach(playerPokemon => { + applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]); + }); } } const enemyPokemon = globalScene.getEnemyParty()[e]; @@ -137,11 +151,19 @@ export class EncounterPhase extends BattlePhase { } if (!this.loaded) { - globalScene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER || battle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE); + globalScene.gameData.setPokemonSeen( + enemyPokemon, + true, + battle.battleType === BattleType.TRAINER || + battle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE, + ); } if (enemyPokemon.species.speciesId === Species.ETERNATUS) { - if (globalScene.gameMode.isClassic && (battle.battleSpec === BattleSpec.FINAL_BOSS || globalScene.gameMode.isWaveFinal(battle.waveIndex))) { + if ( + globalScene.gameMode.isClassic && + (battle.battleSpec === BattleSpec.FINAL_BOSS || globalScene.gameMode.isWaveFinal(battle.waveIndex)) + ) { if (battle.battleSpec !== BattleSpec.FINAL_BOSS) { enemyPokemon.formIndex = 1; enemyPokemon.updateScale(); @@ -166,9 +188,9 @@ export class EncounterPhase extends BattlePhase { ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, ]; const moveset: string[] = []; - enemyPokemon.getMoveset().forEach((move) => { + for (const move of enemyPokemon.getMoveset()) { moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR - }); + } console.log( `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, @@ -179,7 +201,7 @@ export class EncounterPhase extends BattlePhase { console.log( `Ability: ${enemyPokemon.getAbility().name}`, `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, - `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}`, ); console.log("Moveset:", moveset); return true; @@ -193,20 +215,26 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct? } else if (battle.isBattleMysteryEncounter()) { if (battle.mysteryEncounter?.introVisuals) { - loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter!.introVisuals!.initSprite())); + loadEnemyAssets.push( + battle.mysteryEncounter.introVisuals + .loadAssets() + .then(() => battle.mysteryEncounter!.introVisuals!.initSprite()), + ); } if (battle.mysteryEncounter?.loadAssets && battle.mysteryEncounter.loadAssets.length > 0) { loadEnemyAssets.push(...battle.mysteryEncounter.loadAssets); } // Load Mystery Encounter Exclamation bubble and sfx - loadEnemyAssets.push(new Promise(resolve => { - globalScene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); - globalScene.loadImage("encounter_exclaim", "mystery-encounters"); - globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); - if (!globalScene.load.isLoading()) { - globalScene.load.start(); - } - })); + loadEnemyAssets.push( + new Promise(resolve => { + globalScene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); + globalScene.loadImage("encounter_exclaim", "mystery-encounters"); + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); + } + }), + ); } else { const overridedBossSegments = Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1; // for double battles, reduce the health segments for boss Pokemon unless there is an override @@ -214,7 +242,10 @@ export class EncounterPhase extends BattlePhase { for (const enemyPokemon of battle.enemyParty) { // If the enemy pokemon is a boss and wasn't populated from data source, then update the number of segments if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { - enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); + enemyPokemon.setBoss( + true, + Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst)), + ); enemyPokemon.initBattleInfo(); } } @@ -247,12 +278,16 @@ export class EncounterPhase extends BattlePhase { }); if (!this.loaded && battle.battleType !== BattleType.MYSTERY_ENCOUNTER) { - regenerateModifierPoolThresholds(globalScene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); + regenerateModifierPoolThresholds( + globalScene.getEnemyField(), + battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, + ); globalScene.generateEnemyModifiers(); overrideModifiers(false); - globalScene.getEnemyField().forEach(enemy => { + + for (const enemy of globalScene.getEnemyField()) { overrideHeldItems(enemy, false); - }); + } } if (battle.battleType === BattleType.TRAINER) { @@ -263,14 +298,16 @@ export class EncounterPhase extends BattlePhase { if (!this.loaded) { this.trySetWeatherIfNewBiome(); // Set weather before session gets saved // Game syncs to server on waves X1 and X6 (As of 1.2.0) - globalScene.gameData.saveAll(true, battle.waveIndex % 5 === 1 || (globalScene.lastSavePlayTime ?? 0) >= 300).then(success => { - globalScene.disableMenu = false; - if (!success) { - return globalScene.reset(true); - } - this.doEncounter(); - globalScene.resetSeed(); - }); + globalScene.gameData + .saveAll(true, battle.waveIndex % 5 === 1 || (globalScene.lastSavePlayTime ?? 0) >= 300) + .then(success => { + globalScene.disableMenu = false; + if (!success) { + return globalScene.reset(true); + } + this.doEncounter(); + globalScene.resetSeed(); + }); } else { this.doEncounter(); globalScene.resetSeed(); @@ -285,7 +322,10 @@ export class EncounterPhase extends BattlePhase { globalScene.setFieldScale(1); const { battleType, waveIndex } = globalScene.currentBattle; - if (globalScene.isMysteryEncounterValidForWave(battleType, waveIndex) && !globalScene.currentBattle.isBattleMysteryEncounter()) { + if ( + globalScene.isMysteryEncounterValidForWave(battleType, waveIndex) && + !globalScene.currentBattle.isBattleMysteryEncounter() + ) { // Increment ME spawn chance if an ME could have spawned but did not // Only do this AFTER session has been saved to avoid duplicating increments globalScene.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; @@ -299,14 +339,20 @@ export class EncounterPhase extends BattlePhase { const enemyField = globalScene.getEnemyField(); globalScene.tweens.add({ - targets: [ globalScene.arenaEnemy, globalScene.currentBattle.trainer, enemyField, globalScene.arenaPlayer, globalScene.trainer ].flat(), - x: (_target, _key, value, fieldIndex: number) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, + targets: [ + globalScene.arenaEnemy, + globalScene.currentBattle.trainer, + enemyField, + globalScene.arenaPlayer, + globalScene.trainer, + ].flat(), + x: (_target, _key, value, fieldIndex: number) => (fieldIndex < 2 + enemyField.length ? value + 300 : value - 300), duration: 2000, onComplete: () => { if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); const encounterIntroVisuals = globalScene.currentBattle?.mysteryEncounter?.introVisuals; @@ -318,7 +364,7 @@ export class EncounterPhase extends BattlePhase { globalScene.tweens.add({ targets: encounterIntroVisuals, x: enterFromRight ? "-=200" : "+=300", - duration: 2000 + duration: 2000, }); } } @@ -327,35 +373,44 @@ export class EncounterPhase extends BattlePhase { const enemyField = globalScene.getEnemyField(); if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", { bossName: getPokemonNameWithAffix(enemyField[0]) }); + return i18next.t("battle:bossAppeared", { + bossName: getPokemonNameWithAffix(enemyField[0]), + }); } if (globalScene.currentBattle.battleType === BattleType.TRAINER) { if (globalScene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); - - } else { - return i18next.t("battle:trainerAppeared", { trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + return i18next.t("battle:trainerAppearedDouble", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } + return i18next.t("battle:trainerAppeared", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].getNameToRender() }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].getNameToRender(), pokemonName2: enemyField[1].getNameToRender() }); + ? i18next.t("battle:singleWildAppeared", { + pokemonName: enemyField[0].getNameToRender(), + }) + : i18next.t("battle:multiWildAppeared", { + pokemonName1: enemyField[0].getNameToRender(), + pokemonName2: enemyField[1].getNameToRender(), + }); } - doEncounterCommon(showEncounterMessage: boolean = true) { + doEncounterCommon(showEncounterMessage = true) { const enemyField = globalScene.getEnemyField(); if (globalScene.currentBattle.battleType === BattleType.WILD) { - enemyField.forEach(enemyPokemon => { + for (const enemyPokemon of enemyField) { enemyPokemon.untint(100, "Sine.easeOut"); enemyPokemon.cry(); enemyPokemon.showInfo(); if (enemyPokemon.isShiny()) { globalScene.validateAchv(achvs.SEE_SHINY); } - }); + } globalScene.updateFieldScale(); if (showEncounterMessage) { globalScene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); @@ -394,7 +449,10 @@ export class EncounterPhase extends BattlePhase { doSummon(); } else { let message: string; - globalScene.executeWithSeedOffset(() => message = randSeedItem(encounterMessages), globalScene.currentBattle.waveIndex); + globalScene.executeWithSeedOffset( + () => (message = randSeedItem(encounterMessages)), + globalScene.currentBattle.waveIndex, + ); message = message!; // tell TS compiler it's defined now const showDialogueAndSummon = () => { globalScene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { @@ -402,7 +460,13 @@ export class EncounterPhase extends BattlePhase { }); }; if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { - globalScene.showFieldOverlay(500).then(() => globalScene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])) + .then(() => showDialogueAndSummon()), + ); // TODO: is this bang correct? } else { showDialogueAndSummon(); } @@ -442,7 +506,14 @@ export class EncounterPhase extends BattlePhase { const text = getEncounterText(dialogue.text)!; i++; if (title) { - globalScene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text, + title, + null, + nextAction, + 0, + i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { globalScene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } @@ -478,8 +549,15 @@ export class EncounterPhase extends BattlePhase { globalScene.unshiftPhase(new ShinySparklePhase(BattlerIndex.ENEMY + e)); } /** This sets Eternatus' held item to be untransferrable, preventing it from being stolen */ - if (enemyPokemon.species.speciesId === Species.ETERNATUS && (globalScene.gameMode.isBattleClassicFinalBoss(globalScene.currentBattle.waveIndex) || globalScene.gameMode.isEndlessMajorBoss(globalScene.currentBattle.waveIndex))) { - const enemyMBH = globalScene.findModifier(m => m instanceof TurnHeldItemTransferModifier, false) as TurnHeldItemTransferModifier; + if ( + enemyPokemon.species.speciesId === Species.ETERNATUS && + (globalScene.gameMode.isBattleClassicFinalBoss(globalScene.currentBattle.waveIndex) || + globalScene.gameMode.isEndlessMajorBoss(globalScene.currentBattle.waveIndex)) + ) { + const enemyMBH = globalScene.findModifier( + m => m instanceof TurnHeldItemTransferModifier, + false, + ) as TurnHeldItemTransferModifier; if (enemyMBH) { globalScene.removeModifier(enemyMBH, true); enemyMBH.setTransferrableFalse(); @@ -488,22 +566,24 @@ export class EncounterPhase extends BattlePhase { } }); - if (![ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(globalScene.currentBattle.battleType)) { - enemyField.map(p => globalScene.pushConditionalPhase(new PostSummonPhase(p.getBattlerIndex()), () => { - // if there is not a player party, we can't continue - if (!globalScene.getPlayerParty().length) { - return false; - } - // how many player pokemon are on the field ? - const pokemonsOnFieldCount = globalScene.getPlayerParty().filter(p => p.isOnField()).length; - // if it's a 2vs1, there will never be a 2nd pokemon on our field even - const requiredPokemonsOnField = Math.min(globalScene.getPlayerParty().filter((p) => !p.isFainted()).length, 2); - // if it's a double, there should be 2, otherwise 1 - if (globalScene.currentBattle.double) { - return pokemonsOnFieldCount === requiredPokemonsOnField; - } - return pokemonsOnFieldCount === 1; - })); + if (![BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType)) { + enemyField.map(p => + globalScene.pushConditionalPhase(new PostSummonPhase(p.getBattlerIndex()), () => { + // if there is not a player party, we can't continue + if (!globalScene.getPlayerParty().length) { + return false; + } + // how many player pokemon are on the field ? + const pokemonsOnFieldCount = globalScene.getPlayerParty().filter(p => p.isOnField()).length; + // if it's a 2vs1, there will never be a 2nd pokemon on our field even + const requiredPokemonsOnField = Math.min(globalScene.getPlayerParty().filter(p => !p.isFainted()).length, 2); + // if it's a double, there should be 2, otherwise 1 + if (globalScene.currentBattle.double) { + return pokemonsOnFieldCount === requiredPokemonsOnField; + } + return pokemonsOnFieldCount === 1; + }), + ); const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); @@ -531,7 +611,10 @@ export class EncounterPhase extends BattlePhase { globalScene.pushPhase(new ToggleDoublePositionPhase(false)); } - if (globalScene.currentBattle.battleType !== BattleType.TRAINER && (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily)) { + if ( + globalScene.currentBattle.battleType !== BattleType.TRAINER && + (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily) + ) { const minPartySize = globalScene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); @@ -546,31 +629,47 @@ export class EncounterPhase extends BattlePhase { tryOverrideForBattleSpec(): boolean { switch (globalScene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: + case BattleSpec.FINAL_BOSS: { const enemy = globalScene.getEnemyPokemon(); - globalScene.ui.showText(this.getEncounterMessage(), null, () => { - const localizationKey = "battleSpecDialogue:encounter"; - if (globalScene.ui.shouldSkipDialogue(localizationKey)) { - // Logging mirrors logging found in dialogue-ui-handler - console.log(`Dialogue ${localizationKey} skipped`); - this.doEncounterCommon(false); - } else { - const count = 5643853 + globalScene.gameData.gameStats.classicSessionsPlayed; - // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. - const ordinalUsed = !i18next.exists(localizationKey, { fallbackLng: []}) || i18next.resolvedLanguage === "en" ? i18next.t("battleSpecDialogue:key", { count: count, ordinal: true }) : ""; - const cycleCount = count.toLocaleString() + ordinalUsed; - const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; - const genderStr = PlayerGender[genderIndex].toLowerCase(); - const encounterDialogue = i18next.t(localizationKey, { context: genderStr, cycleCount: cycleCount }); - if (!globalScene.gameData.getSeenDialogues()[localizationKey]) { - globalScene.gameData.saveSeenDialogue(localizationKey); - } - globalScene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + globalScene.ui.showText( + this.getEncounterMessage(), + null, + () => { + const localizationKey = "battleSpecDialogue:encounter"; + if (globalScene.ui.shouldSkipDialogue(localizationKey)) { + // Logging mirrors logging found in dialogue-ui-handler + console.log(`Dialogue ${localizationKey} skipped`); this.doEncounterCommon(false); - }); - } - }, 1500, true); + } else { + const count = 5643853 + globalScene.gameData.gameStats.classicSessionsPlayed; + // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. + const ordinalUsed = + !i18next.exists(localizationKey, { fallbackLng: [] }) || i18next.resolvedLanguage === "en" + ? i18next.t("battleSpecDialogue:key", { + count: count, + ordinal: true, + }) + : ""; + const cycleCount = count.toLocaleString() + ordinalUsed; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + const encounterDialogue = i18next.t(localizationKey, { + context: genderStr, + cycleCount: cycleCount, + }); + if (!globalScene.gameData.getSeenDialogues()[localizationKey]) { + globalScene.gameData.saveSeenDialogue(localizationKey); + } + globalScene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + this.doEncounterCommon(false); + }); + } + }, + 1500, + true, + ); return true; + } } return false; } diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts index 4615a60e661..41775248b67 100644 --- a/src/phases/end-card-phase.ts +++ b/src/phases/end-card-phase.ts @@ -7,34 +7,44 @@ import i18next from "i18next"; export class EndCardPhase extends Phase { public endCard: Phaser.GameObjects.Image; public text: Phaser.GameObjects.Text; - - constructor() { - super(); - } - start(): void { super.start(); globalScene.ui.getMessageHandler().bg.setVisible(false); globalScene.ui.getMessageHandler().nameBoxContainer.setVisible(false); - this.endCard = globalScene.add.image(0, 0, `end_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`); + this.endCard = globalScene.add.image( + 0, + 0, + `end_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`, + ); this.endCard.setOrigin(0); this.endCard.setScale(0.5); globalScene.field.add(this.endCard); - this.text = addTextObject(globalScene.game.canvas.width / 12, (globalScene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + this.text = addTextObject( + globalScene.game.canvas.width / 12, + globalScene.game.canvas.height / 6 - 16, + i18next.t("battle:congratulations"), + TextStyle.SUMMARY, + { fontSize: "128px" }, + ); this.text.setOrigin(0.5); globalScene.field.add(this.text); globalScene.ui.clearText(); globalScene.ui.fadeIn(1000).then(() => { - - globalScene.ui.showText("", null, () => { - globalScene.ui.getMessageHandler().bg.setVisible(true); - this.end(); - }, null, true); + globalScene.ui.showText( + "", + null, + () => { + globalScene.ui.getMessageHandler().bg.setVisible(true); + this.end(); + }, + null, + true, + ); }); } } diff --git a/src/phases/end-evolution-phase.ts b/src/phases/end-evolution-phase.ts index 58e2e203482..e0bdc7e0d68 100644 --- a/src/phases/end-evolution-phase.ts +++ b/src/phases/end-evolution-phase.ts @@ -3,11 +3,6 @@ import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; export class EndEvolutionPhase extends Phase { - - constructor() { - super(); - } - start() { super.start(); diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts index 429674e7786..2e4861aacfc 100644 --- a/src/phases/enemy-command-phase.ts +++ b/src/phases/enemy-command-phase.ts @@ -16,7 +16,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; */ export class EnemyCommandPhase extends FieldPhase { protected fieldIndex: number; - protected skipTurn: boolean = false; + protected skipTurn = false; constructor(fieldIndex: number) { super(); @@ -36,20 +36,23 @@ export class EnemyCommandPhase extends FieldPhase { const trainer = battle.trainer; - if (battle.double && enemyPokemon.hasAbility(Abilities.COMMANDER) - && enemyPokemon.getAlly().getTag(BattlerTagType.COMMANDED)) { + if ( + battle.double && + enemyPokemon.hasAbility(Abilities.COMMANDER) && + enemyPokemon.getAlly().getTag(BattlerTagType.COMMANDED) + ) { this.skipTurn = true; } /** - * If the enemy has a trainer, decide whether or not the enemy should switch - * to another member in its party. - * - * This block compares the active enemy Pokemon's {@linkcode Pokemon.getMatchupScore | matchup score} - * against the active player Pokemon with the enemy party's other non-fainted Pokemon. If a party - * member's matchup score is 3x the active enemy's score (or 2x for "boss" trainers), - * the enemy will switch to that Pokemon. - */ + * If the enemy has a trainer, decide whether or not the enemy should switch + * to another member in its party. + * + * This block compares the active enemy Pokemon's {@linkcode Pokemon.getMatchupScore | matchup score} + * against the active player Pokemon with the enemy party's other non-fainted Pokemon. If a party + * member's matchup score is 3x the active enemy's score (or 2x for "boss" trainers), + * the enemy will switch to that Pokemon. + */ if (trainer && !enemyPokemon.getMoveQueue().length) { const opponents = enemyPokemon.getOpponents(); @@ -58,17 +61,21 @@ export class EnemyCommandPhase extends FieldPhase { if (partyMemberScores.length) { const matchupScores = opponents.map(opp => enemyPokemon.getMatchupScore(opp)); - const matchupScore = matchupScores.reduce((total, score) => total += score, 0) / matchupScores.length; + const matchupScore = matchupScores.reduce((total, score) => (total += score), 0) / matchupScores.length; const sortedPartyMemberScores = trainer.getSortedPartyMemberMatchupScores(partyMemberScores); - const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, (1 / battle.enemySwitchCounter)) : 0); + const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, 1 / battle.enemySwitchCounter) : 0); if (sortedPartyMemberScores[0][1] * switchMultiplier >= matchupScore * (trainer.config.isBoss ? 2 : 3)) { const index = trainer.getNextSummonIndex(enemyPokemon.trainerSlot, partyMemberScores); - battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.POKEMON, cursor: index, args: [ false ], skip: this.skipTurn }; + battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { + command: Command.POKEMON, + cursor: index, + args: [false], + skip: this.skipTurn, + }; battle.enemySwitchCounter++; @@ -81,12 +88,15 @@ export class EnemyCommandPhase extends FieldPhase { /** Select a move to use (and a target to use it against, if applicable) */ const nextMove = enemyPokemon.getNextMove(); - if (trainer && trainer.shouldTera(enemyPokemon)) { + if (trainer?.shouldTera(enemyPokemon)) { globalScene.currentBattle.preTurnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.TERA }; } - globalScene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.FIGHT, move: nextMove, skip: this.skipTurn }; + globalScene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { + command: Command.FIGHT, + move: nextMove, + skip: this.skipTurn, + }; globalScene.currentBattle.enemySwitchCounter = Math.max(globalScene.currentBattle.enemySwitchCounter - 1, 0); diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index ea857cac8ba..bb283fa8139 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -60,7 +60,6 @@ export class EvolutionPhase extends Phase { super.start(); this.setMode().then(() => { - if (!this.validate()) { return this.end(); } @@ -81,14 +80,28 @@ export class EvolutionPhase extends Phase { this.evolutionBg.setVisible(false); this.evolutionContainer.add(this.evolutionBg); - this.evolutionBgOverlay = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x262626); + this.evolutionBgOverlay = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x262626, + ); this.evolutionBgOverlay.setOrigin(0, 0); this.evolutionBgOverlay.setAlpha(0); this.evolutionContainer.add(this.evolutionBgOverlay); const getPokemonSprite = () => { - const ret = globalScene.addPokemonSprite(this.pokemon, this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + this.pokemon, + this.evolutionBaseBg.displayWidth / 2, + this.evolutionBaseBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -98,17 +111,23 @@ export class EvolutionPhase extends Phase { this.evolutionContainer.add((this.pokemonEvoTintSprite = getPokemonSprite())); this.pokemonTintSprite.setAlpha(0); - this.pokemonTintSprite.setTintFill(0xFFFFFF); + this.pokemonTintSprite.setTintFill(0xffffff); this.pokemonEvoSprite.setVisible(false); this.pokemonEvoTintSprite.setVisible(false); - this.pokemonEvoTintSprite.setTintFill(0xFFFFFF); + this.pokemonEvoTintSprite.setTintFill(0xffffff); - this.evolutionOverlay = globalScene.add.rectangle(0, -globalScene.game.canvas.height / 6, globalScene.game.canvas.width / 6, (globalScene.game.canvas.height / 6) - 48, 0xFFFFFF); + this.evolutionOverlay = globalScene.add.rectangle( + 0, + -globalScene.game.canvas.height / 6, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6 - 48, + 0xffffff, + ); this.evolutionOverlay.setOrigin(0, 0); this.evolutionOverlay.setAlpha(0); globalScene.ui.add(this.evolutionOverlay); - [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { + [this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { const spriteKey = this.pokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -116,12 +135,17 @@ export class EvolutionPhase extends Phase { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(this.pokemon.getTeraType()), + isTerastallized: this.pokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); sprite.setPipelineData("shiny", this.pokemon.shiny); sprite.setPipelineData("variant", this.pokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; } @@ -134,83 +158,87 @@ export class EvolutionPhase extends Phase { } doEvolution(): void { - globalScene.ui.showText(i18next.t("menu:evolving", { pokemonName: this.preEvolvedPokemonName }), null, () => { - this.pokemon.cry(); + globalScene.ui.showText( + i18next.t("menu:evolving", { pokemonName: this.preEvolvedPokemonName }), + null, + () => { + this.pokemon.cry(); - this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { - - [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - const spriteKey = evolvedPokemon.getSpriteKey(true); - try { - sprite.play(spriteKey); - } catch (err: unknown) { - console.error(`Failed to play animation for ${spriteKey}`, err); - } - - sprite.setPipelineData("ignoreTimeTint", true); - sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); - sprite.setPipelineData("shiny", evolvedPokemon.shiny); - sprite.setPipelineData("variant", evolvedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { - if (evolvedPokemon.summonData?.speciesForm) { - k += "Base"; + this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { + [this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { + const spriteKey = evolvedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; - }); - }); - globalScene.time.delayedCall(1000, () => { - this.evolutionBgm = globalScene.playSoundWithoutBgm("evolution"); - globalScene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 1, - delay: 500, - duration: 1500, - ease: "Sine.easeOut", - onComplete: () => { - globalScene.time.delayedCall(1000, () => { - globalScene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 0, - duration: 250 + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", evolvedPokemon.shiny); + sprite.setPipelineData("variant", evolvedPokemon.variant); + ["spriteColors", "fusionSpriteColors"].map(k => { + if (evolvedPokemon.summonData?.speciesForm) { + k += "Base"; + } + sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; + }); + }); + + globalScene.time.delayedCall(1000, () => { + this.evolutionBgm = globalScene.playSoundWithoutBgm("evolution"); + globalScene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 1, + delay: 500, + duration: 1500, + ease: "Sine.easeOut", + onComplete: () => { + globalScene.time.delayedCall(1000, () => { + globalScene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250, + }); + this.evolutionBg.setVisible(true); + this.evolutionBg.play(); }); - this.evolutionBg.setVisible(true); - this.evolutionBg.play(); - }); - globalScene.playSound("se/charge"); - this.doSpiralUpward(); - globalScene.tweens.addCounter({ - from: 0, - to: 1, - duration: 2000, - onUpdate: t => { - this.pokemonTintSprite.setAlpha(t.getValue()); - }, - onComplete: () => { - this.pokemonSprite.setVisible(false); - globalScene.time.delayedCall(1100, () => { - globalScene.playSound("se/beam"); - this.doArcDownward(); - globalScene.time.delayedCall(1500, () => { - this.pokemonEvoTintSprite.setScale(0.25); - this.pokemonEvoTintSprite.setVisible(true); - this.evolutionHandler.canCancel = true; - this.doCycle(1).then(success => { - if (success) { - this.handleSuccessEvolution(evolvedPokemon); - } else { - this.handleFailedEvolution(evolvedPokemon); - } + globalScene.playSound("se/charge"); + this.doSpiralUpward(); + globalScene.tweens.addCounter({ + from: 0, + to: 1, + duration: 2000, + onUpdate: t => { + this.pokemonTintSprite.setAlpha(t.getValue()); + }, + onComplete: () => { + this.pokemonSprite.setVisible(false); + globalScene.time.delayedCall(1100, () => { + globalScene.playSound("se/beam"); + this.doArcDownward(); + globalScene.time.delayedCall(1500, () => { + this.pokemonEvoTintSprite.setScale(0.25); + this.pokemonEvoTintSprite.setVisible(true); + this.evolutionHandler.canCancel = true; + this.doCycle(1).then(success => { + if (success) { + this.handleSuccessEvolution(evolvedPokemon); + } else { + this.handleFailedEvolution(evolvedPokemon); + } + }); }); }); - }); - } - }); - } + }, + }); + }, + }); }); }); - }); - }, 1000); + }, + 1000, + ); } /** @@ -221,36 +249,61 @@ export class EvolutionPhase extends Phase { this.pokemonSprite.setVisible(true); this.pokemonTintSprite.setScale(1); globalScene.tweens.add({ - targets: [ this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ], + targets: [this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite], alpha: 0, duration: 250, onComplete: () => { this.evolutionBg.setVisible(false); - } + }, }); SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); globalScene.unshiftPhase(new EndEvolutionPhase()); - globalScene.ui.showText(i18next.t("menu:stoppedEvolving", { pokemonName: this.preEvolvedPokemonName }), null, () => { - globalScene.ui.showText(i18next.t("menu:pauseEvolutionsQuestion", { pokemonName: this.preEvolvedPokemonName }), null, () => { - const end = () => { - globalScene.ui.showText("", 0); - globalScene.playBgm(); - evolvedPokemon.destroy(); - this.end(); - }; - globalScene.ui.setOverlayMode(Mode.CONFIRM, () => { - globalScene.ui.revertMode(); - this.pokemon.pauseEvolutions = true; - globalScene.ui.showText(i18next.t("menu:evolutionsPaused", { pokemonName: this.preEvolvedPokemonName }), null, end, 3000); - }, () => { - globalScene.ui.revertMode(); - globalScene.time.delayedCall(3000, end); - }); - }); - }, null, true); + globalScene.ui.showText( + i18next.t("menu:stoppedEvolving", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + () => { + globalScene.ui.showText( + i18next.t("menu:pauseEvolutionsQuestion", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + () => { + const end = () => { + globalScene.ui.showText("", 0); + globalScene.playBgm(); + evolvedPokemon.destroy(); + this.end(); + }; + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.ui.revertMode(); + this.pokemon.pauseEvolutions = true; + globalScene.ui.showText( + i18next.t("menu:evolutionsPaused", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + end, + 3000, + ); + }, + () => { + globalScene.ui.revertMode(); + globalScene.time.delayedCall(3000, end); + }, + ); + }, + ); + }, + null, + true, + ); } /** @@ -270,7 +323,17 @@ export class EvolutionPhase extends Phase { globalScene.playSoundWithoutBgm("evolution_fanfare"); evolvedPokemon.destroy(); - globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => this.end(), null, true, Utils.fixedInt(4000)); + globalScene.ui.showText( + i18next.t("menu:evolutionDone", { + pokemonName: this.preEvolvedPokemonName, + evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName(), + }), + null, + () => this.end(), + null, + true, + Utils.fixedInt(4000), + ); globalScene.time.delayedCall(Utils.fixedInt(4250), () => globalScene.playBgm()); }); }); @@ -280,8 +343,14 @@ export class EvolutionPhase extends Phase { this.evolutionHandler.canCancel = false; this.pokemon.evolve(this.evolution, this.pokemon.species).then(() => { - const learnSituation: LearnMoveSituation = this.fusionSpeciesEvolved ? LearnMoveSituation.EVOLUTION_FUSED : this.pokemon.fusionSpecies ? LearnMoveSituation.EVOLUTION_FUSED_BASE : LearnMoveSituation.EVOLUTION; - const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true, false, false, learnSituation).filter(lm => lm[0] === EVOLVE_MOVE); + const learnSituation: LearnMoveSituation = this.fusionSpeciesEvolved + ? LearnMoveSituation.EVOLUTION_FUSED + : this.pokemon.fusionSpecies + ? LearnMoveSituation.EVOLUTION_FUSED_BASE + : LearnMoveSituation.EVOLUTION; + const levelMoves = this.pokemon + .getLevelMoves(this.lastLevel + 1, true, false, false, learnSituation) + .filter(lm => lm[0] === EVOLVE_MOVE); for (const lm of levelMoves) { globalScene.unshiftPhase(new LearnMovePhase(globalScene.getPlayerParty().indexOf(this.pokemon), lm[1])); } @@ -298,7 +367,7 @@ export class EvolutionPhase extends Phase { this.evolutionBgOverlay.setAlpha(1); this.evolutionBg.setVisible(false); globalScene.tweens.add({ - targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], + targets: [this.evolutionOverlay, this.pokemonEvoTintSprite], alpha: 0, duration: 2000, delay: 150, @@ -308,11 +377,11 @@ export class EvolutionPhase extends Phase { targets: this.evolutionBgOverlay, alpha: 0, duration: 250, - onComplete: onEvolutionComplete + onComplete: onEvolutionComplete, }); - } + }, }); - } + }, }); }); }); @@ -333,7 +402,7 @@ export class EvolutionPhase extends Phase { } f++; } - } + }, }); } @@ -352,11 +421,11 @@ export class EvolutionPhase extends Phase { } f++; } - } + }, }); } - doCycle(l: number, lastCycle: number = 15): Promise { + doCycle(l: number, lastCycle = 15): Promise { return new Promise(resolve => { const isLastCycle = l === lastCycle; globalScene.tweens.add({ @@ -364,7 +433,7 @@ export class EvolutionPhase extends Phase { scale: 0.25, ease: "Cubic.easeInOut", duration: 500 / l, - yoyo: !isLastCycle + yoyo: !isLastCycle, }); globalScene.tweens.add({ targets: this.pokemonEvoTintSprite, @@ -382,7 +451,7 @@ export class EvolutionPhase extends Phase { this.pokemonTintSprite.setVisible(false); resolve(true); } - } + }, }); }); } @@ -404,7 +473,7 @@ export class EvolutionPhase extends Phase { } } f++; - } + }, }); } @@ -423,7 +492,7 @@ export class EvolutionPhase extends Phase { this.doSprayParticle(Utils.randInt(8)); } f++; - } + }, }); } @@ -440,7 +509,7 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -448,7 +517,7 @@ export class EvolutionPhase extends Phase { particle.setPosition(initialX, 88 - (f * f) / 80); particle.y += sin(trigIndex, amp) / 4; particle.x += cos(trigIndex, amp); - particle.setScale(1 - (f / 80)); + particle.setScale(1 - f / 80); trigIndex += 4; if (f & 1) { amp--; @@ -477,7 +546,7 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -509,7 +578,7 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -544,7 +613,7 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -555,7 +624,7 @@ export class EvolutionPhase extends Phase { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -sin(trigIndex, amp); if (f > 108) { - particle.setScale((1 - (f - 108) / 20)); + particle.setScale(1 - (f - 108) / 20); } trigIndex++; f++; diff --git a/src/phases/exp-phase.ts b/src/phases/exp-phase.ts index 7cf953851a1..092482d4c18 100644 --- a/src/phases/exp-phase.ts +++ b/src/phases/exp-phase.ts @@ -22,14 +22,23 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase { const exp = new Utils.NumberHolder(this.expValue); globalScene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); - globalScene.ui.showText(i18next.t("battle:expGain", { pokemonName: getPokemonNameWithAffix(pokemon), exp: exp.value }), null, () => { - const lastLevel = pokemon.level; - pokemon.addExp(exp.value); - const newLevel = pokemon.level; - if (newLevel > lastLevel) { - globalScene.unshiftPhase(new LevelUpPhase(this.partyMemberIndex, lastLevel, newLevel)); - } - pokemon.updateInfo().then(() => this.end()); - }, null, true); + globalScene.ui.showText( + i18next.t("battle:expGain", { + pokemonName: getPokemonNameWithAffix(pokemon), + exp: exp.value, + }), + null, + () => { + const lastLevel = pokemon.level; + pokemon.addExp(exp.value); + const newLevel = pokemon.level; + if (newLevel > lastLevel) { + globalScene.unshiftPhase(new LevelUpPhase(this.partyMemberIndex, lastLevel, newLevel)); + } + pokemon.updateInfo().then(() => this.end()); + }, + null, + true, + ); } } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index a6b9a482ba0..7fc7a517853 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -1,7 +1,14 @@ import type { BattlerIndex } from "#app/battle"; import { BattleType } from "#app/battle"; import { globalScene } from "#app/global-scene"; -import { applyPostFaintAbAttrs, applyPostKnockOutAbAttrs, applyPostVictoryAbAttrs, PostFaintAbAttr, PostKnockOutAbAttr, PostVictoryAbAttr } from "#app/data/ability"; +import { + applyPostFaintAbAttrs, + applyPostKnockOutAbAttrs, + applyPostVictoryAbAttrs, + PostFaintAbAttr, + PostKnockOutAbAttr, + PostVictoryAbAttr, +} from "#app/data/ability"; import type { DestinyBondTag, GrudgeTag } from "#app/data/battler-tags"; import { BattlerTagLapseType } from "#app/data/battler-tags"; import { battleSpecDialogue } from "#app/data/dialogue"; @@ -47,7 +54,13 @@ export class FaintPhase extends PokemonPhase { */ private source?: Pokemon; - constructor(battlerIndex: BattlerIndex, preventEndure: boolean = false, destinyTag?: DestinyBondTag | null, grudgeTag?: GrudgeTag | null, source?: Pokemon) { + constructor( + battlerIndex: BattlerIndex, + preventEndure = false, + destinyTag?: DestinyBondTag | null, + grudgeTag?: GrudgeTag | null, + source?: Pokemon, + ) { super(battlerIndex); this.preventEndure = preventEndure; @@ -70,7 +83,11 @@ export class FaintPhase extends PokemonPhase { } if (!this.preventEndure) { - const instantReviveModifier = globalScene.applyModifier(PokemonInstantReviveModifier, this.player, faintPokemon) as PokemonInstantReviveModifier; + const instantReviveModifier = globalScene.applyModifier( + PokemonInstantReviveModifier, + this.player, + faintPokemon, + ) as PokemonInstantReviveModifier; if (instantReviveModifier) { faintPokemon.loseHeldItem(instantReviveModifier); @@ -80,13 +97,11 @@ export class FaintPhase extends PokemonPhase { } /** In case the current pokemon was just switched in, make sure it is counted as participating in the combat */ - globalScene.getPlayerField().forEach((pokemon, i) => { - if (pokemon?.isActive(true)) { - if (pokemon.isPlayer()) { - globalScene.currentBattle.addParticipant(pokemon as PlayerPokemon); - } + for (const pokemon of globalScene.getPlayerField()) { + if (pokemon?.isActive(true) && pokemon.isPlayer()) { + globalScene.currentBattle.addParticipant(pokemon as PlayerPokemon); } - }); + } if (!this.tryOverrideForBattleSpec()) { this.doFaint(); @@ -99,26 +114,47 @@ export class FaintPhase extends PokemonPhase { // Track total times pokemon have been KO'd for Last Respects/Supreme Overlord if (pokemon.isPlayer()) { globalScene.arena.playerFaints += 1; - globalScene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: globalScene.currentBattle.turn }); + globalScene.currentBattle.playerFaintsHistory.push({ + pokemon: pokemon, + turn: globalScene.currentBattle.turn, + }); } else { globalScene.currentBattle.enemyFaints += 1; - globalScene.currentBattle.enemyFaintsHistory.push({ pokemon: pokemon, turn: globalScene.currentBattle.turn }); + globalScene.currentBattle.enemyFaintsHistory.push({ + pokemon: pokemon, + turn: globalScene.currentBattle.turn, + }); } - globalScene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); + globalScene.queueMessage( + i18next.t("battle:fainted", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + true, + ); globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); pokemon.resetTera(); if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; - applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, globalScene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? - } else { //If killed by indirect damage, apply post-faint abilities without providing a last move + applyPostFaintAbAttrs( + PostFaintAbAttr, + pokemon, + globalScene.getPokemonById(lastAttack.sourceId)!, + new PokemonMove(lastAttack.move).getMove(), + lastAttack.result, + ); // TODO: is this bang correct? + } else { + //If killed by indirect damage, apply post-faint abilities without providing a last move applyPostFaintAbAttrs(PostFaintAbAttr, pokemon); } const alivePlayField = globalScene.getField(true); - alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); + for (const p of alivePlayField) { + applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon); + } if (pokemon.turnData?.attacksReceived?.length) { const defeatSource = this.source; @@ -142,7 +178,11 @@ export class FaintPhase extends PokemonPhase { if (!legalPlayerPokemon.length) { /** If the player doesn't have any legal Pokemon, end the game */ globalScene.unshiftPhase(new GameOverPhase()); - } else if (globalScene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { + } else if ( + globalScene.currentBattle.double && + legalPlayerPokemon.length === 1 && + legalPlayerPartyPokemon.length === 0 + ) { /** * If the player has exactly one Pokemon in total at this point in a double battle, and that Pokemon * is already on the field, unshift a phase that moves that Pokemon to center position. @@ -157,8 +197,11 @@ export class FaintPhase extends PokemonPhase { } } else { globalScene.unshiftPhase(new VictoryPhase(this.battlerIndex)); - if ([ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(globalScene.currentBattle.battleType)) { - const hasReservePartyMember = !!globalScene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; + if ([BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType)) { + const hasReservePartyMember = !!globalScene + .getEnemyParty() + .filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot) + .length; if (hasReservePartyMember) { globalScene.pushPhase(new SwitchSummonPhase(SwitchType.SWITCH, this.fieldIndex, -1, false, false)); } @@ -195,7 +238,7 @@ export class FaintPhase extends PokemonPhase { } pokemon.leaveField(); this.end(); - } + }, }); }); } @@ -206,9 +249,14 @@ export class FaintPhase extends PokemonPhase { if (!this.player) { const enemy = this.getPokemon(); if (enemy.formIndex) { - globalScene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); + globalScene.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, + enemy.species.name, + null, + () => this.doFaint(), + ); } else { - // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase + // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase enemy.hp++; globalScene.unshiftPhase(new DamageAnimPhase(enemy.getBattlerIndex(), 0, HitResult.OTHER)); this.end(); diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts index 0836d1171c0..98c1ced510f 100644 --- a/src/phases/field-phase.ts +++ b/src/phases/field-phase.ts @@ -7,6 +7,8 @@ type PokemonFunc = (pokemon: Pokemon) => void; export abstract class FieldPhase extends BattlePhase { executeForAll(func: PokemonFunc): void { const field = globalScene.getField(true).filter(p => p.summonData); - field.forEach(pokemon => func(pokemon)); + for (const pokemon of field) { + func(pokemon); + } } } diff --git a/src/phases/form-change-phase.ts b/src/phases/form-change-phase.ts index 353fed7b76c..e0ec4e87600 100644 --- a/src/phases/form-change-phase.ts +++ b/src/phases/form-change-phase.ts @@ -38,8 +38,7 @@ export class FormChangePhase extends EvolutionPhase { const preName = getPokemonNameWithAffix(this.pokemon); this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { - - [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { + [this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { const spriteKey = transformedPokemon.getSpriteKey(true); try { sprite.play(spriteKey); @@ -51,7 +50,7 @@ export class FormChangePhase extends EvolutionPhase { sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", transformedPokemon.shiny); sprite.setPipelineData("variant", transformedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (transformedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -71,7 +70,7 @@ export class FormChangePhase extends EvolutionPhase { globalScene.tweens.add({ targets: this.evolutionBgOverlay, alpha: 0, - duration: 250 + duration: 250, }); this.evolutionBg.setVisible(true); this.evolutionBg.play(); @@ -114,7 +113,7 @@ export class FormChangePhase extends EvolutionPhase { this.evolutionBgOverlay.setAlpha(1); this.evolutionBg.setVisible(false); globalScene.tweens.add({ - targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], + targets: [this.evolutionOverlay, this.pokemonEvoTintSprite], alpha: 0, duration: 2000, delay: 150, @@ -132,33 +131,47 @@ export class FormChangePhase extends EvolutionPhase { if (this.formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1) { globalScene.validateAchv(achvs.MEGA_EVOLVE); playEvolutionFanfare = true; - } else if (this.formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || this.formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) { + } else if ( + this.formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || + this.formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1 + ) { globalScene.validateAchv(achvs.GIGANTAMAX); playEvolutionFanfare = true; } const delay = playEvolutionFanfare ? 4000 : 1750; - globalScene.playSoundWithoutBgm(playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare"); + globalScene.playSoundWithoutBgm( + playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare", + ); transformedPokemon.destroy(); - globalScene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), null, true, Utils.fixedInt(delay)); - globalScene.time.delayedCall(Utils.fixedInt(delay + 250), () => globalScene.playBgm()); + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + null, + true, + Utils.fixedInt(delay), + ); + globalScene.time.delayedCall(Utils.fixedInt(delay + 250), () => + globalScene.playBgm(), + ); }); }); - } + }, }); - } + }, }); - } + }, }); }); }); }); }); }); - } + }, }); - } + }, }); }); }); diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index 93f53bf38c0..f3f2aebd67d 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -5,10 +5,6 @@ import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; export class GameOverModifierRewardPhase extends ModifierRewardPhase { - constructor(modifierTypeFunc: ModifierTypeFunc) { - super(modifierTypeFunc); - } - doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); @@ -18,7 +14,9 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.fadeIn(250).then(() => { globalScene.ui.showText( - i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), + i18next.t("battle:rewardGain", { + modifierName: newModifier?.type.name, + }), null, () => { globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index d4b529fe00e..af948ad0632 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -36,7 +36,7 @@ export class GameOverPhase extends BattlePhase { private isVictory: boolean; private firstRibbons: PokemonSpecies[] = []; - constructor(isVictory: boolean = false) { + constructor(isVictory = false) { super(); this.isVictory = isVictory; @@ -52,7 +52,11 @@ export class GameOverPhase extends BattlePhase { // Handle Mystery Encounter special Game Over cases // Situations such as when player lost a battle, but it isn't treated as full Game Over - if (!this.isVictory && globalScene.currentBattle.mysteryEncounter?.onGameOver && !globalScene.currentBattle.mysteryEncounter.onGameOver()) { + if ( + !this.isVictory && + globalScene.currentBattle.mysteryEncounter?.onGameOver && + !globalScene.currentBattle.mysteryEncounter.onGameOver() + ) { // Do not end the game return this.end(); } @@ -61,36 +65,52 @@ export class GameOverPhase extends BattlePhase { if (this.isVictory && globalScene.gameMode.isEndless) { const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); - globalScene.ui.showDialogue(i18next.t("miscDialogue:ending_endless", { context: genderStr }), i18next.t("miscDialogue:ending_name"), 0, () => this.handleGameOver()); + globalScene.ui.showDialogue( + i18next.t("miscDialogue:ending_endless", { context: genderStr }), + i18next.t("miscDialogue:ending_name"), + 0, + () => this.handleGameOver(), + ); } else if (this.isVictory || !globalScene.enableRetries) { this.handleGameOver(); } else { globalScene.ui.showText(i18next.t("battle:retryBattle"), null, () => { - globalScene.ui.setMode(Mode.CONFIRM, () => { - globalScene.ui.fadeOut(1250).then(() => { - globalScene.reset(); - globalScene.clearPhaseQueue(); - globalScene.gameData.loadSession(globalScene.sessionSlotId).then(() => { - globalScene.pushPhase(new EncounterPhase(true)); + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.fadeOut(1250).then(() => { + globalScene.reset(); + globalScene.clearPhaseQueue(); + globalScene.gameData.loadSession(globalScene.sessionSlotId).then(() => { + globalScene.pushPhase(new EncounterPhase(true)); - const availablePartyMembers = globalScene.getPokemonAllowedInBattle().length; + const availablePartyMembers = globalScene.getPokemonAllowedInBattle().length; - globalScene.pushPhase(new SummonPhase(0)); - if (globalScene.currentBattle.double && availablePartyMembers > 1) { - globalScene.pushPhase(new SummonPhase(1)); - } - if (globalScene.currentBattle.waveIndex > 1 && globalScene.currentBattle.battleType !== BattleType.TRAINER) { - globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + globalScene.pushPhase(new SummonPhase(0)); if (globalScene.currentBattle.double && availablePartyMembers > 1) { - globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); + globalScene.pushPhase(new SummonPhase(1)); + } + if ( + globalScene.currentBattle.waveIndex > 1 && + globalScene.currentBattle.battleType !== BattleType.TRAINER + ) { + globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); + } } - } - globalScene.ui.fadeIn(1250); - this.end(); + globalScene.ui.fadeIn(1250); + this.end(); + }); }); - }); - }, () => this.handleGameOver(), false, 0, 0, 1000); + }, + () => this.handleGameOver(), + false, + 0, + 0, + 1000, + ); }); } } @@ -158,17 +178,29 @@ export class GameOverPhase extends BattlePhase { const genderStr = PlayerGender[genderIndex].toLowerCase(); // Dialogue has to be retrieved so that the rival's expressions can be loaded and shown via getCharVariantFromDialogue const dialogue = i18next.t(dialogueKey, { context: genderStr }); - globalScene.charSprite.showCharacter(`rival_${globalScene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, getCharVariantFromDialogue(dialogue)).then(() => { - globalScene.ui.showDialogue(dialogueKey, globalScene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => { - globalScene.ui.fadeOut(500).then(() => { - globalScene.charSprite.hide().then(() => { - const endCardPhase = new EndCardPhase(); - globalScene.unshiftPhase(endCardPhase); - clear(endCardPhase); - }); - }); + globalScene.charSprite + .showCharacter( + `rival_${globalScene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, + getCharVariantFromDialogue(dialogue), + ) + .then(() => { + globalScene.ui.showDialogue( + dialogueKey, + globalScene.gameData.gender === PlayerGender.FEMALE + ? trainerConfigs[TrainerType.RIVAL].name + : trainerConfigs[TrainerType.RIVAL].nameFemale, + null, + () => { + globalScene.ui.fadeOut(500).then(() => { + globalScene.charSprite.hide().then(() => { + const endCardPhase = new EndCardPhase(); + globalScene.unshiftPhase(endCardPhase); + clear(endCardPhase); + }); + }); + }, + ); }); - }); }); } else { const endCardPhase = new EndCardPhase(); @@ -186,8 +218,13 @@ export class GameOverPhase extends BattlePhase { If Online, execute apiFetch as intended If Offline, execute offlineNewClear() only for victory, a localStorage implementation of newClear daily run checks */ if (!Utils.isLocal || Utils.isLocalServerConnected) { - pokerogueApi.savedata.session.newclear({ slot: globalScene.sessionSlotId, isVictory: this.isVictory, clientSessionId: clientSessionId }) - .then((success) => doGameOver(!!success)); + pokerogueApi.savedata.session + .newclear({ + slot: globalScene.sessionSlotId, + isVictory: this.isVictory, + clientSessionId: clientSessionId, + }) + .then(success => doGameOver(!!success)); } else if (this.isVictory) { globalScene.gameData.offlineNewClear().then(result => { doGameOver(result); @@ -202,19 +239,25 @@ export class GameOverPhase extends BattlePhase { if (!globalScene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { globalScene.unshiftPhase(new UnlockPhase(Unlockables.ENDLESS_MODE)); } - if (globalScene.getPlayerParty().filter(p => p.fusionSpecies).length && !globalScene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { + if ( + globalScene.getPlayerParty().filter(p => p.fusionSpecies).length && + !globalScene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE] + ) { globalScene.unshiftPhase(new UnlockPhase(Unlockables.SPLICED_ENDLESS_MODE)); } if (!globalScene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { globalScene.unshiftPhase(new UnlockPhase(Unlockables.MINI_BLACK_HOLE)); } - if (!globalScene.gameData.unlocks[Unlockables.EVIOLITE] && globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)) { + if ( + !globalScene.gameData.unlocks[Unlockables.EVIOLITE] && + globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions) + ) { globalScene.unshiftPhase(new UnlockPhase(Unlockables.EVIOLITE)); } } } - awardRibbon(pokemon: Pokemon, forStarter: boolean = false): void { + awardRibbon(pokemon: Pokemon, forStarter = false): void { const speciesId = getPokemonSpecies(pokemon.species.speciesId); const speciesRibbonCount = globalScene.gameData.incrementRibbonCount(speciesId, forStarter); // first time classic win, award voucher @@ -236,8 +279,12 @@ export class GameOverPhase extends BattlePhase { gameMode: globalScene.gameMode.modeId, party: globalScene.getPlayerParty().map(p => new PokemonData(p)), enemyParty: globalScene.getEnemyParty().map(p => new PokemonData(p)), - modifiers: preWaveSessionData ? preWaveSessionData.modifiers : globalScene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), - enemyModifiers: preWaveSessionData ? preWaveSessionData.enemyModifiers : globalScene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + modifiers: preWaveSessionData + ? preWaveSessionData.modifiers + : globalScene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: preWaveSessionData + ? preWaveSessionData.enemyModifiers + : globalScene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), arena: new ArenaData(globalScene.arena), pokeballCounts: globalScene.pokeballCounts, money: Math.floor(globalScene.money), @@ -250,8 +297,7 @@ export class GameOverPhase extends BattlePhase { challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, - playerFaints: globalScene.arena.playerFaints + playerFaints: globalScene.arena.playerFaints, } as SessionSaveData; } } - diff --git a/src/phases/hide-party-exp-bar-phase.ts b/src/phases/hide-party-exp-bar-phase.ts index 0dce41044c0..52cfd1f71d6 100644 --- a/src/phases/hide-party-exp-bar-phase.ts +++ b/src/phases/hide-party-exp-bar-phase.ts @@ -2,10 +2,6 @@ import { globalScene } from "#app/global-scene"; import { BattlePhase } from "./battle-phase"; export class HidePartyExpBarPhase extends BattlePhase { - constructor() { - super(); - } - start() { super.start(); diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index 5d3c4078fa1..7bed71b3363 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -20,7 +20,7 @@ export enum LearnMoveType { /** For learning a move via Memory Mushroom */ MEMORY, /** For learning a move via TM */ - TM + TM, } export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { @@ -29,7 +29,12 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { private learnMoveType: LearnMoveType; private cost: number; - constructor(partyMemberIndex: number, moveId: Moves, learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE, cost: number = -1) { + constructor( + partyMemberIndex: number, + moveId: Moves, + learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE, + cost = -1, + ) { super(partyMemberIndex); this.moveId = moveId; this.learnMoveType = learnMoveType; @@ -49,7 +54,8 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { return this.end(); } - this.messageMode = globalScene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE; + this.messageMode = + globalScene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE; globalScene.ui.setMode(this.messageMode); // If the Pokemon has less than 4 moves, the new move is added to the largest empty moveset index // If it has 4 moves, the phase then checks if the player wants to replace the move itself. @@ -70,18 +76,27 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { * @param Pokemon The Pokemon learning the move */ async replaceMoveCheck(move: Move, pokemon: Pokemon) { - const learnMovePrompt = i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); - const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }); - const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }); - const preQText = [ learnMovePrompt, moveLimitReached ].join("$"); + const learnMovePrompt = i18next.t("battle:learnMovePrompt", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, + }); + const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { + moveName: move.name, + }); + const preQText = [learnMovePrompt, moveLimitReached].join("$"); await globalScene.ui.showTextPromise(preQText); await globalScene.ui.showTextPromise(shouldReplaceQ, undefined, false); - await globalScene.ui.setModeWithoutClear(Mode.CONFIRM, + await globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, () => this.forgetMoveProcess(move, pokemon), // Yes - () => { // No + () => { + // No globalScene.ui.setMode(this.messageMode); this.rejectMoveAndEnd(move, pokemon); - } + }, ); } @@ -99,15 +114,26 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { async forgetMoveProcess(move: Move, pokemon: Pokemon) { globalScene.ui.setMode(this.messageMode); await globalScene.ui.showTextPromise(i18next.t("battle:learnMoveForgetQuestion"), undefined, true); - await globalScene.ui.setModeWithoutClear(Mode.SUMMARY, pokemon, SummaryUiMode.LEARN_MOVE, move, (moveIndex: number) => { - if (moveIndex === 4) { - globalScene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon)); - return; - } - const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }); - const fullText = [ i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd") ].join("$"); - globalScene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText)); - }); + await globalScene.ui.setModeWithoutClear( + Mode.SUMMARY, + pokemon, + SummaryUiMode.LEARN_MOVE, + move, + (moveIndex: number) => { + if (moveIndex === 4) { + globalScene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon)); + return; + } + const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: pokemon.moveset[moveIndex]!.getName(), + }); + const fullText = [i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd")].join( + "$", + ); + globalScene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText)); + }, + ); } /** @@ -121,16 +147,30 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { * @param Pokemon The Pokemon learning the move */ async rejectMoveAndEnd(move: Move, pokemon: Pokemon) { - await globalScene.ui.showTextPromise(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), undefined, false); - globalScene.ui.setModeWithoutClear(Mode.CONFIRM, + await globalScene.ui.showTextPromise( + i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), + undefined, + false, + ); + globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, () => { globalScene.ui.setMode(this.messageMode); - globalScene.ui.showTextPromise(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), undefined, true).then(() => this.end()); + globalScene.ui + .showTextPromise( + i18next.t("battle:learnMoveNotLearned", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, + }), + undefined, + true, + ) + .then(() => this.end()); }, () => { globalScene.ui.setMode(this.messageMode); this.replaceMoveCheck(move, pokemon); - } + }, ); } @@ -155,7 +195,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { pokemon.usedTMs = []; } pokemon.usedTMs.push(this.moveId); - globalScene.tryRemovePhase((phase) => phase instanceof SelectModifierPhase); + globalScene.tryRemovePhase(phase => phase instanceof SelectModifierPhase); } else if (this.learnMoveType === LearnMoveType.MEMORY) { if (this.cost !== -1) { if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { @@ -165,22 +205,31 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { } globalScene.playSound("se/buy"); } else { - globalScene.tryRemovePhase((phase) => phase instanceof SelectModifierPhase); + globalScene.tryRemovePhase(phase => phase instanceof SelectModifierPhase); } } pokemon.setMove(index, this.moveId); initMoveAnim(this.moveId).then(() => { - loadMoveAnimAssets([ this.moveId ], true); + loadMoveAnimAssets([this.moveId], true); }); globalScene.ui.setMode(this.messageMode); - const learnMoveText = i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); + const learnMoveText = i18next.t("battle:learnMove", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, + }); if (textMessage) { await globalScene.ui.showTextPromise(textMessage); } globalScene.playSound("level_up_fanfare"); // Sound loaded into game as is - globalScene.ui.showText(learnMoveText, null, () => { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); - this.end(); - }, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true); + globalScene.ui.showText( + learnMoveText, + null, + () => { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + }, + this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, + true, + ); } } diff --git a/src/phases/level-cap-phase.ts b/src/phases/level-cap-phase.ts index d75bc3be6d4..567ac922124 100644 --- a/src/phases/level-cap-phase.ts +++ b/src/phases/level-cap-phase.ts @@ -4,17 +4,21 @@ import i18next from "i18next"; import { FieldPhase } from "./field-phase"; export class LevelCapPhase extends FieldPhase { - constructor() { - super(); - } - start(): void { super.start(); globalScene.ui.setMode(Mode.MESSAGE).then(() => { // Sound loaded into game as is globalScene.playSound("level_up_fanfare"); - globalScene.ui.showText(i18next.t("battle:levelCapUp", { levelCap: globalScene.getMaxExpLevel() }), null, () => this.end(), null, true); + globalScene.ui.showText( + i18next.t("battle:levelCapUp", { + levelCap: globalScene.getMaxExpLevel(), + }), + null, + () => this.end(), + null, + true, + ); this.executeForAll(pokemon => pokemon.updateInfo(true)); }); } diff --git a/src/phases/level-up-phase.ts b/src/phases/level-up-phase.ts index 450ecca0c70..31c7fabf451 100644 --- a/src/phases/level-up-phase.ts +++ b/src/phases/level-up-phase.ts @@ -36,20 +36,33 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { if (globalScene.expParty === ExpNotification.DEFAULT) { globalScene.playSound("level_up_fanfare"); globalScene.ui.showText( - i18next.t("battle:levelUp", { pokemonName: getPokemonNameWithAffix(this.pokemon), level: this.level }), + i18next.t("battle:levelUp", { + pokemonName: getPokemonNameWithAffix(this.pokemon), + level: this.level, + }), null, - () => globalScene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false) - .then(() => this.end()), null, true); + () => + globalScene.ui + .getMessageHandler() + .promptLevelUpStats(this.partyMemberIndex, prevStats, false) + .then(() => this.end()), + null, + true, + ); } else if (globalScene.expParty === ExpNotification.SKIP) { this.end(); } else { // we still want to display the stats if activated - globalScene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()); + globalScene.ui + .getMessageHandler() + .promptLevelUpStats(this.partyMemberIndex, prevStats, false) + .then(() => this.end()); } } public override end() { - if (this.lastLevel < 100) { // this feels like an unnecessary optimization + if (this.lastLevel < 100) { + // this feels like an unnecessary optimization const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); for (const lm of levelMoves) { globalScene.unshiftPhase(new LearnMovePhase(this.partyMemberIndex, lm[1])); diff --git a/src/phases/load-move-anim-phase.ts b/src/phases/load-move-anim-phase.ts index 66cb90744e0..3d914f738a7 100644 --- a/src/phases/load-move-anim-phase.ts +++ b/src/phases/load-move-anim-phase.ts @@ -14,7 +14,7 @@ export class LoadMoveAnimPhase extends Phase { public override start(): void { initMoveAnim(this.moveId) - .then(() => loadMoveAnimAssets([ this.moveId ], true)) + .then(() => loadMoveAnimAssets([this.moveId], true)) .then(() => this.end()); } } diff --git a/src/phases/login-phase.ts b/src/phases/login-phase.ts index 0ed8b6feb88..5cce6ca0298 100644 --- a/src/phases/login-phase.ts +++ b/src/phases/login-phase.ts @@ -23,7 +23,7 @@ export class LoginPhase extends Phase { const hasSession = !!Utils.getCookie(Utils.sessionIdKey); - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); Utils.executeIf(bypassLogin || hasSession, updateUserInfo).then(response => { const success = response ? response[0] : false; const statusCode = response ? response[1] : null; @@ -51,7 +51,8 @@ export class LoginPhase extends Phase { () => { globalScene.ui.playSelect(); loadData(); - }, () => { + }, + () => { globalScene.playSound("menu_open"); globalScene.ui.setMode(Mode.REGISTRATION_FORM, { buttonActions: [ @@ -64,25 +65,28 @@ export class LoginPhase extends Phase { return; } this.end(); - } ); - }, () => { + }); + }, + () => { globalScene.unshiftPhase(new LoginPhase(false)); this.end(); - } - ] + }, + ], }); - }, () => { + }, + () => { const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&prompt=none`; window.open(discordUrl, "_self"); - }, () => { + }, + () => { const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&redirect_uri=${redirectUri}&response_type=code&scope=openid`; window.open(googleUrl, "_self"); - } - ] + }, + ], }); } else if (statusCode === 401) { Utils.removeCookie(Utils.sessionIdKey); @@ -92,16 +96,15 @@ export class LoginPhase extends Phase { super.end(); } return null; - } else { - globalScene.gameData.loadSystem().then(success => { - if (success || bypassLogin) { - this.end(); - } else { - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(t("menu:failedToLoadSaveData")); - } - }); } + globalScene.gameData.loadSystem().then(success => { + if (success || bypassLogin) { + this.end(); + } else { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText(t("menu:failedToLoadSaveData")); + } + }); }); } diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index 366fd324376..af4e63c6916 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -8,7 +8,13 @@ export class MessagePhase extends Phase { private promptDelay: number | null; private speaker?: string; - constructor(text: string, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null, speaker?: string) { + constructor( + text: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + speaker?: string, + ) { super(); this.text = text; @@ -23,14 +29,36 @@ export class MessagePhase extends Phase { if (this.text.indexOf("$") > -1) { const pageIndex = this.text.indexOf("$"); - globalScene.unshiftPhase(new MessagePhase(this.text.slice(pageIndex + 1), this.callbackDelay, this.prompt, this.promptDelay, this.speaker)); + globalScene.unshiftPhase( + new MessagePhase( + this.text.slice(pageIndex + 1), + this.callbackDelay, + this.prompt, + this.promptDelay, + this.speaker, + ), + ); this.text = this.text.slice(0, pageIndex).trim(); } if (this.speaker) { - globalScene.ui.showDialogue(this.text, this.speaker, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.promptDelay ?? 0); + globalScene.ui.showDialogue( + this.text, + this.speaker, + null, + () => this.end(), + this.callbackDelay || (this.prompt ? 0 : 1500), + this.promptDelay ?? 0, + ); } else { - globalScene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt, this.promptDelay); + globalScene.ui.showText( + this.text, + null, + () => this.end(), + this.callbackDelay || (this.prompt ? 0 : 1500), + this.prompt, + this.promptDelay, + ); } } diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index e4fac33767f..c94c4deb819 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -24,7 +24,15 @@ export class ModifierRewardPhase extends BattlePhase { const newModifier = this.modifierType.newModifier(); globalScene.addModifier(newModifier); globalScene.playSound("item_fanfare"); - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); + globalScene.ui.showText( + i18next.t("battle:rewardGain", { + modifierName: newModifier?.type.name, + }), + null, + () => resolve(), + null, + true, + ); }); } } diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts index f460f89a72a..56f46d25f77 100644 --- a/src/phases/money-reward-phase.ts +++ b/src/phases/money-reward-phase.ts @@ -27,7 +27,9 @@ export class MoneyRewardPhase extends BattlePhase { const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); - const message = i18next.t("battle:moneyWon", { moneyAmount: formattedMoneyAmount }); + const message = i18next.t("battle:moneyWon", { + moneyAmount: formattedMoneyAmount, + }); globalScene.ui.showText(message, null, () => this.end(), null, true); } diff --git a/src/phases/move-anim-phase.ts b/src/phases/move-anim-phase.ts index 005445924a0..830e72cb8be 100644 --- a/src/phases/move-anim-phase.ts +++ b/src/phases/move-anim-phase.ts @@ -7,7 +7,7 @@ import { Phase } from "#app/phase"; export class MoveAnimPhase extends Phase { constructor( protected anim: Anim, - protected onSubstitute: boolean = false, + protected onSubstitute = false, ) { super(); } diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts index 871d6188237..e8b7c0c8fa7 100644 --- a/src/phases/move-anim-test-phase.ts +++ b/src/phases/move-anim-test-phase.ts @@ -24,23 +24,27 @@ export class MoveAnimTestPhase extends BattlePhase { if (moveId === undefined) { this.playMoveAnim(this.moveQueue.slice(0), true); return; - } else if (player) { + } + if (player) { console.log(Moves[moveId]); } initMoveAnim(moveId).then(() => { - loadMoveAnimAssets([ moveId ], true) - .then(() => { - const user = player ? globalScene.getPlayerPokemon()! : globalScene.getEnemyPokemon()!; - const target = (player !== (allMoves[moveId] instanceof SelfStatusMove)) ? globalScene.getEnemyPokemon()! : globalScene.getPlayerPokemon()!; - new MoveAnim(moveId, user, target.getBattlerIndex()).play(allMoves[moveId].hitsSubstitute(user, target), () => { // TODO: are the bangs correct here? - if (player) { - this.playMoveAnim(moveQueue, false); - } else { - this.playMoveAnim(moveQueue, true); - } - }); + loadMoveAnimAssets([moveId], true).then(() => { + const user = player ? globalScene.getPlayerPokemon()! : globalScene.getEnemyPokemon()!; + const target = + player !== allMoves[moveId] instanceof SelfStatusMove + ? globalScene.getEnemyPokemon()! + : globalScene.getPlayerPokemon()!; + new MoveAnim(moveId, user, target.getBattlerIndex()).play(allMoves[moveId].hitsSubstitute(user, target), () => { + // TODO: are the bangs correct here? + if (player) { + this.playMoveAnim(moveQueue, false); + } else { + this.playMoveAnim(moveQueue, true); + } }); + }); }); } } diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index 3989221504d..26ad85bbe03 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -36,7 +36,7 @@ export class MoveChargePhase extends PokemonPhase { // If the target is somehow not defined, or the move is somehow not a ChargingMove, // immediately end this phase. - if (!target || !(move.isChargingMove())) { + if (!target || !move.isChargingMove()) { console.warn("Invalid parameters for MoveChargePhase"); return super.end(); } @@ -62,15 +62,19 @@ export class MoveChargePhase extends PokemonPhase { if (instantCharge.value) { // this MoveEndPhase will be duplicated by the queued MovePhase if not removed - globalScene.tryRemovePhase((phase) => phase instanceof MoveEndPhase && phase.getPokemon() === user); + globalScene.tryRemovePhase(phase => phase instanceof MoveEndPhase && phase.getPokemon() === user); // queue a new MovePhase for this move's attack phase - globalScene.unshiftPhase(new MovePhase(user, [ this.targetIndex ], this.move, false)); + globalScene.unshiftPhase(new MovePhase(user, [this.targetIndex], this.move, false)); } else { - user.getMoveQueue().push({ move: move.id, targets: [ this.targetIndex ]}); + user.getMoveQueue().push({ move: move.id, targets: [this.targetIndex] }); } // Add this move's charging phase to the user's move history - user.pushMoveHistory({ move: this.move.moveId, targets: [ this.targetIndex ], result: MoveResult.OTHER }); + user.pushMoveHistory({ + move: this.move.moveId, + targets: [this.targetIndex], + result: MoveResult.OTHER, + }); } super.end(); } @@ -80,6 +84,6 @@ export class MoveChargePhase extends PokemonPhase { } public getTargetPokemon(): Pokemon | undefined { - return globalScene.getField(true).find((p) => this.targetIndex === p.getBattlerIndex()); + return globalScene.getField(true).find(p => this.targetIndex === p.getBattlerIndex()); } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index c382c6aa4c4..4152fc243f0 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -24,8 +24,7 @@ import { SemiInvulnerableTag, SubstituteTag, } from "#app/data/battler-tags"; -import type { - MoveAttr } from "#app/data/moves/move"; +import type { MoveAttr } from "#app/data/moves/move"; import { applyFilteredMoveAttrs, applyMoveAttrs, @@ -62,7 +61,7 @@ import { } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils"; -import { type nil } from "#app/utils"; +import type { nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; import i18next from "i18next"; @@ -74,12 +73,12 @@ import { MoveEndPhase } from "./move-end-phase"; export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; protected targets: BattlerIndex[]; - protected reflected: boolean = false; + protected reflected = false; /** * @param reflected Indicates that the move was reflected by the user due to magic coat or magic bounce */ - constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected: boolean = false) { + constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected = false) { super(battlerIndex); this.move = move; this.reflected = reflected; @@ -183,31 +182,52 @@ export class MoveEffectPhase extends PokemonPhase { * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully * used in the sense of "Does it have an effect on the user?". */ - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; + const moveHistoryEntry = { + move: this.move.moveId, + targets: this.targets, + result: MoveResult.PENDING, + virtual: this.move.virtual, + }; /** * Stores results of hit checks of the invoked move against all targets, organized by battler index. * @see {@linkcode hitCheck} */ - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); + const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); const hasActiveTargets = targets.some(t => t.isActive(true)); /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) - && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0]?.getTag(SemiInvulnerableTag); + const isImmune = + targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) && + targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move) && + !targets[0]?.getTag(SemiInvulnerableTag); - const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + const mayBounce = + move.hasFlag(MoveFlags.REFLECTABLE) && + !this.reflected && + targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); /** * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target * (and not random target) and failed the hit check against its target (MISS), log the move * as FAILed or MISSed (depending on the conditions above) and end this phase. */ - if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + if ( + !hasActiveTargets || + (!mayBounce && + !move.hasAttr(VariableTargetAttr) && + !move.isMultiTarget() && + !targetHitChecks[this.targets[0]] && + !targets[0].getTag(ProtectedTag) && + !isImmune) + ) { this.stopMultiHit(); if (hasActiveTargets) { - globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); + globalScene.queueMessage( + i18next.t("battle:attackMissed", { + pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "", + }), + ); moveHistoryEntry.result = MoveResult.MISS; applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); } else { @@ -224,19 +244,24 @@ export class MoveEffectPhase extends PokemonPhase { move.hitsSubstitute(user, this.getFirstTarget()!), () => { /** Has the move successfully hit a target (for damage) yet? */ - let hasHit: boolean = false; + let hasHit = false; // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles // and check which target will magic bounce. - const trueTargets: Pokemon[] = move.moveTarget !== MoveTarget.ENEMY_SIDE ? targets : (() => { - const magicCoatTargets = targets.filter(t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr)); + const trueTargets: Pokemon[] = + move.moveTarget !== MoveTarget.ENEMY_SIDE + ? targets + : (() => { + const magicCoatTargets = targets.filter( + t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr), + ); - // only magic coat effect cares about order - if (!mayBounce || magicCoatTargets.length === 0) { - return [ targets[0] ]; - } - return [ magicCoatTargets[0] ]; - })(); + // only magic coat effect cares about order + if (!mayBounce || magicCoatTargets.length === 0) { + return [targets[0]]; + } + return [magicCoatTargets[0]]; + })(); const queuedPhases: Phase[] = []; for (const target of trueTargets) { @@ -248,61 +273,95 @@ export class MoveEffectPhase extends PokemonPhase { const bypassIgnoreProtect = new BooleanHolder(false); /** If the move is not targeting a Pokemon on the user's side, try to apply conditional protection effects */ if (!this.move.getMove().isAllyTarget()) { - globalScene.arena.applyTagsForSide(ConditionalProtectTag, targetSide, false, hasConditionalProtectApplied, user, target, move.id, bypassIgnoreProtect); + globalScene.arena.applyTagsForSide( + ConditionalProtectTag, + targetSide, + false, + hasConditionalProtectApplied, + user, + target, + move.id, + bypassIgnoreProtect, + ); } /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ - const isProtected = !([ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES ].includes(this.move.getMove().moveTarget)) && ( - bypassIgnoreProtect.value - || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) - && (hasConditionalProtectApplied.value - || (!target.findTags(t => t instanceof DamageProtectedTag).length - && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) - || (this.move.getMove().category !== MoveCategory.STATUS - && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + const isProtected = + ![MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES].includes(this.move.getMove().moveTarget) && + (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) && + (hasConditionalProtectApplied.value || + (!target.findTags(t => t instanceof DamageProtectedTag).length && + target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) || + (this.move.getMove().category !== MoveCategory.STATUS && + target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); /** Is the target hidden by the effects of its Commander ability? */ - const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; + const isCommanding = + globalScene.currentBattle.double && + target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; /** Is the target reflecting status moves from the magic coat move? */ const isReflecting = !!target.getTag(BattlerTagType.MAGIC_COAT); /** Is the target's magic bounce ability not ignored and able to reflect this move? */ - const canMagicBounce = !isReflecting && !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && target.hasAbilityWithAttr(ReflectStatusMoveAbAttr); + const canMagicBounce = + !isReflecting && + !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && + target.hasAbilityWithAttr(ReflectStatusMoveAbAttr); const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); /** Is the target reflecting the effect, not protected, and not in an semi-invulnerable state?*/ - const willBounce = (!isProtected && !this.reflected && !isCommanding - && move.hasFlag(MoveFlags.REFLECTABLE) - && (isReflecting || canMagicBounce) - && !semiInvulnerableTag); + const willBounce = + !isProtected && + !this.reflected && + !isCommanding && + move.hasFlag(MoveFlags.REFLECTABLE) && + (isReflecting || canMagicBounce) && + !semiInvulnerableTag; // If the move will bounce, then queue the bounce and move on to the next target if (!target.switchOutStatus && willBounce) { - const newTargets = move.isMultiTarget() ? getMoveTargets(target, move.id).targets : [ user.getBattlerIndex() ]; + const newTargets = move.isMultiTarget() + ? getMoveTargets(target, move.id).targets + : [user.getBattlerIndex()]; if (!isReflecting) { - queuedPhases.push(new ShowAbilityPhase(target.getBattlerIndex(), target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr))); + queuedPhases.push( + new ShowAbilityPhase( + target.getBattlerIndex(), + target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr), + ), + ); } - queuedPhases.push(new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true)); + queuedPhases.push( + new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true), + ); continue; } /** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */ - const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) - && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !semiInvulnerableTag; - + const isImmune = + target.hasAbilityWithAttr(TypeImmunityAbAttr) && + target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move) && + !semiInvulnerableTag; /** * If the move missed a target, stop all future hits against that target * and move on to the next target (if there is one). */ - if (target.switchOutStatus || isCommanding || (!isImmune && !isProtected && !targetHitChecks[target.getBattlerIndex()])) { + if ( + target.switchOutStatus || + isCommanding || + (!isImmune && !isProtected && !targetHitChecks[target.getBattlerIndex()]) + ) { this.stopMultiHit(target); if (!target.switchOutStatus) { - globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + globalScene.queueMessage( + i18next.t("battle:attackMissed", { + pokemonNameWithAffix: getPokemonNameWithAffix(target), + }), + ); } if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; @@ -345,7 +404,7 @@ export class MoveEffectPhase extends PokemonPhase { HitResult.EFFECTIVE, HitResult.SUPER_EFFECTIVE, HitResult.NOT_VERY_EFFECTIVE, - HitResult.ONE_HIT_KO + HitResult.ONE_HIT_KO, ].includes(hitResult); /** Is this target the first one hit by the move on its current strike? */ @@ -425,7 +484,7 @@ export class MoveEffectPhase extends PokemonPhase { * after all targeted effects have applied. * This prevents blocked effects from applying until after this hit resolves. */ - targets.forEach((target) => { + targets.forEach(target => { const substitute = target.getTag(SubstituteTag); if (substitute && substitute.hp <= 0) { target.lapseTag(BattlerTagType.SUBSTITUTE); @@ -464,7 +523,7 @@ export class MoveEffectPhase extends PokemonPhase { } globalScene.applyModifiers(HitHealModifier, this.player, user); // Clear all cached move effectiveness values among targets - this.getTargets().forEach((target) => target.turnData.moveEffectiveness = null); + this.getTargets().forEach(target => (target.turnData.moveEffectiveness = null)); } } @@ -481,12 +540,17 @@ export class MoveEffectPhase extends PokemonPhase { * @returns a function intended to be passed into a `then()` call. */ protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { - applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()); + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.POST_APPLY && + attr.selfTarget && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit), + user, + target, + this.move.getMove(), + ); } /** @@ -499,12 +563,17 @@ export class MoveEffectPhase extends PokemonPhase { * @returns a function intended to be passed into a `then()` call. */ protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { - applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.POST_APPLY - && !attr.selfTarget - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()); + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.POST_APPLY && + !attr.selfTarget && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit), + user, + target, + this.move.getMove(), + ); } /** @@ -517,13 +586,24 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): void { - applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.HIT - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit) - && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()); + protected applyOnHitEffects( + user: Pokemon, + target: Pokemon, + firstHit: boolean, + lastHit: boolean, + firstTarget: boolean, + ): void { + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.HIT && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + (!attr.firstTargetOnly || firstTarget), + user, + target, + this.move.getMove(), + ); } /** @@ -560,7 +640,15 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean, isProtected: boolean, hitResult: HitResult, firstTarget: boolean): void { + protected applySuccessfulAttackEffects( + user: Pokemon, + target: Pokemon, + firstHit: boolean, + lastHit: boolean, + isProtected: boolean, + hitResult: HitResult, + firstTarget: boolean, + ): void { if (!isProtected) { this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); this.applyOnGetHitAbEffects(user, target, hitResult); @@ -578,12 +666,16 @@ export class MoveEffectPhase extends PokemonPhase { * @param dealsDamage - `true` if the attempted move successfully dealt damage * @returns a function intended to be passed into a `then()` call. */ - protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : void { + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean): void { if (this.move.getMove().hasAttr(FlinchAttr)) { return; } - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { + if ( + dealsDamage && + !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && + !this.move.getMove().hitsSubstitute(user, target) + ) { const flinched = new BooleanHolder(false); globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); if (flinched.value) { @@ -599,7 +691,7 @@ export class MoveEffectPhase extends PokemonPhase { */ public hitCheck(target: Pokemon): boolean { // Moves targeting the user and entry hazards can't miss - if ([ MoveTarget.USER, MoveTarget.ENEMY_SIDE ].includes(this.move.getMove().moveTarget)) { + if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) { return true; } @@ -627,7 +719,11 @@ export class MoveEffectPhase extends PokemonPhase { } const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); - if (target.getTag(BattlerTagType.TELEKINESIS) && !semiInvulnerableTag && !this.move.getMove().hasAttr(OneHitKOAttr)) { + if ( + target.getTag(BattlerTagType.TELEKINESIS) && + !semiInvulnerableTag && + !this.move.getMove().hasAttr(OneHitKOAttr) + ) { return true; } @@ -644,7 +740,7 @@ export class MoveEffectPhase extends PokemonPhase { const accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); const rand = user.randSeedInt(100); - return rand < (moveAccuracy * accuracyMultiplier); + return rand < moveAccuracy * accuracyMultiplier; } /** @@ -671,11 +767,14 @@ export class MoveEffectPhase extends PokemonPhase { if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { return true; } - if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(PokemonType.POISON))) { + if (this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(PokemonType.POISON)) { return true; } // TODO: Fix lock on / mind reader check. - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if ( + user.getTag(BattlerTagType.IGNORE_ACCURACY) && + (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1 + ) { return true; } } @@ -718,7 +817,10 @@ export class MoveEffectPhase extends PokemonPhase { protected removeTarget(target: Pokemon): void { const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); if (targetIndex !== -1) { - this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); + this.targets.splice( + this.targets.findIndex(ind => ind === target.getBattlerIndex()), + 1, + ); } } @@ -737,7 +839,7 @@ export class MoveEffectPhase extends PokemonPhase { } // If no target specified, or the specified target was the last of this move's // targets, completely cancel all subsequent strikes. - if (!target || this.targets.length === 0 ) { + if (!target || this.targets.length === 0) { user.turnData.hitCount = 1; user.turnData.hitsLeft = 1; } diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts index 428dacd639a..4716370cc4e 100644 --- a/src/phases/move-end-phase.ts +++ b/src/phases/move-end-phase.ts @@ -4,10 +4,6 @@ import { BattlerTagLapseType } from "#app/data/battler-tags"; import { PokemonPhase } from "./pokemon-phase"; export class MoveEndPhase extends PokemonPhase { - constructor(battlerIndex: BattlerIndex) { - super(battlerIndex); - } - start() { super.start(); diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 7e454d654d0..16802f8e0ff 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -58,9 +58,9 @@ export class MovePhase extends BattlePhase { protected followUp: boolean; protected ignorePp: boolean; protected forcedLast: boolean; - protected failed: boolean = false; - protected cancelled: boolean = false; - protected reflected: boolean = false; + protected failed = false; + protected cancelled = false; + protected reflected = false; public get pokemon(): Pokemon { return this._pokemon; @@ -93,7 +93,15 @@ export class MovePhase extends BattlePhase { * Reflected moves cannot be reflected again and will not trigger Dancer. */ - constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false, forcedLast: boolean = false) { + constructor( + pokemon: Pokemon, + targets: BattlerIndex[], + move: PokemonMove, + followUp = false, + ignorePp = false, + reflected = false, + forcedLast = false, + ) { super(); this.pokemon = pokemon; @@ -110,8 +118,12 @@ export class MovePhase extends BattlePhase { * @param ignoreDisableTags `true` to not check if the move is disabled * @returns `true` if all the checks pass */ - public canMove(ignoreDisableTags: boolean = false): boolean { - return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && !!this.targets.length; + public canMove(ignoreDisableTags = false): boolean { + return ( + this.pokemon.isActive(true) && + this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && + !!this.targets.length + ); } /**Signifies the current move should fail but still use PP */ @@ -132,7 +144,6 @@ export class MovePhase extends BattlePhase { return this.forcedLast; } - public start(): void { super.start(); @@ -213,24 +224,34 @@ export class MovePhase extends BattlePhase { switch (this.pokemon.status.effect) { case StatusEffect.PARALYSIS: - activated = (!this.pokemon.randSeedInt(4) || Overrides.STATUS_ACTIVATION_OVERRIDE === true) && Overrides.STATUS_ACTIVATION_OVERRIDE !== false; + activated = + (!this.pokemon.randSeedInt(4) || Overrides.STATUS_ACTIVATION_OVERRIDE === true) && + Overrides.STATUS_ACTIVATION_OVERRIDE !== false; break; case StatusEffect.SLEEP: applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); const turnsRemaining = new NumberHolder(this.pokemon.status.sleepTurnsRemaining ?? 0); - applyAbAttrs(ReduceStatusEffectDurationAbAttr, this.pokemon, null, false, this.pokemon.status.effect, turnsRemaining); + applyAbAttrs( + ReduceStatusEffectDurationAbAttr, + this.pokemon, + null, + false, + this.pokemon.status.effect, + turnsRemaining, + ); this.pokemon.status.sleepTurnsRemaining = turnsRemaining.value; healed = this.pokemon.status.sleepTurnsRemaining <= 0; activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); break; case StatusEffect.FREEZE: healed = - !!this.move.getMove().findAttr((attr) => - attr instanceof HealStatusEffectAttr - && attr.selfTarget - && attr.isOfEffect(StatusEffect.FREEZE)) - || (!this.pokemon.randSeedInt(5) && Overrides.STATUS_ACTIVATION_OVERRIDE !== true) - || Overrides.STATUS_ACTIVATION_OVERRIDE === false; + !!this.move + .getMove() + .findAttr( + attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE), + ) || + (!this.pokemon.randSeedInt(5) && Overrides.STATUS_ACTIVATION_OVERRIDE !== true) || + Overrides.STATUS_ACTIVATION_OVERRIDE === false; activated = !healed; break; @@ -238,10 +259,20 @@ export class MovePhase extends BattlePhase { if (activated) { this.cancel(); - globalScene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); - globalScene.unshiftPhase(new CommonAnimPhase(this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); + globalScene.queueMessage( + getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon)), + ); + globalScene.unshiftPhase( + new CommonAnimPhase( + this.pokemon.getBattlerIndex(), + undefined, + CommonAnim.POISON + (this.pokemon.status.effect - 1), + ), + ); } else if (healed) { - globalScene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); + globalScene.queueMessage( + getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon)), + ); this.pokemon.resetStatus(); this.pokemon.updateInfo(); } @@ -271,7 +302,7 @@ export class MovePhase extends BattlePhase { const isDelayedAttack = this.move.getMove().hasAttr(DelayedAttackAttr); if (isDelayedAttack) { // Check the player side arena if future sight is active - const futureSightTags = globalScene.arena.findTags(t => t.tagType === ArenaTagType.FUTURE_SIGHT); + const futureSightTags = globalScene.arena.findTags(t => t.tagType === ArenaTagType.FUTURE_SIGHT); const doomDesireTags = globalScene.arena.findTags(t => t.tagType === ArenaTagType.DOOM_DESIRE); let fail = false; const currentTargetIndex = targets[0].getBattlerIndex(); @@ -294,7 +325,7 @@ export class MovePhase extends BattlePhase { } } - let success: boolean = true; + let success = true; // Check if there are any attributes that can interrupt the move, overriding the fail message. for (const move of this.move.getMove().getAttrs(PreUseInterruptAttr)) { if (move.apply(this.pokemon, targets[0], this.move.getMove())) { @@ -341,8 +372,8 @@ export class MovePhase extends BattlePhase { * Move conditions assume the move has a single target * TODO: is this sustainable? */ - let failedDueToTerrain: boolean = false; - let failedDueToWeather: boolean = false; + let failedDueToTerrain = false; + let failedDueToWeather = false; if (success) { const passesConditions = move.applyConditions(this.pokemon, targets[0], move); failedDueToWeather = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); @@ -350,7 +381,6 @@ export class MovePhase extends BattlePhase { success = passesConditions && !failedDueToWeather && !failedDueToTerrain; } - // Update the battle's "last move" pointer, unless we're currently mimicking a move. if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { // The last move used is unaffected by moves that fail @@ -367,14 +397,20 @@ export class MovePhase extends BattlePhase { */ if (success) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); - globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected)); - + globalScene.unshiftPhase( + new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected), + ); } else { - if ([ Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE ].includes(this.move.moveId)) { + if ([Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE].includes(this.move.moveId)) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); } - this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + this.pokemon.pushMoveHistory({ + move: this.move.moveId, + targets: this.targets, + result: MoveResult.FAIL, + virtual: this.move.virtual, + }); const failureMessage = move.getFailedText(this.pokemon, targets[0], move); let failedText: string | undefined; @@ -413,7 +449,12 @@ export class MovePhase extends BattlePhase { this.showMoveText(); globalScene.unshiftPhase(new MoveChargePhase(this.pokemon.getBattlerIndex(), this.targets[0], this.move)); } else { - this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + this.pokemon.pushMoveHistory({ + move: this.move.moveId, + targets: this.targets, + result: MoveResult.FAIL, + virtual: this.move.virtual, + }); const failureMessage = move.getFailedText(this.pokemon, targets[0], move); this.showMoveText(); @@ -443,7 +484,9 @@ export class MovePhase extends BattlePhase { * TODO: This hardcodes the PP increase at 1 per opponent, rather than deferring to the ability. */ public getPpIncreaseFromPressure(targets: Pokemon[]): number { - const foesWithPressure = this.pokemon.getOpponents().filter(o => targets.includes(o) && o.isActive(true) && o.hasAbilityWithAttr(IncreasePpAbAttr)); + const foesWithPressure = this.pokemon + .getOpponents() + .filter(o => targets.includes(o) && o.isActive(true) && o.hasAbilityWithAttr(IncreasePpAbAttr)); return foesWithPressure.length; } @@ -458,10 +501,13 @@ export class MovePhase extends BattlePhase { const redirectTarget = new NumberHolder(currentTarget); // check move redirection abilities of every pokemon *except* the user. - globalScene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget)); + globalScene + .getField(true) + .filter(p => p !== this.pokemon) + .forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget)); /** `true` if an Ability is responsible for redirecting the move to another target; `false` otherwise */ - let redirectedByAbility = (currentTarget !== redirectTarget.value); + let redirectedByAbility = currentTarget !== redirectTarget.value; // check for center-of-attention tags (note that this will override redirect abilities) this.pokemon.getOpponents().forEach(p => { @@ -469,7 +515,11 @@ export class MovePhase extends BattlePhase { // TODO: don't hardcode this interaction. // Handle interaction between the rage powder center-of-attention tag and moves used by grass types/overcoat-havers (which are immune to RP's redirect) - if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { + if ( + redirectTag && + (!redirectTag.powder || + (!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT))) + ) { redirectTarget.value = p.getBattlerIndex(); redirectedByAbility = false; } @@ -477,7 +527,7 @@ export class MovePhase extends BattlePhase { if (currentTarget !== redirectTarget.value) { const bypassRedirectAttrs = this.move.getMove().getAttrs(BypassRedirectAttr); - bypassRedirectAttrs.forEach((attr) => { + bypassRedirectAttrs.forEach(attr => { if (!attr.abilitiesOnly || redirectedByAbility) { redirectTarget.value = currentTarget; } @@ -485,7 +535,12 @@ export class MovePhase extends BattlePhase { if (this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr)) { redirectTarget.value = currentTarget; - globalScene.unshiftPhase(new ShowAbilityPhase(this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); + globalScene.unshiftPhase( + new ShowAbilityPhase( + this.pokemon.getBattlerIndex(), + this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr), + ), + ); } this.targets[0] = redirectTarget.value; @@ -554,7 +609,11 @@ export class MovePhase extends BattlePhase { frenzyMissFunc(this.pokemon, this.move.getMove()); } - this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL, targets: this.targets }); + this.pokemon.pushMoveHistory({ + move: Moves.NONE, + result: MoveResult.FAIL, + targets: this.targets, + }); this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); this.pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); @@ -576,10 +635,13 @@ export class MovePhase extends BattlePhase { return; } - globalScene.queueMessage(i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", { - pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), - moveName: this.move.getName() - }), 500); + globalScene.queueMessage( + i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + moveName: this.move.getName(), + }), + 500, + ); applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index da78f59535f..26012df191d 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -67,7 +67,9 @@ export class MysteryEncounterPhase extends Phase { if (!this.optionSelectSettings) { // Sets flag that ME was encountered, only if this is not a followup option select phase // Can be used in later MEs to check for requirements to spawn, run history, etc. - globalScene.mysteryEncounterSaveData.encounteredEvents.push(new SeenEncounterData(encounter.encounterType, encounter.encounterTier, globalScene.currentBattle.waveIndex)); + globalScene.mysteryEncounterSaveData.encounteredEvents.push( + new SeenEncounterData(encounter.encounterType, encounter.encounterTier, globalScene.currentBattle.waveIndex), + ); } // Initiates encounter dialogue window and option select @@ -86,7 +88,10 @@ export class MysteryEncounterPhase extends Phase { if (!this.optionSelectSettings) { // Saves the selected option in the ME save data, only if this is not a followup option select phase // Can be used for analytics purposes to track what options are popular on certain encounters - const encounterSaveData = globalScene.mysteryEncounterSaveData.encounteredEvents[globalScene.mysteryEncounterSaveData.encounteredEvents.length - 1]; + const encounterSaveData = + globalScene.mysteryEncounterSaveData.encounteredEvents[ + globalScene.mysteryEncounterSaveData.encounteredEvents.length - 1 + ]; if (encounterSaveData.type === globalScene.currentBattle.mysteryEncounter?.encounterType) { encounterSaveData.selectedOption = index; } @@ -101,12 +106,11 @@ export class MysteryEncounterPhase extends Phase { if (option.onPreOptionPhase) { globalScene.executeWithSeedOffset(async () => { - return await option.onPreOptionPhase!() - .then((result) => { - if (isNullOrUndefined(result) || result) { - this.continueEncounter(); - } - }); + return await option.onPreOptionPhase!().then(result => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(); + } + }); }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset()); } else { this.continueEncounter(); @@ -141,7 +145,14 @@ export class MysteryEncounterPhase extends Phase { i++; if (title) { - globalScene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text ?? "", + title, + null, + nextAction, + 0, + i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { globalScene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } @@ -210,10 +221,6 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { * See {@linkcode TurnEndPhase} for more details */ export class MysteryEncounterBattleStartCleanupPhase extends Phase { - constructor() { - super(); - } - /** * Cleans up `TURN_END` tags, any {@linkcode PostTurnStatusEffectPhase}s, checks for Pokemon switches, then continues */ @@ -221,20 +228,25 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { super.start(); // Lapse any residual flinches/endures but ignore all other turn-end battle tags - const includedLapseTags = [ BattlerTagType.FLINCHED, BattlerTagType.ENDURING ]; + const includedLapseTags = [BattlerTagType.FLINCHED, BattlerTagType.ENDURING]; const field = globalScene.getField(true).filter(p => p.summonData); field.forEach(pokemon => { const tags = pokemon.summonData.tags; - tags.filter(t => includedLapseTags.includes(t.tagType) - && t.lapseTypes.includes(BattlerTagLapseType.TURN_END) - && !(t.lapse(pokemon, BattlerTagLapseType.TURN_END))).forEach(t => { - t.onRemove(pokemon); - tags.splice(tags.indexOf(t), 1); - }); + tags + .filter( + t => + includedLapseTags.includes(t.tagType) && + t.lapseTypes.includes(BattlerTagLapseType.TURN_END) && + !t.lapse(pokemon, BattlerTagLapseType.TURN_END), + ) + .forEach(t => { + t.onRemove(pokemon); + tags.splice(tags.indexOf(t), 1); + }); }); // Remove any status tick phases - while (!!globalScene.findPhase(p => p instanceof PostTurnStatusEffectPhase)) { + while (globalScene.findPhase(p => p instanceof PostTurnStatusEffectPhase)) { globalScene.tryRemovePhase(p => p instanceof PostTurnStatusEffectPhase); } @@ -303,16 +315,23 @@ export class MysteryEncounterBattlePhase extends Phase { if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { if (globalScene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); - - } else { - return i18next.t("battle:trainerAppeared", { trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + return i18next.t("battle:trainerAppearedDouble", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } + return i18next.t("battle:trainerAppeared", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].name }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name }); + ? i18next.t("battle:singleWildAppeared", { + pokemonName: enemyField[0].name, + }) + : i18next.t("battle:multiWildAppeared", { + pokemonName1: enemyField[0].name, + pokemonName2: enemyField[1].name, + }); } /** @@ -367,7 +386,10 @@ export class MysteryEncounterBattlePhase extends Phase { } else { const trainer = globalScene.currentBattle.trainer; let message: string; - globalScene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), globalScene.currentBattle.mysteryEncounter?.getSeedOffset()); + globalScene.executeWithSeedOffset( + () => (message = Utils.randSeedItem(encounterMessages)), + globalScene.currentBattle.mysteryEncounter?.getSeedOffset(), + ); message = message!; // tell TS compiler it's defined now const showDialogueAndSummon = () => { globalScene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { @@ -375,7 +397,13 @@ export class MysteryEncounterBattlePhase extends Phase { }); }; if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { - globalScene.showFieldOverlay(500).then(() => globalScene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])) + .then(() => showDialogueAndSummon()), + ); // TODO: is this bang correct? } else { showDialogueAndSummon(); } @@ -415,7 +443,7 @@ export class MysteryEncounterBattlePhase extends Phase { } } else { if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { - globalScene.getPlayerField().forEach((pokemon) => pokemon.lapseTag(BattlerTagType.COMMANDED)); + globalScene.getPlayerField().forEach(pokemon => pokemon.lapseTag(BattlerTagType.COMMANDED)); globalScene.pushPhase(new ReturnPhase(1)); } globalScene.pushPhase(new ToggleDoublePositionPhase(false)); @@ -458,7 +486,7 @@ export class MysteryEncounterBattlePhase extends Phase { onComplete: () => { trainer.untint(100, "Sine.easeOut"); trainer.playAnim(); - } + }, }); } @@ -469,7 +497,7 @@ export class MysteryEncounterBattlePhase extends Phase { y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } } @@ -488,7 +516,7 @@ export class MysteryEncounterBattlePhase extends Phase { export class MysteryEncounterRewardsPhase extends Phase { addHealPhase: boolean; - constructor(addHealPhase: boolean = false) { + constructor(addHealPhase = false) { super(); this.addHealPhase = addHealPhase; } @@ -532,7 +560,12 @@ export class MysteryEncounterRewardsPhase extends Phase { encounter.doEncounterRewards(); } else if (this.addHealPhase) { globalScene.tryRemovePhase(p => p instanceof SelectModifierPhase); - globalScene.unshiftPhase(new SelectModifierPhase(0, undefined, { fillRemaining: false, rerollMultiplier: -1 })); + globalScene.unshiftPhase( + new SelectModifierPhase(0, undefined, { + fillRemaining: false, + rerollMultiplier: -1, + }), + ); } globalScene.pushPhase(new PostMysteryEncounterPhase()); @@ -564,12 +597,11 @@ export class PostMysteryEncounterPhase extends Phase { if (this.onPostOptionSelect) { globalScene.executeWithSeedOffset(async () => { - return await this.onPostOptionSelect!() - .then((result) => { - if (isNullOrUndefined(result) || result) { - this.continueEncounter(); - } - }); + return await this.onPostOptionSelect!().then(result => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(); + } + }); }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset() * 2000); } else { this.continueEncounter(); @@ -600,7 +632,14 @@ export class PostMysteryEncounterPhase extends Phase { i++; globalScene.ui.setMode(Mode.MESSAGE); if (title) { - globalScene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text ?? "", + title, + null, + nextAction, + 0, + i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { globalScene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index 2de9a4300c5..ed768742aac 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -23,7 +23,7 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } const enemyField = globalScene.getEnemyField(); - const moveTargets: any[] = [ globalScene.arenaEnemy, enemyField ]; + const moveTargets: any[] = [globalScene.arenaEnemy, enemyField]; const mysteryEncounter = globalScene.currentBattle?.mysteryEncounter?.introVisuals; if (mysteryEncounter) { moveTargets.push(mysteryEncounter); @@ -37,7 +37,7 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); } diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts index 229d37f9a69..e53f775f083 100644 --- a/src/phases/next-encounter-phase.ts +++ b/src/phases/next-encounter-phase.ts @@ -23,7 +23,13 @@ export class NextEncounterPhase extends EncounterPhase { globalScene.arenaNextEnemy.setVisible(true); const enemyField = globalScene.getEnemyField(); - const moveTargets: any[] = [ globalScene.arenaEnemy, globalScene.arenaNextEnemy, globalScene.currentBattle.trainer, enemyField, globalScene.lastEnemyTrainer ]; + const moveTargets: any[] = [ + globalScene.arenaEnemy, + globalScene.arenaNextEnemy, + globalScene.currentBattle.trainer, + enemyField, + globalScene.lastEnemyTrainer, + ]; const lastEncounterVisuals = globalScene.lastMysteryEncounter?.introVisuals; if (lastEncounterVisuals) { moveTargets.push(lastEncounterVisuals); @@ -36,7 +42,7 @@ export class NextEncounterPhase extends EncounterPhase { globalScene.tweens.add({ targets: nextEncounterVisuals, x: "-=200", - duration: 2000 + duration: 2000, }); } else { moveTargets.push(nextEncounterVisuals); @@ -64,13 +70,12 @@ export class NextEncounterPhase extends EncounterPhase { if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); } /** * Do nothing (since this is simply the next wave in the same biome). */ - trySetWeatherIfNewBiome(): void { - } + trySetWeatherIfNewBiome(): void {} } diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts index b01a90bd235..a0c0c14e93f 100644 --- a/src/phases/obtain-status-effect-phase.ts +++ b/src/phases/obtain-status-effect-phase.ts @@ -13,7 +13,13 @@ export class ObtainStatusEffectPhase extends PokemonPhase { private sourceText?: string | null; private sourcePokemon?: Pokemon | null; - constructor(battlerIndex: BattlerIndex, statusEffect?: StatusEffect, turnsRemaining?: number, sourceText?: string | null, sourcePokemon?: Pokemon | null) { + constructor( + battlerIndex: BattlerIndex, + statusEffect?: StatusEffect, + turnsRemaining?: number, + sourceText?: string | null, + sourcePokemon?: Pokemon | null, + ) { super(battlerIndex); this.statusEffect = statusEffect; @@ -31,13 +37,21 @@ export class ObtainStatusEffectPhase extends PokemonPhase { } pokemon.updateInfo(true); new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect! - 1), pokemon).play(false, () => { - globalScene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText ?? undefined)); + globalScene.queueMessage( + getStatusEffectObtainText( + this.statusEffect, + getPokemonNameWithAffix(pokemon), + this.sourceText ?? undefined, + ), + ); this.end(); }); return; } } else if (pokemon.status?.effect === this.statusEffect) { - globalScene.queueMessage(getStatusEffectOverlapText(this.statusEffect ?? StatusEffect.NONE, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage( + getStatusEffectOverlapText(this.statusEffect ?? StatusEffect.NONE, getPokemonNameWithAffix(pokemon)), + ); } this.end(); } diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index c87c5d00be5..d95400a3f48 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -23,7 +23,7 @@ export class PartyHealPhase extends BattlePhase { pokemon.hp = pokemon.getMaxHp(); pokemon.resetStatus(); for (const move of pokemon.moveset) { - move!.ppUsed = 0; // TODO: is this bang correct? + move!.ppUsed = 0; // TODO: is this bang correct? } pokemon.updateInfo(true); } diff --git a/src/phases/party-member-pokemon-phase.ts b/src/phases/party-member-pokemon-phase.ts index 592f35834aa..a782eabda38 100644 --- a/src/phases/party-member-pokemon-phase.ts +++ b/src/phases/party-member-pokemon-phase.ts @@ -11,9 +11,7 @@ export abstract class PartyMemberPokemonPhase extends FieldPhase { super(); this.partyMemberIndex = partyMemberIndex; - this.fieldIndex = partyMemberIndex < globalScene.currentBattle.getBattlerCount() - ? partyMemberIndex - : -1; + this.fieldIndex = partyMemberIndex < globalScene.currentBattle.getBattlerCount() ? partyMemberIndex : -1; this.player = player; } diff --git a/src/phases/pokemon-anim-phase.ts b/src/phases/pokemon-anim-phase.ts index 54140ec96b5..b9c91508b5a 100644 --- a/src/phases/pokemon-anim-phase.ts +++ b/src/phases/pokemon-anim-phase.ts @@ -6,7 +6,6 @@ import { isNullOrUndefined } from "#app/utils"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { Species } from "#enums/species"; - export class PokemonAnimPhase extends BattlePhase { /** The type of animation to play in this phase */ private key: PokemonAnimType; @@ -60,19 +59,19 @@ export class PokemonAnimPhase extends BattlePhase { const sprite = globalScene.addFieldSprite( this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, - `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub` + `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub`, ); sprite.setOrigin(0.5, 1); globalScene.field.add(sprite); return sprite; }; - const [ subSprite, subTintSprite ] = [ getSprite(), getSprite() ]; + const [subSprite, subTintSprite] = [getSprite(), getSprite()]; const subScale = this.pokemon.getSpriteScale() * (this.pokemon.isPlayer() ? 0.5 : 1); subSprite.setVisible(false); subSprite.setScale(subScale); - subTintSprite.setTintFill(0xFFFFFF); + subTintSprite.setTintFill(0xffffff); subTintSprite.setScale(0.01); if (this.pokemon.isPlayer()) { @@ -87,7 +86,7 @@ export class PokemonAnimPhase extends BattlePhase { x: this.pokemon.x + this.pokemon.getSubstituteOffset()[0], y: this.pokemon.y + this.pokemon.getSubstituteOffset()[1], alpha: 0.5, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); globalScene.tweens.add({ @@ -108,9 +107,9 @@ export class PokemonAnimPhase extends BattlePhase { subTintSprite.destroy(); substitute.sprite = subSprite; this.end(); - } + }, }); - } + }, }); } @@ -128,7 +127,7 @@ export class PokemonAnimPhase extends BattlePhase { targets: subSprite, alpha: 0, ease: "Sine.easeInOut", - duration: 500 + duration: 500, }); globalScene.tweens.add({ @@ -139,7 +138,7 @@ export class PokemonAnimPhase extends BattlePhase { ease: "Sine.easeInOut", delay: 250, duration: 500, - onComplete: () => this.end() + onComplete: () => this.end(), }); } @@ -159,7 +158,7 @@ export class PokemonAnimPhase extends BattlePhase { y: subSprite.y + this.pokemon.getSubstituteOffset()[1], alpha: 0.5, ease: "Sine.easeInOut", - duration: 500 + duration: 500, }); globalScene.tweens.add({ @@ -168,7 +167,7 @@ export class PokemonAnimPhase extends BattlePhase { ease: "Sine.easeInOut", delay: 250, duration: 500, - onComplete: () => this.end() + onComplete: () => this.end(), }); } @@ -186,7 +185,7 @@ export class PokemonAnimPhase extends BattlePhase { const sprite = globalScene.addFieldSprite( subSprite.x, subSprite.y, - `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub` + `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub`, ); sprite.setOrigin(0.5, 1); globalScene.field.add(sprite); @@ -196,7 +195,7 @@ export class PokemonAnimPhase extends BattlePhase { const subTintSprite = getSprite(); const subScale = this.pokemon.getSpriteScale() * (this.pokemon.isPlayer() ? 0.5 : 1); subTintSprite.setAlpha(0); - subTintSprite.setTintFill(0xFFFFFF); + subTintSprite.setTintFill(0xffffff); subTintSprite.setScale(subScale); globalScene.tweens.add({ @@ -219,7 +218,7 @@ export class PokemonAnimPhase extends BattlePhase { targets: subTintSprite, scale: 0.01, ease: "Sine.cubicEaseIn", - duration: 500 + duration: 500, }); globalScene.tweens.add({ @@ -233,12 +232,12 @@ export class PokemonAnimPhase extends BattlePhase { onComplete: () => { subTintSprite.destroy(); this.end(); - } + }, }); } - } + }, }); - } + }, }); } @@ -256,8 +255,17 @@ export class PokemonAnimPhase extends BattlePhase { const tatsugiriY = this.pokemon.y + this.pokemon.getSprite().y; const getSourceSprite = () => { - const sprite = globalScene.addPokemonSprite(this.pokemon, tatsugiriX, tatsugiriY, this.pokemon.getSprite().texture, this.pokemon.getSprite()!.frame.name, true); - [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]); + const sprite = globalScene.addPokemonSprite( + this.pokemon, + tatsugiriX, + tatsugiriY, + this.pokemon.getSprite().texture, + this.pokemon.getSprite()!.frame.name, + true, + ); + ["spriteColors", "fusionSpriteColors"].map( + k => (sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]), + ); sprite.setPipelineData("spriteKey", this.pokemon.getBattleSpriteKey()); sprite.setPipelineData("shiny", this.pokemon.shiny); sprite.setPipelineData("variant", this.pokemon.variant); @@ -281,8 +289,14 @@ export class PokemonAnimPhase extends BattlePhase { targets: sourceSprite, duration: 375, scale: 0.5, - x: { value: tatsugiriX + (dondozoFpOffset[0] - sourceFpOffset[0]) / 2, ease: "Linear" }, - y: { value: (this.pokemon.isPlayer() ? 100 : 65) + sourceFpOffset[1], ease: "Sine.easeOut" }, + x: { + value: tatsugiriX + (dondozoFpOffset[0] - sourceFpOffset[0]) / 2, + ease: "Linear", + }, + y: { + value: (this.pokemon.isPlayer() ? 100 : 65) + sourceFpOffset[1], + ease: "Sine.easeOut", + }, onComplete: () => { globalScene.field.bringToTop(dondozo); globalScene.tweens.add({ @@ -300,11 +314,11 @@ export class PokemonAnimPhase extends BattlePhase { ease: "Sine.easeInOut", scale: 0.85, yoyo: true, - onComplete: () => this.end() + onComplete: () => this.end(), }); - } + }, }); - } + }, }); } @@ -323,9 +337,11 @@ export class PokemonAnimPhase extends BattlePhase { this.pokemon.y + this.pokemon.getSprite().y + this.pokemon.height / 2, tatsugiri.getSprite().texture, tatsugiri.getSprite()!.frame.name, - true + true, + ); + ["spriteColors", "fusionSpriteColors"].map( + k => (tatsuSprite.pipelineData[k] = tatsugiri.getSprite().pipelineData[k]), ); - [ "spriteColors", "fusionSpriteColors" ].map(k => tatsuSprite.pipelineData[k] = tatsugiri.getSprite().pipelineData[k]); tatsuSprite.setPipelineData("spriteKey", tatsugiri.getBattleSpriteKey()); tatsuSprite.setPipelineData("shiny", tatsugiri.shiny); tatsuSprite.setPipelineData("variant", tatsugiri.variant); @@ -352,14 +368,17 @@ export class PokemonAnimPhase extends BattlePhase { duration: 500, scale: 1, x: { value: tatsugiri.x + tatsugiri.getSprite().x, ease: "Linear" }, - y: { value: tatsugiri.y + tatsugiri.getSprite().y, ease: "Sine.easeIn" }, + y: { + value: tatsugiri.y + tatsugiri.getSprite().y, + ease: "Sine.easeIn", + }, onComplete: () => { tatsugiri.setVisible(true); tatsuSprite.destroy(); this.end(); - } + }, }); - } + }, }); } } diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index 6d0621b8f48..ab49def5a3d 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -24,7 +24,17 @@ export class PokemonHealPhase extends CommonAnimPhase { private preventFullHeal: boolean; private fullRestorePP: boolean; - constructor(battlerIndex: BattlerIndex, hpHealed: number, message: string | null, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false, fullRestorePP: boolean = false) { + constructor( + battlerIndex: BattlerIndex, + hpHealed: number, + message: string | null, + showFullHpMessage: boolean, + skipAnim = false, + revive = false, + healStatus = false, + preventFullHeal = false, + fullRestorePP = false, + ) { super(battlerIndex, undefined, CommonAnim.HEALTH_UP); this.hpHealed = hpHealed; @@ -53,7 +63,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } const hasMessage = !!this.message; - const healOrDamage = (!pokemon.isFullHp() || this.hpHealed < 0); + const healOrDamage = !pokemon.isFullHp() || this.hpHealed < 0; const healBlock = pokemon.getTag(BattlerTagType.HEAL_BLOCK) as HealBlockTag; let lastStatusEffect = StatusEffect.NONE; @@ -61,7 +71,8 @@ export class PokemonHealPhase extends CommonAnimPhase { globalScene.queueMessage(healBlock.onActivation(pokemon)); this.message = null; return super.end(); - } else if (healOrDamage) { + } + if (healOrDamage) { const hpRestoreMultiplier = new Utils.NumberHolder(1); if (!this.revive) { globalScene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); @@ -73,7 +84,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) { - healAmount.value = (pokemon.getMaxHp() - pokemon.hp) - 1; + healAmount.value = pokemon.getMaxHp() - pokemon.hp - 1; } healAmount.value = pokemon.heal(healAmount.value); if (healAmount.value) { @@ -102,7 +113,9 @@ export class PokemonHealPhase extends CommonAnimPhase { pokemon.resetStatus(); pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) { - this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); + this.message = i18next.t("battle:hpIsFull", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } if (this.message) { diff --git a/src/phases/pokemon-phase.ts b/src/phases/pokemon-phase.ts index bf4193adb6d..3ca5f09f953 100644 --- a/src/phases/pokemon-phase.ts +++ b/src/phases/pokemon-phase.ts @@ -12,7 +12,10 @@ export abstract class PokemonPhase extends FieldPhase { super(); if (battlerIndex === undefined) { - battlerIndex = globalScene.getField().find(p => p?.isActive())!.getBattlerIndex(); // TODO: is the bang correct here? + battlerIndex = globalScene + .getField() + .find(p => p?.isActive())! + .getBattlerIndex(); // TODO: is the bang correct here? } this.battlerIndex = battlerIndex; diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts index d67f758b1fd..70b390dc6de 100644 --- a/src/phases/pokemon-transform-phase.ts +++ b/src/phases/pokemon-transform-phase.ts @@ -14,7 +14,7 @@ export class PokemonTransformPhase extends PokemonPhase { protected targetIndex: BattlerIndex; private playSound: boolean; - constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound: boolean = false) { + constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound = false) { super(userIndex); this.targetIndex = targetIndex; @@ -23,7 +23,7 @@ export class PokemonTransformPhase extends PokemonPhase { public override start(): void { const user = this.getPokemon(); - const target = globalScene.getField(true).find((p) => p.getBattlerIndex() === this.targetIndex); + const target = globalScene.getField(true).find(p => p.getBattlerIndex() === this.targetIndex); if (!target) { return this.end(); @@ -46,18 +46,17 @@ export class PokemonTransformPhase extends PokemonPhase { user.setStatStage(s, target.getStatStage(s)); } - user.summonData.moveset = target.getMoveset().map((m) => { + user.summonData.moveset = target.getMoveset().map(m => { if (m) { // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); - } else { - console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); - return new PokemonMove(Moves.NONE); } + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); }); user.summonData.types = target.getTypes(); - const promises = [ user.updateInfo() ]; + const promises = [user.updateInfo()]; if (this.playSound) { globalScene.playSound("battle_anims/PRSFX- Transform"); diff --git a/src/phases/post-game-over-phase.ts b/src/phases/post-game-over-phase.ts index 4643d4d1bef..f86ec8496e0 100644 --- a/src/phases/post-game-over-phase.ts +++ b/src/phases/post-game-over-phase.ts @@ -20,14 +20,16 @@ export class PostGameOverPhase extends Phase { if (!success) { return globalScene.reset(true); } - globalScene.gameData.tryClearSession(globalScene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) { - return globalScene.reset(true); - } - globalScene.reset(); - globalScene.unshiftPhase(new TitlePhase()); - this.end(); - }); + globalScene.gameData + .tryClearSession(globalScene.sessionSlotId) + .then((success: boolean | [boolean, boolean]) => { + if (!success[0]) { + return globalScene.reset(true); + } + globalScene.reset(); + globalScene.unshiftPhase(new TitlePhase()); + this.end(); + }); }); }; diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index b92d79501d4..a7aa9389505 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -8,10 +8,6 @@ import { MysteryEncounterPostSummonTag } from "#app/data/battler-tags"; import { BattlerTagType } from "#enums/battler-tag-type"; export class PostSummonPhase extends PokemonPhase { - constructor(battlerIndex: BattlerIndex) { - super(battlerIndex); - } - start() { super.start(); @@ -23,13 +19,18 @@ export class PostSummonPhase extends PokemonPhase { globalScene.arena.applyTags(ArenaTrapTag, false, pokemon); // If this is mystery encounter and has post summon phase tag, apply post summon effects - if (globalScene.currentBattle.isBattleMysteryEncounter() && pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag).length > 0) { + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag).length > 0 + ) { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } applyPostSummonAbAttrs(PostSummonAbAttr, pokemon); const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + for (const p of field) { + applyAbAttrs(CommanderAbAttr, p, null, false); + } this.end(); } diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts index 13cac6eed7c..f6341666e7e 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -1,6 +1,13 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPostDamageAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, PostDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; +import { + applyAbAttrs, + applyPostDamageAbAttrs, + BlockNonDirectDamageAbAttr, + BlockStatusDamageAbAttr, + PostDamageAbAttr, + ReduceBurnDamageAbAttr, +} from "#app/data/ability"; import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectActivationText } from "#app/data/status-effect"; import { BattleSpec } from "#app/enums/battle-spec"; @@ -10,6 +17,7 @@ import * as Utils from "#app/utils"; import { PokemonPhase } from "./pokemon-phase"; export class PostTurnStatusEffectPhase extends PokemonPhase { + // biome-ignore lint/complexity/noUselessConstructor: Not unnecessary as it makes battlerIndex required constructor(battlerIndex: BattlerIndex) { super(battlerIndex); } @@ -23,7 +31,9 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - globalScene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage( + getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon)), + ); const damage = new Utils.NumberHolder(0); switch (pokemon.status.effect) { case StatusEffect.POISON: diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 81a39f53a76..1512609abf9 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -11,7 +11,12 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; -import { applyAbAttrs, ClearTerrainAbAttr, ClearWeatherAbAttr, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; +import { + applyAbAttrs, + ClearTerrainAbAttr, + ClearWeatherAbAttr, + PostTeraFormChangeStatChangeAbAttr, +} from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; @@ -35,7 +40,12 @@ export class QuietFormChangePhase extends BattlePhase { if (!this.pokemon.isOnField() || this.pokemon.getTag(SemiInvulnerableTag) || this.pokemon.isFainted()) { if (this.pokemon.isPlayer() || this.pokemon.isActive()) { this.pokemon.changeForm(this.formChange).then(() => { - globalScene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + 1500, + ); }); } else { this.end(); @@ -44,7 +54,12 @@ export class QuietFormChangePhase extends BattlePhase { } const getPokemonSprite = () => { - const sprite = globalScene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, "pkmn__sub"); + const sprite = globalScene.addPokemonSprite( + this.pokemon, + this.pokemon.x + this.pokemon.getSprite().x, + this.pokemon.y + this.pokemon.getSprite().y, + "pkmn__sub", + ); sprite.setOrigin(0.5, 1); const spriteKey = this.pokemon.getBattleSpriteKey(); try { @@ -52,8 +67,13 @@ export class QuietFormChangePhase extends BattlePhase { } catch (err: unknown) { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(this.pokemon.getTeraType()), + isTerastallized: this.pokemon.isTerastallized, + }); + ["spriteColors", "fusionSpriteColors"].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; } @@ -63,7 +83,7 @@ export class QuietFormChangePhase extends BattlePhase { return sprite; }; - const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ]; + const [pokemonTintSprite, pokemonFormTintSprite] = [getPokemonSprite(), getPokemonSprite()]; this.pokemon.getSprite().on("animationupdate", (_anim, frame) => { if (frame.textureKey === pokemonTintSprite.texture.key) { @@ -74,9 +94,9 @@ export class QuietFormChangePhase extends BattlePhase { }); pokemonTintSprite.setAlpha(0); - pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonTintSprite.setTintFill(0xffffff); pokemonFormTintSprite.setVisible(false); - pokemonFormTintSprite.setTintFill(0xFFFFFF); + pokemonFormTintSprite.setTintFill(0xffffff); globalScene.playSound("battle_anims/PRSFX- Transform"); @@ -102,7 +122,7 @@ export class QuietFormChangePhase extends BattlePhase { scale: 0.01, ease: "Cubic.easeInOut", duration: 500, - onComplete: () => pokemonTintSprite.destroy() + onComplete: () => pokemonTintSprite.destroy(), }); globalScene.tweens.add({ targets: pokemonFormTintSprite, @@ -120,13 +140,18 @@ export class QuietFormChangePhase extends BattlePhase { duration: 1000, onComplete: () => { pokemonTintSprite.setVisible(false); - globalScene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); - } + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + 1500, + ); + }, }); - } + }, }); }); - } + }, }); } @@ -134,7 +159,9 @@ export class QuietFormChangePhase extends BattlePhase { this.pokemon.findAndRemoveTags(t => t.tagType === BattlerTagType.AUTOTOMIZED); if (globalScene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { globalScene.playBgm(); - globalScene.unshiftPhase(new PokemonHealPhase(this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase(this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true), + ); this.pokemon.findAndRemoveTags(() => true); this.pokemon.bossSegments = 5; this.pokemon.bossSegmentIndex = 4; diff --git a/src/phases/reload-session-phase.ts b/src/phases/reload-session-phase.ts index a88cb1b1de3..3a4a4e0e3a5 100644 --- a/src/phases/reload-session-phase.ts +++ b/src/phases/reload-session-phase.ts @@ -28,12 +28,14 @@ export class ReloadSessionPhase extends Phase { globalScene.gameData.clearLocalData(); - (this.systemDataStr ? globalScene.gameData.initSystem(this.systemDataStr) : globalScene.gameData.loadSystem()).then(() => { - if (delayElapsed) { - this.end(); - } else { - loaded = true; - } - }); + (this.systemDataStr ? globalScene.gameData.initSystem(this.systemDataStr) : globalScene.gameData.loadSystem()).then( + () => { + if (delayElapsed) { + this.end(); + } else { + loaded = true; + } + }, + ); } } diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts index 8a876268c8e..6dee982a4f0 100644 --- a/src/phases/return-phase.ts +++ b/src/phases/return-phase.ts @@ -12,7 +12,7 @@ export class ReturnPhase extends SwitchSummonPhase { this.end(); } - summon(): void { } + summon(): void {} onEnd(): void { const pokemon = this.getPokemon(); diff --git a/src/phases/revival-blessing-phase.ts b/src/phases/revival-blessing-phase.ts index a063e325a31..1ed63f76b64 100644 --- a/src/phases/revival-blessing-phase.ts +++ b/src/phases/revival-blessing-phase.ts @@ -24,7 +24,7 @@ export class RevivalBlessingPhase extends BattlePhase { Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.user.getFieldIndex(), - (slotIndex: integer, option: PartyOption) => { + (slotIndex: integer, _option: PartyOption) => { if (slotIndex >= 0 && slotIndex < 6) { const pokemon = globalScene.getPlayerParty()[slotIndex]; if (!pokemon || !pokemon.isFainted()) { @@ -34,7 +34,13 @@ export class RevivalBlessingPhase extends BattlePhase { pokemon.resetTurnData(); pokemon.resetStatus(); pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); + globalScene.queueMessage( + i18next.t("moveTriggers:revivalBlessing", { + pokemonName: pokemon.name, + }), + 0, + true, + ); if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { const allyPokemon = this.user.getAlly(); diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index 72a8f4bf37c..0ee38250ce1 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -20,13 +20,20 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { globalScene.addModifier(newModifier); globalScene.playSound("level_up_fanfare"); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { - speciesName: this.species.name, - gameMode: globalScene.gameMode.getName(), - newModifier: newModifier?.type.name, - }), null, () => { - resolve(); - }, null, true, 1500); + globalScene.ui.showText( + i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: globalScene.gameMode.getName(), + newModifier: newModifier?.type.name, + }), + null, + () => { + resolve(); + }, + null, + true, + 1500, + ); }); } } diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index 9230844ff9b..2a2d68591ca 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -8,7 +8,6 @@ import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; export class ScanIvsPhase extends PokemonPhase { - constructor(battlerIndex: BattlerIndex) { super(battlerIndex); } @@ -25,13 +24,16 @@ export class ScanIvsPhase extends PokemonPhase { const uiTheme = globalScene.uiTheme; // Assuming uiTheme is accessible for (let e = 0; e < enemyField.length; e++) { enemyIvs = enemyField[e].ivs; - const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists + const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[]; statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0); for (let s = 0; s < statsContainerLabels.length; s++) { const ivStat = Stat[statsContainerLabels[s].frame.name]; if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) { - const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); + const hexColour = + enemyIvs[ivStat] === 31 + ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) + : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; statsContainerLabels[s].setTint(hexTextColour); } @@ -40,17 +42,30 @@ export class ScanIvsPhase extends PokemonPhase { } if (!globalScene.hideIvs) { - globalScene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - globalScene.ui.setMode(Mode.CONFIRM, () => { - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.clearText(); - globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs).then(() => this.end()); - }, () => { - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.clearText(); - this.end(); - }); - }); + globalScene.ui.showText( + i18next.t("battle:ivScannerUseQuestion", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + globalScene.ui + .getMessageHandler() + .promptIvs(pokemon.id, pokemon.ivs) + .then(() => this.end()); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + this.end(); + }, + ); + }, + ); } else { this.end(); } diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index ea4dcc4274b..6a11967832a 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -28,9 +28,11 @@ export class SelectBiomePhase extends BattlePhase { this.end(); }; - if ((globalScene.gameMode.isClassic && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex + 9)) - || (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) - || (globalScene.gameMode.hasShortBiomes && !(globalScene.currentBattle.waveIndex % 50))) { + if ( + (globalScene.gameMode.isClassic && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex + 9)) || + (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) || + (globalScene.gameMode.hasShortBiomes && !(globalScene.currentBattle.waveIndex % 50)) + ) { setNextBiome(Biome.END); } else if (globalScene.gameMode.hasRandomBiomes) { setNextBiome(this.generateNextBiome()); @@ -39,16 +41,18 @@ export class SelectBiomePhase extends BattlePhase { globalScene.executeWithSeedOffset(() => { biomes = (biomeLinks[currentBiome] as (Biome | [Biome, number])[]) .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => !Array.isArray(b) ? b : b[0]); + .map(b => (!Array.isArray(b) ? b : b[0])); }, globalScene.currentBattle.waveIndex); if (biomes.length > 1 && globalScene.findModifier(m => m instanceof MapModifier)) { let biomeChoices: Biome[] = []; globalScene.executeWithSeedOffset(() => { - biomeChoices = (!Array.isArray(biomeLinks[currentBiome]) - ? [ biomeLinks[currentBiome] as Biome ] - : biomeLinks[currentBiome] as (Biome | [Biome, number])[]) - .filter((b, i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => Array.isArray(b) ? b[0] : b); + biomeChoices = ( + !Array.isArray(biomeLinks[currentBiome]) + ? [biomeLinks[currentBiome] as Biome] + : (biomeLinks[currentBiome] as (Biome | [Biome, number])[]) + ) + .filter((b, _i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .map(b => (Array.isArray(b) ? b[0] : b)); }, globalScene.currentBattle.waveIndex); const biomeSelectItems = biomeChoices.map(b => { const ret: OptionSelectItem = { @@ -57,13 +61,13 @@ export class SelectBiomePhase extends BattlePhase { globalScene.ui.setMode(Mode.MESSAGE); setNextBiome(b); return true; - } + }, }; return ret; }); globalScene.ui.setMode(Mode.OPTION_SELECT, { options: biomeSelectItems, - delay: 1000 + delay: 1000, }); } else { setNextBiome(biomes[Utils.randSeedInt(biomes.length)]); diff --git a/src/phases/select-gender-phase.ts b/src/phases/select-gender-phase.ts index 45cbb70dcac..1c86536de53 100644 --- a/src/phases/select-gender-phase.ts +++ b/src/phases/select-gender-phase.ts @@ -23,7 +23,7 @@ export class SelectGenderPhase extends Phase { globalScene.gameData.saveSetting(SettingKeys.Player_Gender, 0); globalScene.gameData.saveSystem().then(() => this.end()); return true; - } + }, }, { label: i18next.t("settings:girl"), @@ -32,9 +32,9 @@ export class SelectGenderPhase extends Phase { globalScene.gameData.saveSetting(SettingKeys.Player_Gender, 1); globalScene.gameData.saveSystem().then(() => this.end()); return true; - } - } - ] + }, + }, + ], }); }); } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 36f18a8d64d..11d448876d3 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -1,9 +1,26 @@ import { globalScene } from "#app/global-scene"; import type { ModifierTier } from "#app/modifier/modifier-tier"; import type { ModifierTypeOption, ModifierType } from "#app/modifier/modifier-type"; -import { regenerateModifierPoolThresholds, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type"; +import { + regenerateModifierPoolThresholds, + getPlayerShopModifierTypeOptionsForWave, + PokemonModifierType, + FusePokemonModifierType, + PokemonMoveModifierType, + TmModifierType, + RememberMoveModifierType, + PokemonPpRestoreModifierType, + PokemonPpUpModifierType, + ModifierPoolType, + getPlayerModifierTypeOptions, +} from "#app/modifier/modifier-type"; import type { Modifier } from "#app/modifier/modifier"; -import { ExtraModifierModifier, HealShopCostModifier, PokemonHeldItemModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; +import { + ExtraModifierModifier, + HealShopCostModifier, + PokemonHeldItemModifier, + TempExtraModifierModifier, +} from "#app/modifier/modifier"; import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; @@ -23,7 +40,12 @@ export class SelectModifierPhase extends BattlePhase { private typeOptions: ModifierTypeOption[]; - constructor(rerollCount: number = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings, isCopy: boolean = false) { + constructor( + rerollCount = 0, + modifierTiers?: ModifierTier[], + customModifierSettings?: CustomModifierSettings, + isCopy = false, + ) { super(); this.rerollCount = rerollCount; @@ -52,8 +74,9 @@ export class SelectModifierPhase extends BattlePhase { } // If custom modifiers are specified, overrides default item count - if (!!this.customModifierSettings) { - const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + + if (this.customModifierSettings) { + const newItemCount = + (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + (this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) + (this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0); if (this.customModifierSettings.fillRemaining) { @@ -69,11 +92,22 @@ export class SelectModifierPhase extends BattlePhase { const modifierSelectCallback = (rowCursor: number, cursor: number) => { if (rowCursor < 0 || cursor < 0) { globalScene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { - globalScene.ui.setOverlayMode(Mode.CONFIRM, () => { - globalScene.ui.revertMode(); - globalScene.ui.setMode(Mode.MESSAGE); - super.end(); - }, () => globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers))); + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.ui.revertMode(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); + }, + () => + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ), + ); }); return false; } @@ -87,34 +121,74 @@ export class SelectModifierPhase extends BattlePhase { if (rerollCost < 0 || globalScene.money < rerollCost) { globalScene.ui.playError(); return false; - } else { - globalScene.reroll = true; - globalScene.unshiftPhase(new SelectModifierPhase(this.rerollCount + 1, this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[])); - globalScene.ui.clearText(); - globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - globalScene.money -= rerollCost; - globalScene.updateMoneyText(); - globalScene.animateMoneyChanged(false); - } - globalScene.playSound("se/buy"); } + globalScene.reroll = true; + globalScene.unshiftPhase( + new SelectModifierPhase( + this.rerollCount + 1, + this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[], + ), + ); + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= rerollCost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); + } + globalScene.playSound("se/buy"); break; case 1: - globalScene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: number, itemIndex: number, itemQuantity: number, toSlotIndex: number) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - const itemModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - globalScene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity, undefined, undefined, false); - } else { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + PartyUiMode.MODIFIER_TRANSFER, + -1, + (fromSlotIndex: number, itemIndex: number, itemQuantity: number, toSlotIndex: number) => { + if ( + toSlotIndex !== undefined && + fromSlotIndex < 6 && + toSlotIndex < 6 && + fromSlotIndex !== toSlotIndex && + itemIndex > -1 + ) { + const itemModifiers = globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + m.isTransferable && + m.pokemonId === party[fromSlotIndex].id, + ) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + globalScene.tryTransferHeldItemModifier( + itemModifier, + party[toSlotIndex], + true, + itemQuantity, + undefined, + undefined, + false, + ); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + PartyUiHandler.FilterItemMaxStacks, + ); break; case 2: globalScene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers)); + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); }); break; case 3: @@ -143,8 +217,14 @@ export class SelectModifierPhase extends BattlePhase { } break; default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, globalScene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + const shopOptions = getPlayerShopModifierTypeOptionsForWave( + globalScene.currentBattle.waveIndex, + globalScene.getWaveMoneyAmount(1), + ); + const shopOption = + shopOptions[ + rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT + ]; if (shopOption.type) { modifierType = shopOption.type; } @@ -155,18 +235,18 @@ export class SelectModifierPhase extends BattlePhase { break; } - if (cost! && (globalScene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { // TODO: is the bang on cost correct? + if (cost! && globalScene.money < cost && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + // TODO: is the bang on cost correct? globalScene.ui.playError(); return false; } - const applyModifier = (modifier: Modifier, playSound: boolean = false) => { + const applyModifier = (modifier: Modifier, playSound = false) => { const result = globalScene.addModifier(modifier, false, playSound, undefined, undefined, cost); // Queue a copy of this phase when applying a TM or Memory Mushroom. // If the player selects either of these, then escapes out of consuming them, // they are returned to a shop in the same state. - if (modifier.type instanceof RememberMoveModifierType || - modifier.type instanceof TmModifierType) { + if (modifier.type instanceof RememberMoveModifierType || modifier.type instanceof TmModifierType) { globalScene.unshiftPhase(this.copy()); } @@ -189,53 +269,96 @@ export class SelectModifierPhase extends BattlePhase { } }; - if (modifierType! instanceof PokemonModifierType) { //TODO: is the bang correct? + if (modifierType! instanceof PokemonModifierType) { + //TODO: is the bang correct? if (modifierType instanceof FusePokemonModifierType) { - globalScene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: number, spliceSlotIndex: number) => { - if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex])!; //TODO: is the bang correct? - applyModifier(modifier, true); - }); - } else { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers)); - } - }, modifierType.selectFilter); + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + PartyUiMode.SPLICE, + -1, + (fromSlotIndex: number, spliceSlotIndex: number) => { + if ( + spliceSlotIndex !== undefined && + fromSlotIndex < 6 && + spliceSlotIndex < 6 && + fromSlotIndex !== spliceSlotIndex + ) { + globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex])!; //TODO: is the bang correct? + applyModifier(modifier, true); + }); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + modifierType.selectFilter, + ); } else { const pokemonModifierType = modifierType as PokemonModifierType; const isMoveModifier = modifierType instanceof PokemonMoveModifierType; const isTmModifier = modifierType instanceof TmModifierType; const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; - const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); - const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER - : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + const isPpRestoreModifier = + modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType; + const partyUiMode = isMoveModifier + ? PartyUiMode.MOVE_MODIFIER + : isTmModifier + ? PartyUiMode.TM_MODIFIER + : isRememberMoveModifier + ? PartyUiMode.REMEMBER_MOVE_MODIFIER : PartyUiMode.MODIFIER; - const tmMoveId = isTmModifier - ? (modifierType as TmModifierType).moveId - : undefined; - globalScene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: number, option: PartyOption) => { - if (slotIndex < 6) { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = !isMoveModifier - ? !isRememberMoveModifier - ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as number) - : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); - applyModifier(modifier!, true); // TODO: is the bang correct? - }); - } else { - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers)); - } - }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); + const tmMoveId = isTmModifier ? (modifierType as TmModifierType).moveId : undefined; + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + partyUiMode, + -1, + (slotIndex: number, option: PartyOption) => { + if (slotIndex < 6) { + globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = !isMoveModifier + ? !isRememberMoveModifier + ? modifierType.newModifier(party[slotIndex]) + : modifierType.newModifier(party[slotIndex], option as number) + : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); + applyModifier(modifier!, true); // TODO: is the bang correct? + }); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + pokemonModifierType.selectFilter, + modifierType instanceof PokemonMoveModifierType + ? (modifierType as PokemonMoveModifierType).moveSelectFilter + : undefined, + tmMoveId, + isPpRestoreModifier, + ); } } else { applyModifier(modifierType!.newModifier()!); // TODO: is the bang correct? } - return !cost!;// TODO: is the bang correct? + return !cost!; // TODO: is the bang correct? }; - globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(globalScene.lockModifierTiers)); + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); } updateSeed(): void { @@ -250,8 +373,9 @@ export class SelectModifierPhase extends BattlePhase { let baseValue = 0; if (Overrides.WAIVE_ROLL_FEE_OVERRIDE) { return baseValue; - } else if (lockRarities) { - const tierValues = [ 50, 125, 300, 750, 2000 ]; + } + if (lockRarities) { + const tierValues = [50, 125, 300, 750, 2000]; for (const opt of this.typeOptions) { baseValue += tierValues[opt.type.tier ?? 0]; } @@ -270,7 +394,10 @@ export class SelectModifierPhase extends BattlePhase { multiplier = this.customModifierSettings.rerollMultiplier; } - const baseMultiplier = Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 10) * baseValue * (2 ** this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + const baseMultiplier = Math.min( + Math.ceil(globalScene.currentBattle.waveIndex / 10) * baseValue * 2 ** this.rerollCount * multiplier, + Number.MAX_SAFE_INTEGER, + ); // Apply Black Sludge to reroll cost const modifiedRerollCost = new NumberHolder(baseMultiplier); @@ -283,15 +410,24 @@ export class SelectModifierPhase extends BattlePhase { } getModifierTypeOptions(modifierCount: number): ModifierTypeOption[] { - return getPlayerModifierTypeOptions(modifierCount, globalScene.getPlayerParty(), globalScene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings); + return getPlayerModifierTypeOptions( + modifierCount, + globalScene.getPlayerParty(), + globalScene.lockModifierTiers ? this.modifierTiers : undefined, + this.customModifierSettings, + ); } copy(): SelectModifierPhase { return new SelectModifierPhase( this.rerollCount, this.modifierTiers, - { guaranteedModifierTypeOptions: this.typeOptions, rerollMultiplier: this.customModifierSettings?.rerollMultiplier, allowLuckUpgrades: false }, - true + { + guaranteedModifierTypeOptions: this.typeOptions, + rerollMultiplier: this.customModifierSettings?.rerollMultiplier, + allowLuckUpgrades: false, + }, + true, ); } diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index b7ad15533a6..103174a4c83 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -15,7 +15,6 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import * as Utils from "../utils"; export class SelectStarterPhase extends Phase { - constructor() { super(); } @@ -59,19 +58,30 @@ export class SelectStarterPhase extends Phase { starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!; } - let starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; + let starterGender = + starter.species.malePercent !== null ? (!starterProps.female ? Gender.MALE : Gender.FEMALE) : Gender.GENDERLESS; if (Overrides.GENDER_OVERRIDE !== null) { starterGender = Overrides.GENDER_OVERRIDE; } const starterIvs = globalScene.gameData.dexData[starter.species.speciesId].ivs.slice(0); - const starterPokemon = globalScene.addPlayerPokemon(starter.species, globalScene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + const starterPokemon = globalScene.addPlayerPokemon( + starter.species, + globalScene.gameMode.getStartingLevel(), + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + starterIvs, + starter.nature, + ); starter.moveset && starterPokemon.tryPopulateMoveset(starter.moveset); if (starter.passive) { starterPokemon.passive = true; } - starterPokemon.luck = globalScene.gameData.getDexAttrLuck(globalScene.gameData.dexData[starter.species.speciesId].caughtAttr); + starterPokemon.luck = globalScene.gameData.getDexAttrLuck( + globalScene.gameData.dexData[starter.species.speciesId].caughtAttr, + ); if (starter.pokerus) { starterPokemon.pokerus = true; } @@ -109,7 +119,7 @@ export class SelectStarterPhase extends Phase { globalScene.sessionPlayTime = 0; globalScene.lastSavePlayTime = 0; // Ensures Keldeo (or any future Pokemon that have this type of form change) starts in the correct form - globalScene.getPlayerParty().forEach((p) => { + globalScene.getPlayerParty().forEach(p => { globalScene.triggerPokemonFormChange(p, SpeciesFormChangeMoveLearnedTrigger); }); this.end(); diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts index a1e38e3f9d2..2042d0a3fcf 100644 --- a/src/phases/select-target-phase.ts +++ b/src/phases/select-target-phase.ts @@ -23,7 +23,9 @@ export class SelectTargetPhase extends PokemonPhase { const user = fieldSide[this.fieldIndex]; const moveObject = allMoves[move!]; if (moveObject && user.isMoveTargetRestricted(moveObject.id, user, fieldSide[targets[0]])) { - const errorMessage = user.getRestrictingTag(move!, user, fieldSide[targets[0]])!.selectionDeniedText(user, moveObject.id); + const errorMessage = user + .getRestrictingTag(move!, user, fieldSide[targets[0]])! + .selectionDeniedText(user, moveObject.id); globalScene.queueMessage(i18next.t(errorMessage, { moveName: moveObject.name }), 0, true); targets = []; } @@ -31,10 +33,10 @@ export class SelectTargetPhase extends PokemonPhase { globalScene.currentBattle.turnCommands[this.fieldIndex] = null; globalScene.unshiftPhase(new CommandPhase(this.fieldIndex)); } else { - turnCommand!.targets = targets; //TODO: is the bang correct here? + turnCommand!.targets = targets; //TODO: is the bang correct here? } if (turnCommand?.command === Command.BALL && this.fieldIndex) { - globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; //TODO: is the bang correct here? + globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; //TODO: is the bang correct here? } this.end(); }); diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts index d759ad833a1..326b3a55ce3 100644 --- a/src/phases/show-ability-phase.ts +++ b/src/phases/show-ability-phase.ts @@ -5,7 +5,7 @@ import { PokemonPhase } from "./pokemon-phase"; export class ShowAbilityPhase extends PokemonPhase { private passive: boolean; - constructor(battlerIndex: BattlerIndex, passive: boolean = false) { + constructor(battlerIndex: BattlerIndex, passive = false) { super(battlerIndex); this.passive = passive; @@ -17,7 +17,6 @@ export class ShowAbilityPhase extends PokemonPhase { const pokemon = this.getPokemon(); if (pokemon) { - if (!pokemon.isPlayer()) { /** If its an enemy pokemon, list it as last enemy to use ability or move */ globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2; diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts index 004592bc335..568b8b615c8 100644 --- a/src/phases/show-party-exp-bar-phase.ts +++ b/src/phases/show-party-exp-bar-phase.ts @@ -36,12 +36,15 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { if (globalScene.expParty === ExpNotification.SKIP) { this.end(); } else if (globalScene.expParty === ExpNotification.ONLY_LEVEL_UP) { - if (newLevel > lastLevel) { // this means if we level up + if (newLevel > lastLevel) { + // this means if we level up // instead of displaying the exp gain in the small frame, we display the new level // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level - globalScene.partyExpBar.showPokemonExp(pokemon, exp.value, globalScene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel).then(() => { - setTimeout(() => this.end(), 800 / Math.pow(2, globalScene.expGainsSpeed)); - }); + globalScene.partyExpBar + .showPokemonExp(pokemon, exp.value, globalScene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel) + .then(() => { + setTimeout(() => this.end(), 800 / Math.pow(2, globalScene.expGainsSpeed)); + }); } else { this.end(); } @@ -52,6 +55,5 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { } else { this.end(); } - } } diff --git a/src/phases/show-trainer-phase.ts b/src/phases/show-trainer-phase.ts index 17106b54048..740c11f5c5d 100644 --- a/src/phases/show-trainer-phase.ts +++ b/src/phases/show-trainer-phase.ts @@ -18,7 +18,7 @@ export class ShowTrainerPhase extends BattlePhase { targets: globalScene.trainer, x: 106, duration: 1000, - onComplete: () => this.end() + onComplete: () => this.end(), }); } } diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts index 753d1f7cede..71b50fa9dce 100644 --- a/src/phases/stat-stage-change-phase.ts +++ b/src/phases/stat-stage-change-phase.ts @@ -1,6 +1,15 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPostStatStageChangeAbAttrs, applyPreStatStageChangeAbAttrs, PostStatStageChangeAbAttr, ProtectStatAbAttr, ReflectStatStageChangeAbAttr, StatStageChangeCopyAbAttr, StatStageChangeMultiplierAbAttr } from "#app/data/ability"; +import { + applyAbAttrs, + applyPostStatStageChangeAbAttrs, + applyPreStatStageChangeAbAttrs, + PostStatStageChangeAbAttr, + ProtectStatAbAttr, + ReflectStatStageChangeAbAttr, + StatStageChangeCopyAbAttr, + StatStageChangeMultiplierAbAttr, +} from "#app/data/ability"; import { ArenaTagSide, MistTag } from "#app/data/arena-tag"; import type { ArenaTag } from "#app/data/arena-tag"; import type Pokemon from "#app/field/pokemon"; @@ -14,7 +23,11 @@ import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } f import { OctolockTag } from "#app/data/battler-tags"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -export type StatStageChangeCallback = (target: Pokemon | null, changed: BattleStat[], relativeChanges: number[]) => void; +export type StatStageChangeCallback = ( + target: Pokemon | null, + changed: BattleStat[], + relativeChanges: number[], +) => void; export class StatStageChangePhase extends PokemonPhase { private stats: BattleStat[]; @@ -27,8 +40,18 @@ export class StatStageChangePhase extends PokemonPhase { private comingFromMirrorArmorUser: boolean; private comingFromStickyWeb: boolean; - - constructor(battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], stages: number, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatStageChangeCallback | null = null, comingFromMirrorArmorUser: boolean = false, comingFromStickyWeb: boolean = false) { + constructor( + battlerIndex: BattlerIndex, + selfTarget: boolean, + stats: BattleStat[], + stages: number, + showMessage = true, + ignoreAbilities = false, + canBeCopied = true, + onChange: StatStageChangeCallback | null = null, + comingFromMirrorArmorUser = false, + comingFromStickyWeb = false, + ) { super(battlerIndex); this.selfTarget = selfTarget; @@ -43,12 +66,23 @@ export class StatStageChangePhase extends PokemonPhase { } start() { - // Check if multiple stats are being changed at the same time, then run SSCPhase for each of them if (this.stats.length > 1) { for (let i = 0; i < this.stats.length; i++) { - const stat = [ this.stats[i] ]; - globalScene.unshiftPhase(new StatStageChangePhase(this.battlerIndex, this.selfTarget, stat, this.stages, this.showMessage, this.ignoreAbilities, this.canBeCopied, this.onChange, this.comingFromMirrorArmorUser)); + const stat = [this.stats[i]]; + globalScene.unshiftPhase( + new StatStageChangePhase( + this.battlerIndex, + this.selfTarget, + stat, + this.stages, + this.showMessage, + this.ignoreAbilities, + this.canBeCopied, + this.onChange, + this.comingFromMirrorArmorUser, + ), + ); } return this.end(); } @@ -65,8 +99,9 @@ export class StatStageChangePhase extends PokemonPhase { /** If this SSCP is from sticky web, then check if pokemon that last sucessfully used sticky web is on field */ const stickyTagID = globalScene.arena.findTagsOnSide( (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, - ArenaTagSide.PLAYER)[0].sourceId; - globalScene.getEnemyField().forEach((e) => { + ArenaTagSide.PLAYER, + )[0].sourceId; + globalScene.getEnemyField().forEach(e => { if (e.id === stickyTagID) { opponentPokemon = e; } @@ -78,8 +113,9 @@ export class StatStageChangePhase extends PokemonPhase { } else { const stickyTagID = globalScene.arena.findTagsOnSide( (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, - ArenaTagSide.ENEMY)[0].sourceId; - globalScene.getPlayerField().forEach((e) => { + ArenaTagSide.ENEMY, + )[0].sourceId; + globalScene.getPlayerField().forEach(e => { if (e.id === stickyTagID) { opponentPokemon = e; } @@ -104,15 +140,33 @@ export class StatStageChangePhase extends PokemonPhase { if (!this.selfTarget && stages.value < 0) { // TODO: add a reference to the source of the stat change to fix Infiltrator interaction - globalScene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, false, null, cancelled); + globalScene.arena.applyTagsForSide( + MistTag, + pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, + false, + null, + cancelled, + ); } if (!cancelled.value && !this.selfTarget && stages.value < 0) { applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate); /** Potential stat reflection due to Mirror Armor, does not apply to Octolock end of turn effect */ - if (opponentPokemon !== undefined && !pokemon.findTag(t => t instanceof OctolockTag) && !this.comingFromMirrorArmorUser) { - applyPreStatStageChangeAbAttrs(ReflectStatStageChangeAbAttr, pokemon, stat, cancelled, simulate, opponentPokemon, this.stages); + if ( + opponentPokemon !== undefined && + !pokemon.findTag(t => t instanceof OctolockTag) && + !this.comingFromMirrorArmorUser + ) { + applyPreStatStageChangeAbAttrs( + ReflectStatStageChangeAbAttr, + pokemon, + stat, + cancelled, + simulate, + opponentPokemon, + this.stages, + ); } } @@ -124,9 +178,14 @@ export class StatStageChangePhase extends PokemonPhase { return !cancelled.value; }); - const relLevels = filteredStats.map(s => (stages.value >= 1 ? Math.min(pokemon.getStatStage(s) + stages.value, 6) : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s)); + const relLevels = filteredStats.map( + s => + (stages.value >= 1 + ? Math.min(pokemon.getStatStage(s) + stages.value, 6) + : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s), + ); - this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels); + this.onChange?.(this.getPokemon(), filteredStats, relLevels); const end = () => { if (this.showMessage) { @@ -163,10 +222,16 @@ export class StatStageChangePhase extends PokemonPhase { applyPostStatStageChangeAbAttrs(PostStatStageChangeAbAttr, pokemon, filteredStats, this.stages, this.selfTarget); // Look for any other stat change phases; if this is the last one, do White Herb check - const existingPhase = globalScene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex); + const existingPhase = globalScene.findPhase( + p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex, + ); if (!(existingPhase instanceof StatStageChangePhase)) { // Apply White Herb if needed - const whiteHerb = globalScene.applyModifier(ResetNegativeStatStageModifier, this.player, pokemon) as ResetNegativeStatStageModifier; + const whiteHerb = globalScene.applyModifier( + ResetNegativeStatStageModifier, + this.player, + pokemon, + ) as ResetNegativeStatStageModifier; // If the White Herb was applied, consume it if (whiteHerb) { pokemon.loseHeldItem(whiteHerb); @@ -184,7 +249,8 @@ export class StatStageChangePhase extends PokemonPhase { const pokemonMaskSprite = pokemon.maskSprite; const tileX = (this.player ? 106 : 236) * pokemon.getSpriteScale() * globalScene.field.scale; - const tileY = ((this.player ? 148 : 84) + (stages.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * globalScene.field.scale; + const tileY = + ((this.player ? 148 : 84) + (stages.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * globalScene.field.scale; const tileWidth = 156 * globalScene.field.scale * pokemon.getSpriteScale(); const tileHeight = 316 * globalScene.field.scale * pokemon.getSpriteScale(); @@ -210,15 +276,15 @@ export class StatStageChangePhase extends PokemonPhase { targets: statSprite, delay: 1000, duration: 250, - alpha: 0 + alpha: 0, }); - } + }, }); globalScene.tweens.add({ targets: statSprite, duration: 1500, - y: `${stages.value >= 1 ? "-" : "+"}=${160 * 6}` + y: `${stages.value >= 1 ? "-" : "+"}=${160 * 6}`, }); globalScene.time.delayedCall(1750, () => { @@ -231,13 +297,22 @@ export class StatStageChangePhase extends PokemonPhase { } aggregateStatStageChanges(): void { - const accEva: BattleStat[] = [ Stat.ACC, Stat.EVA ]; + const accEva: BattleStat[] = [Stat.ACC, Stat.EVA]; const isAccEva = accEva.some(s => this.stats.includes(s)); let existingPhase: StatStageChangePhase; if (this.stats.length === 1) { - while ((existingPhase = (globalScene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1 - && (p.stats[0] === this.stats[0]) - && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) { + while ( + (existingPhase = globalScene.findPhase( + p => + p instanceof StatStageChangePhase && + p.battlerIndex === this.battlerIndex && + p.stats.length === 1 && + p.stats[0] === this.stats[0] && + p.selfTarget === this.selfTarget && + p.showMessage === this.showMessage && + p.ignoreAbilities === this.ignoreAbilities, + ) as StatStageChangePhase) + ) { this.stages += existingPhase.stages; if (!globalScene.tryRemovePhase(p => p === existingPhase)) { @@ -245,9 +320,18 @@ export class StatStageChangePhase extends PokemonPhase { } } } - while ((existingPhase = (globalScene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget - && (accEva.some(s => p.stats.includes(s)) === isAccEva) - && p.stages === this.stages && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) { + while ( + (existingPhase = globalScene.findPhase( + p => + p instanceof StatStageChangePhase && + p.battlerIndex === this.battlerIndex && + p.selfTarget === this.selfTarget && + accEva.some(s => p.stats.includes(s)) === isAccEva && + p.stages === this.stages && + p.showMessage === this.showMessage && + p.ignoreAbilities === this.ignoreAbilities, + ) as StatStageChangePhase) + ) { this.stats.push(...existingPhase.stats); if (!globalScene.tryRemovePhase(p => p === existingPhase)) { break; @@ -272,21 +356,31 @@ export class StatStageChangePhase extends PokemonPhase { let statsFragment = ""; if (relStageStats.length > 1) { - statsFragment = relStageStats.length >= 5 - ? i18next.t("battle:stats") - : `${relStageStats.slice(0, -1).map(s => i18next.t(getStatKey(s))).join(", ")}${relStageStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${i18next.t(getStatKey(relStageStats[relStageStats.length - 1]))}`; - messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), { - pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), - stats: statsFragment, - count: relStageStats.length - })); + statsFragment = + relStageStats.length >= 5 + ? i18next.t("battle:stats") + : `${relStageStats + .slice(0, -1) + .map(s => i18next.t(getStatKey(s))) + .join( + ", ", + )}${relStageStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${i18next.t(getStatKey(relStageStats[relStageStats.length - 1]))}`; + messages.push( + i18next.t(getStatStageChangeDescriptionKey(Math.abs(Number.parseInt(rl)), stages >= 1), { + pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), + stats: statsFragment, + count: relStageStats.length, + }), + ); } else { statsFragment = i18next.t(getStatKey(relStageStats[0])); - messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), { - pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), - stats: statsFragment, - count: relStageStats.length - })); + messages.push( + i18next.t(getStatStageChangeDescriptionKey(Math.abs(Number.parseInt(rl)), stages >= 1), { + pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), + stats: statsFragment, + count: relStageStats.length, + }), + ); } }); diff --git a/src/phases/summon-missing-phase.ts b/src/phases/summon-missing-phase.ts index 459a0399964..32bc7495dce 100644 --- a/src/phases/summon-missing-phase.ts +++ b/src/phases/summon-missing-phase.ts @@ -9,7 +9,11 @@ export class SummonMissingPhase extends SummonPhase { } preSummon(): void { - globalScene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); + globalScene.ui.showText( + i18next.t("battle:sendOutPokemon", { + pokemonName: getPokemonNameWithAffix(this.getPokemon()), + }), + ); globalScene.time.delayedCall(250, () => this.summon()); } } diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts index 09eded9e52f..31cd2645e68 100644 --- a/src/phases/summon-phase.ts +++ b/src/phases/summon-phase.ts @@ -18,7 +18,7 @@ import { globalScene } from "#app/global-scene"; export class SummonPhase extends PartyMemberPokemonPhase { private loaded: boolean; - constructor(fieldIndex: number, player: boolean = true, loaded: boolean = false) { + constructor(fieldIndex: number, player = true, loaded = false) { super(fieldIndex, player); this.loaded = loaded; @@ -31,13 +31,15 @@ export class SummonPhase extends PartyMemberPokemonPhase { } /** - * Sends out a Pokemon before the battle begins and shows the appropriate messages - */ + * Sends out a Pokemon before the battle begins and shows the appropriate messages + */ preSummon(): void { const partyMember = this.getPokemon(); // If the Pokemon about to be sent out is fainted, illegal under a challenge, or no longer in the party for some reason, switch to the first non-fainted legal Pokemon if (!partyMember.isAllowedInBattle() || (this.player && !this.getParty().some(p => p.id === partyMember.id))) { - console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); + console.warn( + "The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve...", + ); // First check if they're somehow still in play, if so remove them. if (partyMember.isOnField()) { @@ -58,16 +60,28 @@ export class SummonPhase extends PartyMemberPokemonPhase { } // Swaps the fainted Pokemon and the first non-fainted legal Pokemon in the party - [ party[this.partyMemberIndex], party[legalIndex] ] = [ party[legalIndex], party[this.partyMemberIndex] ]; - console.warn("Swapped %s %O with %s %O", getPokemonNameWithAffix(partyMember), partyMember, getPokemonNameWithAffix(party[0]), party[0]); + [party[this.partyMemberIndex], party[legalIndex]] = [party[legalIndex], party[this.partyMemberIndex]]; + console.warn( + "Swapped %s %O with %s %O", + getPokemonNameWithAffix(partyMember), + partyMember, + getPokemonNameWithAffix(party[0]), + party[0], + ); } if (this.player) { - globalScene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); + globalScene.ui.showText( + i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(this.getPokemon()), + }), + ); if (this.player) { globalScene.pbTray.hide(); } - globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); globalScene.time.delayedCall(562, () => { globalScene.trainer.setFrame("2"); globalScene.time.delayedCall(64, () => { @@ -78,13 +92,21 @@ export class SummonPhase extends PartyMemberPokemonPhase { targets: globalScene.trainer, x: -36, duration: 1000, - onComplete: () => globalScene.trainer.setVisible(false) + onComplete: () => globalScene.trainer.setVisible(false), }); globalScene.time.delayedCall(750, () => this.summon()); - } else if (globalScene.currentBattle.battleType === BattleType.TRAINER || globalScene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { - const trainerName = globalScene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + } else if ( + globalScene.currentBattle.battleType === BattleType.TRAINER || + globalScene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { + const trainerName = globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); const pokemonName = this.getPokemon().getNameToRender(); - const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); + const message = i18next.t("battle:trainerSendOut", { + trainerName, + pokemonName, + }); globalScene.pbTrayEnemy.hide(); globalScene.ui.showText(message, null, () => this.summon()); @@ -100,7 +122,12 @@ export class SummonPhase extends PartyMemberPokemonPhase { summon(): void { const pokemon = this.getPokemon(); - const pokeball = globalScene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, "pb", getPokeballAtlasKey(pokemon.pokeball)); + const pokeball = globalScene.addFieldSprite( + this.player ? 36 : 248, + this.player ? 80 : 44, + "pb", + getPokeballAtlasKey(pokemon.pokeball), + ); pokeball.setVisible(false); pokeball.setOrigin(0.5, 0.625); globalScene.field.add(pokeball); @@ -109,7 +136,9 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.setFieldPosition(FieldPosition.RIGHT, 0); } else { const availablePartyMembers = this.getParty().filter(p => p.isAllowedInBattle()).length; - pokemon.setFieldPosition(!globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + pokemon.setFieldPosition( + !globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT, + ); } const fpOffset = pokemon.getFieldPositionOffset(); @@ -119,7 +148,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { globalScene.tweens.add({ targets: pokeball, duration: 650, - x: (this.player ? 100 : 236) + fpOffset[0] + x: (this.player ? 100 : 236) + fpOffset[0], }); globalScene.tweens.add({ @@ -167,11 +196,11 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.getSprite().clearTint(); pokemon.resetSummonData(); globalScene.time.delayedCall(1000, () => this.end()); - } + }, }); - } + }, }); - } + }, }); } @@ -187,7 +216,9 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.setFieldPosition(FieldPosition.RIGHT, 0); } else { const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; - pokemon.setFieldPosition(!globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + pokemon.setFieldPosition( + !globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT, + ); } globalScene.add.existing(pokemon); @@ -228,7 +259,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.resetSummonData(); globalScene.updateFieldScale(); globalScene.time.delayedCall(1000, () => this.end()); - } + }, }); } @@ -241,7 +272,11 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.resetTurnData(); - if (!this.loaded || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(globalScene.currentBattle.battleType) || (globalScene.currentBattle.waveIndex % 10) === 1) { + if ( + !this.loaded || + [BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType) || + globalScene.currentBattle.waveIndex % 10 === 1 + ) { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.queuePostSummon(); } diff --git a/src/phases/switch-biome-phase.ts b/src/phases/switch-biome-phase.ts index 88addb4ef47..2dd2a642f43 100644 --- a/src/phases/switch-biome-phase.ts +++ b/src/phases/switch-biome-phase.ts @@ -20,7 +20,7 @@ export class SwitchBiomePhase extends BattlePhase { } globalScene.tweens.add({ - targets: [ globalScene.arenaEnemy, globalScene.lastEnemyTrainer ], + targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer], x: "+=300", duration: 2000, onComplete: () => { @@ -38,11 +38,11 @@ export class SwitchBiomePhase extends BattlePhase { globalScene.arenaPlayerTransition.setVisible(true); globalScene.tweens.add({ - targets: [ globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition ], + targets: [globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition], duration: 1000, delay: 1000, ease: "Sine.easeInOut", - alpha: (target: any) => target === globalScene.arenaPlayer ? 0 : 1, + alpha: (target: any) => (target === globalScene.arenaPlayer ? 0 : 1), onComplete: () => { globalScene.arenaBg.setTexture(bgTexture); globalScene.arenaPlayer.setBiome(this.nextBiome); @@ -57,9 +57,9 @@ export class SwitchBiomePhase extends BattlePhase { } this.end(); - } + }, }); - } + }, }); } } diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index 34b70aeaf63..8562309ede5 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -17,14 +17,14 @@ export class SwitchPhase extends BattlePhase { private readonly doReturn: boolean; /** - * Creates a new SwitchPhase - * @param switchType {@linkcode SwitchType} The type of switch logic this phase implements - * @param fieldIndex Field index to switch out - * @param isModal Indicates if the switch should be forced (true) or is - * optional (false). - * @param doReturn Indicates if the party member on the field should be - * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. - */ + * Creates a new SwitchPhase + * @param switchType {@linkcode SwitchType} The type of switch logic this phase implements + * @param fieldIndex Field index to switch out + * @param isModal Indicates if the switch should be forced (true) or is + * optional (false). + * @param doReturn Indicates if the party member on the field should be + * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. + */ constructor(switchType: SwitchType, fieldIndex: number, isModal: boolean, doReturn: boolean) { super(); @@ -54,22 +54,35 @@ export class SwitchPhase extends BattlePhase { } // Check if there is any space still in field - if (this.isModal && globalScene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= globalScene.currentBattle.getBattlerCount()) { + if ( + this.isModal && + globalScene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= + globalScene.currentBattle.getBattlerCount() + ) { return super.end(); } // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once - const fieldIndex = globalScene.currentBattle.getBattlerCount() === 1 || globalScene.getPokemonAllowedInBattle().length > 1 ? this.fieldIndex : 0; + const fieldIndex = + globalScene.currentBattle.getBattlerCount() === 1 || globalScene.getPokemonAllowedInBattle().length > 1 + ? this.fieldIndex + : 0; - globalScene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: number, option: PartyOption) => { - if (slotIndex >= globalScene.currentBattle.getBattlerCount() && slotIndex < 6) { - // Remove any pre-existing PostSummonPhase under the same field index. - // Pre-existing PostSummonPhases may occur when this phase is invoked during a prompt to switch at the start of a wave. - globalScene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); - const switchType = (option === PartyOption.PASS_BATON) ? SwitchType.BATON_PASS : this.switchType; - globalScene.unshiftPhase(new SwitchSummonPhase(switchType, fieldIndex, slotIndex, this.doReturn)); - } - globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - }, PartyUiHandler.FilterNonFainted); + globalScene.ui.setMode( + Mode.PARTY, + this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, + fieldIndex, + (slotIndex: number, option: PartyOption) => { + if (slotIndex >= globalScene.currentBattle.getBattlerCount() && slotIndex < 6) { + // Remove any pre-existing PostSummonPhase under the same field index. + // Pre-existing PostSummonPhases may occur when this phase is invoked during a prompt to switch at the start of a wave. + globalScene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); + const switchType = option === PartyOption.PASS_BATON ? SwitchType.BATON_PASS : this.switchType; + globalScene.unshiftPhase(new SwitchSummonPhase(switchType, fieldIndex, slotIndex, this.doReturn)); + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + }, + PartyUiHandler.FilterNonFainted, + ); } } diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index f8350fb7d4c..48bcd0c4ebd 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -22,13 +22,13 @@ export class SwitchSummonPhase extends SummonPhase { private lastPokemon: Pokemon; /** - * Constructor for creating a new SwitchSummonPhase - * @param switchType the type of switch behavior - * @param fieldIndex integer representing position on the battle field - * @param slotIndex integer for the index of pokemon (in party of 6) to switch into - * @param doReturn boolean whether to render "comeback" dialogue - * @param player boolean if the switch is from the player - */ + * Constructor for creating a new SwitchSummonPhase + * @param switchType the type of switch behavior + * @param fieldIndex integer representing position on the battle field + * @param slotIndex integer for the index of pokemon (in party of 6) to switch into + * @param doReturn boolean whether to render "comeback" dialogue + * @param player boolean if the switch is from the player + */ constructor(switchType: SwitchType, fieldIndex: number, slotIndex: number, doReturn: boolean, player?: boolean) { super(fieldIndex, player !== undefined ? player : true); @@ -45,7 +45,9 @@ export class SwitchSummonPhase extends SummonPhase { if (!this.player) { if (this.slotIndex === -1) { //@ts-ignore - this.slotIndex = globalScene.currentBattle.trainer?.getNextSummonIndex(!this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); // TODO: what would be the default trainer-slot fallback? + this.slotIndex = globalScene.currentBattle.trainer?.getNextSummonIndex( + !this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); // TODO: what would be the default trainer-slot fallback? } if (this.slotIndex > -1) { this.showEnemyTrainer(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); @@ -53,17 +55,22 @@ export class SwitchSummonPhase extends SummonPhase { } } - if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? globalScene.getPlayerParty() : globalScene.getEnemyParty())[this.slotIndex])) { + if ( + !this.doReturn || + (this.slotIndex !== -1 && + !(this.player ? globalScene.getPlayerParty() : globalScene.getEnemyParty())[this.slotIndex]) + ) { if (this.player) { return this.switchAndSummon(); - } else { - globalScene.time.delayedCall(750, () => this.switchAndSummon()); - return; } + globalScene.time.delayedCall(750, () => this.switchAndSummon()); + return; } const pokemon = this.getPokemon(); - (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); + (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => + enemyPokemon.removeTagsBySourceId(pokemon.id), + ); if (this.switchType === SwitchType.SWITCH || this.switchType === SwitchType.INITIAL_SWITCH) { const substitute = pokemon.getTag(SubstituteTag); @@ -73,17 +80,22 @@ export class SwitchSummonPhase extends SummonPhase { duration: 250, scale: substitute.sprite.scale * 0.5, ease: "Sine.easeIn", - onComplete: () => substitute.sprite.destroy() + onComplete: () => substitute.sprite.destroy(), }); } } - globalScene.ui.showText(this.player ? - i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) : - i18next.t("battle:trainerComeBack", { - trainerName: globalScene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: pokemon.getNameToRender() - }) + globalScene.ui.showText( + this.player + ? i18next.t("battle:playerComeBack", { + pokemonName: getPokemonNameWithAffix(pokemon), + }) + : i18next.t("battle:trainerComeBack", { + trainerName: globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ), + pokemonName: pokemon.getNameToRender(), + }), ); globalScene.playSound("se/pb_rel"); pokemon.hideInfo(); @@ -96,7 +108,7 @@ export class SwitchSummonPhase extends SummonPhase { onComplete: () => { globalScene.time.delayedCall(750, () => this.switchAndSummon()); pokemon.leaveField(this.switchType === SwitchType.SWITCH, false); - } + }, }); } @@ -106,12 +118,38 @@ export class SwitchSummonPhase extends SummonPhase { this.lastPokemon = this.getPokemon(); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); if (this.switchType === SwitchType.BATON_PASS && switchedInPokemon) { - (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id)); - if (!globalScene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { - const batonPassModifier = globalScene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; - if (batonPassModifier && !globalScene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { - globalScene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false, undefined, undefined, undefined, false); + (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => + enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id), + ); + if ( + !globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id, + ) + ) { + const batonPassModifier = globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id, + ) as SwitchEffectTransferModifier; + if ( + batonPassModifier && + !globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id, + ) + ) { + globalScene.tryTransferHeldItemModifier( + batonPassModifier, + switchedInPokemon, + false, + undefined, + undefined, + undefined, + false, + ); } } } @@ -119,12 +157,17 @@ export class SwitchSummonPhase extends SummonPhase { party[this.slotIndex] = this.lastPokemon; party[this.fieldIndex] = switchedInPokemon; const showTextAndSummon = () => { - globalScene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedInPokemon) }) : - i18next.t("battle:trainerGo", { - trainerName: globalScene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: this.getPokemon().getNameToRender() - }) + globalScene.ui.showText( + this.player + ? i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(switchedInPokemon), + }) + : i18next.t("battle:trainerGo", { + trainerName: globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ), + pokemonName: this.getPokemon().getNameToRender(), + }), ); /** * If this switch is passing a Substitute, make the switched Pokemon match the returned Pokemon's state as it left. @@ -165,12 +208,18 @@ export class SwitchSummonPhase extends SummonPhase { const lastUsedMove = moveId ? allMoves[moveId] : undefined; const currentCommand = globalScene.currentBattle.turnCommands[this.fieldIndex]?.command; - const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); - const lastPokemonHasForceSwitchAbAttr = this.lastPokemon.hasAbilityWithAttr(PostDamageForceSwitchAbAttr) && !this.lastPokemon.isFainted(); + const lastPokemonIsForceSwitchedAndNotFainted = + lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); + const lastPokemonHasForceSwitchAbAttr = + this.lastPokemon.hasAbilityWithAttr(PostDamageForceSwitchAbAttr) && !this.lastPokemon.isFainted(); // Compensate for turn spent summoning // Or compensate for force switch move if switched out pokemon is not fainted - if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted || lastPokemonHasForceSwitchAbAttr) { + if ( + currentCommand === Command.POKEMON || + lastPokemonIsForceSwitchedAndNotFainted || + lastPokemonHasForceSwitchAbAttr + ) { pokemon.battleSummonData.turnCount--; pokemon.battleSummonData.waveTurnCount--; } diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index 5411861011e..c9320daf12f 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -20,13 +20,17 @@ export class TeraPhase extends BattlePhase { start() { super.start(); - globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${PokemonType[this.pokemon.getTeraType()]}`) })); + globalScene.queueMessage( + i18next.t("battle:pokemonTerastallized", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + type: i18next.t(`pokemonInfo:Type.${PokemonType[this.pokemon.getTeraType()]}`), + }), + ); new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { this.end(); }); } - end() { this.pokemon.isTerastallized = true; this.pokemon.updateSpritePipelineData(); diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index a560897037e..5b69f8db45c 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -5,7 +5,12 @@ import { Gender } from "#app/data/gender"; import { getBiomeKey } from "#app/field/arena"; import { GameMode, GameModes, getGameMode } from "#app/game-mode"; import type { Modifier } from "#app/modifier/modifier"; -import { getDailyRunStarterModifiers, ModifierPoolType, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { + getDailyRunStarterModifiers, + ModifierPoolType, + modifierTypes, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; import { Phase } from "#app/phase"; import type { SessionSaveData } from "#app/system/game-data"; import { Unlockables } from "#app/system/unlockables"; @@ -23,7 +28,6 @@ import { SummonPhase } from "./summon-phase"; import { globalScene } from "#app/global-scene"; import Overrides from "#app/overrides"; - export class TitlePhase extends Phase { private loaded: boolean; private lastSessionData: SessionSaveData; @@ -43,18 +47,21 @@ export class TitlePhase extends Phase { globalScene.playBgm("title", true); - globalScene.gameData.getSession(loggedInUser?.lastSessionSlot ?? -1).then(sessionData => { - if (sessionData) { - this.lastSessionData = sessionData; - const biomeKey = getBiomeKey(sessionData.arena.biome); - const bgTexture = `${biomeKey}_bg`; - globalScene.arenaBg.setTexture(bgTexture); - } - this.showOptions(); - }).catch(err => { - console.error(err); - this.showOptions(); - }); + globalScene.gameData + .getSession(loggedInUser?.lastSessionSlot ?? -1) + .then(sessionData => { + if (sessionData) { + this.lastSessionData = sessionData; + const biomeKey = getBiomeKey(sessionData.arena.biome); + const bgTexture = `${biomeKey}_bg`; + globalScene.arenaBg.setTexture(bgTexture); + } + this.showOptions(); + }) + .catch(err => { + console.error(err); + this.showOptions(); + }); } showOptions(): void { @@ -65,105 +72,110 @@ export class TitlePhase extends Phase { handler: () => { this.loadSaveSlot(this.lastSessionData || !loggedInUser ? -1 : loggedInUser.lastSessionSlot); return true; - } + }, }); } - options.push({ - label: i18next.t("menu:newGame"), - handler: () => { - const setModeAndEnd = (gameMode: GameModes) => { - this.gameMode = gameMode; - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.clearText(); - this.end(); - }; - const { gameData } = globalScene; - const options: OptionSelectItem[] = []; - options.push({ - label: GameMode.getModeName(GameModes.CLASSIC), - handler: () => { - setModeAndEnd(GameModes.CLASSIC); - return true; - } - }); - options.push({ - label: i18next.t("menu:dailyRun"), - handler: () => { - this.initDailyRun(); - return true; - } - }); - if (gameData.isUnlocked(Unlockables.ENDLESS_MODE)) { + options.push( + { + label: i18next.t("menu:newGame"), + handler: () => { + const setModeAndEnd = (gameMode: GameModes) => { + this.gameMode = gameMode; + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + this.end(); + }; + const { gameData } = globalScene; + const options: OptionSelectItem[] = []; options.push({ - label: GameMode.getModeName(GameModes.CHALLENGE), + label: GameMode.getModeName(GameModes.CLASSIC), handler: () => { - setModeAndEnd(GameModes.CHALLENGE); + setModeAndEnd(GameModes.CLASSIC); return true; - } + }, }); options.push({ - label: GameMode.getModeName(GameModes.ENDLESS), + label: i18next.t("menu:dailyRun"), handler: () => { - setModeAndEnd(GameModes.ENDLESS); + this.initDailyRun(); return true; - } + }, }); - if (gameData.isUnlocked(Unlockables.SPLICED_ENDLESS_MODE)) { + if (gameData.isUnlocked(Unlockables.ENDLESS_MODE)) { options.push({ - label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), + label: GameMode.getModeName(GameModes.CHALLENGE), handler: () => { - setModeAndEnd(GameModes.SPLICED_ENDLESS); + setModeAndEnd(GameModes.CHALLENGE); return true; - } + }, }); + options.push({ + label: GameMode.getModeName(GameModes.ENDLESS), + handler: () => { + setModeAndEnd(GameModes.ENDLESS); + return true; + }, + }); + if (gameData.isUnlocked(Unlockables.SPLICED_ENDLESS_MODE)) { + options.push({ + label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), + handler: () => { + setModeAndEnd(GameModes.SPLICED_ENDLESS); + return true; + }, + }); + } } - } - options.push({ - label: i18next.t("menu:cancel"), - handler: () => { - globalScene.clearPhaseQueue(); - globalScene.pushPhase(new TitlePhase()); - super.end(); - return true; - } - }); - globalScene.ui.showText(i18next.t("menu:selectGameMode"), null, () => globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); - return true; - } - }, - { - label: i18next.t("menu:loadGame"), - handler: () => { - globalScene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, - (slotId: number) => { + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.clearPhaseQueue(); + globalScene.pushPhase(new TitlePhase()); + super.end(); + return true; + }, + }); + globalScene.ui.showText(i18next.t("menu:selectGameMode"), null, () => + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: options, + }), + ); + return true; + }, + }, + { + label: i18next.t("menu:loadGame"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, (slotId: number) => { if (slotId === -1) { return this.showOptions(); } this.loadSaveSlot(slotId); }); - return true; - } - }, - { - label: i18next.t("menu:runHistory"), - handler: () => { - globalScene.ui.setOverlayMode(Mode.RUN_HISTORY); - return true; + return true; + }, }, - keepOpen: true - }, - { - label: i18next.t("menu:settings"), - handler: () => { - globalScene.ui.setOverlayMode(Mode.SETTINGS); - return true; + { + label: i18next.t("menu:runHistory"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.RUN_HISTORY); + return true; + }, + keepOpen: true, }, - keepOpen: true - }); + { + label: i18next.t("menu:settings"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.SETTINGS); + return true; + }, + keepOpen: true, + }, + ); const config: OptionSelectConfig = { options: options, noCancel: true, - yOffset: 47 + yOffset: 47, }; globalScene.ui.setMode(Mode.TITLE, config); } @@ -172,17 +184,20 @@ export class TitlePhase extends Phase { globalScene.sessionSlotId = slotId > -1 || !loggedInUser ? slotId : loggedInUser.lastSessionSlot; globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.resetModeChain(); - globalScene.gameData.loadSession(slotId, slotId === -1 ? this.lastSessionData : undefined).then((success: boolean) => { - if (success) { - this.loaded = true; - globalScene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); - } else { - this.end(); - } - }).catch(err => { - console.error(err); - globalScene.ui.showText(i18next.t("menu:failedToLoadSession"), null); - }); + globalScene.gameData + .loadSession(slotId, slotId === -1 ? this.lastSessionData : undefined) + .then((success: boolean) => { + if (success) { + this.loaded = true; + globalScene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); + } else { + this.end(); + } + }) + .catch(err => { + console.error(err); + globalScene.ui.showText(i18next.t("menu:failedToLoadSession"), null); + }); } initDailyRun(): void { @@ -211,10 +226,23 @@ export class TitlePhase extends Phase { for (const starter of starters) { const starterProps = globalScene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - const starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - const starterPokemon = globalScene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); + const starterGender = + starter.species.malePercent !== null + ? !starterProps.female + ? Gender.MALE + : Gender.FEMALE + : Gender.GENDERLESS; + const starterPokemon = globalScene.addPlayerPokemon( + starter.species, + startingLevel, + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + undefined, + starter.nature, + ); starterPokemon.setVisible(false); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); @@ -222,11 +250,17 @@ export class TitlePhase extends Phase { regenerateModifierPoolThresholds(party, ModifierPoolType.DAILY_STARTER); - const modifiers: Modifier[] = Array(3).fill(null).map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) - .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) - .concat([ modifierTypes.MAP().withIdFromFunc(modifierTypes.MAP).newModifier() ]) + const modifiers: Modifier[] = Array(3) + .fill(null) + .map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) + .concat( + Array(3) + .fill(null) + .map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier()), + ) + .concat([modifierTypes.MAP().withIdFromFunc(modifierTypes.MAP).newModifier()]) .concat(getDailyRunStarterModifiers(party)) - .filter((m) => m !== null); + .filter(m => m !== null); for (const m of modifiers) { globalScene.addModifier(m, true, false, false, true); @@ -247,15 +281,17 @@ export class TitlePhase extends Phase { // If Online, calls seed fetch from db to generate daily run. If Offline, generates a daily run based on current date. if (!Utils.isLocal || Utils.isLocalServerConnected) { - fetchDailyRunSeed().then(seed => { - if (seed) { - generateDaily(seed); - } else { - throw new Error("Daily run seed is null!"); - } - }).catch(err => { - console.error("Failed to load daily run:\n", err); - }); + fetchDailyRunSeed() + .then(seed => { + if (seed) { + generateDaily(seed); + } else { + throw new Error("Daily run seed is null!"); + } + }) + .catch(err => { + console.error("Failed to load daily run:\n", err); + }); } else { let seed: string = btoa(new Date().toISOString().substring(0, 10)); if (!Utils.isNullOrUndefined(Overrides.DAILY_RUN_SEED_OVERRIDE)) { @@ -290,7 +326,10 @@ export class TitlePhase extends Phase { globalScene.pushPhase(new SummonPhase(1, true, true)); } - if (globalScene.currentBattle.battleType !== BattleType.TRAINER && (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily)) { + if ( + globalScene.currentBattle.battleType !== BattleType.TRAINER && + (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily) + ) { const minPartySize = globalScene.currentBattle.double ? 2 : 1; if (availablePartyMembers > minPartySize) { globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); diff --git a/src/phases/toggle-double-position-phase.ts b/src/phases/toggle-double-position-phase.ts index f61577444d2..37f47d5cf95 100644 --- a/src/phases/toggle-double-position-phase.ts +++ b/src/phases/toggle-double-position-phase.ts @@ -16,14 +16,19 @@ export class ToggleDoublePositionPhase extends BattlePhase { const playerPokemon = globalScene.getPlayerField().find(p => p.isActive(true)); if (playerPokemon) { - playerPokemon.setFieldPosition(this.double && globalScene.getPokemonAllowedInBattle().length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, 500).then(() => { - if (playerPokemon.getFieldIndex() === 1) { - const party = globalScene.getPlayerParty(); - party[1] = party[0]; - party[0] = playerPokemon; - } - this.end(); - }); + playerPokemon + .setFieldPosition( + this.double && globalScene.getPokemonAllowedInBattle().length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, + 500, + ) + .then(() => { + if (playerPokemon.getFieldIndex() === 1) { + const party = globalScene.getPlayerParty(); + party[1] = party[0]; + party[0] = playerPokemon; + } + this.end(); + }); } else { this.end(); } diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts index 34ce2e8b53e..fa3f553cdd6 100644 --- a/src/phases/trainer-message-test-phase.ts +++ b/src/phases/trainer-message-test-phase.ts @@ -19,17 +19,23 @@ export class TrainerMessageTestPhase extends BattlePhase { const testMessages: string[] = []; for (const t of Object.keys(trainerConfigs)) { - const type = parseInt(t); - if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { + const type = Number.parseInt(t); + if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === (type as TrainerType))) { continue; } const config = trainerConfigs[type]; - [ config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages ] - .map(messages => { - if (messages?.length) { - testMessages.push(...messages); - } - }); + [ + config.encounterMessages, + config.femaleEncounterMessages, + config.victoryMessages, + config.femaleVictoryMessages, + config.defeatMessages, + config.femaleDefeatMessages, + ].map(messages => { + if (messages?.length) { + testMessages.push(...messages); + } + }); } for (const message of testMessages) { diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index e2617f598da..024c1e3f837 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -38,47 +38,92 @@ export class TrainerVictoryPhase extends BattlePhase { const trainerType = globalScene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? // Validate Voucher for boss trainers if (vouchers.hasOwnProperty(TrainerType[trainerType])) { - if (!globalScene.validateVoucher(vouchers[TrainerType[trainerType]]) && globalScene.currentBattle.trainer?.config.isBoss) { + if ( + !globalScene.validateVoucher(vouchers[TrainerType[trainerType]]) && + globalScene.currentBattle.trainer?.config.isBoss + ) { if (globalScene.eventManager.getUpgradeUnlockedVouchers()) { - globalScene.unshiftPhase(new ModifierRewardPhase([ modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); + globalScene.unshiftPhase( + new ModifierRewardPhase( + [ + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PREMIUM, + ][vouchers[TrainerType[trainerType]].voucherType], + ), + ); } else { - globalScene.unshiftPhase(new ModifierRewardPhase([ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); + globalScene.unshiftPhase( + new ModifierRewardPhase( + [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][ + vouchers[TrainerType[trainerType]].voucherType + ], + ), + ); } } } // Breeders in Space achievement if ( - globalScene.arena.biomeType === Biome.SPACE - && (trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER) + globalScene.arena.biomeType === Biome.SPACE && + (trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER) ) { globalScene.validateAchv(achvs.BREEDERS_IN_SPACE); } - globalScene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }), null, () => { - const victoryMessages = globalScene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct? - let message: string; - globalScene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), globalScene.currentBattle.waveIndex); - message = message!; // tell TS compiler it's defined now + globalScene.ui.showText( + i18next.t("battle:trainerDefeated", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }), + null, + () => { + const victoryMessages = globalScene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct? + let message: string; + globalScene.executeWithSeedOffset( + () => (message = Utils.randSeedItem(victoryMessages)), + globalScene.currentBattle.waveIndex, + ); + message = message!; // tell TS compiler it's defined now - const showMessage = () => { - const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => globalScene.ui.showDialogue(message, globalScene.currentBattle.trainer?.getName(TrainerSlot.TRAINER, true), null, originalFunc); - - showMessageOrEnd(); - }; - let showMessageOrEnd = () => this.end(); - if (victoryMessages?.length) { - if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { + const showMessage = () => { const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => originalFunc())); - globalScene.showFieldOverlay(500).then(() => globalScene.charSprite.showCharacter(globalScene.currentBattle.trainer?.getKey()!, getCharVariantFromDialogue(victoryMessages[0])).then(() => showMessage())); // TODO: is this bang correct? + showMessageOrEnd = () => + globalScene.ui.showDialogue( + message, + globalScene.currentBattle.trainer?.getName(TrainerSlot.TRAINER, true), + null, + originalFunc, + ); + + showMessageOrEnd(); + }; + let showMessageOrEnd = () => this.end(); + if (victoryMessages?.length) { + if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { + const originalFunc = showMessageOrEnd; + showMessageOrEnd = () => + globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => originalFunc())); + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter( + globalScene.currentBattle.trainer?.getKey()!, + getCharVariantFromDialogue(victoryMessages[0]), + ) + .then(() => showMessage()), + ); // TODO: is this bang correct? + } else { + showMessage(); + } } else { - showMessage(); + showMessageOrEnd(); } - } else { - showMessageOrEnd(); - } - }, null, true); + }, + null, + true, + ); this.showEnemyTrainer(); } diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index fc4190ef2eb..c55f6d69a58 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -5,7 +5,13 @@ import { WeatherType } from "#app/enums/weather-type"; import { TurnEndEvent } from "#app/events/battle-scene"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import { + TurnHealModifier, + EnemyTurnHealModifier, + EnemyStatusEffectHealChanceModifier, + TurnStatusEffectModifier, + TurnHeldItemTransferModifier, +} from "#app/modifier/modifier"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; @@ -29,8 +35,16 @@ export class TurnEndPhase extends FieldPhase { globalScene.applyModifiers(TurnHealModifier, pokemon.isPlayer(), pokemon); if (globalScene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + Math.max(pokemon.getMaxHp() >> 4, 1), + i18next.t("battle:turnEndHpRestore", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + true, + ), + ); } if (!pokemon.isPlayer()) { diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts index 946c9626718..3104b65eb3f 100644 --- a/src/phases/turn-init-phase.ts +++ b/src/phases/turn-init-phase.ts @@ -1,5 +1,8 @@ import { BattlerIndex } from "#app/battle"; -import { handleMysteryEncounterBattleStartEffects, handleMysteryEncounterTurnStartEffects } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + handleMysteryEncounterBattleStartEffects, + handleMysteryEncounterTurnStartEffects, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { TurnInitEvent } from "#app/events/battle-scene"; import type { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; @@ -22,7 +25,7 @@ export class TurnInitPhase extends FieldPhase { globalScene.getPlayerField().forEach(p => { // If this pokemon is in play and evolved into something illegal under the current challenge, force a switch if (p.isOnField() && !p.isAllowedInBattle()) { - globalScene.queueMessage(i18next.t("challenges:illegalEvolution", { "pokemon": p.name }), null, true); + globalScene.queueMessage(i18next.t("challenges:illegalEvolution", { pokemon: p.name }), null, true); const allowedPokemon = globalScene.getPokemonAllowedInBattle(); @@ -30,7 +33,10 @@ export class TurnInitPhase extends FieldPhase { // If there are no longer any legal pokemon in the party, game over. globalScene.clearPhaseQueue(); globalScene.unshiftPhase(new GameOverPhase()); - } else if (allowedPokemon.length >= globalScene.currentBattle.getBattlerCount() || (globalScene.currentBattle.double && !allowedPokemon[0].isActive(true))) { + } else if ( + allowedPokemon.length >= globalScene.currentBattle.getBattlerCount() || + (globalScene.currentBattle.double && !allowedPokemon[0].isActive(true)) + ) { // If there is at least one pokemon in the back that is legal to switch in, force a switch. p.switchOut(); } else { diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 0d924e9f48b..6065a0caf6e 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -41,9 +41,13 @@ export class TurnStartPhase extends FieldPhase { let orderedTargets: Pokemon[] = playerField.concat(enemyField); // We seed it with the current turn to prevent an inconsistency where it // was varying based on how long since you last reloaded - globalScene.executeWithSeedOffset(() => { - orderedTargets = Utils.randSeedShuffle(orderedTargets); - }, globalScene.currentBattle.turn, globalScene.waveSeed); + globalScene.executeWithSeedOffset( + () => { + orderedTargets = Utils.randSeedShuffle(orderedTargets); + }, + globalScene.currentBattle.turn, + globalScene.waveSeed, + ); // Next, a check for Trick Room is applied to determine sort order. const speedReversed = new Utils.BooleanHolder(false); @@ -72,16 +76,19 @@ export class TurnStartPhase extends FieldPhase { // This occurs before the main loop because of battles with more than two Pokemon const battlerBypassSpeed = {}; - globalScene.getField(true).filter(p => p.summonData).map(p => { - const bypassSpeed = new Utils.BooleanHolder(false); - const canCheckHeldItems = new Utils.BooleanHolder(true); - applyAbAttrs(BypassSpeedChanceAbAttr, p, null, false, bypassSpeed); - applyAbAttrs(PreventBypassSpeedChanceAbAttr, p, null, false, bypassSpeed, canCheckHeldItems); - if (canCheckHeldItems.value) { - globalScene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); - } - battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; - }); + globalScene + .getField(true) + .filter(p => p.summonData) + .map(p => { + const bypassSpeed = new Utils.BooleanHolder(false); + const canCheckHeldItems = new Utils.BooleanHolder(true); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, false, bypassSpeed); + applyAbAttrs(PreventBypassSpeedChanceAbAttr, p, null, false, bypassSpeed, canCheckHeldItems); + if (canCheckHeldItems.value) { + globalScene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); + } + battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; + }); // The function begins sorting orderedTargets based on command priority, move priority, and possible speed bypasses. // Non-FIGHT commands (SWITCH, BALL, RUN) have a higher command priority and will always occur before any FIGHT commands. @@ -93,7 +100,8 @@ export class TurnStartPhase extends FieldPhase { if (aCommand?.command !== bCommand?.command) { if (aCommand?.command === Command.FIGHT) { return 1; - } else if (bCommand?.command === Command.FIGHT) { + } + if (bCommand?.command === Command.FIGHT) { return -1; } } else if (aCommand?.command === Command.FIGHT) { @@ -115,7 +123,7 @@ export class TurnStartPhase extends FieldPhase { if (isSameBracket && battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) { return battlerBypassSpeed[a].value ? -1 : 1; } - return (aPriority < bPriority) ? 1 : -1; + return aPriority < bPriority ? 1 : -1; } } @@ -155,7 +163,6 @@ export class TurnStartPhase extends FieldPhase { } for (const o of moveOrder) { - const pokemon = field[o]; const turnCommand = globalScene.currentBattle.turnCommands[o]; @@ -170,42 +177,62 @@ export class TurnStartPhase extends FieldPhase { if (!queuedMove) { continue; } - const move = pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || new PokemonMove(queuedMove.move); + const move = + pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || + new PokemonMove(queuedMove.move); if (move.getMove().hasAttr(MoveHeaderAttr)) { globalScene.unshiftPhase(new MoveHeaderPhase(pokemon, move)); } if (pokemon.isPlayer()) { if (turnCommand.cursor === -1) { - globalScene.pushPhase(new MovePhase(pokemon, turnCommand.targets || turnCommand.move!.targets, move));//TODO: is the bang correct here? + globalScene.pushPhase(new MovePhase(pokemon, turnCommand.targets || turnCommand.move!.targets, move)); //TODO: is the bang correct here? } else { - const playerPhase = new MovePhase(pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP);//TODO: is the bang correct here? + const playerPhase = new MovePhase( + pokemon, + turnCommand.targets || turnCommand.move!.targets, + move, + false, + queuedMove.ignorePP, + ); //TODO: is the bang correct here? globalScene.pushPhase(playerPhase); } } else { - globalScene.pushPhase(new MovePhase(pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP));//TODO: is the bang correct here? + globalScene.pushPhase( + new MovePhase( + pokemon, + turnCommand.targets || turnCommand.move!.targets, + move, + false, + queuedMove.ignorePP, + ), + ); //TODO: is the bang correct here? } break; case Command.BALL: - globalScene.unshiftPhase(new AttemptCapturePhase(turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? + globalScene.unshiftPhase(new AttemptCapturePhase(turnCommand.targets![0] % 2, turnCommand.cursor!)); //TODO: is the bang correct here? break; case Command.POKEMON: const switchType = turnCommand.args?.[0] ? SwitchType.BATON_PASS : SwitchType.SWITCH; - globalScene.unshiftPhase(new SwitchSummonPhase(switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer())); + globalScene.unshiftPhase( + new SwitchSummonPhase(switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer()), + ); break; case Command.RUN: let runningPokemon = pokemon; if (globalScene.currentBattle.double) { const playerActivePokemon = field.filter(pokemon => { - if (!!pokemon) { + if (pokemon) { return pokemon.isPlayer() && pokemon.isActive(); - } else { - return; } + return; }); // if only one pokemon is alive, use that one if (playerActivePokemon.length > 1) { - // find which active pokemon has faster speed - const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; + // find which active pokemon has faster speed + const fasterPokemon = + playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) + ? playerActivePokemon[0] + : playerActivePokemon[1]; // check if either active pokemon has the ability "Run Away" const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; @@ -225,10 +252,10 @@ export class TurnStartPhase extends FieldPhase { globalScene.pushPhase(new 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 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(); } } diff --git a/src/phases/unlock-phase.ts b/src/phases/unlock-phase.ts index 2d24ee92baf..b420a4b3a61 100644 --- a/src/phases/unlock-phase.ts +++ b/src/phases/unlock-phase.ts @@ -20,10 +20,19 @@ export class UnlockPhase extends Phase { // Sound loaded into game as is globalScene.playSound("level_up_fanfare"); globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:unlockedSomething", { unlockedThing: getUnlockableName(this.unlockable) }), null, () => { - globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); - this.end(); - }, null, true, 1500); + globalScene.ui.showText( + i18next.t("battle:unlockedSomething", { + unlockedThing: getUnlockableName(this.unlockable), + }), + null, + () => { + globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); + this.end(); + }, + null, + true, + 1500, + ); }); } } diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index 13e04569ef3..78bf72195e8 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -18,7 +18,7 @@ export class VictoryPhase extends PokemonPhase { /** If true, indicates that the phase is intended for EXP purposes only, and not to continue a battle to next phase */ isExpOnly: boolean; - constructor(battlerIndex: BattlerIndex | number, isExpOnly: boolean = false) { + constructor(battlerIndex: BattlerIndex | number, isExpOnly = false) { super(battlerIndex); this.isExpOnly = isExpOnly; @@ -42,14 +42,21 @@ export class VictoryPhase extends PokemonPhase { return this.end(); } - if (!globalScene.getEnemyParty().find(p => globalScene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) { + if ( + !globalScene + .getEnemyParty() + .find(p => (globalScene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) + ) { globalScene.pushPhase(new BattleEndPhase(true)); if (globalScene.currentBattle.battleType === BattleType.TRAINER) { globalScene.pushPhase(new TrainerVictoryPhase()); } if (globalScene.gameMode.isEndless || !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) { globalScene.pushPhase(new EggLapsePhase()); - if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === ClassicFixedBossWaves.EVIL_BOSS_2) { + if ( + globalScene.gameMode.isClassic && + globalScene.currentBattle.waveIndex === ClassicFixedBossWaves.EVIL_BOSS_2 + ) { // Should get Lock Capsule on 165 before shop phase so it can be used in the rewards shop globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.LOCK_CAPSULE)); } @@ -57,7 +64,10 @@ export class VictoryPhase extends PokemonPhase { globalScene.pushPhase(new SelectModifierPhase(undefined, undefined, this.getFixedBattleCustomModifiers())); } else if (globalScene.gameMode.isDaily) { globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.EXP_CHARM)); - if (globalScene.currentBattle.waveIndex > 10 && !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) { + if ( + globalScene.currentBattle.waveIndex > 10 && + !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex) + ) { globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.GOLDEN_POKEBALL)); } } else { @@ -65,14 +75,29 @@ export class VictoryPhase extends PokemonPhase { if (globalScene.gameMode.isEndless && globalScene.currentBattle.waveIndex === 10) { globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.EXP_SHARE)); } - if (globalScene.currentBattle.waveIndex <= 750 && (globalScene.currentBattle.waveIndex <= 500 || (globalScene.currentBattle.waveIndex % 30) === superExpWave)) { - globalScene.pushPhase(new ModifierRewardPhase((globalScene.currentBattle.waveIndex % 30) !== superExpWave || globalScene.currentBattle.waveIndex > 250 ? modifierTypes.EXP_CHARM : modifierTypes.SUPER_EXP_CHARM)); + if ( + globalScene.currentBattle.waveIndex <= 750 && + (globalScene.currentBattle.waveIndex <= 500 || globalScene.currentBattle.waveIndex % 30 === superExpWave) + ) { + globalScene.pushPhase( + new ModifierRewardPhase( + globalScene.currentBattle.waveIndex % 30 !== superExpWave || globalScene.currentBattle.waveIndex > 250 + ? modifierTypes.EXP_CHARM + : modifierTypes.SUPER_EXP_CHARM, + ), + ); } if (globalScene.currentBattle.waveIndex <= 150 && !(globalScene.currentBattle.waveIndex % 50)) { globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.GOLDEN_POKEBALL)); } if (globalScene.gameMode.isEndless && !(globalScene.currentBattle.waveIndex % 50)) { - globalScene.pushPhase(new ModifierRewardPhase(!(globalScene.currentBattle.waveIndex % 250) ? modifierTypes.VOUCHER_PREMIUM : modifierTypes.VOUCHER_PLUS)); + globalScene.pushPhase( + new ModifierRewardPhase( + !(globalScene.currentBattle.waveIndex % 250) + ? modifierTypes.VOUCHER_PREMIUM + : modifierTypes.VOUCHER_PLUS, + ), + ); globalScene.pushPhase(new AddEnemyBuffModifierPhase()); } } diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index aa09f8a850d..9199b7996bc 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -1,5 +1,13 @@ import { globalScene } from "#app/global-scene"; -import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability"; +import { + applyPreWeatherEffectAbAttrs, + SuppressWeatherEffectAbAttr, + PreWeatherDamageAbAttr, + applyAbAttrs, + BlockNonDirectDamageAbAttr, + applyPostWeatherLapseAbAttrs, + PostWeatherLapseAbAttr, +} from "#app/data/ability"; import { CommonAnim } from "#app/data/battle-anims"; import type { Weather } from "#app/data/weather"; import { getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; @@ -14,7 +22,11 @@ export class WeatherEffectPhase extends CommonAnimPhase { public weather: Weather | null; constructor() { - super(undefined, undefined, CommonAnim.SUNNY + ((globalScene?.arena?.weather?.weatherType || WeatherType.NONE) - 1)); + super( + undefined, + undefined, + CommonAnim.SUNNY + ((globalScene?.arena?.weather?.weatherType || WeatherType.NONE) - 1), + ); this.weather = globalScene?.arena?.weather; } @@ -30,10 +42,11 @@ export class WeatherEffectPhase extends CommonAnimPhase { this.setAnimation(CommonAnim.SUNNY + (this.weather.weatherType - 1)); if (this.weather.isDamaging()) { - const cancelled = new Utils.BooleanHolder(false); - this.executeForAll((pokemon: Pokemon) => applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled)); + this.executeForAll((pokemon: Pokemon) => + applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled), + ); if (!cancelled.value) { const inflictDamage = (pokemon: Pokemon) => { @@ -42,7 +55,11 @@ export class WeatherEffectPhase extends CommonAnimPhase { applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (cancelled.value || pokemon.getTag(BattlerTagType.UNDERGROUND) || pokemon.getTag(BattlerTagType.UNDERWATER)) { + if ( + cancelled.value || + pokemon.getTag(BattlerTagType.UNDERGROUND) || + pokemon.getTag(BattlerTagType.UNDERWATER) + ) { return; } @@ -53,7 +70,10 @@ export class WeatherEffectPhase extends CommonAnimPhase { }; this.executeForAll((pokemon: Pokemon) => { - const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length || pokemon.switchOutStatus; + const immune = + !pokemon || + !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length || + pokemon.switchOutStatus; if (!immune) { inflictDamage(pokemon); } diff --git a/src/pipelines/field-sprite.ts b/src/pipelines/field-sprite.ts index f81845073c1..547281d7dee 100644 --- a/src/pipelines/field-sprite.ts +++ b/src/pipelines/field-sprite.ts @@ -208,19 +208,21 @@ void main() { export default class FieldSpritePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { constructor(game: Phaser.Game, config?: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig) { - super(config || { - game: game, - name: "field-sprite", - fragShader: spriteFragShader, - vertShader: spriteVertShader - }); + super( + config || { + game: game, + name: "field-sprite", + fragShader: spriteFragShader, + vertShader: spriteVertShader, + }, + ); } onPreRender(): void { this.set1f("time", 0); this.set1i("ignoreTimeTint", 0); this.set1f("terrainColorRatio", 0); - this.set3fv("terrainColor", [ 0, 0, 0 ]); + this.set3fv("terrainColor", [0, 0, 0]); } onBind(gameObject: Phaser.GameObjects.GameObject): void { @@ -230,7 +232,7 @@ export default class FieldSpritePipeline extends Phaser.Renderer.WebGL.Pipelines const data = sprite.pipelineData; const ignoreTimeTint = data["ignoreTimeTint"] as boolean; - const terrainColorRatio = data["terrainColorRatio"] as number || 0; + const terrainColorRatio = (data["terrainColorRatio"] as number) || 0; const time = globalScene.currentBattle?.waveIndex ? ((globalScene.currentBattle.waveIndex + globalScene.waveCycleOffset) % 40) / 40 // ((new Date().getSeconds() * 1000 + new Date().getMilliseconds()) % 10000) / 10000 @@ -238,10 +240,22 @@ export default class FieldSpritePipeline extends Phaser.Renderer.WebGL.Pipelines this.set1f("time", time); this.set1i("ignoreTimeTint", ignoreTimeTint ? 1 : 0); this.set1i("isOutside", globalScene.arena.isOutside() ? 1 : 0); - this.set3fv("dayTint", globalScene.arena.getDayTint().map(c => c / 255)); - this.set3fv("duskTint", globalScene.arena.getDuskTint().map(c => c / 255)); - this.set3fv("nightTint", globalScene.arena.getNightTint().map(c => c / 255)); - this.set3fv("terrainColor", getTerrainColor(globalScene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255)); + this.set3fv( + "dayTint", + globalScene.arena.getDayTint().map(c => c / 255), + ); + this.set3fv( + "duskTint", + globalScene.arena.getDuskTint().map(c => c / 255), + ); + this.set3fv( + "nightTint", + globalScene.arena.getNightTint().map(c => c / 255), + ); + this.set3fv( + "terrainColor", + getTerrainColor(globalScene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255), + ); this.set1f("terrainColorRatio", terrainColorRatio); } diff --git a/src/pipelines/invert.ts b/src/pipelines/invert.ts index 9c30f2b5cee..a945d0c95aa 100644 --- a/src/pipelines/invert.ts +++ b/src/pipelines/invert.ts @@ -14,14 +14,12 @@ void main() `; export default class InvertPostFX extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { - constructor (game: Game) { + constructor(game: Game) { super({ game, name: "InvertPostFX", fragShader, - uniforms: [ - "uMainSampler" - ] + uniforms: ["uMainSampler"], } as Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); } } diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 90c0e65d25c..439e35f711f 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -322,17 +322,17 @@ export default class SpritePipeline extends FieldSpritePipeline { game: game, name: "sprite", fragShader: spriteFragShader, - vertShader: spriteVertShader + vertShader: spriteVertShader, }); - this._tone = [ 0, 0, 0, 0 ]; + this._tone = [0, 0, 0, 0]; } onPreRender(): void { super.onPreRender(); this.set1f("teraTime", 0); - this.set3fv("teraColor", [ 0, 0, 0 ]); + this.set3fv("teraColor", [0, 0, 0]); this.set1i("hasShadow", 0); this.set1i("yCenter", 0); this.set2f("relPosition", 0, 0); @@ -347,31 +347,38 @@ export default class SpritePipeline extends FieldSpritePipeline { onBind(gameObject: Phaser.GameObjects.GameObject): void { super.onBind(gameObject); - const sprite = (gameObject as Phaser.GameObjects.Sprite); + const sprite = gameObject as Phaser.GameObjects.Sprite; const data = sprite.pipelineData; const tone = data["tone"] as number[]; - const teraColor = (data["isTerastallized"] as boolean) ? (data["teraColor"] as number[] ?? [ 0, 0, 0 ]) : [ 0, 0, 0 ]; + const teraColor = (data["isTerastallized"] as boolean) ? ((data["teraColor"] as number[]) ?? [0, 0, 0]) : [0, 0, 0]; const hasShadow = data["hasShadow"] as boolean; const yShadowOffset = data["yShadowOffset"] as number; const ignoreFieldPos = data["ignoreFieldPos"] as boolean; const ignoreOverride = data["ignoreOverride"] as boolean; - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; + const isEntityObj = + sprite.parentContainer instanceof Pokemon || + sprite.parentContainer instanceof Trainer || + sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; - const position = isEntityObj - ? [ sprite.parentContainer.x, sprite.parentContainer.y ] - : [ sprite.x, sprite.y ]; + const position = isEntityObj ? [sprite.parentContainer.x, sprite.parentContainer.y] : [sprite.x, sprite.y]; if (field) { position[0] += field.x / field.scale; position[1] += field.y / field.scale; } - position[0] += -(sprite.width - (sprite.frame.width)) / 2 + sprite.frame.x + (!ignoreFieldPos ? (sprite.x - field.x) : 0); + position[0] += + -(sprite.width - sprite.frame.width) / 2 + sprite.frame.x + (!ignoreFieldPos ? sprite.x - field.x : 0); if (sprite.originY === 0.5) { - position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + (!ignoreFieldPos ? (sprite.y - field.y) : 0); + position[1] += + (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + + (!ignoreFieldPos ? sprite.y - field.y : 0); } this.set1f("teraTime", (this.game.getTime() % 500000) / 500000); - this.set3fv("teraColor", teraColor.map(c => c / 255)); + this.set3fv( + "teraColor", + teraColor.map(c => c / 255), + ); this.set1i("hasShadow", hasShadow ? 1 : 0); this.set1i("yCenter", sprite.originY === 0.5 ? 1 : 0); this.set1f("fieldScale", field?.scale || 1); @@ -379,21 +386,34 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set2f("texFrameUv", sprite.frame.u0, sprite.frame.v0); this.set2f("size", sprite.frame.width, sprite.height); this.set2f("texSize", sprite.texture.source[0].width, sprite.texture.source[0].height); - this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + this.set1f( + "yOffset", + sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale), + ); this.set1f("yShadowOffset", yShadowOffset ?? 0); this.set4fv("tone", tone); this.bindTexture(this.game.textures.get("tera").source[0].glTexture!, 1); // TODO: is this bang correct? if (globalScene.fusionPaletteSwaps) { const spriteColors = ((ignoreOverride && data["spriteColorsBase"]) || data["spriteColors"] || []) as number[][]; - const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || data["fusionSpriteColors"] || []) as number[][]; + const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || + data["fusionSpriteColors"] || + []) as number[][]; - const emptyColors = [ 0, 0, 0, 0 ]; + const emptyColors = [0, 0, 0, 0]; const flatSpriteColors: number[] = []; const flatFusionSpriteColors: number[] = []; for (let c = 0; c < 32; c++) { - flatSpriteColors.splice(flatSpriteColors.length, 0, ...(c < spriteColors.length ? spriteColors[c] : emptyColors)); - flatFusionSpriteColors.splice(flatFusionSpriteColors.length, 0, ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors)); + flatSpriteColors.splice( + flatSpriteColors.length, + 0, + ...(c < spriteColors.length ? spriteColors[c] : emptyColors), + ); + flatFusionSpriteColors.splice( + flatFusionSpriteColors.length, + 0, + ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors), + ); } this.set4iv("spriteColors", flatSpriteColors.flat()); @@ -403,21 +423,30 @@ export default class SpritePipeline extends FieldSpritePipeline { onBatch(gameObject: Phaser.GameObjects.GameObject): void { if (gameObject) { - const sprite = (gameObject as Phaser.GameObjects.Sprite); + const sprite = gameObject as Phaser.GameObjects.Sprite; const data = sprite.pipelineData; const variant: number = data.hasOwnProperty("variant") ? data["variant"] - : sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.variant + : sprite.parentContainer instanceof Pokemon + ? sprite.parentContainer.variant : 0; - let variantColors; + let variantColors: { [x: string]: string }[]; - const emptyColors = [ 0, 0, 0, 0 ]; + const emptyColors = [0, 0, 0, 0]; const flatBaseColors: number[] = []; const flatVariantColors: number[] = []; - if ((sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data["shiny"]) - && (variantColors = variantColorCache[sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.getSprite().texture.key : data["spriteKey"]]) && variantColors.hasOwnProperty(variant)) { + if ( + (sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data["shiny"]) && + (variantColors = + variantColorCache[ + sprite.parentContainer instanceof Pokemon + ? sprite.parentContainer.getSprite().texture.key + : data["spriteKey"] + ]) && + variantColors.hasOwnProperty(variant) + ) { const baseColors = Object.keys(variantColors[variant]); for (let c = 0; c < 32; c++) { if (c < baseColors.length) { @@ -444,30 +473,72 @@ export default class SpritePipeline extends FieldSpritePipeline { super.onBatch(gameObject); } - batchQuad(gameObject: Phaser.GameObjects.GameObject, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, - u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, - texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean { + batchQuad( + gameObject: Phaser.GameObjects.GameObject, + x0: number, + y0: number, + x1: number, + y1: number, + x2: number, + y2: number, + x3: number, + y3: number, + u0: number, + v0: number, + u1: number, + v1: number, + tintTL: number, + tintTR: number, + tintBL: number, + tintBR: number, + tintEffect: number | boolean, + texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, + unit?: number, + ): boolean { const sprite = gameObject as Phaser.GameObjects.Sprite; this.set1f("vCutoff", v1); const hasShadow = sprite.pipelineData["hasShadow"] as boolean; - const yShadowOffset = sprite.pipelineData["yShadowOffset"] as number ?? 0; + const yShadowOffset = (sprite.pipelineData["yShadowOffset"] as number) ?? 0; if (hasShadow) { - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; + const isEntityObj = + sprite.parentContainer instanceof Pokemon || + sprite.parentContainer instanceof Trainer || + sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; const fieldScaleRatio = field.scale / 6; - const baseY = (isEntityObj - ? sprite.parentContainer.y - : sprite.y + sprite.height) * 6 / fieldScaleRatio; - const bottomPadding = Math.ceil(sprite.height * 0.05 + Math.max(yShadowOffset, 0)) * 6 / fieldScaleRatio; + const baseY = ((isEntityObj ? sprite.parentContainer.y : sprite.y + sprite.height) * 6) / fieldScaleRatio; + const bottomPadding = (Math.ceil(sprite.height * 0.05 + Math.max(yShadowOffset, 0)) * 6) / fieldScaleRatio; const yDelta = (baseY - y1) / field.scale; y2 = y1 = baseY + bottomPadding; - const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + const pixelHeight = + (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); v1 += (yDelta + bottomPadding / field.scale) * pixelHeight; } - return super.batchQuad(gameObject, x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit); + return super.batchQuad( + gameObject, + x0, + y0, + x1, + y1, + x2, + y2, + x3, + y3, + u0, + v0, + u1, + v1, + tintTL, + tintTR, + tintBL, + tintBR, + tintEffect, + texture, + unit, + ); } get tone(): number[] { diff --git a/src/plugins/api/api-base.ts b/src/plugins/api/api-base.ts index 5c1a30ff3ab..6a0eca56eaa 100644 --- a/src/plugins/api/api-base.ts +++ b/src/plugins/api/api-base.ts @@ -85,8 +85,8 @@ export abstract class ApiBase { */ protected toUrlSearchParams>(data: D) { const arr = Object.entries(data) - .map(([ key, value ]) => (value !== undefined ? [ key, String(value) ] : [ key, "" ])) - .filter(([ , value ]) => value !== ""); + .map(([key, value]) => (value !== undefined ? [key, String(value)] : [key, ""])) + .filter(([, value]) => value !== ""); return new URLSearchParams(arr); } diff --git a/src/plugins/api/pokerogue-account-api.ts b/src/plugins/api/pokerogue-account-api.ts index 66ab8d67520..bab74799677 100644 --- a/src/plugins/api/pokerogue-account-api.ts +++ b/src/plugins/api/pokerogue-account-api.ts @@ -24,14 +24,13 @@ export class PokerogueAccountApi extends ApiBase { if (response.ok) { const resData = (await response.json()) as AccountInfoResponse; - return [ resData, response.status ]; - } else { - console.warn("Could not get account info!", response.status, response.statusText); - return [ null, response.status ]; + return [resData, response.status]; } + console.warn("Could not get account info!", response.status, response.statusText); + return [null, response.status]; } catch (err) { console.warn("Could not get account info!", err); - return [ null, 500 ]; + return [null, 500]; } } @@ -46,9 +45,8 @@ export class PokerogueAccountApi extends ApiBase { if (response.ok) { return null; - } else { - return response.text(); } + return response.text(); } catch (err) { console.warn("Register failed!", err); } @@ -70,10 +68,9 @@ export class PokerogueAccountApi extends ApiBase { const loginResponse = (await response.json()) as AccountLoginResponse; setCookie(SESSION_ID_COOKIE_NAME, loginResponse.token); return null; - } else { - console.warn("Login failed!", response.status, response.statusText); - return response.text(); } + console.warn("Login failed!", response.status, response.statusText); + return response.text(); } catch (err) { console.warn("Login failed!", err); } diff --git a/src/plugins/api/pokerogue-admin-api.ts b/src/plugins/api/pokerogue-admin-api.ts index eeba5319adc..5923f286430 100644 --- a/src/plugins/api/pokerogue-admin-api.ts +++ b/src/plugins/api/pokerogue-admin-api.ts @@ -22,12 +22,11 @@ export class PokerogueAdminApi extends ApiBase { if (response.ok) { return null; - } else { - console.warn("Could not link account with discord!", response.status, response.statusText); + } + console.warn("Could not link account with discord!", response.status, response.statusText); - if (response.status === 404) { - return this.ERR_USERNAME_NOT_FOUND; - } + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; } } catch (err) { console.warn("Could not link account with discord!", err); @@ -47,12 +46,11 @@ export class PokerogueAdminApi extends ApiBase { if (response.ok) { return null; - } else { - console.warn("Could not unlink account from discord!", response.status, response.statusText); + } + console.warn("Could not unlink account from discord!", response.status, response.statusText); - if (response.status === 404) { - return this.ERR_USERNAME_NOT_FOUND; - } + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; } } catch (err) { console.warn("Could not unlink account from discord!", err); @@ -72,12 +70,11 @@ export class PokerogueAdminApi extends ApiBase { if (response.ok) { return null; - } else { - console.warn("Could not link account with google!", response.status, response.statusText); + } + console.warn("Could not link account with google!", response.status, response.statusText); - if (response.status === 404) { - return this.ERR_USERNAME_NOT_FOUND; - } + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; } } catch (err) { console.warn("Could not link account with google!", err); @@ -97,12 +94,11 @@ export class PokerogueAdminApi extends ApiBase { if (response.ok) { return null; - } else { - console.warn("Could not unlink account from google!", response.status, response.statusText); + } + console.warn("Could not unlink account from google!", response.status, response.statusText); - if (response.status === 404) { - return this.ERR_USERNAME_NOT_FOUND; - } + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; } } catch (err) { console.warn("Could not unlink account from google!", err); @@ -123,18 +119,17 @@ export class PokerogueAdminApi extends ApiBase { if (response.ok) { const resData: SearchAccountResponse = await response.json(); - return [ resData, undefined ]; - } else { - console.warn("Could not find account!", response.status, response.statusText); + return [resData, undefined]; + } + console.warn("Could not find account!", response.status, response.statusText); - if (response.status === 404) { - return [ undefined, this.ERR_USERNAME_NOT_FOUND ]; - } + if (response.status === 404) { + return [undefined, this.ERR_USERNAME_NOT_FOUND]; } } catch (err) { console.warn("Could not find account!", err); } - return [ undefined, this.ERR_GENERIC ]; + return [undefined, this.ERR_GENERIC]; } } diff --git a/src/plugins/api/pokerogue-api.ts b/src/plugins/api/pokerogue-api.ts index 92d0ff1bbbb..c6dfae019a5 100644 --- a/src/plugins/api/pokerogue-api.ts +++ b/src/plugins/api/pokerogue-api.ts @@ -48,9 +48,8 @@ export class PokerogueApi extends ApiBase { const response = await this.doPost("/auth/discord/logout"); if (response.ok) { return true; - } else { - console.warn(`Discord unlink failed (${response.status}: ${response.statusText})`); } + console.warn(`Discord unlink failed (${response.status}: ${response.statusText})`); } catch (err) { console.warn("Could not unlink Discord!", err); } @@ -67,9 +66,8 @@ export class PokerogueApi extends ApiBase { const response = await this.doPost("/auth/google/logout"); if (response.ok) { return true; - } else { - console.warn(`Google unlink failed (${response.status}: ${response.statusText})`); } + console.warn(`Google unlink failed (${response.status}: ${response.statusText})`); } catch (err) { console.warn("Could not unlink Google!", err); } diff --git a/src/plugins/api/pokerogue-savedata-api.ts b/src/plugins/api/pokerogue-savedata-api.ts index 184bfbb4bdb..b8531e82d4f 100644 --- a/src/plugins/api/pokerogue-savedata-api.ts +++ b/src/plugins/api/pokerogue-savedata-api.ts @@ -29,7 +29,7 @@ export class PokerogueSavedataApi extends ApiBase { public async updateAll(bodyData: UpdateAllSavedataRequest) { try { const rawBodyData = JSON.stringify(bodyData, (_k: any, v: any) => - typeof v === "bigint" ? (v <= MAX_INT_ATTR_VALUE ? Number(v) : v.toString()) : v + typeof v === "bigint" ? (v <= MAX_INT_ATTR_VALUE ? Number(v) : v.toString()) : v, ); const response = await this.doPost("/savedata/updateall", rawBodyData); return await response.text(); diff --git a/src/plugins/api/pokerogue-session-savedata-api.ts b/src/plugins/api/pokerogue-session-savedata-api.ts index 44a7b463849..e703d55a242 100644 --- a/src/plugins/api/pokerogue-session-savedata-api.ts +++ b/src/plugins/api/pokerogue-session-savedata-api.ts @@ -82,9 +82,8 @@ export class PokerogueSessionSavedataApi extends ApiBase { if (response.ok) { return null; - } else { - return await response.text(); } + return await response.text(); } catch (err) { console.warn("Could not delete session savedata!", err); return "Unknown error"; diff --git a/src/plugins/cache-busted-loader-plugin.ts b/src/plugins/cache-busted-loader-plugin.ts index 344da3eaa66..e5b1abb5903 100644 --- a/src/plugins/cache-busted-loader-plugin.ts +++ b/src/plugins/cache-busted-loader-plugin.ts @@ -15,7 +15,7 @@ export default class CacheBustedLoaderPlugin extends Phaser.Loader.LoaderPlugin addFile(file): void { if (!Array.isArray(file)) { - file = [ file ]; + file = [file]; } file.forEach(item => { diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 904b51c6dc7..92b0e15dbb9 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,4 +1,4 @@ -import { camelCaseToKebabCase, } from "#app/utils"; +import { camelCaseToKebabCase } from "#app/utils"; import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import HttpBackend from "i18next-http-backend"; @@ -8,9 +8,9 @@ import pkg from "../../package.json"; //#region Interfaces/Types interface LoadingFontFaceProperty { - face: FontFace, - extraOptions?: { [key:string]: any }, - only?: Array + face: FontFace; + extraOptions?: { [key: string]: any }; + only?: Array; } //#region Constants @@ -23,52 +23,70 @@ const unicodeRanges = { kana: "U+3040-30FF", CJKCommon: "U+2E80-2EFF,U+3000-303F,U+31C0-31EF,U+3200-32FF,U+3400-4DBF,U+F900-FAFF,U+FE30-FE4F", CJKIdeograph: "U+4E00-9FFF", - specialCharacters: "U+266A,U+2605,U+2665,U+2663" //♪.★,♥,♣ + specialCharacters: "U+266A,U+2605,U+2665,U+2663", //♪.★,♥,♣ }; const rangesByLanguage = { - korean: [ unicodeRanges.CJKCommon, unicodeRanges.hangul ].join(","), - chinese: [ unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.CJKIdeograph ].join(","), - japanese: [ unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.kana, unicodeRanges.CJKIdeograph ].join(",") + korean: [unicodeRanges.CJKCommon, unicodeRanges.hangul].join(","), + chinese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.CJKIdeograph].join(","), + japanese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.kana, unicodeRanges.CJKIdeograph].join( + ",", + ), }; const fonts: Array = [ // unicode (special character from PokePT) { - face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: unicodeRanges.specialCharacters, + }), }, { - face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: unicodeRanges.specialCharacters, + }), extraOptions: { sizeAdjust: "133%" }, }, // unicode (korean) { - face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: rangesByLanguage.korean, + }), }, { - face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: rangesByLanguage.korean, + }), extraOptions: { sizeAdjust: "133%" }, }, // unicode (chinese) { - face: new FontFace("emerald", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + face: new FontFace("emerald", "url(./fonts/unifont-15.1.05.subset.woff2)", { + unicodeRange: rangesByLanguage.chinese, + }), extraOptions: { sizeAdjust: "70%", format: "woff2" }, - only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + only: ["en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca"], }, { - face: new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + face: new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.subset.woff2)", { + unicodeRange: rangesByLanguage.chinese, + }), extraOptions: { format: "woff2" }, - only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + only: ["en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca"], }, // japanese { - face: new FontFace("emerald", "url(./fonts/Galmuri11.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), + face: new FontFace("emerald", "url(./fonts/Galmuri11.subset.woff2)", { + unicodeRange: rangesByLanguage.japanese, + }), extraOptions: { sizeAdjust: "66%" }, - only: [ "ja" ], + only: ["ja"], }, { - face: new FontFace("pkmnems", "url(./fonts/Galmuri9.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), - only: [ "ja" ], + face: new FontFace("pkmnems", "url(./fonts/Galmuri9.subset.woff2)", { + unicodeRange: rangesByLanguage.japanese, + }), + only: ["ja"], }, ]; @@ -91,7 +109,7 @@ async function initFonts(language: string | undefined) { const results = await Promise.allSettled( fonts .filter(font => !font.only || font.only.some(exclude => language?.indexOf(exclude) === 0)) - .map(font => Object.assign(font.face, font.extraOptions ?? {}).load()) + .map(font => Object.assign(font.face, font.extraOptions ?? {}).load()), ); for (const result of results) { if (result.status === "fulfilled") { @@ -111,7 +129,7 @@ async function initFonts(language: string | undefined) { * @returns a money formatted string */ function i18nMoneyFormatter(amount: any): string { - if (isNaN(Number(amount))) { + if (Number.isNaN(Number(amount))) { console.warn(`i18nMoneyFormatter: value "${amount}" is not a number!`); } @@ -153,9 +171,9 @@ export async function initI18n(): Promise { i18next.use(new KoreanPostpositionProcessor()); await i18next.init({ fallbackLng: "en", - supportedLngs: [ "en", "es-ES", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES" ], + supportedLngs: ["en", "es-ES", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES"], backend: { - loadPath(lng: string, [ ns ]: string[]) { + loadPath(lng: string, [ns]: string[]) { let fileName: string; if (namespaceMap[ns]) { fileName = namespaceMap[ns]; @@ -261,16 +279,15 @@ export async function initI18n(): Promise { "mysteryEncounterMessages", ], detection: { - lookupLocalStorage: "prLang" + lookupLocalStorage: "prLang", }, debug: Number(import.meta.env.VITE_I18N_DEBUG) === 1, interpolation: { escapeValue: false, }, - postProcess: [ "korean-postposition" ], + postProcess: ["korean-postposition"], }); - if (i18next.services.formatter) { i18next.services.formatter.add("money", i18nMoneyFormatter); } diff --git a/src/plugins/vite/vite-minify-json-plugin.ts b/src/plugins/vite/vite-minify-json-plugin.ts index a638271562f..f14fdf7042d 100644 --- a/src/plugins/vite/vite-minify-json-plugin.ts +++ b/src/plugins/vite/vite-minify-json-plugin.ts @@ -1,6 +1,6 @@ import path from "path"; import fs from "fs"; -import { type Plugin as VitePlugin } from "vite"; +import type { Plugin as VitePlugin } from "vite"; /** * Crawl a directory (recursively if wanted) for json files and minifies found ones. @@ -8,7 +8,7 @@ import { type Plugin as VitePlugin } from "vite"; * @param recursive if true, will crawl subdirectories */ function applyToDir(dir: string, recursive?: boolean) { - const files = fs.readdirSync(dir).filter((file) => !/^\..*/.test(file)); + const files = fs.readdirSync(dir).filter(file => !/^\..*/.test(file)); for (const file of files) { const filePath = path.join(dir, file); @@ -41,9 +41,9 @@ export function minifyJsonPlugin(basePath: string | string[], recursive?: boolea }, async closeBundle() { console.log("Minifying JSON files..."); - const basePathes = Array.isArray(basePath) ? basePath : [ basePath ]; + const basePathes = Array.isArray(basePath) ? basePath : [basePath]; - basePathes.forEach((basePath) => { + basePathes.forEach(basePath => { const baseDir = path.resolve(buildDir, basePath); if (fs.existsSync(baseDir)) { applyToDir(baseDir, recursive); diff --git a/src/scene-base.ts b/src/scene-base.ts index c6ca9bb8ba2..430a9bc8aac 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -12,11 +12,8 @@ export class SceneBase extends Phaser.Scene { */ public readonly scaledCanvas = { width: 1920 / 6, - height: 1080 / 6 + height: 1080 / 6, }; - constructor(config?: string | Phaser.Types.Scenes.SettingsConfig) { - super(config); - } getCachedUrl(url: string): string { const manifest = this.game["manifest"]; @@ -45,11 +42,17 @@ export class SceneBase extends Phaser.Scene { if (!filename) { filename = `${key}.png`; } - this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { + frameWidth: size, + frameHeight: size, + }); if (folder.startsWith("ui")) { legacyCompatibleImages.push(key); folder = folder.replace("ui", "ui/legacy"); - this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { + frameWidth: size, + frameHeight: size, + }); } } @@ -60,11 +63,19 @@ export class SceneBase extends Phaser.Scene { if (folder) { folder += "/"; } - this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`)); + this.load.atlas( + key, + this.getCachedUrl(`images/${folder}${filenameRoot}.png`), + this.getCachedUrl(`images/${folder}${filenameRoot}.json`), + ); if (folder.startsWith("ui")) { legacyCompatibleImages.push(key); folder = folder.replace("ui", "ui/legacy"); - this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`)); + this.load.atlas( + `${key}_legacy`, + this.getCachedUrl(`images/${folder}${filenameRoot}.png`), + this.getCachedUrl(`images/${folder}${filenameRoot}.json`), + ); } } @@ -78,7 +89,7 @@ export class SceneBase extends Phaser.Scene { folder += "/"; } if (!Array.isArray(filenames)) { - filenames = [ filenames ]; + filenames = [filenames]; } for (const f of filenames as string[]) { this.load.audio(folder + key, this.getCachedUrl(`audio/${folder}${f}`)); diff --git a/src/system/achv.ts b/src/system/achv.ts index bd9348a52bf..bd8595b2f94 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -5,7 +5,13 @@ import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; import type { Challenge } from "#app/data/challenge"; -import { FlipStatChallenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge, InverseBattleChallenge } from "#app/data/challenge"; +import { + FlipStatChallenge, + FreshStartChallenge, + SingleGenerationChallenge, + SingleTypeChallenge, + InverseBattleChallenge, +} from "#app/data/challenge"; import type { ConditionFn } from "#app/@types/common"; import { Stat, getShortenedStatKey } from "#app/enums/stat"; import { Challenges } from "#app/enums/challenges"; @@ -16,7 +22,7 @@ export enum AchvTier { GREAT, ULTRA, ROGUE, - MASTER + MASTER, } export class Achv { @@ -33,7 +39,14 @@ export class Achv { private conditionFunc: ConditionFn | undefined; - constructor(localizationKey:string, name: string, description: string, iconImage: string, score: number, conditionFunc?: ConditionFn) { + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + conditionFunc?: ConditionFn, + ) { this.name = name; this.description = description; this.iconImage = iconImage; @@ -50,7 +63,9 @@ export class Achv { getName(playerGender: PlayerGender = PlayerGender.UNSET): string { const genderStr = PlayerGender[playerGender].toLowerCase(); // Localization key is used to get the name of the achievement - return i18next.t(`achv:${this.localizationKey}.name`, { context: genderStr }); + return i18next.t(`achv:${this.localizationKey}.name`, { + context: genderStr, + }); } getDescription(): string { @@ -101,7 +116,14 @@ export class RibbonAchv extends Achv { ribbonAmount: number; constructor(localizationKey: string, name: string, ribbonAmount: number, iconImage: string, score: number) { - super(localizationKey, name, "", iconImage, score, (_args: any[]) => globalScene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount); + super( + localizationKey, + name, + "", + iconImage, + score, + (_args: any[]) => globalScene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount, + ); this.ribbonAmount = ribbonAmount; } } @@ -110,7 +132,14 @@ export class DamageAchv extends Achv { damageAmount: number; constructor(localizationKey: string, name: string, damageAmount: number, iconImage: string, score: number) { - super(localizationKey, name, "", iconImage, score, (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.damageAmount); + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.damageAmount, + ); this.damageAmount = damageAmount; } } @@ -119,7 +148,14 @@ export class HealAchv extends Achv { healAmount: number; constructor(localizationKey: string, name: string, healAmount: number, iconImage: string, score: number) { - super(localizationKey, name, "", iconImage, score, (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.healAmount); + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.healAmount, + ); this.healAmount = healAmount; } } @@ -128,24 +164,44 @@ export class LevelAchv extends Achv { level: number; constructor(localizationKey: string, name: string, level: number, iconImage: string, score: number) { - super(localizationKey, name, "", iconImage, score, (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.level); + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.level, + ); this.level = level; } } export class ModifierAchv extends Achv { - constructor(localizationKey: string, name: string, description: string, iconImage: string, score: number, modifierFunc: (modifier: Modifier) => boolean) { - super(localizationKey, name, description, iconImage, score, (args: any[]) => modifierFunc((args[0] as Modifier))); + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + modifierFunc: (modifier: Modifier) => boolean, + ) { + super(localizationKey, name, description, iconImage, score, (args: any[]) => modifierFunc(args[0] as Modifier)); } } export class ChallengeAchv extends Achv { - constructor(localizationKey: string, name: string, description: string, iconImage: string, score: number, challengeFunc: (challenge: Challenge) => boolean) { + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + challengeFunc: (challenge: Challenge) => boolean, + ) { super(localizationKey, name, description, iconImage, score, (args: any[]) => challengeFunc(args[0] as Challenge)); } } - /** * Get the description of an achievement from the localization file with all the necessary variables filled in * @param localizationKey The localization key of the achievement @@ -158,49 +214,117 @@ export function getAchievementDescription(localizationKey: string): string { switch (localizationKey) { case "10K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._10K_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "100K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._100K_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "1M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._1M_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "10M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._10M_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "250_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._250_DMG.damageAmount.toLocaleString("en-US"), + }); case "1000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._1000_DMG.damageAmount.toLocaleString("en-US"), + }); case "2500_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._2500_DMG.damageAmount.toLocaleString("en-US"), + }); case "10000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._10000_DMG.damageAmount.toLocaleString("en-US"), + }); case "250_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._250_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._250_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "1000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._1000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._1000_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "2500_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._2500_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._2500_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "10000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._10000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._10000_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "LV_100": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_100.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_100.level, + }); case "LV_250": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_250.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_250.level, + }); case "LV_1000": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_1000.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_1000.level, + }); case "10_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "25_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "50_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "75_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "100_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "TRANSFER_MAX_STAT_STAGE": - return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { context: genderStr }); + return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { + context: genderStr, + }); case "MAX_FRIENDSHIP": - return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr }); + return i18next.t("achv:MAX_FRIENDSHIP.description", { + context: genderStr, + }); case "MEGA_EVOLVE": return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); case "GIGANTAMAX": @@ -208,55 +332,89 @@ export function getAchievementDescription(localizationKey: string): string { case "TERASTALLIZE": return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); case "STELLAR_TERASTALLIZE": - return i18next.t("achv:STELLAR_TERASTALLIZE.description", { context: genderStr }); + return i18next.t("achv:STELLAR_TERASTALLIZE.description", { + context: genderStr, + }); case "SPLICE": return i18next.t("achv:SPLICE.description", { context: genderStr }); case "MINI_BLACK_HOLE": - return i18next.t("achv:MINI_BLACK_HOLE.description", { context: genderStr }); + return i18next.t("achv:MINI_BLACK_HOLE.description", { + context: genderStr, + }); case "CATCH_MYTHICAL": - return i18next.t("achv:CATCH_MYTHICAL.description", { context: genderStr }); + return i18next.t("achv:CATCH_MYTHICAL.description", { + context: genderStr, + }); case "CATCH_SUB_LEGENDARY": - return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { + context: genderStr, + }); case "CATCH_LEGENDARY": - return i18next.t("achv:CATCH_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:CATCH_LEGENDARY.description", { + context: genderStr, + }); case "SEE_SHINY": return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); case "SHINY_PARTY": return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); case "HATCH_MYTHICAL": - return i18next.t("achv:HATCH_MYTHICAL.description", { context: genderStr }); + return i18next.t("achv:HATCH_MYTHICAL.description", { + context: genderStr, + }); case "HATCH_SUB_LEGENDARY": - return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { + context: genderStr, + }); case "HATCH_LEGENDARY": - return i18next.t("achv:HATCH_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:HATCH_LEGENDARY.description", { + context: genderStr, + }); case "HATCH_SHINY": return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); case "HIDDEN_ABILITY": - return i18next.t("achv:HIDDEN_ABILITY.description", { context: genderStr }); + return i18next.t("achv:HIDDEN_ABILITY.description", { + context: genderStr, + }); case "PERFECT_IVS": return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); case "CLASSIC_VICTORY": - return i18next.t("achv:CLASSIC_VICTORY.description", { context: genderStr }); + return i18next.t("achv:CLASSIC_VICTORY.description", { + context: genderStr, + }); case "UNEVOLVED_CLASSIC_VICTORY": - return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { context: genderStr }); + return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { + context: genderStr, + }); case "MONO_GEN_ONE": return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); case "MONO_GEN_TWO": return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); case "MONO_GEN_THREE": - return i18next.t("achv:MONO_GEN_THREE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_THREE.description", { + context: genderStr, + }); case "MONO_GEN_FOUR": - return i18next.t("achv:MONO_GEN_FOUR.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_FOUR.description", { + context: genderStr, + }); case "MONO_GEN_FIVE": - return i18next.t("achv:MONO_GEN_FIVE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_FIVE.description", { + context: genderStr, + }); case "MONO_GEN_SIX": return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); case "MONO_GEN_SEVEN": - return i18next.t("achv:MONO_GEN_SEVEN.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_SEVEN.description", { + context: genderStr, + }); case "MONO_GEN_EIGHT": - return i18next.t("achv:MONO_GEN_EIGHT.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_EIGHT.description", { + context: genderStr, + }); case "MONO_GEN_NINE": - return i18next.t("achv:MONO_GEN_NINE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_NINE.description", { + context: genderStr, + }); case "MONO_NORMAL": case "MONO_FIGHTING": case "MONO_FLYING": @@ -275,21 +433,27 @@ export function getAchievementDescription(localizationKey: string): string { case "MONO_DRAGON": case "MONO_DARK": case "MONO_FAIRY": - return i18next.t("achv:MonoType.description", { context: genderStr, "type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`) }); + return i18next.t("achv:MonoType.description", { + context: genderStr, + type: i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`), + }); case "FRESH_START": return i18next.t("achv:FRESH_START.description", { context: genderStr }); case "INVERSE_BATTLE": - return i18next.t("achv:INVERSE_BATTLE.description", { context: genderStr }); + return i18next.t("achv:INVERSE_BATTLE.description", { + context: genderStr, + }); case "FLIP_STATS": return i18next.t("achv:FLIP_STATS.description", { context: genderStr }); case "FLIP_INVERSE": return i18next.t("achv:FLIP_INVERSE.description", { context: genderStr }); case "BREEDERS_IN_SPACE": - return i18next.t("achv:BREEDERS_IN_SPACE.description", { context: genderStr }); + return i18next.t("achv:BREEDERS_IN_SPACE.description", { + context: genderStr, + }); default: return ""; } - } export const achvs = { @@ -313,58 +477,451 @@ export const achvs = { _50_RIBBONS: new RibbonAchv("50_RIBBONS", "", 50, "ultra_ribbon", 50).setSecret(true), _75_RIBBONS: new RibbonAchv("75_RIBBONS", "", 75, "rogue_ribbon", 75).setSecret(true), _100_RIBBONS: new RibbonAchv("100_RIBBONS", "", 100, "master_ribbon", 100).setSecret(true), - TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20), + TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20), MAX_FRIENDSHIP: new Achv("MAX_FRIENDSHIP", "", "MAX_FRIENDSHIP.description", "soothe_bell", 25), MEGA_EVOLVE: new Achv("MEGA_EVOLVE", "", "MEGA_EVOLVE.description", "mega_bracelet", 50), GIGANTAMAX: new Achv("GIGANTAMAX", "", "GIGANTAMAX.description", "dynamax_band", 50), - TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), - STELLAR_TERASTALLIZE: new Achv("STELLAR_TERASTALLIZE", "", "STELLAR_TERASTALLIZE.description", "stellar_tera_shard", 25).setSecret(true), - SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), - MINI_BLACK_HOLE: new ModifierAchv("MINI_BLACK_HOLE", "", "MINI_BLACK_HOLE.description", "mini_black_hole", 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), - CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), - CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), + TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), + STELLAR_TERASTALLIZE: new Achv( + "STELLAR_TERASTALLIZE", + "", + "STELLAR_TERASTALLIZE.description", + "stellar_tera_shard", + 25, + ).setSecret(true), + SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), + MINI_BLACK_HOLE: new ModifierAchv( + "MINI_BLACK_HOLE", + "", + "MINI_BLACK_HOLE.description", + "mini_black_hole", + 25, + modifier => modifier instanceof TurnHeldItemTransferModifier, + ).setSecret(), + CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), + CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), CATCH_LEGENDARY: new Achv("CATCH_LEGENDARY", "", "CATCH_LEGENDARY.description", "mb", 100).setSecret(), SEE_SHINY: new Achv("SEE_SHINY", "", "SEE_SHINY.description", "pb_gold", 75), SHINY_PARTY: new Achv("SHINY_PARTY", "", "SHINY_PARTY.description", "shiny_charm", 100).setSecret(true), HATCH_MYTHICAL: new Achv("HATCH_MYTHICAL", "", "HATCH_MYTHICAL.description", "mystery_egg", 75).setSecret(), - HATCH_SUB_LEGENDARY: new Achv("HATCH_SUB_LEGENDARY", "", "HATCH_SUB_LEGENDARY.description", "oval_stone", 100).setSecret(), - HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), - HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(), - HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75), - PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100), - CLASSIC_VICTORY: new Achv("CLASSIC_VICTORY", "", "CLASSIC_VICTORY.description", "relic_crown", 150, (_) => globalScene.gameData.gameStats.sessionsWon === 0), - UNEVOLVED_CLASSIC_VICTORY: new Achv("UNEVOLVED_CLASSIC_VICTORY", "", "UNEVOLVED_CLASSIC_VICTORY.description", "eviolite", 175, (_) => globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)), - MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE", "", "MONO_GEN_ONE.description", "ribbon_gen1", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 1 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO", "", "MONO_GEN_TWO.description", "ribbon_gen2", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 2 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE", "", "MONO_GEN_THREE.description", "ribbon_gen3", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 3 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR", "", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 4 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE", "", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 5 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX", "", "MONO_GEN_SIX.description", "ribbon_gen6", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 6 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN", "", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 7 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT", "", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 8 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE", "", "MONO_GEN_NINE.description", "ribbon_gen9", 100, (c) => c instanceof SingleGenerationChallenge && c.value === 9 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_NORMAL: new ChallengeAchv("MONO_NORMAL", "", "MONO_NORMAL.description", "silk_scarf", 100, (c) => c instanceof SingleTypeChallenge && c.value === 1 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING", "", "MONO_FIGHTING.description", "black_belt", 100, (c) => c instanceof SingleTypeChallenge && c.value === 2 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_FLYING: new ChallengeAchv("MONO_FLYING", "", "MONO_FLYING.description", "sharp_beak", 100, (c) => c instanceof SingleTypeChallenge && c.value === 3 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_POISON: new ChallengeAchv("MONO_POISON", "", "MONO_POISON.description", "poison_barb", 100, (c) => c instanceof SingleTypeChallenge && c.value === 4 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GROUND: new ChallengeAchv("MONO_GROUND", "", "MONO_GROUND.description", "soft_sand", 100, (c) => c instanceof SingleTypeChallenge && c.value === 5 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_ROCK: new ChallengeAchv("MONO_ROCK", "", "MONO_ROCK.description", "hard_stone", 100, (c) => c instanceof SingleTypeChallenge && c.value === 6 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_BUG: new ChallengeAchv("MONO_BUG", "", "MONO_BUG.description", "silver_powder", 100, (c) => c instanceof SingleTypeChallenge && c.value === 7 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GHOST: new ChallengeAchv("MONO_GHOST", "", "MONO_GHOST.description", "spell_tag", 100, (c) => c instanceof SingleTypeChallenge && c.value === 8 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_STEEL: new ChallengeAchv("MONO_STEEL", "", "MONO_STEEL.description", "metal_coat", 100, (c) => c instanceof SingleTypeChallenge && c.value === 9 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_FIRE: new ChallengeAchv("MONO_FIRE", "", "MONO_FIRE.description", "charcoal", 100, (c) => c instanceof SingleTypeChallenge && c.value === 10 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_WATER: new ChallengeAchv("MONO_WATER", "", "MONO_WATER.description", "mystic_water", 100, (c) => c instanceof SingleTypeChallenge && c.value === 11 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_GRASS: new ChallengeAchv("MONO_GRASS", "", "MONO_GRASS.description", "miracle_seed", 100, (c) => c instanceof SingleTypeChallenge && c.value === 12 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_ELECTRIC: new ChallengeAchv("MONO_ELECTRIC", "", "MONO_ELECTRIC.description", "magnet", 100, (c) => c instanceof SingleTypeChallenge && c.value === 13 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_PSYCHIC: new ChallengeAchv("MONO_PSYCHIC", "", "MONO_PSYCHIC.description", "twisted_spoon", 100, (c) => c instanceof SingleTypeChallenge && c.value === 14 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_ICE: new ChallengeAchv("MONO_ICE", "", "MONO_ICE.description", "never_melt_ice", 100, (c) => c instanceof SingleTypeChallenge && c.value === 15 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_DRAGON: new ChallengeAchv("MONO_DRAGON", "", "MONO_DRAGON.description", "dragon_fang", 100, (c) => c instanceof SingleTypeChallenge && c.value === 16 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_DARK: new ChallengeAchv("MONO_DARK", "", "MONO_DARK.description", "black_glasses", 100, (c) => c instanceof SingleTypeChallenge && c.value === 17 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - MONO_FAIRY: new ChallengeAchv("MONO_FAIRY", "", "MONO_FAIRY.description", "fairy_feather", 100, (c) => c instanceof SingleTypeChallenge && c.value === 18 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - FRESH_START: new ChallengeAchv("FRESH_START", "", "FRESH_START.description", "reviver_seed", 100, (c) => c instanceof FreshStartChallenge && c.value > 0 && !globalScene.gameMode.challenges.some(c => [ Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT ].includes(c.id) && c.value > 0)), - INVERSE_BATTLE: new ChallengeAchv("INVERSE_BATTLE", "", "INVERSE_BATTLE.description", "inverse", 100, (c) => c instanceof InverseBattleChallenge && c.value > 0), - FLIP_STATS: new ChallengeAchv("FLIP_STATS", "", "FLIP_STATS.description", "dubious_disc", 100, (c) => c instanceof FlipStatChallenge && c.value > 0), - FLIP_INVERSE: new ChallengeAchv("FLIP_INVERSE", "", "FLIP_INVERSE.description", "cracked_pot", 100, (c) => c instanceof FlipStatChallenge && c.value > 0 && globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)).setSecret(), + HATCH_SUB_LEGENDARY: new Achv( + "HATCH_SUB_LEGENDARY", + "", + "HATCH_SUB_LEGENDARY.description", + "oval_stone", + 100, + ).setSecret(), + HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), + HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(), + HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75), + PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100), + CLASSIC_VICTORY: new Achv( + "CLASSIC_VICTORY", + "", + "CLASSIC_VICTORY.description", + "relic_crown", + 150, + _ => globalScene.gameData.gameStats.sessionsWon === 0, + ), + UNEVOLVED_CLASSIC_VICTORY: new Achv( + "UNEVOLVED_CLASSIC_VICTORY", + "", + "UNEVOLVED_CLASSIC_VICTORY.description", + "eviolite", + 175, + _ => globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions), + ), + MONO_GEN_ONE_VICTORY: new ChallengeAchv( + "MONO_GEN_ONE", + "", + "MONO_GEN_ONE.description", + "ribbon_gen1", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 1 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_TWO_VICTORY: new ChallengeAchv( + "MONO_GEN_TWO", + "", + "MONO_GEN_TWO.description", + "ribbon_gen2", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 2 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_THREE_VICTORY: new ChallengeAchv( + "MONO_GEN_THREE", + "", + "MONO_GEN_THREE.description", + "ribbon_gen3", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 3 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_FOUR_VICTORY: new ChallengeAchv( + "MONO_GEN_FOUR", + "", + "MONO_GEN_FOUR.description", + "ribbon_gen4", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 4 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_FIVE_VICTORY: new ChallengeAchv( + "MONO_GEN_FIVE", + "", + "MONO_GEN_FIVE.description", + "ribbon_gen5", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 5 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_SIX_VICTORY: new ChallengeAchv( + "MONO_GEN_SIX", + "", + "MONO_GEN_SIX.description", + "ribbon_gen6", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 6 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_SEVEN_VICTORY: new ChallengeAchv( + "MONO_GEN_SEVEN", + "", + "MONO_GEN_SEVEN.description", + "ribbon_gen7", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 7 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_EIGHT_VICTORY: new ChallengeAchv( + "MONO_GEN_EIGHT", + "", + "MONO_GEN_EIGHT.description", + "ribbon_gen8", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 8 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_NINE_VICTORY: new ChallengeAchv( + "MONO_GEN_NINE", + "", + "MONO_GEN_NINE.description", + "ribbon_gen9", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 9 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_NORMAL: new ChallengeAchv( + "MONO_NORMAL", + "", + "MONO_NORMAL.description", + "silk_scarf", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 1 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FIGHTING: new ChallengeAchv( + "MONO_FIGHTING", + "", + "MONO_FIGHTING.description", + "black_belt", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 2 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FLYING: new ChallengeAchv( + "MONO_FLYING", + "", + "MONO_FLYING.description", + "sharp_beak", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 3 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_POISON: new ChallengeAchv( + "MONO_POISON", + "", + "MONO_POISON.description", + "poison_barb", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 4 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GROUND: new ChallengeAchv( + "MONO_GROUND", + "", + "MONO_GROUND.description", + "soft_sand", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 5 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ROCK: new ChallengeAchv( + "MONO_ROCK", + "", + "MONO_ROCK.description", + "hard_stone", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 6 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_BUG: new ChallengeAchv( + "MONO_BUG", + "", + "MONO_BUG.description", + "silver_powder", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 7 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GHOST: new ChallengeAchv( + "MONO_GHOST", + "", + "MONO_GHOST.description", + "spell_tag", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 8 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_STEEL: new ChallengeAchv( + "MONO_STEEL", + "", + "MONO_STEEL.description", + "metal_coat", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 9 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FIRE: new ChallengeAchv( + "MONO_FIRE", + "", + "MONO_FIRE.description", + "charcoal", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 10 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_WATER: new ChallengeAchv( + "MONO_WATER", + "", + "MONO_WATER.description", + "mystic_water", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 11 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GRASS: new ChallengeAchv( + "MONO_GRASS", + "", + "MONO_GRASS.description", + "miracle_seed", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 12 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ELECTRIC: new ChallengeAchv( + "MONO_ELECTRIC", + "", + "MONO_ELECTRIC.description", + "magnet", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 13 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_PSYCHIC: new ChallengeAchv( + "MONO_PSYCHIC", + "", + "MONO_PSYCHIC.description", + "twisted_spoon", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 14 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ICE: new ChallengeAchv( + "MONO_ICE", + "", + "MONO_ICE.description", + "never_melt_ice", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 15 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_DRAGON: new ChallengeAchv( + "MONO_DRAGON", + "", + "MONO_DRAGON.description", + "dragon_fang", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 16 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_DARK: new ChallengeAchv( + "MONO_DARK", + "", + "MONO_DARK.description", + "black_glasses", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 17 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FAIRY: new ChallengeAchv( + "MONO_FAIRY", + "", + "MONO_FAIRY.description", + "fairy_feather", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 18 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + FRESH_START: new ChallengeAchv( + "FRESH_START", + "", + "FRESH_START.description", + "reviver_seed", + 100, + c => + c instanceof FreshStartChallenge && + c.value > 0 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + INVERSE_BATTLE: new ChallengeAchv( + "INVERSE_BATTLE", + "", + "INVERSE_BATTLE.description", + "inverse", + 100, + c => c instanceof InverseBattleChallenge && c.value > 0, + ), + FLIP_STATS: new ChallengeAchv( + "FLIP_STATS", + "", + "FLIP_STATS.description", + "dubious_disc", + 100, + c => c instanceof FlipStatChallenge && c.value > 0, + ), + FLIP_INVERSE: new ChallengeAchv( + "FLIP_INVERSE", + "", + "FLIP_INVERSE.description", + "cracked_pot", + 100, + c => + c instanceof FlipStatChallenge && + c.value > 0 && + globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0), + ).setSecret(), BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(), }; diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 518acb55c89..07396b31d1b 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -13,10 +13,18 @@ export default class ArenaData { public playerTerasUsed: number; constructor(source: Arena | any) { - const sourceArena = source instanceof Arena ? source as Arena : null; + const sourceArena = source instanceof Arena ? (source as Arena) : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; - this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; - this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.weather = sourceArena + ? sourceArena.weather + : source.weather + ? new Weather(source.weather.weatherType, source.weather.turnsLeft) + : null; + this.terrain = sourceArena + ? sourceArena.terrain + : source.terrain + ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) + : null; this.playerTerasUsed = (sourceArena ? sourceArena.playerTerasUsed : source.playerTerasUsed) ?? 0; this.tags = []; diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index 8296c2da98e..8fb8335bcf7 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -17,9 +17,9 @@ export default class EggData { public overrideHiddenAbility: boolean; constructor(source: Egg | any) { - const sourceEgg = source instanceof Egg ? source as Egg : null; + const sourceEgg = source instanceof Egg ? (source as Egg) : null; this.id = sourceEgg ? sourceEgg.id : source.id; - this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); + this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); // legacy egg if (source.species === 0) { // check if it has a gachaType (deprecated) @@ -39,11 +39,25 @@ export default class EggData { toEgg(): Egg { // Species will be 0 if an old legacy is loaded from DB if (!this.species) { - return new Egg({ id: this.id, hatchWaves: this.hatchWaves, sourceType: this.sourceType, timestamp: this.timestamp, tier: Math.floor(this.id / EGG_SEED) }); - } else { - return new Egg({ id: this.id, tier: this.tier, sourceType: this.sourceType, hatchWaves: this.hatchWaves, - timestamp: this.timestamp, variantTier: this.variantTier, isShiny: this.isShiny, species: this.species, - eggMoveIndex: this.eggMoveIndex, overrideHiddenAbility: this.overrideHiddenAbility }); + return new Egg({ + id: this.id, + hatchWaves: this.hatchWaves, + sourceType: this.sourceType, + timestamp: this.timestamp, + tier: Math.floor(this.id / EGG_SEED), + }); } + return new Egg({ + id: this.id, + tier: this.tier, + sourceType: this.sourceType, + hatchWaves: this.hatchWaves, + timestamp: this.timestamp, + variantTier: this.variantTier, + isShiny: this.isShiny, + species: this.species, + eggMoveIndex: this.eggMoveIndex, + overrideHiddenAbility: this.overrideHiddenAbility, + }); } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 4f6cb0aed93..82ad2276fef 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -50,7 +50,11 @@ import { WeatherType } from "#enums/weather-type"; import { TerrainType } from "#app/data/terrain"; import { ReloadSessionPhase } from "#app/phases/reload-session-phase"; import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler"; -import { applySessionVersionMigration, applySystemVersionMigration, applySettingsVersionMigration } from "./version_migration/version_converter"; +import { + applySessionVersionMigration, + applySystemVersionMigration, + applySettingsVersionMigration, +} from "./version_migration/version_converter"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; @@ -59,20 +63,38 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { PokemonType } from "#enums/pokemon-type"; export const defaultStarterSpecies: Species[] = [ - Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, - Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, - Species.TREECKO, Species.TORCHIC, Species.MUDKIP, - Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, - Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, - Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, - Species.ROWLET, Species.LITTEN, Species.POPPLIO, - Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, - Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.CHIKORITA, + Species.CYNDAQUIL, + Species.TOTODILE, + Species.TREECKO, + Species.TORCHIC, + Species.MUDKIP, + Species.TURTWIG, + Species.CHIMCHAR, + Species.PIPLUP, + Species.SNIVY, + Species.TEPIG, + Species.OSHAWOTT, + Species.CHESPIN, + Species.FENNEKIN, + Species.FROAKIE, + Species.ROWLET, + Species.LITTEN, + Species.POPPLIO, + Species.GROOKEY, + Species.SCORBUNNY, + Species.SOBBLE, + Species.SPRIGATITO, + Species.FUECOCO, + Species.QUAXLY, ]; const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary -export function getDataTypeKey(dataType: GameDataType, slotId: number = 0): string { +export function getDataTypeKey(dataType: GameDataType, slotId = 0): string { switch (dataType) { case GameDataType.SYSTEM: return "data"; @@ -94,15 +116,15 @@ export function getDataTypeKey(dataType: GameDataType, slotId: number = 0): stri } export function encrypt(data: string, bypassLogin: boolean): string { - return (bypassLogin - ? (data: string) => btoa(data) - : (data: string) => AES.encrypt(data, saveKey))(data) as unknown as string; // TODO: is this correct? + return (bypassLogin ? (data: string) => btoa(data) : (data: string) => AES.encrypt(data, saveKey))( + data, + ) as unknown as string; // TODO: is this correct? } export function decrypt(data: string, bypassLogin: boolean): string { - return (bypassLogin - ? (data: string) => atob(data) - : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); + return (bypassLogin ? (data: string) => atob(data) : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))( + data, + ); } export interface SystemSaveData { @@ -154,25 +176,25 @@ interface Unlocks { } interface AchvUnlocks { - [key: string]: number + [key: string]: number; } interface VoucherUnlocks { - [key: string]: number + [key: string]: number; } export interface VoucherCounts { - [type: string]: number; + [type: string]: number; } export interface DexData { - [key: number]: DexEntry + [key: number]: DexEntry; } export interface DexEntry { seenAttr: bigint; caughtAttr: bigint; - natureAttr: number, + natureAttr: number; seenCount: number; caughtCount: number; hatchedCount: number; @@ -187,7 +209,7 @@ export const DexAttr = { DEFAULT_VARIANT: 16n, VARIANT_2: 32n, VARIANT_3: 64n, - DEFAULT_FORM: 128n + DEFAULT_FORM: 128n, }; export interface DexAttrProps { @@ -200,7 +222,7 @@ export interface DexAttrProps { export const AbilityAttr = { ABILITY_1: 1, ABILITY_2: 2, - ABILITY_HIDDEN: 4 + ABILITY_HIDDEN: 4, }; export type RunHistoryData = Record; @@ -212,14 +234,14 @@ export interface RunEntry { isFavorite: boolean; } -export type StarterMoveset = [ Moves ] | [ Moves, Moves ] | [ Moves, Moves, Moves ] | [ Moves, Moves, Moves, Moves ]; +export type StarterMoveset = [Moves] | [Moves, Moves] | [Moves, Moves, Moves] | [Moves, Moves, Moves, Moves]; export interface StarterFormMoveData { - [key: number]: StarterMoveset + [key: number]: StarterMoveset; } export interface StarterMoveData { - [key: number]: StarterMoveset | StarterFormMoveData + [key: number]: StarterMoveset | StarterFormMoveData; } export interface StarterAttributes { @@ -240,33 +262,33 @@ export interface StarterPreferences { // the latest data saved/loaded for the Starter Preferences. Required to reduce read/writes. Initialize as "{}", since this is the default value and no data needs to be stored if present. // if they ever add private static variables, move this into StarterPrefs -const StarterPrefers_DEFAULT : string = "{}"; -let StarterPrefers_private_latest : string = StarterPrefers_DEFAULT; +const StarterPrefers_DEFAULT: string = "{}"; +let StarterPrefers_private_latest: string = StarterPrefers_DEFAULT; +// called on starter selection show once +export function loadStarterPreferences(): StarterPreferences { + return JSON.parse( + (StarterPrefers_private_latest = + localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT), + ); +} + +// called on starter selection clear, always +export function saveStarterPreferences(prefs: StarterPreferences): void { + const pStr: string = JSON.stringify(prefs); + if (pStr !== StarterPrefers_private_latest) { + // something changed, store the update + localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); + // update the latest prefs + StarterPrefers_private_latest = pStr; + } +} // This is its own class as StarterPreferences... // - don't need to be loaded on startup // - isn't stored with other data // - don't require to be encrypted // - shouldn't require calls outside of the starter selection -export class StarterPrefs { - // called on starter selection show once - static load(): StarterPreferences { - return JSON.parse( - StarterPrefers_private_latest = (localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT) - ); - } - - // called on starter selection clear, always - static save(prefs: StarterPreferences): void { - const pStr : string = JSON.stringify(prefs); - if (pStr !== StarterPrefers_private_latest) { - // something changed, store the update - localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); - // update the latest prefs - StarterPrefers_private_latest = pStr; - } - } -} +export class StarterPrefs {} export interface StarterDataEntry { moveset: StarterMoveset | StarterFormMoveData | null; @@ -280,11 +302,11 @@ export interface StarterDataEntry { } export interface StarterData { - [key: number]: StarterDataEntry + [key: number]: StarterDataEntry; } export interface TutorialFlags { - [key: string]: boolean + [key: string]: boolean; } export interface SeenDialogues { @@ -306,7 +328,7 @@ const systemShortKeys = { abilityAttr: "$a", passiveAttr: "$pa", valueReduction: "$vr", - classicWinCount: "$wc" + classicWinCount: "$wc", }; export class GameData { @@ -346,7 +368,7 @@ export class GameData { [Unlockables.ENDLESS_MODE]: false, [Unlockables.MINI_BLACK_HOLE]: false, [Unlockables.SPLICED_ENDLESS_MODE]: false, - [Unlockables.EVIOLITE]: false + [Unlockables.EVIOLITE]: false, }; this.achvUnlocks = {}; this.voucherUnlocks = {}; @@ -354,11 +376,11 @@ export class GameData { [VoucherType.REGULAR]: 0, [VoucherType.PLUS]: 0, [VoucherType.PREMIUM]: 0, - [VoucherType.GOLDEN]: 0 + [VoucherType.GOLDEN]: 0, }; this.eggs = []; - this.eggPity = [ 0, 0, 0, 0 ]; - this.unlockPity = [ 0, 0, 0, 0 ]; + this.eggPity = [0, 0, 0, 0]; + this.unlockPity = [0, 0, 0, 0]; this.initDexData(); this.initStarterData(); } @@ -379,7 +401,7 @@ export class GameData { gameVersion: globalScene.game.config.gameVersion, timestamp: new Date().getTime(), eggPity: this.eggPity.slice(0), - unlockPity: this.unlockPity.slice(0) + unlockPity: this.unlockPity.slice(0), }; } @@ -401,24 +423,25 @@ export class GameData { const data = this.getSystemSaveData(); const maxIntAttrValue = 0x80000000; - const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); + const systemData = JSON.stringify(data, (_k: any, v: any) => + typeof v === "bigint" ? (v <= maxIntAttrValue ? Number(v) : v.toString()) : v, + ); localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemData, bypassLogin)); if (!bypassLogin) { - pokerogueApi.savedata.system.update({ clientSessionId }, systemData) - .then(error => { - globalScene.ui.savingIcon.hide(); - if (error) { - if (error.startsWith("session out of date")) { - globalScene.clearPhaseQueue(); - globalScene.unshiftPhase(new ReloadSessionPhase()); - } - console.error(error); - return resolve(false); + pokerogueApi.savedata.system.update({ clientSessionId }, systemData).then(error => { + globalScene.ui.savingIcon.hide(); + if (error) { + if (error.startsWith("session out of date")) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } - resolve(true); - }); + console.error(error); + return resolve(false); + } + resolve(true); + }); } else { globalScene.ui.savingIcon.hide(); @@ -436,23 +459,34 @@ export class GameData { } if (!bypassLogin) { - pokerogueApi.savedata.system.get({ clientSessionId }) - .then(saveDataOrErr => { - if (!saveDataOrErr || saveDataOrErr.length === 0 || saveDataOrErr[0] !== "{") { - if (saveDataOrErr?.startsWith("sql: no rows in result set")) { - globalScene.queueMessage("Save data could not be found. If this is a new account, you can safely ignore this message.", null, true); - return resolve(true); - } else if (saveDataOrErr?.includes("Too many connections")) { - globalScene.queueMessage("Too many people are trying to connect and the server is overloaded. Please try again later.", null, true); - return resolve(false); - } - console.error(saveDataOrErr); + pokerogueApi.savedata.system.get({ clientSessionId }).then(saveDataOrErr => { + if (!saveDataOrErr || saveDataOrErr.length === 0 || saveDataOrErr[0] !== "{") { + if (saveDataOrErr?.startsWith("sql: no rows in result set")) { + globalScene.queueMessage( + "Save data could not be found. If this is a new account, you can safely ignore this message.", + null, + true, + ); + return resolve(true); + } + if (saveDataOrErr?.includes("Too many connections")) { + globalScene.queueMessage( + "Too many people are trying to connect and the server is overloaded. Please try again later.", + null, + true, + ); return resolve(false); } + console.error(saveDataOrErr); + return resolve(false); + } - const cachedSystem = localStorage.getItem(`data_${loggedInUser?.username}`); - this.initSystem(saveDataOrErr, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : undefined).then(resolve); - }); + const cachedSystem = localStorage.getItem(`data_${loggedInUser?.username}`); + this.initSystem( + saveDataOrErr, + cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : undefined, + ).then(resolve); + }); } else { this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)).then(resolve); // TODO: is this bang correct? } @@ -513,7 +547,7 @@ export class GameData { this.migrateStarterAbilities(systemData, this.starterData); - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species); for (const s of starterIds) { this.starterData[s].candyCount += systemData.dexData[s].caughtCount; this.starterData[s].candyCount += systemData.dexData[s].hatchedCount * 2; @@ -560,12 +594,10 @@ export class GameData { }); } - this.eggs = systemData.eggs - ? systemData.eggs.map(e => e.toEgg()) - : []; + this.eggs = systemData.eggs ? systemData.eggs.map(e => e.toEgg()) : []; - this.eggPity = systemData.eggPity ? systemData.eggPity.slice(0) : [ 0, 0, 0, 0 ]; - this.unlockPity = systemData.unlockPity ? systemData.unlockPity.slice(0) : [ 0, 0, 0, 0 ]; + this.eggPity = systemData.eggPity ? systemData.eggPity.slice(0) : [0, 0, 0, 0]; + this.unlockPity = systemData.unlockPity ? systemData.unlockPity.slice(0) : [0, 0, 0, 0]; this.dexData = Object.assign(this.dexData, systemData.dexData); this.consolidateDexData(this.dexData); @@ -595,7 +627,7 @@ export class GameData { const lsItemKey = `runHistoryData_${loggedInUser?.username}`; const lsItem = localStorage.getItem(lsItemKey); if (lsItem) { - const cachedResponse = lsItem; + const cachedResponse = lsItem; if (cachedResponse) { const runHistory = JSON.parse(decrypt(cachedResponse, bypassLogin)); return runHistory; @@ -609,25 +641,22 @@ export class GameData { return cachedRHData; } */ - } else { - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); - return {}; - } - } else { - const lsItemKey = `runHistoryData_${loggedInUser?.username}`; - const lsItem = localStorage.getItem(lsItemKey); - if (lsItem) { - const cachedResponse = lsItem; - if (cachedResponse) { - const runHistory : RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin)); - return runHistory; - } - return {}; - } else { - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); - return {}; } + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; } + const lsItemKey = `runHistoryData_${loggedInUser?.username}`; + const lsItem = localStorage.getItem(lsItemKey); + if (lsItem) { + const cachedResponse = lsItem; + if (cachedResponse) { + const runHistory: RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin)); + return runHistory; + } + return {}; + } + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; } /** @@ -636,25 +665,28 @@ export class GameData { * @param isVictory: result of the run * Arbitrary limit of 25 runs per player - Will delete runs, starting with the oldest one, if needed */ - async saveRunHistory(runEntry : SessionSaveData, isVictory: boolean): Promise { + async saveRunHistory(runEntry: SessionSaveData, isVictory: boolean): Promise { const runHistoryData = await this.getRunHistoryData(); // runHistoryData should always return run history or {} empty object let timestamps = Object.keys(runHistoryData).map(Number); // Arbitrary limit of 25 entries per user --> Can increase or decrease - while (timestamps.length >= RUN_HISTORY_LIMIT ) { - const oldestTimestamp = (Math.min.apply(Math, timestamps)).toString(); + while (timestamps.length >= RUN_HISTORY_LIMIT) { + const oldestTimestamp = Math.min.apply(Math, timestamps).toString(); delete runHistoryData[oldestTimestamp]; timestamps = Object.keys(runHistoryData).map(Number); } - const timestamp = (runEntry.timestamp).toString(); + const timestamp = runEntry.timestamp.toString(); runHistoryData[timestamp] = { entry: runEntry, isVictory: isVictory, isFavorite: false, }; - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, encrypt(JSON.stringify(runHistoryData), bypassLogin)); + localStorage.setItem( + `runHistoryData_${loggedInUser?.username}`, + encrypt(JSON.stringify(runHistoryData), bypassLogin), + ); /** * Networking Code DO NOT DELETE * @@ -676,7 +708,8 @@ export class GameData { return JSON.parse(dataStr, (k: string, v: any) => { if (k === "gameStats") { return new GameStats(v); - } else if (k === "eggs") { + } + if (k === "eggs") { const ret: EggData[] = []; if (v === null) { v = []; @@ -687,11 +720,11 @@ export class GameData { return ret; } - return k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v ?? 0) : v; + return k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v ?? 0) : v; }) as SystemSaveData; } - convertSystemDataStr(dataStr: string, shorten: boolean = false): string { + convertSystemDataStr(dataStr: string, shorten = false): string { if (!shorten) { // Account for past key oversight dataStr = dataStr.replace(/\$pAttr/g, "$pa"); @@ -712,7 +745,9 @@ export class GameData { return true; } - const systemData = await pokerogueApi.savedata.system.verify({ clientSessionId }); + const systemData = await pokerogueApi.savedata.system.verify({ + clientSessionId, + }); if (systemData) { globalScene.clearPhaseQueue(); @@ -764,17 +799,18 @@ export class GameData { * @returns `true` if the configurations are successfully saved. */ public saveMappingConfigs(deviceName: string, config): boolean { - const key = deviceName.toLowerCase(); // Convert the gamepad name to lowercase to use as a key - let mappingConfigs: object = {}; // Initialize an empty object to hold the mapping configurations - if (localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + const key = deviceName.toLowerCase(); // Convert the gamepad name to lowercase to use as a key + let mappingConfigs: object = {}; // Initialize an empty object to hold the mapping configurations + if (localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // TODO: is this bang correct? - } // Parse the existing 'mappingConfigs' from localStorage + } // Parse the existing 'mappingConfigs' from localStorage if (!mappingConfigs[key]) { mappingConfigs[key] = {}; - } // If there is no configuration for the given key, create an empty object for it - mappingConfigs[key].custom = config.custom; // Assign the custom configuration to the mapping configuration for the given key - localStorage.setItem("mappingConfigs", JSON.stringify(mappingConfigs)); // Save the updated mapping configurations back to localStorage - return true; // Return true to indicate the operation was successful + } // If there is no configuration for the given key, create an empty object for it + mappingConfigs[key].custom = config.custom; // Assign the custom configuration to the mapping configuration for the given key + localStorage.setItem("mappingConfigs", JSON.stringify(mappingConfigs)); // Save the updated mapping configurations back to localStorage + return true; // Return true to indicate the operation was successful } /** @@ -788,23 +824,26 @@ export class GameData { * for the corresponding gamepad or device key. The method then returns `true` to indicate success. */ public loadMappingConfigs(): boolean { - if (!localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + if (!localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage return false; - } // If 'mappingConfigs' does not exist, return false + } // If 'mappingConfigs' does not exist, return false - const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // Parse the existing 'mappingConfigs' from localStorage // TODO: is this bang correct? + const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // Parse the existing 'mappingConfigs' from localStorage // TODO: is this bang correct? - for (const key of Object.keys(mappingConfigs)) {// Iterate over the keys of the mapping configurations + for (const key of Object.keys(mappingConfigs)) { + // Iterate over the keys of the mapping configurations globalScene.inputController.injectConfig(key, mappingConfigs[key]); - } // Inject each configuration into the input controller for the corresponding key + } // Inject each configuration into the input controller for the corresponding key - return true; // Return true to indicate the operation was successful + return true; // Return true to indicate the operation was successful } public resetMappingToFactory(): boolean { - if (!localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + if (!localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage return false; - } // If 'mappingConfigs' does not exist, return false + } // If 'mappingConfigs' does not exist, return false localStorage.removeItem("mappingConfigs"); globalScene.inputController.resetConfigs(); return true; // TODO: is `true` the correct return value? @@ -823,11 +862,18 @@ export class GameData { * to update the specified setting with the new value. Finally, it saves the updated settings back * to localStorage and returns `true` to indicate success. */ - public saveControlSetting(device: Device, localStoragePropertyName: string, setting: SettingGamepad|SettingKeyboard, settingDefaults, valueIndex: number): boolean { - let settingsControls: object = {}; // Initialize an empty object to hold the gamepad settings + public saveControlSetting( + device: Device, + localStoragePropertyName: string, + setting: SettingGamepad | SettingKeyboard, + settingDefaults, + valueIndex: number, + ): boolean { + let settingsControls: object = {}; // Initialize an empty object to hold the gamepad settings - if (localStorage.hasOwnProperty(localStoragePropertyName)) { // Check if 'settingsControls' exists in localStorage - settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)!); // Parse the existing 'settingsControls' from localStorage // TODO: is this bang correct? + if (localStorage.hasOwnProperty(localStoragePropertyName)) { + // Check if 'settingsControls' exists in localStorage + settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)!); // Parse the existing 'settingsControls' from localStorage // TODO: is this bang correct? } if (device === Device.GAMEPAD) { @@ -836,15 +882,17 @@ export class GameData { setSettingKeyboard(setting as SettingKeyboard, valueIndex); } - Object.keys(settingDefaults).forEach(s => { // Iterate over the default gamepad settings - if (s === setting) {// If the current setting matches, update its value + Object.keys(settingDefaults).forEach(s => { + // Iterate over the default gamepad settings + if (s === setting) { + // If the current setting matches, update its value settingsControls[s] = valueIndex; } }); - localStorage.setItem(localStoragePropertyName, JSON.stringify(settingsControls)); // Save the updated gamepad settings back to localStorage + localStorage.setItem(localStoragePropertyName, JSON.stringify(settingsControls)); // Save the updated gamepad settings back to localStorage - return true; // Return true to indicate the operation was successful + return true; // Return true to indicate the operation was successful } /** @@ -870,7 +918,9 @@ export class GameData { } private loadGamepadSettings(): boolean { - Object.values(SettingGamepad).map(setting => setting as SettingGamepad).forEach(setting => setSettingGamepad(setting, settingGamepadDefaults[setting])); + Object.values(SettingGamepad) + .map(setting => setting as SettingGamepad) + .forEach(setting => setSettingGamepad(setting, settingGamepadDefaults[setting])); if (!localStorage.hasOwnProperty("settingsGamepad")) { return false; @@ -891,14 +941,16 @@ export class GameData { tutorials = JSON.parse(localStorage.getItem(key)!); // TODO: is this bang correct? } - Object.keys(Tutorial).map(t => t as Tutorial).forEach(t => { - const key = Tutorial[t]; - if (key === tutorial) { - tutorials[key] = flag; - } else { - tutorials[key] ??= false; - } - }); + Object.keys(Tutorial) + .map(t => t as Tutorial) + .forEach(t => { + const key = Tutorial[t]; + if (key === tutorial) { + tutorials[key] = flag; + } else { + tutorials[key] ??= false; + } + }); localStorage.setItem(key, JSON.stringify(tutorials)); @@ -908,7 +960,9 @@ export class GameData { public getTutorialFlags(): TutorialFlags { const key = getDataTypeKey(GameDataType.TUTORIALS); const ret: TutorialFlags = {}; - Object.values(Tutorial).map(tutorial => tutorial as Tutorial).forEach(tutorial => ret[Tutorial[tutorial]] = false); + Object.values(Tutorial) + .map(tutorial => tutorial as Tutorial) + .forEach(tutorial => (ret[Tutorial[tutorial]] = false)); if (!localStorage.hasOwnProperty(key)) { return ret; @@ -966,13 +1020,16 @@ export class GameData { score: globalScene.score, waveIndex: globalScene.currentBattle.waveIndex, battleType: globalScene.currentBattle.battleType, - trainer: globalScene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(globalScene.currentBattle.trainer) : null, + trainer: + globalScene.currentBattle.battleType === BattleType.TRAINER + ? new TrainerData(globalScene.currentBattle.trainer) + : null, gameVersion: globalScene.game.config.gameVersion, timestamp: new Date().getTime(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, - playerFaints: globalScene.arena.playerFaints + playerFaints: globalScene.arena.playerFaints, } as SessionSaveData; } @@ -992,17 +1049,19 @@ export class GameData { }; if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`)) { - pokerogueApi.savedata.session.get({ slot: slotId, clientSessionId }) - .then(async response => { - if (!response || response?.length === 0 || response?.[0] !== "{") { - console.error(response); - return resolve(null); - } + pokerogueApi.savedata.session.get({ slot: slotId, clientSessionId }).then(async response => { + if (!response || response?.length === 0 || response?.[0] !== "{") { + console.error(response); + return resolve(null); + } - localStorage.setItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`, encrypt(response, bypassLogin)); + localStorage.setItem( + `sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`, + encrypt(response, bypassLogin), + ); - await handleSessionData(response); - }); + await handleSessionData(response); + }); } else { const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); if (sessionData) { @@ -1068,14 +1127,27 @@ export class GameData { const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; - const mysteryEncounterType = sessionData.mysteryEncounterType !== -1 ? sessionData.mysteryEncounterType : undefined; - const battle = globalScene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1, mysteryEncounterType)!; // TODO: is this bang correct? + const mysteryEncounterType = + sessionData.mysteryEncounterType !== -1 ? sessionData.mysteryEncounterType : undefined; + const battle = globalScene.newBattle( + sessionData.waveIndex, + battleType, + sessionData.trainer, + battleType === BattleType.TRAINER + ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE + : sessionData.enemyParty.length > 1, + mysteryEncounterType, + )!; // TODO: is this bang correct? battle.enemyLevels = sessionData.enemyParty.map(p => p.level); globalScene.arena.init(); sessionData.enemyParty.forEach((enemyData, e) => { - const enemyPokemon = enemyData.toPokemon(battleType, e, sessionData.trainer?.variant === TrainerVariant.DOUBLE) as EnemyPokemon; + const enemyPokemon = enemyData.toPokemon( + battleType, + e, + sessionData.trainer?.variant === TrainerVariant.DOUBLE, + ) as EnemyPokemon; battle.enemyParty[e] = enemyPokemon; if (battleType === BattleType.WILD) { battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); @@ -1085,10 +1157,22 @@ export class GameData { }); globalScene.arena.weather = sessionData.arena.weather; - globalScene.arena.eventTarget.dispatchEvent(new WeatherChangedEvent(WeatherType.NONE, globalScene.arena.weather?.weatherType!, globalScene.arena.weather?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.eventTarget.dispatchEvent( + new WeatherChangedEvent( + WeatherType.NONE, + globalScene.arena.weather?.weatherType!, + globalScene.arena.weather?.turnsLeft!, + ), + ); // TODO: is this bang correct? globalScene.arena.terrain = sessionData.arena.terrain; - globalScene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, globalScene.arena.terrain?.terrainType!, globalScene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.eventTarget.dispatchEvent( + new TerrainChangedEvent( + TerrainType.NONE, + globalScene.arena.terrain?.terrainType!, + globalScene.arena.terrain?.turnsLeft!, + ), + ); // TODO: is this bang correct? globalScene.arena.playerTerasUsed = sessionData.arena.playerTerasUsed; @@ -1097,7 +1181,9 @@ export class GameData { for (const tag of globalScene.arena.tags) { if (tag instanceof ArenaTrapTag) { const { tagType, side, turnCount, layers, maxLayers } = tag as ArenaTrapTag; - globalScene.arena.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers)); + globalScene.arena.eventTarget.dispatchEvent( + new TagAddedEvent(tagType, side, turnCount, layers, maxLayers), + ); } else { globalScene.arena.eventTarget.dispatchEvent(new TagAddedEvent(tag.tagType, tag.side, tag.turnCount)); } @@ -1173,7 +1259,6 @@ export class GameData { localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); resolve(true); - } }); }); @@ -1194,53 +1279,52 @@ export class GameData { daily = JSON.parse(atob(localStorage.getItem("daily")!)); // TODO: is this bang correct? if (daily.includes(seed)) { return resolve(false); - } else { - daily.push(seed); - localStorage.setItem("daily", btoa(JSON.stringify(daily))); - return resolve(true); } - } else { daily.push(seed); localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } - } else { + daily.push(seed); + localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } + return resolve(true); }); } - /** * Attempt to clear session data after the end of a run * After session data is removed, attempt to update user info so the menu updates * To delete an unfinished run instead, use {@linkcode deleteSession} */ async tryClearSession(slotId: number): Promise<[success: boolean, newClear: boolean]> { - let result: [boolean, boolean] = [ false, false ]; + let result: [boolean, boolean] = [false, false]; if (bypassLogin) { localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); - result = [ true, true ]; + result = [true, true]; } else { const sessionData = this.getSessionSaveData(); const { trainerId } = this; - const jsonResponse = await pokerogueApi.savedata.session.clear({ slot: slotId, trainerId, clientSessionId }, sessionData); + const jsonResponse = await pokerogueApi.savedata.session.clear( + { slot: slotId, trainerId, clientSessionId }, + sessionData, + ); if (!jsonResponse?.error) { - result = [ true, jsonResponse?.success ?? false ]; + result = [true, jsonResponse?.success ?? false]; if (loggedInUser) { loggedInUser!.lastSessionSlot = -1; } localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); } else { - if (jsonResponse && jsonResponse.error?.startsWith("session out of date")) { + if (jsonResponse?.error?.startsWith("session out of date")) { globalScene.clearPhaseQueue(); globalScene.unshiftPhase(new ReloadSessionPhase()); } console.error(jsonResponse); - result = [ false, false ]; + result = [false, false]; } } @@ -1273,10 +1357,14 @@ export class GameData { v = []; } for (const md of v) { - if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked + if (md?.className === "ExpBalanceModifier") { + // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); } - if (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { + if ( + (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE) || + md.effect === StatusEffect.SLEEP + ) { continue; } ret.push(new PersistentModifierData(md, player)); @@ -1315,7 +1403,7 @@ export class GameData { return sessionData; } - saveAll(skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise { + saveAll(skipVerification = false, sync = false, useCachedSession = false, useCachedSystem = false): Promise { return new Promise(resolve => { Utils.executeIf(!skipVerification, updateUserInfo).then(success => { if (success !== null && !success) { @@ -1324,43 +1412,62 @@ export class GameData { if (sync) { globalScene.ui.savingIcon.show(); } - const sessionData = useCachedSession ? - this.parseSessionData(decrypt(localStorage.getItem(`sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`)!, bypassLogin)) // TODO: is this bang correct? + const sessionData = useCachedSession + ? this.parseSessionData( + decrypt( + localStorage.getItem( + `sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`, + )!, + bypassLogin, + ), + ) // TODO: is this bang correct? : this.getSessionSaveData(); const maxIntAttrValue = 0x80000000; - const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)) : this.getSystemSaveData(); // TODO: is this bang correct? + const systemData = useCachedSystem + ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)) + : this.getSystemSaveData(); // TODO: is this bang correct? const request = { system: systemData, session: sessionData, sessionSlotId: globalScene.sessionSlotId, - clientSessionId: clientSessionId + clientSessionId: clientSessionId, }; - localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); + localStorage.setItem( + `data_${loggedInUser?.username}`, + encrypt( + JSON.stringify(systemData, (_k: any, v: any) => + typeof v === "bigint" ? (v <= maxIntAttrValue ? Number(v) : v.toString()) : v, + ), + bypassLogin, + ), + ); - localStorage.setItem(`sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); + localStorage.setItem( + `sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`, + encrypt(JSON.stringify(sessionData), bypassLogin), + ); console.debug("Session data saved"); if (!bypassLogin && sync) { - pokerogueApi.savedata.updateAll(request) - .then(error => { - if (sync) { - globalScene.lastSavePlayTime = 0; - globalScene.ui.savingIcon.hide(); + pokerogueApi.savedata.updateAll(request).then(error => { + if (sync) { + globalScene.lastSavePlayTime = 0; + globalScene.ui.savingIcon.hide(); + } + if (error) { + if (error.startsWith("session out of date")) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } - if (error) { - if (error.startsWith("session out of date")) { - globalScene.clearPhaseQueue(); - globalScene.unshiftPhase(new ReloadSessionPhase()); - } - console.error(error); - return resolve(false); - } - resolve(true); - }); + console.error(error); + return resolve(false); + } + resolve(true); + }); } else { this.verify().then(success => { globalScene.ui.savingIcon.hide(); @@ -1371,7 +1478,7 @@ export class GameData { }); } - public tryExportData(dataType: GameDataType, slotId: number = 0): Promise { + public tryExportData(dataType: GameDataType, slotId = 0): Promise { return new Promise(resolve => { const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; const handleData = (dataStr: string) => { @@ -1381,7 +1488,9 @@ export class GameData { break; } const encryptedData = AES.encrypt(dataStr, saveKey); - const blob = new Blob([ encryptedData.toString() ], { type: "text/json" }); + const blob = new Blob([encryptedData.toString()], { + type: "text/json", + }); const link = document.createElement("a"); link.href = window.URL.createObjectURL(blob); link.download = `${dataKey}.prsv`; @@ -1394,7 +1503,10 @@ export class GameData { if (dataType === GameDataType.SYSTEM) { promise = pokerogueApi.savedata.system.get({ clientSessionId }); } else if (dataType === GameDataType.SESSION) { - promise = pokerogueApi.savedata.session.get({ slot: slotId, clientSessionId }); + promise = pokerogueApi.savedata.session.get({ + slot: slotId, + clientSessionId, + }); } promise.then(response => { @@ -1417,7 +1529,7 @@ export class GameData { }); } - public importData(dataType: GameDataType, slotId: number = 0): void { + public importData(dataType: GameDataType, slotId = 0): void { const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; let saveFile: any = document.getElementById("saveFile"); @@ -1430,91 +1542,120 @@ export class GameData { saveFile.type = "file"; saveFile.accept = ".prsv"; saveFile.style.display = "none"; - saveFile.addEventListener("change", - e => { - const reader = new FileReader(); + saveFile.addEventListener("change", e => { + const reader = new FileReader(); - reader.onload = (_ => { - return e => { - let dataName: string; - 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); - const systemData = this.parseSystemData(dataStr); - valid = !!systemData.dexData && !!systemData.timestamp; - break; - case GameDataType.SESSION: - const sessionData = this.parseSessionData(dataStr); - valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; - break; - case GameDataType.RUN_HISTORY: - const data = JSON.parse(dataStr); - const keys = Object.keys(data); - dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); - keys.forEach((key) => { - const entryKeys = Object.keys(data[key]); - valid = [ "isFavorite", "isVictory", "entry" ].every(v => entryKeys.includes(v)) && entryKeys.length === 3; - }); - break; - case GameDataType.SETTINGS: - case GameDataType.TUTORIALS: - valid = true; - break; - } - } catch (ex) { - console.error(ex); + reader.onload = (_ => { + return e => { + let dataName: string; + 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); + const systemData = this.parseSystemData(dataStr); + valid = !!systemData.dexData && !!systemData.timestamp; + break; + case GameDataType.SESSION: + const sessionData = this.parseSessionData(dataStr); + valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; + break; + case GameDataType.RUN_HISTORY: + const data = JSON.parse(dataStr); + const keys = Object.keys(data); + dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); + keys.forEach(key => { + const entryKeys = Object.keys(data[key]); + valid = + ["isFavorite", "isVictory", "entry"].every(v => entryKeys.includes(v)) && entryKeys.length === 3; + }); + break; + case GameDataType.SETTINGS: + case GameDataType.TUTORIALS: + valid = true; + break; } + } catch (ex) { + console.error(ex); + } - const displayError = (error: string) => globalScene.ui.showText(error, null, () => globalScene.ui.showText("", 0), Utils.fixedInt(1500)); - dataName = dataName!; // tell TS compiler that dataName is defined! + const displayError = (error: string) => + globalScene.ui.showText(error, null, () => globalScene.ui.showText("", 0), Utils.fixedInt(1500)); + dataName = dataName!; // tell TS compiler that dataName is defined! - if (!valid) { - return globalScene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => globalScene.ui.showText("", 0), Utils.fixedInt(1500)); - } + if (!valid) { + return globalScene.ui.showText( + `Your ${dataName} data could not be loaded. It may be corrupted.`, + null, + () => globalScene.ui.showText("", 0), + Utils.fixedInt(1500), + ); + } - globalScene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { - globalScene.ui.setOverlayMode(Mode.CONFIRM, () => { - localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); + globalScene.ui.showText( + `Your ${dataName} data will be overridden and the page will reload. Proceed?`, + null, + () => { + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); - if (!bypassLogin && dataType < GameDataType.SETTINGS) { - updateUserInfo().then(success => { - if (!success[0]) { - return displayError(`Could not contact the server. Your ${dataName} data could not be imported.`); - } - const { trainerId, secretId } = this; - let updatePromise: Promise; - if (dataType === GameDataType.SESSION) { - updatePromise = pokerogueApi.savedata.session.update({ slot: slotId, trainerId, secretId, clientSessionId }, dataStr); - } else { - updatePromise = pokerogueApi.savedata.system.update({ trainerId, secretId, clientSessionId }, dataStr); - } - updatePromise - .then(error => { + if (!bypassLogin && dataType < GameDataType.SETTINGS) { + updateUserInfo().then(success => { + if (!success[0]) { + return displayError( + `Could not contact the server. Your ${dataName} data could not be imported.`, + ); + } + const { trainerId, secretId } = this; + let updatePromise: Promise; + if (dataType === GameDataType.SESSION) { + updatePromise = pokerogueApi.savedata.session.update( + { + slot: slotId, + trainerId, + secretId, + clientSessionId, + }, + dataStr, + ); + } else { + updatePromise = pokerogueApi.savedata.system.update( + { trainerId, secretId, clientSessionId }, + dataStr, + ); + } + updatePromise.then(error => { if (error) { console.error(error); - return displayError(`An error occurred while updating ${dataName} data. Please contact the administrator.`); + return displayError( + `An error occurred while updating ${dataName} data. Please contact the administrator.`, + ); } - window.location = window.location; + window.location.reload(); }); - }); - } else { - window.location = window.location; - } - }, () => { - globalScene.ui.revertMode(); - globalScene.ui.showText("", 0); - }, false, -98); - }); - }; - })((e.target as any).files[0]); + }); + } else { + window.location.reload(); + } + }, + () => { + globalScene.ui.revertMode(); + globalScene.ui.showText("", 0); + }, + false, + -98, + ); + }, + ); + }; + })((e.target as any).files[0]); - reader.readAsText((e.target as any).files[0]); - } - ); + reader.readAsText((e.target as any).files[0]); + }); saveFile.click(); } @@ -1523,20 +1664,31 @@ export class GameData { for (const species of allSpecies) { data[species.speciesId] = { - seenAttr: 0n, caughtAttr: 0n, natureAttr: 0, seenCount: 0, caughtCount: 0, hatchedCount: 0, ivs: [ 0, 0, 0, 0, 0, 0 ] + seenAttr: 0n, + caughtAttr: 0n, + natureAttr: 0, + seenCount: 0, + caughtCount: 0, + hatchedCount: 0, + ivs: [0, 0, 0, 0, 0, 0], }; } - const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM; + const defaultStarterAttr = + DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM; const defaultStarterNatures: Nature[] = []; - globalScene.executeWithSeedOffset(() => { - const neutralNatures = [ Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY ]; - for (let s = 0; s < defaultStarterSpecies.length; s++) { - defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); - } - }, 0, "default"); + globalScene.executeWithSeedOffset( + () => { + const neutralNatures = [Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY]; + for (let s = 0; s < defaultStarterSpecies.length; s++) { + defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); + } + }, + 0, + "default", + ); for (let ds = 0; ds < defaultStarterSpecies.length; ds++) { const entry = data[defaultStarterSpecies[ds]] as DexEntry; @@ -1555,7 +1707,7 @@ export class GameData { private initStarterData(): void { const starterData: StarterData = {}; - const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => parseInt(k) as Species); + const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => Number.parseInt(k) as Species); for (const speciesId of starterSpeciesIds) { starterData[speciesId] = { @@ -1566,16 +1718,19 @@ export class GameData { abilityAttr: defaultStarterSpecies.includes(speciesId) ? AbilityAttr.ABILITY_1 : 0, passiveAttr: 0, valueReduction: 0, - classicWinCount: 0 + classicWinCount: 0, }; } this.starterData = starterData; } - setPokemonSeen(pokemon: Pokemon, incrementCount: boolean = true, trainer: boolean = false): void { + setPokemonSeen(pokemon: Pokemon, incrementCount = true, trainer = false): void { // Some Mystery Encounters block updates to these stats - if (globalScene.currentBattle?.isBattleMysteryEncounter() && globalScene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { + if ( + globalScene.currentBattle?.isBattleMysteryEncounter() && + globalScene.currentBattle.mysteryEncounter?.preventGameStatsUpdates + ) { return; } const dexEntry = this.dexData[pokemon.species.speciesId]; @@ -1604,15 +1759,14 @@ export class GameData { * @param showMessage * @returns `true` if Pokemon catch unlocked a new starter, `false` if Pokemon catch did not unlock a starter */ - setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise { + setPokemonCaught(pokemon: Pokemon, incrementCount = true, fromEgg = false, showMessage = true): Promise { // If incrementCount === false (not a catch scenario), only update the pokemon's dex data if the Pokemon has already been marked as caught in dex // Prevents form changes, nature changes, etc. from unintentionally updating the dex data of a "rental" pokemon const speciesRootForm = pokemon.species.getRootSpeciesId(); if (!incrementCount && !globalScene.gameData.dexData[speciesRootForm].caughtAttr) { return Promise.resolve(false); - } else { - return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showMessage); } + return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showMessage); } /** @@ -1624,7 +1778,13 @@ export class GameData { * @param showMessage * @returns `true` if Pokemon catch unlocked a new starter, `false` if Pokemon catch did not unlock a starter */ - setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise { + setPokemonSpeciesCaught( + pokemon: Pokemon, + species: PokemonSpecies, + incrementCount = true, + fromEgg = false, + showMessage = true, + ): Promise { return new Promise(resolve => { const dexEntry = this.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr; @@ -1652,8 +1812,10 @@ export class GameData { dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(3); } } else { - const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; - const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) + ? pokemonFormChanges[species.speciesId] + : []; + const toCurrentFormChanges = allFormChanges.filter(f => f.formKey === formKey); if (toCurrentFormChanges.length > 0) { // Needs to do this or Castform can unlock the wrong form, etc. dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); @@ -1663,9 +1825,10 @@ export class GameData { // Unlock ability if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { - this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 - ? 1 << pokemon.abilityIndex - : AbilityAttr.ABILITY_HIDDEN; + this.starterData[species.speciesId].abilityAttr |= + pokemon.abilityIndex !== 1 || pokemon.species.ability2 + ? 1 << pokemon.abilityIndex + : AbilityAttr.ABILITY_HIDDEN; } // Unlock nature @@ -1705,14 +1868,23 @@ export class GameData { } if (!hasPrevolution && (!globalScene.gameMode.isDaily || hasNewAttr || fromEgg)) { - this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * (1 << (pokemon.variant ?? 0)) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); + this.addStarterCandy( + species, + 1 * (pokemon.isShiny() ? 5 * (1 << (pokemon.variant ?? 0)) : 1) * (fromEgg || pokemon.isBoss() ? 2 : 1), + ); } } const checkPrevolution = (newStarter: boolean) => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; - this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg, showMessage).then(result => resolve(result)); + this.setPokemonSpeciesCaught( + pokemon, + getPokemonSpecies(prevolutionSpecies), + incrementCount, + fromEgg, + showMessage, + ).then(result => resolve(result)); } else { resolve(newStarter); } @@ -1724,14 +1896,20 @@ export class GameData { return; } globalScene.playSound("level_up_fanfare"); - globalScene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(true), null, true); + globalScene.ui.showText( + i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), + null, + () => checkPrevolution(true), + null, + true, + ); } else { checkPrevolution(false); } }); } - incrementRibbonCount(species: PokemonSpecies, forStarter: boolean = false): number { + incrementRibbonCount(species: PokemonSpecies, forStarter = false): number { const speciesIdToIncrement: Species = species.getRootSpeciesId(forStarter); if (!this.starterData[speciesIdToIncrement].classicWinCount) { @@ -1785,7 +1963,12 @@ export class GameData { * @param showMessage Default true. If true, will display message for unlocked egg move * @param prependSpeciesToMessage Default false. If true, will change message from "X Egg Move Unlocked!" to "Bulbasaur X Egg Move Unlocked!" */ - setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: number, showMessage: boolean = true, prependSpeciesToMessage: boolean = false): Promise { + setEggMoveUnlocked( + species: PokemonSpecies, + eggMoveIndex: number, + showMessage = true, + prependSpeciesToMessage = false, + ): Promise { return new Promise(resolve => { const speciesId = species.speciesId; if (!speciesEggMoves.hasOwnProperty(speciesId) || !speciesEggMoves[speciesId][eggMoveIndex]) { @@ -1812,7 +1995,10 @@ export class GameData { globalScene.playSound("level_up_fanfare"); const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; let message = prependSpeciesToMessage ? species.getName() + " " : ""; - message += eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }); + message += + eggMoveIndex === 3 + ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) + : i18next.t("egg:eggMoveUnlock", { moveName: moveName }); globalScene.ui.showText(message, null, () => resolve(true), null, true); }); @@ -1883,7 +2069,7 @@ export class GameData { return starterCount; } - getSpeciesDefaultDexAttr(species: PokemonSpecies, _forSeen: boolean = false, optimistic: boolean = false): bigint { + getSpeciesDefaultDexAttr(species: PokemonSpecies, _forSeen = false, optimistic = false): bigint { let ret = 0n; const dexEntry = this.dexData[species.speciesId]; const attr = dexEntry.caughtAttr; @@ -1904,7 +2090,7 @@ export class GameData { } } else { // Default to non shiny. Fallback to shiny if it's the only thing that's unlocked - ret |= (attr & DexAttr.NON_SHINY || !(attr & DexAttr.SHINY)) ? DexAttr.NON_SHINY : DexAttr.SHINY; + ret |= attr & DexAttr.NON_SHINY || !(attr & DexAttr.SHINY) ? DexAttr.NON_SHINY : DexAttr.SHINY; if (attr & DexAttr.DEFAULT_VARIANT) { ret |= DexAttr.DEFAULT_VARIANT; @@ -1921,7 +2107,7 @@ export class GameData { return ret; } - getSpeciesDexAttrProps(species: PokemonSpecies, dexAttr: bigint): DexAttrProps { + getSpeciesDexAttrProps(_species: PokemonSpecies, dexAttr: bigint): DexAttrProps { const shiny = !(dexAttr & DexAttr.NON_SHINY); const female = !(dexAttr & DexAttr.MALE); let variant: Variant = 0; @@ -1938,7 +2124,7 @@ export class GameData { shiny, female, variant, - formIndex + formIndex, }; } @@ -1958,14 +2144,14 @@ export class GameData { } getSpeciesDefaultNatureAttr(species: PokemonSpecies): number { - return 1 << (this.getSpeciesDefaultNature(species)); + return 1 << this.getSpeciesDefaultNature(species); } getDexAttrLuck(dexAttr: bigint): number { - return dexAttr & DexAttr.SHINY ? dexAttr & DexAttr.VARIANT_3 ? 3 : dexAttr & DexAttr.VARIANT_2 ? 2 : 1 : 0; + return dexAttr & DexAttr.SHINY ? (dexAttr & DexAttr.VARIANT_3 ? 3 : dexAttr & DexAttr.VARIANT_2 ? 2 : 1) : 0; } - getNaturesForAttr(natureAttr: number = 0): Nature[] { + getNaturesForAttr(natureAttr = 0): Nature[] { const ret: Nature[] = []; for (let n = 0; n < 25; n++) { if (natureAttr & (1 << (n + 1))) { @@ -2020,20 +2206,21 @@ export class GameData { entry.hatchedCount = 0; } if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) { - entry.natureAttr = this.defaultDexData?.[k].natureAttr || (1 << Utils.randInt(25, 1)); + entry.natureAttr = this.defaultDexData?.[k].natureAttr || 1 << Utils.randInt(25, 1); } } } migrateStarterAbilities(systemData: SystemSaveData, initialStarterData?: StarterData): void { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species); const starterData = initialStarterData || systemData.starterData; const dexData = systemData.dexData; for (const s of starterIds) { const dexAttr = dexData[s].caughtAttr; - starterData[s].abilityAttr = (dexAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (dexAttr & DexAttr.VARIANT_2 ? AbilityAttr.ABILITY_2 : 0) - | (dexAttr & DexAttr.VARIANT_3 ? AbilityAttr.ABILITY_HIDDEN : 0); + starterData[s].abilityAttr = + (dexAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) | + (dexAttr & DexAttr.VARIANT_2 ? AbilityAttr.ABILITY_2 : 0) | + (dexAttr & DexAttr.VARIANT_3 ? AbilityAttr.ABILITY_HIDDEN : 0); if (dexAttr) { if (!(dexAttr & DexAttr.DEFAULT_VARIANT)) { dexData[s].caughtAttr ^= DexAttr.DEFAULT_VARIANT; diff --git a/src/system/game-speed.ts b/src/system/game-speed.ts index 4b34a04b5f8..e2156c03728 100644 --- a/src/system/game-speed.ts +++ b/src/system/game-speed.ts @@ -15,7 +15,7 @@ export function initGameSpeed() { if (value instanceof Utils.FixedInt) { return (value as Utils.FixedInt).value; } - return thisArg.gameSpeed === 1 ? value : Math.ceil(value /= thisArg.gameSpeed); + return thisArg.gameSpeed === 1 ? value : Math.ceil((value /= thisArg.gameSpeed)); }; const originalAddEvent = this.time.addEvent; @@ -23,15 +23,21 @@ export function initGameSpeed() { if (!(config instanceof Phaser.Time.TimerEvent) && config.delay) { config.delay = transformValue(config.delay); } - return originalAddEvent.apply(this, [ config ]); + return originalAddEvent.apply(this, [config]); }; const originalTweensAdd = this.tweens.add; - this.tweens.add = function (config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain) { + this.tweens.add = function ( + config: + | Phaser.Types.Tweens.TweenBuilderConfig + | Phaser.Types.Tweens.TweenChainBuilderConfig + | Phaser.Tweens.Tween + | Phaser.Tweens.TweenChain, + ) { if (config.loopDelay) { config.loopDelay = transformValue(config.loopDelay as number); } - if (!(config instanceof Phaser.Tweens.TweenChain) ) { + if (!(config instanceof Phaser.Tweens.TweenChain)) { if (config.duration) { config.duration = transformValue(config.duration); } @@ -48,12 +54,12 @@ export function initGameSpeed() { } } } - return originalTweensAdd.apply(this, [ config ]); + return originalTweensAdd.apply(this, [config]); }; const originalTweensChain = this.tweens.chain; this.tweens.chain = function (config: Phaser.Types.Tweens.TweenChainBuilderConfig): Phaser.Tweens.TweenChain { if (config.tweens) { - config.tweens.forEach(t => { + for (const t of config.tweens) { if (t.duration) { t.duration = transformValue(t.duration); } @@ -69,9 +75,9 @@ export function initGameSpeed() { if (t.hold) { t.hold = transformValue(t.hold); } - }); + } } - return originalTweensChain.apply(this, [ config ]); + return originalTweensChain.apply(this, [config]); }; const originalAddCounter = this.tweens.addCounter; this.tweens.addCounter = function (config: Phaser.Types.Tweens.NumberTweenBuilderConfig) { @@ -90,23 +96,19 @@ export function initGameSpeed() { if (config.hold) { config.hold = transformValue(config.hold); } - return originalAddCounter.apply(this, [ config ]); + return originalAddCounter.apply(this, [config]); }; const originalFadeOut = SoundFade.fadeOut; - SoundFade.fadeOut = (( - scene: Phaser.Scene, - sound: Phaser.Sound.BaseSound, - duration: number, - destroy?: boolean - ) => originalFadeOut(globalScene, sound, transformValue(duration), destroy)) as FadeOut; + SoundFade.fadeOut = ((_scene: Phaser.Scene, sound: Phaser.Sound.BaseSound, duration: number, destroy?: boolean) => + originalFadeOut(globalScene, sound, transformValue(duration), destroy)) as FadeOut; const originalFadeIn = SoundFade.fadeIn; SoundFade.fadeIn = (( - scene: Phaser.Scene, + _scene: Phaser.Scene, sound: string | Phaser.Sound.BaseSound, duration: number, endVolume?: number, - startVolume?: number + startVolume?: number, ) => originalFadeIn(globalScene, sound, transformValue(duration), endVolume, startVolume)) as FadeIn; } diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index 4816115f586..cbda45572ac 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -13,7 +13,7 @@ export default class ModifierData { public className: string; constructor(source: PersistentModifier | any, player: boolean) { - const sourceModifier = source instanceof PersistentModifier ? source as PersistentModifier : null; + const sourceModifier = source instanceof PersistentModifier ? (source as PersistentModifier) : null; this.player = player; this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; if (sourceModifier) { @@ -28,7 +28,7 @@ export default class ModifierData { this.className = sourceModifier ? sourceModifier.constructor.name : source.className; } - toModifier(constructor: any): PersistentModifier | null { + toModifier(_constructor: any): PersistentModifier | null { const typeFunc = getModifierTypeFuncById(this.typeId); if (!typeFunc) { return null; @@ -39,10 +39,16 @@ export default class ModifierData { type.id = this.typeId; if (type instanceof ModifierTypeGenerator) { - type = (type as ModifierTypeGenerator).generateType(this.player ? globalScene.getPlayerParty() : globalScene.getEnemyField(), this.typePregenArgs); + type = (type as ModifierTypeGenerator).generateType( + this.player ? globalScene.getPlayerParty() : globalScene.getEnemyField(), + this.typePregenArgs, + ); } - const ret = Reflect.construct(constructor, ([ type ] as any[]).concat(this.args).concat(this.stackCount)) as PersistentModifier; + const ret = Reflect.construct( + _constructor, + ([type] as any[]).concat(this.args).concat(this.stackCount), + ) as PersistentModifier; if (ret.stackCount > ret.getMaxStackCount()) { ret.stackCount = ret.getMaxStackCount(); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 7531d74e404..4e694bc1189 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -38,9 +38,9 @@ export default class PokemonData { public status: Status | null; public friendship: number; public metLevel: number; - public metBiome: Biome | -1; // -1 for starters + public metBiome: Biome | -1; // -1 for starters public metSpecies: Species; - public metWave: number; // 0 for unknown (previous saves), -1 for starters + public metWave: number; // 0 for unknown (previous saves), -1 for starters public luck: number; public pauseEvolutions: boolean; public pokerus: boolean; @@ -73,7 +73,7 @@ export default class PokemonData { public mysteryEncounterPokemonData: CustomPokemonData | null; public fusionMysteryEncounterPokemonData: CustomPokemonData | null; - constructor(source: Pokemon | any, forHistory: boolean = false) { + constructor(source: Pokemon | any, forHistory = false) { const sourcePokemon = source instanceof Pokemon ? source : null; this.id = source.id; this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player; @@ -96,13 +96,14 @@ export default class PokemonData { } this.stats = source.stats; this.ivs = source.ivs; - this.nature = source.nature !== undefined ? source.nature : 0 as Nature; - this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; + this.nature = source.nature !== undefined ? source.nature : (0 as Nature); + this.friendship = + source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.metSpecies = source.metSpecies; this.metWave = source.metWave ?? (this.metBiome === -1 ? -1 : 0); - this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); + this.luck = source.luck !== undefined ? source.luck : source.shiny ? source.variant + 1 : 0; if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; this.evoCounter = source.evoCounter ?? 0; @@ -118,7 +119,8 @@ export default class PokemonData { this.fusionShiny = source.fusionShiny; this.fusionVariant = source.fusionVariant; this.fusionGender = source.fusionGender; - this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); + this.fusionLuck = + source.fusionLuck !== undefined ? source.fusionLuck : source.fusionShiny ? source.fusionVariant + 1 : 0; this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); this.fusionTeraType = (source.fusionTeraType ?? 0) as PokemonType; this.usedTMs = source.usedTMs ?? []; @@ -127,8 +129,12 @@ export default class PokemonData { // Deprecated, but needed for session data migration this.natureOverride = source.natureOverride; - this.mysteryEncounterPokemonData = source.mysteryEncounterPokemonData ? new CustomPokemonData(source.mysteryEncounterPokemonData) : null; - this.fusionMysteryEncounterPokemonData = source.fusionMysteryEncounterPokemonData ? new CustomPokemonData(source.fusionMysteryEncounterPokemonData) : null; + this.mysteryEncounterPokemonData = source.mysteryEncounterPokemonData + ? new CustomPokemonData(source.mysteryEncounterPokemonData) + : null; + this.fusionMysteryEncounterPokemonData = source.fusionMysteryEncounterPokemonData + ? new CustomPokemonData(source.fusionMysteryEncounterPokemonData) + : null; if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); @@ -144,7 +150,9 @@ export default class PokemonData { } } } else { - this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride)); + this.moveset = (source.moveset || [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL)]) + .filter(m => m) + .map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride)); if (!forHistory) { this.status = source.status ? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining) @@ -172,15 +180,38 @@ export default class PokemonData { } } - toPokemon(battleType?: BattleType, partyMemberIndex: number = 0, double: boolean = false): Pokemon { + toPokemon(battleType?: BattleType, partyMemberIndex = 0, double = false): Pokemon { const species = getPokemonSpecies(this.species); const ret: Pokemon = this.player - ? globalScene.addPlayerPokemon(species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this, (playerPokemon) => { - if (this.nickname) { - playerPokemon.nickname = this.nickname; - } - }) - : globalScene.addEnemyPokemon(species, this.level, battleType === BattleType.TRAINER ? !double || !(partyMemberIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER : TrainerSlot.NONE, this.boss, false, this); + ? globalScene.addPlayerPokemon( + species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + playerPokemon => { + if (this.nickname) { + playerPokemon.nickname = this.nickname; + } + }, + ) + : globalScene.addEnemyPokemon( + species, + this.level, + battleType === BattleType.TRAINER + ? !double || !(partyMemberIndex % 2) + ? TrainerSlot.TRAINER + : TrainerSlot.TRAINER_PARTNER + : TrainerSlot.NONE, + this.boss, + false, + this, + ); if (this.summonData) { ret.primeSummonData(this.summonData); } diff --git a/src/system/session-history.ts b/src/system/session-history.ts index d9dd2022d8f..8eb81cb6efe 100644 --- a/src/system/session-history.ts +++ b/src/system/session-history.ts @@ -5,13 +5,13 @@ import type PersistentModifierData from "./modifier-data"; export enum SessionHistoryResult { ACTIVE, WIN, - LOSS + LOSS, } export interface SessionHistory { seed: string; playTime: number; - result: SessionHistoryResult, + result: SessionHistoryResult; gameMode: GameModes; party: PokemonData[]; modifiers: PersistentModifierData[]; diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index 840304ab1ba..f4a6bd465af 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -6,49 +6,49 @@ import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { globalScene } from "#app/global-scene"; export enum SettingGamepad { - Controller = "CONTROLLER", - Gamepad_Support = "GAMEPAD_SUPPORT", - Button_Up = "BUTTON_UP", - Button_Down = "BUTTON_DOWN", - Button_Left = "BUTTON_LEFT", - Button_Right = "BUTTON_RIGHT", - Button_Action = "BUTTON_ACTION", - Button_Cancel = "BUTTON_CANCEL", - Button_Menu = "BUTTON_MENU", - Button_Stats = "BUTTON_STATS", - Button_Cycle_Form = "BUTTON_CYCLE_FORM", - Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", - Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", - Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", - Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Button_Cycle_Tera = "BUTTON_CYCLE_TERA", - Button_Speed_Up = "BUTTON_SPEED_UP", - Button_Slow_Down = "BUTTON_SLOW_DOWN", - Button_Submit = "BUTTON_SUBMIT", + Controller = "CONTROLLER", + Gamepad_Support = "GAMEPAD_SUPPORT", + Button_Up = "BUTTON_UP", + Button_Down = "BUTTON_DOWN", + Button_Left = "BUTTON_LEFT", + Button_Right = "BUTTON_RIGHT", + Button_Action = "BUTTON_ACTION", + Button_Cancel = "BUTTON_CANCEL", + Button_Menu = "BUTTON_MENU", + Button_Stats = "BUTTON_STATS", + Button_Cycle_Form = "BUTTON_CYCLE_FORM", + Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", + Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", + Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", + Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Button_Speed_Up = "BUTTON_SPEED_UP", + Button_Slow_Down = "BUTTON_SLOW_DOWN", + Button_Submit = "BUTTON_SUBMIT", } const pressAction = "Press action to assign"; export const settingGamepadOptions = { - [SettingGamepad.Controller]: [ "Default", "Change" ], - [SettingGamepad.Gamepad_Support]: [ "Auto", "Disabled" ], - [SettingGamepad.Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingGamepad.Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingGamepad.Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingGamepad.Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingGamepad.Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingGamepad.Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingGamepad.Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingGamepad.Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], - [SettingGamepad.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingGamepad.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingGamepad.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], + [SettingGamepad.Controller]: ["Default", "Change"], + [SettingGamepad.Gamepad_Support]: ["Auto", "Disabled"], + [SettingGamepad.Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingGamepad.Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingGamepad.Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingGamepad.Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingGamepad.Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingGamepad.Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingGamepad.Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingGamepad.Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingGamepad.Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingGamepad.Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingGamepad.Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], }; export const settingGamepadDefaults = { @@ -83,8 +83,8 @@ export const settingGamepadBlackList = [ export function setSettingGamepad(setting: SettingGamepad, value: number): boolean { switch (setting) { case SettingGamepad.Gamepad_Support: - // if we change the value of the gamepad support, we call a method in the inputController to - // activate or deactivate the controller listener + // if we change the value of the gamepad support, we call a method in the inputController to + // activate or deactivate the controller listener globalScene.inputController.setGamepadSupport(settingGamepadOptions[setting][value] !== "Disabled"); break; case SettingGamepad.Button_Action: @@ -102,7 +102,7 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole case SettingGamepad.Button_Submit: if (value) { if (globalScene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { + const cancelHandler = (success = false): boolean => { globalScene.ui.revertMode(); (globalScene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); return success; @@ -120,7 +120,11 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole if (globalScene.ui && gp) { const cancelHandler = () => { globalScene.ui.revertMode(); - (globalScene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor(Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), 0, true); + (globalScene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor( + Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), + 0, + true, + ); (globalScene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); return false; }; @@ -130,13 +134,16 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole return true; }; globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { - options: [ ...gp.map((g: string) => ({ - label: truncateString(g, 30), // Truncate the gamepad name for display - handler: () => changeGamepadHandler(g) - })), { - label: "Cancel", - handler: cancelHandler, - }] + options: [ + ...gp.map((g: string) => ({ + label: truncateString(g, 30), // Truncate the gamepad name for display + handler: () => changeGamepadHandler(g), + })), + { + label: "Cancel", + handler: cancelHandler, + }, + ], }); return false; } diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index 1a7db1b10c2..ffe8811e5d9 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -5,81 +5,81 @@ import i18next from "i18next"; import { globalScene } from "#app/global-scene"; export enum SettingKeyboard { - // Default_Layout = "DEFAULT_LAYOUT", - Button_Up = "BUTTON_UP", - Alt_Button_Up = "ALT_BUTTON_UP", - Button_Down = "BUTTON_DOWN", - Alt_Button_Down = "ALT_BUTTON_DOWN", - Button_Left = "BUTTON_LEFT", - Alt_Button_Left = "ALT_BUTTON_LEFT", - Button_Right = "BUTTON_RIGHT", - Alt_Button_Right = "ALT_BUTTON_RIGHT", - Button_Action = "BUTTON_ACTION", - Alt_Button_Action = "ALT_BUTTON_ACTION", - Button_Cancel = "BUTTON_CANCEL", - Alt_Button_Cancel = "ALT_BUTTON_CANCEL", - Button_Menu = "BUTTON_MENU", - Alt_Button_Menu = "ALT_BUTTON_MENU", - Button_Stats = "BUTTON_STATS", - Alt_Button_Stats = "ALT_BUTTON_STATS", - Button_Cycle_Form = "BUTTON_CYCLE_FORM", - Alt_Button_Cycle_Form = "ALT_BUTTON_CYCLE_FORM", - Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", - Alt_Button_Cycle_Shiny = "ALT_BUTTON_CYCLE_SHINY", - Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", - Alt_Button_Cycle_Gender = "ALT_BUTTON_CYCLE_GENDER", - Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", - Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", - Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", - Button_Cycle_Tera = "BUTTON_CYCLE_TERA", - Alt_Button_Cycle_Tera = "ALT_BUTTON_CYCLE_TERA", - Button_Speed_Up = "BUTTON_SPEED_UP", - Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", - Button_Slow_Down = "BUTTON_SLOW_DOWN", - Alt_Button_Slow_Down = "ALT_BUTTON_SLOW_DOWN", - Button_Submit = "BUTTON_SUBMIT", - Alt_Button_Submit = "ALT_BUTTON_SUBMIT", + // Default_Layout = "DEFAULT_LAYOUT", + Button_Up = "BUTTON_UP", + Alt_Button_Up = "ALT_BUTTON_UP", + Button_Down = "BUTTON_DOWN", + Alt_Button_Down = "ALT_BUTTON_DOWN", + Button_Left = "BUTTON_LEFT", + Alt_Button_Left = "ALT_BUTTON_LEFT", + Button_Right = "BUTTON_RIGHT", + Alt_Button_Right = "ALT_BUTTON_RIGHT", + Button_Action = "BUTTON_ACTION", + Alt_Button_Action = "ALT_BUTTON_ACTION", + Button_Cancel = "BUTTON_CANCEL", + Alt_Button_Cancel = "ALT_BUTTON_CANCEL", + Button_Menu = "BUTTON_MENU", + Alt_Button_Menu = "ALT_BUTTON_MENU", + Button_Stats = "BUTTON_STATS", + Alt_Button_Stats = "ALT_BUTTON_STATS", + Button_Cycle_Form = "BUTTON_CYCLE_FORM", + Alt_Button_Cycle_Form = "ALT_BUTTON_CYCLE_FORM", + Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", + Alt_Button_Cycle_Shiny = "ALT_BUTTON_CYCLE_SHINY", + Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", + Alt_Button_Cycle_Gender = "ALT_BUTTON_CYCLE_GENDER", + Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", + Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", + Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", + Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Alt_Button_Cycle_Tera = "ALT_BUTTON_CYCLE_TERA", + Button_Speed_Up = "BUTTON_SPEED_UP", + Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", + Button_Slow_Down = "BUTTON_SLOW_DOWN", + Alt_Button_Slow_Down = "ALT_BUTTON_SLOW_DOWN", + Button_Submit = "BUTTON_SUBMIT", + Alt_Button_Submit = "ALT_BUTTON_SUBMIT", } const pressAction = i18next.t("settings:pressToBind"); export const settingKeyboardOptions = { // [SettingKeyboard.Default_Layout]: ['Default'], - [SettingKeyboard.Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingKeyboard.Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingKeyboard.Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingKeyboard.Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingKeyboard.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingKeyboard.Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingKeyboard.Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], - [SettingKeyboard.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], + [SettingKeyboard.Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingKeyboard.Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingKeyboard.Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingKeyboard.Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingKeyboard.Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingKeyboard.Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingKeyboard.Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingKeyboard.Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingKeyboard.Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingKeyboard.Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingKeyboard.Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], }; export const settingKeyboardDefaults = { @@ -132,7 +132,6 @@ export const settingKeyboardBlackList = [ SettingKeyboard.Button_Right, ]; - export function setSettingKeyboard(setting: SettingKeyboard, value: number): boolean { switch (setting) { case SettingKeyboard.Button_Up: @@ -170,7 +169,7 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo case SettingKeyboard.Alt_Button_Submit: if (value) { if (globalScene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { + const cancelHandler = (success = false): boolean => { globalScene.ui.revertMode(); (globalScene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); return success; @@ -184,5 +183,4 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo break; } return true; - } diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index b750400d6f5..1a7279d371c 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -11,13 +11,17 @@ import { PlayerGender } from "#enums/player-gender"; import { ShopCursorTarget } from "#enums/shop-cursor-target"; import { isLocal } from "#app/utils"; -const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i ? { - value: (i * 10).toString(), - label: (i * 10).toString(), -} : { - value: "Mute", - label: i18next.t("settings:mute") -}); +const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => + i + ? { + value: (i * 10).toString(), + label: (i * 10).toString(), + } + : { + value: "Mute", + label: i18next.t("settings:mute"), + }, +); const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).map((_, i) => { const value = ((i + 1) * 10).toString(); @@ -30,55 +34,55 @@ const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).ma const OFF_ON: SettingOption[] = [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "On", - label: i18next.t("settings:on") - } + label: i18next.t("settings:on"), + }, ]; const AUTO_DISABLED: SettingOption[] = [ { value: "Auto", - label: i18next.t("settings:auto") + label: i18next.t("settings:auto"), }, { value: "Disabled", - label: i18next.t("settings:disabled") - } + label: i18next.t("settings:disabled"), + }, ]; const TOUCH_CONTROLS_OPTIONS: SettingOption[] = [ { value: "Auto", - label: i18next.t("settings:auto") + label: i18next.t("settings:auto"), }, { value: "Disabled", label: i18next.t("settings:disabled"), needConfirmation: true, - confirmationMessage: i18next.t("settings:confirmDisableTouch") - } + confirmationMessage: i18next.t("settings:confirmDisableTouch"), + }, ]; const SHOP_CURSOR_TARGET_OPTIONS: SettingOption[] = [ { value: "Rewards", - label: i18next.t("settings:rewards") + label: i18next.t("settings:rewards"), }, { value: "Shop", - label: i18next.t("settings:shop") + label: i18next.t("settings:shop"), }, { value: "Reroll", - label: i18next.t("settings:reroll") + label: i18next.t("settings:reroll"), }, { value: "Check Team", - label: i18next.t("settings:checkTeam") - } + label: i18next.t("settings:checkTeam"), + }, ]; const shopCursorTargetIndexMap = SHOP_CURSOR_TARGET_OPTIONS.map(option => { @@ -102,27 +106,27 @@ const shopCursorTargetIndexMap = SHOP_CURSOR_TARGET_OPTIONS.map(option => { export enum SettingType { GENERAL, DISPLAY, - AUDIO + AUDIO, } type SettingOption = { - value: string, - label: string, - needConfirmation?: boolean, - confirmationMessage?: string + value: string; + label: string; + needConfirmation?: boolean; + confirmationMessage?: string; }; export interface Setting { - key: string - label: string - options: SettingOption[] - default: number - type: SettingType - requireReload?: boolean + key: string; + label: string; + options: SettingOption[]; + default: number; + type: SettingType; + requireReload?: boolean; /** Whether the setting can be activated or not */ - activatable?: boolean + activatable?: boolean; /** Determines whether the setting should be hidden from the UI */ - isHidden?: () => boolean + isHidden?: () => boolean; } /** @@ -171,12 +175,12 @@ export const SettingKeys = { Battle_Music: "BATTLE_MUSIC", Show_BGM_Bar: "SHOW_BGM_BAR", Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", - Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY" + Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY", }; export enum MusicPreference { GENFIVE, - ALLGENS + ALLGENS, } /** @@ -189,39 +193,39 @@ export const Setting: Array = [ options: [ { value: "1", - label: "1x" + label: "1x", }, { value: "1.25", - label: "1.25x" + label: "1.25x", }, { value: "1.5", - label: "1.5x" + label: "1.5x", }, { value: "2", - label: "2x" + label: "2x", }, { value: "2.5", - label: "2.5x" + label: "2.5x", }, { value: "3", - label: "3x" + label: "3x", }, { value: "4", - label: "4x" + label: "4x", }, { value: "5", - label: "5x" - } + label: "5x", + }, ], default: 3, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.HP_Bar_Speed, @@ -229,23 +233,23 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Fast", - label: i18next.t("settings:fast") + label: i18next.t("settings:fast"), }, { value: "Faster", - label: i18next.t("settings:faster") + label: i18next.t("settings:faster"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.EXP_Gains_Speed, @@ -253,23 +257,23 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Fast", - label: i18next.t("settings:fast") + label: i18next.t("settings:fast"), }, { value: "Faster", - label: i18next.t("settings:faster") + label: i18next.t("settings:faster"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.EXP_Party_Display, @@ -277,26 +281,26 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Level Up Notification", - label: i18next.t("settings:levelUpNotifications") + label: i18next.t("settings:levelUpNotifications"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Skip_Seen_Dialogues, label: i18next.t("settings:skipSeenDialogues"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Egg_Skip, @@ -304,19 +308,19 @@ export const Setting: Array = [ options: [ { value: "Never", - label: i18next.t("settings:never") + label: i18next.t("settings:never"), }, { value: "Ask", - label: i18next.t("settings:ask") + label: i18next.t("settings:ask"), }, { value: "Always", - label: i18next.t("settings:always") - } + label: i18next.t("settings:always"), + }, ], default: 1, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Battle_Style, @@ -324,50 +328,50 @@ export const Setting: Array = [ options: [ { value: "Switch", - label: i18next.t("settings:switch") + label: i18next.t("settings:switch"), }, { value: "Set", - label: i18next.t("settings:set") - } + label: i18next.t("settings:set"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Command_Cursor_Memory, label: i18next.t("settings:commandCursorMemory"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Enable_Retries, label: i18next.t("settings:enableRetries"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Hide_IVs, label: i18next.t("settings:hideIvs"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Tutorials, label: i18next.t("settings:tutorials"), options: OFF_ON, default: 1, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Vibration, label: i18next.t("settings:vibrations"), options: AUTO_DISABLED, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Touch_Controls, @@ -375,7 +379,7 @@ export const Setting: Array = [ options: TOUCH_CONTROLS_OPTIONS, default: 0, type: SettingType.GENERAL, - isHidden: () => !hasTouchscreen() + isHidden: () => !hasTouchscreen(), }, { key: SettingKeys.Move_Touch_Controls, @@ -383,13 +387,13 @@ export const Setting: Array = [ options: [ { value: "Configure", - label: i18next.t("settings:change") - } + label: i18next.t("settings:change"), + }, ], default: 0, type: SettingType.GENERAL, activatable: true, - isHidden: () => !hasTouchscreen() + isHidden: () => !hasTouchscreen(), }, { key: SettingKeys.Language, @@ -397,16 +401,16 @@ export const Setting: Array = [ options: [ { value: "English", - label: "English" + label: "English", }, { value: "Change", - label: i18next.t("settings:change") - } + label: i18next.t("settings:change"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.UI_Theme, @@ -414,16 +418,16 @@ export const Setting: Array = [ options: [ { value: "Default", - label: i18next.t("settings:default") + label: i18next.t("settings:default"), }, { value: "Legacy", - label: i18next.t("settings:legacy") - } + label: i18next.t("settings:legacy"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Window_Type, @@ -432,11 +436,11 @@ export const Setting: Array = [ const windowType = (i + 1).toString(); return { value: windowType, - label: windowType + label: windowType, }; }), default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Money_Format, @@ -444,15 +448,15 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Abbreviated", - label: i18next.t("settings:abbreviated") - } + label: i18next.t("settings:abbreviated"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Damage_Numbers, @@ -460,33 +464,33 @@ export const Setting: Array = [ options: [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "Simple", - label: i18next.t("settings:simple") + label: i18next.t("settings:simple"), }, { value: "Fancy", - label: i18next.t("settings:fancy") - } + label: i18next.t("settings:fancy"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Move_Animations, label: i18next.t("settings:moveAnimations"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Stats_on_Level_Up, label: i18next.t("settings:showStatsOnLevelUp"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Candy_Upgrade_Notification, @@ -494,19 +498,19 @@ export const Setting: Array = [ options: [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "Passives Only", - label: i18next.t("settings:passivesOnly") + label: i18next.t("settings:passivesOnly"), }, { value: "On", - label: i18next.t("settings:on") - } + label: i18next.t("settings:on"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Candy_Upgrade_Display, @@ -514,37 +518,37 @@ export const Setting: Array = [ options: [ { value: "Icon", - label: i18next.t("settings:icon") + label: i18next.t("settings:icon"), }, { value: "Animation", - label: i18next.t("settings:animation") - } + label: i18next.t("settings:animation"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Move_Info, label: i18next.t("settings:moveInfo"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Moveset_Flyout, label: i18next.t("settings:showMovesetFlyout"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Arena_Flyout, label: i18next.t("settings:showArenaFlyout"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Time_Of_Day_Widget, @@ -560,15 +564,15 @@ export const Setting: Array = [ options: [ { value: "Bounce", - label: i18next.t("settings:bounce") + label: i18next.t("settings:bounce"), }, { value: "Back", - label: i18next.t("settings:timeOfDay_back") - } + label: i18next.t("settings:timeOfDay_back"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Sprite_Set, @@ -576,23 +580,23 @@ export const Setting: Array = [ options: [ { value: "Consistent", - label: i18next.t("settings:consistent") + label: i18next.t("settings:consistent"), }, { value: "Experimental", - label: i18next.t("settings:experimental") - } + label: i18next.t("settings:experimental"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Fusion_Palette_Swaps, label: i18next.t("settings:fusionPaletteSwaps"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Player_Gender, @@ -600,64 +604,64 @@ export const Setting: Array = [ options: [ { value: "Boy", - label: i18next.t("settings:boy") + label: i18next.t("settings:boy"), }, { value: "Girl", - label: i18next.t("settings:girl") - } + label: i18next.t("settings:girl"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Type_Hints, label: i18next.t("settings:typeHints"), options: OFF_ON, default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_BGM_Bar, label: i18next.t("settings:showBgmBar"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Master_Volume, label: i18next.t("settings:masterVolume"), options: VOLUME_OPTIONS, default: 5, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.BGM_Volume, label: i18next.t("settings:bgmVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.Field_Volume, label: i18next.t("settings:fieldVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.SE_Volume, label: i18next.t("settings:seVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.UI_Volume, label: i18next.t("settings:uiVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.Battle_Music, @@ -665,23 +669,23 @@ export const Setting: Array = [ options: [ { value: "Gen V", - label: i18next.t("settings:musicGenFive") + label: i18next.t("settings:musicGenFive"), }, { value: "All Gens", - label: i18next.t("settings:musicAllGens") - } + label: i18next.t("settings:musicAllGens"), + }, ], default: MusicPreference.ALLGENS, type: SettingType.AUDIO, - requireReload: true + requireReload: true, }, { key: SettingKeys.Shop_Cursor_Target, label: i18next.t("settings:shopCursorTarget"), options: SHOP_CURSOR_TARGET_OPTIONS, default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Shop_Overlay_Opacity, @@ -689,8 +693,8 @@ export const Setting: Array = [ options: SHOP_OVERLAY_OPACITY_OPTIONS, default: 7, type: SettingType.DISPLAY, - requireReload: false - } + requireReload: false, + }, ]; if (isLocal) { @@ -699,7 +703,7 @@ if (isLocal) { label: i18next.t("settings:dexForDevs"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }); } @@ -716,7 +720,9 @@ export function settingIndex(key: string) { * Resets all settings to their defaults */ export function resetSettings() { - Setting.forEach(s => setSetting(s.key, s.default)); + for (const s of Setting) { + setSetting(s.key, s.default); + } } /** @@ -732,26 +738,26 @@ export function setSetting(setting: string, value: number): boolean { } switch (Setting[index].key) { case SettingKeys.Game_Speed: - globalScene.gameSpeed = parseFloat(Setting[index].options[value].value.replace("x", "")); + globalScene.gameSpeed = Number.parseFloat(Setting[index].options[value].value.replace("x", "")); break; case SettingKeys.Master_Volume: - globalScene.masterVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.masterVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; globalScene.updateSoundVolume(); break; case SettingKeys.BGM_Volume: - globalScene.bgmVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.bgmVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; globalScene.updateSoundVolume(); break; case SettingKeys.Field_Volume: - globalScene.fieldVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.fieldVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; globalScene.updateSoundVolume(); break; case SettingKeys.SE_Volume: - globalScene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.seVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; globalScene.updateSoundVolume(); break; case SettingKeys.UI_Volume: - globalScene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.uiVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; break; case SettingKeys.Battle_Music: globalScene.musicPreference = value; @@ -763,7 +769,7 @@ export function setSetting(setting: string, value: number): boolean { globalScene.uiTheme = value; break; case SettingKeys.Window_Type: - updateWindowType(parseInt(Setting[index].options[value].value)); + updateWindowType(Number.parseInt(Setting[index].options[value].value)); break; case SettingKeys.Tutorials: globalScene.enableTutorials = Setting[index].options[value].value === "On"; @@ -828,15 +834,17 @@ export function setSetting(setting: string, value: number): boolean { globalScene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; break; case SettingKeys.Time_Of_Day_Animation: - globalScene.timeOfDayAnimation = Setting[index].options[value].value === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; + globalScene.timeOfDayAnimation = + Setting[index].options[value].value === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; break; case SettingKeys.Show_Stats_on_Level_Up: globalScene.showLevelUpStats = Setting[index].options[value].value === "On"; break; - case SettingKeys.Shop_Cursor_Target: + case SettingKeys.Shop_Cursor_Target: { const selectedValue = shopCursorTargetIndexMap[value]; globalScene.shopCursorTarget = selectedValue; break; + } case SettingKeys.Command_Cursor_Memory: globalScene.commandCursorMemory = Setting[index].options[value].value === "On"; break; @@ -864,13 +872,14 @@ export function setSetting(setting: string, value: number): boolean { return false; } break; - case SettingKeys.Touch_Controls: + case SettingKeys.Touch_Controls: { globalScene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); const touchControls = document.getElementById("touchControls"); if (touchControls) { touchControls.classList.toggle("visible", globalScene.enableTouchControls); } break; + } case SettingKeys.Vibration: globalScene.enableVibration = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); break; @@ -901,43 +910,43 @@ export function setSetting(setting: string, value: number): boolean { options: [ { label: "English", - handler: () => changeLocaleHandler("en") + handler: () => changeLocaleHandler("en"), }, { label: "Español (ES)", - handler: () => changeLocaleHandler("es-ES") + handler: () => changeLocaleHandler("es-ES"), }, { label: "Italiano", - handler: () => changeLocaleHandler("it") + handler: () => changeLocaleHandler("it"), }, { label: "Français", - handler: () => changeLocaleHandler("fr") + handler: () => changeLocaleHandler("fr"), }, { label: "Deutsch", - handler: () => changeLocaleHandler("de") + handler: () => changeLocaleHandler("de"), }, { label: "Português (BR)", - handler: () => changeLocaleHandler("pt-BR") + handler: () => changeLocaleHandler("pt-BR"), }, { label: "简体中文", - handler: () => changeLocaleHandler("zh-CN") + handler: () => changeLocaleHandler("zh-CN"), }, { label: "繁體中文", - handler: () => changeLocaleHandler("zh-TW") + handler: () => changeLocaleHandler("zh-TW"), }, { label: "한국어", - handler: () => changeLocaleHandler("ko") + handler: () => changeLocaleHandler("ko"), }, { label: "日本語", - handler: () => changeLocaleHandler("ja") + handler: () => changeLocaleHandler("ja"), }, // { // label: "Català", @@ -945,17 +954,17 @@ export function setSetting(setting: string, value: number): boolean { // }, { label: i18next.t("settings:back"), - handler: () => cancelHandler() - } + handler: () => cancelHandler(), + }, ], - maxOptions: 7 + maxOptions: 7, }); return false; } } break; case SettingKeys.Shop_Overlay_Opacity: - globalScene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); + globalScene.updateShopOverlayOpacity(Number.parseInt(Setting[index].options[value].value) * 0.01); break; } diff --git a/src/system/trainer-data.ts b/src/system/trainer-data.ts index 134d16e25ef..48ab8d8d42a 100644 --- a/src/system/trainer-data.ts +++ b/src/system/trainer-data.ts @@ -9,9 +9,13 @@ export default class TrainerData { public partnerName: string; constructor(source: Trainer | any) { - const sourceTrainer = source instanceof Trainer ? source as Trainer : null; + const sourceTrainer = source instanceof Trainer ? (source as Trainer) : null; this.trainerType = sourceTrainer ? sourceTrainer.config.trainerType : source.trainerType; - this.variant = source.hasOwnProperty("variant") ? source.variant : source.female ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; + this.variant = source.hasOwnProperty("variant") + ? source.variant + : source.female + ? TrainerVariant.FEMALE + : TrainerVariant.DEFAULT; this.partyTemplateIndex = source.partyMemberTemplateIndex; this.name = source.name; this.partnerName = source.partnerName; diff --git a/src/system/unlockables.ts b/src/system/unlockables.ts index 0a666e2c755..2c396aad1f9 100644 --- a/src/system/unlockables.ts +++ b/src/system/unlockables.ts @@ -5,7 +5,7 @@ export enum Unlockables { ENDLESS_MODE, MINI_BLACK_HOLE, SPLICED_ENDLESS_MODE, - EVIOLITE + EVIOLITE, } export function getUnlockableName(unlockable: Unlockables) { diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 98d340d03aa..3c5abc2cc18 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -10,7 +10,7 @@ import * as v1_1_0 from "./versions/v1_1_0"; // --- v1.7.0 PATCHES --- // import * as v1_7_0 from "./versions/v1_7_0"; -const LATEST_VERSION = version.split(".").map(value => parseInt(value)); +const LATEST_VERSION = version.split(".").map(value => Number.parseInt(value)); /** * Converts incoming {@linkcode SystemSaveData} that has a version below the @@ -23,7 +23,7 @@ const LATEST_VERSION = version.split(".").map(value => parseInt(value)); * @see {@link SystemVersionConverter} */ export function applySystemVersionMigration(data: SystemSaveData) { - const curVersion = data.gameVersion.split(".").map(value => parseInt(value)); + const curVersion = data.gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SystemVersionConverter(); @@ -43,7 +43,7 @@ export function applySystemVersionMigration(data: SystemSaveData) { * @see {@link SessionVersionConverter} */ export function applySessionVersionMigration(data: SessionSaveData) { - const curVersion = data.gameVersion.split(".").map(value => parseInt(value)); + const curVersion = data.gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SessionVersionConverter(); @@ -64,7 +64,7 @@ export function applySessionVersionMigration(data: SessionSaveData) { */ export function applySettingsVersionMigration(data: Object) { const gameVersion: string = data.hasOwnProperty("gameVersion") ? data["gameVersion"] : "1.0.0"; - const curVersion = gameVersion.split(".").map(value => parseInt(value)); + const curVersion = gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SettingsVersionConverter(); @@ -101,8 +101,7 @@ abstract class VersionConverter { * body. * @param data The data to be operated on */ - applyStaticPreprocessors(_data: any): void { - } + applyStaticPreprocessors(_data: any): void {} /** * Uses the current version the incoming data to determine the starting point @@ -128,7 +127,7 @@ class SessionVersionConverter extends VersionConverter { } override applyMigration(data: SessionSaveData, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { @@ -158,7 +157,7 @@ class SessionVersionConverter extends VersionConverter { */ class SystemVersionConverter extends VersionConverter { override applyMigration(data: SystemSaveData, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { @@ -188,7 +187,7 @@ class SystemVersionConverter extends VersionConverter { */ class SettingsVersionConverter extends VersionConverter { override applyMigration(data: Object, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { diff --git a/src/system/version_migration/versions/v1_0_4.ts b/src/system/version_migration/versions/v1_0_4.ts index 2795e940866..16bd9db9915 100644 --- a/src/system/version_migration/versions/v1_0_4.ts +++ b/src/system/version_migration/versions/v1_0_4.ts @@ -1,6 +1,6 @@ import { SettingKeys } from "#app/system/settings/settings"; -import type { SystemSaveData, SessionSaveData } from "#app/system/game-data"; -import { AbilityAttr, defaultStarterSpecies, DexAttr } from "#app/system/game-data"; +import type { SystemSaveData, SessionSaveData } from "#app/system/game-data"; +import { AbilityAttr, defaultStarterSpecies, DexAttr } from "#app/system/game-data"; import { allSpecies } from "#app/data/pokemon-species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { isNullOrUndefined } from "#app/utils"; @@ -12,8 +12,9 @@ export const systemMigrators = [ */ function migrateAbilityData(data: SystemSaveData) { if (data.starterData && data.dexData) { + // biome-ignore lint/complexity/noForEach: Object.keys(data.starterData).forEach(sd => { - if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { + if (data.dexData[sd]?.caughtAttr && data.starterData[sd] && !data.starterData[sd].abilityAttr) { data.starterData[sd].abilityAttr = 1; } }); @@ -25,22 +26,44 @@ export const systemMigrators = [ * @param data {@linkcode SystemSaveData} */ function fixLegendaryStats(data: SystemSaveData) { - if (data.gameStats && (data.gameStats.legendaryPokemonCaught !== undefined && data.gameStats.subLegendaryPokemonCaught === undefined)) { + if ( + data.gameStats && + data.gameStats.legendaryPokemonCaught !== undefined && + data.gameStats.subLegendaryPokemonCaught === undefined + ) { data.gameStats.subLegendaryPokemonSeen = 0; data.gameStats.subLegendaryPokemonCaught = 0; data.gameStats.subLegendaryPokemonHatched = 0; - allSpecies.filter(s => s.subLegendary).forEach(s => { - const dexEntry = data.dexData[s.speciesId]; - data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; - data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); - data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; - data.gameStats.legendaryPokemonCaught = Math.max(data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); - data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; - data.gameStats.legendaryPokemonHatched = Math.max(data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); - }); - data.gameStats.subLegendaryPokemonSeen = Math.max(data.gameStats.subLegendaryPokemonSeen, data.gameStats.subLegendaryPokemonCaught); - data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen, data.gameStats.legendaryPokemonCaught); - data.gameStats.mythicalPokemonSeen = Math.max(data.gameStats.mythicalPokemonSeen, data.gameStats.mythicalPokemonCaught); + // biome-ignore lint/complexity/noForEach: + allSpecies + .filter(s => s.subLegendary) + .forEach(s => { + const dexEntry = data.dexData[s.speciesId]; + data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); + data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; + data.gameStats.legendaryPokemonCaught = Math.max( + data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, + 0, + ); + data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; + data.gameStats.legendaryPokemonHatched = Math.max( + data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, + 0, + ); + }); + data.gameStats.subLegendaryPokemonSeen = Math.max( + data.gameStats.subLegendaryPokemonSeen, + data.gameStats.subLegendaryPokemonCaught, + ); + data.gameStats.legendaryPokemonSeen = Math.max( + data.gameStats.legendaryPokemonSeen, + data.gameStats.legendaryPokemonCaught, + ); + data.gameStats.mythicalPokemonSeen = Math.max( + data.gameStats.mythicalPokemonSeen, + data.gameStats.mythicalPokemonCaught, + ); } }, @@ -59,7 +82,7 @@ export const systemMigrators = [ } } } - } + }, ] as const; export const settingsMigrators = [ @@ -68,13 +91,16 @@ export const settingsMigrators = [ * SettingKeys.Shop_Cursor_Target}. * @param data the `settings` object */ + + // biome-ignore lint/complexity/noBannedTypes: TODO: fix the type to not be object... function fixRerollTarget(data: Object) { if (data.hasOwnProperty("REROLL_TARGET") && !data.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) { data[SettingKeys.Shop_Cursor_Target] = data["REROLL_TARGET"]; + // biome-ignore lint/performance/noDelete: intentional delete data["REROLL_TARGET"]; localStorage.setItem("settings", JSON.stringify(data)); } - } + }, ] as const; export const sessionMigrators = [ @@ -85,7 +111,7 @@ export const sessionMigrators = [ * @param data {@linkcode SessionSaveData} */ function migrateModifiers(data: SessionSaveData) { - data.modifiers.forEach((m) => { + for (const m of data.modifiers) { if (m.className === "PokemonBaseStatModifier") { m.className = "BaseStatModifier"; } else if (m.className === "PokemonResetNegativeStatStageModifier") { @@ -102,13 +128,13 @@ export const sessionMigrators = [ m.typePregenArgs[0] = newStat; // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] - m.args = [ newStat, maxBattles, Math.min(m.args[1], maxBattles) ]; + m.args = [newStat, maxBattles, Math.min(m.args[1], maxBattles)]; } else { m.className = "TempCritBoosterModifier"; m.typePregenArgs = []; // From [ stat, battlesLeft ] to [ maxBattles, battleCount ] - m.args = [ maxBattles, Math.min(m.args[1], maxBattles) ]; + m.args = [maxBattles, Math.min(m.args[1], maxBattles)]; } } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; @@ -125,17 +151,17 @@ export const sessionMigrators = [ } // From [ battlesLeft ] to [ maxBattles, battleCount ] - m.args = [ maxBattles, Math.min(m.args[0], maxBattles) ]; + m.args = [maxBattles, Math.min(m.args[0], maxBattles)]; } - }); + } - data.enemyModifiers.forEach((m) => { + for (const m of data.enemyModifiers) { if (m.className === "PokemonBaseStatModifier") { m.className = "BaseStatModifier"; } else if (m.className === "PokemonResetNegativeStatStageModifier") { m.className = "ResetNegativeStatStageModifier"; } - }); + } }, /** * Converts old Pokemon natureOverride and mysteryEncounterData @@ -144,7 +170,7 @@ export const sessionMigrators = [ */ function migrateCustomPokemonDataAndNatureOverrides(data: SessionSaveData) { // Fix Pokemon nature overrides and custom data migration - data.party.forEach(pokemon => { + for (const pokemon of data.party) { if (pokemon["mysteryEncounterPokemonData"]) { pokemon.customPokemonData = new CustomPokemonData(pokemon["mysteryEncounterPokemonData"]); pokemon["mysteryEncounterPokemonData"] = null; @@ -158,6 +184,6 @@ export const sessionMigrators = [ pokemon.customPokemonData.nature = pokemon["natureOverride"]; pokemon["natureOverride"] = -1; } - }); - } + } + }, ] as const; diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts index 3dcff3af241..167cd974e56 100644 --- a/src/system/version_migration/versions/v1_7_0.ts +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -14,12 +14,15 @@ export const systemMigrators = [ Object.keys(data.starterData).forEach(sd => { const caughtAttr = data.dexData[sd]?.caughtAttr; const speciesNumber = Number(sd); - if (!speciesNumber) { // An unknown bug at some point in time caused some accounts to have starter data for pokedex number 0 which crashes + if (!speciesNumber) { + // An unknown bug at some point in time caused some accounts to have starter data for pokedex number 0 which crashes return; } const species = getPokemonSpecies(speciesNumber); if (caughtAttr && species.forms?.length > 1) { - const selectableForms = species.forms.filter((form, formIndex) => form.isStarterSelectable && (caughtAttr & globalScene.gameData.getFormAttr(formIndex))); + const selectableForms = species.forms.filter( + (form, formIndex) => form.isStarterSelectable && caughtAttr & globalScene.gameData.getFormAttr(formIndex), + ); if (selectableForms.length === 0) { data.dexData[sd].caughtAttr += DexAttr.DEFAULT_FORM; } @@ -33,9 +36,9 @@ export const settingsMigrators = [] as const; export const sessionMigrators = [ function migrateTera(data: SessionSaveData) { - for (let i = 0; i < data.modifiers.length;) { + for (let i = 0; i < data.modifiers.length; ) { if (data.modifiers[i].className === "TerastallizeModifier") { - data.party.forEach((p) => { + data.party.forEach(p => { if (p.id === data.modifiers[i].args[0]) { p.teraType = data.modifiers[i].args[1]; } @@ -46,9 +49,9 @@ export const sessionMigrators = [ } } - for (let i = 0; i < data.enemyModifiers.length;) { + for (let i = 0; i < data.enemyModifiers.length; ) { if (data.enemyModifiers[i].className === "TerastallizeModifier") { - data.enemyParty.forEach((p) => { + data.enemyParty.forEach(p => { if (p.id === data.enemyModifiers[i].args[0]) { p.teraType = data.enemyModifiers[i].args[1]; } @@ -70,5 +73,5 @@ export const sessionMigrators = [ p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; } }); - } + }, ] as const; diff --git a/src/system/voucher.ts b/src/system/voucher.ts index e6bee131797..39294bccf13 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -9,7 +9,7 @@ export enum VoucherType { REGULAR, PLUS, PREMIUM, - GOLDEN + GOLDEN, } export class Voucher { @@ -31,10 +31,10 @@ export class Voucher { /** * Get the name of the voucher - * @param playerGender - this is ignored here. It's only there to match the signature of the function in the Achv class + * @param _playerGender - this is ignored here. It's only there to match the signature of the function in the Achv class * @returns the name of the voucher */ - getName(playerGender: PlayerGender): string { + getName(_playerGender: PlayerGender): string { return getVoucherTypeName(this.voucherType); } @@ -89,32 +89,32 @@ export interface Vouchers { export const vouchers: Vouchers = {}; export function initVouchers() { - for (const achv of [ achvs.CLASSIC_VICTORY ]) { - const voucherType = achv.score >= 150 - ? VoucherType.GOLDEN - : achv.score >= 100 - ? VoucherType.PREMIUM - : achv.score >= 75 - ? VoucherType.PLUS - : VoucherType.REGULAR; + for (const achv of [achvs.CLASSIC_VICTORY]) { + const voucherType = + achv.score >= 150 + ? VoucherType.GOLDEN + : achv.score >= 100 + ? VoucherType.PREMIUM + : achv.score >= 75 + ? VoucherType.PLUS + : VoucherType.REGULAR; vouchers[achv.id] = new Voucher(voucherType, getAchievementDescription(achv.localizationKey)); } - const bossTrainerTypes = Object.keys(trainerConfigs) - .filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL && trainerConfigs[tt].hasVoucher); + const bossTrainerTypes = Object.keys(trainerConfigs).filter( + tt => + trainerConfigs[tt].isBoss && + trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL && + trainerConfigs[tt].hasVoucher, + ); for (const trainerType of bossTrainerTypes) { - const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 - ? VoucherType.PLUS - : VoucherType.PREMIUM; + const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 ? VoucherType.PLUS : VoucherType.PREMIUM; const key = TrainerType[trainerType]; const trainerName = trainerConfigs[trainerType].name; const trainer = trainerConfigs[trainerType]; const title = trainer.title ? ` (${trainer.title})` : ""; - vouchers[key] = new Voucher( - voucherType, - `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`, - ); + vouchers[key] = new Voucher(voucherType, `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`); } const voucherKeys = Object.keys(vouchers); for (const k of voucherKeys) { diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index c12f9d569c0..80667b033ad 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -13,7 +13,7 @@ import { MysteryEncounterTier } from "./enums/mystery-encounter-tier"; export enum EventType { SHINY, NO_TIMER_DISPLAY, - LUCK + LUCK, } interface EventBanner { @@ -63,7 +63,7 @@ const timedEvents: TimedEvent[] = [ endDate: new Date(Date.UTC(2025, 0, 4, 0)), bannerKey: "winter_holidays2024-event-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], eventEncounters: [ { species: Species.GIMMIGHOUL, blockEvolution: true }, { species: Species.DELIBIRD }, @@ -84,17 +84,26 @@ const timedEvents: TimedEvent[] = [ { species: Species.SMOLIV }, { species: Species.ALOLA_VULPIX }, { species: Species.GALAR_DARUMAKA }, - { species: Species.IRON_BUNDLE } + { species: Species.IRON_BUNDLE }, ], - delibirdyBuff: [ "CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM" ], + delibirdyBuff: ["CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM"], weather: [{ weatherType: WeatherType.SNOW, weight: 1 }], mysteryEncounterTierChanges: [ - { mysteryEncounter: MysteryEncounterType.DELIBIRDY, tier: MysteryEncounterTier.COMMON }, + { + mysteryEncounter: MysteryEncounterType.DELIBIRDY, + tier: MysteryEncounterTier.COMMON, + }, { mysteryEncounter: MysteryEncounterType.PART_TIMER, disable: true }, - { mysteryEncounter: MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, disable: true }, + { + mysteryEncounter: MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + disable: true, + }, { mysteryEncounter: MysteryEncounterType.FIELD_TRIP, disable: true }, - { mysteryEncounter: MysteryEncounterType.DEPARTMENT_STORE_SALE, disable: true } - ] + { + mysteryEncounter: MysteryEncounterType.DEPARTMENT_STORE_SALE, + disable: true, + }, + ], }, { name: "Year of the Snake", @@ -104,7 +113,7 @@ const timedEvents: TimedEvent[] = [ endDate: new Date(Date.UTC(2025, 1, 3, 0)), bannerKey: "yearofthesnakeevent-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], eventEncounters: [ { species: Species.EKANS }, { species: Species.ONIX }, @@ -120,32 +129,46 @@ const timedEvents: TimedEvent[] = [ { species: Species.DARUMAKA }, { species: Species.DRAMPA }, { species: Species.SILICOBRA }, - { species: Species.BLOODMOON_URSALUNA } + { species: Species.BLOODMOON_URSALUNA }, ], luckBoostedSpecies: [ - Species.EKANS, Species.ARBOK, - Species.ONIX, Species.STEELIX, - Species.DRATINI, Species.DRAGONAIR, Species.DRAGONITE, - Species.CLEFFA, Species.CLEFAIRY, Species.CLEFABLE, + Species.EKANS, + Species.ARBOK, + Species.ONIX, + Species.STEELIX, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.CLEFFA, + Species.CLEFAIRY, + Species.CLEFABLE, Species.UMBREON, - Species.DUNSPARCE, Species.DUDUNSPARCE, - Species.TEDDIURSA, Species.URSARING, Species.URSALUNA, + Species.DUNSPARCE, + Species.DUDUNSPARCE, + Species.TEDDIURSA, + Species.URSARING, + Species.URSALUNA, Species.SEVIPER, Species.LUNATONE, Species.RAYQUAZA, - Species.CHINGLING, Species.CHIMECHO, + Species.CHINGLING, + Species.CHIMECHO, Species.CRESSELIA, Species.DARKRAI, - Species.SNIVY, Species.SERVINE, Species.SERPERIOR, - Species.DARUMAKA, Species.DARMANITAN, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.DARUMAKA, + Species.DARMANITAN, Species.ZYGARDE, Species.DRAMPA, Species.LUNALA, Species.BLACEPHALON, - Species.SILICOBRA, Species.SANDACONDA, + Species.SILICOBRA, + Species.SANDACONDA, Species.ROARING_MOON, - Species.BLOODMOON_URSALUNA - ] + Species.BLOODMOON_URSALUNA, + ], }, { name: "Valentine", @@ -156,7 +179,7 @@ const timedEvents: TimedEvent[] = [ shinyMultiplier: 2, bannerKey: "valentines2025event-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], eventEncounters: [ { species: Species.NIDORAN_F }, { species: Species.NIDORAN_M }, @@ -177,9 +200,9 @@ const timedEvents: TimedEvent[] = [ { species: Species.MILCERY }, { species: Species.INDEEDEE }, { species: Species.TANDEMAUS }, - { species: Species.ENAMORUS } + { species: Species.ENAMORUS }, ], - luckBoostedSpecies: [ Species.LUVDISC ] + luckBoostedSpecies: [Species.LUVDISC], }, { name: "PKMNDAY2025", @@ -189,35 +212,48 @@ const timedEvents: TimedEvent[] = [ classicFriendshipMultiplier: 4, bannerKey: "pkmnday2025event-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], eventEncounters: [ { species: Species.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form { species: Species.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form { species: Species.CHIKORITA }, { species: Species.TOTODILE }, - { species: Species.TEPIG } + { species: Species.TEPIG }, ], luckBoostedSpecies: [ - Species.PICHU, Species.PIKACHU, Species.RAICHU, Species.ALOLA_RAICHU, - Species.PSYDUCK, Species.GOLDUCK, - Species.EEVEE, Species.FLAREON, Species.JOLTEON, Species.VAPOREON, Species.ESPEON, Species.UMBREON, Species.LEAFEON, Species.GLACEON, Species.SYLVEON, - Species.CHIKORITA, Species.BAYLEEF, Species.MEGANIUM, - Species.TOTODILE, Species.CROCONAW, Species.FERALIGATR, - Species.TEPIG, Species.PIGNITE, Species.EMBOAR, + Species.PICHU, + Species.PIKACHU, + Species.RAICHU, + Species.ALOLA_RAICHU, + Species.PSYDUCK, + Species.GOLDUCK, + Species.EEVEE, + Species.FLAREON, + Species.JOLTEON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, Species.ZYGARDE, - Species.ETERNAL_FLOETTE - ] - } + Species.ETERNAL_FLOETTE, + ], + }, ]; export class TimedEventManager { - constructor() {} - isActive(event: TimedEvent) { - return ( - event.startDate < new Date() && - new Date() < event.endDate - ); + return event.startDate < new Date() && new Date() < event.endDate; } activeEvent(): TimedEvent | undefined { @@ -229,16 +265,16 @@ export class TimedEventManager { } activeEventHasBanner(): boolean { - const activeEvents = timedEvents.filter((te) => this.isActive(te) && te.hasOwnProperty("bannerFilename")); + const activeEvents = timedEvents.filter(te => this.isActive(te) && te.hasOwnProperty("bannerFilename")); return activeEvents.length > 0; } getShinyMultiplier(): number { let multiplier = 1; - const shinyEvents = timedEvents.filter((te) => te.eventType === EventType.SHINY && this.isActive(te)); - shinyEvents.forEach((se) => { + const shinyEvents = timedEvents.filter(te => te.eventType === EventType.SHINY && this.isActive(te)); + for (const se of shinyEvents) { multiplier *= se.shinyMultiplier ?? 1; - }); + } return multiplier; } @@ -249,11 +285,13 @@ export class TimedEventManager { getEventEncounters(): EventEncounter[] { const ret: EventEncounter[] = []; - timedEvents.filter((te) => this.isActive(te)).map((te) => { - if (!isNullOrUndefined(te.eventEncounters)) { - ret.push(...te.eventEncounters); - } - }); + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.eventEncounters)) { + ret.push(...te.eventEncounters); + } + }); return ret; } @@ -263,12 +301,12 @@ export class TimedEventManager { */ getClassicFriendshipMultiplier(): number { let multiplier = CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; - const classicFriendshipEvents = timedEvents.filter((te) => this.isActive(te)); - classicFriendshipEvents.forEach((fe) => { + const classicFriendshipEvents = timedEvents.filter(te => this.isActive(te)); + for (const fe of classicFriendshipEvents) { if (!isNullOrUndefined(fe.classicFriendshipMultiplier) && fe.classicFriendshipMultiplier > multiplier) { multiplier = fe.classicFriendshipMultiplier; } - }); + } return multiplier; } @@ -277,7 +315,7 @@ export class TimedEventManager { * @returns Whether vouchers should be upgraded */ getUpgradeUnlockedVouchers(): boolean { - return timedEvents.some((te) => this.isActive(te) && (te.upgradeUnlockedVouchers ?? false)); + return timedEvents.some(te => this.isActive(te) && (te.upgradeUnlockedVouchers ?? false)); } /** @@ -286,11 +324,13 @@ export class TimedEventManager { */ getDelibirdyBuff(): string[] { const ret: string[] = []; - timedEvents.filter((te) => this.isActive(te)).map((te) => { - if (!isNullOrUndefined(te.delibirdyBuff)) { - ret.push(...te.delibirdyBuff); - } - }); + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.delibirdyBuff)) { + ret.push(...te.delibirdyBuff); + } + }); return ret; } @@ -300,69 +340,82 @@ export class TimedEventManager { */ getWeather(): WeatherPoolEntry[] { const ret: WeatherPoolEntry[] = []; - timedEvents.filter((te) => this.isActive(te)).map((te) => { - if (!isNullOrUndefined(te.weather)) { - ret.push(...te.weather); - } - }); + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.weather)) { + ret.push(...te.weather); + } + }); return ret; } getAllMysteryEncounterChanges(): EventMysteryEncounterTier[] { const ret: EventMysteryEncounterTier[] = []; - timedEvents.filter((te) => this.isActive(te)).map((te) => { - if (!isNullOrUndefined(te.mysteryEncounterTierChanges)) { - ret.push(...te.mysteryEncounterTierChanges); - } - }); + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.mysteryEncounterTierChanges)) { + ret.push(...te.mysteryEncounterTierChanges); + } + }); return ret; } getEventMysteryEncountersDisabled(): MysteryEncounterType[] { const ret: MysteryEncounterType[] = []; - timedEvents.filter((te) => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)).map((te) => { - te.mysteryEncounterTierChanges?.map((metc) => { - if (metc.disable) { - ret.push(metc.mysteryEncounter); - } + timedEvents + .filter(te => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)) + .map(te => { + te.mysteryEncounterTierChanges?.map(metc => { + if (metc.disable) { + ret.push(metc.mysteryEncounter); + } + }); }); - }); return ret; } - getMysteryEncounterTierForEvent(encounterType: MysteryEncounterType, normal: MysteryEncounterTier): MysteryEncounterTier { + getMysteryEncounterTierForEvent( + encounterType: MysteryEncounterType, + normal: MysteryEncounterTier, + ): MysteryEncounterTier { let ret = normal; - timedEvents.filter((te) => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)).map((te) => { - te.mysteryEncounterTierChanges?.map((metc) => { - if (metc.mysteryEncounter === encounterType) { - ret = metc.tier ?? normal; - } + timedEvents + .filter(te => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)) + .map(te => { + te.mysteryEncounterTierChanges?.map(metc => { + if (metc.mysteryEncounter === encounterType) { + ret = metc.tier ?? normal; + } + }); }); - }); return ret; } getEventLuckBoost(): number { let ret = 0; - const luckEvents = timedEvents.filter((te) => this.isActive(te) && !isNullOrUndefined(te.luckBoost)); - luckEvents.forEach((le) => { + const luckEvents = timedEvents.filter(te => this.isActive(te) && !isNullOrUndefined(te.luckBoost)); + for (const le of luckEvents) { ret += le.luckBoost!; - }); + } return ret; } getEventLuckBoostedSpecies(): Species[] { const ret: Species[] = []; - timedEvents.filter((te) => this.isActive(te)).map((te) => { - if (!isNullOrUndefined(te.luckBoostedSpecies)) { - ret.push(...te.luckBoostedSpecies.filter(s => !ret.includes(s))); - } - }); + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.luckBoostedSpecies)) { + ret.push(...te.luckBoostedSpecies.filter(s => !ret.includes(s))); + } + }); return ret; } areFusionsBoosted(): boolean { - return timedEvents.some((te) => this.isActive(te) && te.boostFusions); + return timedEvents.some(te => this.isActive(te) && te.boostFusions); } } @@ -399,7 +452,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { setup() { const lang = i18next.resolvedLanguage; - if (this.event && this.event.bannerKey) { + if (this.event?.bannerKey) { let key = this.event.bannerKey; if (lang && this.event.availableLangs && this.event.availableLangs.length > 0) { if (this.event.availableLangs.includes(lang)) { @@ -421,7 +474,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { this.banner.x, this.banner.y + 2, this.timeToGo(this.event.endDate), - TextStyle.WINDOW + TextStyle.WINDOW, ); this.eventTimerText.setName("text-event-timer"); this.eventTimerText.setScale(0.15); @@ -449,7 +502,6 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { } private timeToGo(date: Date) { - // Utility to add leading zero function z(n) { return (n < 10 ? "0" : "") + n; @@ -461,13 +513,18 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { diff = Math.abs(diff); // Get time components - const days = diff / 8.64e7 | 0; - const hours = diff % 8.64e7 / 3.6e6 | 0; - const mins = diff % 3.6e6 / 6e4 | 0; - const secs = Math.round(diff % 6e4 / 1e3); + const days = (diff / 8.64e7) | 0; + const hours = ((diff % 8.64e7) / 3.6e6) | 0; + const mins = ((diff % 3.6e6) / 6e4) | 0; + const secs = Math.round((diff % 6e4) / 1e3); // Return formatted string - return i18next.t("menu:eventTimer", { days: z(days), hours: z(hours), mins: z(mins), secs: z(secs) }); + return i18next.t("menu:eventTimer", { + days: z(days), + hours: z(hours), + mins: z(mins), + secs: z(secs), + }); } updateCountdown() { diff --git a/src/touch-controls.ts b/src/touch-controls.ts index db2ae223d3f..e2b5ad05baa 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -9,9 +9,9 @@ export default class TouchControl { private buttonLock: string[] = new Array(); private inputInterval: NodeJS.Timeout[] = new Array(); /** Whether touch controls are disabled */ - private disabled: boolean = false; + private disabled = false; /** Whether the last touch event has finished before disabling */ - private finishedLastTouch: boolean = false; + private finishedLastTouch = false; constructor() { this.events = globalScene.game.events; @@ -23,12 +23,12 @@ export default class TouchControl { */ disable() { this.disabled = true; - this.finishedLastTouch = false; + this.finishedLastTouch = false; } /** * Enable touch controls - */ + */ enable() { this.disabled = false; this.finishedLastTouch = false; @@ -39,7 +39,7 @@ export default class TouchControl { */ init() { this.preventElementZoom(document.querySelector("#dpad")); - document.querySelectorAll(".apad-button").forEach((element) => this.preventElementZoom(element as HTMLElement)); + document.querySelectorAll(".apad-button").forEach(element => this.preventElementZoom(element as HTMLElement)); // Select all elements with the 'data-key' attribute and bind keys to them for (const button of document.querySelectorAll("[data-key]")) { // @ts-ignore - Bind the key to the button using the dataset key @@ -87,11 +87,10 @@ export default class TouchControl { }, repeatInputDelayMillis); this.buttonLock.push(key); node.classList.add("active"); - } touchButtonUp(node: HTMLElement, key: string, id: string) { - if (!this.buttonLock.includes(key) || this.disabled && this.finishedLastTouch) { + if (!this.buttonLock.includes(key) || (this.disabled && this.finishedLastTouch)) { return; } this.finishedLastTouch = true; @@ -126,14 +125,14 @@ export default class TouchControl { this.events.emit("input_down", { controller_type: "keyboard", button: button, - isTouch: true + isTouch: true, }); break; case "keyup": this.events.emit("input_up", { controller_type: "keyboard", button: button, - isTouch: true + isTouch: true, }); break; } @@ -151,7 +150,6 @@ export default class TouchControl { return; } element.addEventListener("touchstart", (event: TouchEvent) => { - if (!(event.currentTarget instanceof HTMLElement)) { return; } @@ -175,8 +173,8 @@ export default class TouchControl { } /** - * Deactivates all currently pressed keys. - */ + * Deactivates all currently pressed keys. + */ deactivatePressedKey(): void { for (const key of Object.keys(this.inputInterval)) { clearInterval(this.inputInterval[key]); @@ -204,9 +202,16 @@ export function hasTouchscreen(): boolean { */ export function isMobile(): boolean { let ret = false; - (function (a) { + (a => { // Check the user agent string against a regex for mobile devices - if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) { + if ( + /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( + a, + ) || + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( + a.substr(0, 4), + ) + ) { ret = true; } })(navigator.userAgent || navigator.vendor || window["opera"]); diff --git a/src/tutorial.ts b/src/tutorial.ts index 6890075a642..82912f73979 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -14,7 +14,7 @@ export enum Tutorial { Pokerus = "POKERUS", Stat_Change = "STAT_CHANGE", Select_Item = "SELECT_ITEM", - Egg_Gacha = "EGG_GACHA" + Egg_Gacha = "EGG_GACHA", } const tutorialHandlers = { @@ -28,40 +28,93 @@ const tutorialHandlers = { if (globalScene.enableTouchControls) { return resolve(); } - globalScene.showFieldOverlay(1000).then(() => globalScene.ui.showText(i18next.t("tutorial:accessMenu"), null, () => globalScene.hideFieldOverlay(1000).then(() => resolve()), null, true)); + globalScene + .showFieldOverlay(1000) + .then(() => + globalScene.ui.showText( + i18next.t("tutorial:accessMenu"), + null, + () => globalScene.hideFieldOverlay(1000).then(() => resolve()), + null, + true, + ), + ); }); }, [Tutorial.Menu]: () => { return new Promise(resolve => { globalScene.gameData.saveTutorialFlag(Tutorial.Access_Menu, true); - globalScene.ui.showText(i18next.t("tutorial:menu"), null, () => globalScene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:menu"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, [Tutorial.Starter_Select]: () => { return new Promise(resolve => { - globalScene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => globalScene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:starterSelect"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, [Tutorial.Pokerus]: () => { return new Promise(resolve => { - globalScene.ui.showText(i18next.t("tutorial:pokerus"), null, () => globalScene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:pokerus"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, [Tutorial.Stat_Change]: () => { return new Promise(resolve => { - globalScene.showFieldOverlay(1000).then(() => globalScene.ui.showText(i18next.t("tutorial:statChange"), null, () => globalScene.ui.showText("", null, () => globalScene.hideFieldOverlay(1000).then(() => resolve())), null, true)); + globalScene + .showFieldOverlay(1000) + .then(() => + globalScene.ui.showText( + i18next.t("tutorial:statChange"), + null, + () => globalScene.ui.showText("", null, () => globalScene.hideFieldOverlay(1000).then(() => resolve())), + null, + true, + ), + ); }); }, [Tutorial.Select_Item]: () => { return new Promise(resolve => { globalScene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { - globalScene.ui.showText(i18next.t("tutorial:selectItem"), null, () => globalScene.ui.showText("", null, () => globalScene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve())), null, true); + globalScene.ui.showText( + i18next.t("tutorial:selectItem"), + null, + () => + globalScene.ui.showText("", null, () => + globalScene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve()), + ), + null, + true, + ); }); }); }, [Tutorial.Egg_Gacha]: () => { return new Promise(resolve => { - globalScene.ui.showText(i18next.t("tutorial:eggGacha"), null, () => globalScene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:eggGacha"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, }; @@ -119,7 +172,7 @@ async function showTutorialOverlay(handler: UiHandler) { ease: "Sine.easeOut", onComplete: () => { return true; - } + }, }); } else { return true; @@ -140,10 +193,9 @@ async function hideTutorialOverlay(handler: UiHandler) { ease: "Sine.easeOut", onComplete: () => { return true; - } + }, }); } else { return true; } } - diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index d5c4529470b..c9898f9b71e 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -45,23 +45,31 @@ export class UiInputs { } listenInputs(): void { - this.events.on("input_down", (event) => { - this.detectInputMethod(event); + this.events.on( + "input_down", + event => { + this.detectInputMethod(event); - const actions = this.getActionsKeyDown(); - if (!actions.hasOwnProperty(event.button)) { - return; - } - actions[event.button](); - }, this); + const actions = this.getActionsKeyDown(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, + this, + ); - this.events.on("input_up", (event) => { - const actions = this.getActionsKeyUp(); - if (!actions.hasOwnProperty(event.button)) { - return; - } - actions[event.button](); - }, this); + this.events.on( + "input_up", + event => { + const actions = this.getActionsKeyUp(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, + this, + ); } doVibration(inputSuccess: boolean, vibrationLength: number): void { @@ -72,46 +80,46 @@ export class UiInputs { getActionsKeyDown(): ActionKeys { const actions: ActionKeys = { - [Button.UP]: () => this.buttonDirection(Button.UP), - [Button.DOWN]: () => this.buttonDirection(Button.DOWN), - [Button.LEFT]: () => this.buttonDirection(Button.LEFT), - [Button.RIGHT]: () => this.buttonDirection(Button.RIGHT), - [Button.SUBMIT]: () => this.buttonTouch(), - [Button.ACTION]: () => this.buttonAb(Button.ACTION), - [Button.CANCEL]: () => this.buttonAb(Button.CANCEL), - [Button.MENU]: () => this.buttonMenu(), - [Button.STATS]: () => this.buttonGoToFilter(Button.STATS), - [Button.CYCLE_SHINY]: () => this.buttonCycleOption(Button.CYCLE_SHINY), - [Button.CYCLE_FORM]: () => this.buttonCycleOption(Button.CYCLE_FORM), - [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), - [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), - [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), - [Button.CYCLE_TERA]: () => this.buttonCycleOption(Button.CYCLE_TERA), - [Button.SPEED_UP]: () => this.buttonSpeedChange(), - [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), + [Button.UP]: () => this.buttonDirection(Button.UP), + [Button.DOWN]: () => this.buttonDirection(Button.DOWN), + [Button.LEFT]: () => this.buttonDirection(Button.LEFT), + [Button.RIGHT]: () => this.buttonDirection(Button.RIGHT), + [Button.SUBMIT]: () => this.buttonTouch(), + [Button.ACTION]: () => this.buttonAb(Button.ACTION), + [Button.CANCEL]: () => this.buttonAb(Button.CANCEL), + [Button.MENU]: () => this.buttonMenu(), + [Button.STATS]: () => this.buttonGoToFilter(Button.STATS), + [Button.CYCLE_SHINY]: () => this.buttonCycleOption(Button.CYCLE_SHINY), + [Button.CYCLE_FORM]: () => this.buttonCycleOption(Button.CYCLE_FORM), + [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), + [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), + [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), + [Button.CYCLE_TERA]: () => this.buttonCycleOption(Button.CYCLE_TERA), + [Button.SPEED_UP]: () => this.buttonSpeedChange(), + [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), }; return actions; } getActionsKeyUp(): ActionKeys { const actions: ActionKeys = { - [Button.UP]: () => undefined, - [Button.DOWN]: () => undefined, - [Button.LEFT]: () => undefined, - [Button.RIGHT]: () => undefined, - [Button.SUBMIT]: () => undefined, - [Button.ACTION]: () => undefined, - [Button.CANCEL]: () => undefined, - [Button.MENU]: () => undefined, - [Button.STATS]: () => this.buttonStats(false), - [Button.CYCLE_SHINY]: () => undefined, - [Button.CYCLE_FORM]: () => undefined, - [Button.CYCLE_GENDER]: () => undefined, - [Button.CYCLE_ABILITY]: () => undefined, - [Button.CYCLE_NATURE]: () => undefined, - [Button.CYCLE_TERA]: () => this.buttonInfo(false), - [Button.SPEED_UP]: () => undefined, - [Button.SLOW_DOWN]: () => undefined, + [Button.UP]: () => undefined, + [Button.DOWN]: () => undefined, + [Button.LEFT]: () => undefined, + [Button.RIGHT]: () => undefined, + [Button.SUBMIT]: () => undefined, + [Button.ACTION]: () => undefined, + [Button.CANCEL]: () => undefined, + [Button.MENU]: () => undefined, + [Button.STATS]: () => this.buttonStats(false), + [Button.CYCLE_SHINY]: () => undefined, + [Button.CYCLE_FORM]: () => undefined, + [Button.CYCLE_GENDER]: () => undefined, + [Button.CYCLE_ABILITY]: () => undefined, + [Button.CYCLE_NATURE]: () => undefined, + [Button.CYCLE_TERA]: () => this.buttonInfo(false), + [Button.SPEED_UP]: () => undefined, + [Button.SLOW_DOWN]: () => undefined, }; return actions; } @@ -130,7 +138,7 @@ export class UiInputs { globalScene.ui.processInput(Button.SUBMIT) || globalScene.ui.processInput(Button.ACTION); } - buttonStats(pressed: boolean = true): void { + buttonStats(pressed = true): void { // allow access to Button.STATS as a toggle for other elements for (const t of globalScene.getInfoToggles(true)) { t.toggleInfo(pressed); @@ -142,7 +150,7 @@ export class UiInputs { } buttonGoToFilter(button: Button): void { - const whitelist = [ StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler ]; + const whitelist = [StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler]; const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); @@ -151,8 +159,8 @@ export class UiInputs { } } - buttonInfo(pressed: boolean = true): void { - if (globalScene.showMovesetFlyout ) { + buttonInfo(pressed = true): void { + if (globalScene.showMovesetFlyout) { for (const p of globalScene.getField().filter(p => p?.isActive(true))) { p.toggleFlyout(pressed); } @@ -193,7 +201,17 @@ export class UiInputs { } buttonCycleOption(button: Button): void { - const whitelist = [ StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler, SettingsUiHandler, RunInfoUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler ]; + const whitelist = [ + StarterSelectUiHandler, + PokedexUiHandler, + PokedexPageUiHandler, + SettingsUiHandler, + RunInfoUiHandler, + SettingsDisplayUiHandler, + SettingsAudioUiHandler, + SettingsGamepadUiHandler, + SettingsKeyboardUiHandler, + ]; const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); @@ -205,16 +223,24 @@ export class UiInputs { buttonSpeedChange(up = true): void { const settingGameSpeed = settingIndex(SettingKeys.Game_Speed); if (up && globalScene.gameSpeed < 5) { - globalScene.gameData.saveSetting(SettingKeys.Game_Speed, Setting[settingGameSpeed].options.findIndex((item) => item.label === `${globalScene.gameSpeed}x`) + 1); + globalScene.gameData.saveSetting( + SettingKeys.Game_Speed, + Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) + 1, + ); if (globalScene.ui?.getMode() === Mode.SETTINGS) { (globalScene.ui.getHandler() as SettingsUiHandler).show([]); } } else if (!up && globalScene.gameSpeed > 1) { - globalScene.gameData.saveSetting(SettingKeys.Game_Speed, Math.max(Setting[settingGameSpeed].options.findIndex((item) => item.label === `${globalScene.gameSpeed}x`) - 1, 0)); + globalScene.gameData.saveSetting( + SettingKeys.Game_Speed, + Math.max( + Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) - 1, + 0, + ), + ); if (globalScene.ui?.getMode() === Mode.SETTINGS) { (globalScene.ui.getHandler() as SettingsUiHandler).show([]); } } } - } diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 8335f7b517c..7fe9c0d8052 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -27,7 +27,9 @@ export default class AbilityBar extends Phaser.GameObjects.Container { this.add(this.bg); - this.abilityBarText = addTextObject(15, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.abilityBarText = addTextObject(15, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.abilityBarText.setOrigin(0, 0); this.abilityBarText.setWordWrapWidth(600, true); this.add(this.abilityBarText); @@ -36,8 +38,10 @@ export default class AbilityBar extends Phaser.GameObjects.Container { this.shown = false; } - showAbility(pokemon: Pokemon, passive: boolean = false): void { - this.abilityBarText.setText(`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`); + showAbility(pokemon: Pokemon, passive = false): void { + this.abilityBarText.setText( + `${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`, + ); if (this.shown) { return; @@ -45,7 +49,6 @@ export default class AbilityBar extends Phaser.GameObjects.Container { globalScene.fieldUI.bringToTop(this); - this.y = baseY + (globalScene.currentBattle.double ? 14 : 0); this.tween = globalScene.tweens.add({ targets: this, @@ -55,7 +58,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { onComplete: () => { this.tween = null; this.resetAutoHideTimer(); - } + }, }); this.setVisible(true); @@ -83,7 +86,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { onComplete: () => { this.tween = null; this.setVisible(false); - } + }, }); this.shown = false; diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index a462ed158cb..f605f73e171 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -44,10 +44,10 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected blockInput: boolean; - protected scrollCursor: number = 0; - protected fullCursor: number = 0; + protected scrollCursor = 0; + protected fullCursor = 0; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; private cursorObj: Phaser.GameObjects.Image | null; @@ -56,7 +56,6 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected defaultTextStyle: TextStyle = TextStyle.WINDOW; protected textContent: string; - constructor(mode: Mode | null) { super(mode); } @@ -70,7 +69,7 @@ export default 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.game.canvas.width / 6 - 1, -48); this.optionSelectContainer.setName(`option-select-${this.mode ? Mode[this.mode] : "UNKNOWN"}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); @@ -114,31 +113,49 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectIcons.splice(0, this.optionSelectIcons.length); } - const optionsWithScroll = (this.config?.options && this.config?.options.length > (this.config?.maxOptions!)) ? this.getOptionsWithScroll() : options; + const optionsWithScroll = + this.config?.options && this.config?.options.length > this.config?.maxOptions! + ? this.getOptionsWithScroll() + : options; // Setting the initial text to establish the width of the select object. We consider all options, even ones that are not displayed, // Except in the case of autocomplete, where we don't want to set up a text element with potentially hundreds of lines. const optionsForWidth = globalScene.ui.getMode() === Mode.AUTO_COMPLETE ? optionsWithScroll : options; this.optionSelectText = addBBCodeTextObject( - 0, 0, optionsForWidth.map(o => o.item - ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` - : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` - ).join("\n"), - TextStyle.WINDOW, { maxLines: options.length, lineSpacing: 12 } + 0, + 0, + optionsForWidth + .map(o => + o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]`, + ) + .join("\n"), + TextStyle.WINDOW, + { maxLines: options.length, lineSpacing: 12 }, ); this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); this.optionSelectTextContainer.add(this.optionSelectText); - this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); + this.optionSelectContainer.setPosition( + globalScene.game.canvas.width / 6 - 1 - (this.config?.xOffset || 0), + -48 + (this.config?.yOffset || 0), + ); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); this.optionSelectBg.height = this.getWindowHeight(); - this.optionSelectTextContainer.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); + this.optionSelectTextContainer.setPosition( + this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, + this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale, + ); // Now that the container and background widths are established, we can set up the proper text restricted to visible options - this.textContent = optionsWithScroll.map(o => o.item - ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` - : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` - ).join("\n"); + this.textContent = optionsWithScroll + .map(o => + o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]`, + ) + .join("\n"); this.optionSelectText.setText(this.textContent); options.forEach((option: OptionSelectItem, i: number) => { @@ -299,8 +316,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const optionsScrollTotal = options.length; const optionStartIndex = this.scrollCursor; - const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + - (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal ? this.config.maxOptions - 1 : this.config.maxOptions - 2) + const optionEndIndex = Math.min( + optionsScrollTotal, + optionStartIndex + + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal + ? this.config.maxOptions - 1 + : this.config.maxOptions - 2), ); if (this.config?.maxOptions && options.length > this.config.maxOptions) { @@ -310,14 +331,14 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { options.unshift({ label: scrollUpLabel, handler: () => true, - style: this.defaultTextStyle + style: this.defaultTextStyle, }); } if (optionEndIndex < optionsScrollTotal) { options.push({ label: scrollDownLabel, handler: () => true, - style: this.defaultTextStyle + style: this.defaultTextStyle, }); } } @@ -336,13 +357,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const changed = this.fullCursor !== fullCursor; if (changed && this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - // If the fullCursor is the last possible value, we go to the bottom if (fullCursor === this.unskippedIndices.length - 1) { this.fullCursor = fullCursor; this.cursor = this.config.maxOptions - (this.config.options.length - this.unskippedIndices[fullCursor]); this.scrollCursor = this.config.options.length - this.config.maxOptions + 1; - // If the fullCursor is the first possible value, we go to the top + // If the fullCursor is the first possible value, we go to the top } else if (fullCursor === 0) { this.fullCursor = fullCursor; this.cursor = this.unskippedIndices[fullCursor]; @@ -389,7 +409,11 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.cursorObj.setScale(this.scale * 6); - this.cursorObj.setPositionRelative(this.optionSelectBg, 12, 102 * this.scale + this.cursor * (114 * this.scale - 3)); + this.cursorObj.setPositionRelative( + this.optionSelectBg, + 12, + 102 * this.scale + this.cursor * (114 * this.scale - 3), + ); return changed; } diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index 9196399f40f..1e068157afa 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -28,7 +28,18 @@ export default class AchvBar extends Phaser.GameObjects.Container { this.defaultWidth = 200; this.defaultHeight = 40; - this.bg = globalScene.add.nineslice(0, 0, "achv_bar", undefined, this.defaultWidth, this.defaultHeight, 41, 6, 16, 4); + this.bg = globalScene.add.nineslice( + 0, + 0, + "achv_bar", + undefined, + this.defaultWidth, + this.defaultHeight, + 41, + 6, + 16, + 4, + ); this.bg.setOrigin(0, 0); this.add(this.bg); @@ -37,15 +48,21 @@ export default class AchvBar extends Phaser.GameObjects.Container { this.icon.setOrigin(0, 0); this.add(this.icon); - this.titleText = addTextObject(40, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.titleText = addTextObject(40, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.titleText.setOrigin(0, 0); this.add(this.titleText); - this.scoreText = addTextObject(150, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.scoreText = addTextObject(150, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.scoreText.setOrigin(1, 0); this.add(this.scoreText); - this.descriptionText = addTextObject(43, 16, "", TextStyle.WINDOW_ALT, { fontSize: "72px" }); + this.descriptionText = addTextObject(43, 16, "", TextStyle.WINDOW_ALT, { + fontSize: "72px", + }); this.descriptionText.setOrigin(0, 0); this.add(this.descriptionText); @@ -80,23 +97,29 @@ export default class AchvBar extends Phaser.GameObjects.Container { } // Take the width of the default interface or the title if longest - this.bg.width = Math.max(this.defaultWidth, this.icon.displayWidth + this.titleText.displayWidth + this.scoreText.displayWidth + 16); + this.bg.width = Math.max( + this.defaultWidth, + this.icon.displayWidth + this.titleText.displayWidth + this.scoreText.displayWidth + 16, + ); this.scoreText.x = this.bg.width - 2; this.descriptionText.width = this.bg.width - this.icon.displayWidth - 16; this.descriptionText.setWordWrapWidth(this.descriptionText.width * 6); // Take the height of the default interface or the description if longest - this.bg.height = Math.max(this.defaultHeight, this.titleText.displayHeight + this.descriptionText.displayHeight + 8); - this.icon.y = (this.bg.height / 2) - (this.icon.height / 2); + this.bg.height = Math.max( + this.defaultHeight, + this.titleText.displayHeight + this.descriptionText.displayHeight + 8, + ); + this.icon.y = this.bg.height / 2 - this.icon.height / 2; globalScene.playSound("se/achv"); globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6) - (this.bg.width / 2), + x: globalScene.game.canvas.width / 6 - this.bg.width / 2, duration: 500, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); globalScene.time.delayedCall(10000, () => this.hide(this.playerGender)); @@ -105,14 +128,14 @@ export default class AchvBar extends Phaser.GameObjects.Container { this.shown = true; } - protected hide(playerGender: PlayerGender): void { + protected hide(_playerGender: PlayerGender): void { if (!this.shown) { return; } globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -122,7 +145,7 @@ export default class AchvBar extends Phaser.GameObjects.Container { const shifted = this.queue.shift(); shifted && this.showAchv(shifted); } - } + }, }); } } diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 74a121c231b..8b5a4dbd395 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -14,17 +14,17 @@ import { globalScene } from "#app/global-scene"; enum Page { ACHIEVEMENTS, - VOUCHERS + VOUCHERS, } interface LanguageSetting { - TextSize: string, + TextSize: string; } const languageSettings: { [key: string]: LanguageSetting } = { - "de":{ - TextSize: "80px" - } + de: { + TextSize: "80px", + }, }; export default class AchvsUiHandler extends MessageUiHandler { @@ -72,9 +72,12 @@ export default class AchvsUiHandler extends MessageUiHandler { this.mainContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); - this.mainContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.mainContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.headerBg = addWindow(0, 0, (globalScene.game.canvas.width / 6) - 2, 24); + this.headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); this.headerBg.setOrigin(0, 0); this.headerText = addTextObject(0, 0, "", TextStyle.SETTINGS_LABEL); @@ -83,7 +86,9 @@ export default class AchvsUiHandler extends MessageUiHandler { this.headerActionButton = new Phaser.GameObjects.Sprite(globalScene, 0, 0, "keyboard", "ACTION.png"); this.headerActionButton.setOrigin(0, 0); this.headerActionButton.setPositionRelative(this.headerBg, 236, 6); - this.headerActionText = addTextObject(0, 0, "", TextStyle.WINDOW, { fontSize:"60px" }); + this.headerActionText = addTextObject(0, 0, "", TextStyle.WINDOW, { + fontSize: "60px", + }); this.headerActionText.setOrigin(0, 0); this.headerActionText.setPositionRelative(this.headerBg, 264, 8); @@ -91,14 +96,27 @@ export default class AchvsUiHandler extends MessageUiHandler { const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); - this.achvsName = i18next.t("achv:Achievements.name", { context: genderStr }); + this.achvsName = i18next.t("achv:Achievements.name", { + context: genderStr, + }); this.vouchersName = i18next.t("voucher:vouchers"); - this.iconsBg = addWindow(0, this.headerBg.height, (globalScene.game.canvas.width / 6) - 2, (globalScene.game.canvas.height / 6) - this.headerBg.height - 68); + this.iconsBg = addWindow( + 0, + this.headerBg.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - this.headerBg.height - 68, + ); this.iconsBg.setOrigin(0, 0); const yOffset = 6; - this.scrollBar = new ScrollBar(this.iconsBg.width - 9, this.iconsBg.y + yOffset, 4, this.iconsBg.height - yOffset * 2, this.ROWS); + this.scrollBar = new ScrollBar( + this.iconsBg.width - 9, + this.iconsBg.y + yOffset, + 4, + this.iconsBg.height - yOffset * 2, + this.ROWS, + ); this.iconsContainer = globalScene.add.container(5, this.headerBg.height + 8); @@ -144,10 +162,12 @@ export default class AchvsUiHandler extends MessageUiHandler { this.unlockText.setOrigin(0.5, 0.5); this.unlockText.setPositionRelative(unlockBg, unlockBg.width / 2, unlockBg.height / 2); - const descriptionBg = addWindow(0, titleBg.y + titleBg.height, (globalScene.game.canvas.width / 6) - 2, 42); + const descriptionBg = addWindow(0, titleBg.y + titleBg.height, globalScene.game.canvas.width / 6 - 2, 42); descriptionBg.setOrigin(0, 0); - const descriptionText = addTextObject(0, 0, "", TextStyle.WINDOW, { maxLines: 2 }); + const descriptionText = addTextObject(0, 0, "", TextStyle.WINDOW, { + maxLines: 2, + }); descriptionText.setWordWrapWidth(1870); descriptionText.setOrigin(0, 0); descriptionText.setPositionRelative(descriptionBg, 8, 4); @@ -200,7 +220,9 @@ export default class AchvsUiHandler extends MessageUiHandler { const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); - achv.name = i18next.t(`achv:${achv.localizationKey}.name`, { context: genderStr }); + achv.name = i18next.t(`achv:${achv.localizationKey}.name`, { + context: genderStr, + }); achv.description = getAchievementDescription(achv.localizationKey); const achvUnlocks = globalScene.gameData.achvUnlocks; const unlocked = achvUnlocks.hasOwnProperty(achv.id); @@ -208,7 +230,9 @@ export default class AchvsUiHandler extends MessageUiHandler { this.titleText.setText(unlocked ? achv.name : "???"); this.showText(!hidden ? achv.description : ""); this.scoreText.setText(`${achv.score}pt`); - this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name")); + this.unlockText.setText( + unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name"), + ); } protected showVoucher(voucher: Voucher) { @@ -217,7 +241,9 @@ export default class AchvsUiHandler extends MessageUiHandler { this.titleText.setText(getVoucherTypeName(voucher.voucherType)); this.showText(voucher.description); - this.unlockText.setText(unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked")); + this.unlockText.setText( + unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked"), + ); } processInput(button: Button): boolean { @@ -245,14 +271,14 @@ export default class AchvsUiHandler extends MessageUiHandler { globalScene.ui.revertMode(); } else { const rowIndex = Math.floor(this.cursor / this.COLS); - const itemOffset = (this.scrollCursor * this.COLS); + const itemOffset = this.scrollCursor * this.COLS; switch (button) { case Button.UP: if (this.cursor < this.COLS) { if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1); } else { - // Wrap around to the last row + // Wrap around to the last row success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS); let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS; if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS - 1) { @@ -268,10 +294,10 @@ export default class AchvsUiHandler extends MessageUiHandler { const canMoveDown = itemOffset + 1 < this.currentTotal; if (rowIndex >= this.ROWS - 1) { if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) { - // scroll down one row + // scroll down one row success = this.setScrollCursor(this.scrollCursor + 1); } else { - // wrap back to the first row + // wrap back to the first row success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS); } } else if (canMoveDown) { @@ -286,8 +312,8 @@ export default class AchvsUiHandler extends MessageUiHandler { } break; case Button.RIGHT: - if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) { - success = this.setCursor(this.cursor - this.cursor % this.COLS); + if ((this.cursor + 1) % this.COLS === 0 || this.cursor + itemOffset === this.currentTotal - 1) { + success = this.setCursor(this.cursor - (this.cursor % this.COLS)); } else { success = this.setCursor(this.cursor + 1); } @@ -372,7 +398,6 @@ export default class AchvsUiHandler extends MessageUiHandler { return true; } - /** * updateAchvIcons(): void * Determines what data is to be displayed on the UI and updates it accordingly based on the current value of this.scrollCursor diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index e31acda6fa2..34b6e59145f 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -12,7 +12,6 @@ type AdminUiHandlerService = "discord" | "google"; type AdminUiHandlerServiceMode = "Link" | "Unlink"; export default class AdminUiHandler extends FormModalUiHandler { - private adminMode: AdminMode; private adminResult: AdminSearchInfo; private config: ModalConfig; @@ -23,9 +22,8 @@ export default class AdminUiHandler extends FormModalUiHandler { private readonly ERR_REQUIRED_FIELD = (field: string) => { if (field === "username") { return `${formatText(field)} is required`; - } else { - return `${formatText(field)} Id is required`; } + return `${formatText(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) => { @@ -45,19 +43,19 @@ export default class AdminUiHandler extends FormModalUiHandler { } override getMargin(): [number, number, number, number] { - return [ 0, 0, 0, 0 ]; + return [0, 0, 0, 0]; } override getButtonLabels(): string[] { switch (this.adminMode) { case AdminMode.LINK: - return [ "Link Account", "Cancel" ]; + return ["Link Account", "Cancel"]; case AdminMode.SEARCH: - return [ "Find account", "Cancel" ]; + return ["Find account", "Cancel"]; case AdminMode.ADMIN: - return [ "Back to search", "Cancel" ]; + return ["Back to search", "Cancel"]; default: - return [ "Activate ADMIN", "Cancel" ]; + return ["Activate ADMIN", "Cancel"]; } } @@ -65,20 +63,32 @@ export default class AdminUiHandler extends FormModalUiHandler { const inputFieldConfigs: InputFieldConfig[] = []; switch (this.adminMode) { case AdminMode.LINK: - inputFieldConfigs.push( { label: "Username" }); - inputFieldConfigs.push( { label: "Discord ID" }); + inputFieldConfigs.push({ label: "Username" }); + inputFieldConfigs.push({ label: "Discord ID" }); break; case AdminMode.SEARCH: - inputFieldConfigs.push( { label: "Username" }); + inputFieldConfigs.push({ label: "Username" }); break; case AdminMode.ADMIN: - const adminResult = this.adminResult ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; + const adminResult = this.adminResult ?? { + username: "", + discordId: "", + googleId: "", + lastLoggedIn: "", + registered: "", + }; // Discord and Google ID fields that are not empty get locked, other fields are all locked - inputFieldConfigs.push( { label: "Username", isReadOnly: true }); - inputFieldConfigs.push( { label: "Discord ID", isReadOnly: adminResult.discordId !== "" }); - inputFieldConfigs.push( { label: "Google ID", isReadOnly: adminResult.googleId !== "" }); - inputFieldConfigs.push( { label: "Last played", isReadOnly: true }); - inputFieldConfigs.push( { label: "Registered", isReadOnly: true }); + inputFieldConfigs.push({ label: "Username", isReadOnly: true }); + inputFieldConfigs.push({ + label: "Discord ID", + isReadOnly: adminResult.discordId !== "", + }); + inputFieldConfigs.push({ + label: "Google ID", + isReadOnly: adminResult.googleId !== "", + }); + inputFieldConfigs.push({ label: "Last played", isReadOnly: true }); + inputFieldConfigs.push({ label: "Registered", isReadOnly: true }); break; } return inputFieldConfigs; @@ -96,7 +106,13 @@ export default class AdminUiHandler extends FormModalUiHandler { show(args: any[]): boolean { this.config = args[0] as ModalConfig; // config this.adminMode = args[1] as AdminMode; // admin mode - this.adminResult = args[2] ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; // admin result, if any + this.adminResult = args[2] ?? { + username: "", + discordId: "", + googleId: "", + lastLoggedIn: "", + registered: "", + }; // admin result, if any const isMessageError = args[3]; // is the message shown a success or error const fields = this.getInputFieldConfigs(); @@ -122,23 +138,22 @@ export default class AdminUiHandler extends FormModalUiHandler { if (super.show(args)) { this.populateFields(this.adminMode, this.adminResult); const originalSubmitAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { this.submitAction = originalSubmitAction; const adminSearchResult: AdminSearchInfo = this.convertInputsToAdmin(); // this converts the input texts into a single object for use later const validFields = this.areFieldsValid(this.adminMode); if (validFields.error) { - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error return this.showMessage(validFields.errorMessage ?? "", adminSearchResult, true); } - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); if (this.adminMode === AdminMode.LINK) { this.adminLinkUnlink(adminSearchResult, "discord", "Link") // calls server to link discord .then(response => { if (response.error) { return this.showMessage(response.errorType, adminSearchResult, true); // error or some kind - } else { - return this.showMessage(this.SUCCESS_SERVICE_MODE("discord", "link"), adminSearchResult, false); // success } + return this.showMessage(this.SUCCESS_SERVICE_MODE("discord", "link"), adminSearchResult, false); // success }); } else if (this.adminMode === AdminMode.SEARCH) { this.adminSearch(adminSearchResult) // admin search for username @@ -158,7 +173,13 @@ export default class AdminUiHandler extends FormModalUiHandler { } showMessage(message: string, adminResult: AdminSearchInfo, isError: boolean) { - globalScene.ui.setMode(Mode.ADMIN, Object.assign(this.config, { errorMessage: message?.trim() }), this.adminMode, adminResult, isError); + globalScene.ui.setMode( + Mode.ADMIN, + Object.assign(this.config, { errorMessage: message?.trim() }), + this.adminMode, + adminResult, + isError, + ); if (isError) { globalScene.ui.playError(); } else { @@ -184,9 +205,14 @@ export default class AdminUiHandler extends FormModalUiHandler { case AdminMode.ADMIN: Object.keys(adminResult).forEach((aR, i) => { this.inputs[i].setText(adminResult[aR]); - if (aR === "discordId" || aR === "googleId") { // this is here to add the icons for linking/unlinking of google/discord IDs + if (aR === "discordId" || aR === "googleId") { + // this is here to add the icons for linking/unlinking of google/discord IDs const nineSlice = this.inputContainers[i].list.find(iC => iC.type === "NineSlice"); - const img = globalScene.add.image(this.inputContainers[i].x + nineSlice!.width + this.buttonGap, this.inputContainers[i].y + (Math.floor(nineSlice!.height / 2)), adminResult[aR] === "" ? "link_icon" : "unlink_icon"); + const img = globalScene.add.image( + this.inputContainers[i].x + nineSlice!.width + this.buttonGap, + this.inputContainers[i].y + Math.floor(nineSlice!.height / 2), + adminResult[aR] === "" ? "link_icon" : "unlink_icon", + ); img.setName(`adminBtn_${aR}`); img.setOrigin(0.5, 0.5); img.setInteractive(); @@ -195,24 +221,30 @@ export default class AdminUiHandler extends FormModalUiHandler { const mode = adminResult[aR] === "" ? "Link" : "Unlink"; // this figures out if we're linking or unlinking a service const validFields = this.areFieldsValid(this.adminMode, service); if (validFields.error) { - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error return this.showMessage(validFields.errorMessage ?? "", adminResult, true); } - this.adminLinkUnlink(this.convertInputsToAdmin(), service as AdminUiHandlerService, mode).then(response => { // attempts to link/unlink depending on the service - if (response.error) { - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); - return this.showMessage(response.errorType, adminResult, true); // fail - } else { // success, reload panel with new results - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); - this.adminSearch(adminResult) - .then(response => { - if (response.error) { - return this.showMessage(response.errorType, adminResult, true); - } - return this.showMessage(this.SUCCESS_SERVICE_MODE(service, mode), response.adminSearchResult ?? adminResult, false); - }); - } - }); + this.adminLinkUnlink(this.convertInputsToAdmin(), service as AdminUiHandlerService, mode).then( + response => { + // attempts to link/unlink depending on the service + if (response.error) { + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + return this.showMessage(response.errorType, adminResult, true); // fail + } + // success, reload panel with new results + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + this.adminSearch(adminResult).then(response => { + if (response.error) { + return this.showMessage(response.errorType, adminResult, true); + } + return this.showMessage( + this.SUCCESS_SERVICE_MODE(service, mode), + response.adminSearchResult ?? adminResult, + false, + ); + }); + }, + ); }); this.addInteractionHoverEffect(img); this.modalContainer.add(img); @@ -222,47 +254,52 @@ export default class AdminUiHandler extends FormModalUiHandler { } } - private areFieldsValid(adminMode: AdminMode, service?: string): { error: boolean; errorMessage?: string; } { + private areFieldsValid(adminMode: AdminMode, service?: string): { error: boolean; errorMessage?: string } { switch (adminMode) { case AdminMode.LINK: - if (!this.inputs[0].text) { // username missing from link panel + if (!this.inputs[0].text) { + // username missing from link panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("username") + errorMessage: this.ERR_REQUIRED_FIELD("username"), }; } - if (!this.inputs[1].text) { // discordId missing from linking panel + if (!this.inputs[1].text) { + // discordId missing from linking panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("discord") + errorMessage: this.ERR_REQUIRED_FIELD("discord"), }; } break; case AdminMode.SEARCH: - if (!this.inputs[0].text) { // username missing from search panel + if (!this.inputs[0].text) { + // username missing from search panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("username") + errorMessage: this.ERR_REQUIRED_FIELD("username"), }; } break; case AdminMode.ADMIN: - if (!this.inputs[1].text && service === "discord") { // discordId missing from admin panel + if (!this.inputs[1].text && service === "discord") { + // discordId missing from admin panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD(service) + errorMessage: this.ERR_REQUIRED_FIELD(service), }; } - if (!this.inputs[2].text && service === "google") { // googleId missing from admin panel + if (!this.inputs[2].text && service === "google") { + // googleId missing from admin panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD(service) + errorMessage: this.ERR_REQUIRED_FIELD(service), }; } break; } return { - error: false + error: false, }; } @@ -272,25 +309,32 @@ export default class AdminUiHandler extends FormModalUiHandler { discordId: this.inputs[1]?.node ? this.inputs[1]?.text : "", googleId: this.inputs[2]?.node ? this.inputs[2]?.text : "", lastLoggedIn: this.inputs[3]?.node ? this.inputs[3]?.text : "", - registered: this.inputs[4]?.node ? this.inputs[4]?.text : "" + registered: this.inputs[4]?.node ? this.inputs[4]?.text : "", }; } private async adminSearch(adminSearchResult: AdminSearchInfo) { try { - const [ adminInfo, errorType ] = await pokerogueApi.admin.searchAccount({ username: adminSearchResult.username }); - if (errorType || !adminInfo) { // error - if adminInfo.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db + const [adminInfo, errorType] = await pokerogueApi.admin.searchAccount({ + username: adminSearchResult.username, + }); + if (errorType || !adminInfo) { + // error - if adminInfo.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db return { adminSearchResult: adminSearchResult, error: true, errorType }; - } else { // success - return { adminSearchResult: adminInfo, error: false }; } + // success + return { adminSearchResult: adminInfo, error: false }; } catch (err) { console.error(err); return { error: true, errorType: err }; } } - private async adminLinkUnlink(adminSearchResult: AdminSearchInfo, service: AdminUiHandlerService, mode: AdminUiHandlerServiceMode) { + private async adminLinkUnlink( + adminSearchResult: AdminSearchInfo, + service: AdminUiHandlerService, + mode: AdminUiHandlerServiceMode, + ) { try { let errorType: string | null = null; @@ -329,10 +373,9 @@ export default class AdminUiHandler extends FormModalUiHandler { if (errorType) { // error - if response.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db return { adminSearchResult: adminSearchResult, error: true, errorType }; - } else { - // success! - return { adminSearchResult: adminSearchResult, error: false }; } + // success! + return { adminSearchResult: adminSearchResult, error: false }; } catch (err) { console.error(err); return { error: true, errorType: err }; @@ -341,19 +384,24 @@ export default class AdminUiHandler extends FormModalUiHandler { private updateAdminPanelInfo(adminSearchResult: AdminSearchInfo, mode?: AdminMode) { mode = mode ?? AdminMode.ADMIN; - globalScene.ui.setMode(Mode.ADMIN, { - buttonActions: [ - // we double revert here and below to go back 2 layers of menus - () => { - globalScene.ui.revertMode(); - globalScene.ui.revertMode(); - }, - () => { - globalScene.ui.revertMode(); - globalScene.ui.revertMode(); - } - ] - }, mode, adminSearchResult); + globalScene.ui.setMode( + Mode.ADMIN, + { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + globalScene.ui.revertMode(); + globalScene.ui.revertMode(); + }, + () => { + globalScene.ui.revertMode(); + globalScene.ui.revertMode(); + }, + ], + }, + mode, + adminSearchResult, + ); } clear(): void { @@ -361,7 +409,7 @@ export default class AdminUiHandler extends FormModalUiHandler { // this is used to remove the existing fields on the admin panel so they can be updated - const itemsToRemove: string[] = [ "formLabel", "adminBtn" ]; // this is the start of the names for each element we want to remove + const itemsToRemove: string[] = ["formLabel", "adminBtn"]; // this is the start of the names for each element we want to remove const removeArray: any[] = []; const mC = this.modalContainer.list; for (let i = mC.length - 1; i >= 0; i--) { @@ -370,7 +418,11 @@ export default class AdminUiHandler extends FormModalUiHandler { * It then also checks for any containers that are within this.modalContainer, and checks if any of its child elements are of type rexInputText * and if either of these conditions are met, the element is destroyed. */ - if (itemsToRemove.some(iTR => mC[i].name.includes(iTR)) || (mC[i].type === "Container" && (mC[i] as Phaser.GameObjects.Container).list.find(m => m.type === "rexInputText"))) { + if ( + itemsToRemove.some(iTR => mC[i].name.includes(iTR)) || + (mC[i].type === "Container" && + (mC[i] as Phaser.GameObjects.Container).list.find(m => m.type === "rexInputText")) + ) { removeArray.push(mC[i]); } } @@ -384,7 +436,7 @@ export default class AdminUiHandler extends FormModalUiHandler { export enum AdminMode { LINK, SEARCH, - ADMIN + ADMIN, } export function getAdminModeName(adminMode: AdminMode): string { diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 7e9b24d1d97..36a44eb5aa0 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -5,7 +5,13 @@ import { WeatherType } from "#enums/weather-type"; import { TerrainType } from "#app/data/terrain"; import { addWindow, WindowVariant } from "./ui-theme"; import type { ArenaEvent } from "#app/events/arena"; -import { ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; +import { + ArenaEventType, + TagAddedEvent, + TagRemovedEvent, + TerrainChangedEvent, + WeatherChangedEvent, +} from "#app/events/arena"; import type { TurnEndEvent } from "../events/battle-scene"; import { BattleSceneEventType } from "../events/battle-scene"; import { ArenaTagType } from "#enums/arena-tag-type"; @@ -27,7 +33,7 @@ interface ArenaEffectInfo { /** The enum string representation of the effect */ name: string; /** {@linkcode ArenaEffectType} type of effect */ - effecType: ArenaEffectType, + effecType: ArenaEffectType; /** The maximum duration set by the effect */ maxDuration: number; @@ -44,7 +50,7 @@ export function getFieldEffectText(arenaTagType: string): string { const effectName = Utils.toCamelCaseString(arenaTagType); const i18nKey = `arenaFlyout:${effectName}` as ParseKeys; const resultName = i18next.t(i18nKey); - return (!resultName || resultName === i18nKey) ? Utils.formatText(arenaTagType) : resultName; + return !resultName || resultName === i18nKey ? Utils.formatText(arenaTagType) : resultName; } export class ArenaFlyout extends Phaser.GameObjects.Container { @@ -93,8 +99,8 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { private readonly fieldEffectInfo: ArenaEffectInfo[] = []; // Stores callbacks in a variable so they can be unsubscribed from when destroyed - private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event); - private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event); + private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event); + private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event); private readonly onFieldEffectChangedEvent = (event: Event) => this.onFieldEffectChanged(event); @@ -116,19 +122,34 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutWindow = addWindow(0, 0, this.flyoutWidth, this.flyoutHeight, false, false, 0, 0, WindowVariant.THIN); this.flyoutContainer.add(this.flyoutWindow); - this.flyoutWindowHeader = addWindow(this.flyoutWidth / 2, 0, this.flyoutWidth / 2, 14, false, false, 0, 0, WindowVariant.XTHIN); + this.flyoutWindowHeader = addWindow( + this.flyoutWidth / 2, + 0, + this.flyoutWidth / 2, + 14, + false, + false, + 0, + 0, + WindowVariant.XTHIN, + ); this.flyoutWindowHeader.setOrigin(); this.flyoutContainer.add(this.flyoutWindowHeader); - this.flyoutTextHeader = addTextObject(this.flyoutWidth / 2, 0, i18next.t("arenaFlyout:activeBattleEffects"), TextStyle.BATTLE_INFO); + this.flyoutTextHeader = addTextObject( + this.flyoutWidth / 2, + 0, + i18next.t("arenaFlyout:activeBattleEffects"), + TextStyle.BATTLE_INFO, + ); this.flyoutTextHeader.setFontSize(54); this.flyoutTextHeader.setAlign("center"); this.flyoutTextHeader.setOrigin(); this.flyoutContainer.add(this.flyoutTextHeader); - this.timeOfDayWidget = new TimeOfDayWidget((this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2)); + this.timeOfDayWidget = new TimeOfDayWidget(this.flyoutWidth / 2 + this.flyoutWindowHeader.displayWidth / 2); this.flyoutContainer.add(this.timeOfDayWidget); this.flyoutTextHeaderPlayer = addTextObject(6, 5, i18next.t("arenaFlyout:player"), TextStyle.SUMMARY_BLUE); @@ -138,14 +159,24 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutTextHeaderPlayer); - this.flyoutTextHeaderField = addTextObject(this.flyoutWidth / 2, 5, i18next.t("arenaFlyout:neutral"), TextStyle.SUMMARY_GREEN); + this.flyoutTextHeaderField = addTextObject( + this.flyoutWidth / 2, + 5, + i18next.t("arenaFlyout:neutral"), + TextStyle.SUMMARY_GREEN, + ); this.flyoutTextHeaderField.setFontSize(54); this.flyoutTextHeaderField.setAlign("center"); this.flyoutTextHeaderField.setOrigin(0.5, 0); this.flyoutContainer.add(this.flyoutTextHeaderField); - this.flyoutTextHeaderEnemy = addTextObject(this.flyoutWidth - 6, 5, i18next.t("arenaFlyout:enemy"), TextStyle.SUMMARY_RED); + this.flyoutTextHeaderEnemy = addTextObject( + this.flyoutWidth - 6, + 5, + i18next.t("arenaFlyout:enemy"), + TextStyle.SUMMARY_RED, + ); this.flyoutTextHeaderEnemy.setFontSize(54); this.flyoutTextHeaderEnemy.setAlign("right"); this.flyoutTextHeaderEnemy.setOrigin(1, 0); @@ -181,20 +212,19 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { // Subscribes to required events available on game start globalScene.eventTarget.addEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); - globalScene.eventTarget.addEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); } - private onNewArena(event: Event) { + private onNewArena(_event: Event) { this.fieldEffectInfo.length = 0; // Subscribes to required events available on battle start globalScene.arena.eventTarget.addEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); globalScene.arena.eventTarget.addEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); - globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); - globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); } - /** Clears out the current string stored in all arena effect texts */ private clearText() { this.flyoutTextPlayer.text = ""; @@ -252,7 +282,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { let foundIndex: number; switch (arenaEffectChangedEvent.constructor) { - case TagAddedEvent: + case TagAddedEvent: { const tagAddedEvent = arenaEffectChangedEvent as TagAddedEvent; const isArenaTrapTag = globalScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag; let arenaEffectType: ArenaEffectType; @@ -265,15 +295,20 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { arenaEffectType = ArenaEffectType.ENEMY; } - const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; - let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); + const existingTrapTagIndex = isArenaTrapTag + ? this.fieldEffectInfo.findIndex( + e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType, + ) + : -1; + let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { const layers = tagAddedEvent.arenaTagMaxLayers > 1 ? ` (${tagAddedEvent.arenaTagLayers})` : ""; this.fieldEffectInfo[existingTrapTagIndex].name = `${name}${layers}`; break; - } else if (tagAddedEvent.arenaTagMaxLayers > 1) { + } + if (tagAddedEvent.arenaTagMaxLayers > 1) { name = `${name} (${tagAddedEvent.arenaTagLayers})`; } } @@ -283,40 +318,45 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { effecType: arenaEffectType, maxDuration: tagAddedEvent.duration, duration: tagAddedEvent.duration, - tagType: tagAddedEvent.arenaTagType + tagType: tagAddedEvent.arenaTagType, }); break; - case TagRemovedEvent: + } + case TagRemovedEvent: { const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent; foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType); - if (foundIndex !== -1) { // If the tag was being tracked, remove it + if (foundIndex !== -1) { + // If the tag was being tracked, remove it this.fieldEffectInfo.splice(foundIndex, 1); } break; + } case WeatherChangedEvent: - case TerrainChangedEvent: + case TerrainChangedEvent: { const fieldEffectChangedEvent = arenaEffectChangedEvent as WeatherChangedEvent | TerrainChangedEvent; // Stores the old Weather/Terrain name in case it's in the array already - const oldName = - getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.oldWeatherType] - : TerrainType[fieldEffectChangedEvent.oldTerrainType]); + const oldName = getFieldEffectText( + fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.oldWeatherType] + : TerrainType[fieldEffectChangedEvent.oldTerrainType], + ); // Stores the new Weather/Terrain info const newInfo = { - name: - getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.newWeatherType] - : TerrainType[fieldEffectChangedEvent.newTerrainType]), - effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent - ? ArenaEffectType.WEATHER - : ArenaEffectType.TERRAIN, + name: getFieldEffectText( + fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.newWeatherType] + : TerrainType[fieldEffectChangedEvent.newTerrainType], + ), + effecType: + fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, maxDuration: fieldEffectChangedEvent.duration, - duration: fieldEffectChangedEvent.duration }; + duration: fieldEffectChangedEvent.duration, + }; - foundIndex = this.fieldEffectInfo.findIndex(info => [ newInfo.name, oldName ].includes(info.name)); + foundIndex = this.fieldEffectInfo.findIndex(info => [newInfo.name, oldName].includes(info.name)); if (foundIndex === -1) { if (newInfo.name !== undefined) { this.fieldEffectInfo.push(newInfo); // Adds the info to the array if it doesn't already exist and is defined @@ -327,6 +367,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.fieldEffectInfo[foundIndex] = newInfo; // Otherwise, replace the old info } break; + } } this.updateFieldText(); @@ -353,7 +394,8 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { } --info.duration; - if (info.duration <= 0) { // Removes the item if the duration has expired + if (info.duration <= 0) { + // Removes the item if the duration has expired this.fieldEffectInfo.splice(this.fieldEffectInfo.indexOf(info), 1); } } @@ -372,18 +414,18 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { duration: Utils.fixedInt(125), ease: "Sine.easeInOut", alpha: visible ? 1 : 0, - onComplete: () => this.timeOfDayWidget.parentVisible = visible, + onComplete: () => (this.timeOfDayWidget.parentVisible = visible), }); } public destroy(fromScene?: boolean): void { globalScene.eventTarget.removeEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); - globalScene.eventTarget.removeEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); + globalScene.eventTarget.removeEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); globalScene.arena.eventTarget.removeEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); - globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); - globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); super.destroy(fromScene); } diff --git a/src/ui/autocomplete-ui-handler.ts b/src/ui/autocomplete-ui-handler.ts index 23abdb85772..a170ae43f23 100644 --- a/src/ui/autocomplete-ui-handler.ts +++ b/src/ui/autocomplete-ui-handler.ts @@ -27,8 +27,15 @@ export default class AutoCompleteUiHandler extends AbstractOptionSelectUiHandler protected setupOptions() { super.setupOptions(); if (this.modalContainer) { - this.optionSelectContainer.setSize(this.optionSelectContainer.height, Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth())); - this.optionSelectContainer.setPositionRelative(this.modalContainer, this.optionSelectBg.width, this.optionSelectBg.height + 50); + this.optionSelectContainer.setSize( + this.optionSelectContainer.height, + Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()), + ); + this.optionSelectContainer.setPositionRelative( + this.modalContainer, + this.optionSelectBg.width, + this.optionSelectBg.height + 50, + ); } } diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index cc970358cb2..890e2884fd5 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -6,7 +6,7 @@ import { globalScene } from "#app/global-scene"; export default abstract class AwaitableUiHandler extends UiHandler { protected awaitingActionInput: boolean; protected onActionInput: Function | null; - public tutorialActive: boolean = false; + public tutorialActive = false; public tutorialOverlay: Phaser.GameObjects.Rectangle; constructor(mode: Mode | null = null) { @@ -32,7 +32,14 @@ export default abstract class AwaitableUiHandler extends UiHandler { */ initTutorialOverlay(container: Phaser.GameObjects.Container) { if (!this.tutorialOverlay) { - this.tutorialOverlay = new Phaser.GameObjects.Rectangle(globalScene, -1, -1, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0x070707); + this.tutorialOverlay = new Phaser.GameObjects.Rectangle( + globalScene, + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0x070707, + ); this.tutorialOverlay.setName("tutorial-overlay"); this.tutorialOverlay.setOrigin(0, 0); this.tutorialOverlay.setAlpha(0); diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index a402d11ef1d..cfa44832824 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -15,7 +15,7 @@ export default class BallUiHandler extends UiHandler { private cursorObj: Phaser.GameObjects.Image | null; - private scale: number = 0.1666666667; + private scale = 0.1666666667; constructor() { super(Mode.BALL); @@ -34,7 +34,10 @@ export default class BallUiHandler extends UiHandler { optionsTextContent += "Cancel"; 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), -49); + this.pokeballSelectContainer = globalScene.add.container( + globalScene.game.canvas.width / 6 - 51 - Math.max(64, optionsTextWidth), + -49, + ); this.pokeballSelectContainer.setVisible(false); ui.add(this.pokeballSelectContainer); @@ -46,7 +49,9 @@ export default class BallUiHandler extends UiHandler { optionsText.setPositionRelative(this.pokeballSelectBg, 42, 9); optionsText.setLineSpacing(this.scale * 72); - this.countsText = addTextObject(0, 0, "", TextStyle.WINDOW, { maxLines: 5 }); + this.countsText = addTextObject(0, 0, "", TextStyle.WINDOW, { + maxLines: 5, + }); this.countsText.setPositionRelative(this.pokeballSelectBg, 18, 9); this.countsText.setLineSpacing(this.scale * 72); this.pokeballSelectContainer.add(this.countsText); @@ -107,7 +112,11 @@ export default class BallUiHandler extends UiHandler { } updateCounts() { - this.countsText.setText(Object.values(globalScene.pokeballCounts).map(c => `x${c}`).join("\n")); + this.countsText.setText( + Object.values(globalScene.pokeballCounts) + .map(c => `x${c}`) + .join("\n"), + ); } setCursor(cursor: number): boolean { diff --git a/src/ui/base-stats-overlay.ts b/src/ui/base-stats-overlay.ts index f2e94fa24a4..5a6c67cae7b 100644 --- a/src/ui/base-stats-overlay.ts +++ b/src/ui/base-stats-overlay.ts @@ -6,21 +6,20 @@ import i18next from "i18next"; import { globalScene } from "#app/global-scene"; interface BaseStatsOverlaySettings { - scale?:number; // scale the box? A scale of 0.5 is recommended - x?: number; - y?: number; - /** Default is always half the screen, regardless of scale */ - width?: number; + scale?: number; // scale the box? A scale of 0.5 is recommended + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; } const HEIGHT = 120; const BORDER = 8; const GLOBAL_SCALE = 6; -const shortStats = [ "HP", "ATK", "DEF", "SPATK", "SPDEF", "SPD" ]; +const shortStats = ["HP", "ATK", "DEF", "SPATK", "SPDEF", "SPD"]; export class BaseStatsOverlay extends Phaser.GameObjects.Container implements InfoToggle { - - public active: boolean = false; + public active = false; private statsLabels: Phaser.GameObjects.Text[] = []; private statsRectangles: Phaser.GameObjects.Rectangle[] = []; @@ -67,8 +66,7 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In } // show this component with infos for the specific move - show(values: number[], total: number):boolean { - + show(values: number[], total: number): boolean { for (let i = 0; i < 6; i++) { this.statsLabels[i].setText(i18next.t(`pokemonInfo:Stat.${shortStats[i]}shortened`) + ": " + `${values[i]}`); // This accounts for base stats up to 200, might not be enough. @@ -79,7 +77,6 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In this.statsTotalLabel.setText(i18next.t("pokedexUiHandler:baseTotal") + ": " + `${total}`); - this.setVisible(true); this.active = true; return true; @@ -98,7 +95,7 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In targets: this.statsLabels, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); if (!visible) { this.setVisible(false); @@ -110,12 +107,12 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In } // width of this element - static getWidth(scale:number):number { + static getWidth(_scale: number): number { return globalScene.game.canvas.width / GLOBAL_SCALE / 2; } // height of this element - static getHeight(scale:number, onSide?: boolean):number { + static getHeight(scale: number, _onSide?: boolean): number { return HEIGHT * scale; } } diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index c26f853382e..206546ad9cb 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -13,12 +13,12 @@ import { getPokemonNameWithAffix } from "#app/messages"; /** Container for info about a {@linkcode Move} */ interface MoveInfo { /** The {@linkcode Move} itself */ - move: Move, + move: Move; /** The maximum PP of the {@linkcode Move} */ - maxPp: number, + maxPp: number; /** The amount of PP used by the {@linkcode Move} */ - ppUsed: number, + ppUsed: number; } /** A Flyout Menu attached to each {@linkcode BattleInfo} object on the field UI */ @@ -55,7 +55,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { private moveInfo: MoveInfo[] = new Array(); /** Current state of the flyout's visibility */ - public flyoutVisible: boolean = false; + public flyoutVisible = false; // Stores callbacks in a variable so they can be unsubscribed from when destroyed private readonly onMoveUsedEvent = (event: Event) => this.onMoveUsed(event); @@ -68,7 +68,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { this.player = player; this.translationX = this.player ? -this.flyoutWidth : this.flyoutWidth; - this.anchorX = (this.player ? -130 : -40); + this.anchorX = this.player ? -130 : -40; this.anchorY = -2.5 + (this.player ? -18.5 : -13); this.flyoutParent = globalScene.add.container(this.anchorX - this.translationX, this.anchorY); @@ -87,8 +87,11 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { // Loops through and sets the position of each text object according to the width and height of the flyout for (let i = 0; i < 4; i++) { this.flyoutText[i] = addTextObject( - (this.flyoutWidth / 4) + (this.flyoutWidth / 2) * (i % 2), - (this.flyoutHeight / 4) + (this.flyoutHeight / 2) * (i < 2 ? 0 : 1), "???", TextStyle.BATTLE_INFO); + this.flyoutWidth / 4 + (this.flyoutWidth / 2) * (i % 2), + this.flyoutHeight / 4 + (this.flyoutHeight / 2) * (i < 2 ? 0 : 1), + "???", + TextStyle.BATTLE_INFO, + ); this.flyoutText[i].setFontSize(45); this.flyoutText[i].setLineSpacing(-10); this.flyoutText[i].setAlign("center"); @@ -98,9 +101,25 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutText); this.flyoutContainer.add( - new Phaser.GameObjects.Rectangle(globalScene, this.flyoutWidth / 2, 0, 1, this.flyoutHeight + (globalScene.uiTheme === UiTheme.LEGACY ? 1 : 0), 0x212121).setOrigin(0.5, 0)); + new Phaser.GameObjects.Rectangle( + globalScene, + this.flyoutWidth / 2, + 0, + 1, + this.flyoutHeight + (globalScene.uiTheme === UiTheme.LEGACY ? 1 : 0), + 0x212121, + ).setOrigin(0.5, 0), + ); this.flyoutContainer.add( - new Phaser.GameObjects.Rectangle(globalScene, 0, this.flyoutHeight / 2, this.flyoutWidth + 6, 1, 0x212121).setOrigin(0, 0.5)); + new Phaser.GameObjects.Rectangle( + globalScene, + 0, + this.flyoutHeight / 2, + this.flyoutWidth + 6, + 1, + 0x212121, + ).setOrigin(0, 0.5), + ); } /** @@ -135,9 +154,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { /** Updates all of the {@linkcode MoveInfo} objects in the moveInfo array */ private onMoveUsed(event: Event) { const moveUsedEvent = event as MoveUsedEvent; - if (!moveUsedEvent - || moveUsedEvent.pokemonId !== this.pokemon?.id - || moveUsedEvent.move.id === Moves.STRUGGLE) { // Ignore Struggle + if (!moveUsedEvent || moveUsedEvent.pokemonId !== this.pokemon?.id || moveUsedEvent.move.id === Moves.STRUGGLE) { + // Ignore Struggle return; } @@ -145,7 +163,11 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { if (foundInfo) { foundInfo.ppUsed = moveUsedEvent.ppUsed; } else { - this.moveInfo.push({ move: moveUsedEvent.move, maxPp: moveUsedEvent.move.pp, ppUsed: moveUsedEvent.ppUsed }); + this.moveInfo.push({ + move: moveUsedEvent.move, + maxPp: moveUsedEvent.move.pp, + ppUsed: moveUsedEvent.ppUsed, + }); } this.setText(); @@ -153,14 +175,18 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { private onBerryUsed(event: Event) { const berryUsedEvent = event as BerryUsedEvent; - if (!berryUsedEvent - || berryUsedEvent.berryModifier.pokemonId !== this.pokemon?.id - || berryUsedEvent.berryModifier.berryType !== BerryType.LEPPA) { // We only care about Leppa berries + if ( + !berryUsedEvent || + berryUsedEvent.berryModifier.pokemonId !== this.pokemon?.id || + berryUsedEvent.berryModifier.berryType !== BerryType.LEPPA + ) { + // We only care about Leppa berries return; } const foundInfo = this.moveInfo.find(info => info.ppUsed === info.maxPp); - if (!foundInfo) { // This will only happen on a de-sync of PP tracking + if (!foundInfo) { + // This will only happen on a de-sync of PP tracking return; } foundInfo.ppUsed = Math.max(foundInfo.ppUsed - 10, 0); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index b866ec229d1..355ab9167a1 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -73,8 +73,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container { public flyoutMenu?: BattleFlyout; private statOrder: Stat[]; - private readonly statOrderPlayer = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ]; - private readonly statOrderEnemy = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ]; + private readonly statOrderPlayer = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD]; + private readonly statOrderEnemy = [Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD]; constructor(x: number, y: number, player: boolean) { super(globalScene, x, y); @@ -200,7 +200,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.fillStyle(0xffffff); expMaskRect.beginPath(); expMaskRect.fillRect(127, 126, 85, 2); @@ -239,7 +239,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { // we do a check for i > statOverflow to see when the stat labels go onto the next column // For enemies, we have HP (i=0) by itself then a new column, so we check for i > 0 // For players, we don't have HP, so we start with i = 0 and i = 1 for our first column, and so need to check for i > 1 - const statX = i > statOverflow ? this.statNumbers[Math.max(i - 2, 0)].x + this.statNumbers[Math.max(i - 2, 0)].width + paddingX : startingX; // we have the Math.max(i - 2, 0) in there so for i===1 to not return a negative number; since this is now based on anything >0 instead of >1, we need to allow for i-2 < 0 + const statX = + i > statOverflow + ? this.statNumbers[Math.max(i - 2, 0)].x + this.statNumbers[Math.max(i - 2, 0)].width + paddingX + : startingX; // we have the Math.max(i - 2, 0) in there so for i===1 to not return a negative number; since this is now based on anything >0 instead of >1, we need to allow for i-2 < 0 const baseY = -this.statsBox.height / 2 + 4; // this is the baseline for the y-axis let statY: number; // this will be the y-axis placement for the labels @@ -255,7 +258,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { statLabels.push(statLabel); this.statValuesContainer.add(statLabel); - const statNumber = globalScene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", this.statOrder[i] !== Stat.HP ? "3" : "empty"); + const statNumber = globalScene.add.sprite( + statX + statLabel.width, + statY, + "pbinfo_stat_numbers", + this.statOrder[i] !== Stat.HP ? "3" : "empty", + ); statNumber.setName("icon_stat_number_" + i.toString()); statNumber.setOrigin(0, 0); this.statNumbers.push(statNumber); @@ -265,7 +273,6 @@ export default class BattleInfo extends Phaser.GameObjects.Container { statLabel.setVisible(false); statNumber.setVisible(false); } - }); if (!this.player) { @@ -275,17 +282,29 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.moveBelow(this.flyoutMenu, this.box); } - this.type1Icon = globalScene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type1`); + this.type1Icon = globalScene.add.sprite( + player ? -139 : -15, + player ? -17 : -15.5, + `pbinfo_${player ? "player" : "enemy"}_type1`, + ); this.type1Icon.setName("icon_type_1"); this.type1Icon.setOrigin(0, 0); this.add(this.type1Icon); - this.type2Icon = globalScene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? "player" : "enemy"}_type2`); + this.type2Icon = globalScene.add.sprite( + player ? -139 : -15, + player ? -1 : -2.5, + `pbinfo_${player ? "player" : "enemy"}_type2`, + ); this.type2Icon.setName("icon_type_2"); this.type2Icon.setOrigin(0, 0); this.add(this.type2Icon); - this.type3Icon = globalScene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type`); + this.type3Icon = globalScene.add.sprite( + player ? -154 : 0, + player ? -17 : -15.5, + `pbinfo_${player ? "player" : "enemy"}_type`, + ); this.type3Icon.setName("icon_type_3"); this.type3Icon.setOrigin(0, 0); this.add(this.type3Icon); @@ -327,32 +346,60 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setVisible(pokemon.isTerastallized); this.teraIcon.on("pointerover", () => { if (pokemon.isTerastallized) { - globalScene.ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.lastTeraType]}`) })); + globalScene.ui.showTooltip( + "", + i18next.t("fightUiHandler:teraHover", { + type: i18next.t(`pokemonInfo:Type.${PokemonType[this.lastTeraType]}`), + }), + ); } }); this.teraIcon.on("pointerout", () => globalScene.ui.hideTooltip()); const isFusion = pokemon.isFusion(); - this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 2.5); + this.splicedIcon.setPositionRelative( + this.nameText, + nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), + 2.5, + ); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => globalScene.ui.showTooltip("", `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies?.getName(pokemon.fusionFormIndex)}`)); + this.splicedIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies?.getName(pokemon.fusionFormIndex)}`, + ), + ); this.splicedIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } const doubleShiny = isFusion && pokemon.shiny && pokemon.fusionShiny; const baseVariant = !doubleShiny ? pokemon.getVariant() : pokemon.variant; - this.shinyIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5); + this.shinyIcon.setPositionRelative( + this.nameText, + nameTextWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), + 2.5, + ); this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.shinyIcon.on("pointerover", () => globalScene.ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + ), + ); this.shinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } @@ -364,7 +411,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (!this.player) { if (this.nameText.visible) { - this.nameText.on("pointerover", () => globalScene.ui.showTooltip("", i18next.t("battleInfo:generation", { generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`) }))); + this.nameText.on("pointerover", () => + globalScene.ui.showTooltip( + "", + i18next.t("battleInfo:generation", { + generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`), + }), + ), + ); this.nameText.on("pointerout", () => globalScene.ui.hideTooltip()); } @@ -372,13 +426,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.ownedIcon.setVisible(!!dexEntry.caughtAttr); const opponentPokemonDexAttr = pokemon.getDexAttr(); if (globalScene.gameMode.isClassic) { - if (globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && globalScene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + if ( + globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && + globalScene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0 + ) { this.championRibbon.setVisible(true); } } // Check if Player owns all genders and forms of the Pokemon - const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); + const missingDexAttrs = (dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr; const ownedAbilityAttrs = globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; @@ -453,10 +510,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.baseY = this.y; } - const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ]; - offsetElements.forEach(el => el.y += 1.5 * (mini ? -1 : 1)); + const offsetElements = [ + this.nameText, + this.genderText, + this.teraIcon, + this.splicedIcon, + this.shinyIcon, + this.statusIndicator, + this.levelContainer, + ]; + offsetElements.forEach(el => (el.y += 1.5 * (mini ? -1 : 1))); - [ this.type1Icon, this.type2Icon, this.type3Icon ].forEach(el => { + [this.type1Icon, this.type2Icon, this.type3Icon].forEach(el => { el.x += 4 * (mini ? 1 : -1); el.y += -8 * (mini ? 1 : -1); }); @@ -464,7 +529,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.statValuesContainer.x += 2 * (mini ? 1 : -1); this.statValuesContainer.y += -7 * (mini ? 1 : -1); - const toggledElements = [ this.hpNumbersContainer, this.expBar ]; + const toggledElements = [this.hpNumbersContainer, this.expBar]; toggledElements.forEach(el => el.setVisible(!mini)); } @@ -473,7 +538,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { targets: this.statsContainer, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); } @@ -483,7 +548,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (boss !== this.boss) { this.boss = boss; - [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.championRibbon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); + [ + this.nameText, + this.genderText, + this.teraIcon, + this.splicedIcon, + this.shinyIcon, + this.ownedIcon, + this.championRibbon, + this.statusIndicator, + this.levelContainer, + this.statValuesContainer, + ].map(e => (e.x += 48 * (boss ? -1 : 1))); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); @@ -504,8 +580,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const uiTheme = globalScene.uiTheme; const maxHp = pokemon.getMaxHp(); for (let s = 1; s < this.bossSegments; s++) { - const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; - const divider = globalScene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040); + const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; + const divider = globalScene.add.rectangle( + 0, + 0, + 1, + this.hpBar.height - (uiTheme ? 0 : 1), + pokemon.bossSegmentIndex >= s ? 0xffffff : 0x404040, + ); divider.setOrigin(0.5, 0); divider.setName("hpBar_divider_" + s.toString()); this.add(divider); @@ -547,7 +629,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (teraTypeUpdated) { this.teraIcon.setVisible(teraType !== PokemonType.UNKNOWN); - this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); + this.teraIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + this.genderText.displayWidth + 1, + 2, + ); this.teraIcon.setTintFill(Phaser.Display.Color.GetColor(...getTypeRgb(teraType))); this.lastTeraType = teraType; } @@ -555,9 +641,28 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (nameUpdated || teraTypeUpdated) { this.splicedIcon.setVisible(!!pokemon.fusionSpecies); - this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); - this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1.5); - this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5); + this.teraIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + this.genderText.displayWidth + 1, + 2, + ); + this.splicedIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), + 1.5, + ); + this.shinyIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), + 2.5, + ); } if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) { @@ -594,7 +699,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { }; const updatePokemonHp = () => { - let duration = !instant ? Phaser.Math.Clamp(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0; + let duration = !instant ? Phaser.Math.Clamp(Math.abs(this.lastHp - pokemon.hp) * 5, 250, 5000) : 0; const speed = globalScene.hpBarSpeed; if (speed) { duration = speed >= 3 ? 0 : duration / Math.pow(2, speed); @@ -616,7 +721,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { onComplete: () => { updateHpFrame(); resolve(); - } + }, }); if (!this.player) { this.lastHp = pokemon.hp; @@ -627,9 +732,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.player) { const isLevelCapped = pokemon.level >= globalScene.getMaxExpLevel(); - if ((this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level)) { + if (this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level) { const originalResolve = resolve; - const durationMultipler = Math.max(Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")(1 - (Math.min(pokemon.level - this.lastLevel, 10) / 10)), 0.1); + const durationMultipler = Math.max( + Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")( + 1 - Math.min(pokemon.level - this.lastLevel, 10) / 10, + ), + 0.1, + ); resolve = () => this.updatePokemonExp(pokemon, false, durationMultipler).then(() => originalResolve()); } else if (isLevelCapped !== this.lastLevelCapped) { this.setLevel(pokemon.level); @@ -640,7 +750,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) { return updatePokemonHp(); - } else if (!this.player && this.lastLevel !== pokemon.level) { + } + if (!this.player && this.lastLevel !== pokemon.level) { this.setLevel(pokemon.level); this.lastLevel = pokemon.level; } @@ -666,7 +777,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.BATTLE_INFO); nameTextWidth = nameSizeTest.displayWidth; - while (nameTextWidth > (this.player || !this.boss ? 60 : 98) - ((pokemon.gender !== Gender.GENDERLESS ? 6 : 0) + (pokemon.fusionSpecies ? 8 : 0) + (pokemon.isShiny() ? 8 : 0) + (Math.min(pokemon.level.toString().length, 3) - 3) * 8)) { + while ( + nameTextWidth > + (this.player || !this.boss ? 60 : 98) - + ((pokemon.gender !== Gender.GENDERLESS ? 6 : 0) + + (pokemon.fusionSpecies ? 8 : 0) + + (pokemon.isShiny() ? 8 : 0) + + (Math.min(pokemon.level.toString().length, 3) - 3) * 8) + ) { displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; @@ -678,11 +796,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastName = pokemon.getNameToRender(); if (this.nameText.visible) { - this.nameText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.nameText.width, this.nameText.height), Phaser.Geom.Rectangle.Contains); + this.nameText.setInteractive( + new Phaser.Geom.Rectangle(0, 0, this.nameText.width, this.nameText.height), + Phaser.Geom.Rectangle.Contains, + ); } } - updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier: number = 1): Promise { + updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier = 1): Promise { return new Promise(resolve => { const levelUp = this.lastLevel < pokemon.level; const relLevelExp = getLevelRelExp(this.lastLevel + 1, pokemon.species.growthRate); @@ -696,8 +817,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } instant = true; } - const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - (Math.max(this.lastLevel - 100, 0) / 150)); - let duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * BattleInfo.EXP_GAINS_DURATION_BASE) * durationMultiplier * levelDurationMultiplier : 0; + const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")( + 1 - Math.max(this.lastLevel - 100, 0) / 150, + ); + let duration = + this.visible && !instant + ? ((levelExp - this.lastLevelExp) / relLevelExp) * + BattleInfo.EXP_GAINS_DURATION_BASE * + durationMultiplier * + levelDurationMultiplier + : 0; const speed = globalScene.expGainsSpeed; if (speed && speed >= ExpGainsSpeed.DEFAULT) { duration = speed >= ExpGainsSpeed.SKIP ? ExpGainsSpeed.DEFAULT : duration / Math.pow(2, speed); @@ -734,7 +863,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { return; } resolve(); - } + }, }); }); } @@ -744,7 +873,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.levelNumbersContainer.removeAll(true); const levelStr = level.toString(); for (let i = 0; i < levelStr.length; i++) { - this.levelNumbersContainer.add(globalScene.add.image(i * 8, 0, `numbers${isCapped && this.player ? "_red" : ""}`, levelStr[i])); + this.levelNumbersContainer.add( + globalScene.add.image(i * 8, 0, `numbers${isCapped && this.player ? "_red" : ""}`, levelStr[i]), + ); } this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0)); } @@ -827,5 +958,5 @@ export class EnemyBattleInfo extends BattleInfo { super(140, -141, false); } - setMini(mini: boolean): void { } // Always mini + setMini(_mini: boolean): void {} // Always mini } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index c87ac18c65d..ccb9378c688 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -55,7 +55,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { moveDetailsWindow.setName("move-details-window"); moveDetailsWindow.setOrigin(0, 1); - this.movesWindowContainer.add([ movesWindow, moveDetailsWindow ]); + this.movesWindowContainer.add([movesWindow, moveDetailsWindow]); ui.add(this.movesWindowContainer); const messageContainer = globalScene.add.container(12, -39); @@ -64,8 +64,8 @@ export default class BattleMessageUiHandler extends MessageUiHandler { const message = addTextObject(0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { - width: this.wordWrapWidth - } + width: this.wordWrapWidth, + }, }); messageContainer.add(message); @@ -77,7 +77,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.nameBox = globalScene.add.nineslice(0, 0, "namebox", globalScene.windowType, 72, 16, 8, 8, 5, 5); this.nameBox.setOrigin(0, 0); - this.nameText = addTextObject(8, 0, "Rival", TextStyle.MESSAGE, { maxLines: 1 }); + this.nameText = addTextObject(8, 0, "Rival", TextStyle.MESSAGE, { + maxLines: 1, + }); this.nameBoxContainer.add(this.nameBox); this.nameBoxContainer.add(this.nameText); @@ -91,7 +93,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsContainer = levelUpStatsContainer; - const levelUpStatsLabelsContent = addTextObject((globalScene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsLabelsContent = addTextObject(globalScene.game.canvas.width / 6 - 73, -94, "", TextStyle.WINDOW, { + maxLines: 6, + }); levelUpStatsLabelsContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); let levelUpStatsLabelText = ""; @@ -101,19 +105,36 @@ export default class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsLabelsContent.text = levelUpStatsLabelText; levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth; - const levelUpStatsBg = addWindow((globalScene.game.canvas.width / 6), -100, 80 + levelUpStatsLabelsContent.displayWidth, 100); + const levelUpStatsBg = addWindow( + globalScene.game.canvas.width / 6, + -100, + 80 + levelUpStatsLabelsContent.displayWidth, + 100, + ); levelUpStatsBg.setOrigin(1, 0); levelUpStatsContainer.add(levelUpStatsBg); levelUpStatsContainer.add(levelUpStatsLabelsContent); - const levelUpStatsIncrContent = addTextObject((globalScene.game.canvas.width / 6) - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsIncrContent = addTextObject( + globalScene.game.canvas.width / 6 - 50, + -94, + "+\n+\n+\n+\n+\n+", + TextStyle.WINDOW, + { maxLines: 6 }, + ); levelUpStatsIncrContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsContainer.add(levelUpStatsIncrContent); this.levelUpStatsIncrContent = levelUpStatsIncrContent; - const levelUpStatsValuesContent = addBBCodeTextObject((globalScene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6, lineSpacing: 5 }); + const levelUpStatsValuesContent = addBBCodeTextObject( + globalScene.game.canvas.width / 6 - 7, + -94, + "", + TextStyle.WINDOW, + { maxLines: 6, lineSpacing: 5 }, + ); levelUpStatsValuesContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setAlign("right"); @@ -153,12 +174,27 @@ export default class BattleMessageUiHandler extends MessageUiHandler { super.clear(); } - showText(text: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.hideNameText(); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name?: string, delay?: number | null, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number) { + showDialogue( + text: string, + name?: string, + delay?: number | null, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { if (name) { this.showNameText(name); } @@ -182,10 +218,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.onActionInput = () => { if (!showTotals) { return this.promptLevelUpStats(partyMemberIndex, [], true).then(() => resolve()); - } else { - this.levelUpStatsContainer.setVisible(false); - resolve(); } + this.levelUpStatsContainer.setVisible(false); + resolve(); }; }); } diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index 0cd3da71248..45ed766c7fa 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -24,7 +24,18 @@ export default class BgmBar extends Phaser.GameObjects.Container { this.defaultWidth = 230; this.defaultHeight = 100; - this.bg = globalScene.add.nineslice(-5, -5, "bgm_bar", undefined, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); + this.bg = globalScene.add.nineslice( + -5, + -5, + "bgm_bar", + undefined, + this.defaultWidth, + this.defaultHeight, + 0, + 0, + 10, + 10, + ); this.bg.setOrigin(0, 0); this.add(this.bg); @@ -40,8 +51,8 @@ export default class BgmBar extends Phaser.GameObjects.Container { } /* - * Set the BGM Name to the BGM bar. - * @param {string} bgmName The name of the BGM to set. + * Set the BGM Name to the BGM bar. + * @param {string} bgmName The name of the BGM to set. */ setBgmToBgmBar(bgmName: string): void { this.musicText.setText(`${i18next.t("bgmName:music")}${this.getRealBgmName(bgmName)}`); @@ -83,11 +94,13 @@ export default class BgmBar extends Phaser.GameObjects.Container { ease: "Sine.easeInOut", onComplete: () => { this.setVisible(true); - } + }, }); } getRealBgmName(bgmName: string): string { - return i18next.t([ `bgmName:${bgmName}`, "bgmName:missing_entries" ], { name: Utils.formatText(bgmName) }); + return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], { + name: Utils.formatText(bgmName), + }); } } diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index d58fd040a7c..ba85ed7fef3 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -18,7 +18,7 @@ export default 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.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); } setup(): void { @@ -52,9 +52,10 @@ export default class CandyBar extends Phaser.GameObjects.Container { if (this.shown) { if (this.speciesId === starterSpeciesId) { return resolve(); - } else { - return this.hide().then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)).then(() => resolve()); } + return this.hide() + .then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)) + .then(() => resolve()); } const colorScheme = starterColors[starterSpeciesId]; @@ -62,7 +63,9 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.candyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.candyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); - this.countText.setText(`${globalScene.gameData.starterData[starterSpeciesId].candyCount + count} (+${count.toString()})`); + this.countText.setText( + `${globalScene.gameData.starterData[starterSpeciesId].candyCount + count} (+${count.toString()})`, + ); this.bg.width = this.countText.displayWidth + 28; @@ -76,14 +79,14 @@ export default 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.game.canvas.width / 6 - (this.bg.width - 5), duration: 500, ease: "Sine.easeOut", onComplete: () => { this.tween = null; this.resetAutoHideTimer(); resolve(); - } + }, }); this.setVisible(true); @@ -107,7 +110,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -115,7 +118,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.shown = false; this.setVisible(false); resolve(); - } + }, }); }); } diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 31ee91388fc..61989cd594e 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -28,7 +28,12 @@ export default class GameChallengesUiHandler extends UiHandler { private descriptionText: BBCodeText; - private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text, leftArrow: Phaser.GameObjects.Image, rightArrow: Phaser.GameObjects.Image }>; + private challengeLabels: Array<{ + label: Phaser.GameObjects.Text; + value: Phaser.GameObjects.Text; + leftArrow: Phaser.GameObjects.Image; + rightArrow: Phaser.GameObjects.Image; + }>; private monoTypeValue: Phaser.GameObjects.Sprite; private cursorObj: Phaser.GameObjects.NineSlice | null; @@ -57,15 +62,25 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengesContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.challengesContainer.setName("challenges"); - this.challengesContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.challengesContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - const bgOverlay = globalScene.add.rectangle(-1, -1, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0x424242, 0.8); + const bgOverlay = globalScene.add.rectangle( + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0x424242, + 0.8, + ); bgOverlay.setName("rect-challenge-overlay"); bgOverlay.setOrigin(0, 0); 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.game.canvas.width / 6, 24); headerBg.setName("window-header-bg"); headerBg.setOrigin(0, 0); @@ -75,11 +90,21 @@ export default class GameChallengesUiHandler extends UiHandler { headerText.setPositionRelative(headerBg, 8, 4); this.optionsWidth = globalScene.scaledCanvas.width * 0.6; - this.optionsBg = addWindow(0, headerBg.height, this.optionsWidth, globalScene.scaledCanvas.height - headerBg.height - 2); + this.optionsBg = addWindow( + 0, + headerBg.height, + this.optionsWidth, + globalScene.scaledCanvas.height - headerBg.height - 2, + ); this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); - const descriptionBg = addWindow(0, headerBg.height, globalScene.scaledCanvas.width - this.optionsWidth, globalScene.scaledCanvas.height - headerBg.height - 26); + const descriptionBg = addWindow( + 0, + headerBg.height, + globalScene.scaledCanvas.width - this.optionsWidth, + globalScene.scaledCanvas.height - headerBg.height - 26, + ); descriptionBg.setName("window-desc-bg"); descriptionBg.setOrigin(0, 0); descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); @@ -89,12 +114,12 @@ export default class GameChallengesUiHandler extends UiHandler { fontSize: 84, color: Color.ORANGE, padding: { - bottom: 6 + bottom: 6, }, wrap: { mode: "word", width: (descriptionBg.width - 12) * 6, - } + }, }); this.descriptionText.setName("text-desc"); globalScene.add.existing(this.descriptionText); @@ -112,7 +137,18 @@ export default class GameChallengesUiHandler extends UiHandler { this.startText.setOrigin(0, 0); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); - this.startCursor = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, descriptionBg.width - 8, 16, 1, 1, 1, 1); + this.startCursor = globalScene.add.nineslice( + 0, + 0, + "summary_moves_cursor", + undefined, + descriptionBg.width - 8, + 16, + 1, + 1, + 1, + 1, + ); this.startCursor.setName("9s-start-cursor"); this.startCursor.setOrigin(0, 0); this.startCursor.setPositionRelative(this.startBg, 4, 3); @@ -153,7 +189,7 @@ export default class GameChallengesUiHandler extends UiHandler { label: label, value: value, leftArrow: leftArrow, - rightArrow: rightArrow + rightArrow: rightArrow, }; } @@ -208,7 +244,8 @@ export default class GameChallengesUiHandler extends UiHandler { const tempText = addTextObject(0, 0, "", TextStyle.SETTINGS_LABEL); // this is added here to get the widest text object for this language, which will be used for the arrow placement - for (let j = 0; j <= globalScene.gameMode.challenges[i].maxValue; j++) { // this goes through each challenge's value to find out what the max width will be + for (let j = 0; j <= globalScene.gameMode.challenges[i].maxValue; j++) { + // this goes through each challenge's value to find out what the max width will be if (globalScene.gameMode.challenges[i].id !== Challenges.SINGLE_TYPE) { tempText.setText(globalScene.gameMode.challenges[i].getValue(j)); if (tempText.displayWidth > this.widestTextBox) { @@ -234,17 +271,28 @@ export default class GameChallengesUiHandler extends UiHandler { challengeLabel.label.setText(challenge.getName()); challengeLabel.leftArrow.setPositionRelative(challengeLabel.label, this.leftArrowGap, 4.5); challengeLabel.leftArrow.setVisible(challenge.value !== 0); - challengeLabel.rightArrow.setPositionRelative(challengeLabel.leftArrow, Math.max(this.monoTypeValue.width, this.widestTextBox) + challengeLabel.leftArrow.displayWidth + 2 * this.arrowSpacing, 0); + challengeLabel.rightArrow.setPositionRelative( + challengeLabel.leftArrow, + Math.max(this.monoTypeValue.width, this.widestTextBox) + + challengeLabel.leftArrow.displayWidth + + 2 * this.arrowSpacing, + 0, + ); challengeLabel.rightArrow.setVisible(challenge.value !== challenge.maxValue); // this check looks to make sure that the arrows and value textbox don't take up too much space that they'll clip the right edge of the options background - if (challengeLabel.rightArrow.x + challengeLabel.rightArrow.width + this.optionsBg.rightWidth + this.arrowSpacing > this.optionsWidth) { + if ( + challengeLabel.rightArrow.x + challengeLabel.rightArrow.width + this.optionsBg.rightWidth + this.arrowSpacing > + this.optionsWidth + ) { // if we go out of bounds of the box, set the x position as far right as we can without going past the box, with this.arrowSpacing to allow a small gap between the arrow and border challengeLabel.rightArrow.setX(this.optionsWidth - this.arrowSpacing - this.optionsBg.rightWidth); } // this line of code gets the center point between the left and right arrows from their left side (Arrow.x gives middle point), taking into account the width of the arrows - const xLocation = Math.round((challengeLabel.leftArrow.x + challengeLabel.rightArrow.x + challengeLabel.leftArrow.displayWidth) / 2); + const xLocation = Math.round( + (challengeLabel.leftArrow.x + challengeLabel.rightArrow.x + challengeLabel.leftArrow.displayWidth) / 2, + ); if (challenge.id === Challenges.SINGLE_TYPE) { this.monoTypeValue.setX(xLocation); this.monoTypeValue.setY(challengeLabel.label.y + 8); @@ -266,12 +314,10 @@ export default class GameChallengesUiHandler extends UiHandler { // This checks if a challenge has been selected by the user and updates the text/its opacity accordingly. this.hasSelectedChallenge = globalScene.gameMode.challenges.some(c => c.value !== 0); if (this.hasSelectedChallenge) { - this.startText.setText(i18next.t("common:start")); this.startText.setAlpha(1); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); } else { - this.startText.setText(i18next.t("challenges:noneSelected")); this.startText.setAlpha(0.5); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); @@ -362,14 +408,16 @@ export default class GameChallengesUiHandler extends UiHandler { case Button.UP: if (this.cursor === 0) { if (this.scrollCursor === 0) { - // When at the top of the menu and pressing UP, move to the bottommost item. - if (globalScene.gameMode.challenges.length > rowsToDisplay) { // If there are more than 9 challenges, scroll to the bottom - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + if (globalScene.gameMode.challenges.length > rowsToDisplay) { + // If there are more than 9 challenges, scroll to the bottom + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. const successB = this.setScrollCursor(globalScene.gameMode.challenges.length - rowsToDisplay); success = successA && successB; // success is just there to play the little validation sound effect - } else { // If there are 9 or less challenges, just move to the bottom one + } else { + // If there are 9 or less challenges, just move to the bottom one success = this.setCursor(globalScene.gameMode.challenges.length - 1); } } else { @@ -385,18 +433,21 @@ export default class GameChallengesUiHandler extends UiHandler { case Button.DOWN: if (this.cursor === rowsToDisplay - 1) { if (this.scrollCursor < globalScene.gameMode.challenges.length - rowsToDisplay) { - // When at the bottom and pressing DOWN, scroll if possible. + // When at the bottom and pressing DOWN, scroll if possible. success = this.setScrollCursor(this.scrollCursor + 1); } else { - // When at the bottom of a scrolling menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, preparing for the scroll to the top. + // When at the bottom of a scrolling menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, preparing for the scroll to the top. const successA = this.setCursor(0); // Then, adjust the scroll to display the topmost elements of the menu. const successB = this.setScrollCursor(0); success = successA && successB; // success is just there to play the little validation sound effect } - } else if (globalScene.gameMode.challenges.length < rowsToDisplay && this.cursor === globalScene.gameMode.challenges.length - 1) { - // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item. + } else if ( + globalScene.gameMode.challenges.length < rowsToDisplay && + this.cursor === globalScene.gameMode.challenges.length - 1 + ) { + // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item. success = this.setCursor(0); } else { success = this.setCursor(this.cursor + 1); @@ -406,14 +457,14 @@ export default class GameChallengesUiHandler extends UiHandler { } break; case Button.LEFT: - // Moves the option cursor left, if possible. + // Moves the option cursor left, if possible. success = this.getActiveChallenge().decreaseValue(); if (success) { this.updateText(); } break; case Button.RIGHT: - // Moves the option cursor right, if possible. + // Moves the option cursor right, if possible. success = this.getActiveChallenge().increaseValue(); if (success) { this.updateText(); @@ -434,7 +485,18 @@ export default class GameChallengesUiHandler extends UiHandler { let ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, this.optionsWidth - 8, 16, 1, 1, 1, 1); + this.cursorObj = globalScene.add.nineslice( + 0, + 0, + "summary_moves_cursor", + undefined, + this.optionsWidth - 8, + 16, + 1, + 1, + 1, + 1, + ); this.cursorObj.setOrigin(0, 0); this.valuesContainer.add(this.cursorObj); } diff --git a/src/ui/char-sprite.ts b/src/ui/char-sprite.ts index ccd97e2c8e4..74c021a65b8 100644 --- a/src/ui/char-sprite.ts +++ b/src/ui/char-sprite.ts @@ -10,11 +10,11 @@ export default class CharSprite extends Phaser.GameObjects.Container { public shown: boolean; constructor() { - super(globalScene, (globalScene.game.canvas.width / 6) + 32, -42); + super(globalScene, globalScene.game.canvas.width / 6 + 32, -42); } setup(): void { - [ this.sprite, this.transitionSprite ] = new Array(2).fill(null).map(() => { + [this.sprite, this.transitionSprite] = new Array(2).fill(null).map(() => { const ret = globalScene.add.sprite(0, 0, "", ""); ret.setOrigin(0.5, 1); this.add(ret); @@ -49,12 +49,12 @@ export default class CharSprite extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6) - 102, + x: globalScene.game.canvas.width / 6 - 102, duration: 750, ease: "Cubic.easeOut", onComplete: () => { resolve(); - } + }, }); this.setVisible(globalScene.textures.get(key).key !== Utils.MissingTextureKey); @@ -81,7 +81,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { this.sprite.setTexture(this.key, variant); this.transitionSprite.setVisible(false); resolve(); - } + }, }); this.variant = variant; }); @@ -95,7 +95,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6) + 32, + x: globalScene.game.canvas.width / 6 + 32, duration: 750, ease: "Cubic.easeIn", onComplete: () => { @@ -103,7 +103,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { this.setVisible(false); } resolve(); - } + }, }); this.shown = false; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 0dd3602d205..55937bb8b00 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -17,7 +17,7 @@ export enum Command { BALL, POKEMON, RUN, - TERA + TERA, } export default class CommandUiHandler extends UiHandler { @@ -26,8 +26,8 @@ export default class CommandUiHandler extends UiHandler { private teraButton: Phaser.GameObjects.Sprite; - protected fieldIndex: number = 0; - protected cursor2: number = 0; + protected fieldIndex = 0; + protected cursor2 = 0; constructor() { super(Mode.COMMAND); @@ -39,7 +39,7 @@ export default class CommandUiHandler extends UiHandler { i18next.t("commandUiHandler:fight"), i18next.t("commandUiHandler:ball"), i18next.t("commandUiHandler:pokemon"), - i18next.t("commandUiHandler:run") + i18next.t("commandUiHandler:run"), ]; this.commandsContainer = globalScene.add.container(217, -38.7); @@ -51,7 +51,12 @@ export default class CommandUiHandler extends UiHandler { this.teraButton.setName("terrastallize-button"); this.teraButton.setScale(1.3); this.teraButton.setFrame("fire"); - this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(PokemonType.FIRE), isTerastallized: false }); + this.teraButton.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + teraColor: getTypeRgb(PokemonType.FIRE), + isTerastallized: false, + }); this.commandsContainer.add(this.teraButton); for (let c = 0; c < commands.length; c++) { @@ -64,7 +69,7 @@ export default class CommandUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); - this.fieldIndex = args.length ? args[0] as number : 0; + this.fieldIndex = args.length ? (args[0] as number) : 0; this.commandsContainer.setVisible(true); @@ -92,7 +97,12 @@ export default class CommandUiHandler extends UiHandler { messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(this.canTera() ? 910 : 1110); - messageHandler.showText(i18next.t("commandUiHandler:actionMessage", { pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()) }), 0); + messageHandler.showText( + i18next.t("commandUiHandler:actionMessage", { + pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()), + }), + 0, + ); if (this.getCursor() === Command.POKEMON) { this.setCursor(Command.FIGHT); } else { @@ -110,10 +120,9 @@ export default class CommandUiHandler extends UiHandler { const cursor = this.getCursor(); if (button === Button.CANCEL || button === Button.ACTION) { - if (button === Button.ACTION) { switch (cursor) { - // Fight + // Fight case Command.FIGHT: ui.setMode(Mode.FIGHT, (globalScene.getCurrentPhase() as CommandPhase).getFieldIndex()); success = true; @@ -125,7 +134,13 @@ export default class CommandUiHandler extends UiHandler { break; // Pokemon case Command.POKEMON: - ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (globalScene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); + ui.setMode( + Mode.PARTY, + PartyUiMode.SWITCH, + (globalScene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), + null, + PartyUiHandler.FilterNonFainted, + ); success = true; break; // Run @@ -182,14 +197,21 @@ export default class CommandUiHandler extends UiHandler { canTera(): boolean { const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; const activePokemon = globalScene.getField()[this.fieldIndex]; - const isBlockedForm = activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra"); + const isBlockedForm = + activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra"); const currentTeras = globalScene.arena.playerTerasUsed; - const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; - return hasTeraMod && !isBlockedForm && (currentTeras + plannedTera) < 1; + const plannedTera = + globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; + return hasTeraMod && !isBlockedForm && currentTeras + plannedTera < 1; } toggleTeraButton() { - this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(globalScene.getField()[this.fieldIndex].getTeraType()), isTerastallized: this.getCursor() === Command.TERA }); + this.teraButton.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + teraColor: getTypeRgb(globalScene.getField()[this.fieldIndex].getTeraType()), + isTerastallized: this.getCursor() === Command.TERA, + }); } getCursor(): number { diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index 3a3a5dfbfe7..a8710b0ab01 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -5,9 +5,7 @@ import i18next from "i18next"; import { Button } from "#enums/buttons"; import { globalScene } from "#app/global-scene"; - export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { - public static readonly windowWidth: number = 48; private switchCheck: boolean; @@ -22,7 +20,13 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { } show(args: any[]): boolean { - if (args.length === 4 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && args[3] === "fullParty") { + if ( + args.length === 4 && + args[0] instanceof Function && + args[1] instanceof Function && + args[2] instanceof Function && + args[3] === "fullParty" + ) { const config: OptionSelectConfig = { options: [ { @@ -31,35 +35,38 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { args[0](); return true; }, - }, { + }, + { label: i18next.t("menu:yes"), handler: () => { args[1](); return true; - } - }, { + }, + }, + { label: i18next.t("menu:no"), handler: () => { args[2](); return true; - } - } + }, + }, ], - delay: args.length >= 8 && args[7] !== null ? args[7] as number : 0 + delay: args.length >= 8 && args[7] !== null ? (args[7] as number) : 0, }; - super.show([ config ]); + super.show([config]); - this.switchCheck = args.length >= 5 && args[4] !== null && args[4] as boolean; + this.switchCheck = args.length >= 5 && args[4] !== null && (args[4] as boolean); - const xOffset = (args.length >= 6 && args[5] !== null ? args[5] as number : 0); - const yOffset = (args.length >= 7 && args[6] !== null ? args[6] as number : 0); + const xOffset = args.length >= 6 && args[5] !== null ? (args[5] as number) : 0; + const yOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; - this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 + xOffset, -48 + yOffset); + this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); return true; - } else if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { + } + if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { const config: OptionSelectConfig = { options: [ { @@ -67,28 +74,28 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { handler: () => { args[0](); return true; - } + }, }, { label: i18next.t("menu:no"), handler: () => { args[1](); return true; - } - } + }, + }, ], - delay: args.length >= 6 && args[5] !== null ? args[5] as number : 0, - noCancel: args.length >= 7 && args[6] !== null ? args[6] as boolean : false, + delay: args.length >= 6 && args[5] !== null ? (args[5] as number) : 0, + noCancel: args.length >= 7 && args[6] !== null ? (args[6] as boolean) : false, }; - super.show([ config ]); + super.show([config]); - this.switchCheck = args.length >= 3 && args[2] !== null && args[2] as boolean; + this.switchCheck = args.length >= 3 && args[2] !== null && (args[2] as boolean); - 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); + 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.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index d9131150262..53c737898e7 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -6,16 +6,16 @@ import { WindowVariant, addWindow } from "./ui-theme"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; export interface RankingEntry { - rank: number, - username: string, - score: number, - wave: number + rank: number; + username: string; + score: number; + wave: number; } // Don't forget to update translations when adding a new category export enum ScoreboardCategory { DAILY, - WEEKLY + WEEKLY, } export class DailyRunScoreboard extends Phaser.GameObjects.Container { @@ -63,7 +63,13 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { const titleWindow = addWindow(0, 0, 114, 18, false, false, undefined, undefined, WindowVariant.THIN); this.add(titleWindow); - this.titleLabel = addTextObject(titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t("menu:loading"), TextStyle.WINDOW, { fontSize: "64px" }); + this.titleLabel = addTextObject( + titleWindow.displayWidth / 2, + titleWindow.displayHeight / 2, + i18next.t("menu:loading"), + TextStyle.WINDOW, + { fontSize: "64px" }, + ); this.titleLabel.setOrigin(0.5, 0.5); this.add(this.titleLabel); @@ -95,7 +101,11 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.update(this.category < Utils.getEnumKeys(ScoreboardCategory).length - 1 ? this.category + 1 : 0); }); - this.prevPageButton = globalScene.add.sprite(window.displayWidth / 2 - 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor_reverse"); + this.prevPageButton = globalScene.add.sprite( + window.displayWidth / 2 - 16, + titleWindow.displayHeight + window.displayHeight - 15, + "cursor_reverse", + ); this.prevPageButton.setOrigin(0, 0); this.prevPageButton.setAlpha(0.5); this.add(this.prevPageButton); @@ -107,11 +117,21 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { } }); - this.pageNumberLabel = addTextObject(window.displayWidth / 2, titleWindow.displayHeight + window.displayHeight - 16, "1", TextStyle.WINDOW, { fontSize: "64px" }); + this.pageNumberLabel = addTextObject( + window.displayWidth / 2, + titleWindow.displayHeight + window.displayHeight - 16, + "1", + TextStyle.WINDOW, + { fontSize: "64px" }, + ); this.pageNumberLabel.setOrigin(0.5, 0); this.add(this.pageNumberLabel); - this.nextPageButton = globalScene.add.sprite(window.displayWidth / 2 + 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor"); + this.nextPageButton = globalScene.add.sprite( + window.displayWidth / 2 + 16, + titleWindow.displayHeight + window.displayHeight - 15, + "cursor", + ); this.nextPageButton.setOrigin(1, 0); this.nextPageButton.setAlpha(0.5); this.add(this.nextPageButton); @@ -133,18 +153,26 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { const getEntry = (rank: string, username: string, score: string, wave: string) => { const entryContainer = globalScene.add.container(0, 0); - const rankLabel = addTextObject(0, 0, rank, TextStyle.WINDOW, { fontSize: "54px" }); + const rankLabel = addTextObject(0, 0, rank, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(rankLabel); - const usernameLabel = addTextObject(12, 0, username, TextStyle.WINDOW, { fontSize: "54px" }); + const usernameLabel = addTextObject(12, 0, username, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(usernameLabel); - const scoreLabel = addTextObject(84, 0, score, TextStyle.WINDOW, { fontSize: "54px" }); + const scoreLabel = addTextObject(84, 0, score, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(scoreLabel); switch (this.category) { case ScoreboardCategory.DAILY: - const waveLabel = addTextObject(68, 0, wave, TextStyle.WINDOW, { fontSize: "54px" }); + const waveLabel = addTextObject(68, 0, wave, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(waveLabel); break; case ScoreboardCategory.WEEKLY: @@ -155,7 +183,14 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { return entryContainer; }; - this.rankingsContainer.add(getEntry(i18next.t("menu:positionIcon"), i18next.t("menu:usernameScoreboard"), i18next.t("menu:score"), i18next.t("menu:wave"))); + this.rankingsContainer.add( + getEntry( + i18next.t("menu:positionIcon"), + i18next.t("menu:usernameScoreboard"), + i18next.t("menu:score"), + i18next.t("menu:wave"), + ), + ); rankings.forEach((r: RankingEntry, i: number) => { const entryContainer = getEntry(r.rank.toString(), r.username, r.score.toString(), r.wave.toString()); @@ -175,7 +210,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { * * @param {ScoreboardCategory} [category=this.category] - The category to fetch rankings for. Defaults to the current category. * @param {number} [page=this.page] - The page number to fetch. Defaults to the current page. - */ + */ update(category: ScoreboardCategory = this.category, page: number = this.page) { if (this.isUpdating) { return; @@ -191,39 +226,49 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.page = page = 1; } - Utils.executeIf(category !== this.category || this.pageCount === undefined, - () => pokerogueApi.daily.getRankingsPageCount({ category }).then(count => this.pageCount = count) - ).then(() => { - pokerogueApi.daily.getRankings({ category, page }) - .then(rankings => { - this.page = page; - this.category = category; - this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`); - this.pageNumberLabel.setText(page.toString()); - if (rankings) { - this.loadingLabel.setVisible(false); - this.updateRankings(rankings); - } else { - this.loadingLabel.setText(i18next.t("menu:noRankings")); - } - }).finally(() => { - this.isUpdating = false; - }); - }).catch(err => { - console.error("Failed to load daily rankings:\n", err); - }); + Utils.executeIf(category !== this.category || this.pageCount === undefined, () => + pokerogueApi.daily.getRankingsPageCount({ category }).then(count => (this.pageCount = count)), + ) + .then(() => { + pokerogueApi.daily + .getRankings({ category, page }) + .then(rankings => { + this.page = page; + this.category = category; + this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`); + this.pageNumberLabel.setText(page.toString()); + if (rankings) { + this.loadingLabel.setVisible(false); + this.updateRankings(rankings); + } else { + this.loadingLabel.setText(i18next.t("menu:noRankings")); + } + }) + .finally(() => { + this.isUpdating = false; + }); + }) + .catch(err => { + console.error("Failed to load daily rankings:\n", err); + }); } /** * Sets the state of the navigation buttons. * @param {boolean} [enabled=true] - Whether the buttons should be enabled or disabled. */ - setButtonsState(enabled: boolean = true) { + setButtonsState(enabled = true) { const buttons = [ - { button: this.prevPageButton, alphaValue: enabled ? (this.page > 1 ? 1 : 0.5) : 0.5 }, - { button: this.nextPageButton, alphaValue: enabled ? (this.page < this.pageCount ? 1 : 0.5) : 0.5 }, + { + button: this.prevPageButton, + alphaValue: enabled ? (this.page > 1 ? 1 : 0.5) : 0.5, + }, + { + button: this.nextPageButton, + alphaValue: enabled ? (this.page < this.pageCount ? 1 : 0.5) : 0.5, + }, { button: this.nextCategoryButton, alphaValue: enabled ? 1 : 0.5 }, - { button: this.prevCategoryButton, alphaValue: enabled ? 1 : 0.5 } + { button: this.prevCategoryButton, alphaValue: enabled ? 1 : 0.5 }, ]; buttons.forEach(({ button, alphaValue }) => { diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index ec433a35733..2cbd1f0dfa9 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -5,24 +5,24 @@ import { ScrollBar } from "#app/ui/scroll-bar"; import i18next from "i18next"; export enum DropDownState { - ON = 0, - OFF = 1, - EXCLUDE = 2, - UNLOCKABLE = 3, - ONE = 4, - TWO = 5 + ON = 0, + OFF = 1, + EXCLUDE = 2, + UNLOCKABLE = 3, + ONE = 4, + TWO = 5, } export enum DropDownType { - SINGLE = 0, - MULTI = 1, - HYBRID = 2, - RADIAL = 3 + SINGLE = 0, + MULTI = 1, + HYBRID = 2, + RADIAL = 3, } export enum SortDirection { ASC = -1, - DESC = 1 + DESC = 1, } export enum SortCriteria { @@ -32,7 +32,7 @@ export enum SortCriteria { IV = 3, NAME = 4, CAUGHT = 5, - HATCHED = 6 + HATCHED = 6, } export class DropDownLabel { @@ -47,7 +47,6 @@ export class DropDownLabel { } } - export class DropDownOption extends Phaser.GameObjects.Container { public state: DropDownState = DropDownState.ON; public toggle: Phaser.GameObjects.Sprite; @@ -70,7 +69,7 @@ export class DropDownOption extends Phaser.GameObjects.Container { if (Array.isArray(labels)) { this.labels = labels; } else { - this.labels = labels ? [ labels ] : [ new DropDownLabel("") ]; + this.labels = labels ? [labels] : [new DropDownLabel("")]; } this.currentLabelIndex = 0; const currentLabel = this.labels[this.currentLabelIndex]; @@ -105,7 +104,7 @@ export class DropDownOption extends Phaser.GameObjects.Container { this.toggle = globalScene.add.sprite(0, 0, "cursor"); this.toggle.setScale(0.5); this.toggle.setOrigin(0, 0.5); - this.toggle.setRotation(Math.PI / 180 * -90); + this.toggle.setRotation((Math.PI / 180) * -90); } else { this.toggle = globalScene.add.sprite(0, 0, "candy"); this.toggle.setScale(0.3); @@ -279,35 +278,40 @@ export class DropDownOption extends Phaser.GameObjects.Container { this.text.setText(currentText); return w; } - } - export class DropDown extends Phaser.GameObjects.Container { public options: DropDownOption[]; private window: Phaser.GameObjects.NineSlice; private cursorObj: Phaser.GameObjects.Image; public dropDownType: DropDownType = DropDownType.MULTI; - public cursor: number = 0; - private lastCursor: number = -1; - public defaultCursor: number = 0; + public cursor = 0; + private lastCursor = -1; + public defaultCursor = 0; private onChange: () => void; private lastDir: SortDirection = SortDirection.ASC; private defaultSettings: any[]; private dropDownScrollBar: ScrollBar; - private totalOptions: number = 0; - private maxOptions: number = 0; - private shownOptions: number = 0; - private tooManyOptions: Boolean = false; - private firstShown: number = 0; - private optionHeight: number = 0; - private optionSpacing: number = 0; - private optionPaddingX: number = 4; - private optionPaddingY: number = 6; - private optionWidth: number = 100; - private cursorOffset: number = 0; + private totalOptions = 0; + private maxOptions = 0; + private shownOptions = 0; + private tooManyOptions = false; + private firstShown = 0; + private optionHeight = 0; + private optionSpacing = 0; + private optionPaddingX = 4; + private optionPaddingY = 6; + private optionWidth = 100; + private cursorOffset = 0; - constructor(x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { + constructor( + x: number, + y: number, + options: DropDownOption[], + onChange: () => void, + type: DropDownType = DropDownType.MULTI, + optionSpacing = 2, + ) { const windowPadding = 5; const cursorOffset = 7; @@ -331,7 +335,16 @@ export class DropDown extends Phaser.GameObjects.Container { // For MULTI and HYBRID filter, add an ALL option at the top if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { - this.options.unshift(new DropDownOption("ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); + this.options.unshift( + new DropDownOption( + "ALL", + new DropDownLabel( + i18next.t("filterBar:all"), + undefined, + this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF, + ), + ), + ); } this.maxOptions = 19; @@ -343,7 +356,6 @@ export class DropDown extends Phaser.GameObjects.Container { // Place ui elements in the correct spot options.forEach((option, index) => { - const toggleVisibility = type !== DropDownType.SINGLE || option.state === DropDownState.ON; option.setupToggleIcon(type, toggleVisibility); @@ -366,7 +378,17 @@ export class DropDown extends Phaser.GameObjects.Container { this.firstShown = 0; }); - this.window = addWindow(0, 0, this.optionWidth, options[this.shownOptions - 1].y + this.optionHeight + this.optionPaddingY, false, false, undefined, undefined, WindowVariant.XTHIN); + this.window = addWindow( + 0, + 0, + this.optionWidth, + options[this.shownOptions - 1].y + this.optionHeight + this.optionPaddingY, + false, + false, + undefined, + undefined, + WindowVariant.XTHIN, + ); this.add(this.window); this.add(options); this.add(this.cursorObj); @@ -408,7 +430,6 @@ export class DropDown extends Phaser.GameObjects.Container { } setCursor(cursor: number): boolean { - if (this.tooManyOptions) { this.setLabels(cursor); } @@ -418,37 +439,35 @@ export class DropDown extends Phaser.GameObjects.Container { cursor = 0; this.cursorObj.setVisible(false); return false; - } else if (cursor >= this.options.length) { + } + if (cursor >= this.options.length) { cursor = this.options.length - 1; this.cursorObj.y = this.options[cursor].y + 3.5; this.cursorObj.setVisible(true); return false; - } else { - this.cursorObj.y = this.options[cursor].y + 3.5; - this.cursorObj.setVisible(true); - // If hydrid type, we need to update the filters when going up/down in the list - if (this.dropDownType === DropDownType.HYBRID) { - this.lastCursor = cursor; - this.onChange(); - } + } + this.cursorObj.y = this.options[cursor].y + 3.5; + this.cursorObj.setVisible(true); + // If hydrid type, we need to update the filters when going up/down in the list + if (this.dropDownType === DropDownType.HYBRID) { + this.lastCursor = cursor; + this.onChange(); } return true; } setLabels(cursor: number) { - - if ((cursor === 0) && (this.lastCursor === this.totalOptions - 1)) { + if (cursor === 0 && this.lastCursor === this.totalOptions - 1) { this.firstShown = 0; - } else if ((cursor === this.totalOptions - 1) && (this.lastCursor === 0)) { + } else if (cursor === this.totalOptions - 1 && this.lastCursor === 0) { this.firstShown = this.totalOptions - this.shownOptions; - } else if ((cursor - this.firstShown >= this.shownOptions) && (cursor > this.lastCursor)) { + } else if (cursor - this.firstShown >= this.shownOptions && cursor > this.lastCursor) { this.firstShown += 1; - } else if ((cursor < this.firstShown) && (cursor < this.lastCursor)) { + } else if (cursor < this.firstShown && cursor < this.lastCursor) { this.firstShown -= 1; } this.options.forEach((option, index) => { - option.y = (index - this.firstShown) * (this.optionHeight + this.optionSpacing) + this.optionPaddingY; const baseX = this.cursorOffset + this.optionPaddingX + 3; @@ -460,7 +479,7 @@ export class DropDown extends Phaser.GameObjects.Container { option.setTogglePosition(baseX, baseY); } - if ((index < this.firstShown) || ( index >= this.firstShown + this.shownOptions)) { + if (index < this.firstShown || index >= this.firstShown + this.shownOptions) { option.visible = false; } else { option.visible = true; @@ -494,7 +513,7 @@ export class DropDown extends Phaser.GameObjects.Container { } } else if (this.dropDownType === DropDownType.SINGLE) { if (option.state === DropDownState.OFF) { - this.options.forEach((option) => { + this.options.forEach(option => { option.setOptionState(DropDownState.OFF); option.setDirection(SortDirection.ASC); option.toggle.setVisible(false); @@ -537,9 +556,12 @@ export class DropDown extends Phaser.GameObjects.Container { */ getVals(): any[] { if (this.dropDownType === DropDownType.MULTI) { - return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); - } else if (this.dropDownType === DropDownType.HYBRID) { - const selected = this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); + return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map(option => option.val); + } + if (this.dropDownType === DropDownType.HYBRID) { + const selected = this.options + .filter((option, i) => i > 0 && option.state === DropDownState.ON) + .map(option => option.val); if (selected.length > 0) { return selected; } @@ -548,16 +570,18 @@ export class DropDown extends Phaser.GameObjects.Container { return this.options.filter((_, i) => i > 0).map(option => option.val); } // if nothing is selected and a single option is hovered, return that one - return [ this.options[this.cursor].val ]; - } else if (this.dropDownType === DropDownType.RADIAL) { - return this.options.map((option) => { + return [this.options[this.cursor].val]; + } + if (this.dropDownType === DropDownType.RADIAL) { + return this.options.map(option => { return { val: option.val, state: option.state }; }); - } else { - return this.options.filter(option => option.state === DropDownState.ON).map((option) => { + } + return this.options + .filter(option => option.state === DropDownState.ON) + .map(option => { return { val: option.val, dir: option.dir }; }); - } } /** @@ -566,9 +590,14 @@ export class DropDown extends Phaser.GameObjects.Container { * - the settings dictionary is like this { val: any, state: DropDownState, cursor: boolean, dir: SortDirection } */ private getSettings(): any[] { - const settings : any[] = []; + const settings: any[] = []; for (let i = 0; i < this.options.length; i++) { - settings.push({ val: this.options[i].val, state: this.options[i].state, cursor: (this.cursor === i), dir: this.options[i].dir }); + settings.push({ + val: this.options[i].val, + state: this.options[i].state, + cursor: this.cursor === i, + dir: this.options[i].dir, + }); } return settings; } @@ -581,22 +610,22 @@ export class DropDown extends Phaser.GameObjects.Container { const currentValues = this.getSettings(); const compareValues = (keys: string[]): boolean => { - return currentValues.length === this.defaultSettings.length && - currentValues.every((value, index) => - keys.every(key => value[key] === this.defaultSettings[index][key]) - ); + return ( + currentValues.length === this.defaultSettings.length && + currentValues.every((value, index) => keys.every(key => value[key] === this.defaultSettings[index][key])) + ); }; switch (this.dropDownType) { case DropDownType.MULTI: case DropDownType.RADIAL: - return compareValues([ "val", "state" ]); + return compareValues(["val", "state"]); case DropDownType.HYBRID: - return compareValues([ "val", "state", "cursor" ]); + return compareValues(["val", "state", "cursor"]); case DropDownType.SINGLE: - return compareValues([ "val", "state", "dir" ]); + return compareValues(["val", "state", "dir"]); default: return false; @@ -638,7 +667,7 @@ export class DropDown extends Phaser.GameObjects.Container { * Set all options to a specific state * @param state the DropDownState to assign to each option */ - private setAllOptions(state: DropDownState) : void { + private setAllOptions(state: DropDownState): void { // For single type dropdown, setting all options is not relevant if (this.dropDownType === DropDownType.SINGLE) { return; @@ -687,5 +716,4 @@ export class DropDown extends Phaser.GameObjects.Container { this.x = this.parentContainer.width - this.window.width; } } - } diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 3cd8a7e8dc9..cb6a474f01d 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -38,7 +38,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { private summaryFinished: boolean; private defaultText: string; - private scale: number = 0.1666666667; + private scale = 0.1666666667; constructor() { super(Mode.EGG_GACHA); @@ -68,18 +68,18 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(bg); const hatchFrameNames = globalScene.anims.generateFrameNames("gacha_hatch", { suffix: ".png", start: 1, end: 4 }); - if (!(globalScene.anims.exists("open"))) { + if (!globalScene.anims.exists("open")) { globalScene.anims.create({ key: "open", frames: hatchFrameNames, - frameRate: 12 + frameRate: 12, }); } - if (!(globalScene.anims.exists("close"))) { + if (!globalScene.anims.exists("close")) { globalScene.anims.create({ key: "close", frames: hatchFrameNames.reverse(), - frameRate: 12 + frameRate: 12, }); } @@ -108,7 +108,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { let pokemonIconX = -20; let pokemonIconY = 6; - if ([ "de", "es-ES", "fr", "ko", "pt-BR" ].includes(currentLanguage)) { + if (["de", "es-ES", "fr", "ko", "pt-BR"].includes(currentLanguage)) { gachaTextStyle = TextStyle.SMALLER_WINDOW_ALT; gachaX = 2; gachaY = 2; @@ -116,7 +116,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { let legendaryLabelX = gachaX; let legendaryLabelY = gachaY; - if ([ "de", "es-ES" ].includes(currentLanguage)) { + if (["de", "es-ES"].includes(currentLanguage)) { pokemonIconX = -25; pokemonIconY = 10; legendaryLabelX = -6; @@ -129,11 +129,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { switch (gachaType as GachaType) { case GachaType.LEGENDARY: - if ([ "de", "es-ES" ].includes(currentLanguage)) { + if (["de", "es-ES"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } - if ([ "pt-BR" ].includes(currentLanguage)) { + if (["pt-BR"].includes(currentLanguage)) { gachaUpLabel.setX(legendaryLabelX - 2); } else { gachaUpLabel.setX(legendaryLabelX); @@ -141,7 +141,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaUpLabel.setY(legendaryLabelY); const pokemonIcon = globalScene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); - if ([ "pt-BR" ].includes(currentLanguage)) { + if (["pt-BR"].includes(currentLanguage)) { pokemonIcon.setX(pokemonIconX - 2); } pokemonIcon.setScale(0.5); @@ -150,7 +150,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaInfoContainer.add(pokemonIcon); break; case GachaType.MOVE: - if ([ "de", "es-ES", "fr", "pt-BR" ].includes(currentLanguage)) { + if (["de", "es-ES", "fr", "pt-BR"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } @@ -160,7 +160,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaUpLabel.setOrigin(0.5, 0); break; case GachaType.SHINY: - if ([ "de", "fr", "ko" ].includes(currentLanguage)) { + if (["de", "fr", "ko"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } @@ -187,7 +187,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaGlass.setAlpha(0.5); gachaHatch.setAlpha(0.9); - gachaHatch.on("animationupdate", (_anim, frame) => gachaUnderlay.setFrame(frame.textureFrame === "4.png" ? "open_hatch" : "default")); + gachaHatch.on("animationupdate", (_anim, frame) => + gachaUnderlay.setFrame(frame.textureFrame === "4.png" ? "open_hatch" : "default"), + ); this.gachaContainers.push(gachaContainer); this.gachaKnobs.push(gachaKnob); @@ -201,10 +203,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOptionsContainer = globalScene.add.container(); - this.eggGachaOptionsContainer = globalScene.add.container((globalScene.game.canvas.width / 6), 148); + this.eggGachaOptionsContainer = globalScene.add.container(globalScene.game.canvas.width / 6, 148); this.eggGachaContainer.add(this.eggGachaOptionsContainer); - this.eggGachaOptionSelectBg = addWindow(0, 0, 96, 16 + 576 * this.scale); this.eggGachaOptionSelectBg.setOrigin(1, 1); this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); @@ -212,31 +213,48 @@ export default class EggGachaUiHandler extends MessageUiHandler { const multiplierOne = "x1"; const multiplierTen = "x10"; const pullOptions = [ - { multiplier: multiplierOne, description: `1 ${i18next.t("egg:pull")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, - { multiplier: multiplierTen, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, - { multiplier: multiplierOne, description: `5 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PLUS) }, - { multiplier: multiplierOne, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PREMIUM) }, - { multiplier: multiplierOne, description: `25 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.GOLDEN) } + { + multiplier: multiplierOne, + description: `1 ${i18next.t("egg:pull")}`, + icon: getVoucherTypeIcon(VoucherType.REGULAR), + }, + { + multiplier: multiplierTen, + description: `10 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.REGULAR), + }, + { + multiplier: multiplierOne, + description: `5 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.PLUS), + }, + { + multiplier: multiplierOne, + description: `10 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.PREMIUM), + }, + { + multiplier: multiplierOne, + description: `25 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.GOLDEN), + }, ]; const resolvedLanguage = i18next.resolvedLanguage ?? "en"; - const pullOptionsText = pullOptions.map(option =>{ - const desc = option.description.split(" "); - if (desc[0].length < 2) { - desc[0] += [ "zh", "ko" ].includes(resolvedLanguage.substring(0, 2)) ? " " : " "; - } - if (option.multiplier === multiplierOne) { - desc[0] = " " + desc[0]; - } - return ` ${option.multiplier.padEnd(5)}${desc.join(" ")}`; - }).join("\n"); + const pullOptionsText = pullOptions + .map(option => { + const desc = option.description.split(" "); + if (desc[0].length < 2) { + desc[0] += ["zh", "ko"].includes(resolvedLanguage.substring(0, 2)) ? " " : " "; + } + if (option.multiplier === multiplierOne) { + desc[0] = " " + desc[0]; + } + return ` ${option.multiplier.padEnd(5)}${desc.join(" ")}`; + }) + .join("\n"); - const optionText = addTextObject( - 0, - 0, - `${pullOptionsText}\n${i18next.t("menu:cancel")}`, - TextStyle.WINDOW, - ); + const optionText = addTextObject(0, 0, `${pullOptionsText}\n${i18next.t("menu:cancel")}`, TextStyle.WINDOW); optionText.setLineSpacing(28); optionText.setFontSize("80px"); @@ -255,7 +273,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaOptionsContainer); new Array(Utils.getEnumKeys(VoucherType).length).fill(null).map((_, i) => { - const container = globalScene.add.container((globalScene.game.canvas.width / 6) - 56 * i, 0); + const container = globalScene.add.container(globalScene.game.canvas.width / 6 - 56 * i, 0); const bg = addWindow(0, 0, 56, 22); bg.setOrigin(1, 0); @@ -295,7 +313,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaMessageBox = gachaMessageBox; - const gachaMessageText = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + const gachaMessageText = addTextObject(8, 8, "", TextStyle.WINDOW, { + maxLines: 2, + }); gachaMessageText.setOrigin(0, 0); gachaMessageBoxContainer.add(gachaMessageText); @@ -338,7 +358,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { return Utils.fixedInt(delay); } - pull(pullCount: number = 0, count: number = 0, eggs?: Egg[]): void { + pull(pullCount = 0, count = 0, eggs?: Egg[]): void { if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; } @@ -376,7 +396,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { targets: egg, duration: this.getDelayValue(350), scale: 0.75, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); globalScene.tweens.add({ targets: egg, @@ -396,12 +416,12 @@ export default class EggGachaUiHandler extends MessageUiHandler { } else { this.showSummary(eggs!); } - } + }, }); - } + }, }); }); - } + }, }); }); }); @@ -419,10 +439,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), angle: 0, - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); globalScene.time.delayedCall(this.getDelayValue(350), doPullAnim); - } + }, }); } else { doPullAnim(); @@ -438,7 +458,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { if (!eggs) { eggs = []; for (let i = 1; i <= pullCount; i++) { - const eggOptions: IEggOptions = { pulled: true, sourceType: this.gachaCursor }; + const eggOptions: IEggOptions = { + pulled: true, + sourceType: this.gachaCursor, + }; // Before creating the last egg, check if the guaranteed egg tier was already generated // if not, override the egg tier @@ -455,8 +478,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { // Shuffle the eggs in case the guaranteed one got added as last egg eggs = Utils.randSeedShuffle(eggs); - - (globalScene.currentBattle ? globalScene.gameData.saveAll(true, true, true) : globalScene.gameData.saveSystem()).then(success => { + (globalScene.currentBattle + ? globalScene.gameData.saveAll(true, true, true) + : globalScene.gameData.saveSystem() + ).then(success => { if (!success) { return globalScene.reset(true); } @@ -507,8 +532,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { const row = Math.floor(t / rowItems); const sliceWidth = this.eggGachaOverlay.displayWidth / (cols + 2); const sliceHeight = height / (rows + 2); - const yOffset = (sliceHeight / 2 * (row / Math.max(rows - 1, 1))) + sliceHeight / 4; - const ret = globalScene.add.container(sliceWidth * (col + 1) + (sliceWidth * 0.5), sliceHeight * (row + 1) + yOffset); + const yOffset = (sliceHeight / 2) * (row / Math.max(rows - 1, 1)) + sliceHeight / 4; + const ret = globalScene.add.container( + sliceWidth * (col + 1) + sliceWidth * 0.5, + sliceHeight * (row + 1) + yOffset, + ); ret.setScale(0.0001); const eggSprite = globalScene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); @@ -538,18 +566,18 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(false); this.summaryFinished = true; } - } - })); - + }, + }), + ); }); - } + }, }); } hideSummary() { this.setTransitioning(true); globalScene.tweens.add({ - targets: [ this.eggGachaOverlay, this.eggGachaSummaryContainer ], + targets: [this.eggGachaOverlay, this.eggGachaSummaryContainer], alpha: 0, duration: this.getDelayValue(250), ease: "Cubic.easeIn", @@ -560,7 +588,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(false); this.summaryFinished = false; this.eggGachaOptionsContainer.setVisible(true); - } + }, }); } @@ -576,7 +604,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } consumeVouchers(voucherType: VoucherType, count: number): void { - globalScene.gameData.voucherCounts[voucherType] = Math.max(globalScene.gameData.voucherCounts[voucherType] - count, 0); + globalScene.gameData.voucherCounts[voucherType] = Math.max( + globalScene.gameData.voucherCounts[voucherType] - count, + 0, + ); this.updateVoucherCounts(); } @@ -586,7 +617,14 @@ export default class EggGachaUiHandler extends MessageUiHandler { }); } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ): void { if (!text) { text = this.defaultText; } @@ -630,7 +668,6 @@ export default class EggGachaUiHandler extends MessageUiHandler { return false; } } else { - if (this.eggGachaSummaryContainer.visible) { if (this.summaryFinished && (button === Button.ACTION || button === Button.CANCEL)) { this.hideSummary(); @@ -641,7 +678,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { case Button.ACTION: switch (this.cursor) { case 0: - if (!globalScene.gameData.voucherCounts[VoucherType.REGULAR] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + if ( + !globalScene.gameData.voucherCounts[VoucherType.REGULAR] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (globalScene.gameData.eggs.length < 99 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { @@ -672,8 +712,14 @@ export default class EggGachaUiHandler extends MessageUiHandler { break; case 1: case 3: - if ((this.cursor === 1 && globalScene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) - || (this.cursor === 3 && !globalScene.gameData.voucherCounts[VoucherType.PREMIUM] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE)) { + if ( + (this.cursor === 1 && + globalScene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) || + (this.cursor === 3 && + !globalScene.gameData.voucherCounts[VoucherType.PREMIUM] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (globalScene.gameData.eggs.length < 90 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { @@ -694,7 +740,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 4: - if (!globalScene.gameData.voucherCounts[VoucherType.GOLDEN] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + if ( + !globalScene.gameData.voucherCounts[VoucherType.GOLDEN] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (globalScene.gameData.eggs.length < 75 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { @@ -780,7 +829,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { duration: this.eggGachaContainer.visible ? 500 : 0, x: (_target, _key, _value, index) => 180 * (index - cursor), ease: "Cubic.easeInOut", - onComplete: () => this.setTransitioning(false) + onComplete: () => this.setTransitioning(false), }); } diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 791c488c91a..6ede68b7ae6 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -24,11 +24,11 @@ export default class EggHatchSceneHandler extends UiHandler { globalScene.fieldUI.add(this.eggHatchContainer); const eggLightraysAnimFrames = globalScene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); - if (!(globalScene.anims.exists("egg_lightrays"))) { + if (!globalScene.anims.exists("egg_lightrays")) { globalScene.anims.create({ key: "egg_lightrays", frames: eggLightraysAnimFrames, - frameRate: 32 + frameRate: 32, }); } } diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 1b25d55d96d..cf3326bec13 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -24,7 +24,7 @@ export default class EggListUiHandler extends MessageUiHandler { private eggListMessageBoxContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image; - private scrollGridHandler : ScrollableGridUiHandler; + private scrollGridHandler: ScrollableGridUiHandler; private iconAnimHandler: PokemonIconAnimHandler; @@ -39,7 +39,13 @@ export default class EggListUiHandler extends MessageUiHandler { this.eggListContainer.setVisible(false); ui.add(this.eggListContainer); - const bgColor = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x006860); + const bgColor = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x006860, + ); bgColor.setOrigin(0, 0); this.eggListContainer.add(bgColor); @@ -86,7 +92,7 @@ export default class EggListUiHandler extends MessageUiHandler { this.scrollGridHandler = new ScrollableGridUiHandler(this, this.ROWS, this.COLUMNS) .withScrollBar(scrollBar) .withUpdateGridCallBack(() => this.updateEggIcons()) - .withUpdateSingleElementCallback((i:number) => this.setEggDetails(i)); + .withUpdateSingleElementCallback((i: number) => this.setEggDetails(i)); this.eggListMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); this.eggListMessageBoxContainer.setVisible(false); @@ -170,8 +176,8 @@ export default class EggListUiHandler extends MessageUiHandler { weekday: "short", year: "numeric", month: "2-digit", - day: "numeric" - }) + day: "numeric", + }), ); this.eggHatchWavesText.setText(egg.getEggHatchWavesMessage()); this.eggGachaInfoText.setText(egg.getEggTypeDescriptor()); diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts index 04b31ab9ca8..f335f83d8bf 100644 --- a/src/ui/egg-summary-ui-handler.ts +++ b/src/ui/egg-summary-ui-handler.ts @@ -39,7 +39,7 @@ export default class EggSummaryUiHandler extends MessageUiHandler { private eggHatchBg: Phaser.GameObjects.Image; private eggHatchData: EggHatchData[]; - private scrollGridHandler : ScrollableGridUiHandler; + private scrollGridHandler: ScrollableGridUiHandler; private cursorObj: Phaser.GameObjects.Image; /** used to add a delay before which it is not possible to exit the summary */ @@ -89,7 +89,13 @@ export default class EggSummaryUiHandler extends MessageUiHandler { this.infoContainer.setVisible(true); this.summaryContainer.add(this.infoContainer); - const scrollBar = new ScrollBar(iconContainerX + numCols * iconSize, iconContainerY + 3, 4, globalScene.game.canvas.height / 6 - 20, numRows); + const scrollBar = new ScrollBar( + iconContainerX + numCols * iconSize, + iconContainerY + 3, + 4, + globalScene.game.canvas.height / 6 - 20, + numRows, + ); this.summaryContainer.add(scrollBar); this.scrollGridHandler = new ScrollableGridUiHandler(this, numRows, numCols) @@ -146,17 +152,17 @@ export default class EggSummaryUiHandler extends MessageUiHandler { const speciesB = b.pokemon.species; if (getEggTierForSpecies(speciesA) < getEggTierForSpecies(speciesB)) { return -1; - } else if (getEggTierForSpecies(speciesA) > getEggTierForSpecies(speciesB)) { - return 1; - } else { - if (speciesA.speciesId < speciesB.speciesId) { - return -1; - } else if (speciesA.speciesId > speciesB.speciesId) { - return 1; - } else { - return 0; - } } + if (getEggTierForSpecies(speciesA) > getEggTierForSpecies(speciesB)) { + return 1; + } + if (speciesA.speciesId < speciesB.speciesId) { + return -1; + } + if (speciesA.speciesId > speciesB.speciesId) { + return 1; + } + return 0; }); } @@ -174,9 +180,9 @@ export default class EggSummaryUiHandler extends MessageUiHandler { // Prevent exiting the egg summary for 2 seconds if the egg hatching // was skipped automatically and for 1 second otherwise - const exitBlockingDuration = (globalScene.eggSkipPreference === 2) ? 2000 : 1000; + const exitBlockingDuration = globalScene.eggSkipPreference === 2 ? 2000 : 1000; this.blockExit = true; - globalScene.time.delayedCall(exitBlockingDuration, () => this.blockExit = false); + globalScene.time.delayedCall(exitBlockingDuration, () => (this.blockExit = false)); return true; } @@ -245,7 +251,10 @@ export default class EggSummaryUiHandler extends MessageUiHandler { changed = super.setCursor(cursor); if (changed) { - this.cursorObj.setPosition(iconContainerX - 1 + iconSize * (cursor % numCols), iconContainerY + 1 + iconSize * Math.floor(cursor / numCols)); + this.cursorObj.setPosition( + iconContainerX - 1 + iconSize * (cursor % numCols), + iconContainerY + 1 + iconSize * Math.floor(cursor / numCols), + ); if (lastCursor > -1) { this.iconAnimHandler.addOrUpdate(this.pokemonContainers[lastCursor].icon, PokemonIconAnimMode.NONE); @@ -257,5 +266,4 @@ export default class EggSummaryUiHandler extends MessageUiHandler { return changed; } - } diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index b35aa8f6cc0..91f3360a3d4 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -38,8 +38,8 @@ export default class EvolutionSceneHandler extends MessageUiHandler { const message = addTextObject(0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { - width: 1780 - } + width: 1780, + }, }); this.messageContainer.add(message); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 2b1eaa8221e..a4f02e13303 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -30,11 +30,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { private accuracyText: Phaser.GameObjects.Text; private cursorObj: Phaser.GameObjects.Image | null; private moveCategoryIcon: Phaser.GameObjects.Sprite; - private moveInfoOverlay : MoveInfoOverlay; + private moveInfoOverlay: MoveInfoOverlay; - protected fieldIndex: number = 0; + protected fieldIndex = 0; protected fromCommand: Command = Command.FIGHT; - protected cursor2: number = 0; + protected cursor2 = 0; constructor() { super(Mode.FIGHT); @@ -51,7 +51,12 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.moveInfoContainer.setName("move-info"); ui.add(this.moveInfoContainer); - this.typeIcon = globalScene.add.sprite(globalScene.scaledCanvas.width - 57, -36, Utils.getLocalizedSpriteKey("types"), "unknown"); + this.typeIcon = globalScene.add.sprite( + globalScene.scaledCanvas.width - 57, + -36, + Utils.getLocalizedSpriteKey("types"), + "unknown", + ); this.typeIcon.setVisible(false); this.moveInfoContainer.add(this.typeIcon); @@ -101,9 +106,9 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { right: true, x: 0, y: -MoveInfoOverlay.getHeight(overlayScale, true), - width: (globalScene.game.canvas.width / 6) + 4, + width: globalScene.game.canvas.width / 6 + 4, hideEffectBox: true, - hideBg: true + hideBg: true, }); ui.add(this.moveInfoOverlay); // register the overlay to receive toggle events @@ -114,8 +119,8 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { show(args: any[]): boolean { super.show(args); - this.fieldIndex = args.length ? args[0] as number : 0; - this.fromCommand = args.length > 1 ? args[1] as Command : Command.FIGHT; + this.fieldIndex = args.length ? (args[0] as number) : 0; + this.fromCommand = args.length > 1 ? (args[1] as Command) : Command.FIGHT; const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(false); @@ -193,10 +198,10 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.cursorObj?.setVisible(false); } globalScene.tweens.add({ - targets: [ this.movesContainer, this.cursorObj ], + targets: [this.movesContainer, this.cursorObj], duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 0 : 1 + alpha: visible ? 0 : 1, }); if (!visible) { this.movesContainer.setVisible(true); @@ -273,7 +278,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.ppText.setShadowColor(this.getTextColor(ppColorStyle, true)); this.moveInfoOverlay.show(pokemonMove.getMove()); - pokemon.getOpponents().forEach((opponent) => { + pokemon.getOpponents().forEach(opponent => { opponent.updateEffectiveness(this.getEffectivenessText(pokemon, opponent, pokemonMove)); }); } @@ -297,7 +302,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { * Returns undefined if it's a status move */ private getEffectivenessText(pokemon: Pokemon, opponent: Pokemon, pokemonMove: PokemonMove): string | undefined { - const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData?.abilityRevealed); + const effectiveness = opponent.getMoveEffectiveness( + pokemon, + pokemonMove.getMove(), + !opponent.battleData?.abilityRevealed, + ); if (effectiveness === undefined) { return undefined; } @@ -340,9 +349,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } const moveColors = opponents - .map((opponent) => opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed)) + .map(opponent => + opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed), + ) .sort((a, b) => b - a) - .map((effectiveness) => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); + .map(effectiveness => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); return moveColors[0]; } @@ -369,7 +380,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.movesContainer.removeAll(true); const opponents = (globalScene.getCurrentPhase() as CommandPhase).getPokemon().getOpponents(); - opponents.forEach((opponent) => { + opponents.forEach(opponent => { opponent.updateEffectiveness(undefined); }); } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 8ef910f954a..2aade130ed1 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -13,24 +13,32 @@ export enum DropDownColumn { CAUGHT, UNLOCKS, MISC, - SORT + SORT, } export class FilterBar extends Phaser.GameObjects.Container { private window: Phaser.GameObjects.NineSlice; - private labels: Phaser.GameObjects.Text[] = []; + private labels: Phaser.GameObjects.Text[] = []; private dropDowns: DropDown[] = []; private columns: DropDownColumn[] = []; public cursorObj: Phaser.GameObjects.Image; - public numFilters: number = 0; - public openDropDown: boolean = false; - private lastCursor: number = -1; + public numFilters = 0; + public openDropDown = false; + private lastCursor = -1; private uiTheme: UiTheme; private leftPaddingX: number; private rightPaddingX: number; private cursorOffset: number; - constructor(x: number, y: number, width: number, height: number, leftPaddingX: number = 6, rightPaddingX: number = 6, cursorOffset: number = 8) { + constructor( + x: number, + y: number, + width: number, + height: number, + leftPaddingX = 6, + rightPaddingX = 6, + cursorOffset = 8, + ) { super(globalScene, x, y); this.width = width; @@ -82,7 +90,7 @@ export class FilterBar extends Phaser.GameObjects.Container { * @param col the DropDownColumn used to register the filter to retrieve * @returns the associated DropDown if it exists, undefined otherwise */ - getFilter(col: DropDownColumn) : DropDown { + getFilter(col: DropDownColumn): DropDown { return this.dropDowns[this.columns.indexOf(col)]; } @@ -112,7 +120,6 @@ export class FilterBar extends Phaser.GameObjects.Container { * Position the filter dropdowns evenly across the width of the container */ private calcFilterPositions(): void { - let totalWidth = this.leftPaddingX + this.rightPaddingX + this.cursorOffset; this.labels.forEach(label => { totalWidth += label.displayWidth + this.cursorOffset; @@ -138,7 +145,7 @@ export class FilterBar extends Phaser.GameObjects.Container { for (let i = 0; i < this.dropDowns.length; i++) { if (this.dropDowns[i].dropDownType === DropDownType.HYBRID) { this.dropDowns[i].autoSize(); - this.dropDowns[i].x = - this.dropDowns[i].getWidth(); + this.dropDowns[i].x = -this.dropDowns[i].getWidth(); this.dropDowns[i].y = 0; } } @@ -171,19 +178,19 @@ export class FilterBar extends Phaser.GameObjects.Container { } incDropDownCursor(): boolean { - if (this.dropDowns[this.lastCursor].cursor === this.dropDowns[this.lastCursor].options.length - 1) {// if at the bottom of the list, wrap around + if (this.dropDowns[this.lastCursor].cursor === this.dropDowns[this.lastCursor].options.length - 1) { + // if at the bottom of the list, wrap around return this.dropDowns[this.lastCursor].setCursor(0); - } else { - return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor + 1); } + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor + 1); } decDropDownCursor(): boolean { - if (this.dropDowns[this.lastCursor].cursor === 0) {// if at the top of the list, wrap around + if (this.dropDowns[this.lastCursor].cursor === 0) { + // if at the top of the list, wrap around return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].options.length - 1); - } else { - return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor - 1); } + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor - 1); } toggleOptionState(): void { @@ -211,7 +218,6 @@ export class FilterBar extends Phaser.GameObjects.Container { * @returns the index of the closest filter */ getNearestFilter(container: StarterContainer): number { - const midx = container.x + container.icon.displayWidth / 2; let nearest = 0; let nearestDist = 1000; @@ -225,5 +231,4 @@ export class FilterBar extends Phaser.GameObjects.Container { return nearest; } - } diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index f69cf113f05..a6b01ba39e6 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -8,7 +8,7 @@ import type UI from "./ui"; import { Mode } from "./ui"; import { globalScene } from "#app/global-scene"; -export enum FilterTextRow{ +export enum FilterTextRow { NAME, MOVE_1, MOVE_2, @@ -18,13 +18,13 @@ export enum FilterTextRow{ export class FilterText extends Phaser.GameObjects.Container { private window: Phaser.GameObjects.NineSlice; - private labels: Phaser.GameObjects.Text[] = []; - private selections: Phaser.GameObjects.Text[] = []; + private labels: Phaser.GameObjects.Text[] = []; + private selections: Phaser.GameObjects.Text[] = []; private selectionStrings: string[] = []; private rows: FilterTextRow[] = []; public cursorObj: Phaser.GameObjects.Image; - public numFilters: number = 0; - private lastCursor: number = -1; + public numFilters = 0; + private lastCursor = -1; private uiTheme: UiTheme; private menuMessageBoxContainer: Phaser.GameObjects.Container; @@ -35,9 +35,9 @@ export class FilterText extends Phaser.GameObjects.Container { private onChange: () => void; - public defaultText: string = "---"; + public defaultText = "---"; - constructor(x: number, y: number, width: number, height: number, onChange: () => void,) { + constructor(x: number, y: number, width: number, height: number, onChange: () => void) { super(globalScene, x, y); this.onChange = onChange; @@ -59,7 +59,17 @@ export class FilterText extends Phaser.GameObjects.Container { this.menuMessageBoxContainer.setVisible(false); // Full-width window used for testing dialog messages in debug mode - this.dialogueMessageBox = addWindow(-this.textPadding, 0, globalScene.game.canvas.width / 6 + this.textPadding * 2, 49, false, false, 0, 0, WindowVariant.THIN); + this.dialogueMessageBox = addWindow( + -this.textPadding, + 0, + globalScene.game.canvas.width / 6 + this.textPadding * 2, + 49, + false, + false, + 0, + 0, + WindowVariant.THIN, + ); this.dialogueMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(this.dialogueMessageBox); @@ -69,7 +79,6 @@ export class FilterText extends Phaser.GameObjects.Container { this.menuMessageBoxContainer.add(menuMessageText); this.message = menuMessageText; - } /** @@ -80,7 +89,6 @@ export class FilterText extends Phaser.GameObjects.Container { * @returns true if successful, false if the provided column was already in use for another filter */ addFilter(row: FilterTextRow, title: string): boolean { - const paddingX = 6; const cursorOffset = 8; const extraSpaceX = 40; @@ -95,7 +103,12 @@ export class FilterText extends Phaser.GameObjects.Container { this.labels.push(filterTypesLabel); this.add(filterTypesLabel); - const filterTypesSelection = addTextObject(paddingX + cursorOffset + extraSpaceX, 3, this.defaultText, TextStyle.TOOLTIP_CONTENT); + const filterTypesSelection = addTextObject( + paddingX + cursorOffset + extraSpaceX, + 3, + this.defaultText, + TextStyle.TOOLTIP_CONTENT, + ); this.selections.push(filterTypesSelection); this.add(filterTypesSelection); @@ -120,7 +133,6 @@ export class FilterText extends Phaser.GameObjects.Container { } startSearch(index: number, ui: UI): void { - ui.playSelect(); const prefilledText = ""; const buttonAction: any = {}; @@ -133,19 +145,18 @@ export class FilterText extends Phaser.GameObjects.Container { const handler = ui.getHandler() as AwaitableUiHandler; handler.tutorialActive = true; // Switch to the dialog test window - this.selections[index].setText( dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); + this.selections[index].setText(dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); ui.revertMode(); this.onChange(); }, () => { ui.revertMode(); this.onChange; - } + }, ]; ui.setOverlayMode(Mode.POKEDEX_SCAN, buttonAction, prefilledText, index); } - setCursor(cursor: number): void { const cursorOffset = 8; @@ -199,7 +210,6 @@ export class FilterText extends Phaser.GameObjects.Container { * @returns the index of the closest filter */ getNearestFilter(container: StarterContainer): number { - const midy = container.y + container.icon.displayHeight / 2; let nearest = 0; let nearestDist = 1000; @@ -213,6 +223,4 @@ export class FilterText extends Phaser.GameObjects.Container { return nearest; } - - } diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 86a1cc2238b..8784145acd6 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -38,7 +38,13 @@ export abstract class FormModalUiHandler extends ModalUiHandler { abstract getInputFieldConfigs(): InputFieldConfig[]; getHeight(config?: ModalConfig): number { - return 20 * this.getInputFieldConfigs().length + (this.getModalTitle() ? 26 : 0) + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + this.getButtonTopMargin() + 28; + return ( + 20 * this.getInputFieldConfigs().length + + (this.getModalTitle() ? 26 : 0) + + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + + this.getButtonTopMargin() + + 28 + ); } getReadableErrorMessage(error: string): string { @@ -60,7 +66,12 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.updateFields(config, hasTitle); } - this.errorMessage = addTextObject(10, (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT); + this.errorMessage = addTextObject( + 10, + (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), + "", + TextStyle.TOOLTIP_CONTENT, + ); this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); this.errorMessage.setVisible(false); @@ -85,7 +96,11 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const isPassword = config?.isPassword; const isReadOnly = config?.isReadOnly; - const input = addTextInputObject(4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20, readOnly: isReadOnly }); + const input = addTextInputObject(4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { + type: isPassword ? "password" : "text", + maxLength: isPassword ? 64 : 20, + readOnly: isReadOnly, + }); input.setOrigin(0, 0); inputContainer.add(inputBg); @@ -104,9 +119,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const config = args[0] as FormModalConfig; - this.submitAction = config.buttonActions.length - ? config.buttonActions[0] - : null; + this.submitAction = config.buttonActions.length ? config.buttonActions[0] : null; if (this.buttonBgs.length) { this.buttonBgs[0].off("pointerdown"); @@ -125,7 +138,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); return true; @@ -171,7 +184,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { } export interface InputFieldConfig { - label: string, - isPassword?: boolean, - isReadOnly?: boolean + label: string; + isPassword?: boolean; + isReadOnly?: boolean; } diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 09fd178e101..7d3decf0c4c 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -19,13 +19,13 @@ interface DisplayStat { } interface DisplayStats { - [key: string]: DisplayStat | string + [key: string]: DisplayStat | string; } const displayStats: DisplayStats = { playTime: { label_key: "playTime", - sourceFunc: gameData => Utils.getPlayTimeString(gameData.gameStats.playTime) + sourceFunc: gameData => Utils.getPlayTimeString(gameData.gameStats.playTime), }, battles: { label_key: "totalBattles", @@ -36,34 +36,34 @@ const displayStats: DisplayStats = { sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!d.caughtAttr); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; - } + }, }, shinyStartersUnlocked: { label_key: "shinyStarters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!(d.caughtAttr & DexAttr.SHINY)); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; - } + }, }, dexSeen: { label_key: "speciesSeen", sourceFunc: gameData => { const seenCount = gameData.getSpeciesCount(d => !!d.seenAttr); return `${seenCount} (${Math.floor((seenCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; - } + }, }, dexCaught: { label_key: "speciesCaught", sourceFunc: gameData => { const caughtCount = gameData.getSpeciesCount(d => !!d.caughtAttr); return `${caughtCount} (${Math.floor((caughtCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; - } + }, }, ribbonsOwned: { label_key: "ribbonsOwned", sourceFunc: gameData => gameData.gameStats.ribbonsOwned.toString(), }, - classicSessionsPlayed:{ + classicSessionsPlayed: { label_key: "classicRuns", sourceFunc: gameData => gameData.gameStats.classicSessionsPlayed.toString(), }, @@ -82,12 +82,12 @@ const displayStats: DisplayStats = { endlessSessionsPlayed: { label_key: "endlessRuns", sourceFunc: gameData => gameData.gameStats.endlessSessionsPlayed.toString(), - hidden: true + hidden: true, }, highestEndlessWave: { label_key: "highestWaveEndless", sourceFunc: gameData => gameData.gameStats.highestEndlessWave.toString(), - hidden: true + hidden: true, }, highestMoney: { label_key: "highestMoney", @@ -120,67 +120,67 @@ const displayStats: DisplayStats = { subLegendaryPokemonSeen: { label_key: "subLegendsSeen", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonSeen.toString(), - hidden: true + hidden: true, }, subLegendaryPokemonCaught: { label_key: "subLegendsCaught", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonCaught.toString(), - hidden: true + hidden: true, }, subLegendaryPokemonHatched: { label_key: "subLegendsHatched", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonHatched.toString(), - hidden: true + hidden: true, }, legendaryPokemonSeen: { label_key: "legendsSeen", sourceFunc: gameData => gameData.gameStats.legendaryPokemonSeen.toString(), - hidden: true + hidden: true, }, legendaryPokemonCaught: { label_key: "legendsCaught", sourceFunc: gameData => gameData.gameStats.legendaryPokemonCaught.toString(), - hidden: true + hidden: true, }, legendaryPokemonHatched: { label_key: "legendsHatched", sourceFunc: gameData => gameData.gameStats.legendaryPokemonHatched.toString(), - hidden: true + hidden: true, }, mythicalPokemonSeen: { label_key: "mythicalsSeen", sourceFunc: gameData => gameData.gameStats.mythicalPokemonSeen.toString(), - hidden: true + hidden: true, }, mythicalPokemonCaught: { label_key: "mythicalsCaught", sourceFunc: gameData => gameData.gameStats.mythicalPokemonCaught.toString(), - hidden: true + hidden: true, }, mythicalPokemonHatched: { label_key: "mythicalsHatched", sourceFunc: gameData => gameData.gameStats.mythicalPokemonHatched.toString(), - hidden: true + hidden: true, }, shinyPokemonSeen: { label_key: "shiniesSeen", sourceFunc: gameData => gameData.gameStats.shinyPokemonSeen.toString(), - hidden: true + hidden: true, }, shinyPokemonCaught: { label_key: "shiniesCaught", sourceFunc: gameData => gameData.gameStats.shinyPokemonCaught.toString(), - hidden: true + hidden: true, }, shinyPokemonHatched: { label_key: "shiniesHatched", sourceFunc: gameData => gameData.gameStats.shinyPokemonHatched.toString(), - hidden: true + hidden: true, }, pokemonFused: { label_key: "pokemonFused", sourceFunc: gameData => gameData.gameStats.pokemonFused.toString(), - hidden: true + hidden: true, }, trainersDefeated: { label_key: "trainersDefeated", @@ -189,27 +189,27 @@ const displayStats: DisplayStats = { eggsPulled: { label_key: "eggsPulled", sourceFunc: gameData => gameData.gameStats.eggsPulled.toString(), - hidden: true + hidden: true, }, rareEggsPulled: { label_key: "rareEggsPulled", sourceFunc: gameData => gameData.gameStats.rareEggsPulled.toString(), - hidden: true + hidden: true, }, epicEggsPulled: { label_key: "epicEggsPulled", sourceFunc: gameData => gameData.gameStats.epicEggsPulled.toString(), - hidden: true + hidden: true, }, legendaryEggsPulled: { label_key: "legendaryEggsPulled", sourceFunc: gameData => gameData.gameStats.legendaryEggsPulled.toString(), - hidden: true + hidden: true, }, manaphyEggsPulled: { label_key: "manaphyEggsPulled", sourceFunc: gameData => gameData.gameStats.manaphyEggsPulled.toString(), - hidden: true + hidden: true, }, }; @@ -235,35 +235,50 @@ export default class GameStatsUiHandler extends UiHandler { this.gameStatsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); - this.gameStatsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.gameStatsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - const headerBg = addWindow(0, 0, (globalScene.game.canvas.width / 6) - 2, 24); + const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); const headerText = addTextObject(0, 0, i18next.t("gameStatsUiHandler:stats"), TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); - const statsBgWidth = ((globalScene.game.canvas.width / 6) - 2) / 2; - const [ statsBgLeft, statsBgRight ] = new Array(2).fill(null).map((_, i) => { + const statsBgWidth = (globalScene.game.canvas.width / 6 - 2) / 2; + const [statsBgLeft, statsBgRight] = new Array(2).fill(null).map((_, i) => { const width = statsBgWidth + 2; - const height = Math.floor((globalScene.game.canvas.height / 6) - headerBg.height - 2); - const statsBg = addWindow((statsBgWidth - 2) * i, headerBg.height, width, height, false, false, i > 0 ? -3 : 0, 1); + const height = Math.floor(globalScene.game.canvas.height / 6 - headerBg.height - 2); + const statsBg = addWindow( + (statsBgWidth - 2) * i, + headerBg.height, + width, + height, + false, + false, + i > 0 ? -3 : 0, + 1, + ); statsBg.setOrigin(0, 0); return statsBg; }); this.statsContainer = globalScene.add.container(0, 0); - new Array(18).fill(null).map((_, s) => { - - const statLabel = addTextObject(8 + (s % 2 === 1 ? statsBgWidth : 0), 28 + Math.floor(s / 2) * 16, "", TextStyle.STATS_LABEL); + const statLabel = addTextObject( + 8 + (s % 2 === 1 ? statsBgWidth : 0), + 28 + Math.floor(s / 2) * 16, + "", + TextStyle.STATS_LABEL, + ); statLabel.setOrigin(0, 0); this.statsContainer.add(statLabel); this.statLabels.push(statLabel); - const statValue = addTextObject((statsBgWidth * ((s % 2) + 1)) - 8, statLabel.y, "", TextStyle.STATS_VALUE); + const statValue = addTextObject(statsBgWidth * ((s % 2) + 1) - 8, statLabel.y, "", TextStyle.STATS_VALUE); statValue.setOrigin(1, 0); this.statsContainer.add(statValue); this.statValues.push(statValue); @@ -277,7 +292,11 @@ export default class GameStatsUiHandler extends UiHandler { // arrows to show that we can scroll through the stats const isLegacyTheme = globalScene.uiTheme === UiTheme.LEGACY; - this.arrowDown = globalScene.add.sprite(statsBgWidth, globalScene.game.canvas.height / 6 - (isLegacyTheme ? 9 : 5), "prompt"); + this.arrowDown = globalScene.add.sprite( + statsBgWidth, + globalScene.game.canvas.height / 6 - (isLegacyTheme ? 9 : 5), + "prompt", + ); this.gameStatsContainer.add(this.arrowDown); this.arrowUp = globalScene.add.sprite(statsBgWidth, headerBg.height + (isLegacyTheme ? 7 : 3), "prompt"); this.arrowUp.flipY = true; @@ -320,7 +339,11 @@ export default class GameStatsUiHandler extends UiHandler { statKeys.forEach((key, s) => { const stat = displayStats[key] as DisplayStat; const value = stat.sourceFunc!(globalScene.gameData); // TODO: is this bang correct? - this.statLabels[s].setText(!stat.hidden || isNaN(parseInt(value)) || parseInt(value) ? i18next.t(`gameStatsUiHandler:${stat.label_key}`) : "???"); + this.statLabels[s].setText( + !stat.hidden || Number.isNaN(Number.parseInt(value)) || Number.parseInt(value) + ? i18next.t(`gameStatsUiHandler:${stat.label_key}`) + : "???", + ); this.statValues[s].setText(value); }); if (statKeys.length < 18) { @@ -403,16 +426,18 @@ export function initStatsKeys() { displayStats[key] = { label_key: label, sourceFunc: gameData => gameData.gameStats[key].toString(), - hidden: hidden + hidden: hidden, }; } else if (displayStats[key] === null) { displayStats[key] = { - sourceFunc: gameData => gameData.gameStats[key].toString() + sourceFunc: gameData => gameData.gameStats[key].toString(), }; } if (!(displayStats[key] as DisplayStat).label_key) { const splittableKey = key.replace(/([a-z]{2,})([A-Z]{1}(?:[^A-Z]|$))/g, "$1_$2"); - (displayStats[key] as DisplayStat).label_key = Utils.toReadableString(`${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`); + (displayStats[key] as DisplayStat).label_key = Utils.toReadableString( + `${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`, + ); } } } diff --git a/src/ui/hatched-pokemon-container.ts b/src/ui/hatched-pokemon-container.ts index f006002617a..0b283c2e063 100644 --- a/src/ui/hatched-pokemon-container.ts +++ b/src/ui/hatched-pokemon-container.ts @@ -91,8 +91,8 @@ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { const caughtAttr = dexEntry.caughtAttr; const newShiny = BigInt(1 << (displayPokemon.shiny ? 1 : 0)); const newVariant = BigInt(1 << (displayPokemon.variant + 4)); - const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); - const newForm = (BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM & caughtAttr) === BigInt(0); + const newShinyOrVariant = (newShiny & caughtAttr) === BigInt(0) || (newVariant & caughtAttr) === BigInt(0); + const newForm = ((BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM) & caughtAttr) === BigInt(0); const female = displayPokemon.gender === Gender.FEMALE; const formIndex = displayPokemon.formIndex; diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index 7ee0949c71e..9626276245d 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -21,11 +21,11 @@ export default class LoadingModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 55909b63e58..1087ffa3fd1 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -46,12 +46,12 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.usernameInfoImage = this.buildInteractableImage("settings_icon", "username-info-icon", { x: 20, - scale: 0.5 + scale: 0.5, }); this.saveDownloadImage = this.buildInteractableImage("saving_icon", "save-download-icon", { x: 0, - scale: 0.75 + scale: 0.75, }); this.infoContainer.add(this.usernameInfoImage); @@ -63,7 +63,10 @@ export default 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), Phaser.Geom.Rectangle.Contains); + this.externalPartyContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 12, globalScene.game.canvas.height / 12), + Phaser.Geom.Rectangle.Contains, + ); this.externalPartyTitle = addTextObject(0, 4, "", TextStyle.SETTINGS_LABEL); this.externalPartyTitle.setOrigin(0.5, 0); this.externalPartyBg = addWindow(0, 0, 0, 0); @@ -94,11 +97,11 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } override getMargin(_config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } override getButtonLabels(_config?: ModalConfig): string[] { - return [ i18next.t("menu:login"), i18next.t("menu:register") ]; + return [i18next.t("menu:login"), i18next.t("menu:register")]; } override getReadableErrorMessage(error: string): string { @@ -127,21 +130,23 @@ export default class LoginFormUiHandler extends FormModalUiHandler { override getInputFieldConfigs(): InputFieldConfig[] { const inputFieldConfigs: InputFieldConfig[] = []; inputFieldConfigs.push({ label: i18next.t("menu:username") }); - inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); return inputFieldConfigs; } override show(args: any[]): boolean { if (super.show(args)) { - const config = args[0] as ModalConfig; this.processExternalProvider(config); const originalLoginAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { // Prevent overlapping overrides on action modification this.submitAction = originalLoginAction; this.sanitizeInputs(); - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); const onFail = error => { globalScene.ui.setMode(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); globalScene.ui.playError(); @@ -150,11 +155,11 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return onFail(i18next.t("menu:emptyUsername")); } - const [ usernameInput, passwordInput ] = this.inputs; + const [usernameInput, passwordInput] = this.inputs; pokerogueApi.account.login({ username: usernameInput.text, password: passwordInput.text }).then(error => { - if (!error) { - originalLoginAction && originalLoginAction(); + if (!error && originalLoginAction) { + originalLoginAction(); } else { onFail(error); } @@ -173,7 +178,9 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.infoContainer.setVisible(false); this.setMouseCursorStyle("default"); //reset cursor - [ this.discordImage, this.googleImage, this.usernameInfoImage, this.saveDownloadImage ].forEach((img) => img.off("pointerdown")); + [this.discordImage, this.googleImage, this.usernameInfoImage, this.saveDownloadImage].forEach(img => + img.off("pointerdown"), + ); } private processExternalProvider(config: ModalConfig): void { @@ -208,7 +215,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { }); const onFail = error => { - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); globalScene.ui.setModeForceTransition(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); globalScene.ui.playError(); }; @@ -226,20 +233,22 @@ export default class LoginFormUiHandler extends FormModalUiHandler { globalScene.ui.revertMode(); this.infoContainer.disableInteractive(); return true; - } + }, }); } globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options, - delay: 1000 + delay: 1000, }); - this.infoContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width, globalScene.game.canvas.height), Phaser.Geom.Rectangle.Contains); + this.infoContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width, globalScene.game.canvas.height), + Phaser.Geom.Rectangle.Contains, + ); } else { if (dataKeys.length > 2) { return onFail(this.ERR_TOO_MANY_SAVES); - } else { - return onFail(this.ERR_NO_SAVES); } + return onFail(this.ERR_NO_SAVES); } }); @@ -277,7 +286,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); this.infoContainer.setAlpha(0); @@ -286,17 +295,12 @@ export default class LoginFormUiHandler extends FormModalUiHandler { duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); } private buildInteractableImage(texture: string, name: string, opts: BuildInteractableImageOpts = {}) { - const { - scale = 0.07, - x = 0, - y = 0, - origin = { x: 0, y: 0 } - } = opts; + const { scale = 0.07, x = 0, y = 0, origin = { x: 0, y: 0 } } = opts; const img = globalScene.add.image(x, y, texture); img.setName(name); img.setOrigin(origin.x, origin.y); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 3965eb38cc4..b83ae24c9e0 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -60,7 +60,7 @@ export default class MenuUiHandler extends MessageUiHandler { private menuMessageBox: Phaser.GameObjects.NineSlice; private dialogueMessageBox: Phaser.GameObjects.NineSlice; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; public bgmBar: BgmBar; @@ -68,12 +68,15 @@ export default class MenuUiHandler extends MessageUiHandler { super(mode); this.excludedMenus = () => [ - { condition: [ Mode.COMMAND, Mode.TITLE ].includes(mode ?? Mode.TITLE), options: [ MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST ]}, - { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ]} + { + condition: [Mode.COMMAND, Mode.TITLE].includes(mode ?? Mode.TITLE), + options: [MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST], + }, + { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }, ]; this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); @@ -83,7 +86,7 @@ export default class MenuUiHandler extends MessageUiHandler { const ui = this.getUi(); // wiki url directs based on languges available on wiki const lang = i18next.resolvedLanguage?.substring(0, 2)!; // TODO: is this bang correct? - if ([ "de", "fr", "ko", "zh" ].includes(lang)) { + if (["de", "fr", "ko", "zh"].includes(lang)) { wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; } @@ -94,9 +97,20 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.menuContainer.setName("menu"); - this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.menuContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.menuOverlay = new Phaser.GameObjects.Rectangle(globalScene, -1, -1, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0xffffff, 0.3); + this.menuOverlay = new Phaser.GameObjects.Rectangle( + globalScene, + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0xffffff, + 0.3, + ); this.menuOverlay.setName("menu-overlay"); this.menuOverlay.setOrigin(0, 0); this.menuContainer.add(this.menuOverlay); @@ -104,32 +118,39 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuContainer.add(this.bgmBar); this.menuContainer.setVisible(false); - } - render() { const ui = this.getUi(); this.excludedMenus = () => [ - { condition: globalScene.getCurrentPhase() instanceof SelectModifierPhase, options: [ MenuOptions.EGG_GACHA ]}, - { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ]} + { + condition: globalScene.getCurrentPhase() instanceof SelectModifierPhase, + options: [MenuOptions.EGG_GACHA], + }, + { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }, ]; this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); - this.optionSelectText = addTextObject(0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); + this.optionSelectText = addTextObject( + 0, + 0, + this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), + TextStyle.WINDOW, + { maxLines: this.menuOptions.length }, + ); this.optionSelectText.setLineSpacing(12); this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.menuBg = addWindow( - (globalScene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), + globalScene.game.canvas.width / 6 - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, - (globalScene.game.canvas.height / 6) - 2 + globalScene.game.canvas.height / 6 - 2, ); this.menuBg.setOrigin(0, 0); @@ -151,7 +172,17 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBoxContainer.add(this.menuMessageBox); // Full-width window used for testing dialog messages in debug mode - this.dialogueMessageBox = addWindow(-this.textPadding, 0, globalScene.game.canvas.width / 6 + this.textPadding * 2, 49, false, false, 0, 0, WindowVariant.THIN); + this.dialogueMessageBox = addWindow( + -this.textPadding, + 0, + globalScene.game.canvas.width / 6 + this.textPadding * 2, + 49, + false, + false, + 0, + 0, + WindowVariant.THIN, + ); this.dialogueMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(this.dialogueMessageBox); @@ -176,25 +207,32 @@ export default class MenuUiHandler extends MessageUiHandler { ui.revertMode(); ui.showText(message, null, () => { const config: OptionSelectConfig = { - options: new Array(5).fill(null).map((_, i) => i).filter(slotFilter).map(i => { - return { - label: i18next.t("menuUiHandler:slot", { slotNumber: i + 1 }), - handler: () => { - callback(i); - ui.revertMode(); - ui.showText("", 0); - return true; - } - }; - }).concat([{ - label: i18next.t("menuUiHandler:cancel"), - handler: () => { - ui.revertMode(); - ui.showText("", 0); - return true; - } - }]), - xOffset: 98 + options: new Array(5) + .fill(null) + .map((_, i) => i) + .filter(slotFilter) + .map(i => { + return { + label: i18next.t("menuUiHandler:slot", { slotNumber: i + 1 }), + handler: () => { + callback(i); + ui.revertMode(); + ui.showText("", 0); + return true; + }, + }; + }) + .concat([ + { + label: i18next.t("menuUiHandler:cancel"), + handler: () => { + ui.revertMode(); + ui.showText("", 0); + return true; + }, + }, + ]), + xOffset: 98, }; ui.setOverlayMode(Mode.MENU_OPTION_SELECT, config); }); @@ -204,10 +242,14 @@ export default class MenuUiHandler extends MessageUiHandler { manageDataOptions.push({ label: i18next.t("menuUiHandler:importSession"), handler: () => { - confirmSlot(i18next.t("menuUiHandler:importSlotSelect"), () => true, slotId => globalScene.gameData.importData(GameDataType.SESSION, slotId)); + confirmSlot( + i18next.t("menuUiHandler:importSlotSelect"), + () => true, + slotId => globalScene.gameData.importData(GameDataType.SESSION, slotId), + ); return true; }, - keepOpen: true + keepOpen: true, }); } manageDataOptions.push({ @@ -222,14 +264,17 @@ export default class MenuUiHandler extends MessageUiHandler { dataSlots.push(slotId); } }); - })).then(() => { - confirmSlot(i18next.t("menuUiHandler:exportSlotSelect"), + }), + ).then(() => { + confirmSlot( + i18next.t("menuUiHandler:exportSlotSelect"), i => dataSlots.indexOf(i) > -1, - slotId => globalScene.gameData.tryExportData(GameDataType.SESSION, slotId)); + slotId => globalScene.gameData.tryExportData(GameDataType.SESSION, slotId), + ); }); return true; }, - keepOpen: true + keepOpen: true, }); manageDataOptions.push({ label: i18next.t("menuUiHandler:importRunHistory"), @@ -237,7 +282,7 @@ export default class MenuUiHandler extends MessageUiHandler { globalScene.gameData.importData(GameDataType.RUN_HISTORY); return true; }, - keepOpen: true + keepOpen: true, }); manageDataOptions.push({ label: i18next.t("menuUiHandler:exportRunHistory"), @@ -245,7 +290,7 @@ export default class MenuUiHandler extends MessageUiHandler { globalScene.gameData.tryExportData(GameDataType.RUN_HISTORY); return true; }, - keepOpen: true + keepOpen: true, }); if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ @@ -255,33 +300,36 @@ export default class MenuUiHandler extends MessageUiHandler { globalScene.gameData.importData(GameDataType.SYSTEM); return true; }, - keepOpen: true + keepOpen: true, }); } - manageDataOptions.push({ - label: i18next.t("menuUiHandler:exportData"), - handler: () => { - globalScene.gameData.tryExportData(GameDataType.SYSTEM); - return true; + manageDataOptions.push( + { + label: i18next.t("menuUiHandler:exportData"), + handler: () => { + globalScene.gameData.tryExportData(GameDataType.SYSTEM); + return true; + }, + keepOpen: true, }, - keepOpen: true - }, - { - label: i18next.t("menuUiHandler:consentPreferences"), - handler: () => { - const consentLink = document.querySelector(".termly-display-preferences") as HTMLInputElement; - const clickEvent = new MouseEvent("click", { - view: window, - bubbles: true, - cancelable: true - }); - consentLink.dispatchEvent(clickEvent); - consentLink.focus(); - return true; + { + label: i18next.t("menuUiHandler:consentPreferences"), + handler: () => { + const consentLink = document.querySelector(".termly-display-preferences") as HTMLInputElement; + const clickEvent = new MouseEvent("click", { + view: window, + bubbles: true, + cancelable: true, + }); + consentLink.dispatchEvent(clickEvent); + consentLink.focus(); + return true; + }, + keepOpen: true, }, - keepOpen: true - }); - if (Utils.isLocal || Utils.isBeta) { // this should make sure we don't have this option in live + ); + if (Utils.isLocal || Utils.isBeta) { + // this should make sure we don't have this option in live manageDataOptions.push({ label: "Test Dialogue", handler: () => { @@ -299,7 +347,7 @@ export default class MenuUiHandler extends MessageUiHandler { const interpolatorOptions: any = {}; const splitArr = dialogueName.split(" "); // this splits our inputted text into words to cycle through later const translatedString = splitArr[0]; // this is our outputted i18 string - const regex = RegExp("\\{\\{(\\w*)\\}\\}", "g"); // this is a regex expression to find all the text between {{ }} in the i18 output + const regex = /\{\{(\w*)\}\}/g; // this is a regex expression to find all the text between {{ }} in the i18 output const matches = i18next.t(translatedString).match(regex) ?? []; if (matches.length > 0) { for (let match = 0; match < matches.length; match++) { @@ -312,20 +360,27 @@ export default class MenuUiHandler extends MessageUiHandler { } // Switch to the dialog test window this.setDialogTestMode(true); - ui.showText(String(i18next.t(translatedString, interpolatorOptions)), null, () => globalScene.ui.showText("", 0, () => { - handler.tutorialActive = false; - // Go back to the default message window - this.setDialogTestMode(false); - }), null, true); + ui.showText( + String(i18next.t(translatedString, interpolatorOptions)), + null, + () => + globalScene.ui.showText("", 0, () => { + handler.tutorialActive = false; + // Go back to the default message window + this.setDialogTestMode(false); + }), + null, + true, + ); }, () => { ui.revertMode(); - } + }, ]; ui.setMode(Mode.TEST_DIALOGUE, buttonAction, prefilledText); return true; }, - keepOpen: true + keepOpen: true, }); } manageDataOptions.push({ @@ -334,14 +389,14 @@ export default class MenuUiHandler extends MessageUiHandler { globalScene.ui.revertMode(); return true; }, - keepOpen: true + keepOpen: true, }); //Thank you Vassiat this.manageDataConfig = { xOffset: 98, options: manageDataOptions, - maxOptions: 7 + maxOptions: 7, }; const communityOptions: OptionSelectItem[] = [ @@ -351,7 +406,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(wikiUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "Discord", @@ -359,7 +414,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(discordUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "GitHub", @@ -367,7 +422,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(githubUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "Reddit", @@ -375,7 +430,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(redditUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: i18next.t("menuUiHandler:donate"), @@ -383,52 +438,58 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(donateUrl, "_blank")?.focus(); return true; }, - keepOpen: true - } + keepOpen: true, + }, ]; if (!bypassLogin && loggedInUser?.hasAdminRole) { communityOptions.push({ label: "Admin", handler: () => { - - const skippedAdminModes: AdminMode[] = [ AdminMode.ADMIN ]; // this is here so that we can skip the menu populating enums that aren't meant for the menu, such as the AdminMode.ADMIN + const skippedAdminModes: AdminMode[] = [AdminMode.ADMIN]; // this is here so that we can skip the menu populating enums that aren't meant for the menu, such as the AdminMode.ADMIN const options: OptionSelectItem[] = []; - Object.values(AdminMode).filter((v) => !isNaN(Number(v)) && !skippedAdminModes.includes(v as AdminMode)).forEach((mode) => { // this gets all the enums in a way we can use - options.push({ - label: getAdminModeName(mode as AdminMode), - handler: () => { - ui.playSelect(); - ui.setOverlayMode(Mode.ADMIN, { - buttonActions: [ - // we double revert here and below to go back 2 layers of menus - () => { - ui.revertMode(); - ui.revertMode(); + Object.values(AdminMode) + .filter(v => !Number.isNaN(Number(v)) && !skippedAdminModes.includes(v as AdminMode)) + .forEach(mode => { + // this gets all the enums in a way we can use + options.push({ + label: getAdminModeName(mode as AdminMode), + handler: () => { + ui.playSelect(); + ui.setOverlayMode( + Mode.ADMIN, + { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + ui.revertMode(); + ui.revertMode(); + }, + () => { + ui.revertMode(); + ui.revertMode(); + }, + ], }, - () => { - ui.revertMode(); - ui.revertMode(); - } - ] - }, mode); // mode is our AdminMode enum - return true; - } + mode, + ); // mode is our AdminMode enum + return true; + }, + }); }); - }); options.push({ label: "Cancel", handler: () => { ui.revertMode(); return true; - } + }, }); globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options, - delay: 0 + delay: 0, }); return true; }, - keepOpen: true + keepOpen: true, }); } communityOptions.push({ @@ -436,11 +497,11 @@ export default class MenuUiHandler extends MessageUiHandler { handler: () => { globalScene.ui.revertMode(); return true; - } + }, }); this.communityConfig = { xOffset: 98, - options: communityOptions + options: communityOptions, }; this.setCursor(0); } @@ -450,7 +511,7 @@ export default class MenuUiHandler extends MessageUiHandler { super.show(args); this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); @@ -471,7 +532,6 @@ export default class MenuUiHandler extends MessageUiHandler { this.bgmBar.toggleBgmBar(true); - return true; } @@ -529,10 +589,22 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; break; case MenuOptions.MANAGE_DATA: - if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { - this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, + if ( + !bypassLogin && + !this.manageDataConfig.options.some( + o => + o.label === i18next.t("menuUiHandler:linkDiscord") || + o.label === i18next.t("menuUiHandler:unlinkDiscord"), + ) + ) { + this.manageDataConfig.options.splice( + this.manageDataConfig.options.length - 1, + 0, { - label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), + label: + loggedInUser?.discordId === "" + ? i18next.t("menuUiHandler:linkDiscord") + : i18next.t("menuUiHandler:unlinkDiscord"), handler: () => { if (loggedInUser?.discordId === "") { const token = Utils.getCookie(Utils.sessionIdKey); @@ -541,16 +613,18 @@ export default class MenuUiHandler extends MessageUiHandler { const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&state=${token}&prompt=none`; window.open(discordUrl, "_self"); return true; - } else { - pokerogueApi.unlinkDiscord().then(_isSuccess => { - updateUserInfo().then(() => globalScene.reset(true, true)); - }); - return true; } - } + pokerogueApi.unlinkDiscord().then(_isSuccess => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }); + return true; + }, }, { - label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), + label: + loggedInUser?.googleId === "" + ? i18next.t("menuUiHandler:linkGoogle") + : i18next.t("menuUiHandler:unlinkGoogle"), handler: () => { if (loggedInUser?.googleId === "") { const token = Utils.getCookie(Utils.sessionIdKey); @@ -559,14 +633,14 @@ export default class MenuUiHandler extends MessageUiHandler { const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&response_type=code&redirect_uri=${redirectUri}&scope=openid&state=${token}`; window.open(googleUrl, "_self"); return true; - } else { - pokerogueApi.unlinkGoogle().then(_isSuccess => { - updateUserInfo().then(() => globalScene.reset(true, true)); - }); - return true; } - } - }); + pokerogueApi.unlinkGoogle().then(_isSuccess => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }); + return true; + }, + }, + ); } ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); success = true; @@ -580,11 +654,11 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; const doSaveQuit = () => { ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => + buttonActions: [], + fadeOut: () => globalScene.gameData.saveAll(true, true, true, true).then(() => { - globalScene.reset(true); - }) + }), }); }; if (globalScene.currentBattle.turn > 1) { @@ -593,10 +667,16 @@ export default class MenuUiHandler extends MessageUiHandler { this.showText("", 0); return; } - ui.setOverlayMode(Mode.CONFIRM, doSaveQuit, () => { - ui.revertMode(); - this.showText("", 0); - }, false, -98); + ui.setOverlayMode( + Mode.CONFIRM, + doSaveQuit, + () => { + ui.revertMode(); + this.showText("", 0); + }, + false, + -98, + ); }); } else { doSaveQuit(); @@ -609,9 +689,11 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; const doLogout = () => { ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => pokerogueApi.account.logout().then(() => { - updateUserInfo().then(() => globalScene.reset(true, true)); - }) + buttonActions: [], + fadeOut: () => + pokerogueApi.account.logout().then(() => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }), }); }; if (globalScene.currentBattle) { @@ -620,10 +702,16 @@ export default class MenuUiHandler extends MessageUiHandler { this.showText("", 0); return; } - ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { - ui.revertMode(); - this.showText("", 0); - }, false, -98); + ui.setOverlayMode( + Mode.CONFIRM, + doLogout, + () => { + ui.revertMode(); + this.showText("", 0); + }, + false, + -98, + ); }); } else { doLogout(); @@ -675,12 +763,21 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBox.setVisible(!isDialogMode); this.dialogueMessageBox.setVisible(isDialogMode); // If we're testing dialog, we use the same word wrapping as the battle message handler - this.message.setWordWrapWidth(isDialogMode ? globalScene.ui.getMessageHandler().wordWrapWidth : this.defaultWordWrapWidth); + this.message.setWordWrapWidth( + isDialogMode ? globalScene.ui.getMessageHandler().wordWrapWidth : this.defaultWordWrapWidth, + ); this.message.setX(isDialogMode ? this.textPadding + 1 : this.textPadding); this.message.setY(isDialogMode ? this.textPadding + 0.4 : this.textPadding); } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ): void { this.menuMessageBoxContainer.setVisible(!!text); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 18e1dfb1aff..50522152021 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -34,15 +34,37 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } } - showText(text: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name?: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null) { + showDialogue( + text: string, + _name?: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - private showTextInternal(text: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null) { + private showTextInternal( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { if (delay === null || delay === undefined) { delay = 20; } @@ -60,13 +82,13 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { charVarMap.set(actionMatch.index, actionMatch[2]); break; case "d": - delayMap.set(actionMatch.index, parseInt(actionMatch[2])); + delayMap.set(actionMatch.index, Number.parseInt(actionMatch[2])); break; case "s": soundMap.set(actionMatch.index, actionMatch[2]); break; case "f": - fadeMap.set(actionMatch.index, parseInt(actionMatch[2])); + fadeMap.set(actionMatch.index, Number.parseInt(actionMatch[2])); break; } text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); @@ -122,7 +144,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.textTimer = globalScene.time.addEvent({ delay: delay, callback: () => { - const charIndex = text.length - (this.textTimer?.repeatCount!); // TODO: is this bang correct? + const charIndex = text.length - this.textTimer?.repeatCount!; // TODO: is this bang correct? const charVar = charVarMap.get(charIndex); const charSound = soundMap.get(charIndex); const charDelay = delayMap.get(charIndex); @@ -156,7 +178,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { onComplete: () => { this.textTimer!.paused = false; // TODO: is the bang correct? advance(); - } + }, }); } else if (charFade) { this.textTimer!.paused = true; @@ -175,7 +197,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { advance(); } }, - repeat: text.length + repeat: text.length, }); } else { this.message.setText(text); @@ -192,7 +214,9 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); const textLinesCount = wrappedTextLines.length; const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; - const lastLineTest = globalScene.add.text(0, 0, lastTextLine, { font: "96px emerald" }); + const lastLineTest = globalScene.add.text(0, 0, lastTextLine, { + font: "96px emerald", + }); lastLineTest.setScale(this.message.scale); const lastLineWidth = lastLineTest.displayWidth; lastLineTest.destroy(); diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 909010e3566..b7dbbeb202d 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -44,7 +44,10 @@ 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), Phaser.Geom.Rectangle.Contains); + this.modalContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); this.modalBg = addWindow(0, 0, 0, 0); @@ -73,7 +76,10 @@ export abstract class ModalUiHandler extends UiHandler { const buttonBg = addWindow(0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); buttonBg.setOrigin(0.5, 0); - buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); + buttonBg.setInteractive( + new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), + Phaser.Geom.Rectangle.Contains, + ); const buttonContainer = globalScene.add.container(0, buttonTopMargin); @@ -93,9 +99,15 @@ export abstract class ModalUiHandler extends UiHandler { if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); if (args[0].hasOwnProperty("fadeOut") && typeof args[0].fadeOut === "function") { - const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(); + const [marginTop, marginRight, marginBottom, marginLeft] = this.getMargin(); - 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, 0); + 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, + 0, + ); overlay.setOrigin(0.5, 0.5); overlay.setName("rect-ui-overlay-modal"); overlay.setAlpha(0); @@ -108,7 +120,7 @@ export abstract class ModalUiHandler extends UiHandler { alpha: 1, duration: 250, ease: "Sine.easeOut", - onComplete: args[0].fadeOut + onComplete: args[0].fadeOut, }); } @@ -122,7 +134,7 @@ export abstract class ModalUiHandler extends UiHandler { for (let a = 0; a < this.buttonBgs.length; a++) { if (a < this.buttonBgs.length) { - this.buttonBgs[a].on("pointerdown", (_) => config.buttonActions[a]()); + this.buttonBgs[a].on("pointerdown", _ => config.buttonActions[a]()); } } @@ -133,10 +145,13 @@ export abstract class ModalUiHandler extends UiHandler { } updateContainer(config?: ModalConfig): void { - const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(config); + const [marginTop, marginRight, marginBottom, marginLeft] = this.getMargin(config); - const [ width, height ] = [ this.getWidth(config), this.getHeight(config) ]; - this.modalContainer.setPosition((((globalScene.game.canvas.width / 6) - (width + (marginRight - marginLeft))) / 2), (((-globalScene.game.canvas.height / 6) - (height + (marginBottom - marginTop))) / 2)); + const [width, height] = [this.getWidth(config), this.getHeight(config)]; + this.modalContainer.setPosition( + (globalScene.game.canvas.width / 6 - (width + (marginRight - marginLeft))) / 2, + (-globalScene.game.canvas.height / 6 - (height + (marginBottom - marginTop))) / 2, + ); this.modalBg.setSize(width, height); @@ -153,7 +168,7 @@ export abstract class ModalUiHandler extends UiHandler { } } - processInput(button: Button): boolean { + processInput(_button: Button): boolean { return false; } @@ -168,7 +183,9 @@ export abstract class ModalUiHandler extends UiHandler { * Adds a hover effect to a game object which changes the cursor to a `pointer` and tints it slighly * @param gameObject the game object to add hover events/effects to */ - protected addInteractionHoverEffect(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite) { + protected addInteractionHoverEffect( + gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite, + ) { gameObject.on("pointerover", () => { this.setMouseCursorStyle("pointer"); gameObject.setTint(0xbbbbbb); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 7942a160a85..e5d8f858782 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -33,9 +33,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private rerollCostText: Phaser.GameObjects.Text; private lockRarityButtonText: Phaser.GameObjects.Text; private moveInfoOverlay: MoveInfoOverlay; - private moveInfoOverlayActive: boolean = false; + private moveInfoOverlayActive = false; - private rowCursor: number = 0; + private rowCursor = 0; private player: boolean; /** * If reroll cost is negative, it is assumed there are 0 items in the shop. @@ -73,7 +73,10 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.checkButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:checkTeam")).width; } - this.transferButtonContainer = globalScene.add.container((globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 21, OPTION_BUTTON_YPOSITION); + this.transferButtonContainer = globalScene.add.container( + (globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 21, + OPTION_BUTTON_YPOSITION, + ); this.transferButtonContainer.setName("transfer-btn"); this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); @@ -83,7 +86,10 @@ export default 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.game.canvas.width / 6 - 1, + OPTION_BUTTON_YPOSITION, + ); this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); @@ -113,16 +119,29 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.setVisible(false); ui.add(this.lockRarityButtonContainer); - this.lockRarityButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:lockRarities"), TextStyle.PARTY); + this.lockRarityButtonText = addTextObject( + -4, + -2, + i18next.t("modifierSelectUiHandler:lockRarities"), + TextStyle.PARTY, + ); this.lockRarityButtonText.setOrigin(0, 0); this.lockRarityButtonContainer.add(this.lockRarityButtonText); - this.continueButtonContainer = globalScene.add.container((globalScene.game.canvas.width / 12), -(globalScene.game.canvas.height / 12)); + this.continueButtonContainer = globalScene.add.container( + globalScene.game.canvas.width / 12, + -(globalScene.game.canvas.height / 12), + ); this.continueButtonContainer.setVisible(false); ui.add(this.continueButtonContainer); // Create continue button - const continueButtonText = addTextObject(-24, 5, i18next.t("modifierSelectUiHandler:continueNextWaveButton"), TextStyle.MESSAGE); + const continueButtonText = addTextObject( + -24, + 5, + i18next.t("modifierSelectUiHandler:continueNextWaveButton"), + TextStyle.MESSAGE, + ); continueButtonText.setName("text-continue-btn"); this.continueButtonContainer.add(continueButtonText); @@ -135,7 +154,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { right: true, x: 1, y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: (globalScene.game.canvas.width / 6) - 2, + width: globalScene.game.canvas.width / 6 - 2, }); ui.add(this.moveInfoOverlay); // register the overlay to receive toggle events @@ -143,7 +162,6 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } show(args: any[]): boolean { - globalScene.disableMenu = false; if (this.active) { @@ -155,7 +173,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return false; } - if (args.length !== 4 || !(args[1] instanceof Array) || !(args[2] instanceof Function)) { + if (args.length !== 4 || !Array.isArray(args[1]) || !(args[2] instanceof Function)) { return false; } @@ -165,7 +183,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.player = args[0]; - const partyHasHeldItem = this.player && !!globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable).length; + const partyHasHeldItem = + this.player && !!globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable).length; const canLockRarities = !!globalScene.findModifier(m => m instanceof LockModifierTiersModifier); this.transferButtonContainer.setVisible(false); @@ -196,11 +215,16 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const shopTypeOptions = !removeHealShop ? getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, baseShopCost.value) : []; - const optionsYOffset = shopTypeOptions.length > SHOP_OPTIONS_ROW_LIMIT ? -SINGLE_SHOP_ROW_YOFFSET : -DOUBLE_SHOP_ROW_YOFFSET; + const optionsYOffset = + 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 option = new ModifierOption(sliceWidth * (m + 1) + (sliceWidth * 0.5), -globalScene.game.canvas.height / 12 + optionsYOffset, typeOptions[m]); + const sliceWidth = globalScene.game.canvas.width / 6 / (typeOptions.length + 2); + const option = new ModifierOption( + sliceWidth * (m + 1) + sliceWidth * 0.5, + -globalScene.game.canvas.height / 12 + optionsYOffset, + typeOptions[m], + ); option.setScale(0.5); globalScene.add.existing(option); this.modifierContainer.add(option); @@ -215,9 +239,16 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { for (let m = 0; m < shopTypeOptions.length; m++) { const row = m < SHOP_OPTIONS_ROW_LIMIT ? 0 : 1; const col = m < SHOP_OPTIONS_ROW_LIMIT ? m : m - SHOP_OPTIONS_ROW_LIMIT; - const rowOptions = shopTypeOptions.slice(row ? SHOP_OPTIONS_ROW_LIMIT : 0, row ? undefined : SHOP_OPTIONS_ROW_LIMIT); - const sliceWidth = (globalScene.game.canvas.width / 6) / (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))), shopTypeOptions[m]); + const rowOptions = shopTypeOptions.slice( + row ? SHOP_OPTIONS_ROW_LIMIT : 0, + row ? undefined : SHOP_OPTIONS_ROW_LIMIT, + ); + const sliceWidth = globalScene.game.canvas.width / 6 / (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)), + shopTypeOptions[m], + ); option.setScale(0.375); globalScene.add.existing(option); this.modifierContainer.add(option); @@ -249,10 +280,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const index = Math.floor(value * typeOptions.length); if (index > i && index <= typeOptions.length) { const option = this.options[i]; - option?.show(Math.floor((1 - value) * 1250) * 0.325 + 2000 * maxUpgradeCount, -(maxUpgradeCount - typeOptions[i].upgradeCount)); + option?.show( + Math.floor((1 - value) * 1250) * 0.325 + 2000 * maxUpgradeCount, + -(maxUpgradeCount - typeOptions[i].upgradeCount), + ); i++; } - } + }, }); globalScene.time.delayedCall(1000 + maxUpgradeCount * 2000, () => { @@ -268,7 +302,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { globalScene.tweens.add({ targets: this.transferButtonContainer, alpha: 1, - duration: 250 + duration: 250, }); } @@ -282,22 +316,22 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.setVisible(canLockRarities); globalScene.tweens.add({ - targets: [ this.checkButtonContainer, this.continueButtonContainer ], + targets: [this.checkButtonContainer, this.continueButtonContainer], alpha: 1, - duration: 250 + duration: 250, }); globalScene.tweens.add({ - targets: [ this.rerollButtonContainer, this.lockRarityButtonContainer ], + targets: [this.rerollButtonContainer, this.lockRarityButtonContainer], alpha: this.rerollCost < 0 ? 0.5 : 1, - duration: 250 + duration: 250, }); const updateCursorTarget = () => { 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 && globalScene.gameMode.hasNoShop) { this.setRowCursor(ShopCursorTarget.REWARDS); this.setCursor(0); } else { @@ -308,7 +342,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { updateCursorTarget(); - handleTutorial(Tutorial.Select_Item).then((res) => { + handleTutorial(Tutorial.Select_Item).then(res => { if (res) { updateCursorTarget(); } @@ -469,7 +503,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.modifierContainer.add(this.cursorObj); } - const options = (this.rowCursor === 1 ? this.options : this.shopOptionsRows[this.shopOptionsRows.length - (this.rowCursor - 1)]); + const options = + this.rowCursor === 1 ? this.options : this.shopOptionsRows[this.shopOptionsRows.length - (this.rowCursor - 1)]; this.cursorObj.setScale(this.rowCursor === 1 ? 2 : this.rowCursor >= 2 ? 1.5 : 1); @@ -479,18 +514,31 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (this.rowCursor === 1 && options.length === 0) { // 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) - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2)); + this.cursorObj.setPosition( + globalScene.game.canvas.width / 18 + 23, + -globalScene.game.canvas.height / 12 - + (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.game.canvas.width / 6 / (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) - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2)); + this.cursorObj.setPosition( + sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 20, + -globalScene.game.canvas.height / 12 - + (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.game.canvas.height / 32) - (-14 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1)))); + this.cursorObj.setPosition( + sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 16, + -globalScene.game.canvas.height / 12 - + globalScene.game.canvas.height / 32 - + (-14 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1))), + ); } const type = options[this.cursor].modifierTypeOption.type; @@ -500,13 +548,22 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.moveInfoOverlay.show(allMoves[type.moveId]); } } else if (cursor === 0) { - this.cursorObj.setPosition(6, this.lockRarityButtonContainer.visible ? OPTION_BUTTON_YPOSITION - 8 : OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + 6, + this.lockRarityButtonContainer.visible ? OPTION_BUTTON_YPOSITION - 8 : OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:rerollDesc")); } else if (cursor === 1) { - this.cursorObj.setPosition((globalScene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + (globalScene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, + OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:transferDesc")); } else if (cursor === 2) { - this.cursorObj.setPosition((globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 10, OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + (globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 10, + OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:checkTeamDesc")); } else { this.cursorObj.setPosition(6, OPTION_BUTTON_YPOSITION + 4); @@ -521,7 +578,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (rowCursor !== lastRowCursor) { this.rowCursor = rowCursor; - let newCursor = Math.round(this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1) * (this.getRowItems(rowCursor) - 1)); + let newCursor = Math.round( + (this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1)) * (this.getRowItems(rowCursor) - 1), + ); if (rowCursor === 1 && this.options.length === 0) { // Handle empty shop newCursor = 0; @@ -582,9 +641,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (rerollDisabled) { this.rerollCostText.setVisible(false); return; - } else { - this.rerollCostText.setVisible(true); } + this.rerollCostText.setVisible(true); const canReroll = globalScene.money >= this.rerollCost; const formattedMoney = Utils.formatMoney(globalScene.moneyFormat, this.rerollCost); @@ -630,10 +688,16 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { scale: 0.01, duration: 250, ease: "Cubic.easeIn", - onComplete: () => options.forEach(o => o.destroy()) + onComplete: () => options.forEach(o => o.destroy()), }); - [ this.rerollButtonContainer, this.checkButtonContainer, this.transferButtonContainer, this.lockRarityButtonContainer, this.continueButtonContainer ].forEach(container => { + [ + this.rerollButtonContainer, + this.checkButtonContainer, + this.transferButtonContainer, + this.lockRarityButtonContainer, + this.continueButtonContainer, + ].forEach(container => { if (container.visible) { globalScene.tweens.add({ targets: container, @@ -646,7 +710,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } else { container.setAlpha(1); } - } + }, }); } }); @@ -716,11 +780,15 @@ class ModifierOption extends Phaser.GameObjects.Container { this.itemText = addTextObject(0, 35, this.modifierTypeOption.type?.name!, TextStyle.PARTY, { align: "center" }); // TODO: is this bang correct? this.itemText.setOrigin(0.5, 0); this.itemText.setAlpha(0); - this.itemText.setTint(this.modifierTypeOption.type?.tier ? getModifierTierTextTint(this.modifierTypeOption.type?.tier) : undefined); + this.itemText.setTint( + this.modifierTypeOption.type?.tier ? getModifierTierTextTint(this.modifierTypeOption.type?.tier) : undefined, + ); this.add(this.itemText); if (this.modifierTypeOption.cost) { - this.itemCostText = addTextObject(0, 45, "", TextStyle.MONEY, { align: "center" }); + this.itemCostText = addTextObject(0, 45, "", TextStyle.MONEY, { + align: "center", + }); this.itemCostText.setOrigin(0.5, 0); this.itemCostText.setAlpha(0); @@ -736,7 +804,7 @@ class ModifierOption extends Phaser.GameObjects.Container { targets: this.pb, y: 0, duration: 1250, - ease: "Bounce.Out" + ease: "Bounce.Out", }); let lastValue = 1; @@ -754,42 +822,52 @@ class ModifierOption extends Phaser.GameObjects.Container { } const value = t.getValue(); if (!bounce && value > lastValue) { - globalScene.playSound("se/pb_bounce_1", { volume: 1 / ++bounceCount }); + globalScene.playSound("se/pb_bounce_1", { + volume: 1 / ++bounceCount, + }); bounce = true; } else if (bounce && value < lastValue) { bounce = false; } lastValue = value; - } + }, }); for (let u = 0; u < this.modifierTypeOption.upgradeCount; u++) { const upgradeIndex = u; - globalScene.time.delayedCall(remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), () => { - globalScene.playSound("se/upgrade", { rate: 1 + 0.25 * upgradeIndex }); - this.pbTint.setPosition(this.pb.x, this.pb.y); - this.pbTint.setTintFill(0xFFFFFF); - this.pbTint.setAlpha(0); - this.pbTint.setVisible(true); - globalScene.tweens.add({ - targets: this.pbTint, - alpha: 1, - duration: 1000, - ease: "Sine.easeIn", - onComplete: () => { - this.pb.setTexture("pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1))); - globalScene.tweens.add({ - targets: this.pbTint, - alpha: 0, - duration: 750, - ease: "Sine.easeOut", - onComplete: () => { - this.pbTint.setVisible(false); - } - }); - } - }); - }); + globalScene.time.delayedCall( + remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), + () => { + globalScene.playSound("se/upgrade", { + rate: 1 + 0.25 * upgradeIndex, + }); + this.pbTint.setPosition(this.pb.x, this.pb.y); + this.pbTint.setTintFill(0xffffff); + this.pbTint.setAlpha(0); + this.pbTint.setVisible(true); + globalScene.tweens.add({ + targets: this.pbTint, + alpha: 1, + duration: 1000, + ease: "Sine.easeIn", + onComplete: () => { + this.pb.setTexture( + "pb", + this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1)), + ); + globalScene.tweens.add({ + targets: this.pbTint, + alpha: 0, + duration: 750, + ease: "Sine.easeOut", + onComplete: () => { + this.pbTint.setVisible(false); + }, + }); + }, + }); + }, + ); } } @@ -808,7 +886,7 @@ class ModifierOption extends Phaser.GameObjects.Container { delay: 250, ease: "Sine.easeIn", alpha: 0, - onComplete: () => this.pb.destroy() + onComplete: () => this.pb.destroy(), }); } @@ -817,7 +895,7 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 500, ease: "Elastic.Out", scale: 2, - alpha: 1 + alpha: 1, }); if (!this.modifierTypeOption.cost) { globalScene.tweens.add({ @@ -825,7 +903,7 @@ class ModifierOption extends Phaser.GameObjects.Container { alpha: 0, duration: 500, ease: "Sine.easeIn", - onComplete: () => this.itemTint.destroy() + onComplete: () => this.itemTint.destroy(), }); } globalScene.tweens.add({ @@ -833,7 +911,7 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 500, alpha: 1, y: 25, - ease: "Cubic.easeInOut" + ease: "Cubic.easeInOut", }); if (this.itemCostText) { globalScene.tweens.add({ @@ -841,13 +919,13 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 500, alpha: 1, y: 35, - ease: "Cubic.easeInOut" + ease: "Cubic.easeInOut", }); } }); } - getPbAtlasKey(tierOffset: number = 0) { + getPbAtlasKey(tierOffset = 0) { return getPokeballAtlasKey((this.modifierTypeOption.type?.tier! + tierOffset) as number as PokeballType); // TODO: is this bang correct? } diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 1b49c2dd3c3..6fc99beb0ae 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -9,19 +9,19 @@ import { PokemonType } from "#enums/pokemon-type"; 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 - x?: number; - y?: number; - /** Default is always half the screen, regardless of scale */ - width?: number; - /** Determines whether to display the small secondary box */ - hideEffectBox?: boolean; - hideBg?: boolean; + 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 + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; + /** Determines whether to display the small secondary box */ + hideEffectBox?: boolean; + hideBg?: boolean; } const EFF_HEIGHT = 48; @@ -31,22 +31,22 @@ const BORDER = 8; const GLOBAL_SCALE = 6; export default class MoveInfoOverlay extends Phaser.GameObjects.Container implements InfoToggle { - public active: boolean = false; + public active = false; private move: Move; private desc: Phaser.GameObjects.Text; - private descScroll : Phaser.Tweens.Tween | null = null; + private descScroll: Phaser.Tweens.Tween | null = null; private val: Phaser.GameObjects.Container; - private pp: Phaser.GameObjects.Text; + private pp: Phaser.GameObjects.Text; private pow: Phaser.GameObjects.Text; private acc: Phaser.GameObjects.Text; private typ: Phaser.GameObjects.Sprite; private cat: Phaser.GameObjects.Sprite; private descBg: Phaser.GameObjects.NineSlice; - private options : MoveInfoOverlaySettings; + private options: MoveInfoOverlaySettings; constructor(options?: MoveInfoOverlaySettings) { if (options?.onSide) { @@ -59,18 +59,33 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem // 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 - this.descBg = addWindow( (options?.onSide && !options?.right ? EFF_WIDTH : 0), options?.top ? EFF_HEIGHT : 0, width - (options?.onSide ? EFF_WIDTH : 0), DESC_HEIGHT); + this.descBg = addWindow( + options?.onSide && !options?.right ? EFF_WIDTH : 0, + options?.top ? EFF_HEIGHT : 0, + width - (options?.onSide ? EFF_WIDTH : 0), + DESC_HEIGHT, + ); this.descBg.setOrigin(0, 0); this.add(this.descBg); // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected - this.desc = addTextObject((options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE }}); + this.desc = addTextObject( + (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, + (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, + "", + TextStyle.BATTLE_INFO, + { + wordWrap: { + width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE, + }, + }, + ); this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); // limit the text rendering, required for scrolling later on const maskPointOrigin = { - x: (options?.x || 0), - y: (options?.y || 0), + x: options?.x || 0, + y: options?.y || 0, }; if (maskPointOrigin.x < 0) { maskPointOrigin.x += globalScene.game.canvas.width / GLOBAL_SCALE; @@ -80,10 +95,13 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } const moveDescriptionTextMaskRect = globalScene.make.graphics(); - moveDescriptionTextMaskRect.fillStyle(0xFF0000); + 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) * 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, + ); moveDescriptionTextMaskRect.setScale(6); const moveDescriptionTextMask = this.createGeometryMask(moveDescriptionTextMaskRect); @@ -91,7 +109,11 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem this.desc.setMask(moveDescriptionTextMask); // prepare the effect box - this.val = new Phaser.GameObjects.Container(globalScene, options?.right ? width - EFF_WIDTH : 0, options?.top || options?.onSide ? 0 : DESC_HEIGHT); + this.val = new Phaser.GameObjects.Container( + globalScene, + options?.right ? width - EFF_WIDTH : 0, + options?.top || options?.onSide ? 0 : DESC_HEIGHT, + ); this.add(this.val); const valuesBg = addWindow(0, 0, EFF_WIDTH, EFF_HEIGHT); @@ -145,7 +167,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // show this component with infos for the specific move - show(move : Move):boolean { + show(move: Move): boolean { if (!globalScene.enableMoveInfo) { return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` } @@ -166,7 +188,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // determine if we need to add new scrolling effects - const moveDescriptionLineCount = Math.floor(this.desc.displayHeight * (96 / 72) / 14.83); + const moveDescriptionLineCount = Math.floor((this.desc.displayHeight * (96 / 72)) / 14.83); if (moveDescriptionLineCount > 3) { // generate scrolling effects this.descScroll = globalScene.tweens.add({ @@ -175,7 +197,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), - y: `-=${14.83 * (72 / 96) * (moveDescriptionLineCount - 3)}` + y: `-=${14.83 * (72 / 96) * (moveDescriptionLineCount - 3)}`, }); } @@ -199,7 +221,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem targets: this.desc, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); if (!visible) { this.setVisible(false); @@ -211,12 +233,12 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // width of this element - static getWidth(scale:number):number { + static getWidth(_scale: number): number { return globalScene.game.canvas.width / GLOBAL_SCALE / 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(scale: number, onSide?: boolean): number { + return (onSide ? Math.max(EFF_HEIGHT, DESC_HEIGHT) : EFF_HEIGHT + DESC_HEIGHT) * scale; } } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 383f4ab73d3..87d2e2ba28c 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -36,16 +36,16 @@ export default class MysteryEncounterUiHandler extends UiHandler { private dexProgressWindow: Phaser.GameObjects.NineSlice; private dexProgressContainer: Phaser.GameObjects.Container; - private showDexProgress: boolean = false; + private showDexProgress = false; private overrideSettings?: OptionSelectSettings; private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; - protected viewPartyIndex: number = 0; - protected viewPartyXPosition: number = 0; + protected viewPartyIndex = 0; + protected viewPartyXPosition = 0; - protected blockInput: boolean = true; + protected blockInput = true; constructor() { super(Mode.MYSTERY_ENCOUNTER); @@ -86,7 +86,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.descriptionContainer.add(this.rarityBall); const dexProgressIndicator = globalScene.add.sprite(12, 10, "encounter_radar"); - dexProgressIndicator.setScale(0.80); + dexProgressIndicator.setScale(0.8); this.dexProgressContainer.add(dexProgressIndicator); this.dexProgressContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 24, 28), Phaser.Geom.Rectangle.Contains); } @@ -94,9 +94,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { override show(args: any[]): boolean { super.show(args); - this.overrideSettings = args[0] as OptionSelectSettings ?? {}; - const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings.hideDescription; - const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings.slideInDescription; + this.overrideSettings = (args[0] as OptionSelectSettings) ?? {}; + const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) + ? true + : !this.overrideSettings.hideDescription; + const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) + ? true + : this.overrideSettings.slideInDescription; const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0; this.cursorContainer.setVisible(true); @@ -136,7 +140,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { success = true; const overrideSettings: OptionSelectSettings = { ...this.overrideSettings, - slideInDescription: false + slideInDescription: false, }; globalScene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { globalScene.ui.setMode(Mode.MYSTERY_ENCOUNTER, overrideSettings); @@ -145,7 +149,12 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.unblockInput(); }, 300); }); - } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && (selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL))) { + } else if ( + this.blockInput || + (!this.optionsMeetsReqs[cursor] && + (selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) + ) { success = false; } else { if ((globalScene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { @@ -159,6 +168,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } } else { switch (this.optionsContainer.getAll()?.length) { + // biome-ignore lint/suspicious/useDefaultSwitchClauseLast: Default shares logic with case 3 and it makes more sense for the statements to be ordered by the case value default: case 3: success = this.handleTwoOptionMoveInput(button); @@ -293,7 +303,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { const optionMode = this.encounterOptions[i].optionMode; - if (!this.optionsMeetsReqs[i] && (optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + !this.optionsMeetsReqs[i] && + (optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { continue; } (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); @@ -321,26 +335,38 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { this.cursorObj.setPosition(this.viewPartyXPosition, -17); - } else if (this.optionsContainer.getAll()?.length === 3) { // 2 Options + } else if (this.optionsContainer.getAll()?.length === 3) { + // 2 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 15); - } else if (this.optionsContainer.getAll()?.length === 4) { // 3 Options + } else if (this.optionsContainer.getAll()?.length === 4) { + // 3 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); - } else if (this.optionsContainer.getAll()?.length === 5) { // 4 Options + } else if (this.optionsContainer.getAll()?.length === 5) { + // 4 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); } return changed; } - displayEncounterOptions(slideInDescription: boolean = true): void { + displayEncounterOptions(slideInDescription = true): void { this.getUi().clearText(); const mysteryEncounter = globalScene.currentBattle.mysteryEncounter!; this.encounterOptions = this.overrideSettings?.overrideOptions ?? mysteryEncounter.options; this.optionsMeetsReqs = []; - const titleText: string | null = getEncounterText(mysteryEncounter.dialogue.encounterOptionsDialogue?.title, TextStyle.TOOLTIP_TITLE); - const descriptionText: string | null = getEncounterText(mysteryEncounter.dialogue.encounterOptionsDialogue?.description, TextStyle.TOOLTIP_CONTENT); - const queryText: string | null = getEncounterText(mysteryEncounter.dialogue.encounterOptionsDialogue?.query, TextStyle.TOOLTIP_CONTENT); + const titleText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.title, + TextStyle.TOOLTIP_TITLE, + ); + const descriptionText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.description, + TextStyle.TOOLTIP_CONTENT, + ); + const queryText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.query, + TextStyle.TOOLTIP_CONTENT, + ); // Clear options container (except cursor) this.optionsContainer.removeAll(true); @@ -351,23 +377,41 @@ export default class MysteryEncounterUiHandler extends UiHandler { let optionText: BBCodeText; switch (this.encounterOptions.length) { + // biome-ignore lint/suspicious/useDefaultSwitchClauseLast: default shares logic with case 2 and it makes more sense for the statements to be ordered by the case number default: case 2: - optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; case 3: - optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; case 4: - optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; } this.optionsMeetsReqs.push(option.meetsRequirements()); const optionDialogue = option.dialogue!; - const label = !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel ? optionDialogue.disabledButtonLabel : optionDialogue.buttonLabel; + const label = + !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel + ? optionDialogue.disabledButtonLabel + : optionDialogue.buttonLabel; let text: string | null; - if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + option.hasRequirements() && + this.optionsMeetsReqs[i] && + (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || + option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { // Options with special requirements that are met are automatically colored green text = getEncounterText(label, TextStyle.ME_OPTION_SPECIAL); } else { @@ -378,7 +422,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - if (!this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + !this.optionsMeetsReqs[i] && + (option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -389,7 +437,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const nonScrollWidth = 90; const optionTextMaskRect = globalScene.make.graphics({}); optionTextMaskRect.setScale(6); - optionTextMaskRect.fillStyle(0xFFFFFF); + optionTextMaskRect.fillStyle(0xffffff); optionTextMaskRect.beginPath(); optionTextMaskRect.fillRect(optionText.x + 11, optionText.y + 140, nonScrollWidth, 18); @@ -411,8 +459,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), - duration: Utils.fixedInt((optionTextWidth - nonScrollWidth) / 15 * 2000), - x: `-=${(optionTextWidth - nonScrollWidth)}` + duration: Utils.fixedInt(((optionTextWidth - nonScrollWidth) / 15) * 2000), + x: `-=${optionTextWidth - nonScrollWidth}`, }); } @@ -420,30 +468,47 @@ export default class MysteryEncounterUiHandler extends UiHandler { } // View Party Button - const viewPartyText = addBBCodeTextObject((globalScene.game.canvas.width) / 6, -24, getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), TextStyle.PARTY); + const viewPartyText = addBBCodeTextObject( + globalScene.game.canvas.width / 6, + -24, + getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), + TextStyle.PARTY, + ); this.optionsContainer.add(viewPartyText); - viewPartyText.x -= (viewPartyText.displayWidth + 16); + viewPartyText.x -= viewPartyText.displayWidth + 16; this.viewPartyXPosition = viewPartyText.x - 10; // Description Window - const titleTextObject = addBBCodeTextObject(0, 0, titleText ?? "", TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); + const titleTextObject = addBBCodeTextObject(0, 0, titleText ?? "", TextStyle.TOOLTIP_TITLE, { + wordWrap: { width: 750 }, + align: "center", + lineSpacing: -8, + }); this.descriptionContainer.add(titleTextObject); titleTextObject.setPosition(72 - titleTextObject.displayWidth / 2, 5.5); // Rarity of encounter - const index = mysteryEncounter.encounterTier === MysteryEncounterTier.COMMON ? 0 : - mysteryEncounter.encounterTier === MysteryEncounterTier.GREAT ? 1 : - mysteryEncounter.encounterTier === MysteryEncounterTier.ULTRA ? 2 : - mysteryEncounter.encounterTier === MysteryEncounterTier.ROGUE ? 3 : 4; + const index = + mysteryEncounter.encounterTier === MysteryEncounterTier.COMMON + ? 0 + : mysteryEncounter.encounterTier === MysteryEncounterTier.GREAT + ? 1 + : mysteryEncounter.encounterTier === MysteryEncounterTier.ULTRA + ? 2 + : mysteryEncounter.encounterTier === MysteryEncounterTier.ROGUE + ? 3 + : 4; const ballType = getPokeballAtlasKey(index); this.rarityBall.setTexture("pb", ballType); - const descriptionTextObject = addBBCodeTextObject(6, 25, descriptionText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 }}); + const descriptionTextObject = addBBCodeTextObject(6, 25, descriptionText ?? "", TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 830 }, + }); // Sets up the mask that hides the description text to give an illusion of scrolling const descriptionTextMaskRect = globalScene.make.graphics({}); descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.fillStyle(0xffffff); descriptionTextMaskRect.beginPath(); descriptionTextMaskRect.fillRect(6, 53, 206, 57); @@ -466,13 +531,15 @@ export default class MysteryEncounterUiHandler extends UiHandler { loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((descriptionLineCount - 6) * 2000), - y: `-=${10 * (descriptionLineCount - 6)}` + y: `-=${10 * (descriptionLineCount - 6)}`, }); } this.descriptionContainer.add(descriptionTextObject); - const queryTextObject = addBBCodeTextObject(0, 0, queryText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 }}); + const queryTextObject = addBBCodeTextObject(0, 0, queryText ?? "", TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 830 }, + }); this.descriptionContainer.add(queryTextObject); queryTextObject.setPosition(75 - queryTextObject.displayWidth / 2, 90); @@ -483,7 +550,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { targets: this.descriptionContainer, x: "+=150", ease: "Sine.easeInOut", - duration: 1000 + duration: 1000, }); } } @@ -510,7 +577,12 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text: string | null; const cursorOption = this.encounterOptions[cursor]; const optionDialogue = cursorOption.dialogue!; - if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { + if ( + !this.optionsMeetsReqs[cursor] && + (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && + optionDialogue.disabledButtonTooltip + ) { text = getEncounterText(optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); @@ -518,19 +590,36 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Auto-color options green/blue for good/bad by looking for (+)/(-) if (text) { - const primaryStyleString = [ ...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))! ][0]; - text = text.replace(/(\(\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); - text = text.replace(/(\(\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + text = text.replace( + /(\(\+\)[^\(\[]*)/gi, + substring => + "[/color][/shadow]" + + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + + "[/color][/shadow]" + + primaryStyleString, + ); + text = text.replace( + /(\(\-\)[^\(\[]*)/gi, + substring => + "[/color][/shadow]" + + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + + "[/color][/shadow]" + + primaryStyleString, + ); } if (text) { - const tooltipTextObject = addBBCodeTextObject(6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); + const tooltipTextObject = addBBCodeTextObject(6, 7, text, TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 600 }, + fontSize: "72px", + }); this.tooltipContainer.add(tooltipTextObject); // Sets up the mask that hides the description text to give an illusion of scrolling const tooltipTextMaskRect = globalScene.make.graphics({}); tooltipTextMaskRect.setScale(6); - tooltipTextMaskRect.fillStyle(0xFFFFFF); + tooltipTextMaskRect.fillStyle(0xffffff); tooltipTextMaskRect.beginPath(); tooltipTextMaskRect.fillRect(this.tooltipContainer.x, this.tooltipContainer.y + 188.5, 150, 32); @@ -552,7 +641,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { loop: -1, hold: Utils.fixedInt(1200), duration: Utils.fixedInt((tooltipLineCount - 3) * 1200), - y: `-=${11.2 * (tooltipLineCount - 3)}` + y: `-=${11.2 * (tooltipLineCount - 3)}`, }); } } @@ -606,7 +695,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.dexProgressContainer.on("pointerout", () => { globalScene.ui.hideTooltip(); }); - } + }, }); } else if (!show && this.showDexProgress) { this.showDexProgress = false; @@ -619,7 +708,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { onComplete: () => { this.dexProgressContainer.off("pointerover"); this.dexProgressContainer.off("pointerout"); - } + }, }); } } diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index b9da9320fcb..7b7f5277ca1 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -13,7 +13,7 @@ export default 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.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); } setup(): void { @@ -43,9 +43,11 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { // if we want to only display the level in the small frame if (showOnlyLevelUp) { - if (newLevel > 200) { // if the level is greater than 200, we only display Lv. UP + if (newLevel > 200) { + // if the level is greater than 200, we only display Lv. UP this.expText.setText(i18next.t("battleScene:levelUp")); - } else { // otherwise we display Lv. Up and the new level + } else { + // otherwise we display Lv. Up and the new level this.expText.setText(i18next.t("battleScene:levelUpWithLevel", { level: newLevel })); } } else { @@ -63,13 +65,13 @@ export default 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.game.canvas.width / 6 - (this.bg.width - 5), duration: 500 / Math.pow(2, globalScene.expGainsSpeed), ease: "Sine.easeOut", onComplete: () => { this.tween = null; resolve(); - } + }, }); this.setVisible(true); @@ -89,7 +91,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: (globalScene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -98,7 +100,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.setVisible(false); this.pokemonIcon?.destroy(); resolve(); - } + }, }); }); } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 19b2b78e22f..21e5f9077f4 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -6,7 +6,11 @@ import { Command } from "#app/ui/command-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; -import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "#app/modifier/modifier"; +import { + PokemonFormChangeItemModifier, + PokemonHeldItemModifier, + SwitchEffectTransferModifier, +} from "#app/modifier/modifier"; import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; import { StatusEffect } from "#enums/status-effect"; @@ -97,7 +101,7 @@ export enum PartyUiMode { * Indicates that the party UI is open to select a party member for an arbitrary effect. * This is generally used in for Mystery Encounter or special effects that require the player to select a Pokemon */ - SELECT + SELECT, } export enum PartyOption { @@ -127,10 +131,18 @@ export enum PartyOption { } export type PartySelectCallback = (cursor: number, option: PartyOption) => void; -export type PartyModifierTransferSelectCallback = (fromCursor: number, index: number, itemQuantity?: number, toCursor?: number) => void; +export type PartyModifierTransferSelectCallback = ( + fromCursor: number, + index: number, + itemQuantity?: number, + toCursor?: number, +) => void; export type PartyModifierSpliceSelectCallback = (fromCursor: number, toCursor?: number) => void; export type PokemonSelectFilter = (pokemon: PlayerPokemon) => string | null; -export type PokemonModifierTransferSelectFilter = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => string | null; +export type PokemonModifierTransferSelectFilter = ( + pokemon: PlayerPokemon, + modifier: PokemonHeldItemModifier, +) => string | null; export type PokemonMoveSelectFilter = (pokemonMove: PokemonMove) => string | null; export default class PartyUiHandler extends MessageUiHandler { @@ -147,9 +159,9 @@ export default class PartyUiHandler extends MessageUiHandler { private optionsMode: boolean; private optionsScroll: boolean; - private optionsCursor: number = 0; - private optionsScrollCursor: number = 0; - private optionsScrollTotal: number = 0; + private optionsCursor = 0; + private optionsScrollCursor = 0; + private optionsScrollTotal = 0; /** This is only public for test/ui/transfer-item.test.ts */ public optionsContainer: Phaser.GameObjects.Container; private optionsBg: Phaser.GameObjects.NineSlice; @@ -166,7 +178,7 @@ export default class PartyUiHandler extends MessageUiHandler { /** Whether to transfer all items */ private transferAll: boolean; - private lastCursor: number = 0; + private lastCursor = 0; private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback | null; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter; @@ -181,14 +193,18 @@ export default class PartyUiHandler extends MessageUiHandler { public static FilterNonFainted = (pokemon: PlayerPokemon) => { if (pokemon.isFainted()) { - return i18next.t("partyUiHandler:noEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:noEnergy", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { - return i18next.t("partyUiHandler:hasEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:hasEnergy", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; @@ -202,7 +218,9 @@ export default class PartyUiHandler extends MessageUiHandler { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(globalScene.gameMode, ChallengeType.POKEMON_IN_BATTLE, pokemon, challengeAllowed); if (!challengeAllowed.value) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; @@ -210,16 +228,36 @@ export default class PartyUiHandler extends MessageUiHandler { private static FilterAllMoves = (_pokemonMove: PokemonMove) => null; public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => { - const matchingModifier = globalScene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier; + const matchingModifier = globalScene.findModifier( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier), + ) as PokemonHeldItemModifier; if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount()) { - return i18next.t("partyUiHandler:tooManyItems", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:tooManyItems", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; public static NoEffectMessage = i18next.t("partyUiHandler:anyEffect"); - private localizedOptions = [ PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.POKEDEX, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.RENAME, PartyOption.SELECT ]; + private localizedOptions = [ + PartyOption.SEND_OUT, + PartyOption.SUMMARY, + PartyOption.POKEDEX, + PartyOption.CANCEL, + PartyOption.APPLY, + PartyOption.RELEASE, + PartyOption.TEACH, + PartyOption.SPLICE, + PartyOption.UNSPLICE, + PartyOption.REVIVE, + PartyOption.TRANSFER, + PartyOption.UNPAUSE_EVOLUTION, + PartyOption.PASS_BATON, + PartyOption.RENAME, + PartyOption.SELECT, + ]; constructor() { super(Mode.PARTY); @@ -271,7 +309,7 @@ export default 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.game.canvas.width / 6 - 1, -1); partyContainer.add(this.optionsContainer); this.iconAnimHandler = new PokemonIconAnimHandler(); @@ -305,15 +343,15 @@ export default class PartyUiHandler extends MessageUiHandler { this.partyUiMode = args[0] as PartyUiMode; - this.fieldIndex = args.length > 1 ? args[1] as number : -1; + this.fieldIndex = args.length > 1 ? (args[1] as number) : -1; this.selectCallback = args.length > 2 && args[2] instanceof Function ? args[2] : undefined; - this.selectFilter = args.length > 3 && args[3] instanceof Function - ? args[3] as PokemonSelectFilter - : PartyUiHandler.FilterAll; - this.moveSelectFilter = args.length > 4 && args[4] instanceof Function - ? args[4] as PokemonMoveSelectFilter - : PartyUiHandler.FilterAllMoves; + this.selectFilter = + args.length > 3 && args[3] instanceof Function ? (args[3] as PokemonSelectFilter) : PartyUiHandler.FilterAll; + this.moveSelectFilter = + args.length > 4 && args[4] instanceof Function + ? (args[4] as PokemonMoveSelectFilter) + : PartyUiHandler.FilterAllMoves; this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE; this.showMovePp = args.length > 6 && args[6]; @@ -354,25 +392,42 @@ export default class PartyUiHandler extends MessageUiHandler { this.startTransfer(); let ableToTransfer: string; - for (let p = 0; p < globalScene.getPlayerParty().length; p++) { // this for look goes through each of the party pokemon + for (let p = 0; p < globalScene.getPlayerParty().length; p++) { + // this for look goes through each of the party pokemon const newPokemon = globalScene.getPlayerParty()[p]; // this next line gets all of the transferable items from pokemon [p]; it does this by getting all the held modifiers that are transferable and checking to see if they belong to pokemon [p] const getTransferrableItemsFromPokemon = (newPokemon: PlayerPokemon) => - globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).isTransferable && (m as PokemonHeldItemModifier).pokemonId === newPokemon.id) as PokemonHeldItemModifier[]; + globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).isTransferable && + (m as PokemonHeldItemModifier).pokemonId === newPokemon.id, + ) as PokemonHeldItemModifier[]; // this next bit checks to see if the the selected item from the original transfer pokemon exists on the new pokemon [p]; this returns undefined if the new pokemon doesn't have the item at all, otherwise it returns the pokemonHeldItemModifier for that item - const matchingModifier = globalScene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === newPokemon.id && m.matchType(getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor])) as PokemonHeldItemModifier; + const matchingModifier = globalScene.findModifier( + m => + m instanceof PokemonHeldItemModifier && + m.pokemonId === newPokemon.id && + m.matchType(getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor]), + ) as PokemonHeldItemModifier; const partySlot = this.partySlots.filter(m => m.getPokemon() === newPokemon)[0]; // this gets pokemon [p] for us - if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer - if (matchingModifier) { // if matchingModifier exists then the item exists on the new pokemon - if (matchingModifier.getMaxStackCount() === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" + if (p !== this.transferCursor) { + // this skips adding the able/not able labels on the pokemon doing the transfer + if (matchingModifier) { + // if matchingModifier exists then the item exists on the new pokemon + if (matchingModifier.getMaxStackCount() === matchingModifier.stackCount) { + // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" ableToTransfer = i18next.t("partyUiHandler:notAble"); - } else { // if the pokemon isn't at max stack, make the label "Able" + } else { + // if the pokemon isn't at max stack, make the label "Able" ableToTransfer = i18next.t("partyUiHandler:able"); } - } else { // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" + } else { + // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" ableToTransfer = i18next.t("partyUiHandler:able"); } - } else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text + } else { + // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text ableToTransfer = ""; } partySlot.slotHpBar.setVisible(false); @@ -385,7 +440,8 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); return true; - } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && option !== PartyOption.CANCEL) { + } + if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && option !== PartyOption.CANCEL) { // clear overlay on cancel this.moveInfoOverlay.clear(); const filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); @@ -398,11 +454,24 @@ export default class PartyUiHandler extends MessageUiHandler { } ui.playSelect(); return true; - } else if ((![ PartyOption.SUMMARY, PartyOption.POKEDEX, PartyOption.UNPAUSE_EVOLUTION, PartyOption.UNSPLICE, PartyOption.RELEASE, PartyOption.CANCEL, PartyOption.RENAME ].includes(option)) - || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { + } + if ( + ![ + PartyOption.SUMMARY, + PartyOption.POKEDEX, + PartyOption.UNPAUSE_EVOLUTION, + PartyOption.UNSPLICE, + PartyOption.RELEASE, + PartyOption.CANCEL, + PartyOption.RENAME, + ].includes(option) || + (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE) + ) { let filterResult: string | null; const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => - globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[]; + globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id, + ) as PokemonHeldItemModifier[]; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null && (option === PartyOption.SEND_OUT || option === PartyOption.PASS_BATON)) { @@ -412,7 +481,12 @@ export default class PartyUiHandler extends MessageUiHandler { filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]!); // TODO: is this bang correct? } } else { - filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor])[this.transferOptionCursor]); + filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)( + pokemon, + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor])[ + this.transferOptionCursor + ], + ); } if (filterResult === null) { if (this.partyUiMode !== PartyUiMode.SPLICE) { @@ -422,12 +496,24 @@ export default class PartyUiHandler extends MessageUiHandler { if (option === PartyOption.TRANSFER) { if (this.transferCursor !== this.cursor) { if (this.transferAll) { - getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach((_, i, array) => { - const invertedIndex = array.length - 1 - i; - (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, invertedIndex, this.transferQuantitiesMax[invertedIndex], this.cursor); - }); + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach( + (_, i, array) => { + const invertedIndex = array.length - 1 - i; + (this.selectCallback as PartyModifierTransferSelectCallback)( + this.transferCursor, + invertedIndex, + this.transferQuantitiesMax[invertedIndex], + this.cursor, + ); + }, + ); } else { - (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); + (this.selectCallback as PartyModifierTransferSelectCallback)( + this.transferCursor, + this.transferOptionCursor, + this.transferQuantities[this.transferOptionCursor], + this.cursor, + ); } } this.clearTransfer(); @@ -447,7 +533,10 @@ export default class PartyUiHandler extends MessageUiHandler { selectCallback(this.cursor, option); } } else { - if (option >= PartyOption.FORM_CHANGE_ITEM && globalScene.getCurrentPhase() instanceof SelectModifierPhase) { + if ( + option >= PartyOption.FORM_CHANGE_ITEM && + globalScene.getCurrentPhase() instanceof SelectModifierPhase + ) { if (this.partyUiMode === PartyUiMode.CHECK) { const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; @@ -455,20 +544,27 @@ export default class PartyUiHandler extends MessageUiHandler { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); } } else if (this.cursor) { - (globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor, option === PartyOption.PASS_BATON); + (globalScene.getCurrentPhase() as CommandPhase).handleCommand( + Command.POKEMON, + this.cursor, + option === PartyOption.PASS_BATON, + ); } } - if (this.partyUiMode !== PartyUiMode.MODIFIER && this.partyUiMode !== PartyUiMode.TM_MODIFIER && this.partyUiMode !== PartyUiMode.MOVE_MODIFIER) { + if ( + this.partyUiMode !== PartyUiMode.MODIFIER && + this.partyUiMode !== PartyUiMode.TM_MODIFIER && + this.partyUiMode !== PartyUiMode.MOVE_MODIFIER + ) { ui.playSelect(); } return true; - } else { - this.clearOptions(); - this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } + this.clearOptions(); + this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } else if (option === PartyOption.SUMMARY) { ui.playSelect(); - ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); + ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); return true; } else if (option === PartyOption.POKEDEX) { ui.playSelect(); @@ -476,50 +572,91 @@ export default class PartyUiHandler extends MessageUiHandler { shiny: pokemon.shiny, variant: pokemon.variant, form: pokemon.formIndex, - female: pokemon.gender === Gender.FEMALE ? true : false + female: pokemon.gender === Gender.FEMALE, }; - ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, pokemon.formIndex, attributes).then(() => this.clearOptions()); + ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, pokemon.formIndex, attributes).then(() => + this.clearOptions(), + ); return true; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = !pokemon.pauseEvolutions; - this.showText(i18next.t(pokemon.pauseEvolutions ? "partyUiHandler:pausedEvolutions" : "partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), undefined, () => this.showText("", 0), null, true); + this.showText( + i18next.t( + pokemon.pauseEvolutions ? "partyUiHandler:pausedEvolutions" : "partyUiHandler:unpausedEvolutions", + { pokemonName: getPokemonNameWithAffix(pokemon) }, + ), + undefined, + () => this.showText("", 0), + null, + true, + ); } else if (option === PartyOption.UNSPLICE) { this.clearOptions(); ui.playSelect(); - this.showText(i18next.t("partyUiHandler:unspliceConfirmation", { fusionName: pokemon.fusionSpecies?.name, pokemonName: pokemon.name }), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - const fusionName = pokemon.name; - pokemon.unfuse().then(() => { - this.clearPartySlots(); - this.populatePartySlots(); - ui.setMode(Mode.PARTY); - this.showText(i18next.t("partyUiHandler:wasReverted", { fusionName: fusionName, pokemonName: pokemon.name }), undefined, () => { + this.showText( + i18next.t("partyUiHandler:unspliceConfirmation", { + fusionName: pokemon.fusionSpecies?.name, + pokemonName: pokemon.name, + }), + null, + () => { + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + const fusionName = pokemon.name; + pokemon.unfuse().then(() => { + this.clearPartySlots(); + this.populatePartySlots(); + ui.setMode(Mode.PARTY); + this.showText( + i18next.t("partyUiHandler:wasReverted", { + fusionName: fusionName, + pokemonName: pokemon.name, + }), + undefined, + () => { + ui.setMode(Mode.PARTY); + this.showText("", 0); + }, + null, + true, + ); + }); + }, + () => { ui.setMode(Mode.PARTY); this.showText("", 0); - }, null, true); - }); - }, () => { - ui.setMode(Mode.PARTY); - this.showText("", 0); - }); - }); + }, + ); + }, + ); } else if (option === PartyOption.RELEASE) { this.clearOptions(); ui.playSelect(); if (this.cursor >= globalScene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) { this.blockInput = true; - this.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - this.blockInput = false; - ui.setModeWithoutClear(Mode.CONFIRM, () => { - ui.setMode(Mode.PARTY); - this.doRelease(this.cursor); - }, () => { - ui.setMode(Mode.PARTY); - this.showText("", 0); - }); - }); + this.showText( + i18next.t("partyUiHandler:releaseConfirmation", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + this.blockInput = false; + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.PARTY); + this.doRelease(this.cursor); + }, + () => { + ui.setMode(Mode.PARTY); + this.showText("", 0); + }, + ); + }, + ); } else { this.showText(i18next.t("partyUiHandler:releaseInBattle"), null, () => this.showText("", 0), null, true); } @@ -527,21 +664,25 @@ export default class PartyUiHandler extends MessageUiHandler { } else if (option === PartyOption.RENAME) { this.clearOptions(); ui.playSelect(); - ui.setModeWithoutClear(Mode.RENAME_POKEMON, { - buttonActions: [ - (nickname: string) => { - ui.playSelect(); - pokemon.nickname = nickname; - pokemon.updateInfo(); - this.clearPartySlots(); - this.populatePartySlots(); - ui.setMode(Mode.PARTY); - }, - () => { - ui.setMode(Mode.PARTY); - } - ] - }, pokemon); + ui.setModeWithoutClear( + Mode.RENAME_POKEMON, + { + buttonActions: [ + (nickname: string) => { + ui.playSelect(); + pokemon.nickname = nickname; + pokemon.updateInfo(); + this.clearPartySlots(); + this.populatePartySlots(); + ui.setMode(Mode.PARTY); + }, + () => { + ui.setMode(Mode.PARTY); + }, + ], + }, + pokemon, + ); return true; } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); @@ -556,40 +697,54 @@ export default class PartyUiHandler extends MessageUiHandler { } else { switch (button) { case Button.LEFT: - /** Decrease quantity for the current item and update UI */ + /** Decrease quantity for the current item and update UI */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === 1 ? this.transferQuantitiesMax[option] : this.transferQuantities[option] - 1; + this.transferQuantities[option] = + this.transferQuantities[option] === 1 + ? this.transferQuantitiesMax[option] + : this.transferQuantities[option] - 1; this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ + success = this.setCursor( + this.optionsCursor, + ); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ } break; case Button.RIGHT: - /** Increase quantity for the current item and update UI */ + /** Increase quantity for the current item and update UI */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === this.transferQuantitiesMax[option] ? 1 : this.transferQuantities[option] + 1; + this.transferQuantities[option] = + this.transferQuantities[option] === this.transferQuantitiesMax[option] + ? 1 + : this.transferQuantities[option] + 1; this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ + success = this.setCursor( + this.optionsCursor, + ); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ } break; case Button.UP: - /** If currently selecting items to transfer, reset quantity selection */ + /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { if (option !== PartyOption.ALL) { this.transferQuantities[option] = this.transferQuantitiesMax[option]; } this.updateOptions(); } - success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); /** Move cursor */ + success = this.setCursor( + this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1, + ); /** Move cursor */ break; case Button.DOWN: - /** If currently selecting items to transfer, reset quantity selection */ + /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { if (option !== PartyOption.ALL) { this.transferQuantities[option] = this.transferQuantitiesMax[option]; } this.updateOptions(); } - success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); /** Move cursor */ + success = this.setCursor( + this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0, + ); /** Move cursor */ break; } @@ -611,8 +766,12 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.cursor < 6) { if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) { /** Initialize item quantities for the selected Pokemon */ - const itemModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === globalScene.getPlayerParty()[this.cursor].id) as PokemonHeldItemModifier[]; + const itemModifiers = globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + m.isTransferable && + m.pokemonId === globalScene.getPlayerParty()[this.cursor].id, + ) as PokemonHeldItemModifier[]; this.transferQuantities = itemModifiers.map(item => item.getStackCount()); this.transferQuantitiesMax = itemModifiers.map(item => item.getStackCount()); } @@ -624,8 +783,12 @@ export default class PartyUiHandler extends MessageUiHandler { return this.processInput(Button.CANCEL); } return true; - } else if (button === Button.CANCEL) { - if ((this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.SPLICE) && this.transferMode) { + } + if (button === Button.CANCEL) { + if ( + (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.SPLICE) && + this.transferMode + ) { this.clearTransfer(); ui.playSelect(); } else if (this.partyUiMode !== PartyUiMode.FAINT_SWITCH && this.partyUiMode !== PartyUiMode.REVIVAL_BLESSING) { @@ -648,10 +811,10 @@ export default class PartyUiHandler extends MessageUiHandler { switch (button) { case Button.UP: - success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); + success = this.setCursor(this.cursor ? (this.cursor < 6 ? this.cursor - 1 : slotCount - 1) : 6); break; case Button.DOWN: - success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); + 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) { @@ -662,11 +825,13 @@ export default class PartyUiHandler extends MessageUiHandler { if (slotCount === battlerCount) { success = this.setCursor(6); break; - } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { + } + if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { success = this.setCursor(2); break; - } else if (slotCount > battlerCount && this.cursor < battlerCount) { - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + } + if (slotCount > battlerCount && this.cursor < battlerCount) { + success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); break; } } @@ -692,7 +857,7 @@ export default class PartyUiHandler extends MessageUiHandler { } for (const p in party) { - const slotIndex = parseInt(p); + const slotIndex = Number.parseInt(p); const partySlot = new PartySlot(slotIndex, party[p], this.iconAnimHandler, this.partyUiMode, this.tmMoveId); globalScene.add.existing(partySlot); this.partySlotsContainer.add(partySlot); @@ -714,7 +879,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsScrollCursor = cursor ? this.optionsScrollTotal - 8 : 0; this.updateOptions(); } else { - const isDown = cursor && cursor > this.optionsCursor; + const isDown = cursor && cursor > this.optionsCursor; if (isDown) { if (this.options[cursor] === PartyOption.SCROLL_DOWN) { isScroll = true; @@ -741,7 +906,10 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsCursorObj.setOrigin(0, 0); this.optionsContainer.add(this.optionsCursorObj); } - this.optionsCursorObj.setPosition(8 - this.optionsBg.displayWidth, -19 - (16 * ((this.options.length - 1) - this.optionsCursor))); + this.optionsCursorObj.setPosition( + 8 - this.optionsBg.displayWidth, + -19 - 16 * (this.options.length - 1 - this.optionsCursor), + ); } else { changed = this.cursor !== cursor; if (changed) { @@ -763,7 +931,14 @@ export default class PartyUiHandler extends MessageUiHandler { return changed; } - showText(text: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { if (text.length === 0) { text = defaultMessage; } @@ -821,19 +996,20 @@ export default class PartyUiHandler extends MessageUiHandler { updateOptions(): void { const pokemon = globalScene.getPlayerParty()[this.cursor]; - const learnableLevelMoves = this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER - ? pokemon.getLearnableLevelMoves() - : []; + const learnableLevelMoves = + this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER ? pokemon.getLearnableLevelMoves() : []; if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && learnableLevelMoves?.length) { // show the move overlay with info for the first move this.moveInfoOverlay.show(allMoves[learnableLevelMoves[0]]); } - const itemModifiers = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER - ? globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[] - : []; + const itemModifiers = + this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER + ? (globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id, + ) as PokemonHeldItemModifier[]) + : []; if (this.options.length) { this.options.splice(0, this.options.length); @@ -843,27 +1019,40 @@ export default class PartyUiHandler extends MessageUiHandler { let formChangeItemModifiers: PokemonFormChangeItemModifier[] | undefined; - if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { + if ( + this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && + this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && + (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER) + ) { switch (this.partyUiMode) { case PartyUiMode.SWITCH: case PartyUiMode.FAINT_SWITCH: case PartyUiMode.POST_BATTLE_SWITCH: if (this.cursor >= globalScene.currentBattle.getBattlerCount()) { const allowBatonModifierSwitch = - this.partyUiMode !== PartyUiMode.FAINT_SWITCH - && globalScene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === globalScene.getPlayerField()[this.fieldIndex].id); + this.partyUiMode !== PartyUiMode.FAINT_SWITCH && + globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === globalScene.getPlayerField()[this.fieldIndex].id, + ); const moveHistory = globalScene.getPlayerField()[this.fieldIndex].getMoveHistory(); - const isBatonPassMove = this.partyUiMode === PartyUiMode.FAINT_SWITCH && moveHistory.length && allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; + const isBatonPassMove = + this.partyUiMode === PartyUiMode.FAINT_SWITCH && + moveHistory.length && + allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && + moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; // isBatonPassMove and allowBatonModifierSwitch shouldn't ever be true // at the same time, because they both explicitly check for a mutually // exclusive partyUiMode. But better safe than sorry. - this.options.push(isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT); + this.options.push( + isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT, + ); if (allowBatonModifierSwitch && !isBatonPassMove) { - // the BATON modifier gives an extra switch option for - // pokemon-command switches, allowing buffs to be optionally passed + // the BATON modifier gives an extra switch option for + // pokemon-command switches, allowing buffs to be optionally passed this.options.push(PartyOption.PASS_BATON); } } @@ -909,7 +1098,12 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.POKEDEX); this.options.push(PartyOption.RENAME); - if ((pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)))) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || + (pokemon.isFusion() && + pokemon.fusionSpecies && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)) + ) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); } @@ -941,7 +1135,10 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsScrollTotal = this.options.length; let optionStartIndex = this.optionsScrollCursor; - let optionEndIndex = Math.min(this.optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.optionsScrollCursor + 8 >= this.optionsScrollTotal ? 8 : 7)); + let optionEndIndex = Math.min( + this.optionsScrollTotal, + optionStartIndex + (!optionStartIndex || this.optionsScrollCursor + 8 >= this.optionsScrollTotal ? 8 : 7), + ); this.optionsScroll = this.optionsScrollTotal > 9; @@ -977,7 +1174,11 @@ export default class PartyUiHandler extends MessageUiHandler { optionName = "↑"; } else if (option === PartyOption.SCROLL_DOWN) { optionName = "↓"; - } else if ((this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || option === PartyOption.CANCEL) { + } else if ( + (this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && + (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || + option === PartyOption.CANCEL + ) { switch (option) { case PartyOption.MOVE_1: case PartyOption.MOVE_2: @@ -1010,7 +1211,10 @@ export default class PartyUiHandler extends MessageUiHandler { } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const move = learnableLevelMoves[option]; optionName = allMoves[move].name; - altText = !pokemon.getSpeciesForm().getLevelMoves().find(plm => plm[1] === move); + altText = !pokemon + .getSpeciesForm() + .getLevelMoves() + .find(plm => plm[1] === move); } else if (option === PartyOption.ALL) { optionName = i18next.t("partyUiHandler:ALL"); } else { @@ -1028,7 +1232,13 @@ export default class PartyUiHandler extends MessageUiHandler { /** For every item that has stack bigger than 1, display the current quantity selection */ const itemModifier = itemModifiers[option]; - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && this.transferQuantitiesMax[option] > 1 && !this.transferMode && itemModifier !== undefined && itemModifier.type.name === optionName) { + if ( + this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && + this.transferQuantitiesMax[option] > 1 && + !this.transferMode && + itemModifier !== undefined && + itemModifier.type.name === optionName + ) { let amountText = ` (${this.transferQuantities[option]})`; /** If the amount held is the maximum, display the count in red */ @@ -1076,68 +1286,103 @@ export default class PartyUiHandler extends MessageUiHandler { } doRelease(slotIndex: number): void { - this.showText(this.getReleaseMessage(getPokemonNameWithAffix(globalScene.getPlayerParty()[slotIndex])), null, () => { - this.clearPartySlots(); - globalScene.removePartyMemberModifiers(slotIndex); - const releasedPokemon = globalScene.getPlayerParty().splice(slotIndex, 1)[0]; - releasedPokemon.destroy(); - this.populatePartySlots(); - if (this.cursor >= globalScene.getPlayerParty().length) { - this.setCursor(this.cursor - 1); - } - if (this.partyUiMode === PartyUiMode.RELEASE) { - const selectCallback = this.selectCallback; - this.selectCallback = null; - selectCallback && selectCallback(this.cursor, PartyOption.RELEASE); - } - this.showText("", 0); - }, null, true); + this.showText( + this.getReleaseMessage(getPokemonNameWithAffix(globalScene.getPlayerParty()[slotIndex])), + null, + () => { + this.clearPartySlots(); + globalScene.removePartyMemberModifiers(slotIndex); + const releasedPokemon = globalScene.getPlayerParty().splice(slotIndex, 1)[0]; + releasedPokemon.destroy(); + this.populatePartySlots(); + if (this.cursor >= globalScene.getPlayerParty().length) { + this.setCursor(this.cursor - 1); + } + if (this.partyUiMode === PartyUiMode.RELEASE) { + const selectCallback = this.selectCallback; + this.selectCallback = null; + selectCallback?.(this.cursor, PartyOption.RELEASE); + } + this.showText("", 0); + }, + null, + true, + ); } getReleaseMessage(pokemonName: string): string { const rand = Utils.randInt(128); if (rand < 20) { return i18next.t("partyUiHandler:goodbye", { pokemonName: pokemonName }); - } else if (rand < 40) { - return i18next.t("partyUiHandler:byebye", { pokemonName: pokemonName }); - } else if (rand < 60) { - return i18next.t("partyUiHandler:farewell", { pokemonName: pokemonName }); - } else if (rand < 80) { - return i18next.t("partyUiHandler:soLong", { pokemonName: pokemonName }); - } else if (rand < 100) { - return i18next.t("partyUiHandler:thisIsWhereWePart", { pokemonName: pokemonName }); - } else if (rand < 108) { - return i18next.t("partyUiHandler:illMissYou", { pokemonName: pokemonName }); - } else if (rand < 116) { - return i18next.t("partyUiHandler:illNeverForgetYou", { pokemonName: pokemonName }); - } else if (rand < 124) { - return i18next.t("partyUiHandler:untilWeMeetAgain", { pokemonName: pokemonName }); - } else if (rand < 127) { - return i18next.t("partyUiHandler:sayonara", { pokemonName: pokemonName }); - } else { - return i18next.t("partyUiHandler:smellYaLater", { pokemonName: pokemonName }); } + if (rand < 40) { + return i18next.t("partyUiHandler:byebye", { pokemonName: pokemonName }); + } + if (rand < 60) { + return i18next.t("partyUiHandler:farewell", { pokemonName: pokemonName }); + } + if (rand < 80) { + return i18next.t("partyUiHandler:soLong", { pokemonName: pokemonName }); + } + if (rand < 100) { + return i18next.t("partyUiHandler:thisIsWhereWePart", { + pokemonName: pokemonName, + }); + } + if (rand < 108) { + return i18next.t("partyUiHandler:illMissYou", { + pokemonName: pokemonName, + }); + } + if (rand < 116) { + return i18next.t("partyUiHandler:illNeverForgetYou", { + pokemonName: pokemonName, + }); + } + if (rand < 124) { + return i18next.t("partyUiHandler:untilWeMeetAgain", { + pokemonName: pokemonName, + }); + } + if (rand < 127) { + return i18next.t("partyUiHandler:sayonara", { pokemonName: pokemonName }); + } + return i18next.t("partyUiHandler:smellYaLater", { + pokemonName: pokemonName, + }); } getFormChangeItemsModifiers(pokemon: Pokemon) { - let formChangeItemModifiers = globalScene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - const ultraNecrozmaModifiers = formChangeItemModifiers.filter(m => m.active && m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + let formChangeItemModifiers = globalScene.findModifiers( + m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[]; + const ultraNecrozmaModifiers = formChangeItemModifiers.filter( + m => m.active && m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z, + ); if (ultraNecrozmaModifiers.length > 0) { // ULTRANECROZIUM_Z is active and deactivating it should be the only option return ultraNecrozmaModifiers; } if (formChangeItemModifiers.find(m => m.active)) { // a form is currently active. the user has to disable the form or activate ULTRANECROZIUM_Z - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active || m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + formChangeItemModifiers = formChangeItemModifiers.filter( + m => m.active || m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z, + ); } else if (pokemon.species.speciesId === Species.NECROZMA) { // no form is currently active. the user has to activate some form, except ULTRANECROZIUM_Z - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.formChangeItem !== FormChangeItem.ULTRANECROZIUM_Z); + formChangeItemModifiers = formChangeItemModifiers.filter( + m => m.formChangeItem !== FormChangeItem.ULTRANECROZIUM_Z, + ); } return formChangeItemModifiers; } getOptionsCursorWithScroll(): number { - return this.optionsCursor + this.optionsScrollCursor + (this.options && this.options[0] === PartyOption.SCROLL_UP ? -1 : 0); + return ( + this.optionsCursor + + this.optionsScrollCursor + + (this.options && this.options[0] === PartyOption.SCROLL_UP ? -1 : 0) + ); } clearOptions() { @@ -1193,10 +1438,22 @@ class PartySlot extends Phaser.GameObjects.Container { private pokemonIcon: Phaser.GameObjects.Container; private iconAnimHandler: PokemonIconAnimHandler; - constructor(slotIndex: number, pokemon: PlayerPokemon, iconAnimHandler: PokemonIconAnimHandler, partyUiMode: PartyUiMode, tmMoveId: Moves) { - super(globalScene, slotIndex >= globalScene.currentBattle.getBattlerCount() ? 230.5 : 64, - slotIndex >= globalScene.currentBattle.getBattlerCount() ? -184 + (globalScene.currentBattle.double ? -40 : 0) - + (28 + (globalScene.currentBattle.double ? 8 : 0)) * slotIndex : -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64); + constructor( + slotIndex: number, + pokemon: PlayerPokemon, + iconAnimHandler: PokemonIconAnimHandler, + partyUiMode: PartyUiMode, + tmMoveId: Moves, + ) { + super( + globalScene, + slotIndex >= globalScene.currentBattle.getBattlerCount() ? 230.5 : 64, + slotIndex >= globalScene.currentBattle.getBattlerCount() + ? -184 + + (globalScene.currentBattle.double ? -40 : 0) + + (28 + (globalScene.currentBattle.double ? 8 : 0)) * slotIndex + : -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64, + ); this.slotIndex = slotIndex; this.pokemon = pokemon; @@ -1210,7 +1467,6 @@ class PartySlot extends Phaser.GameObjects.Container { } setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { - const currentLanguage = i18next.resolvedLanguage ?? "en"; const offsetJa = currentLanguage === "ja"; @@ -1223,7 +1479,11 @@ class PartySlot extends Phaser.GameObjects.Container { this.add(slotBg); - const slotPb = globalScene.add.sprite(this.slotIndex >= battlerCount ? -85.5 : -51, this.slotIndex >= battlerCount ? 0 : -20.5, "party_pb"); + const slotPb = globalScene.add.sprite( + this.slotIndex >= battlerCount ? -85.5 : -51, + this.slotIndex >= battlerCount ? 0 : -20.5, + "party_pb", + ); this.slotPb = slotPb; this.add(slotPb); @@ -1243,7 +1503,7 @@ class PartySlot extends Phaser.GameObjects.Container { const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.PARTY); nameTextWidth = nameSizeTest.displayWidth; - while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : (76 - (this.pokemon.fusionSpecies ? 8 : 0)))) { + while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : 76 - (this.pokemon.fusionSpecies ? 8 : 0))) { displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; @@ -1252,18 +1512,31 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY); - this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, (this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0)); + this.slotName.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 21 : 24, + (this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0), + ); this.slotName.setOrigin(0, 0); const slotLevelLabel = globalScene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(slotBg, (this.slotIndex >= battlerCount ? 21 : 24) + 8, (this.slotIndex >= battlerCount ? 2 : 10) + 12); + slotLevelLabel.setPositionRelative( + slotBg, + (this.slotIndex >= battlerCount ? 21 : 24) + 8, + (this.slotIndex >= battlerCount ? 2 : 10) + 12, + ); slotLevelLabel.setOrigin(0, 0); - const slotLevelText = addTextObject(0, 0, this.pokemon.level.toString(), this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); + const slotLevelText = addTextObject( + 0, + 0, + this.pokemon.level.toString(), + this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED, + ); slotLevelText.setPositionRelative(slotLevelLabel, 9, offsetJa ? 1.5 : 0); slotLevelText.setOrigin(0, 0.25); - slotInfoContainer.add([ this.slotName, slotLevelLabel, slotLevelText ]); + slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText]); const genderSymbol = getGenderSymbol(this.pokemon.getGender(true)); @@ -1324,29 +1597,46 @@ class PartySlot extends Phaser.GameObjects.Container { } this.slotHpBar = globalScene.add.image(0, 0, "party_slot_hp_bar"); - this.slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); + this.slotHpBar.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 72 : 8, + this.slotIndex >= battlerCount ? 6 : 31, + ); this.slotHpBar.setOrigin(0, 0); this.slotHpBar.setVisible(false); const hpRatio = this.pokemon.getHpRatio(); - this.slotHpOverlay = globalScene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); + this.slotHpOverlay = globalScene.add.sprite( + 0, + 0, + "party_slot_hp_overlay", + hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low", + ); this.slotHpOverlay.setPositionRelative(this.slotHpBar, 16, 2); this.slotHpOverlay.setOrigin(0, 0); this.slotHpOverlay.setScale(hpRatio, 1); this.slotHpOverlay.setVisible(false); this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2 + (offsetJa ? 2 : 0)); + this.slotHpText.setPositionRelative( + this.slotHpBar, + this.slotHpBar.width - 3, + this.slotHpBar.height - 2 + (offsetJa ? 2 : 0), + ); this.slotHpText.setOrigin(1, 0); this.slotHpText.setVisible(false); this.slotDescriptionLabel = addTextObject(0, 0, "", TextStyle.MESSAGE); - this.slotDescriptionLabel.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 94 : 32, this.slotIndex >= battlerCount ? 16 : 46); + this.slotDescriptionLabel.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 94 : 32, + this.slotIndex >= battlerCount ? 16 : 46, + ); this.slotDescriptionLabel.setOrigin(0, 1); this.slotDescriptionLabel.setVisible(false); - slotInfoContainer.add([ this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel ]); + slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]); if (partyUiMode !== PartyUiMode.TM_MODIFIER) { this.slotDescriptionLabel.setVisible(false); @@ -1369,7 +1659,6 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotDescriptionLabel.setText(slotTmText); this.slotDescriptionLabel.setVisible(true); - } } @@ -1408,8 +1697,10 @@ class PartySlot extends Phaser.GameObjects.Container { private updateSlotTexture(): void { const battlerCount = globalScene.currentBattle.getBattlerCount(); - this.slotBg.setTexture(`party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`, - `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`); + this.slotBg.setTexture( + `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`, + `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`, + ); } } diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index 0c913d195a9..0bf47699cdb 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -10,17 +10,39 @@ export default 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.game.canvas.width / 6 : 0, player ? -72 : -144); this.player = player; } setup(): void { - this.bg = globalScene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? "player" : "enemy"}`, undefined, 104, 4, 48, 8, 0, 0); + this.bg = globalScene.add.nineslice( + 0, + 0, + `pb_tray_overlay_${this.player ? "player" : "enemy"}`, + undefined, + 104, + 4, + 48, + 8, + 0, + 0, + ); this.bg.setOrigin(this.player ? 1 : 0, 0); this.add(this.bg); - this.balls = new Array(6).fill(null).map((_, i) => globalScene.add.sprite((this.player ? -83 : 76) + (globalScene.game.canvas.width / 6) * (this.player ? -1 : 1) + 10 * i * (this.player ? 1 : -1), -8, "pb_tray_ball", "empty")); + this.balls = new Array(6) + .fill(null) + .map((_, i) => + globalScene.add.sprite( + (this.player ? -83 : 76) + + (globalScene.game.canvas.width / 6) * (this.player ? -1 : 1) + + 10 * i * (this.player ? 1 : -1), + -8, + "pb_tray_ball", + "empty", + ), + ); for (const ball of this.balls) { ball.setOrigin(0, 0); @@ -71,10 +93,10 @@ export default class PokeballTray extends Phaser.GameObjects.Container { x: `${this.player ? "-" : "+"}=104`, duration: b * 100, ease: "Sine.easeIn", - onComplete: () => globalScene.playSound(`se/${(b < party.length ? "pb_tray_ball" : "pb_tray_empty")}`) + onComplete: () => globalScene.playSound(`se/${b < party.length ? "pb_tray_ball" : "pb_tray_empty"}`), }); }); - } + }, }); this.setVisible(true); @@ -96,7 +118,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { x: `${this.player ? "-" : "+"}=${globalScene.game.canvas.width / 6}`, duration: 250, delay: b * 100, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); }); @@ -105,7 +127,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { width: 144, alpha: 0, duration: 500, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); globalScene.time.delayedCall(850, () => { diff --git a/src/ui/pokedex-info-overlay.ts b/src/ui/pokedex-info-overlay.ts index fe0b47b57e0..7dfa3745cb7 100644 --- a/src/ui/pokedex-info-overlay.ts +++ b/src/ui/pokedex-info-overlay.ts @@ -6,16 +6,16 @@ import i18next from "i18next"; import { globalScene } from "#app/global-scene"; 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; - /** Default is always half the screen, regardless of scale */ - width?: number; - /** Determines whether to display the small secondary box */ - hideEffectBox?: boolean; - hideBg?: boolean; + 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; + /** Default is always half the screen, regardless of scale */ + width?: number; + /** Determines whether to display the small secondary box */ + hideEffectBox?: boolean; + hideBg?: boolean; } const DESC_HEIGHT = 48; @@ -23,10 +23,10 @@ const BORDER = 8; const GLOBAL_SCALE = 6; export default class PokedexInfoOverlay extends Phaser.GameObjects.Container implements InfoToggle { - public active: boolean = false; + public active = false; private desc: Phaser.GameObjects.Text; - private descScroll : Phaser.Tweens.Tween | null = null; + private descScroll: Phaser.Tweens.Tween | null = null; private descBg: Phaser.GameObjects.NineSlice; @@ -52,7 +52,9 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp this.add(this.descBg); // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected - this.desc = addTextObject(BORDER, BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (this.width - (BORDER - 2) * 2) * GLOBAL_SCALE }}); + this.desc = addTextObject(BORDER, BORDER - 2, "", TextStyle.BATTLE_INFO, { + wordWrap: { width: (this.width - (BORDER - 2) * 2) * GLOBAL_SCALE }, + }); this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); // limit the text rendering, required for scrolling later on @@ -67,10 +69,13 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp } this.textMaskRect = globalScene.make.graphics(); - this.textMaskRect.fillStyle(0xFF0000); + 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.scale, + this.maskPointOriginY + (BORDER - 2) * this.scale, + this.width - BORDER * 2 * this.scale, + (DESC_HEIGHT - (BORDER - 2) * 2) * this.scale, + ); this.textMaskRect.setScale(6); const textMask = this.createGeometryMask(this.textMaskRect); @@ -86,7 +91,7 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp } // show this component with infos for the specific move - show(text: string):boolean { + show(text: string): boolean { if (!globalScene.enableMoveInfo) { return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` } @@ -101,16 +106,16 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp } // determine if we need to add new scrolling effects - const lineCount = Math.floor(this.desc.displayHeight * (96 / 72) / 14.83); + const lineCount = Math.floor((this.desc.displayHeight * (96 / 72)) / 14.83); - const newHeight = lineCount >= 3 ? 48 : (lineCount === 2 ? 36 : 24); + const newHeight = lineCount >= 3 ? 48 : lineCount === 2 ? 36 : 24; this.textMaskRect.clear(); - this.textMaskRect.fillStyle(0xFF0000); + 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.width - BORDER * 2 * this.scale, + (newHeight - (BORDER - 2) * 2) * this.scale, ); const updatedMask = this.createGeometryMask(this.textMaskRect); this.desc.setMask(updatedMask); @@ -127,7 +132,7 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((lineCount - 3) * 2000), - y: `-=${14.83 * (72 / 96) * (lineCount - 3)}` + y: `-=${14.83 * (72 / 96) * (lineCount - 3)}`, }); } @@ -151,7 +156,7 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp targets: this.desc, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); if (!visible) { this.setVisible(false); @@ -163,12 +168,12 @@ export default class PokedexInfoOverlay extends Phaser.GameObjects.Container imp } // width of this element - static getWidth(scale:number):number { + static getWidth(_scale: number): number { return globalScene.game.canvas.width / GLOBAL_SCALE / 2; } // height of this element - static getHeight(scale:number, onSide?: boolean):number { + static getHeight(scale: number, _onSide?: boolean): number { return DESC_HEIGHT * scale; } } diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts index 1bcfafc0766..e61da86e95e 100644 --- a/src/ui/pokedex-mon-container.ts +++ b/src/ui/pokedex-mon-container.ts @@ -4,12 +4,11 @@ import { isNullOrUndefined } from "#app/utils"; import type PokemonSpecies from "../data/pokemon-species"; import { addTextObject, TextStyle } from "./text"; - interface SpeciesDetails { - shiny?: boolean, - formIndex?: number - female?: boolean, - variant?: Variant + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; } export class PokedexMonContainer extends Phaser.GameObjects.Container { @@ -31,7 +30,7 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { public passive2Icon: Phaser.GameObjects.Image; public passive1OverlayIcon: Phaser.GameObjects.Image; public passive2OverlayIcon: Phaser.GameObjects.Image; - public cost: number = 0; + public cost = 0; constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { super(globalScene, 0, 0); @@ -57,7 +56,9 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.add(this.shinyIcons); // value label - const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { fontSize: "32px" }); + const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { + fontSize: "32px", + }); label.setShadowOffset(2, 2); label.setOrigin(0, 0); label.setVisible(false); @@ -136,7 +137,6 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.add(tmMove2Icon); this.tmMove2Icon = tmMove2Icon; - // passive icons const passive1Icon = globalScene.add.image(3, 3, "candy"); passive1Icon.setOrigin(0, 0); @@ -169,7 +169,6 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { } setSpecies(species: PokemonSpecies, options: SpeciesDetails = {}) { - this.species = species; const { shiny, formIndex, female, variant } = options; @@ -196,10 +195,16 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { } // icon - this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon = globalScene.add.sprite( + -2, + 2, + species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.icon.setScale(0.5); this.icon.setOrigin(0, 0); - this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setFrame( + species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); this.add(this.icon); } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 6b6c2c89933..74921f13683 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -21,8 +21,8 @@ import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/bal import { starterPassiveAbilities } from "#app/data/balance/passives"; import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; -import type { DexEntry, StarterAttributes } from "#app/system/game-data"; -import { AbilityAttr, DexAttr } from "#app/system/game-data"; +import type { DexEntry, StarterAttributes } from "#app/system/game-data"; +import { AbilityAttr, DexAttr } from "#app/system/game-data"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { StatsContainer } from "#app/ui/stats-container"; @@ -42,8 +42,20 @@ import type { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { EggSourceType } from "#enums/egg-source-types"; -import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; -import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; +import { + BooleanHolder, + getLocalizedSpriteKey, + isNullOrUndefined, + NumberHolder, + padInt, + rgbHexToRgba, + toReadableString, +} from "#app/utils"; import type { Nature } from "#enums/nature"; import * as Utils from "../utils"; import { speciesTmMoves } from "#app/data/balance/tms"; @@ -55,61 +67,60 @@ import type { Abilities } from "#app/enums/abilities"; import { BaseStatsOverlay } from "#app/ui/base-stats-overlay"; import { globalScene } from "#app/global-scene"; - interface LanguageSetting { - starterInfoTextSize: string, - instructionTextSize: string, - starterInfoXPos?: number, - starterInfoYOffset?: number + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; } const languageSettings: { [key: string]: LanguageSetting } = { - "en":{ + en: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "de":{ + de: { starterInfoTextSize: "48px", instructionTextSize: "35px", starterInfoXPos: 33, }, - "es-ES":{ + "es-ES": { starterInfoTextSize: "56px", instructionTextSize: "35px", }, - "fr":{ + fr: { starterInfoTextSize: "54px", instructionTextSize: "38px", }, - "it":{ + it: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "pt_BR":{ + pt_BR: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoXPos: 33, }, - "zh":{ + zh: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoYOffset: 1, starterInfoXPos: 24, }, - "pt":{ + pt: { starterInfoTextSize: "48px", instructionTextSize: "42px", starterInfoXPos: 33, }, - "ko":{ + ko: { starterInfoTextSize: "52px", instructionTextSize: "38px", }, - "ja":{ + ja: { starterInfoTextSize: "51px", instructionTextSize: "38px", }, - "ca-ES":{ + "ca-ES": { starterInfoTextSize: "56px", instructionTextSize: "38px", }, @@ -121,10 +132,10 @@ const valueReductionMax = 2; const speciesContainerX = 109; interface SpeciesDetails { - shiny?: boolean, - formIndex?: number - female?: boolean, - variant?: number, + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: number; } enum MenuOptions { @@ -136,10 +147,9 @@ enum MenuOptions { BIOMES, NATURES, TOGGLE_IVS, - EVOLUTIONS + EVOLUTIONS, } - export default class PokedexPageUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; private shinyOverlay: Phaser.GameObjects.Image; @@ -162,7 +172,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; private pokemonCaughtCountText: Phaser.GameObjects.Text; private pokemonFormText: Phaser.GameObjects.Text; - private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcons: Phaser.GameObjects.Sprite[]; @@ -232,17 +242,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private starterAttributes: StarterAttributes; private savedStarterAttributes: StarterAttributes; - protected blockInput: boolean = false; - protected blockInputOverlay: boolean = false; + protected blockInput = false; + protected blockInputOverlay = false; - private showBackSprite: boolean = false; + private showBackSprite = false; // Menu private menuContainer: Phaser.GameObjects.Container; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; private menuOptions: MenuOptions[]; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; private menuDescriptions: string[]; private isFormGender: boolean; private filteredIndices: Species[] | null = null; @@ -266,7 +276,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { 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, 0x006860); + 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); @@ -287,7 +303,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonGrowthRateLabelText = addTextObject(8, 106, i18next.t("pokedexUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }); + this.pokemonGrowthRateLabelText = addTextObject( + 8, + 106, + i18next.t("pokedexUiHandler:growthRate"), + TextStyle.SUMMARY_ALT, + { fontSize: "36px" }, + ); this.pokemonGrowthRateLabelText.setOrigin(0, 0); this.pokemonGrowthRateLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); @@ -300,7 +322,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonGenderText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGenderText); - this.pokemonUncaughtText = addTextObject(6, 127, i18next.t("pokedexUiHandler:uncaught"), TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonUncaughtText = addTextObject(6, 127, i18next.t("pokedexUiHandler:uncaught"), TextStyle.WINDOW, { + fontSize: "56px", + }); this.pokemonUncaughtText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonUncaughtText); @@ -318,7 +342,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.starterSelectContainer.add(starterBoxContainer); this.pokemonSprite = globalScene.add.sprite(53, 63, "pkmn__sub"); - this.pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.starterSelectContainer.add(this.pokemonSprite); this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); @@ -331,11 +358,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { + fontSize: "56px", + }); this.pokemonLuckLabelText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckLabelText); - this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { + fontSize: "56px", + }); this.pokemonLuckText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckText); @@ -356,7 +387,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyDarknessOverlay.setScale(0.5); this.pokemonCandyDarknessOverlay.setOrigin(0, 0); this.pokemonCandyDarknessOverlay.setTint(0x000000); - this.pokemonCandyDarknessOverlay.setAlpha(0.50); + this.pokemonCandyDarknessOverlay.setAlpha(0.5); this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); @@ -366,7 +397,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonCandyContainer); - this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px" }); + this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { + fontSize: "42px", + }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); @@ -410,48 +443,110 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.instructionsContainer.setVisible(true); this.starterSelectContainer.add(this.instructionsContainer); - this.candyUpgradeIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "C.png"); + this.candyUpgradeIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "C.png", + ); this.candyUpgradeIconElement.setName("sprite-candyUpgrade-icon-element"); this.candyUpgradeIconElement.setScale(0.675); this.candyUpgradeIconElement.setOrigin(0.0, 0.0); - this.candyUpgradeLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:candyUpgrade"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.candyUpgradeLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:candyUpgrade"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.candyUpgradeLabel.setName("text-candyUpgrade-label"); // 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 = 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.shinyLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleShiny"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + 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.formLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleForm"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.formLabel.setName("text-form-label"); - this.genderIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + 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.genderLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleGender"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.genderLabel.setName("text-gender-label"); - this.variantIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "V.png", + ); this.variantIconElement.setName("sprite-variant-icon-element"); this.variantIconElement.setScale(0.675); this.variantIconElement.setOrigin(0.0, 0.0); - this.variantLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.variantLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleVariant"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.variantLabel.setName("text-variant-label"); this.showBackSpriteIconElement = new Phaser.GameObjects.Sprite(globalScene, 50, 7, "keyboard", "E.png"); this.showBackSpriteIconElement.setName("show-backSprite-icon-element"); this.showBackSpriteIconElement.setScale(0.675); this.showBackSpriteIconElement.setOrigin(0.0, 0.0); - this.showBackSpriteLabel = addTextObject(60, 7, i18next.t("pokedexUiHandler:showBackSprite"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.showBackSpriteLabel = addTextObject(60, 7, i18next.t("pokedexUiHandler:showBackSprite"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); this.showBackSpriteLabel.setName("show-backSprite-label"); this.starterSelectContainer.add(this.showBackSpriteIconElement); this.starterSelectContainer.add(this.showBackSpriteLabel); @@ -485,17 +580,25 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.statsContainer); - // Adding menu container 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), Phaser.Geom.Rectangle.Contains); + this.menuContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); this.menuContainer.setVisible(false); - this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => Number.parseInt(MenuOptions[m]) as MenuOptions); - this.optionSelectText = addTextObject(0, 0, this.menuOptions.map(o => `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); + this.optionSelectText = addTextObject( + 0, + 0, + this.menuOptions.map(o => `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`).join("\n"), + TextStyle.WINDOW, + { maxLines: this.menuOptions.length }, + ); this.optionSelectText.setLineSpacing(12); this.menuDescriptions = [ @@ -507,15 +610,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { i18next.t("pokedexUiHandler:showBiomes"), i18next.t("pokedexUiHandler:showNatures"), i18next.t("pokedexUiHandler:toggleIVs"), - i18next.t("pokedexUiHandler:showEvolutions") + i18next.t("pokedexUiHandler:showEvolutions"), ]; this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.menuBg = addWindow( - (globalScene.game.canvas.width / 6 - 83), + globalScene.game.canvas.width / 6 - 83, 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, - (globalScene.game.canvas.height / 6) - 2 + globalScene.game.canvas.height / 6 - 2, ); this.menuBg.setOrigin(0, 0); @@ -529,9 +632,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.menuContainer); - // adding base stats - this.baseStatsOverlay = new BaseStatsOverlay({ x: 317, y: 0, width:133 }); + this.baseStatsOverlay = new BaseStatsOverlay({ x: 317, y: 0, width: 133 }); this.menuContainer.add(this.baseStatsOverlay); this.menuContainer.bringToTop(this.baseStatsOverlay); @@ -557,19 +659,24 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - // Allow the use of candies if we are in one of the whitelisted phases - this.canUseCandies = [ "TitlePhase", "SelectStarterPhase", "CommandPhase" ].includes(globalScene.getCurrentPhase()?.constructor.name ?? ""); + this.canUseCandies = ["TitlePhase", "SelectStarterPhase", "CommandPhase"].includes( + globalScene.getCurrentPhase()?.constructor.name ?? "", + ); if (args.length >= 1 && args[0] === "refresh") { return false; - } else { - this.species = args[0]; - this.formIndex = args[1] ?? 0; - this.savedStarterAttributes = args[2] ?? { shiny:false, female:true, variant:0, form:0 }; - this.filteredIndices = args[3] ?? null; - this.starterSetup(); } + this.species = args[0]; + this.formIndex = args[1] ?? 0; + this.savedStarterAttributes = args[2] ?? { + shiny: false, + female: true, + variant: 0, + form: 0, + }; + this.filteredIndices = args[3] ?? null; + this.starterSetup(); this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers this.infoOverlay.clear(); @@ -581,7 +688,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.starterAttributes = this.initStarterPrefs(); - this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => Number.parseInt(MenuOptions[m]) as MenuOptions); this.menuContainer.setVisible(true); @@ -592,11 +699,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.setCursor(0); return true; - } starterSetup(): void { - this.evolutions = []; this.prevolutions = []; this.battleForms = []; @@ -605,7 +710,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { let formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; this.isFormGender = formKey === "male" || formKey === "female"; - if (this.isFormGender && ((this.savedStarterAttributes.female === true && formKey === "male") || (this.savedStarterAttributes.female === false && formKey === "female"))) { + if ( + this.isFormGender && + ((this.savedStarterAttributes.female === true && formKey === "male") || + (this.savedStarterAttributes.female === false && formKey === "female")) + ) { this.formIndex = (this.formIndex + 1) % 2; formKey = this.species.forms[this.formIndex].formKey; } @@ -614,26 +723,32 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.starterId = this.getStarterSpeciesId(this.species.speciesId); - const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) ? pokemonEvolutions[species.speciesId] : []; + const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) + ? pokemonEvolutions[species.speciesId] + : []; if (species.forms.length > 0) { const form = species.forms[formIndex]; // If this form has a specific set of moves, we get them. - this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; + this.levelMoves = + formIndex > 0 && + pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && + pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex) + ? pokemonFormLevelMoves[species.speciesId][formIndex] + : pokemonSpeciesLevelMoves[species.speciesId]; this.ability1 = form.ability1; - this.ability2 = (form.ability2 === form.ability1) ? undefined : form.ability2; - this.abilityHidden = (form.abilityHidden === form.ability1) ? undefined : form.abilityHidden; + this.ability2 = form.ability2 === form.ability1 ? undefined : form.ability2; + this.abilityHidden = form.abilityHidden === form.ability1 ? undefined : form.abilityHidden; - this.evolutions = allEvolutions.filter(e => (e.preFormKey === form.formKey || e.preFormKey === null)); + this.evolutions = allEvolutions.filter(e => e.preFormKey === form.formKey || e.preFormKey === null); this.baseStats = form.baseStats; this.baseTotal = form.baseTotal; - } else { this.levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; this.ability1 = species.ability1; - this.ability2 = (species.ability2 === species.ability1) ? undefined : species.ability2; - this.abilityHidden = (species.abilityHidden === species.ability1) ? undefined : species.abilityHidden; + this.ability2 = species.ability2 === species.ability1 ? undefined : species.ability2; + this.abilityHidden = species.abilityHidden === species.ability1 ? undefined : species.abilityHidden; this.evolutions = allEvolutions; this.baseStats = species.baseStats; @@ -641,15 +756,24 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } this.eggMoves = speciesEggMoves[this.starterId] ?? []; - this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0); + this.hasEggMoves = Array.from( + { length: 4 }, + (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0, + ); - this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) - .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; + this.tmMoves = + speciesTmMoves[species.speciesId] + ?.filter(m => (Array.isArray(m) ? m[0] === formKey : true)) + .map(m => (Array.isArray(m) ? m[1] : m)) + .sort((a, b) => (allMoves[a].name > allMoves[b].name ? 1 : -1)) ?? []; - const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : - starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) + ? species.speciesId + : starterPassiveAbilities.hasOwnProperty(this.starterId) + ? this.starterId + : pokemonPrevolutions[this.starterId]; const passives = starterPassiveAbilities[passiveId]; - this.passive = (this.formIndex in passives) ? passives[formIndex] : passives[0]; + this.passive = this.formIndex in passives ? passives[formIndex] : passives[0]; const starterData = globalScene.gameData.starterData[this.starterId]; const abilityAttr = starterData.abilityAttr; @@ -659,41 +783,42 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; - this.hasAbilities = [ - hasAbility1, - hasAbility2, - hasHiddenAbility - ]; + this.hasAbilities = [hasAbility1, hasAbility2, hasHiddenAbility]; const allBiomes = catchableSpecies[species.speciesId] ?? []; this.preBiomes = this.sanitizeBiomes( - (catchableSpecies[this.starterId] ?? []) - .filter(b => !allBiomes.some(bm => (b.biome === bm.biome && b.tier === bm.tier)) && !(b.biome === Biome.TOWN)), - this.starterId); + (catchableSpecies[this.starterId] ?? []).filter( + b => !allBiomes.some(bm => b.biome === bm.biome && b.tier === bm.tier) && !(b.biome === Biome.TOWN), + ), + this.starterId, + ); this.biomes = this.sanitizeBiomes(allBiomes, species.speciesId); - const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; - this.battleForms = allFormChanges.filter(f => (f.preFormKey === this.species.forms[this.formIndex].formKey)); + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) + ? pokemonFormChanges[species.speciesId] + : []; + this.battleForms = allFormChanges.filter(f => f.preFormKey === this.species.forms[this.formIndex].formKey); - const preSpecies = pokemonPrevolutions.hasOwnProperty(this.species.speciesId) ? allSpecies.find(sp => sp.speciesId === pokemonPrevolutions[this.species.speciesId]) : null; + const preSpecies = pokemonPrevolutions.hasOwnProperty(this.species.speciesId) + ? allSpecies.find(sp => sp.speciesId === pokemonPrevolutions[this.species.speciesId]) + : null; if (preSpecies) { - const preEvolutions = pokemonEvolutions.hasOwnProperty(preSpecies.speciesId) ? pokemonEvolutions[preSpecies.speciesId] : []; + const preEvolutions = pokemonEvolutions.hasOwnProperty(preSpecies.speciesId) + ? pokemonEvolutions[preSpecies.speciesId] + : []; this.prevolutions = preEvolutions.filter( - e => e.speciesId === species.speciesId && ( - ( - (e.evoFormKey === "" || e.evoFormKey === null) && - ( - // This takes care of Cosplay Pikachu (Pichu is not shown) - (preSpecies.forms.some(form => form.formKey === species.forms[formIndex]?.formKey)) || + e => + e.speciesId === species.speciesId && + (((e.evoFormKey === "" || e.evoFormKey === null) && + // This takes care of Cosplay Pikachu (Pichu is not shown) + (preSpecies.forms.some(form => form.formKey === species.forms[formIndex]?.formKey) || // This takes care of Gholdengo (preSpecies.forms.length > 0 && species.forms.length === 0) || // This takes care of everything else - (preSpecies.forms.length === 0 && (species.forms.length === 0 || species.forms[formIndex]?.formKey === "")) - ) - ) - // This takes care of Burmy, Shellos etc - || e.evoFormKey === species.forms[formIndex]?.formKey - ) + (preSpecies.forms.length === 0 && + (species.forms.length === 0 || species.forms[formIndex]?.formKey === "")))) || + // This takes care of Burmy, Shellos etc + e.evoFormKey === species.forms[formIndex]?.formKey), ); } @@ -702,7 +827,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Function to ensure that forms appear in the appropriate biome and tod sanitizeBiomes(biomes: BiomeTierTod[], speciesId: number): BiomeTierTod[] { - if (speciesId === Species.BURMY || speciesId === Species.WORMADAM) { return biomes.filter(b => { const formIndex = (() => { @@ -717,8 +841,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { })(); return this.formIndex === formIndex; }); - - } else if (speciesId === Species.ROTOM) { + } + if (speciesId === Species.ROTOM) { return biomes.filter(b => { const formIndex = (() => { switch (b.biome) { @@ -738,8 +862,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { })(); return this.formIndex === formIndex; }); - - } else if (speciesId === Species.LYCANROC) { + } + if (speciesId === Species.LYCANROC) { return biomes.filter(b => { const formIndex = (() => { switch (b.tod[0]) { @@ -781,7 +905,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { * @returns StarterAttributes for the species */ isFormCaught(otherSpecies?: PokemonSpecies, otherFormIndex?: number | undefined): boolean { - if (globalScene.dexForDevs) { return true; } @@ -806,7 +929,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { * @returns StarterAttributes for the species */ initStarterPrefs(): StarterAttributes { - const starterAttributes : StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; + const starterAttributes: StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; const caughtAttr = this.isCaught(); // no preferences or Pokemon wasn't caught, return empty attribute @@ -828,9 +951,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.unlockedVariants = [ !!(hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT), !!(hasShiny && caughtAttr & DexAttr.VARIANT_2), - !!(hasShiny && caughtAttr & DexAttr.VARIANT_3) + !!(hasShiny && caughtAttr & DexAttr.VARIANT_3), ]; - if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { + if ( + starterAttributes.variant === undefined || + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 + ) { starterAttributes.variant = 0; } else if (!this.unlockedVariants[starterAttributes.variant]) { let highestValidIndex = -1; @@ -844,7 +971,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } if (starterAttributes.female !== undefined) { - if ((starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || (!starterAttributes.female && !(caughtAttr & DexAttr.MALE))) { + if ( + (starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || + (!starterAttributes.female && !(caughtAttr & DexAttr.MALE)) + ) { starterAttributes.female = !starterAttributes.female; } } else { @@ -858,7 +988,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return starterAttributes; } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number, moveToTop?: boolean) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + moveToTop?: boolean, + ) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); const singleLine = text?.indexOf("\n") === -1; @@ -900,25 +1038,22 @@ export default class PokedexPageUiHandler extends MessageUiHandler { */ getStarterSpeciesId(speciesId): number { if (speciesId === Species.PIKACHU) { - if ([ 0, 1, 8 ].includes(this.formIndex)) { + if ([0, 1, 8].includes(this.formIndex)) { return Species.PICHU; - } else { - return Species.PIKACHU; } + return Species.PIKACHU; } if (speciesStarterCosts.hasOwnProperty(speciesId)) { return speciesId; - } else { - return pokemonStarters[speciesId]; } + return pokemonStarters[speciesId]; } getStarterSpecies(species): PokemonSpecies { if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { return species; - } else { - return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species; } + return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species; } processInput(button: Button): boolean { @@ -940,7 +1075,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.baseStatsOverlay.clear(); ui.showText(""); return true; - } else if (button === Button.UP || button === Button.DOWN) { + } + if (button === Button.UP || button === Button.DOWN) { this.blockInputOverlay = false; this.baseStatsOverlay.clear(); ui.showText(""); @@ -960,26 +1096,20 @@ export default class PokedexPageUiHandler extends MessageUiHandler { success = true; } } else { - const starterData = globalScene.gameData.starterData[this.starterId]; // prepare persistent starter data to store changes const starterAttributes = this.starterAttributes; if (button === Button.ACTION) { - switch (this.cursor) { - case MenuOptions.BASE_STATS: - if (!isCaught || !isFormCaught) { error = true; } else { - this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { ui.showText(i18next.t("pokedexUiHandler:showBaseStats"), null, () => { - this.baseStatsOverlay.show(this.baseStats, this.baseTotal); this.blockInput = false; @@ -993,55 +1123,54 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.LEVEL_MOVES: - if (!isCaught || !isFormCaught) { error = true; } else { - this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { ui.showText(i18next.t("pokedexUiHandler:showLevelMoves"), null, () => { - this.moveInfoOverlay.show(allMoves[this.levelMoves[0][1]]); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: this.levelMoves.map(m => { - const levelNumber = m[0] > 0 ? String(m[0]) : ""; - const option: OptionSelectItem = { - label: levelNumber.padEnd(4, " ") + allMoves[m[1]].name, + options: this.levelMoves + .map(m => { + const levelNumber = m[0] > 0 ? String(m[0]) : ""; + const option: OptionSelectItem = { + label: levelNumber.padEnd(4, " ") + allMoves[m[1]].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m[1]]); + if (m[0] === 0) { + this.showText(i18next.t("pokedexUiHandler:onlyEvolutionMove")); + } else if (m[0] === -1) { + this.showText(i18next.t("pokedexUiHandler:onlyRecallMove")); + } else if (m[0] <= 5) { + this.showText(i18next.t("pokedexUiHandler:onStarterSelectMove")); + } else { + this.showText(i18next.t("pokedexUiHandler:byLevelUpMove")); + } + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), handler: () => { - return false; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; }, onHover: () => { - this.moveInfoOverlay.show(allMoves[m[1]]); - if (m[0] === 0) { - this.showText(i18next.t("pokedexUiHandler:onlyEvolutionMove")); - } else if (m[0] === -1) { - this.showText(i18next.t("pokedexUiHandler:onlyRecallMove")); - } else if (m[0] <= 5) { - this.showText(i18next.t("pokedexUiHandler:onStarterSelectMove")); - } else { - this.showText(i18next.t("pokedexUiHandler:byLevelUpMove")); - } + this.moveInfoOverlay.clear(); }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.moveInfoOverlay.clear(); - this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), + }), supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1052,16 +1181,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.EGG_MOVES: - - if (!isCaught || !isFormCaught) { error = true; } else { - this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { - if (this.eggMoves.length === 0) { ui.showText(i18next.t("pokedexUiHandler:noEggMoves")); this.blockInput = false; @@ -1069,7 +1194,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } ui.showText(i18next.t("pokedexUiHandler:showEggMoves"), null, () => { - this.moveInfoOverlay.show(allMoves[this.eggMoves[0]]); ui.setModeWithoutClear(Mode.OPTION_SELECT, { @@ -1079,26 +1203,26 @@ export default class PokedexPageUiHandler extends MessageUiHandler { skip: true, style: TextStyle.MONEY_WINDOW, handler: () => false, // Non-selectable, but handler is required - onHover: () => this.moveInfoOverlay.clear() // No hover behavior for titles + onHover: () => this.moveInfoOverlay.clear(), // No hover behavior for titles }, ...this.eggMoves.slice(0, 3).map((m, i) => ({ label: allMoves[m].name, style: this.hasEggMoves[i] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.moveInfoOverlay.show(allMoves[m]) + onHover: () => this.moveInfoOverlay.show(allMoves[m]), })), { label: i18next.t("pokedexUiHandler:rare"), skip: true, style: TextStyle.MONEY_WINDOW, handler: () => false, - onHover: () => this.moveInfoOverlay.clear() + onHover: () => this.moveInfoOverlay.clear(), }, { label: allMoves[this.eggMoves[3]].name, style: this.hasEggMoves[3] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.moveInfoOverlay.show(allMoves[this.eggMoves[3]]) + onHover: () => this.moveInfoOverlay.show(allMoves[this.eggMoves[3]]), }, { label: i18next.t("menu:cancel"), @@ -1108,12 +1232,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, "refresh"); return true; }, - onHover: () => this.moveInfoOverlay.clear() - } + onHover: () => this.moveInfoOverlay.clear(), + }, ], supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1124,7 +1248,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.TM_MOVES: - if (!isCaught || !isFormCaught) { error = true; } else if (this.tmMoves.length < 1) { @@ -1135,36 +1258,37 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { ui.showText(i18next.t("pokedexUiHandler:showTmMoves"), null, () => { - this.moveInfoOverlay.show(allMoves[this.tmMoves[0]]); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: this.tmMoves.map(m => { - const option: OptionSelectItem = { - label: allMoves[m].name, + options: this.tmMoves + .map(m => { + const option: OptionSelectItem = { + label: allMoves[m].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), handler: () => { - return false; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; }, onHover: () => { - this.moveInfoOverlay.show(allMoves[m]); + this.moveInfoOverlay.clear(); }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.moveInfoOverlay.clear(); - this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), + }), supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1175,17 +1299,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.ABILITIES: - if (!isCaught || !isFormCaught) { error = true; } else { - this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { - ui.showText(i18next.t("pokedexUiHandler:showAbilities"), null, () => { - this.infoOverlay.show(allAbilities[this.ability1].description); const options: any[] = []; @@ -1193,18 +1313,18 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.ability1) { options.push({ label: allAbilities[this.ability1].name, - style: this.hasAbilities[0] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + style: this.hasAbilities[0] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.infoOverlay.show(allAbilities[this.ability1].description) + onHover: () => this.infoOverlay.show(allAbilities[this.ability1].description), }); } if (this.ability2) { const ability = allAbilities[this.ability2]; options.push({ label: ability?.name, - style: this.hasAbilities[1] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + style: this.hasAbilities[1] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.infoOverlay.show(ability?.description) + onHover: () => this.infoOverlay.show(ability?.description), }); } @@ -1214,14 +1334,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { skip: true, style: TextStyle.MONEY_WINDOW, handler: () => false, - onHover: () => this.infoOverlay.clear() + onHover: () => this.infoOverlay.clear(), }); const ability = allAbilities[this.abilityHidden]; options.push({ label: allAbilities[this.abilityHidden].name, - style: this.hasAbilities[2] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + style: this.hasAbilities[2] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.infoOverlay.show(ability?.description) + onHover: () => this.infoOverlay.show(ability?.description), }); } @@ -1231,13 +1351,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { skip: true, style: TextStyle.MONEY_WINDOW, handler: () => false, - onHover: () => this.infoOverlay.clear() + onHover: () => this.infoOverlay.clear(), }); options.push({ label: allAbilities[this.passive].name, - style: this.hasPassive ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + style: this.hasPassive ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, handler: () => false, - onHover: () => this.infoOverlay.show(allAbilities[this.passive].description) + onHover: () => this.infoOverlay.show(allAbilities[this.passive].description), }); } @@ -1249,14 +1369,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, "refresh"); return true; }, - onHover: () => this.infoOverlay.clear() + onHover: () => this.infoOverlay.clear(), }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1267,16 +1387,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.BIOMES: - if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { error = true; } else { this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { - - if ((!this.biomes || this.biomes?.length === 0) && - (!this.preBiomes || this.preBiomes?.length === 0)) { + if ((!this.biomes || this.biomes?.length === 0) && (!this.preBiomes || this.preBiomes?.length === 0)) { ui.showText(i18next.t("pokedexUiHandler:noBiomes")); ui.playError(); this.blockInput = false; @@ -1286,29 +1403,39 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const options: any[] = []; ui.showText(i18next.t("pokedexUiHandler:showBiomes"), null, () => { - this.biomes.map(b => { options.push({ - label: i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + " - " + + label: + i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + + " - " + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + - ( b.tod.length === 1 && b.tod[0] === -1 ? "" : " (" + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + ")"), - handler: () => false + (b.tod.length === 1 && b.tod[0] === -1 + ? "" + : " (" + + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + + ")"), + handler: () => false, }); }); - if (this.preBiomes.length > 0) { options.push({ label: i18next.t("pokedexUiHandler:preBiomes"), skip: true, - handler: () => false + handler: () => false, }); this.preBiomes.map(b => { options.push({ - label: i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + " - " + + label: + i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + + " - " + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + - ( b.tod.length === 1 && b.tod[0] === -1 ? "" : " (" + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + ")"), - handler: () => false + (b.tod.length === 1 && b.tod[0] === -1 + ? "" + : " (" + + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + + ")"), + handler: () => false, }); }); } @@ -1321,14 +1448,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, "refresh"); return true; }, - onHover: () => this.moveInfoOverlay.clear() + onHover: () => this.moveInfoOverlay.clear(), }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1339,20 +1466,19 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.EVOLUTIONS: - if (!isCaught || !isFormCaught) { error = true; } else { - this.blockInput = true; ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { - const options: any[] = []; - if ((!this.prevolutions || this.prevolutions?.length === 0) && - (!this.evolutions || this.evolutions?.length === 0) && - (!this.battleForms || this.battleForms?.length === 0)) { + if ( + (!this.prevolutions || this.prevolutions?.length === 0) && + (!this.evolutions || this.evolutions?.length === 0) && + (!this.battleForms || this.battleForms?.length === 0) + ) { ui.showText(i18next.t("pokedexUiHandler:noEvolutions")); ui.playError(); this.blockInput = false; @@ -1360,28 +1486,36 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } ui.showText(i18next.t("pokedexUiHandler:showEvolutions"), null, () => { - if (this.prevolutions?.length > 0) { options.push({ label: i18next.t("pokedexUiHandler:prevolutions"), style: TextStyle.MONEY_WINDOW, skip: true, - handler: () => false + handler: () => false, }); this.prevolutions.map(pre => { - const preSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[this.species.speciesId]); - const preFormIndex: number = preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0; + const preSpecies = allSpecies.find( + species => species.speciesId === pokemonPrevolutions[this.species.speciesId], + ); + const preFormIndex: number = + preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0; const conditionText: string = pre.description; options.push({ - label: pre.preFormKey ? - (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) : - (preSpecies ?? this.species).getExpandedSpeciesName(), + label: pre.preFormKey + ? (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) + : (preSpecies ?? this.species).getExpandedSpeciesName(), handler: () => { - const newSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[pre.speciesId]); + const newSpecies = allSpecies.find( + species => species.speciesId === pokemonPrevolutions[pre.speciesId], + ); // Attempts to find the formIndex of the prevolved species - const newFormKey = pre.preFormKey ? pre.preFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); + const newFormKey = pre.preFormKey + ? pre.preFormKey + : this.species.forms.length > 0 + ? this.species.forms[this.formIndex].formKey + : ""; const matchingForm = newSpecies?.forms.find(form => form.formKey === newFormKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; @@ -1391,7 +1525,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); return true; }, - onHover: () => this.showText(conditionText) + onHover: () => this.showText(conditionText), }); }); } @@ -1401,13 +1535,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { label: i18next.t("pokedexUiHandler:evolutions"), style: TextStyle.MONEY_WINDOW, skip: true, - handler: () => false + handler: () => false, }); this.evolutions.map(evo => { const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId); - const isCaughtEvo = this.isCaught(evoSpecies) ? true : false; + const isCaughtEvo = !!this.isCaught(evoSpecies); // Attempts to find the formIndex of the evolved species - const newFormKey = evo.evoFormKey ? evo.evoFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); + const newFormKey = evo.evoFormKey + ? evo.evoFormKey + : this.species.forms.length > 0 + ? this.species.forms[this.formIndex].formKey + : ""; const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; const isFormCaughtEvo = this.isFormCaught(evoSpecies, newFormIndex); @@ -1415,9 +1553,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const conditionText: string = evo.description; options.push({ - label: evo.evoFormKey ? - (evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) : - (evoSpecies ?? this.species).getExpandedSpeciesName(), + label: evo.evoFormKey + ? (evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) + : (evoSpecies ?? this.species).getExpandedSpeciesName(), style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, handler: () => { this.starterAttributes.form = newFormIndex; @@ -1427,7 +1565,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, evoSpecies, newFormIndex, this.savedStarterAttributes); return true; }, - onHover: () => this.showText(conditionText) + onHover: () => this.showText(conditionText), }); }); } @@ -1437,13 +1575,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { label: i18next.t("pokedexUiHandler:forms"), style: TextStyle.MONEY_WINDOW, skip: true, - handler: () => false + handler: () => false, }); this.battleForms.map(bf => { const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; - let conditionText:string = ""; + let conditionText = ""; if (bf.trigger) { conditionText = bf.trigger.description; } else { @@ -1466,10 +1604,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); + ui.setMode( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); return true; }, - onHover: () => this.showText(conditionText) + onHover: () => this.showText(conditionText), }); } }); @@ -1483,14 +1627,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setMode(Mode.POKEDEX_PAGE, "refresh"); return true; }, - onHover: () => this.moveInfoOverlay.clear() + onHover: () => this.moveInfoOverlay.clear(), }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; @@ -1501,7 +1645,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.TOGGLE_IVS: - if (!isCaught || !isFormCaught) { error = true; } else { @@ -1512,7 +1655,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { break; case MenuOptions.NATURES: - if (!isCaught || !isFormCaught) { error = true; } else { @@ -1521,25 +1663,27 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.showText(i18next.t("pokedexUiHandler:showNature"), null, () => { const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: natures.map((n: Nature, i: number) => { - const option: OptionSelectItem = { - label: getNatureName(n, true, true, true, globalScene.uiTheme), + options: natures + .map((n: Nature, _i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, globalScene.uiTheme), + handler: () => { + return false; + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), handler: () => { - return false; - } - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, "refresh"); - this.blockInput = false; - return true; - } - }), + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + this.blockInput = false; + return true; + }, + }), maxOptions: 8, - yOffset: 19 + yOffset: 19, }); }); }); @@ -1547,17 +1691,21 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } break; } - } else { - const props = globalScene.gameData.getSpeciesDexAttrProps(this.species, this.getCurrentDexProps(this.species.speciesId)); + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.species, + this.getCurrentDexProps(this.species.speciesId), + ); switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { - if (!starterAttributes.shiny) { // Change to shiny, we need to get the proper default variant - const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : 0; - this.setSpeciesDetails(this.species, { shiny: true, variant: newVariant }); + const newVariant = starterAttributes.variant ? (starterAttributes.variant as Variant) : 0; + this.setSpeciesDetails(this.species, { + shiny: true, + variant: newVariant, + }); globalScene.playSound("se/sparkle"); @@ -1584,13 +1732,18 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = newVariant; // store the selected variant this.savedStarterAttributes.variant = starterAttributes.variant; - if ((this.isCaught() & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { - this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); + if (this.isCaught() & DexAttr.NON_SHINY && newVariant <= props.variant) { + this.setSpeciesDetails(this.species, { + shiny: false, + variant: 0, + }); success = true; starterAttributes.shiny = false; this.savedStarterAttributes.shiny = starterAttributes.shiny; } else { - this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); + this.setSpeciesDetails(this.species, { + variant: newVariant as Variant, + }); success = true; } } @@ -1602,7 +1755,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { let newFormIndex = this.formIndex; do { newFormIndex = (newFormIndex + 1) % formCount; - if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { // TODO: are those bangs correct? + if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { + // TODO: are those bangs correct? break; } } while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable); @@ -1617,7 +1771,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.female = newFemale; this.savedStarterAttributes.female = starterAttributes.female; this.starterSetup(); - this.setSpeciesDetails(this.species, { formIndex: newFormIndex, female: newFemale }); + this.setSpeciesDetails(this.species, { + formIndex: newFormIndex, + female: newFemale, + }); success = this.setCursor(this.cursor); } break; @@ -1634,7 +1791,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.form = starterAttributes.form; this.formIndex = newFormIndex; this.starterSetup(); - this.setSpeciesDetails(this.species, { female: !props.female, formIndex: newFormIndex }); + this.setSpeciesDetails(this.species, { + female: !props.female, + formIndex: newFormIndex, + }); success = true; } break; @@ -1675,7 +1835,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }, style: this.isPassiveAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, item: "candy", - itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : ["808080", "808080"], }); } @@ -1706,7 +1866,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }, style: this.isValueReductionAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, item: "candy", - itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : ["808080", "808080"], }); } @@ -1718,7 +1878,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { // Egg list full, show error message at the top of the screen and abort - this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); + this.showText( + i18next.t("egg:tooManyEggs"), + undefined, + () => this.showText("", 0, () => (this.tutorialActive = false)), + 2000, + false, + undefined, + true, + ); return false; } if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { @@ -1726,7 +1894,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - const egg = new Egg({ scene: globalScene, species: this.starterId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const egg = new Egg({ + scene: globalScene, + species: this.starterId, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); egg.addEggToGameData(); globalScene.gameData.saveSystem().then(success => { @@ -1743,18 +1915,18 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }, style: this.isSameSpeciesEggAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, item: "candy", - itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : ["808080", "808080"], }); options.push({ label: i18next.t("menu:cancel"), handler: () => { ui.setMode(Mode.POKEDEX_PAGE, "refresh"); return true; - } + }, }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, - yOffset: 47 + yOffset: 47, }); success = true; } @@ -1796,13 +1968,21 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; newSpecies = allSpecies[newIndex]; } - const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); + const matchingForm = newSpecies?.forms.find( + form => form.formKey === this.species?.forms[this.formIndex]?.formKey, + ); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); + ui.setModeForceTransition( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); }); this.blockInput = false; break; @@ -1818,13 +1998,21 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; newSpecies = allSpecies[newIndex]; } - const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); + const matchingForm = newSpecies?.forms.find( + form => form.formKey === this.species?.forms[this.formIndex]?.formKey, + ); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); + ui.setModeForceTransition( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); }); break; } @@ -1841,6 +2029,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let iconPath; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls @@ -1870,7 +2059,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); iconElement.setVisible(true); controlLabel.setVisible(true); - this.instructionsContainer.add([ iconElement, controlLabel ]); + this.instructionsContainer.add([iconElement, controlLabel]); this.instructionRowY += 8; if (this.instructionRowY >= 24) { this.instructionRowY = 8; @@ -1886,9 +2075,13 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.hideInstructions(); this.instructionsContainer.removeAll(); this.filterInstructionsContainer.removeAll(); + + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let gamepadType; if (globalScene.inputMethod === "gamepad") { - gamepadType = globalScene.inputController.getConfig(globalScene.inputController.selectedDevice[Device.GAMEPAD]).padType; + gamepadType = globalScene.inputController.getConfig( + globalScene.inputController.selectedDevice[Device.GAMEPAD], + ).padType; } else { gamepadType = globalScene.inputMethod; } @@ -1902,13 +2095,28 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.isCaught()) { if (isFormCaught) { if (this.canUseCandies) { - this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Stats, + gamepadType, + this.candyUpgradeIconElement, + this.candyUpgradeLabel, + ); } if (this.canCycleShiny) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Shiny, + gamepadType, + this.shinyIconElement, + this.shinyLabel, + ); } if (this.canCycleGender) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Gender, + gamepadType, + this.genderIconElement, + this.genderLabel, + ); } } else { // Making space for "Uncaught" text @@ -1936,7 +2144,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return valueLimit.value; } - setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); @@ -1962,7 +2169,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return ret; } - getFriendship(speciesId: number) { + getFriendship(_speciesId: number) { let currentFriendship = globalScene.gameData.starterData[this.starterId].friendship; if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; @@ -1981,8 +2188,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[this.starterId]; - return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId]) - && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); } /** @@ -1993,8 +2202,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[this.starterId]; - return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction] - && starterData.valueReduction < valueReductionMax; + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction] && + starterData.valueReduction < valueReductionMax + ); } /** @@ -2010,7 +2222,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { setSpecies() { const species = this.species; - const starterAttributes : StarterAttributes | null = species ? { ...this.starterAttributes } : null; + const starterAttributes: StarterAttributes | null = species ? { ...this.starterAttributes } : null; if (!species && globalScene.ui.getTooltip().visible) { globalScene.ui.hideTooltip(); @@ -2031,11 +2243,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonNumberText.setText(padInt(species.speciesId, 4)); if (this.isCaught()) { - const defaultDexAttr = this.getCurrentDexProps(species.speciesId); // Set default attributes if for some reason starterAttributes does not exist or attributes missing const props: StarterAttributes = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { + if (starterAttributes?.variant && !Number.isNaN(starterAttributes.variant)) { if (props.shiny) { props.variant = starterAttributes.variant as Variant; } @@ -2092,7 +2303,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); - this.setSpeciesDetails(species!, { // TODO: is this bang correct? + this.setSpeciesDetails(species!, { + // TODO: is this bang correct? shiny: false, formIndex: 0, female: false, @@ -2108,8 +2320,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences - const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) - || !isNullOrUndefined(formIndex) || !isNullOrUndefined(shiny) || !isNullOrUndefined(variant) || forceUpdate; + const shouldUpdateSprite = + (species?.genderDiffs && !isNullOrUndefined(female)) || + !isNullOrUndefined(formIndex) || + !isNullOrUndefined(shiny) || + !isNullOrUndefined(variant) || + forceUpdate; if (this.activeTooltip === "CANDY") { if (this.species && this.pokemonCandyContainer.visible) { @@ -2178,14 +2394,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); - this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); + this.pokemonNumberText.setShadowColor( + this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true), + ); const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; if (shouldUpdateSprite) { - const back = this.showBackSprite ? true : false; - species.loadAssets(female!, formIndex, shiny, variant as Variant, true, back).then(() => { // TODO: is this bang correct? + const back = !!this.showBackSprite; + species.loadAssets(female!, formIndex, shiny, variant as Variant, true, back).then(() => { + // TODO: is this bang correct? if (assetLoadCancelled.value) { return; } @@ -2194,7 +2413,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant, back)); // 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, back)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData( + "spriteKey", + species.getSpriteKey(female!, formIndex, shiny, variant, back), + ); // TODO: is this bang correct? this.pokemonSprite.setVisible(!this.statsMode); }); } else { @@ -2204,7 +2426,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + const caughtVariants = [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => caughtAttr & v, + ); this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); @@ -2212,8 +2436,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.canCycleGender = isMaleCaught && isFemaleCaught; // If the dev option for the dex is selected, all forms can be cycled through - this.canCycleForm = globalScene.dexForDevs ? species.forms.length > 1 : - species.forms.filter(f => f.isStarterSelectable).filter(f => f).length > 1; + this.canCycleForm = globalScene.dexForDevs + ? species.forms.length > 1 + : species.forms.filter(f => f.isStarterSelectable).filter(f => f).length > 1; if (caughtAttr && species.malePercent !== null) { const gender = !female ? Gender.MALE : Gender.FEMALE; @@ -2234,7 +2459,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { // Setting tint of the sprite if (isFormCaught) { this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => { - const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species; + const crier = + this.species.forms && this.species.forms.length > 0 + ? this.species.forms[formIndex ?? this.formIndex] + : this.species; crier.cry(); }); this.pokemonSprite.clearTint(); @@ -2261,7 +2489,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { let growthReadable = toReadableString(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); if (i18next.exists("growth:" + growthAux)) { - growthReadable = i18next.t("growth:" + growthAux as any); + growthReadable = i18next.t(("growth:" + growthAux) as any); } this.pokemonGrowthRateText.setText(growthReadable); @@ -2311,7 +2539,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); - this.pokemonCandyCountText.setText(`x${species.speciesId === Species.PIKACHU ? 0 : globalScene.gameData.starterData[this.starterId].candyCount}`); + this.pokemonCandyCountText.setText( + `x${species.speciesId === Species.PIKACHU ? 0 : globalScene.gameData.starterData[this.starterId].candyCount}`, + ); this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { @@ -2324,7 +2554,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonFormText.setY(42); const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); - const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); this.pokemonCandyContainer.on("pointerover", () => { @@ -2335,7 +2565,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { globalScene.ui.hideTooltip(); this.activeTooltip = undefined; }); - } } else { this.pokemonUncaughtText.setVisible(true); @@ -2391,7 +2620,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } } - /** * Creates a temporary dex attr props that will be used to display the correct shiny, variant, and form based on this.starterAttributes * @@ -2401,7 +2629,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { getCurrentDexProps(speciesId: number): bigint { let props = 0n; const species = allSpecies.find(sp => sp.speciesId === speciesId); - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); + const caughtAttr = + globalScene.gameData.dexData[speciesId].caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props @@ -2415,7 +2646,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. * If they're not there, it enables shiny state by default if any shiny was caught */ - if (this.starterAttributes?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterAttributes?.shiny !== false)) { + if ( + this.starterAttributes?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterAttributes?.shiny !== false) + ) { props += DexAttr.SHINY; if (this.starterAttributes?.variant !== undefined) { props += BigInt(Math.pow(2, this.starterAttributes?.variant)) * DexAttr.DEFAULT_VARIANT; @@ -2435,7 +2669,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { props += DexAttr.NON_SHINY; props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant } - if (this.starterAttributes?.form) { // this checks for the form of the pokemon + if (this.starterAttributes?.form) { + // this checks for the form of the pokemon props += BigInt(Math.pow(2, this.starterAttributes?.form)) * DexAttr.DEFAULT_FORM; } else { // Get the first unlocked form @@ -2509,9 +2744,18 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } } - checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { - console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + 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)); } diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index a0a430018ff..b34246b97d1 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -12,7 +12,6 @@ import { allSpecies } from "#app/data/pokemon-species"; import i18next from "i18next"; export default class PokedexScanUiHandler extends FormModalUiHandler { - keys: string[]; reducedKeys: string[]; parallelKeys: string[]; @@ -21,10 +20,6 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { abilityKeys: string[]; row: number; - constructor(mode) { - super(mode); - } - setup() { super.setup(); @@ -33,20 +28,20 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { this.abilityKeys = allAbilities.map(a => a.name); } - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return i18next.t("pokedexUiHandler:scanChooseOption"); } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 300; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("pokedexUiHandler:scanSelect"), i18next.t("pokedexUiHandler:scanCancel") ]; + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("pokedexUiHandler:scanSelect"), i18next.t("pokedexUiHandler:scanCancel")]; } getReadableErrorMessage(error: string): string { @@ -67,7 +62,7 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { case FilterTextRow.MOVE_2: { return [{ label: i18next.t("pokedexUiHandler:scanLabelMove") }]; } - case FilterTextRow.ABILITY_1:{ + case FilterTextRow.ABILITY_1: { return [{ label: i18next.t("pokedexUiHandler:scanLabelAbility") }]; } case FilterTextRow.ABILITY_2: { @@ -77,7 +72,6 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { return [{ label: "" }]; } } - } reduceKeys(): void { @@ -102,7 +96,6 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { } } - // args[2] is an index of FilterTextRow show(args: any[]): boolean { this.row = args[2]; @@ -120,7 +113,10 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { }, 50); input.on("keydown", (inputObject, evt: KeyboardEvent) => { - if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { + if ( + ["escape", "space"].some(v => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && + ui.getMode() === Mode.AUTO_COMPLETE + ) { // Delete autocomplete list and recovery focus. inputObject.on("blur", () => inputObject.node.focus(), { once: true }); ui.revertMode(); @@ -134,9 +130,11 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { } let options: OptionSelectItem[] = []; - const filteredKeys = this.reducedKeys.filter((command) => command.toLowerCase().includes(inputObject.text.toLowerCase())); + const filteredKeys = this.reducedKeys.filter(command => + command.toLowerCase().includes(inputObject.text.toLowerCase()), + ); if (inputObject.text !== "" && filteredKeys.length > 0) { - options = filteredKeys.slice(0).map((value) => { + options = filteredKeys.slice(0).map(value => { return { label: value, handler: () => { @@ -145,7 +143,7 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { } ui.revertMode(); return true; - } + }, }; }); } @@ -154,11 +152,10 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { const modalOpts = { options: options, maxOptions: 5, - modalContainer: this.modalContainer + modalContainer: this.modalContainer, }; ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts); } - }); if (super.show(args)) { @@ -170,7 +167,7 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { } else { this.inputs[0].text = args[1]; } - this.submitAction = (_) => { + this.submitAction = _ => { if (ui.getMode() === Mode.POKEDEX_SCAN) { this.sanitizeInputs(); const outputName = this.reducedKeys.includes(this.inputs[0].text) ? this.inputs[0].text : ""; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 85bc0ee40f6..f4cb9f51c16 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -12,7 +12,7 @@ import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUN import { catchableSpecies } from "#app/data/balance/biomes"; import { PokemonType } from "#enums/pokemon-type"; import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; -import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; +import { AbilityAttr, DexAttr, loadStarterPreferences, saveStarterPreferences } from "#app/system/game-data"; import MessageUiHandler from "#app/ui/message-ui-handler"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "#app/ui/text"; @@ -26,7 +26,11 @@ import { PokedexMonContainer } from "#app/ui/pokedex-mon-container"; import { DropDownColumn, FilterBar } from "#app/ui/filter-bar"; import { ScrollBar } from "#app/ui/scroll-bar"; import { Abilities } from "#enums/abilities"; -import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#app/utils"; import type { Nature } from "#enums/nature"; import { addWindow } from "./ui-theme"; @@ -42,66 +46,65 @@ import { Biome } from "#enums/biome"; import { globalScene } from "#app/global-scene"; interface LanguageSetting { - starterInfoTextSize: string, - instructionTextSize: string, - starterInfoXPos?: number, - starterInfoYOffset?: number + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; } const languageSettings: { [key: string]: LanguageSetting } = { - "en":{ + en: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "de":{ + de: { starterInfoTextSize: "48px", instructionTextSize: "35px", starterInfoXPos: 33, }, - "es-ES":{ + "es-ES": { starterInfoTextSize: "56px", instructionTextSize: "35px", }, - "fr":{ + fr: { starterInfoTextSize: "54px", instructionTextSize: "38px", }, - "it":{ + it: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "pt_BR":{ + pt_BR: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoXPos: 33, }, - "zh":{ + zh: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoYOffset: 1, starterInfoXPos: 24, }, - "pt":{ + pt: { starterInfoTextSize: "48px", instructionTextSize: "42px", starterInfoXPos: 33, }, - "ko":{ + ko: { starterInfoTextSize: "52px", instructionTextSize: "38px", }, - "ja":{ + ja: { starterInfoTextSize: "51px", instructionTextSize: "38px", }, - "ca-ES":{ + "ca-ES": { starterInfoTextSize: "56px", instructionTextSize: "38px", }, }; - -enum FilterTextOptions{ +enum FilterTextOptions { NAME, MOVE_1, MOVE_2, @@ -110,15 +113,15 @@ enum FilterTextOptions{ } interface ContainerData { - species: PokemonSpecies, - cost: number, - props: DexAttrProps, - eggMove1?: boolean, - eggMove2?: boolean, - tmMove1?: boolean, - tmMove2?: boolean, - passive1?: boolean, - passive2?: boolean, + species: PokemonSpecies; + cost: number; + props: DexAttrProps; + eggMove1?: boolean; + eggMove2?: boolean; + tmMove1?: boolean; + tmMove2?: boolean; + passive1?: boolean; + passive2?: boolean; } const valueReductionMax = 2; @@ -132,22 +135,22 @@ const speciesContainerX = 143; * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcStarterPosition(index: number): {x: number, y: number} { +function calcStarterPosition(index: number): { x: number; y: number } { const yOffset = 13; const height = 17; const x = (index % 9) * 18; - const y = yOffset + (Math.floor(index / 9)) * height; + const y = yOffset + Math.floor(index / 9) * height; return { x: x, y: y }; } interface SpeciesDetails { - shiny?: boolean, - formIndex?: number - female?: boolean, - variant?: Variant, - abilityIndex?: number, - natureIndex?: number, + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; + abilityIndex?: number; + natureIndex?: number; } export default class PokedexUiHandler extends MessageUiHandler { @@ -168,9 +171,9 @@ export default class PokedexUiHandler extends MessageUiHandler { private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; private filterMode: boolean; - private filterBarCursor: number = 0; + private filterBarCursor = 0; private scrollCursor: number; - private oldCursor: number = -1; + private oldCursor = -1; private allSpecies: PokemonSpecies[] = []; private lastSpecies: PokemonSpecies; @@ -186,7 +189,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private starterPreferences: StarterPreferences; - protected blockInput: boolean = false; + protected blockInput = false; // for text filters private readonly textPadding = 8; @@ -198,15 +201,15 @@ export default class PokedexUiHandler extends MessageUiHandler { protected manageDataConfig: OptionSelectConfig; private filterTextOptions: FilterTextOptions[]; protected optionSelectText: Phaser.GameObjects.Text; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; private menuBg: Phaser.GameObjects.NineSlice; private filterTextContainer: Phaser.GameObjects.Container; private filterText: FilterText; private filterTextMode: boolean; - private filterTextCursor: number = 0; + private filterTextCursor = 0; - private showDecorations: boolean = false; + private showDecorations = false; private goFilterIconElement1: Phaser.GameObjects.Sprite; private goFilterIconElement2: Phaser.GameObjects.Sprite; private goFilterLabel: Phaser.GameObjects.Text; @@ -221,8 +224,8 @@ export default class PokedexUiHandler extends MessageUiHandler { private trayRows: number; private trayColumns: number; private trayCursorObj: Phaser.GameObjects.Image; - private trayCursor: number = 0; - private showingTray: boolean = false; + private trayCursor = 0; + private showingTray = false; private showFormTrayIconElement: Phaser.GameObjects.Sprite; private showFormTrayLabel: Phaser.GameObjects.Text; private canShowFormTray: boolean; @@ -242,17 +245,26 @@ export default class PokedexUiHandler extends MessageUiHandler { 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, 0x006860); + 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 pokemonContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); - const pokemonContainerBg = globalScene.add.image(speciesContainerX + 1, filterBarHeight + 2, "starter_container_bg"); + const pokemonContainerBg = globalScene.add.image( + speciesContainerX + 1, + filterBarHeight + 2, + "starter_container_bg", + ); pokemonContainerBg.setOrigin(0, 0); this.starterSelectContainer.add(pokemonContainerBg); this.starterSelectContainer.add(pokemonContainerWindow); - // Create and initialise filter text fields this.filterTextContainer = globalScene.add.container(0, 0); this.filterText = new FilterText(1, filterBarHeight + 2, 140, 100, this.updateStarters); @@ -266,7 +278,6 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterTextContainer.add(this.filterText); this.starterSelectContainer.add(this.filterTextContainer); - // Create and initialise filter bar this.filterBarContainer = globalScene.add.container(0, 0); this.filterBar = new FilterBar(speciesContainerX, 1, 175, filterBarHeight, 2, 0, 6); @@ -287,7 +298,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter - const typeKeys = Object.keys(PokemonType).filter(v => isNaN(Number(v))); + const typeKeys = Object.keys(PokemonType).filter(v => Number.isNaN(Number(v))); const typeOptions: DropDownOption[] = []; typeKeys.forEach((type, index) => { if (index === 0 || index === 19) { @@ -296,17 +307,22 @@ export default class PokedexUiHandler extends MessageUiHandler { const typeSprite = globalScene.add.sprite(0, 0, getLocalizedSpriteKey("types")); typeSprite.setScale(0.5); typeSprite.setFrame(type.toLowerCase()); - typeOptions.push(new DropDownOption( index, new DropDownLabel("", typeSprite))); + typeOptions.push(new DropDownOption(index, new DropDownLabel("", typeSprite))); }); - this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); + this.filterBar.addFilter( + DropDownColumn.TYPES, + i18next.t("filterBar:typeFilter"), + new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5), + ); // biome filter, making an entry in the dropdown for each biome const biomeOptions = Object.values(Biome) - .filter((value) => typeof value === "number") // Filter numeric values from the enum - .map((biomeValue, index) => - new DropDownOption( index, new DropDownLabel(i18next.t(`biome:${Biome[biomeValue].toUpperCase()}`))) + .filter(value => typeof value === "number") // Filter numeric values from the enum + .map( + (biomeValue, index) => + new DropDownOption(index, new DropDownLabel(i18next.t(`biome:${Biome[biomeValue].toUpperCase()}`))), ); - biomeOptions.push(new DropDownOption( biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable")))); + biomeOptions.push(new DropDownOption(biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable")))); const biomeDropDown: DropDown = new DropDown(0, 0, biomeOptions, this.updateStarters, DropDownType.HYBRID); this.filterBar.addFilter(DropDownColumn.BIOME, i18next.t("filterBar:biomeFilter"), biomeDropDown); @@ -332,10 +348,14 @@ export default class PokedexUiHandler extends MessageUiHandler { new DropDownOption("SHINY2", new DropDownLabel("", shiny2Sprite)), new DropDownOption("SHINY", new DropDownLabel("", shiny1Sprite)), new DropDownOption("NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), - new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) + new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))), ]; - this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); + this.filterBar.addFilter( + DropDownColumn.CAUGHT, + i18next.t("filterBar:caughtFilter"), + new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID), + ); // unlocks filter const passiveLabels = [ @@ -359,7 +379,11 @@ export default class PokedexUiHandler extends MessageUiHandler { new DropDownOption("COST_REDUCTION", costReductionLabels), ]; - this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.UNLOCKS, + i18next.t("filterBar:unlocksFilter"), + new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL), + ); // misc filter const starters = [ @@ -398,19 +422,30 @@ export default class PokedexUiHandler extends MessageUiHandler { new DropDownOption("EGG", eggLabels), new DropDownOption("POKERUS", pokerusLabels), ]; - this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.MISC, + i18next.t("filterBar:miscFilter"), + new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL), + ); // sort filter const sortOptions = [ - new DropDownOption(SortCriteria.NUMBER, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)), + new DropDownOption( + SortCriteria.NUMBER, + new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON), + ), new DropDownOption(SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), new DropDownOption(SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), new DropDownOption(SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), new DropDownOption(SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))), new DropDownOption(SortCriteria.CAUGHT, new DropDownLabel(i18next.t("filterBar:sortByNumCaught"))), - new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))) + new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))), ]; - this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + this.filterBar.addFilter( + DropDownColumn.SORT, + i18next.t("filterBar:sortFilter"), + new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE), + ); this.filterBarContainer.add(this.filterBar); this.starterSelectContainer.add(this.filterBarContainer); @@ -433,7 +468,9 @@ export default class PokedexUiHandler extends MessageUiHandler { this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); + this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { + fontSize: textSettings.instructionTextSize, + }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); @@ -487,7 +524,10 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterSelectContainer.add(starterBoxContainer); this.pokemonSprite = globalScene.add.sprite(96, 143, "pkmn__sub"); - this.pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.starterSelectContainer.add(this.pokemonSprite); this.type1Icon = globalScene.add.sprite(10, 158, getLocalizedSpriteKey("types")); @@ -519,7 +559,9 @@ export default class PokedexUiHandler extends MessageUiHandler { this.goFilterIconElement2.setName("sprite-goFilter2-icon-element"); this.goFilterIconElement2.setScale(0.675); this.goFilterIconElement2.setOrigin(0.0, 0.0); - this.goFilterLabel = addTextObject(30, 2, i18next.t("pokedexUiHandler:goFilters"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.goFilterLabel = addTextObject(30, 2, i18next.t("pokedexUiHandler:goFilters"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); this.goFilterLabel.setName("text-goFilter-label"); this.starterSelectContainer.add(this.goFilterIconElement1); this.starterSelectContainer.add(this.goFilterIconElement2); @@ -529,7 +571,13 @@ export default class PokedexUiHandler extends MessageUiHandler { this.toggleDecorationsIconElement.setName("sprite-toggleDecorations-icon-element"); this.toggleDecorationsIconElement.setScale(0.675); this.toggleDecorationsIconElement.setOrigin(0.0, 0.0); - this.toggleDecorationsLabel = addTextObject(20, 10, i18next.t("pokedexUiHandler:toggleDecorations"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.toggleDecorationsLabel = addTextObject( + 20, + 10, + i18next.t("pokedexUiHandler:toggleDecorations"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.toggleDecorationsLabel.setName("text-toggleDecorations-label"); this.starterSelectContainer.add(this.toggleDecorationsIconElement); this.starterSelectContainer.add(this.toggleDecorationsLabel); @@ -538,7 +586,9 @@ export default class PokedexUiHandler extends MessageUiHandler { this.showFormTrayIconElement.setName("sprite-showFormTray-icon-element"); this.showFormTrayIconElement.setScale(0.675); this.showFormTrayIconElement.setOrigin(0.0, 0.0); - this.showFormTrayLabel = addTextObject(16, 168, i18next.t("pokedexUiHandler:showForms"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.showFormTrayLabel = addTextObject(16, 168, i18next.t("pokedexUiHandler:showForms"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); this.showFormTrayLabel.setName("text-showFormTray-label"); this.showFormTrayIconElement.setVisible(false); this.showFormTrayLabel.setVisible(false); @@ -561,9 +611,8 @@ export default class PokedexUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if (!this.starterPreferences) { - this.starterPreferences = StarterPrefs.load(); + this.starterPreferences = loadStarterPreferences(); } this.pokerusSpecies = getPokerusStarters(); @@ -626,29 +675,34 @@ export default class PokedexUiHandler extends MessageUiHandler { const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; if (starterAttributes.shiny && !hasShiny) { // shiny form wasn't unlocked, purging shiny and variant setting - delete starterAttributes.shiny; - delete starterAttributes.variant; + + starterAttributes.shiny = undefined; + starterAttributes.variant = undefined; } else if (starterAttributes.shiny === false && !hasNonShiny) { // non shiny form wasn't unlocked, purging shiny setting - delete starterAttributes.shiny; + starterAttributes.shiny = undefined; } if (starterAttributes.variant !== undefined) { const unlockedVariants = [ hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + hasShiny && caughtAttr & DexAttr.VARIANT_3, ]; - if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0 || !unlockedVariants[starterAttributes.variant]) { + if ( + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 || + !unlockedVariants[starterAttributes.variant] + ) { // variant value is invalid or requested variant wasn't unlocked, purging setting - delete starterAttributes.variant; + starterAttributes.variant = undefined; } } if (starterAttributes.female !== undefined) { if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) { // requested gender wasn't unlocked, purging setting - delete starterAttributes.female; + starterAttributes.female = undefined; } } @@ -663,25 +717,29 @@ export default class PokedexUiHandler extends MessageUiHandler { const unlockedAbilities = [ hasAbility1, speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2, - hasHiddenAbility + hasHiddenAbility, ]; if (!unlockedAbilities[starterAttributes.ability]) { // requested ability wasn't unlocked, purging setting - delete starterAttributes.ability; + starterAttributes.ability = undefined; } } const selectedForm = starterAttributes.form; - if (selectedForm !== undefined && (!species.forms[selectedForm]?.isStarterSelectable || !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm)))) { + if ( + selectedForm !== undefined && + (!species.forms[selectedForm]?.isStarterSelectable || + !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm))) + ) { // requested form wasn't unlocked/isn't a starter form, purging setting - delete starterAttributes.form; + starterAttributes.form = undefined; } if (starterAttributes.nature !== undefined) { const unlockedNatures = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr); if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) { // requested nature wasn't unlocked, purging setting - delete starterAttributes.nature; + starterAttributes.nature = undefined; } } @@ -691,12 +749,20 @@ export default class PokedexUiHandler extends MessageUiHandler { /** * Set the selections for all filters to their default starting value */ - resetFilters() : void { + resetFilters(): void { this.filterBar.setValsToDefault(); this.filterText.setValsToDefault(); } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number, moveToTop?: boolean) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + moveToTop?: boolean, + ) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); const singleLine = text?.indexOf("\n") === -1; @@ -734,9 +800,8 @@ export default class PokedexUiHandler extends MessageUiHandler { getStarterSpeciesId(speciesId): number { if (speciesStarterCosts.hasOwnProperty(speciesId)) { return speciesId; - } else { - return pokemonStarters[speciesId]; } + return pokemonStarters[speciesId]; } /** @@ -748,8 +813,10 @@ export default class PokedexUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; - return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) - && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); } /** @@ -761,8 +828,12 @@ export default class PokedexUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; - return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)])[starterData.valueReduction] - && starterData.valueReduction < valueReductionMax; + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)])[ + starterData.valueReduction + ] && starterData.valueReduction < valueReductionMax + ); } /** @@ -774,7 +845,9 @@ export default class PokedexUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; - return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]); + return ( + starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) + ); } /** @@ -783,7 +856,7 @@ export default class PokedexUiHandler extends MessageUiHandler { * @param species {@linkcode PokemonSpecies} of the icon used to check for upgrades * @param startPaused Should this animation be paused after it is added? */ - setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused: boolean = false): void { + setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused = false): void { globalScene.tweens.killTweensOf(icon); // Skip animations if they are disabled if (globalScene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { @@ -804,16 +877,17 @@ export default class PokedexUiHandler extends MessageUiHandler { y: 2 - 5, duration: fixedInt(125), ease: "Cubic.easeOut", - yoyo: true + yoyo: true, }, { targets: icon, y: 2 - 3, duration: fixedInt(150), ease: "Cubic.easeOut", - yoyo: true - } - ], }; + yoyo: true, + }, + ], + }; const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); @@ -824,7 +898,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (isPassiveAvailable) { globalScene.tweens.chain(tweenChain).paused = startPaused; } - // 'On' mode + // 'On' mode } else if (globalScene.candyUpgradeNotification === 2) { if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { globalScene.tweens.chain(tweenChain).paused = startPaused; @@ -839,7 +913,11 @@ export default class PokedexUiHandler extends MessageUiHandler { const species = starter.species; const slotVisible = !!species?.speciesId; - if (!species || globalScene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + if ( + !species || + globalScene.candyUpgradeNotification === 0 || + species.speciesId !== species.getRootSpeciesId(false) + ) { starter.candyUpgradeIcon.setVisible(false); starter.candyUpgradeOverlayIcon.setVisible(false); return; @@ -857,7 +935,8 @@ export default class PokedexUiHandler extends MessageUiHandler { // 'On' mode } else if (globalScene.candyUpgradeNotification === 2) { starter.candyUpgradeIcon.setVisible( - slotVisible && ( isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable )); + slotVisible && (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable), + ); starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -867,7 +946,7 @@ export default class PokedexUiHandler extends MessageUiHandler { * @param pokemonContainer the container for the Pokemon to update */ updateCandyUpgradeDisplay(pokemonContainer: PokedexMonContainer) { - if (this.isUpgradeIconEnabled() ) { + if (this.isUpgradeIconEnabled()) { this.setUpgradeIcon(pokemonContainer); } if (this.isUpgradeAnimationEnabled()) { @@ -903,7 +982,10 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterBar.resetSelection(this.filterBarCursor); this.updateStarters(); success = true; - } else if (this.filterTextMode && !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText)) { + } else if ( + this.filterTextMode && + !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText) + ) { this.filterText.resetSelection(this.filterTextCursor); success = true; } else if (this.showingTray) { @@ -912,7 +994,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.tryExit(); success = true; } - } else if (button === Button.STATS) { + } else if (button === Button.STATS) { if (!this.filterMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); @@ -923,7 +1005,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { error = true; } - } else if (button === Button.CYCLE_TERA) { + } else if (button === Button.CYCLE_TERA) { if (!this.filterTextMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); @@ -962,16 +1044,18 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.filterBar.openDropDown) { success = this.filterBar.decDropDownCursor(); } else if (numberOfStarters > 0) { - // UP from filter bar to bottom of Pokemon list + // UP from filter bar to bottom of Pokemon list this.setFilterMode(false); this.scrollCursor = Math.max(0, numOfRows - 9); this.updateScroll(); const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol - this.scrollCursor * 9); + this.setCursor(numberOfStarters - (numberOfStarters % 9) + targetCol - this.scrollCursor * 9); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9 - this.scrollCursor * 9, 0)); + this.setCursor( + Math.max(numberOfStarters - (numberOfStarters % 9) + targetCol - 9 - this.scrollCursor * 9, 0), + ); } success = true; } @@ -980,7 +1064,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.filterBar.openDropDown) { success = this.filterBar.incDropDownCursor(); } else if (numberOfStarters > 0) { - // DOWN from filter bar to top of Pokemon list + // DOWN from filter bar to top of Pokemon list this.setFilterMode(false); this.scrollCursor = 0; this.updateScroll(); @@ -1054,9 +1138,9 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { const targetCol = this.trayCursor; if (numberOfForms % 9 > targetCol) { - success = this.setTrayCursor(numberOfForms - (numberOfForms) % 9 + targetCol); + success = this.setTrayCursor(numberOfForms - (numberOfForms % 9) + targetCol); } else { - success = this.setTrayCursor(Math.max(numberOfForms - (numberOfForms) % 9 + targetCol - 9, 0)); + success = this.setTrayCursor(Math.max(numberOfForms - (numberOfForms % 9) + targetCol - 9, 0)); } } break; @@ -1071,7 +1155,9 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.trayCursor % 9 !== 0) { success = this.setTrayCursor(this.trayCursor - 1); } else { - success = this.setTrayCursor(currentTrayRow < numOfRows - 1 ? (currentTrayRow + 1) * maxColumns - 1 : numberOfForms - 1); + success = this.setTrayCursor( + currentTrayRow < numOfRows - 1 ? (currentTrayRow + 1) * maxColumns - 1 : numberOfForms - 1, + ); } break; case Button.RIGHT: @@ -1108,8 +1194,10 @@ export default class PokedexUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if ((currentRow < numOfRows - 1) && (this.cursor + 9 < this.filteredPokemonData.length)) { // not last row - if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon + if (currentRow < numOfRows - 1 && this.cursor + 9 < this.filteredPokemonData.length) { + // not last row + if (currentRow - this.scrollCursor === 8) { + // last row of visible pokemon this.scrollCursor++; this.updateScroll(); success = this.setCursor(this.cursor); @@ -1117,12 +1205,12 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor + 9); } } else if (numOfRows > 1) { - // DOWN from last row of pokemon > Wrap around to first row + // DOWN from last row of pokemon > Wrap around to first row this.scrollCursor = 0; this.updateScroll(); success = this.setCursor(this.cursor % 9); } else { - // DOWN from single row of pokemon > Go to filters + // DOWN from single row of pokemon > Go to filters this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterMode(true); success = true; @@ -1132,7 +1220,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.cursor % 9 !== 0) { success = this.setCursor(this.cursor - 1); } else { - // LEFT from filtered pokemon, on the left edge + // LEFT from filtered pokemon, on the left edge this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; @@ -1143,18 +1231,19 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { success = this.setCursor(this.cursor + 1); } else { - // RIGHT from filtered pokemon, on the right edge + // RIGHT from filtered pokemon, on the right edge this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; } break; - case Button.CYCLE_FORM: + case Button.CYCLE_FORM: { const species = this.pokemonContainers[this.cursor].species; if (this.canShowFormTray) { success = this.openFormTray(species); } break; + } } } } @@ -1169,6 +1258,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let iconPath; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls @@ -1196,6 +1286,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let iconPath; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls @@ -1222,12 +1313,14 @@ export default class PokedexUiHandler extends MessageUiHandler { // Returns true if one of the forms has the requested move hasFormLevelMove(form: PokemonForm, selectedMove: string): boolean { - if (!pokemonFormLevelMoves.hasOwnProperty(form.speciesId) || !pokemonFormLevelMoves[form.speciesId].hasOwnProperty(form.formIndex)) { + if ( + !pokemonFormLevelMoves.hasOwnProperty(form.speciesId) || + !pokemonFormLevelMoves[form.speciesId].hasOwnProperty(form.formIndex) + ) { return false; - } else { - const levelMoves = pokemonFormLevelMoves[form.speciesId][form.formIndex].map(m => allMoves[m[1]].name); - return levelMoves.includes(selectedMove); } + const levelMoves = pokemonFormLevelMoves[form.speciesId][form.formIndex].map(m => allMoves[m[1]].name); + return levelMoves.includes(selectedMove); } updateStarters = () => { @@ -1242,17 +1335,21 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filteredPokemonData = []; this.allSpecies.forEach(species => { - const starterId = this.getStarterSpeciesId(species.speciesId); const currentDexAttr = this.getCurrentDexProps(species.speciesId); const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr)); - const data: ContainerData = { species: species, cost: globalScene.gameData.getSpeciesStarterValue(starterId), props: props }; + const data: ContainerData = { + species: species, + cost: globalScene.gameData.getSpeciesStarterValue(starterId), + props: props, + }; // First, ensure you have the caught attributes for the species else default to bigint 0 // TODO: This might be removed depending on how accessible we want the pokedex function to be - const caughtAttr = (globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0)) & + const caughtAttr = + (globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0)) & (globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]?.caughtAttr || BigInt(0)) & species.getFullUnlocksData(); const starterData = globalScene.gameData.starterData[starterId]; @@ -1306,22 +1403,29 @@ export default class PokedexUiHandler extends MessageUiHandler { } // Ability filter - const abilities = [ species.ability1, species.ability2, species.abilityHidden ].map(a => allAbilities[a].name); - const passives = starterPassiveAbilities[starterId] ?? {} as PassiveAbilities; + const abilities = [species.ability1, species.ability2, species.abilityHidden].map(a => allAbilities[a].name); + const passives = starterPassiveAbilities[starterId] ?? ({} as PassiveAbilities); const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); - const fitsFormAbility1 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); - const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; + const fitsFormAbility1 = species.forms.some(form => + [form.ability1, form.ability2, form.abilityHidden].map(a => allAbilities[a].name).includes(selectedAbility1), + ); + const fitsAbility1 = + abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); - const fitsFormAbility2 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); - const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; + const fitsFormAbility2 = species.forms.some(form => + [form.ability1, form.ability2, form.abilityHidden].map(a => allAbilities[a].name).includes(selectedAbility2), + ); + const fitsAbility2 = + abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); // If both fields have been set to the same ability, show both ability and passive - const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || - (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); + const fitsAbilities = + (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || + (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); if (fitsPassive1 || fitsPassive2) { if (fitsPassive1) { @@ -1343,13 +1447,15 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(species.generation); // Type filter - const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => species.isOfType((type as number) - 1)); + const fitsType = this.filterBar + .getVals(DropDownColumn.TYPES) + .some(type => species.isOfType((type as number) - 1)); // Biome filter const indexToBiome = new Map( Object.values(Biome) - .map((value, index) => (typeof value === "string" ? [ index, value ] : undefined)) - .filter((entry): entry is [number, string] => entry !== undefined) + .map((value, index) => (typeof value === "string" ? [index, value] : undefined)) + .filter((entry): entry is [number, string] => entry !== undefined), ); indexToBiome.set(35, "Uncatchable"); @@ -1359,9 +1465,10 @@ export default class PokedexUiHandler extends MessageUiHandler { if (biomes.length === 0) { biomes.push("Uncatchable"); } - const showNoBiome = (biomes.length === 0 && this.filterBar.getVals(DropDownColumn.BIOME).length === 36) ? true : false; - const fitsBiome = this.filterBar.getVals(DropDownColumn.BIOME).some(item => biomes.includes(indexToBiome.get(item) ?? "")) || showNoBiome; - + const showNoBiome = !!(biomes.length === 0 && this.filterBar.getVals(DropDownColumn.BIOME).length === 36); + const fitsBiome = + this.filterBar.getVals(DropDownColumn.BIOME).some(item => biomes.includes(indexToBiome.get(item) ?? "")) || + showNoBiome; // Caught / Shiny filter const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); @@ -1373,13 +1480,17 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { if (caught === "SHINY3") { return isVariant3Caught; - } else if (caught === "SHINY2") { + } + if (caught === "SHINY2") { return isVariant2Caught && !isVariant3Caught; - } else if (caught === "SHINY") { + } + if (caught === "SHINY") { return isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "NORMAL") { + } + if (caught === "NORMAL") { return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "UNCAUGHT") { + } + if (caught === "UNCAUGHT") { return isUncaught; } }); @@ -1390,11 +1501,14 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { return isPassiveUnlockable; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { return true; } }); @@ -1406,15 +1520,20 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { return isCostReducedByOne || isCostReducedByTwo; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { return isCostReducedByOne; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { return isCostReducedByTwo; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { return isStarterProgressable && !(isCostReducedByOne || isCostReducedByTwo); - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { return isCostReductionUnlockable; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { return true; } }); @@ -1454,22 +1573,27 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "WIN" && misc.state === DropDownState.ON) { return hasWon; - } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { return hasNotWon || isUndefined; - } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + } + if (misc.val === "WIN" && misc.state === DropDownState.OFF) { return true; } }); // HA Filter - const speciesHasHiddenAbility = species.abilityHidden !== species.ability1 && species.abilityHidden !== Abilities.NONE; + const speciesHasHiddenAbility = + species.abilityHidden !== species.ability1 && species.abilityHidden !== Abilities.NONE; const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { return hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { return speciesHasHiddenAbility && !hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { return true; } }); @@ -1479,9 +1603,11 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "EGG" && misc.state === DropDownState.ON) { return isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + } + if (misc.val === "EGG" && misc.state === DropDownState.OFF) { return true; } }); @@ -1490,14 +1616,32 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { return this.pokerusSpecies.includes(species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { return !this.pokerusSpecies.includes(species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { return true; } }); - if (fitsName && fitsAbilities && fitsMoves && fitsGen && fitsBiome && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsStarter && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + if ( + fitsName && + fitsAbilities && + fitsMoves && + fitsGen && + fitsBiome && + fitsType && + fitsCaught && + fitsPassive && + fitsCostReduction && + fitsStarter && + fitsFavorite && + fitsWin && + fitsHA && + fitsEgg && + fitsPokerus + ) { this.filteredPokemonData.push(data); } }); @@ -1509,26 +1653,42 @@ export default class PokedexUiHandler extends MessageUiHandler { const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; this.filteredPokemonData.sort((a, b) => { switch (sort.val) { - default: - break; case SortCriteria.NUMBER: return (a.species.speciesId - b.species.speciesId) * -sort.dir; case SortCriteria.COST: return (a.cost - b.cost) * -sort.dir; - case SortCriteria.CANDY: - const candyCountA = globalScene.gameData.starterData[this.getStarterSpeciesId(a.species.speciesId)].candyCount; - const candyCountB = globalScene.gameData.starterData[this.getStarterSpeciesId(b.species.speciesId)].candyCount; + case SortCriteria.CANDY: { + const candyCountA = + globalScene.gameData.starterData[this.getStarterSpeciesId(a.species.speciesId)].candyCount; + const candyCountB = + globalScene.gameData.starterData[this.getStarterSpeciesId(b.species.speciesId)].candyCount; return (candyCountA - candyCountB) * -sort.dir; - case SortCriteria.IV: - const avgIVsA = globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[a.species.speciesId].ivs.length; - const avgIVsB = globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[b.species.speciesId].ivs.length; + } + case SortCriteria.IV: { + const avgIVsA = + globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = + globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[b.species.speciesId].ivs.length; return (avgIVsA - avgIVsB) * -sort.dir; + } case SortCriteria.NAME: return a.species.name.localeCompare(b.species.name) * -sort.dir; case SortCriteria.CAUGHT: - return (globalScene.gameData.dexData[a.species.speciesId].caughtCount - globalScene.gameData.dexData[b.species.speciesId].caughtCount) * -sort.dir; + return ( + (globalScene.gameData.dexData[a.species.speciesId].caughtCount - + globalScene.gameData.dexData[b.species.speciesId].caughtCount) * + -sort.dir + ); case SortCriteria.HATCHED: - return (globalScene.gameData.dexData[this.getStarterSpeciesId(a.species.speciesId)].hatchedCount - globalScene.gameData.dexData[this.getStarterSpeciesId(b.species.speciesId)].hatchedCount) * -sort.dir; + return ( + (globalScene.gameData.dexData[this.getStarterSpeciesId(a.species.speciesId)].hatchedCount - + globalScene.gameData.dexData[this.getStarterSpeciesId(b.species.speciesId)].hatchedCount) * + -sort.dir + ); + default: + break; } return 0; }); @@ -1548,7 +1708,6 @@ export default class PokedexUiHandler extends MessageUiHandler { let pokerusCursorIndex = 0; this.pokemonContainers.forEach((container, i) => { - const i_data = i + onScreenFirstIndex; if (i_data >= this.filteredPokemonData.length) { @@ -1562,14 +1721,20 @@ export default class PokedexUiHandler extends MessageUiHandler { container.setSpecies(data.species, props); const starterSprite = container.icon as Phaser.GameObjects.Sprite; - starterSprite.setTexture(data.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), container.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + starterSprite.setTexture( + data.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + container.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant), + ); container.checkIconId(props.female, props.formIndex, props.shiny, props.variant); const speciesId = data.species.speciesId; const dexEntry = globalScene.gameData.dexData[speciesId]; - const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & data.species.getFullUnlocksData(); + const caughtAttr = + dexEntry.caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + data.species.getFullUnlocksData(); - if ((caughtAttr & data.species.getFullUnlocksData()) || globalScene.dexForDevs) { + if (caughtAttr & data.species.getFullUnlocksData() || globalScene.dexForDevs) { container.icon.clearTint(); } else if (dexEntry.seenAttr) { container.icon.setTint(0x808080); @@ -1609,7 +1774,6 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (this.showDecorations) { - if (this.pokerusSpecies.includes(data.species)) { this.pokerusCursorObjs[pokerusCursorIndex].setPosition(container.x - 1, container.y + 1); this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); @@ -1619,34 +1783,47 @@ export default class PokedexUiHandler extends MessageUiHandler { this.updateStarterValueLabel(container); container.label.setVisible(true); - const speciesVariants = speciesId && caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(caughtAttr & v)) - : []; + const speciesVariants = + speciesId && caughtAttr & DexAttr.SHINY + ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter(v => !!(caughtAttr & v)) + : []; for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; container.shinyIcons[v].setVisible(hasVariant); if (hasVariant) { - container.shinyIcons[v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); + container.shinyIcons[v].setTint( + getVariantTint( + speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2, + ), + ); } } - container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); - container.classicWinIcon.setVisible(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0); + container.starterPassiveBgs.setVisible( + !!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr, + ); + container.hiddenAbilityIcon.setVisible( + !!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4), + ); + container.classicWinIcon.setVisible( + globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0, + ); container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); // 'Candy Icon' mode if (globalScene.candyUpgradeDisplay === 0) { - if (!starterColors[this.getStarterSpeciesId(speciesId)]) { // Default to white if no colors are found - starterColors[this.getStarterSpeciesId(speciesId)] = [ "ffffff", "ffffff" ]; + starterColors[this.getStarterSpeciesId(speciesId)] = ["ffffff", "ffffff"]; } // Set the candy colors - container.candyUpgradeIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][0]))); - container.candyUpgradeOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][1]))); - + container.candyUpgradeIcon.setTint( + argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][0])), + ); + container.candyUpgradeOverlayIcon.setTint( + argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][1])), + ); } else if (globalScene.candyUpgradeDisplay === 1) { container.candyUpgradeIcon.setVisible(false); container.candyUpgradeOverlayIcon.setVisible(false); @@ -1735,7 +1912,6 @@ export default class PokedexUiHandler extends MessageUiHandler { } openFormTray(species: PokemonSpecies): boolean { - this.trayForms = species.forms.filter(f => !f.isUnobtainable); this.trayNumIcons = this.trayForms.length; @@ -1753,12 +1929,8 @@ export default class PokedexUiHandler extends MessageUiHandler { const goLeft = this.trayColumns <= spaceRight ? 0 : 1; this.trayBg.setSize(13 + this.trayColumns * 17, 8 + this.trayRows * 18); - this.formTrayContainer.setX( - (goLeft ? boxPos.x - 18 * (this.trayColumns - spaceRight) : boxPos.x) - 3 - ); - this.formTrayContainer.setY( - goUp ? boxPos.y - this.trayBg.height : boxPos.y + 17 - ); + this.formTrayContainer.setX((goLeft ? boxPos.x - 18 * (this.trayColumns - spaceRight) : boxPos.x) - 3); + this.formTrayContainer.setY(goUp ? boxPos.y - this.trayBg.height : boxPos.y + 17); const dexEntry = globalScene.gameData.dexData[species.speciesId]; const dexAttr = this.getCurrentDexProps(species.speciesId); @@ -1766,9 +1938,18 @@ export default class PokedexUiHandler extends MessageUiHandler { this.trayContainers = []; this.trayForms.map((f, index) => { - const isFormCaught = dexEntry ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; - const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; - const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, shiny: props.shiny, variant: props.variant }); + const isFormCaught = dexEntry + ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n + : false; + const isFormSeen = dexEntry + ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n + : false; + const formContainer = new PokedexMonContainer(species, { + formIndex: f.formIndex, + female: props.female, + shiny: props.shiny, + variant: props.variant, + }); this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); // Setting tint, for all saves some caught forms may only show up as seen if (isFormCaught || globalScene.dexForDevs) { @@ -1796,7 +1977,6 @@ export default class PokedexUiHandler extends MessageUiHandler { } closeFormTray(): boolean { - this.trayContainers.forEach(obj => { this.formTrayContainer.remove(obj, true); // Removes from container and destroys it }); @@ -1868,7 +2048,6 @@ export default class PokedexUiHandler extends MessageUiHandler { } setSpecies(species: PokemonSpecies | null) { - this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; if (!species && globalScene.ui.getTooltip().visible) { @@ -1883,14 +2062,15 @@ export default class PokedexUiHandler extends MessageUiHandler { this.lastSpecies = species; } - if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs)) { - + if ( + species && + (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) + ) { this.pokemonNumberText.setText(i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4)); this.pokemonNameText.setText(species.name); if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { - this.startIconAnimation(this.cursor); const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); @@ -1910,7 +2090,9 @@ export default class PokedexUiHandler extends MessageUiHandler { this.pokemonSprite.setTint(0x808080); } } else { - this.pokemonNumberText.setText(species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : ""); + this.pokemonNumberText.setText( + species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : "", + ); this.pokemonNameText.setText(species ? "???" : ""); this.pokemonFormText.setText(""); this.type1Icon.setVisible(false); @@ -1946,10 +2128,15 @@ export default class PokedexUiHandler extends MessageUiHandler { if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; - const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); + const caughtAttr = + dexEntry.caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & + species.getFullUnlocksData(); if (caughtAttr) { - const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); + const props = this.getSanitizedProps( + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + ); if (shiny === undefined) { shiny = props.shiny; @@ -1972,7 +2159,8 @@ export default class PokedexUiHandler extends MessageUiHandler { this.assetLoadCancelled = assetLoadCancelled; if (shouldUpdateSprite) { - species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? + species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { + // TODO: is this bang correct? if (assetLoadCancelled.value) { return; } @@ -2020,16 +2208,14 @@ export default class PokedexUiHandler extends MessageUiHandler { this.showFormTrayLabel.setVisible(true); } this.canShowFormTray = true; - } else { + } else { this.showFormTrayIconElement.setVisible(false); this.showFormTrayLabel.setVisible(false); this.canShowFormTray = false; } - } else { this.setTypeIcons(null, null); } - } setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { @@ -2086,18 +2272,24 @@ export default class PokedexUiHandler extends MessageUiHandler { this.blockInput = false; }; ui.showText(i18next.t("pokedexUiHandler:confirmExit"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - ui.setMode(Mode.POKEDEX, "refresh"); - this.clearText(); - this.clear(); - ui.revertMode(); - }, cancel, null, null, 19); + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.POKEDEX, "refresh"); + this.clearText(); + this.clear(); + ui.revertMode(); + }, + cancel, + null, + null, + 19, + ); }); return true; } - /** * Creates a temporary dex attr props that will be used to * display the correct shiny, variant, and form based on the StarterPreferences @@ -2108,13 +2300,19 @@ export default class PokedexUiHandler extends MessageUiHandler { getCurrentDexProps(speciesId: number): bigint { let props = 0n; const species = allSpecies.find(sp => sp.speciesId === speciesId); - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); + const caughtAttr = + globalScene.gameData.dexData[speciesId].caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props * If neither of these pass, we add DexAttr.MALE to our temp props */ - if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + if ( + this.starterPreferences[speciesId]?.female || + ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n) + ) { props += DexAttr.FEMALE; } else { props += DexAttr.MALE; @@ -2122,7 +2320,10 @@ export default class PokedexUiHandler extends MessageUiHandler { /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. * If they're not there, it enables shiny state by default if any shiny was caught */ - if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) { + if ( + this.starterPreferences[speciesId]?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false) + ) { props += DexAttr.SHINY; if (this.starterPreferences[speciesId]?.variant !== undefined) { props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; @@ -2142,7 +2343,8 @@ export default class PokedexUiHandler extends MessageUiHandler { props += DexAttr.NON_SHINY; props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant } - if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon + if (this.starterPreferences[speciesId]?.form) { + // this checks for the form of the pokemon props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; } else { // Get the first unlocked form @@ -2173,9 +2375,18 @@ export default class PokedexUiHandler extends MessageUiHandler { this.blockInput = false; } - checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { - console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + 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)); } diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index eb0e0ed909b..99940b92351 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -26,16 +26,15 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { private pokemonEggMoveContainers: Phaser.GameObjects.Container[]; private pokemonEggMoveBgs: Phaser.GameObjects.NineSlice[]; private pokemonEggMoveLabels: Phaser.GameObjects.Text[]; - private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; private pokemonListContainer: Phaser.GameObjects.Container; private pokemonCandyIcon: Phaser.GameObjects.Sprite; private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite; private pokemonCandyCountText: Phaser.GameObjects.Text; - constructor(listContainer : Phaser.GameObjects.Container, x: number = 115, y: number = 9,) { + constructor(listContainer: Phaser.GameObjects.Container, x = 115, y = 9) { super(x, y); this.pokemonListContainer = listContainer; - } setup(): void { super.setup(); @@ -43,7 +42,10 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { this.currentPokemonSprite = globalScene.add.sprite(54, 80, "pkmn__sub"); this.currentPokemonSprite.setScale(0.8); - this.currentPokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.currentPokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.pokemonListContainer.add(this.currentPokemonSprite); // setup name and number @@ -51,7 +53,9 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { this.pokemonNumberText.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(7, 107.5, "", TextStyle.SUMMARY, { fontSize: 74 }); + this.pokemonNameText = addTextObject(7, 107.5, "", TextStyle.SUMMARY, { + fontSize: 74, + }); this.pokemonNameText.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonNameText); @@ -105,7 +109,6 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { } super.add(this.pokemonEggMoveContainers); - } /** @@ -127,7 +130,6 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { const variant = pokemon.variant; this.currentPokemonSprite.setVisible(false); species.loadAssets(female, formIndex, shiny, variant, true).then(() => { - getPokemonSpeciesForm(species.speciesId, pokemon.formIndex).cry(); this.currentPokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); this.currentPokemonSprite.setPipelineData("shiny", shiny); @@ -167,7 +169,9 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); - this.pokemonEggMoveBgs[em].setFrame(PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase()); + this.pokemonEggMoveBgs[em].setFrame( + PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase(), + ); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); if (!(eggMove && hatchInfo.starterDataEntryBeforeUpdate.eggMoves & Math.pow(2, em)) && eggMoveUnlocked) { @@ -183,7 +187,5 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { } else { this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); } - } - } diff --git a/src/ui/pokemon-icon-anim-handler.ts b/src/ui/pokemon-icon-anim-handler.ts index 010d23315f2..c84ee2a0f9a 100644 --- a/src/ui/pokemon-icon-anim-handler.ts +++ b/src/ui/pokemon-icon-anim-handler.ts @@ -4,7 +4,7 @@ import * as Utils from "../utils"; export enum PokemonIconAnimMode { NONE, PASSIVE, - ACTIVE + ACTIVE, } type PokemonIcon = Phaser.GameObjects.Container | Phaser.GameObjects.Sprite; @@ -33,7 +33,7 @@ export default class PokemonIconAnimHandler { yoyo: true, repeat: -1, onRepeat: onAlternate, - onYoyo: onAlternate + onYoyo: onAlternate, }); } @@ -50,16 +50,14 @@ export default class PokemonIconAnimHandler { addOrUpdate(icons: PokemonIcon | PokemonIcon[], mode: PokemonIconAnimMode): void { if (!Array.isArray(icons)) { - icons = [ icons ]; + icons = [icons]; } for (const i of icons) { if (this.icons.has(i) && this.icons.get(i) === mode) { continue; } if (this.toggled) { - const lastYDelta = this.icons.has(i) - ? this.icons.get(i)! - : 0; + const lastYDelta = this.icons.has(i) ? this.icons.get(i)! : 0; const yDelta = this.getModeYDelta(mode); i.y += yDelta + lastYDelta; } @@ -69,7 +67,7 @@ export default class PokemonIconAnimHandler { remove(icons: PokemonIcon | PokemonIcon[]): void { if (!Array.isArray(icons)) { - icons = [ icons ]; + icons = [icons]; } for (const i of icons) { if (this.toggled) { diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 7e2932fecf9..64c743ec88d 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -21,7 +21,7 @@ interface LanguageSetting { } const languageSettings: { [key: string]: LanguageSetting } = { - "pt": { + pt: { infoContainerTextSize: "60px", infoContainerLabelXPos: -15, infoContainerTextXPos: -12, @@ -57,7 +57,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { public shown: boolean; - constructor(x: number = 372, y: number = 66) { + constructor(x = 372, y = 66) { super(globalScene, x, y); this.initialX = x; } @@ -85,7 +85,13 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { movesBg.setName("window-moves-bg"); this.pokemonMovesContainer.add(movesBg); - const movesLabel = addTextObject(-movesBg.width / 2, 6, i18next.t("pokemonInfoContainer:moveset"), TextStyle.WINDOW, { fontSize: "64px" }); + const movesLabel = addTextObject( + -movesBg.width / 2, + 6, + i18next.t("pokemonInfoContainer:moveset"), + TextStyle.WINDOW, + { fontSize: "64px" }, + ); movesLabel.setOrigin(0.5, 0); movesLabel.setName("text-moves"); this.pokemonMovesContainer.add(movesLabel); @@ -127,44 +133,74 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { // The font size should be set by language const infoContainerTextSize = textSettings?.infoContainerTextSize || "64px"; - this.pokemonFormLabelText = addTextObject(infoContainerLabelXPos, 19, i18next.t("pokemonInfoContainer:form"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormLabelText = addTextObject( + infoContainerLabelXPos, + 19, + i18next.t("pokemonInfoContainer:form"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonFormLabelText.setOrigin(1, 0); this.pokemonFormLabelText.setVisible(false); this.add(this.pokemonFormLabelText); - this.pokemonFormText = addTextObject(infoContainerTextXPos, 19, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormText = addTextObject(infoContainerTextXPos, 19, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonFormText.setOrigin(0, 0); this.pokemonFormText.setVisible(false); this.add(this.pokemonFormText); - this.pokemonGenderText = addTextObject(-42, -61, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonGenderText = addTextObject(-42, -61, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonGenderText.setOrigin(0, 0); this.pokemonGenderText.setVisible(false); this.pokemonGenderText.setName("text-pkmn-gender"); this.add(this.pokemonGenderText); - this.pokemonGenderNewText = addTextObject(-36, -61, "", TextStyle.WINDOW, { fontSize: "64px" }); + this.pokemonGenderNewText = addTextObject(-36, -61, "", TextStyle.WINDOW, { + fontSize: "64px", + }); this.pokemonGenderNewText.setOrigin(0, 0); this.pokemonGenderNewText.setVisible(false); this.pokemonGenderNewText.setName("text-pkmn-new-gender"); this.add(this.pokemonGenderNewText); - this.pokemonAbilityLabelText = addTextObject(infoContainerLabelXPos, 29, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonAbilityLabelText = addTextObject( + infoContainerLabelXPos, + 29, + i18next.t("pokemonInfoContainer:ability"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonAbilityLabelText.setOrigin(1, 0); this.pokemonAbilityLabelText.setName("text-pkmn-ability-label"); this.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(infoContainerTextXPos, 29, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonAbilityText = addTextObject(infoContainerTextXPos, 29, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonAbilityText.setOrigin(0, 0); this.pokemonAbilityText.setName("text-pkmn-ability"); this.add(this.pokemonAbilityText); - this.pokemonNatureLabelText = addTextObject(infoContainerLabelXPos, 39, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonNatureLabelText = addTextObject( + infoContainerLabelXPos, + 39, + i18next.t("pokemonInfoContainer:nature"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonNatureLabelText.setOrigin(1, 0); this.pokemonNatureLabelText.setName("text-pkmn-nature-label"); this.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(infoContainerTextXPos, 39, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize, lineSpacing: 3, maxLines: 2 }); + this.pokemonNatureText = addBBCodeTextObject(infoContainerTextXPos, 39, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + lineSpacing: 3, + maxLines: 2, + }); this.pokemonNatureText.setOrigin(0, 0); this.pokemonNatureText.setName("text-pkmn-nature"); this.add(this.pokemonNatureText); @@ -176,13 +212,23 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.setName("img-pkmn-shiny-icon"); this.add(this.pokemonShinyIcon); - this.pokemonShinyNewIcon = addTextObject(this.pokemonShinyIcon.x + 12, this.pokemonShinyIcon.y, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonShinyNewIcon = addTextObject( + this.pokemonShinyIcon.x + 12, + this.pokemonShinyIcon.y, + "", + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonShinyNewIcon.setOrigin(0, 0); this.pokemonShinyNewIcon.setName("text-pkmn-shiny-new-icon"); this.add(this.pokemonShinyNewIcon); this.pokemonShinyNewIcon.setVisible(false); - this.pokemonFusionShinyIcon = globalScene.add.image(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y, "shiny_star_2"); + this.pokemonFusionShinyIcon = globalScene.add.image( + this.pokemonShinyIcon.x, + this.pokemonShinyIcon.y, + "shiny_star_2", + ); this.pokemonFusionShinyIcon.setOrigin(0, 0); this.pokemonFusionShinyIcon.setScale(0.75); this.pokemonFusionShinyIcon.setName("img-pkmn-fusion-shiny-icon"); @@ -191,7 +237,14 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.setVisible(false); } - show(pokemon: Pokemon, showMoves: boolean = false, speedMultiplier: number = 1, dexEntry?: DexEntry, starterEntry?: StarterDataEntry, eggInfo = false): Promise { + show( + pokemon: Pokemon, + showMoves = false, + speedMultiplier = 1, + dexEntry?: DexEntry, + starterEntry?: StarterDataEntry, + eggInfo = false, + ): Promise { return new Promise(resolve => { if (!dexEntry) { dexEntry = globalScene.gameData.dexData[pokemon.species.speciesId]; @@ -232,9 +285,16 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); } - this.pokemonFormText.setText(formName.length > this.numCharsBeforeCutoff ? formName.substring(0, this.numCharsBeforeCutoff - 3) + "..." : formName); + this.pokemonFormText.setText( + formName.length > this.numCharsBeforeCutoff + ? `${formName.substring(0, this.numCharsBeforeCutoff - 3)}...` + : formName, + ); if (formName.length > this.numCharsBeforeCutoff) { - this.pokemonFormText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), Phaser.Geom.Rectangle.Contains); + this.pokemonFormText.setInteractive( + new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), + Phaser.Geom.Rectangle.Contains, + ); this.pokemonFormText.on("pointerover", () => globalScene.ui.showTooltip("", formName, true)); this.pokemonFormText.on("pointerout", () => globalScene.ui.hideTooltip()); } else { @@ -283,10 +343,17 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.setVisible(pokemon.isShiny()); this.pokemonShinyIcon.setTint(getVariantTint(baseVariant)); if (this.pokemonShinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.pokemonShinyIcon.on("pointerover", () => globalScene.ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.pokemonShinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + true, + ), + ); this.pokemonShinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); const newShiny = BigInt(1 << (pokemon.shiny ? 1 : 0)); @@ -295,9 +362,10 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyNewIcon.setText("(+)"); this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); - const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); + const newShinyOrVariant = (newShiny & caughtAttr) === BigInt(0) || (newVariant & caughtAttr) === BigInt(0); this.pokemonShinyNewIcon.setVisible(!!newShinyOrVariant); - } else if ((caughtAttr & DexAttr.NON_SHINY) === BigInt(0) && ((caughtAttr & DexAttr.SHINY) === DexAttr.SHINY)) { //If the player has *only* caught any shiny variant of this species, not a non-shiny + } else if ((caughtAttr & DexAttr.NON_SHINY) === BigInt(0) && (caughtAttr & DexAttr.SHINY) === DexAttr.SHINY) { + //If the player has *only* caught any shiny variant of this species, not a non-shiny this.pokemonShinyNewIcon.setVisible(true); this.pokemonShinyNewIcon.setText("(+)"); this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); @@ -313,8 +381,13 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } const starterSpeciesId = pokemon.species.getRootSpeciesId(); - const originalIvs: number[] | null = eggInfo ? (dexEntry.caughtAttr ? dexEntry.ivs : null) : (globalScene.gameData.dexData[starterSpeciesId].caughtAttr - ? globalScene.gameData.dexData[starterSpeciesId].ivs : null); + const originalIvs: number[] | null = eggInfo + ? dexEntry.caughtAttr + ? dexEntry.ivs + : null + : globalScene.gameData.dexData[starterSpeciesId].caughtAttr + ? globalScene.gameData.dexData[starterSpeciesId].ivs + : null; this.statsContainer.updateIvs(pokemon.ivs, originalIvs!); // TODO: is this bang correct? if (!eggInfo) { @@ -325,7 +398,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { x: this.initialX - this.infoWindowWidth, onComplete: () => { resolve(); - } + }, }); if (showMoves) { @@ -335,7 +408,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { duration: Utils.fixedInt(Math.floor(325 / speedMultiplier)), ease: "Cubic.easeInOut", x: this.movesContainerInitialX - 57, - onComplete: () => resolve() + onComplete: () => resolve(), }); } } @@ -383,8 +456,10 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonMovesContainer.setVisible(false); } - makeRoomForConfirmUi(speedMultiplier: number = 1, fromCatch: boolean = false): Promise { - const xPosition = fromCatch ? this.initialX - this.infoWindowWidth - 65 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; + makeRoomForConfirmUi(speedMultiplier = 1, fromCatch = false): Promise { + const xPosition = fromCatch + ? this.initialX - this.infoWindowWidth - 65 + : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; return new Promise(resolve => { globalScene.tweens.add({ targets: this, @@ -393,12 +468,12 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { x: xPosition, onComplete: () => { resolve(); - } + }, }); }); } - hide(speedMultiplier: number = 1): Promise { + hide(speedMultiplier = 1): Promise { return new Promise(resolve => { if (!this.shown) { globalScene.showEnemyModifierBar(); @@ -409,7 +484,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { targets: this.pokemonMovesContainer, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), ease: "Cubic.easeInOut", - x: this.movesContainerInitialX + x: this.movesContainerInitialX, }); globalScene.tweens.add({ @@ -424,7 +499,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { globalScene.ui.hideTooltip(); globalScene.showEnemyModifierBar(); resolve(); - } + }, }); this.shown = false; diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index 3b229a47c38..74669bc1f44 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -7,39 +7,38 @@ import i18next from "i18next"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { globalScene } from "#app/global-scene"; - interface LanguageSetting { - inputFieldFontSize?: string, - warningMessageFontSize?: string, - errorMessageFontSize?: string, + inputFieldFontSize?: string; + warningMessageFontSize?: string; + errorMessageFontSize?: string; } const languageSettings: { [key: string]: LanguageSetting } = { "es-ES": { inputFieldFontSize: "50px", errorMessageFontSize: "40px", - } + }, }; export default class RegistrationFormUiHandler extends FormModalUiHandler { - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:register"); } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } getButtonTopMargin(): number { return 8; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:register"), i18next.t("menu:backToLogin") ]; + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("menu:register"), i18next.t("menu:backToLogin")]; } getReadableErrorMessage(error: string): string { @@ -62,8 +61,14 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { override getInputFieldConfigs(): InputFieldConfig[] { const inputFieldConfigs: InputFieldConfig[] = []; inputFieldConfigs.push({ label: i18next.t("menu:username") }); - inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); - inputFieldConfigs.push({ label: i18next.t("menu:confirmPassword"), isPassword: true }); + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); + inputFieldConfigs.push({ + label: i18next.t("menu:confirmPassword"), + isPassword: true, + }); return inputFieldConfigs; } @@ -80,7 +85,9 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { }); const warningMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.warningMessageFontSize ?? "42px"; - const label = addTextObject(10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { fontSize: warningMessageFontSize }); + const label = addTextObject(10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { + fontSize: warningMessageFontSize, + }); this.modalContainer.add(label); } @@ -90,11 +97,11 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { const config = args[0] as ModalConfig; const originalRegistrationAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { // Prevent overlapping overrides on action modification this.submitAction = originalRegistrationAction; this.sanitizeInputs(); - globalScene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); const onFail = error => { globalScene.ui.setMode(Mode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); globalScene.ui.playError(); @@ -112,14 +119,22 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { if (this.inputs[1].text !== this.inputs[2].text) { return onFail(i18next.t("menu:passwordNotMatchingConfirmPassword")); } - const [ usernameInput, passwordInput ] = this.inputs; - pokerogueApi.account.register({ username: usernameInput.text, password: passwordInput.text }) + const [usernameInput, passwordInput] = this.inputs; + pokerogueApi.account + .register({ + username: usernameInput.text, + password: passwordInput.text, + }) .then(registerError => { if (!registerError) { - pokerogueApi.account.login({ username: usernameInput.text, password: passwordInput.text }) + pokerogueApi.account + .login({ + username: usernameInput.text, + password: passwordInput.text, + }) .then(loginError => { if (!loginError) { - originalRegistrationAction && originalRegistrationAction(); + originalRegistrationAction?.(); } else { onFail(loginError); } diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts index 3004530063e..91c0025d283 100644 --- a/src/ui/rename-form-ui-handler.ts +++ b/src/ui/rename-form-ui-handler.ts @@ -5,20 +5,20 @@ import i18next from "i18next"; import type { PlayerPokemon } from "#app/field/pokemon"; export default class RenameFormUiHandler extends FormModalUiHandler { - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:renamePokemon"); } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:rename"), i18next.t("menu:cancel") ]; + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("menu:rename"), i18next.t("menu:cancel")]; } getReadableErrorMessage(error: string): string { @@ -42,7 +42,7 @@ export default class RenameFormUiHandler extends FormModalUiHandler { } else { this.inputs[0].text = args[1]; } - this.submitAction = (_) => { + this.submitAction = _ => { this.sanitizeInputs(); const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); config.buttonActions[0](sanitizedName); diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts index 2a498f77b8d..85ea1e93e8d 100644 --- a/src/ui/run-history-ui-handler.ts +++ b/src/ui/run-history-ui-handler.ts @@ -25,7 +25,6 @@ export const RUN_HISTORY_LIMIT: number = 25; * The only valid input buttons are Button.ACTION and Button.CANCEL. */ export default class RunHistoryUiHandler extends MessageUiHandler { - private readonly maxRows = 3; private runSelectContainer: Phaser.GameObjects.Container; @@ -34,7 +33,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { private runSelectCallback: RunSelectCallback | null; - private scrollCursor: number = 0; + private scrollCursor = 0; private cursorObj: Phaser.GameObjects.NineSlice | null; @@ -51,7 +50,13 @@ export default class RunHistoryUiHandler extends MessageUiHandler { this.runSelectContainer.setVisible(false); ui.add(this.runSelectContainer); - const loadSessionBg = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, -globalScene.game.canvas.height / 6, 0x006860); + const loadSessionBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + -globalScene.game.canvas.height / 6, + 0x006860, + ); loadSessionBg.setOrigin(0, 0); this.runSelectContainer.add(loadSessionBg); @@ -101,7 +106,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { let success = false; const error = false; - if ([ Button.ACTION, Button.CANCEL ].includes(button)) { + if ([Button.ACTION, Button.CANCEL].includes(button)) { if (button === Button.ACTION) { const cursor = this.cursor + this.scrollCursor; if (this.runs[cursor]) { @@ -111,11 +116,10 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } success = true; return success; - } else { - this.runSelectCallback = null; - success = true; - globalScene.ui.revertMode(); } + this.runSelectCallback = null; + success = true; + globalScene.ui.revertMode(); } else if (this.runs.length > 0) { switch (button) { case Button.UP: @@ -124,7 +128,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } else if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1); } else if (this.runs.length > 1) { - // wrap around to the bottom + // wrap around to the bottom success = this.setCursor(Math.min(this.runs.length - 1, this.maxRows - 1)); success = this.setScrollCursor(Math.max(0, this.runs.length - this.maxRows)) || success; } @@ -135,7 +139,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } else if (this.scrollCursor < this.runs.length - this.maxRows) { success = this.setScrollCursor(this.scrollCursor + 1); } else if (this.runs.length > 1) { - // wrap around to the top + // wrap around to the top success = this.setCursor(0); success = this.setScrollCursor(0) || success; } @@ -186,7 +190,9 @@ export default class RunHistoryUiHandler extends MessageUiHandler { const emptyWindow = addWindow(0, 0, 304, 165); this.runsContainer.add(emptyWindow); const emptyWindowCoordinates = emptyWindow.getCenter(); - const emptyText = addTextObject(0, 0, i18next.t("saveSlotSelectUiHandler:empty"), TextStyle.WINDOW, { fontSize: "128px" }); + const emptyText = addTextObject(0, 0, i18next.t("saveSlotSelectUiHandler:empty"), TextStyle.WINDOW, { + fontSize: "128px", + }); emptyText.setPosition(emptyWindowCoordinates.x - 18, emptyWindowCoordinates.y - 15); this.runsContainer.add(emptyText); } @@ -213,7 +219,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { targets: this.runsContainer, y: this.runContainerInitialY - 56 * scrollCursor, duration: Utils.fixedInt(325), - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } return changed; @@ -261,7 +267,6 @@ class RunEntryContainer extends Phaser.GameObjects.Container { this.entryData = entryData; this.setup(this.entryData); - } /** @@ -275,7 +280,6 @@ class RunEntryContainer extends Phaser.GameObjects.Container { * The player's party and their levels at the time of the last wave of the run are also displayed. */ private setup(run: RunEntry) { - const victory = run.isVictory; const data = globalScene.gameData.parseSessionData(JSON.stringify(run.entry)); @@ -286,22 +290,34 @@ class RunEntryContainer extends Phaser.GameObjects.Container { if (victory) { const gameOutcomeLabel = addTextObject(8, 5, `${i18next.t("runHistory:victory")}`, TextStyle.WINDOW); this.add(gameOutcomeLabel); - } else { // Run Result: Defeats + } else { + // Run Result: Defeats const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); // Defeats from wild Pokemon battles will show the Pokemon responsible by the text of the run result. if (data.battleType === BattleType.WILD || (data.battleType === BattleType.MYSTERY_ENCOUNTER && !data.trainer)) { const enemyContainer = globalScene.add.container(8, 5); - const gameOutcomeLabel = addTextObject(0, 0, `${i18next.t("runHistory:defeatedWild", { context: genderStr })}`, TextStyle.WINDOW); + const gameOutcomeLabel = addTextObject( + 0, + 0, + `${i18next.t("runHistory:defeatedWild", { context: genderStr })}`, + TextStyle.WINDOW, + ); enemyContainer.add(gameOutcomeLabel); data.enemyParty.forEach((enemyData, e) => { - const enemyIconContainer = globalScene.add.container(65 + (e * 25), -8); + const enemyIconContainer = globalScene.add.container(65 + e * 25, -8); enemyIconContainer.setScale(0.75); enemyData.boss = false; enemyData["player"] = true; const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); - const enemyLevel = addTextObject(32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const enemyLevel = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -311,16 +327,30 @@ class RunEntryContainer extends Phaser.GameObjects.Container { enemy.destroy(); }); this.add(enemyContainer); - } else if (data.battleType === BattleType.TRAINER || (data.battleType === BattleType.MYSTERY_ENCOUNTER && data.trainer)) { // Defeats from Trainers show the trainer's title and name + } else if ( + data.battleType === BattleType.TRAINER || + (data.battleType === BattleType.MYSTERY_ENCOUNTER && data.trainer) + ) { + // Defeats from Trainers show the trainer's title and name const tObj = data.trainer.toTrainer(); // Because of the interesting mechanics behind rival names, the rival name and title have to be retrieved differently const RIVAL_TRAINER_ID_THRESHOLD = 375; if (data.trainer.trainerType >= RIVAL_TRAINER_ID_THRESHOLD) { - const rivalName = (tObj.variant === TrainerVariant.FEMALE) ? "trainerNames:rival_female" : "trainerNames:rival"; - const gameOutcomeLabel = addTextObject(8, 5, `${i18next.t("runHistory:defeatedRival", { context: genderStr })} ${i18next.t(rivalName)}`, TextStyle.WINDOW); + const rivalName = tObj.variant === TrainerVariant.FEMALE ? "trainerNames:rival_female" : "trainerNames:rival"; + const gameOutcomeLabel = addTextObject( + 8, + 5, + `${i18next.t("runHistory:defeatedRival", { context: genderStr })} ${i18next.t(rivalName)}`, + TextStyle.WINDOW, + ); this.add(gameOutcomeLabel); } else { - const gameOutcomeLabel = addTextObject(8, 5, `${i18next.t("runHistory:defeatedTrainer", { context: genderStr })}${tObj.getName(0, true)}`, TextStyle.WINDOW); + const gameOutcomeLabel = addTextObject( + 8, + 5, + `${i18next.t("runHistory:defeatedTrainer", { context: genderStr })}${tObj.getName(0, true)}`, + TextStyle.WINDOW, + ); this.add(gameOutcomeLabel); } } @@ -375,7 +405,13 @@ class RunEntryContainer extends Phaser.GameObjects.Container { const pokemon = p.toPokemon(); const icon = globalScene.addPokemonIcon(pokemon, 0, 0, 0, 0); - const text = addTextObject(32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const text = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); text.setShadow(0, 0, undefined); text.setStroke("#424242", 14); text.setOrigin(1, 0); diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 3b4a0e3d335..364cb8e4003 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -35,12 +35,12 @@ import { globalScene } from "#app/global-scene"; enum RunInfoUiMode { MAIN, HALL_OF_FAME, - ENDING_ART + ENDING_ART, } export enum RunDisplayMode { RUN_HISTORY, - SESSION_PREVIEW + SESSION_PREVIEW, } /** @@ -64,7 +64,7 @@ export default class RunInfoUiHandler extends UiHandler { private hallofFameContainer: Phaser.GameObjects.Container; private endCardContainer: Phaser.GameObjects.Container; - private partyVisibility: Boolean; + private partyVisibility: boolean; private modifiersModule: any; constructor() { @@ -72,12 +72,12 @@ export default 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.game.canvas.height / 6) + 1); // The import of the modifiersModule is loaded here to sidestep async/await issues. this.modifiersModule = Modifier; this.runContainer.setVisible(false); globalScene.loadImage("encounter_exclaim", "mystery-encounters"); - } + } /** * This takes a run's RunEntry and uses the information provided to display essential information about the player's run. @@ -90,10 +90,16 @@ export default class RunInfoUiHandler extends UiHandler { * Party Container: * this.isVictory === true --> Hall of Fame Container: */ - override show(args: any[]): boolean { - super.show(args); + override show(args: any[]): boolean { + super.show(args); - const gameStatsBg = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width, globalScene.game.canvas.height, 0x006860); + const gameStatsBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width, + globalScene.game.canvas.height, + 0x006860, + ); gameStatsBg.setOrigin(0, 0); this.runContainer.add(gameStatsBg); @@ -112,7 +118,7 @@ export default 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.game.canvas.width / 6 - 2) / 3; // Creates Run Result Container this.runResultContainer = globalScene.add.container(0, 24); @@ -131,14 +137,17 @@ export default class RunInfoUiHandler extends UiHandler { const runInfoWindow = addWindow(0, 0, this.statsBgWidth - 11, 90); const runInfoWindowCoords = runInfoWindow.getBottomRight(); this.runInfoContainer.add(runInfoWindow); - this.parseRunInfo(runInfoWindowCoords.x, runInfoWindowCoords.y); + this.parseRunInfo(runInfoWindowCoords.x, runInfoWindowCoords.y); // Creates Player Party Container this.partyContainer = globalScene.add.container(this.statsBgWidth - 10, 23); this.parsePartyInfo(); this.showParty(true); - this.runContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.runContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); this.getUi().bringToTop(this.runContainer); this.runContainer.setVisible(true); @@ -155,7 +164,7 @@ export default class RunInfoUiHandler extends UiHandler { this.getUi().hideTooltip(); return true; - } + } /** * Creates and adds the header background, title text, and important buttons to RunInfoUiHandler @@ -163,22 +172,33 @@ export default 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.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); this.runContainer.add(headerBg); if (this.runInfo.modifiers.length !== 0) { const headerBgCoords = headerBg.getTopRight(); const abilityButtonContainer = globalScene.add.container(0, 0); - const abilityButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, { fontSize:"34px" }); + const abilityButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, { + fontSize: "34px", + }); const gamepadType = this.getUi().getGamepadType(); let abilityButtonElement: Phaser.GameObjects.Sprite; if (gamepadType === "touch") { abilityButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 2, "keyboard", "E.png"); } else { - abilityButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 2, gamepadType, globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability)); + abilityButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 2, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability), + ); } - abilityButtonContainer.add([ abilityButtonText, abilityButtonElement ]); - abilityButtonContainer.setPosition(headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, 10); + abilityButtonContainer.add([abilityButtonText, abilityButtonElement]); + abilityButtonContainer.setPosition( + headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, + 10, + ); this.runContainer.add(abilityButtonContainer); } const headerText = addTextObject(0, 0, i18next.t("runHistory:runInfo"), TextStyle.SETTINGS_LABEL); @@ -199,13 +219,25 @@ export default class RunInfoUiHandler extends UiHandler { const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex]; const runResultTextStyle = this.isVictory ? TextStyle.PERFECT_IV : TextStyle.SUMMARY_RED; - const runResultTitle = this.isVictory ? i18next.t("runHistory:victory") : i18next.t("runHistory:defeated", { context: genderStr }); - const runResultText = addTextObject(6, 5, `${runResultTitle} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, runResultTextStyle, { fontSize : "65px", lineSpacing: 0.1 }); + const runResultTitle = this.isVictory + ? i18next.t("runHistory:victory") + : i18next.t("runHistory:defeated", { context: genderStr }); + const runResultText = addTextObject( + 6, + 5, + `${runResultTitle} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, + runResultTextStyle, + { fontSize: "65px", lineSpacing: 0.1 }, + ); if (this.isVictory) { const hallofFameInstructionContainer = globalScene.add.container(0, 0); - const shinyButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, { fontSize:"65px" }); - const formButtonText = addTextObject(8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, { fontSize:"65px" }); + const shinyButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, { + fontSize: "65px", + }); + const formButtonText = addTextObject(8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, { + fontSize: "65px", + }); const gamepadType = this.getUi().getGamepadType(); let shinyButtonElement: Phaser.GameObjects.Sprite; let formButtonElement: Phaser.GameObjects.Sprite; @@ -213,12 +245,24 @@ export default class RunInfoUiHandler extends UiHandler { shinyButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 4, "keyboard", "R.png"); formButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 16, "keyboard", "F.png"); } else { - shinyButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 4, gamepadType, globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny)); - formButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 16, gamepadType, globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form)); + shinyButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 4, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny), + ); + formButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 16, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form), + ); } - hallofFameInstructionContainer.add([ shinyButtonText, shinyButtonElement ]); + hallofFameInstructionContainer.add([shinyButtonText, shinyButtonElement]); - hallofFameInstructionContainer.add([ formButtonText, formButtonElement ]); + hallofFameInstructionContainer.add([formButtonText, formButtonElement]); hallofFameInstructionContainer.setPosition(12, 25); this.runResultContainer.add(hallofFameInstructionContainer); @@ -229,18 +273,24 @@ export default class RunInfoUiHandler extends UiHandler { if (!this.isVictory) { const enemyContainer = globalScene.add.container(0, 0); // Wild - Single and Doubles - if (this.runInfo.battleType === BattleType.WILD || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && !this.runInfo.trainer)) { + if ( + this.runInfo.battleType === BattleType.WILD || + (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && !this.runInfo.trainer) + ) { switch (this.runInfo.enemyParty.length) { case 1: - // Wild - Singles + // Wild - Singles this.parseWildSingleDefeat(enemyContainer); break; case 2: - //Wild - Doubles + //Wild - Doubles this.parseWildDoubleDefeat(enemyContainer); break; } - } else if (this.runInfo.battleType === BattleType.TRAINER || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && this.runInfo.trainer)) { + } else if ( + this.runInfo.battleType === BattleType.TRAINER || + (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && this.runInfo.trainer) + ) { this.parseTrainerDefeat(enemyContainer); } this.runResultContainer.add(enemyContainer); @@ -270,20 +320,30 @@ export default class RunInfoUiHandler extends UiHandler { const pokeball = globalScene.add.sprite(0, 0, "pb"); pokeball.setFrame(getPokeballAtlasKey(p.pokeball)); pokeball.setScale(0.5); - pokeball.setPosition(58 + ((i % row_limit) * 8), (i <= 2) ? 18 : 25); + pokeball.setPosition(58 + (i % row_limit) * 8, i <= 2 ? 18 : 25); enemyContainer.add(pokeball); }); const trainerObj = this.runInfo.trainer.toTrainer(); const RIVAL_TRAINER_ID_THRESHOLD = 375; let trainerName = ""; if (this.runInfo.trainer.trainerType >= RIVAL_TRAINER_ID_THRESHOLD) { - trainerName = (trainerObj.variant === TrainerVariant.FEMALE) ? i18next.t("trainerNames:rival_female") : i18next.t("trainerNames:rival"); + trainerName = + trainerObj.variant === TrainerVariant.FEMALE + ? i18next.t("trainerNames:rival_female") + : i18next.t("trainerNames:rival"); } else { trainerName = trainerObj.getName(0, true); } - const boxString = i18next.t(trainerObj.variant !== TrainerVariant.DOUBLE ? "battle:trainerAppeared" : "battle:trainerAppearedDouble", { trainerName: trainerName }).replace(/\n/g, " "); + const boxString = i18next + .t(trainerObj.variant !== TrainerVariant.DOUBLE ? "battle:trainerAppeared" : "battle:trainerAppearedDouble", { + trainerName: trainerName, + }) + .replace(/\n/g, " "); const descContainer = globalScene.add.container(0, 0); - const textBox = addTextObject(0, 0, boxString, TextStyle.WINDOW, { fontSize : "35px", wordWrap: { width: 200 }}); + const textBox = addTextObject(0, 0, boxString, TextStyle.WINDOW, { + fontSize: "35px", + wordWrap: { width: 200 }, + }); descContainer.add(textBox); descContainer.setPosition(55, 32); this.runResultContainer.add(descContainer); @@ -294,25 +354,43 @@ export default class RunInfoUiHandler extends UiHandler { const subSprite = globalScene.add.sprite(56, -106, "pkmn__sub"); subSprite.setScale(0.65); subSprite.setPosition(34, 46); - const mysteryEncounterTitle = i18next.t(globalScene.getMysteryEncounter(this.runInfo.mysteryEncounterType as MysteryEncounterType, true).localizationKey + ":title"); + const mysteryEncounterTitle = i18next.t( + globalScene.getMysteryEncounter(this.runInfo.mysteryEncounterType as MysteryEncounterType, true) + .localizationKey + ":title", + ); const descContainer = globalScene.add.container(0, 0); - const textBox = addTextObject(0, 0, mysteryEncounterTitle, TextStyle.WINDOW, { fontSize : "45px", wordWrap: { width: 160 }}); + const textBox = addTextObject(0, 0, mysteryEncounterTitle, TextStyle.WINDOW, { + fontSize: "45px", + wordWrap: { width: 160 }, + }); descContainer.add(textBox); descContainer.setPosition(47, 37); - this.runResultContainer.add([ encounterExclaim, subSprite, descContainer ]); + this.runResultContainer.add([encounterExclaim, subSprite, descContainer]); } const runResultWindow = this.runResultContainer.getByName("Run_Result_Window") as Phaser.GameObjects.Image; const windowCenterX = runResultWindow.getTopCenter().x; const windowBottomY = runResultWindow.getBottomCenter().y; - const runStatusText = addTextObject(windowCenterX, 5, `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, TextStyle.WINDOW, { fontSize : "60px", lineSpacing: 0.1 }); + const runStatusText = addTextObject( + windowCenterX, + 5, + `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, + TextStyle.WINDOW, + { fontSize: "60px", lineSpacing: 0.1 }, + ); runStatusText.setOrigin(0.5, 0); - const currentBiomeText = addTextObject(windowCenterX, windowBottomY - 5, `${getBiomeName(this.runInfo.arena.biome)}`, TextStyle.WINDOW, { fontSize: "60px" }); + const currentBiomeText = addTextObject( + windowCenterX, + windowBottomY - 5, + `${getBiomeName(this.runInfo.arena.biome)}`, + TextStyle.WINDOW, + { fontSize: "60px" }, + ); currentBiomeText.setOrigin(0.5, 1); - this.runResultContainer.add([ runStatusText, currentBiomeText ]); + this.runResultContainer.add([runStatusText, currentBiomeText]); this.runContainer.add(this.runResultContainer); } @@ -330,7 +408,13 @@ export default class RunInfoUiHandler extends UiHandler { const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); const enemyLevelStyle = bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY; - const enemyLevel = addTextObject(36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, enemyLevelStyle, { fontSize: "44px", color: "#f8f8f8" }); + const enemyLevel = addTextObject( + 36, + 26, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + enemyLevelStyle, + { fontSize: "44px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -354,7 +438,13 @@ export default class RunInfoUiHandler extends UiHandler { enemyData["player"] = true; const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); - const enemyLevel = addTextObject(36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "44px", color: "#f8f8f8" }); + const enemyLevel = addTextObject( + 36, + 26, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY, + { fontSize: "44px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -386,8 +476,8 @@ export default class RunInfoUiHandler extends UiHandler { const tObjPartnerSprite = globalScene.add.sprite(5, -3, tObjPartnerSpriteKey); // Double Trainers have smaller sprites than Single Trainers if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) { - tObjPartnerSprite.setScale(0.20); - tObjSprite.setScale(0.20); + tObjPartnerSprite.setScale(0.2); + tObjSprite.setScale(0.2); doubleContainer.add(tObjSprite); doubleContainer.add(tObjPartnerSprite); doubleContainer.setPosition(12, 38); @@ -395,13 +485,13 @@ export default class RunInfoUiHandler extends UiHandler { tObjSprite.setScale(0.55); tObjSprite.setPosition(-9, -3); tObjPartnerSprite.setScale(0.55); - doubleContainer.add([ tObjSprite, tObjPartnerSprite ]); + doubleContainer.add([tObjSprite, tObjPartnerSprite]); doubleContainer.setPosition(28, 34); } enemyContainer.add(doubleContainer); } else { - const scale = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? 0.35 : 0.55; - const position = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? [ 12, 28 ] : [ 30, 32 ]; + const scale = this.runDisplayMode === RunDisplayMode.RUN_HISTORY ? 0.35 : 0.55; + const position = this.runDisplayMode === RunDisplayMode.RUN_HISTORY ? [12, 28] : [30, 32]; tObjSprite.setScale(scale, scale); tObjSprite.setPosition(position[0], position[1]); enemyContainer.add(tObjSprite); @@ -433,8 +523,14 @@ export default class RunInfoUiHandler extends UiHandler { enemyData["player"] = true; const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); - enemyIcon.setPosition(39 * (e % 3) + 5, (35 * pokemonRowHeight)); - const enemyLevel = addTextObject(43 * (e % 3), (27 * (pokemonRowHeight + 1)), `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "54px" }); + enemyIcon.setPosition(39 * (e % 3) + 5, 35 * pokemonRowHeight); + const enemyLevel = addTextObject( + 43 * (e % 3), + 27 * (pokemonRowHeight + 1), + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, + { fontSize: "54px" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(0, 0); @@ -457,7 +553,10 @@ export default class RunInfoUiHandler extends UiHandler { private async parseRunInfo(windowX: number, windowY: number) { // Parsing and displaying the mode. // In the future, parsing Challenges + Challenge Rules may have to be reworked as PokeRogue adds additional challenges and users can stack these challenges in various ways. - const modeText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { fontSize : "50px", lineSpacing:3 }); + const modeText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { + fontSize: "50px", + lineSpacing: 3, + }); modeText.setPosition(7, 5); modeText.appendText(i18next.t("runHistory:mode") + ": ", false); switch (this.runInfo.gameMode) { @@ -491,7 +590,10 @@ export default class RunInfoUiHandler extends UiHandler { } // If the player achieves a personal best in Endless, the mode text will be tinted similarly to SSS luck to celebrate their achievement. - if ((this.runInfo.gameMode === GameModes.ENDLESS || this.runInfo.gameMode === GameModes.SPLICED_ENDLESS) && this.runInfo.waveIndex === globalScene.gameData.gameStats.highestEndlessWave) { + if ( + (this.runInfo.gameMode === GameModes.ENDLESS || this.runInfo.gameMode === GameModes.SPLICED_ENDLESS) && + this.runInfo.waveIndex === globalScene.gameData.gameStats.highestEndlessWave + ) { modeText.appendText(` [${i18next.t("runHistory:personalBest")}]`); modeText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } @@ -499,22 +601,35 @@ export default class RunInfoUiHandler extends UiHandler { // Duration + Money const runInfoTextContainer = globalScene.add.container(0, 0); // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. - const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; - const runInfoText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { fontSize: "50px", lineSpacing: lineSpacing }); + const lineSpacing = i18next.resolvedLanguage === "ja" ? 12 : 3; + const runInfoText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { + fontSize: "50px", + lineSpacing: lineSpacing, + }); const runTime = Utils.getPlayTimeString(this.runInfo.playTime); runInfoText.appendText(`${i18next.t("runHistory:runLength")}: ${runTime}`, false); const runMoney = Utils.formatMoney(globalScene.moneyFormat, this.runInfo.money); const moneyTextColor = getTextColor(TextStyle.MONEY_WINDOW, false, globalScene.uiTheme); - runInfoText.appendText(`[color=${moneyTextColor}]${i18next.t("battleScene:moneyOwned", { formattedMoney : runMoney })}[/color]`); + runInfoText.appendText( + `[color=${moneyTextColor}]${i18next.t("battleScene:moneyOwned", { formattedMoney: runMoney })}[/color]`, + ); runInfoText.setPosition(7, 70); runInfoTextContainer.add(runInfoText); // Luck // Uses the parameters windowX and windowY to dynamically position the luck value neatly into the bottom right corner - const luckText = addBBCodeTextObject(0, 0, "", TextStyle.WINDOW, { fontSize: "55px" }); - const luckValue = Phaser.Math.Clamp(this.runInfo.party.map(p => p.toPokemon().getLuck()).reduce((total: number, value: number) => total += value, 0), 0, 14); + const luckText = addBBCodeTextObject(0, 0, "", TextStyle.WINDOW, { + fontSize: "55px", + }); + const luckValue = Phaser.Math.Clamp( + this.runInfo.party + .map(p => p.toPokemon().getLuck()) + .reduce((total: number, value: number) => (total += value), 0), + 0, + 14, + ); let luckInfo = i18next.t("runHistory:luck") + ": " + getLuckString(luckValue); if (luckValue < 14) { - luckInfo = "[color=#" + (getLuckTextTint(luckValue)).toString(16) + "]" + luckInfo + "[/color]"; + luckInfo = "[color=#" + getLuckTextTint(luckValue).toString(16) + "]" + luckInfo + "[/color]"; } else { luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } @@ -527,7 +642,10 @@ export default class RunInfoUiHandler extends UiHandler { if (this.runInfo.modifiers.length) { let visibleModifierIndex = 0; - const modifierIconsContainer = globalScene.add.container(8, (this.runInfo.gameMode === GameModes.CHALLENGE) ? 20 : 15); + const modifierIconsContainer = globalScene.add.container( + 8, + this.runInfo.gameMode === GameModes.CHALLENGE ? 20 : 15, + ); modifierIconsContainer.setScale(0.45); for (const m of this.runInfo.modifiers) { const modifier = m.toModifier(this.modifiersModule[m.className]); @@ -537,7 +655,7 @@ export default class RunInfoUiHandler extends UiHandler { const icon = modifier?.getIcon(false); if (icon) { const rowHeightModifier = Math.floor(visibleModifierIndex / 7); - icon.setPosition(24 * (visibleModifierIndex % 7), 20 + (35 * rowHeightModifier)); + icon.setPosition(24 * (visibleModifierIndex % 7), 20 + 35 * rowHeightModifier); modifierIconsContainer.add(icon); } @@ -572,14 +690,18 @@ export default class RunInfoUiHandler extends UiHandler { const typeRule = PokemonType[this.runInfo.challenges[i].value - 1]; const typeTextColor = `[color=${TypeColor[typeRule]}]`; const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; - const typeText = typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; + const typeText = + typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; rules.push(typeText); break; case Challenges.INVERSE_BATTLE: rules.push(i18next.t("challenges:inverseBattle.shortName")); break; default: - const localisationKey = Challenges[this.runInfo.challenges[i].id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + const localisationKey = 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`)); break; } @@ -593,22 +715,22 @@ export default class RunInfoUiHandler extends UiHandler { * Default Information: Icon, Level, Nature, Ability, Passive, Shiny Status, Fusion Status, Stats, and Moves. * B-Side Information: Icon + Held Items (Can be displayed to the user through pressing the abilityButton) */ - private parsePartyInfo(): void { + 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.game.canvas.height / 6 - 23) / 6; - party.forEach((p: PokemonData, i: number) => { - const pokemonInfoWindow = new RoundRectangle(globalScene, 0, 14, (this.statsBgWidth * 2) + 10, windowHeight - 2, 3); + party.forEach((p: PokemonData, i: number) => { + const pokemonInfoWindow = new RoundRectangle(globalScene, 0, 14, this.statsBgWidth * 2 + 10, windowHeight - 2, 3); - const pokemon = p.toPokemon(); - const pokemonInfoContainer = globalScene.add.container(this.statsBgWidth + 5, (windowHeight - 0.5) * i); + const pokemon = p.toPokemon(); + const pokemonInfoContainer = globalScene.add.container(this.statsBgWidth + 5, (windowHeight - 0.5) * i); - const types = pokemon.getTypes(); - const type1 = getTypeRgb(types[0]); - const type1Color = new Phaser.Display.Color(type1[0], type1[1], type1[2]); + const types = pokemon.getTypes(); + const type1 = getTypeRgb(types[0]); + const type1Color = new Phaser.Display.Color(type1[0], type1[1], type1[2]); - const bgColor = type1Color.clone().darken(45); + const bgColor = type1Color.clone().darken(45); pokemonInfoWindow.setFillStyle(bgColor.color); const iconContainer = globalScene.add.container(0, 0); @@ -617,7 +739,9 @@ export default class RunInfoUiHandler extends UiHandler { icon.setPosition(-99, 1); const type2 = types[1] ? getTypeRgb(types[1]) : undefined; const type2Color = type2 ? new Phaser.Display.Color(type2[0], type2[1], type2[2]) : undefined; - type2Color ? pokemonInfoWindow.setStrokeStyle(1, type2Color.color, 0.95) : pokemonInfoWindow.setStrokeStyle(1, type1Color.color, 0.95); + type2Color + ? pokemonInfoWindow.setStrokeStyle(1, type2Color.color, 0.95) + : pokemonInfoWindow.setStrokeStyle(1, type1Color.color, 0.95); this.getUi().bringToTop(icon); @@ -630,7 +754,7 @@ export default class RunInfoUiHandler extends UiHandler { const pName = pokemon.getNameToRender(); //With the exception of Korean/Traditional Chinese/Simplified Chinese, the code shortens the terms for ability and passive to their first letter. //These languages are exempted because they are already short enough. - const exemptedLanguages = [ "ko", "zh_CN", "zh_TW" ]; + const exemptedLanguages = ["ko", "zh_CN", "zh_TW"]; let passiveLabel = i18next.t("starterSelectUiHandler:passive") ?? "-"; let abilityLabel = i18next.t("starterSelectUiHandler:ability") ?? "-"; if (!exemptedLanguages.includes(currentLanguage)) { @@ -640,9 +764,14 @@ export default class RunInfoUiHandler extends UiHandler { const pPassiveInfo = pokemon.passive ? passiveLabel + ": " + pokemon.getPassiveAbility().name : ""; const pAbilityInfo = abilityLabel + ": " + pokemon.getAbility().name; // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. - const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; - const pokeInfoText = addBBCodeTextObject(0, 0, pName, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); - pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`); + const lineSpacing = i18next.resolvedLanguage === "ja" ? 12 : 3; + const pokeInfoText = addBBCodeTextObject(0, 0, pName, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); + pokeInfoText.appendText( + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`, + ); pokeInfoText.appendText(pAbilityInfo); pokeInfoText.appendText(pPassiveInfo); pokeInfoTextContainer.add(pokeInfoText); @@ -650,27 +779,36 @@ export default class RunInfoUiHandler extends UiHandler { // Pokemon Stats // Colored Arrows (Red/Blue) are placed by stats that are boosted from natures const pokeStatTextContainer = globalScene.add.container(-35, 6); - const pStats : string[] = []; - pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1))); + const pStats: string[] = []; + pokemon.stats.forEach(element => pStats.push(Utils.formatFancyLargeNumber(element, 1))); for (let i = 0; i < pStats.length; i++) { const isMult = getNatureStatMultiplier(pNature, i); - pStats[i] = (isMult < 1) ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; - pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; + pStats[i] = isMult < 1 ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; + pStats[i] = isMult > 1 ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; } const hp = i18next.t("pokemonInfo:Stat.HPshortened") + ": " + pStats[0]; const atk = i18next.t("pokemonInfo:Stat.ATKshortened") + ": " + pStats[1]; const def = i18next.t("pokemonInfo:Stat.DEFshortened") + ": " + pStats[2]; const spatk = i18next.t("pokemonInfo:Stat.SPATKshortened") + ": " + pStats[3]; const spdef = i18next.t("pokemonInfo:Stat.SPDEFshortened") + ": " + pStats[4]; - const speedLabel = (currentLanguage === "es-ES" || currentLanguage === "pt_BR") ? i18next.t("runHistory:SPDshortened") : i18next.t("pokemonInfo:Stat.SPDshortened"); + const speedLabel = + currentLanguage === "es-ES" || currentLanguage === "pt_BR" + ? i18next.t("runHistory:SPDshortened") + : i18next.t("pokemonInfo:Stat.SPDshortened"); const speed = speedLabel + ": " + pStats[5]; // Column 1: HP Atk Def - const pokeStatText1 = addBBCodeTextObject(-5, 0, hp, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); + const pokeStatText1 = addBBCodeTextObject(-5, 0, hp, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); pokeStatText1.appendText(atk); pokeStatText1.appendText(def); pokeStatTextContainer.add(pokeStatText1); // Column 2: SpAtk SpDef Speed - const pokeStatText2 = addBBCodeTextObject(25, 0, spatk, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); + const pokeStatText2 = addBBCodeTextObject(25, 0, spatk, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); pokeStatText2.appendText(spdef); pokeStatText2.appendText(speed); pokeStatTextContainer.add(pokeStatText2); @@ -681,7 +819,9 @@ export default class RunInfoUiHandler extends UiHandler { const splicedIcon = globalScene.add.image(0, 0, "icon_spliced"); splicedIcon.setScale(0.35); splicedIcon.setOrigin(0, 0); - pokemon.isShiny() ? splicedIcon.setPositionRelative(pokeInfoTextContainer, 35, 0) : splicedIcon.setPositionRelative(pokeInfoTextContainer, 28, 0); + pokemon.isShiny() + ? splicedIcon.setPositionRelative(pokeInfoTextContainer, 35, 0) + : splicedIcon.setPositionRelative(pokeInfoTextContainer, 28, 0); marksContainer.add(splicedIcon); this.getUi().bringToTop(splicedIcon); } @@ -709,32 +849,38 @@ export default class RunInfoUiHandler extends UiHandler { // Need to check if dynamically typed moves const pokemonMoveset = pokemon.getMoveset(); const movesetContainer = globalScene.add.container(70, -29); - const pokemonMoveBgs : Phaser.GameObjects.NineSlice[] = []; - const pokemonMoveLabels : Phaser.GameObjects.Text[] = []; - const movePos = [[ -6.5, 35.5 ], [ 37, 35.5 ], [ -6.5, 43.5 ], [ 37, 43.5 ]]; + const pokemonMoveBgs: Phaser.GameObjects.NineSlice[] = []; + const pokemonMoveLabels: Phaser.GameObjects.Text[] = []; + const movePos = [ + [-6.5, 35.5], + [37, 35.5], + [-6.5, 43.5], + [37, 43.5], + ]; for (let m = 0; m < pokemonMoveset?.length; m++) { - const moveContainer = globalScene.add.container(movePos[m][0], movePos[m][1]); + const moveContainer = globalScene.add.container(movePos[m][0], movePos[m][1]); moveContainer.setScale(0.5); - const moveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 85, 15, 2, 2, 2, 2); - moveBg.setOrigin(1, 0); - const moveLabel = addTextObject(-moveBg.width / 2, 2, "-", TextStyle.PARTY); - moveLabel.setOrigin(0.5, 0); - moveLabel.setName("text-move-label"); - pokemonMoveBgs.push(moveBg); - pokemonMoveLabels.push(moveLabel); - moveContainer.add(moveBg); - moveContainer.add(moveLabel); - movesetContainer.add(moveContainer); - const move = pokemonMoveset[m]?.getMove(); + const moveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 85, 15, 2, 2, 2, 2); + moveBg.setOrigin(1, 0); + const moveLabel = addTextObject(-moveBg.width / 2, 2, "-", TextStyle.PARTY); + moveLabel.setOrigin(0.5, 0); + moveLabel.setName("text-move-label"); + pokemonMoveBgs.push(moveBg); + pokemonMoveLabels.push(moveLabel); + moveContainer.add(moveBg); + moveContainer.add(moveLabel); + movesetContainer.add(moveContainer); + const move = pokemonMoveset[m]?.getMove(); pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); pokemonMoveLabels[m].setText(move ? move.name : "-"); - } + } // Pokemon Held Items - not displayed by default // Endless/Endless Spliced have a different scale because Pokemon tend to accumulate more items in these runs. - const heldItemsScale = (this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS) ? 0.25 : 0.5; + const heldItemsScale = + this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS ? 0.25 : 0.5; const heldItemsContainer = globalScene.add.container(-82, 2); - const heldItemsList : Modifier.PokemonHeldItemModifier[] = []; + const heldItemsList: Modifier.PokemonHeldItemModifier[] = []; if (this.runInfo.modifiers.length) { for (const m of this.runInfo.modifiers) { const modifier = m.toModifier(this.modifiersModule[m.className]); @@ -746,14 +892,17 @@ export default class RunInfoUiHandler extends UiHandler { if (heldItemsList.length > 0) { (heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc); let row = 0; - for (const [ index, item ] of heldItemsList.entries()) { - if ( index > 36 ) { + for (const [index, item] of heldItemsList.entries()) { + if (index > 36) { const overflowIcon = addTextObject(182, 4, "+", TextStyle.WINDOW); heldItemsContainer.add(overflowIcon); break; } const itemIcon = item?.getIcon(true); - if (item?.stackCount < item?.getMaxHeldItemCount(pokemon) && itemIcon.list[1] instanceof Phaser.GameObjects.BitmapText) { + if ( + item?.stackCount < item?.getMaxHeldItemCount(pokemon) && + itemIcon.list[1] instanceof Phaser.GameObjects.BitmapText + ) { itemIcon.list[1].clearTint(); } itemIcon.setScale(heldItemsScale); @@ -784,9 +933,9 @@ export default class RunInfoUiHandler extends UiHandler { pokemonInfoContainer.setName("PkmnInfo"); this.partyContainer.add(pokemonInfoContainer); pokemon.destroy(); - }); + }); this.runContainer.add(this.partyContainer); - } + } /** * Changes what is displayed of the Pokemon's held items @@ -816,7 +965,13 @@ export default class RunInfoUiHandler extends UiHandler { const endCard = globalScene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); endCard.setOrigin(0); endCard.setScale(0.5); - const text = addTextObject(globalScene.game.canvas.width / 12, (globalScene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + const text = addTextObject( + globalScene.game.canvas.width / 12, + globalScene.game.canvas.height / 6 - 16, + i18next.t("battle:congratulations"), + TextStyle.SUMMARY, + { fontSize: "128px" }, + ); text.setOrigin(0.5); this.endCardContainer.add(endCard); this.endCardContainer.add(text); @@ -847,8 +1002,13 @@ export default class RunInfoUiHandler extends UiHandler { this.hallofFameContainer.add(endCard); this.hallofFameContainer.add(hallofFameBg); - const hallofFameText = addTextObject(0, 0, i18next.t("runHistory:hallofFameText", { context: genderStr }), TextStyle.WINDOW); - hallofFameText.setPosition(endCardCoords.x - (hallofFameText.displayWidth / 2), 164); + const hallofFameText = addTextObject( + 0, + 0, + i18next.t("runHistory:hallofFameText", { context: genderStr }), + TextStyle.WINDOW, + ); + hallofFameText.setPosition(endCardCoords.x - hallofFameText.displayWidth / 2, 164); this.hallofFameContainer.add(hallofFameText); this.runInfo.party.forEach((p, i) => { const pkmn = p.toPokemon(); @@ -858,8 +1018,11 @@ export default class RunInfoUiHandler extends UiHandler { const formIndex = pkmn.formIndex; const variant = pkmn.variant; const species = pkmn.getSpeciesForm(); - const pokemonSprite: Phaser.GameObjects.Sprite = globalScene.add.sprite(60 + 40 * i, 40 + row * 80, "pkmn__sub"); - pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const pokemonSprite: Phaser.GameObjects.Sprite = globalScene.add.sprite(60 + 40 * i, 40 + row * 80, "pkmn__sub"); + pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.hallofFameContainer.add(pokemonSprite); const speciesLoaded: Map = new Map(); speciesLoaded.set(id, false); @@ -874,7 +1037,7 @@ export default class RunInfoUiHandler extends UiHandler { pokemonSprite.setVisible(true); }); if (pkmn.isFusion()) { - const fusionIcon = globalScene.add.sprite(80 + 40 * i, 50 + row * 80, pkmn.getFusionIconAtlasKey()); + const fusionIcon = globalScene.add.sprite(80 + 40 * i, 50 + row * 80, pkmn.getFusionIconAtlasKey()); fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pkmn.getFusionIconId(true)); @@ -892,7 +1055,7 @@ export default class RunInfoUiHandler extends UiHandler { * Button.CANCEL, Button.LEFT - removes all containers related to RunInfo and returns the user to Run History * Button.CYCLE_FORM, Button.CYCLE_SHINY, Button.CYCLE_ABILITY - runs the function buttonCycleOption() */ - override processInput(button: Button): boolean { + override processInput(button: Button): boolean { const ui = this.getUi(); let success = false; @@ -986,4 +1149,3 @@ export default class RunInfoUiHandler extends UiHandler { } } } - diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index e746c9302d0..a1e9e5219b4 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -17,13 +17,12 @@ const SLOTS_ON_SCREEN = 3; export enum SaveSlotUiMode { LOAD, - SAVE + SAVE, } export type SaveSlotSelectCallback = (cursor: number) => void; export default class SaveSlotSelectUiHandler extends MessageUiHandler { - private saveSlotSelectContainer: Phaser.GameObjects.Container; private sessionSlotsContainer: Phaser.GameObjects.Container; private saveSlotSelectMessageBox: Phaser.GameObjects.NineSlice; @@ -33,7 +32,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { private uiMode: SaveSlotUiMode; private saveSlotSelectCallback: SaveSlotSelectCallback | null; - private scrollCursor: number = 0; + private scrollCursor = 0; private cursorObj: Phaser.GameObjects.Container | null; @@ -50,7 +49,13 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { this.saveSlotSelectContainer.setVisible(false); ui.add(this.saveSlotSelectContainer); - const loadSessionBg = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, -globalScene.game.canvas.height / 6, 0x006860); + const loadSessionBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + -globalScene.game.canvas.height / 6, + 0x006860, + ); loadSessionBg.setOrigin(0, 0); this.saveSlotSelectContainer.add(loadSessionBg); @@ -75,7 +80,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if ((args.length < 2 || !(args[1] instanceof Function))) { + if (args.length < 2 || !(args[1] instanceof Function)) { return false; } @@ -108,31 +113,39 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (this.uiMode) { case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - originalCallback && originalCallback(cursor); + originalCallback?.(cursor); break; - case SaveSlotUiMode.SAVE: + case SaveSlotUiMode.SAVE: { const saveAndCallback = () => { const originalCallback = this.saveSlotSelectCallback; this.saveSlotSelectCallback = null; ui.revertMode(); ui.showText("", 0); ui.setMode(Mode.MESSAGE); - originalCallback && originalCallback(cursor); + originalCallback?.(cursor); }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => { - globalScene.gameData.deleteSession(cursor).then(response => { - if (response === false) { - globalScene.reset(true); - } else { - saveAndCallback(); - } - }); - }, () => { - ui.revertMode(); - ui.showText("", 0); - }, false, 0, 19, import.meta.env.DEV ? 300 : 2000); + ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + globalScene.reset(true); + } else { + saveAndCallback(); + } + }); + }, + () => { + ui.revertMode(); + ui.showText("", 0); + }, + false, + 0, + 19, + import.meta.env.DEV ? 300 : 2000, + ); }); } else if (this.sessionSlots[cursor].hasData === false) { saveAndCallback(); @@ -140,12 +153,13 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { return false; } break; + } } success = true; } } else { this.saveSlotSelectCallback = null; - originalCallback && originalCallback(-1); + originalCallback?.(-1); success = true; } } else { @@ -153,11 +167,11 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (button) { case Button.UP: if (this.cursor) { - // Check to prevent cursor from accessing a negative index - success = (this.cursor === 0) ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); + // Check to prevent cursor from accessing a negative index + success = this.cursor === 0 ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); } else if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1, cursorPosition); - } else if ((this.cursor === 0) && (this.scrollCursor === 0)) { + } else if (this.cursor === 0 && this.scrollCursor === 0) { this.setScrollCursor(SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN); // Revert to avoid an extra session slot sticking out this.revertSessionSlot(SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN); @@ -166,11 +180,14 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if (this.cursor < (SLOTS_ON_SCREEN - 1)) { + if (this.cursor < SLOTS_ON_SCREEN - 1) { success = this.setCursor(this.cursor + 1, cursorPosition); } else if (this.scrollCursor < SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN) { success = this.setScrollCursor(this.scrollCursor + 1, cursorPosition); - } else if ((this.cursor === SLOTS_ON_SCREEN - 1) && (this.scrollCursor === SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN)) { + } else if ( + this.cursor === SLOTS_ON_SCREEN - 1 && + this.scrollCursor === SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN + ) { this.setScrollCursor(0); this.revertSessionSlot(SLOTS_ON_SCREEN - 1); this.setCursor(0); @@ -179,7 +196,11 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { break; case Button.RIGHT: if (this.sessionSlots[cursorPosition].hasData && this.sessionSlots[cursorPosition].saveData) { - globalScene.ui.setOverlayMode(Mode.RUN_INFO, this.sessionSlots[cursorPosition].saveData, RunDisplayMode.SESSION_PREVIEW); + globalScene.ui.setOverlayMode( + Mode.RUN_INFO, + this.sessionSlots[cursorPosition].saveData, + RunDisplayMode.SESSION_PREVIEW, + ); success = true; } } @@ -200,17 +221,24 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { globalScene.add.existing(sessionSlot); this.sessionSlotsContainer.add(sessionSlot); this.sessionSlots.push(sessionSlot); - sessionSlot.load().then((success) => { + sessionSlot.load().then(success => { // If the cursor was moved to this slot while the session was loading // call setCursor again to shift the slot position and show the arrow for save preview - if (success && (this.cursor + this.scrollCursor) === s) { + if (success && this.cursor + this.scrollCursor === s) { this.setCursor(s); } }); } } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); if (text?.indexOf("\n") === -1) { @@ -235,11 +263,22 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { if (!this.cursorObj) { this.cursorObj = globalScene.add.container(0, 0); - const cursorBox = globalScene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 44, 6, 6, 6, 6); + const cursorBox = globalScene.add.nineslice( + 0, + 0, + "select_cursor_highlight_thick", + undefined, + 296, + 44, + 6, + 6, + 6, + 6, + ); const rightArrow = globalScene.add.image(0, 0, "cursor"); rightArrow.setPosition(160, 0); rightArrow.setName("rightArrow"); - this.cursorObj.add([ cursorBox, rightArrow ]); + this.cursorObj.add([cursorBox, rightArrow]); this.sessionSlotsContainer.add(this.cursorObj); } const cursorPosition = cursor + this.scrollCursor; @@ -301,7 +340,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { targets: this.sessionSlotsContainer, y: this.sessionSlotsContainerInitialY - 56 * scrollCursor, duration: Utils.fixedInt(325), - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } @@ -357,7 +396,12 @@ class SessionSlot extends Phaser.GameObjects.Container { async setupWithData(data: SessionSaveData) { this.remove(this.loadingLabel, true); - const gameModeLabel = addTextObject(8, 5, `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, TextStyle.WINDOW); + const gameModeLabel = addTextObject( + 8, + 5, + `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, + TextStyle.WINDOW, + ); this.add(gameModeLabel); const timestampLabel = addTextObject(8, 19, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); @@ -374,7 +418,13 @@ class SessionSlot extends Phaser.GameObjects.Container { const pokemon = p.toPokemon(); const icon = globalScene.addPokemonIcon(pokemon, 0, 0, 0, 0); - const text = addTextObject(32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const text = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); text.setShadow(0, 0, undefined); text.setStroke("#424242", 14); text.setOrigin(1, 0); diff --git a/src/ui/saving-icon-handler.ts b/src/ui/saving-icon-handler.ts index ca7b1fb1aa8..4404ea423b1 100644 --- a/src/ui/saving-icon-handler.ts +++ b/src/ui/saving-icon-handler.ts @@ -45,7 +45,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { this.hide(); } }); - } + }, }); this.setVisible(true); @@ -72,7 +72,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { if (this.shown) { this.show(); } - } + }, }); this.shown = false; diff --git a/src/ui/scroll-bar.ts b/src/ui/scroll-bar.ts index eb74bfddfde..404553025e3 100644 --- a/src/ui/scroll-bar.ts +++ b/src/ui/scroll-bar.ts @@ -29,7 +29,18 @@ export class ScrollBar extends Phaser.GameObjects.Container { const borderSize = 2; width = Math.max(width, 4); - this.bg = globalScene.add.nineslice(0, 0, "scroll_bar", undefined, width, height, borderSize, borderSize, borderSize, borderSize); + this.bg = globalScene.add.nineslice( + 0, + 0, + "scroll_bar", + undefined, + width, + height, + borderSize, + borderSize, + borderSize, + borderSize, + ); this.bg.setOrigin(0, 0); this.add(this.bg); @@ -60,14 +71,16 @@ export class ScrollBar extends Phaser.GameObjects.Container { */ setTotalRows(rows: number): void { this.totalRows = rows; - this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows / this.totalRows; + this.handleBody.height = + ((this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows) / this.totalRows; this.updateHandlePosition(); this.setVisible(this.totalRows > this.maxRows); } private updateHandlePosition(): void { - this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows * this.currentRow; + this.handleBody.y = + 1 + ((this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows) * this.currentRow; this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight; } } diff --git a/src/ui/scrollable-grid-handler.ts b/src/ui/scrollable-grid-handler.ts index 04851ec002f..54f07d69fb7 100644 --- a/src/ui/scrollable-grid-handler.ts +++ b/src/ui/scrollable-grid-handler.ts @@ -111,7 +111,7 @@ export default class ScrollableGridUiHandler { } else if (this.scrollCursor > 0) { success = this.setScrollCursor(this.scrollCursor - 1); } else { - // wrap around to the last row + // wrap around to the last row let newCursor = this.cursor + (onScreenRows - 1) * this.COLUMNS; if (newCursor > lastVisibleIndex) { newCursor -= this.COLUMNS; @@ -121,13 +121,13 @@ export default class ScrollableGridUiHandler { break; case Button.DOWN: if (currentRowIndex < onScreenRows - 1) { - // Go down one row + // Go down one row success = this.setCursor(Math.min(this.cursor + this.COLUMNS, this.totalElements - itemOffset - 1)); } else if (this.scrollCursor < maxScrollCursor) { - // Scroll down one row + // Scroll down one row success = this.setScrollCursor(this.scrollCursor + 1); } else { - // Wrap around to the top row + // Wrap around to the top row success = this.setScrollCursor(0, this.cursor % this.COLUMNS); } break; @@ -192,5 +192,4 @@ export default class ScrollableGridUiHandler { return scrollChanged || cursorChanged; } - } diff --git a/src/ui/session-reload-modal-ui-handler.ts b/src/ui/session-reload-modal-ui-handler.ts index 640268f0480..d3b88da9e63 100644 --- a/src/ui/session-reload-modal-ui-handler.ts +++ b/src/ui/session-reload-modal-ui-handler.ts @@ -21,27 +21,33 @@ export default class SessionReloadModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { super.setup(); - const label = addTextObject(this.getWidth() / 2, this.getHeight() / 2, "Your session is out of date.\nYour data will be reloaded…", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); + const label = addTextObject( + this.getWidth() / 2, + this.getHeight() / 2, + "Your session is out of date.\nYour data will be reloaded…", + TextStyle.WINDOW, + { fontSize: "48px", align: "center" }, + ); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); } - show(args: any[]): boolean { + show(_args: any[]): boolean { const config: ModalConfig = { - buttonActions: [] + buttonActions: [], }; - return super.show([ config ]); + return super.show([config]); } } diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index e8c3e20c38f..62f78da89f5 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -29,7 +29,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { protected actionLabel: Phaser.GameObjects.Text; protected cancelLabel: Phaser.GameObjects.Text; - protected listening: boolean = false; + protected listening = false; protected buttonPressed: number | null = null; // Icons for displaying current and new button assignments. @@ -40,24 +40,24 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { protected cancelFn: CancelFn | null; abstract swapAction(): boolean; - protected timeLeftAutoClose: number = 5; + protected timeLeftAutoClose = 5; protected countdownTimer; // The specific setting being modified. protected target; /** - * Constructor for the AbstractBindingUiHandler. - * - * @param mode - The UI mode. - */ + * Constructor for the AbstractBindingUiHandler. + * + * @param mode - The UI mode. + */ constructor(mode: Mode | null = null) { super(mode); } /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { const ui = this.getUi(); this.optionSelectContainer = globalScene.add.container(0, 0); @@ -71,11 +71,21 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { ui.add(this.actionsContainer); // Setup backgrounds and text objects for UI. - this.titleBg = addWindow((globalScene.game.canvas.width / 6) - this.getWindowWidth(), -(globalScene.game.canvas.height / 6) + 28 + 21, this.getWindowWidth(), 24); + this.titleBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + 28 + 21, + this.getWindowWidth(), + 24, + ); this.titleBg.setOrigin(0.5); 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, this.getWindowWidth(), 24); + this.actionBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28 + 21 + 21, + this.getWindowWidth(), + 24, + ); this.actionBg.setOrigin(0.5); this.actionsContainer.add(this.actionBg); @@ -87,10 +97,15 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { this.timerText = addTextObject(0, 0, "(5)", TextStyle.WINDOW); this.timerText.setOrigin(0, 0); - this.timerText.setPositionRelative(this.unlockText, (this.unlockText.width / 6) + 5, 0); + this.timerText.setPositionRelative(this.unlockText, this.unlockText.width / 6 + 5, 0); this.optionSelectContainer.add(this.timerText); - this.optionSelectBg = addWindow((globalScene.game.canvas.width / 6) - this.getWindowWidth(), -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28, + this.getWindowWidth(), + this.getWindowHeight(), + ); this.optionSelectBg.setOrigin(0.5); this.optionSelectContainer.add(this.optionSelectBg); @@ -108,17 +123,17 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { if (this.timeLeftAutoClose >= 0) { this.manageAutoCloseTimer(); } else { - this.cancelFn && this.cancelFn(); + this.cancelFn?.(); } }, 1000); } /** - * Show the UI with the provided arguments. - * - * @param args - Arguments to be passed to the show method. - * @returns `true` if successful. - */ + * Show the UI with the provided arguments. + * + * @param args - Arguments to be passed to the show method. + * @returns `true` if successful. + */ show(args: any[]): boolean { super.show(args); this.buttonPressed = null; @@ -139,29 +154,29 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Get the width of the window. - * - * @returns The window width. - */ + * Get the width of the window. + * + * @returns The window width. + */ getWindowWidth(): number { return 160; } /** - * Get the height of the window. - * - * @returns The window height. - */ + * Get the height of the window. + * + * @returns The window height. + */ getWindowHeight(): number { return 64; } /** - * Process the input for the given button. - * - * @param button - The button to process. - * @returns `true` if the input was processed successfully. - */ + * Process the input for the given button. + * + * @param button - The button to process. + * @returns `true` if the input was processed successfully. + */ processInput(button: Button): boolean { if (this.buttonPressed === null) { return false; // TODO: is false correct as default? (previously was `undefined`) @@ -170,19 +185,19 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { let success = false; switch (button) { case Button.LEFT: - case Button.RIGHT: - // Toggle between action and cancel options. - const cursor = this.cursor ? 0 : 1; - success = this.setCursor(cursor); + case Button.RIGHT: { + // Toggle between action and cancel options. + success = this.setCursor(this.cursor ? 0 : 1); break; + } case Button.ACTION: - // Process actions based on current cursor position. + // Process actions based on current cursor position. if (this.cursor === 0) { - this.cancelFn && this.cancelFn(); + this.cancelFn?.(); } else { success = this.swapAction(); NavigationManager.getInstance().updateIcons(); - this.cancelFn && this.cancelFn(success); + this.cancelFn?.(success); } break; } @@ -198,11 +213,11 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Set the cursor to the specified position. - * - * @param cursor - The cursor position to set. - * @returns `true` if the cursor was set successfully. - */ + * Set the cursor to the specified position. + * + * @param cursor - The cursor position to set. + * @returns `true` if the cursor was set successfully. + */ setCursor(cursor: number): boolean { this.cursor = cursor; if (cursor === 1) { @@ -220,8 +235,8 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Clear the UI elements and state. - */ + * Clear the UI elements and state. + */ clear() { super.clear(); clearTimeout(this.countdownTimer); @@ -237,12 +252,12 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Handle input down events. - * - * @param buttonIcon - The icon of the button that was pressed. - * @param assignedButtonIcon - The icon of the button that is assigned. - * @param type - The type of button press. - */ + * Handle input down events. + * + * @param buttonIcon - The icon of the button that was pressed. + * @param assignedButtonIcon - The icon of the button that is assigned. + * @param type - The type of button press. + */ onInputDown(buttonIcon: string, assignedButtonIcon: string | null, type: string): void { clearTimeout(this.countdownTimer); this.timerText.setText(""); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 59af1abba2a..2c634e2c5bf 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -12,17 +12,17 @@ import i18next from "i18next"; import { globalScene } from "#app/global-scene"; export interface InputsIcons { - [key: string]: Phaser.GameObjects.Sprite; + [key: string]: Phaser.GameObjects.Sprite; } export interface LayoutConfig { - optionsContainer: Phaser.GameObjects.Container; - inputsIcons: InputsIcons; - settingLabels: Phaser.GameObjects.Text[]; - optionValueLabels: Phaser.GameObjects.Text[][]; - optionCursors: number[]; - keys: string[]; - bindingSettings: Array; + optionsContainer: Phaser.GameObjects.Container; + inputsIcons: InputsIcons; + settingLabels: Phaser.GameObjects.Text[]; + optionValueLabels: Phaser.GameObjects.Text[][]; + optionCursors: number[]; + keys: string[]; + bindingSettings: Array; } /** * Abstract class for handling UI elements related to control settings. @@ -49,10 +49,10 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler protected inputsIcons: InputsIcons; protected navigationIcons: InputsIcons; // list all the setting keys used in the selected layout (because dualshock has more buttons than xbox) - protected keys: Array; + protected keys: Array; // Store the specific settings related to key bindings for the current gamepad configuration. - protected bindingSettings: Array; + protected bindingSettings: Array; protected setting; protected settingBlacklisted; @@ -81,14 +81,16 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler getLocalStorageSetting(): object { // Retrieve the settings from local storage or use an empty object if none exist. - const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)!) : {}; // TODO: is this bang correct? + const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) + ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)!) + : {}; // TODO: is this bang correct? return settings; } private camelize(string: string): string { - return string.replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ""); + return string + .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => (index === 0 ? word.toLowerCase() : word.toUpperCase())) + .replace(/\s+/g, ""); } /** @@ -101,15 +103,27 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 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), Phaser.Geom.Rectangle.Contains); + this.settingsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); this.navigationContainer = new NavigationMenu(0, 0); - this.optionsBg = addWindow(0, this.navigationContainer.height, (globalScene.game.canvas.width / 6) - 2, (globalScene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg = addWindow( + 0, + this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - 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, 22); + this.actionsBg = addWindow( + 0, + globalScene.game.canvas.height / 6 - this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + 22, + ); this.actionsBg.setOrigin(0, 0); const iconAction = globalScene.add.sprite(0, 0, "keyboard"); @@ -171,13 +185,21 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const inputsIcons: InputsIcons = {}; // Fetch common setting keys such as 'Controller' and 'Gamepad Support' from gamepad settings. - const commonSettingKeys = Object.keys(this.setting).slice(0, this.commonSettingsCount).map(key => this.setting[key]); + const commonSettingKeys = Object.keys(this.setting) + .slice(0, this.commonSettingsCount) + .map(key => this.setting[key]); // Combine common and specific bindings into a single array. - const specificBindingKeys = [ ...commonSettingKeys, ...Object.keys(config.settings) ]; + const specificBindingKeys = [...commonSettingKeys, ...Object.keys(config.settings)]; // Fetch default values for these settings and prepare to highlight selected options. - const optionCursors = Object.values(Object.keys(this.settingDeviceDefaults).filter(s => specificBindingKeys.includes(s)).map(k => this.settingDeviceDefaults[k])); + const optionCursors = Object.values( + Object.keys(this.settingDeviceDefaults) + .filter(s => specificBindingKeys.includes(s)) + .map(k => this.settingDeviceDefaults[k]), + ); // Filter out settings that are not relevant to the current gamepad configuration. - const settingFiltered = Object.keys(this.setting).filter(_key => specificBindingKeys.includes(this.setting[_key])); + const settingFiltered = Object.keys(this.setting).filter(_key => + specificBindingKeys.includes(this.setting[_key]), + ); // Loop through the filtered settings to manage display and options. settingFiltered.forEach((setting, s) => { @@ -202,7 +224,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const valueLabels: Phaser.GameObjects.GameObject[] = []; // Process each option for the current setting. - for (const [ o, option ] of this.settingDeviceOptions[this.setting[setting]].entries()) { + for (const [o, option] of this.settingDeviceOptions[this.setting[setting]].entries()) { // Check if the current setting is for binding keys. if (bindingSettings.includes(this.setting[setting])) { // Create a label for non-null options, typically indicating actionable options like 'change'. @@ -222,7 +244,12 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler continue; } // For regular settings like 'Gamepad support', create a label and determine if it is selected. - const valueLabel = addTextObject(0, 0, option, this.settingDeviceDefaults[this.setting[setting]] === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW); + const valueLabel = addTextObject( + 0, + 0, + option, + this.settingDeviceDefaults[this.setting[setting]] === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW, + ); valueLabel.setOrigin(0, 0); optionsContainer.add(valueLabel); @@ -235,14 +262,16 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Calculate the total width of all option labels within a specific setting // This is achieved by summing the width of each option label - const totalWidth = optionValueLabels[s].map((o) => (o as Phaser.GameObjects.Text).width).reduce((total, width) => total += width, 0); + const totalWidth = optionValueLabels[s] + .map(o => (o as Phaser.GameObjects.Text).width) + .reduce((total, width) => (total += width), 0); // Define the minimum width for a label, ensuring it's at least 78 pixels wide or the width of the setting label plus some padding const labelWidth = Math.max(130, settingLabels[s].displayWidth + 8); // Calculate the total available space for placing option labels next to their setting label // We reserve space for the setting label and then distribute the remaining space evenly - const totalSpace = (297 - labelWidth) - totalWidth / 6; + const totalSpace = 297 - labelWidth - totalWidth / 6; // Calculate the spacing between options based on the available space divided by the number of gaps between labels const optionSpacing = Math.floor(totalSpace / (optionValueLabels[s].length - 1)); @@ -272,7 +301,13 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler } // Add vertical scrollbar - this.scrollBar = new ScrollBar(this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay); + this.scrollBar = new ScrollBar( + this.optionsBg.width - 9, + this.optionsBg.y + 5, + 4, + this.optionsBg.height - 11, + this.rowsToDisplay, + ); this.settingsContainer.add(this.scrollBar); // Add the settings container to the UI. @@ -296,7 +331,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler */ updateBindings(): void { // Hide the options container for all layouts to reset the UI visibility. - Object.keys(this.layout).forEach((key) => this.layout[key].optionsContainer.setVisible(false)); + Object.keys(this.layout).forEach(key => this.layout[key].optionsContainer.setVisible(false)); // Fetch the active gamepad configuration from the input controller. const activeConfig = this.getActiveConfig(); @@ -310,7 +345,10 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Update the cursor for each key based on the stored settings or default cursors. this.keys.forEach((key, index) => { - this.setOptionCursor(index, settings.hasOwnProperty(key as string) ? settings[key as string] : this.optionCursors[index]); + this.setOptionCursor( + index, + settings.hasOwnProperty(key as string) ? settings[key as string] : this.optionCursors[index], + ); }); // If the active configuration has no custom bindings set, exit the function early. @@ -338,8 +376,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler updateNavigationDisplay() { const specialIcons = { - "BUTTON_HOME": "HOME.png", - "BUTTON_DELETE": "DEL.png", + BUTTON_HOME: "HOME.png", + BUTTON_DELETE: "DEL.png", }; for (const settingName of Object.keys(this.navigationIcons)) { if (Object.keys(specialIcons).includes(settingName)) { @@ -462,15 +500,17 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler if (!this.optionValueLabels) { return false; } - if (cursor) { // If not at the top, move the cursor up. + if (cursor) { + // If not at the top, move the cursor up. if (this.cursor) { success = this.setCursor(this.cursor - 1); - } else {// If at the top of the visible items, scroll up. + } else { + // If at the top of the visible items, scroll up. success = this.setScrollCursor(this.scrollCursor - 1); } } else { - // When at the top of the menu and pressing UP, move to the bottommost item. - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(this.rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); @@ -488,8 +528,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler success = this.setScrollCursor(this.scrollCursor + 1); } } else { - // When at the bottom of the menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, resetting the scroll to the top. + // When at the bottom of the menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, resetting the scroll to the top. const successA = this.setCursor(0); // Then, reset the scroll to start from the first element of the menu. const successB = this.setScrollCursor(0); @@ -555,7 +595,7 @@ export default 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.game.canvas.width / 6 - (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. @@ -681,5 +721,4 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Set the cursor object reference to null to fully dereference it. this.cursorObj = null; } - } diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 7300b6d3266..0c14b91251e 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -11,7 +11,6 @@ import { Setting, SettingKeys } from "#app/system/settings/settings"; import i18next from "i18next"; import { globalScene } from "#app/global-scene"; - /** * Abstract class for handling UI elements related to settings. */ @@ -58,17 +57,30 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 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), Phaser.Geom.Rectangle.Contains); + this.settingsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6 - 20), + Phaser.Geom.Rectangle.Contains, + ); this.navigationIcons = {}; this.navigationContainer = new NavigationMenu(0, 0); - this.optionsBg = addWindow(0, this.navigationContainer.height, (globalScene.game.canvas.width / 6) - 2, (globalScene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg = addWindow( + 0, + this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - 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, 22); + const actionsBg = addWindow( + 0, + globalScene.game.canvas.height / 6 - this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + 22, + ); actionsBg.setOrigin(0, 0); const iconAction = globalScene.add.sprite(0, 0, "keyboard"); @@ -96,44 +108,56 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { this.reloadSettings = this.settings.filter(s => s?.requireReload); - this.settings - .forEach((setting, s) => { - let settingName = setting.label; - if (setting?.requireReload) { - settingName += ` (${i18next.t("settings:requireReload")})`; - } + this.settings.forEach((setting, s) => { + let settingName = setting.label; + if (setting?.requireReload) { + settingName += ` (${i18next.t("settings:requireReload")})`; + } - this.settingLabels[s] = addTextObject(8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); - this.settingLabels[s].setOrigin(0, 0); + this.settingLabels[s] = addTextObject(8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); + this.settingLabels[s].setOrigin(0, 0); - this.optionsContainer.add(this.settingLabels[s]); - this.optionValueLabels.push(setting.options.map((option, o) => { - const valueLabel = addTextObject(0, 0, option.label, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_VALUE); + this.optionsContainer.add(this.settingLabels[s]); + this.optionValueLabels.push( + setting.options.map((option, o) => { + const valueLabel = addTextObject( + 0, + 0, + option.label, + setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_VALUE, + ); valueLabel.setOrigin(0, 0); this.optionsContainer.add(valueLabel); return valueLabel; - })); + }), + ); - const totalWidth = this.optionValueLabels[s].map(o => o.width).reduce((total, width) => total += width, 0); + const totalWidth = this.optionValueLabels[s].map(o => o.width).reduce((total, width) => (total += width), 0); - const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8); + const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8); - const totalSpace = (297 - labelWidth) - totalWidth / 6; - const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1)); + const totalSpace = 297 - labelWidth - totalWidth / 6; + const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1)); - let xOffset = 0; + let xOffset = 0; - for (const value of this.optionValueLabels[s]) { - value.setPositionRelative(this.settingLabels[s], labelWidth + xOffset, 0); - xOffset += value.width / 6 + optionSpacing; - } - }); + for (const value of this.optionValueLabels[s]) { + value.setPositionRelative(this.settingLabels[s], labelWidth + xOffset, 0); + xOffset += value.width / 6 + optionSpacing; + } + }); this.optionCursors = this.settings.map(setting => setting.default); - this.scrollBar = new ScrollBar(this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay); + this.scrollBar = new ScrollBar( + this.optionsBg.width - 9, + this.optionsBg.y + 5, + 4, + this.optionsBg.height - 11, + this.rowsToDisplay, + ); this.scrollBar.setTotalRows(this.settings.length); // Two-lines message box @@ -145,7 +169,9 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { settingsMessageBox.setOrigin(0, 1); this.messageBoxContainer.add(settingsMessageBox); - const messageText = addTextObject(8, -40, "", TextStyle.WINDOW, { maxLines: 2 }); + const messageText = addTextObject(8, -40, "", TextStyle.WINDOW, { + maxLines: 2, + }); messageText.setWordWrapWidth(globalScene.game.canvas.width - 60); messageText.setName("settings-message"); messageText.setOrigin(0, 0); @@ -200,14 +226,18 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { * * @param args - Arguments to be passed to the show method. * @returns `true` if successful. - */ + */ show(args: any[]): boolean { super.show(args); this.updateBindings(); - const settings: object = localStorage.hasOwnProperty(this.localStorageKey) ? JSON.parse(localStorage.getItem(this.localStorageKey)!) : {}; // TODO: is this bang correct? + const settings: object = localStorage.hasOwnProperty(this.localStorageKey) + ? JSON.parse(localStorage.getItem(this.localStorageKey)!) + : {}; // TODO: is this bang correct? - this.settings.forEach((setting, s) => this.setOptionCursor(s, settings.hasOwnProperty(setting.key) ? settings[setting.key] : this.settings[s].default)); + this.settings.forEach((setting, s) => + this.setOptionCursor(s, settings.hasOwnProperty(setting.key) ? settings[setting.key] : this.settings[s].default), + ); this.settingsContainer.setVisible(true); this.setCursor(0); @@ -251,8 +281,8 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { success = this.setScrollCursor(this.scrollCursor - 1); } } else { - // When at the top of the menu and pressing UP, move to the bottommost item. - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(this.rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); @@ -261,14 +291,15 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { break; case Button.DOWN: if (cursor < this.optionValueLabels.length - 1) { - if (this.cursor < this.rowsToDisplay - 1) {// if the visual cursor is in the frame of 0 to 8 + if (this.cursor < this.rowsToDisplay - 1) { + // if the visual cursor is in the frame of 0 to 8 success = this.setCursor(this.cursor + 1); } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { success = this.setScrollCursor(this.scrollCursor + 1); } } else { - // When at the bottom of the menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, resetting the scroll to the top. + // When at the bottom of the menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, resetting the scroll to the top. const successA = this.setCursor(0); // Then, reset the scroll to start from the first element of the menu. const successB = this.setScrollCursor(0); @@ -276,12 +307,13 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { } break; case Button.LEFT: - if (this.optionCursors[cursor]) {// Moves the option cursor left, if possible. + if (this.optionCursors[cursor]) { + // Moves the option cursor left, if possible. success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); } break; case Button.RIGHT: - // Moves the option cursor right, if possible. + // Moves the option cursor right, if possible. if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); } @@ -331,7 +363,7 @@ export default 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.game.canvas.width / 6 - (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); @@ -390,7 +422,8 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { this.setOptionCursor(settingIndex, lastCursor, false); }; - const confirmationMessage = setting.options[cursor].confirmationMessage ?? i18next.t("settings:defaultConfirmMessage"); + const confirmationMessage = + setting.options[cursor].confirmationMessage ?? i18next.t("settings:defaultConfirmMessage"); globalScene.ui.showText(confirmationMessage, null, () => { globalScene.ui.setOverlayMode(Mode.CONFIRM, confirmUpdateSetting, cancelUpdateSetting, null, null, 1, 750); }); @@ -463,7 +496,14 @@ export default class AbstractSettingsUiHandler extends MessageUiHandler { this.cursorObj = null; } - override showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number) { + override showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { this.messageBoxContainer.setVisible(!!text?.length); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); } diff --git a/src/ui/settings/gamepad-binding-ui-handler.ts b/src/ui/settings/gamepad-binding-ui-handler.ts index b69c2f34e06..62bc2db7825 100644 --- a/src/ui/settings/gamepad-binding-ui-handler.ts +++ b/src/ui/settings/gamepad-binding-ui-handler.ts @@ -5,9 +5,7 @@ import { getIconWithSettingName, getKeyWithKeycode } from "#app/configs/inputs/c import { addTextObject, TextStyle } from "#app/ui/text"; import { globalScene } from "#app/global-scene"; - export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { - constructor(mode: Mode | null = null) { super(mode); globalScene.input.gamepad?.on("down", this.gamepadButtonDown, this); @@ -23,7 +21,11 @@ export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { this.swapText = addTextObject(0, 0, "will swap with", TextStyle.WINDOW); this.swapText.setOrigin(0.5); - this.swapText.setPositionRelative(this.optionSelectBg, this.optionSelectBg.width / 2 - 2, this.optionSelectBg.height / 2 - 2); + this.swapText.setPositionRelative( + this.optionSelectBg, + this.optionSelectBg.width / 2 - 2, + this.optionSelectBg.height / 2 - 2, + ); this.swapText.setVisible(false); this.targetButtonIcon = globalScene.add.sprite(0, 0, "xbox"); @@ -45,10 +47,15 @@ export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { return globalScene.inputController?.selectedDevice[Device.GAMEPAD]; } - gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { - const blacklist = [ 12, 13, 14, 15 ]; // d-pad buttons are blacklisted. + gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { + const blacklist = [12, 13, 14, 15]; // d-pad buttons are blacklisted. // Check conditions before processing the button press. - if (!this.listening || pad.id.toLowerCase() !== this.getSelectedDevice() || blacklist.includes(button.index) || this.buttonPressed !== null) { + if ( + !this.listening || + pad.id.toLowerCase() !== this.getSelectedDevice() || + blacklist.includes(button.index) || + this.buttonPressed !== null + ) { return; } const activeConfig = globalScene.inputController.getActiveConfig(Device.GAMEPAD); @@ -73,8 +80,8 @@ export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { } /** - * Clear the UI elements and state. - */ + * Clear the UI elements and state. + */ clear() { super.clear(); this.targetButtonIcon.setVisible(false); diff --git a/src/ui/settings/keyboard-binding-ui-handler.ts b/src/ui/settings/keyboard-binding-ui-handler.ts index ddc60a15631..8735faeaaab 100644 --- a/src/ui/settings/keyboard-binding-ui-handler.ts +++ b/src/ui/settings/keyboard-binding-ui-handler.ts @@ -5,9 +5,7 @@ import { Device } from "#enums/devices"; import { addTextObject, TextStyle } from "#app/ui/text"; import { globalScene } from "#app/global-scene"; - export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { - constructor(mode: Mode | null = null) { super(mode); // Listen to gamepad button down events to initiate binding. @@ -70,5 +68,4 @@ export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { } return false; } - } diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index 48677122363..44377c8c2ab 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -6,27 +6,25 @@ import i18next from "i18next"; export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape"; export const TOUCH_CONTROL_POSITIONS_PORTRAIT = "touchControlPositionsPortrait"; - -type ControlPosition = { id: string, x: number, y: number }; +type ControlPosition = { id: string; x: number; y: number }; type ConfigurationEventListeners = { - "touchstart": EventListener[] - "touchmove": EventListener[] - "touchend": EventListener[] + touchstart: EventListener[]; + touchmove: EventListener[]; + touchend: EventListener[]; }; type ToolbarRefs = { - toolbar: HTMLDivElement, - saveButton: HTMLDivElement - resetButton: HTMLDivElement - cancelButton: HTMLDivElement + toolbar: HTMLDivElement; + saveButton: HTMLDivElement; + resetButton: HTMLDivElement; + cancelButton: HTMLDivElement; }; /** * Handles the dragging of touch controls around the screen. */ export default class MoveTouchControlsHandler { - /** The element that is currently being dragged */ private draggingElement: HTMLElement | null = null; @@ -41,9 +39,9 @@ export default class MoveTouchControlsHandler { * These are used to remove the event listeners when the configuration mode is disabled. */ private configurationEventListeners: ConfigurationEventListeners = { - "touchstart": [], - "touchmove": [], - "touchend": [] + touchstart: [], + touchmove: [], + touchend: [], }; private overlay: Phaser.GameObjects.Container; @@ -55,7 +53,7 @@ export default class MoveTouchControlsHandler { this.touchControls = touchControls; this.inConfigurationMode = false; this.setPositions(this.getSavedPositionsOfCurrentOrientation() ?? []); - window.addEventListener("resize", (event) => { + window.addEventListener("resize", _event => { const screenSize = this.getScreenSize(); if (screenSize.width > screenSize.height !== this.isLandscapeMode) { this.changeOrientation(screenSize.width > screenSize.height); @@ -72,7 +70,9 @@ export default class MoveTouchControlsHandler { if (this.inConfigurationMode) { const orientation = document.querySelector("#touchControls #orientation"); if (orientation) { - orientation.textContent = this.isLandscapeMode ? i18next.t("settings:landscape") : i18next.t("settings:portrait"); + orientation.textContent = this.isLandscapeMode + ? i18next.t("settings:landscape") + : i18next.t("settings:portrait"); } } const positions = this.getSavedPositionsOfCurrentOrientation() ?? []; @@ -150,7 +150,7 @@ export default class MoveTouchControlsHandler { toolbar, saveButton: toolbar.querySelector("#saveButton")!, resetButton: toolbar.querySelector("#resetButton")!, - cancelButton: toolbar.querySelector("#cancelButton")! + cancelButton: toolbar.querySelector("#cancelButton")!, }; } @@ -182,7 +182,9 @@ export default class MoveTouchControlsHandler { } const rect = this.draggingElement.getBoundingClientRect(); // Map the touch position to the center of the dragged element. - const xOffset = this.isLeft(this.draggingElement) ? touch.clientX - rect.width / 2 : window.innerWidth - touch.clientX - rect.width / 2; + const xOffset = this.isLeft(this.draggingElement) + ? touch.clientX - rect.width / 2 + : window.innerWidth - touch.clientX - rect.width / 2; const yOffset = window.innerHeight - touch.clientY - rect.height / 2; this.setPosition(this.draggingElement, xOffset, yOffset); }; @@ -204,8 +206,8 @@ export default class MoveTouchControlsHandler { .map((controlGroup: HTMLElement) => { return { id: controlGroup.id, - x: parseFloat(this.isLeft(controlGroup) ? controlGroup.style.left : controlGroup.style.right), - y: parseFloat(controlGroup.style.bottom), + x: Number.parseFloat(this.isLeft(controlGroup) ? controlGroup.style.left : controlGroup.style.right), + y: Number.parseFloat(controlGroup.style.bottom), }; }); } @@ -291,7 +293,7 @@ export default class MoveTouchControlsHandler { * @returns All control groups of the touch controls. */ private getControlGroupElements(): HTMLDivElement[] { - return [ ...document.querySelectorAll("#touchControls .control-group") ] as HTMLDivElement[]; + return [...document.querySelectorAll("#touchControls .control-group")] as HTMLDivElement[]; } /** @@ -301,21 +303,21 @@ export default class MoveTouchControlsHandler { */ private createConfigurationEventListeners(controlGroups: HTMLDivElement[]): ConfigurationEventListeners { return { - "touchstart": controlGroups.map((element: HTMLDivElement) => { + touchstart: controlGroups.map((element: HTMLDivElement) => { const startDrag = () => this.startDrag(element); element.addEventListener("touchstart", startDrag, { passive: true }); return startDrag; }), - "touchmove": controlGroups.map(() => { - const drag = (event) => this.drag(event.touches[0]); + touchmove: controlGroups.map(() => { + const drag = event => this.drag(event.touches[0]); window.addEventListener("touchmove", drag, { passive: true }); return drag; }), - "touchend": controlGroups.map(() => { + touchend: controlGroups.map(() => { const stopDrag = () => this.stopDrag(); window.addEventListener("touchend", stopDrag, { passive: true }); return stopDrag; - }) + }), }; } @@ -326,7 +328,15 @@ export default class MoveTouchControlsHandler { */ private createOverlay(ui: UI) { const container = new Phaser.GameObjects.Container(globalScene, 0, 0); - const overlay = new Phaser.GameObjects.Rectangle(globalScene, 0, 0, globalScene.game.canvas.width, globalScene.game.canvas.height, 0x000000, 0.5); + const overlay = new Phaser.GameObjects.Rectangle( + globalScene, + 0, + 0, + globalScene.game.canvas.width, + globalScene.game.canvas.height, + 0x000000, + 0.5, + ); overlay.setInteractive(); container.add(overlay); ui.add(container); @@ -337,9 +347,9 @@ export default class MoveTouchControlsHandler { } /** - * Allows the user to configure the touch controls by dragging buttons around the screen. - * @param ui The UI of the game. - */ + * Allows the user to configure the touch controls by dragging buttons around the screen. + * @param ui The UI of the game. + */ public enableConfigurationMode(ui: UI) { if (this.inConfigurationMode) { return; @@ -364,9 +374,11 @@ export default class MoveTouchControlsHandler { // Remove event listeners const { touchstart, touchmove, touchend } = this.configurationEventListeners; - this.getControlGroupElements().forEach((element, index) => element.removeEventListener("touchstart", touchstart[index])); - touchmove.forEach((listener) => window.removeEventListener("touchmove", listener)); - touchend.forEach((listener) => window.removeEventListener("touchend", listener)); + this.getControlGroupElements().forEach((element, index) => + element.removeEventListener("touchstart", touchstart[index]), + ); + touchmove.forEach(listener => window.removeEventListener("touchmove", listener)); + touchend.forEach(listener => window.removeEventListener("touchend", listener)); // Remove configuration toolbar const toolbar = document.querySelector("#touchControls #configToolbar"); @@ -377,5 +389,4 @@ export default class MoveTouchControlsHandler { document.querySelector("#touchControls")?.classList.remove("config-mode"); this.touchControls.enable(); } - } diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index 5fa53b7c270..1d2d71e1e20 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -33,7 +33,13 @@ export class NavigationManager { Mode.SETTINGS_GAMEPAD, Mode.SETTINGS_KEYBOARD, ]; - this.labels = [ i18next.t("settings:general"), i18next.t("settings:display"), i18next.t("settings:audio"), i18next.t("settings:gamepad"), i18next.t("settings:keyboard") ]; + this.labels = [ + i18next.t("settings:general"), + i18next.t("settings:display"), + i18next.t("settings:audio"), + i18next.t("settings:gamepad"), + i18next.t("settings:keyboard"), + ]; } public reset() { @@ -95,7 +101,6 @@ export class NavigationManager { public clearNavigationMenus() { this.navigationMenus.length = 0; } - } export default class NavigationMenu extends Phaser.GameObjects.Container { @@ -118,7 +123,7 @@ export default 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.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); this.add(headerBg); this.width = headerBg.width; @@ -161,7 +166,7 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { const navigationManager = NavigationManager.getInstance(); const posSelected = navigationManager.modes.indexOf(navigationManager.selectedMode); - for (const [ index, title ] of this.headerTitles.entries()) { + for (const [index, title] of this.headerTitles.entries()) { setTextStyle(title, index === posSelected ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_LABEL); } } @@ -171,8 +176,8 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { */ updateIcons() { const specialIcons = { - "BUTTON_HOME": "HOME.png", - "BUTTON_DELETE": "DEL.png", + BUTTON_HOME: "HOME.png", + BUTTON_DELETE: "DEL.png", }; for (const settingName of Object.keys(this.navigationIcons)) { if (Object.keys(specialIcons).includes(settingName)) { diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 3b591eab4b9..f8cb4da4ba2 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -1,7 +1,7 @@ import type { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingType } from "#app/system/settings/settings"; -"#app/inputs-controller"; +("#app/inputs-controller"); export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { /** diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index 98fc16e2f96..b3505fe90f2 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -1,7 +1,7 @@ import type { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingKeys, SettingType } from "#app/system/settings/settings"; -"#app/inputs-controller"; +("#app/inputs-controller"); export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler { /** diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index 3d23b7e99bb..0b3a7241ff2 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -5,7 +5,7 @@ import { SettingGamepad, settingGamepadBlackList, settingGamepadDefaults, - settingGamepadOptions + settingGamepadOptions, } from "../../system/settings/settings-gamepad"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import pad_dualshock from "#app/configs/inputs/pad_dualshock"; @@ -24,19 +24,18 @@ import { globalScene } from "#app/global-scene"; */ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiHandler { - /** - * Creates an instance of SettingsGamepadUiHandler. - * - * @param mode - The UI mode, optional. - */ + * Creates an instance of SettingsGamepadUiHandler. + * + * @param mode - The UI mode, optional. + */ constructor(mode: Mode | null = null) { super(mode); this.titleSelected = "Gamepad"; this.setting = SettingGamepad; this.settingDeviceDefaults = settingGamepadDefaults; this.settingDeviceOptions = settingGamepadOptions; - this.configs = [ pad_xbox360, pad_dualshock, pad_unlicensedSNES ]; + this.configs = [pad_xbox360, pad_dualshock, pad_unlicensedSNES]; this.commonSettingsCount = 2; this.localStoragePropertyName = "settingsGamepad"; this.settingBlacklisted = settingGamepadBlackList; @@ -46,8 +45,8 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH setSetting = setSettingGamepad; /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { super.setup(); // If no gamepads are detected, set up a default UI prompt in the settings container. @@ -65,11 +64,11 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH } /** - * Set the layout for the active configuration. - * - * @param activeConfig - The active gamepad configuration. - * @returns `true` if the layout was successfully applied, otherwise `false`. - */ + * Set the layout for the active configuration. + * + * @param activeConfig - The active gamepad configuration. + * @returns `true` if the layout was successfully applied, otherwise `false`. + */ setLayout(activeConfig: InterfaceConfig): boolean { // Check if there is no active configuration (e.g., no gamepad connected). if (!activeConfig) { @@ -85,15 +84,15 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH } /** - * Update the display of the chosen gamepad. - */ + * Update the display of the chosen gamepad. + */ updateChosenGamepadDisplay(): void { // Update any bindings that might have changed since the last update. this.updateBindings(); this.resetScroll(); // Iterate over the keys in the settingDevice enumeration. - for (const [ index, key ] of Object.keys(this.setting).entries()) { + for (const [index, key] of Object.keys(this.setting).entries()) { const setting = this.setting[key]; // Get the actual setting value using the key. // Check if the current setting corresponds to the controller setting. @@ -106,21 +105,29 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH // Update the text of the first option label under the current setting to the name of the chosen gamepad, // truncating the name to 30 characters if necessary. - this.layout[_key].optionValueLabels[index][0].setText(truncateString(globalScene.inputController.selectedDevice[Device.GAMEPAD], 20)); + this.layout[_key].optionValueLabels[index][0].setText( + truncateString(globalScene.inputController.selectedDevice[Device.GAMEPAD], 20), + ); } } } } /** - * Save the setting to local storage. - * - * @param settingName - The setting to save. - * @param cursor - The cursor position to save. - */ + * Save the setting to local storage. + * + * @param settingName - The setting to save. + * @param cursor - The cursor position to save. + */ saveSettingToLocalStorage(settingName, cursor): void { if (this.setting[settingName] !== this.setting.Controller) { - globalScene.gameData.saveControlSetting(this.device, this.localStoragePropertyName, settingName, this.settingDeviceDefaults, cursor); + globalScene.gameData.saveControlSetting( + this.device, + this.localStoragePropertyName, + settingName, + this.settingDeviceDefaults, + cursor, + ); } } } diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index ad9f23cc0d9..a7837c8961e 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -5,7 +5,7 @@ import { SettingKeyboard, settingKeyboardBlackList, settingKeyboardDefaults, - settingKeyboardOptions + settingKeyboardOptions, } from "#app/system/settings/settings-keyboard"; import { reverseValueToKeySetting, truncateString } from "#app/utils"; import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; @@ -24,17 +24,17 @@ import { globalScene } from "#app/global-scene"; */ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUiHandler { /** - * Creates an instance of SettingsKeyboardUiHandler. - * - * @param mode - The UI mode, optional. - */ + * Creates an instance of SettingsKeyboardUiHandler. + * + * @param mode - The UI mode, optional. + */ constructor(mode: Mode | null = null) { super(mode); this.titleSelected = "Keyboard"; this.setting = SettingKeyboard; this.settingDeviceDefaults = settingKeyboardDefaults; this.settingDeviceOptions = settingKeyboardOptions; - this.configs = [ cfg_keyboard_qwerty ]; + this.configs = [cfg_keyboard_qwerty]; this.commonSettingsCount = 0; this.textureOverride = "keyboard"; this.localStoragePropertyName = "settingsKeyboard"; @@ -43,15 +43,15 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi const deleteEvent = globalScene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.DELETE); const restoreDefaultEvent = globalScene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.HOME); - deleteEvent && deleteEvent.on("up", this.onDeleteDown, this); - restoreDefaultEvent && restoreDefaultEvent.on("up", this.onHomeDown, this); + deleteEvent?.on("up", this.onDeleteDown, this); + restoreDefaultEvent?.on("up", this.onHomeDown, this); } setSetting = setSettingKeyboard; /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { super.setup(); // If no gamepads are detected, set up a default UI prompt in the settings container. @@ -75,17 +75,16 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi this.settingsContainer.add(iconDelete); this.settingsContainer.add(deleteText); - // Map the 'noKeyboard' layout options for easy access. this.layout["noKeyboard"].optionsContainer = optionsContainer; this.layout["noKeyboard"].label = label; } /** - * Handle the home key press event. - */ + * Handle the home key press event. + */ onHomeDown(): void { - if (![ Mode.SETTINGS_KEYBOARD, Mode.SETTINGS_GAMEPAD ].includes(globalScene.ui.getMode())) { + if (![Mode.SETTINGS_KEYBOARD, Mode.SETTINGS_GAMEPAD].includes(globalScene.ui.getMode())) { return; } globalScene.gameData.resetMappingToFactory(); @@ -93,8 +92,8 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } /** - * Handle the delete key press event. - */ + * Handle the delete key press event. + */ onDeleteDown(): void { if (globalScene.ui.getMode() !== Mode.SETTINGS_KEYBOARD) { return; @@ -113,11 +112,11 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } /** - * Set the layout for the active configuration. - * - * @param activeConfig - The active keyboard configuration. - * @returns `true` if the layout was successfully applied, otherwise `false`. - */ + * Set the layout for the active configuration. + * + * @param activeConfig - The active keyboard configuration. + * @returns `true` if the layout was successfully applied, otherwise `false`. + */ setLayout(activeConfig: InterfaceConfig): boolean { // Check if there is no active configuration (e.g., no gamepad connected). if (!activeConfig) { @@ -133,14 +132,14 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } /** - * Update the display of the chosen keyboard layout. - */ + * Update the display of the chosen keyboard layout. + */ updateChosenKeyboardDisplay(): void { // Update any bindings that might have changed since the last update. this.updateBindings(); // Iterate over the keys in the settingDevice enumeration. - for (const [ index, key ] of Object.keys(this.setting).entries()) { + for (const [index, key] of Object.keys(this.setting).entries()) { const setting = this.setting[key]; // Get the actual setting value using the key. // Check if the current setting corresponds to the layout setting. @@ -152,31 +151,38 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } // Skip updating the no gamepad layout. // Update the text of the first option label under the current setting to the name of the chosen gamepad, // truncating the name to 30 characters if necessary. - this.layout[_key].optionValueLabels[index][0].setText(truncateString(globalScene.inputController.selectedDevice[Device.KEYBOARD], 22)); + this.layout[_key].optionValueLabels[index][0].setText( + truncateString(globalScene.inputController.selectedDevice[Device.KEYBOARD], 22), + ); } } } - } /** - * Save the custom keyboard mapping to local storage. - * - * @param config - The configuration to save. - */ + * Save the custom keyboard mapping to local storage. + * + * @param config - The configuration to save. + */ saveCustomKeyboardMappingToLocalStorage(config): void { globalScene.gameData.saveMappingConfigs(globalScene.inputController?.selectedDevice[Device.KEYBOARD], config); } /** - * Save the setting to local storage. - * - * @param settingName - The name of the setting to save. - * @param cursor - The cursor position to save. - */ + * Save the setting to local storage. + * + * @param settingName - The name of the setting to save. + * @param cursor - The cursor position to save. + */ saveSettingToLocalStorage(settingName, cursor): void { if (this.setting[settingName] !== this.setting.Default_Layout) { - globalScene.gameData.saveControlSetting(this.device, this.localStoragePropertyName, settingName, this.settingDeviceDefaults, cursor); + globalScene.gameData.saveControlSetting( + this.device, + this.localStoragePropertyName, + settingName, + this.settingDeviceDefaults, + cursor, + ); } } } diff --git a/src/ui/settings/shiny_icons.json b/src/ui/settings/shiny_icons.json index d6465cf2c3a..f40c606ca47 100644 --- a/src/ui/settings/shiny_icons.json +++ b/src/ui/settings/shiny_icons.json @@ -1,41 +1,41 @@ { - "textures": [ - { - "image": "shiny_icons.png", - "format": "RGBA8888", - "size": { - "w": 45, - "h": 14 - }, - "scale": 1, - "frames": [ - { - "filename": "0", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 14 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 15, - "h": 14 - }, - "frame": { - "x": 0, - "y": 0, - "w": 15, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" - } + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 45, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" + } } diff --git a/src/ui/starter-container.ts b/src/ui/starter-container.ts index 792ce97e103..71e40844f38 100644 --- a/src/ui/starter-container.ts +++ b/src/ui/starter-container.ts @@ -13,7 +13,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { public classicWinIcon: Phaser.GameObjects.Image; public candyUpgradeIcon: Phaser.GameObjects.Image; public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; - public cost: number = 0; + public cost = 0; constructor(species: PokemonSpecies) { super(globalScene, 0, 0); @@ -32,10 +32,16 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.starterPassiveBgs = starterPassiveBg; // icon - this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon = globalScene.add.sprite( + -2, + 2, + species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.icon.setScale(0.5); this.icon.setOrigin(0, 0); - this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setFrame( + species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); this.icon.setTint(0); this.add(this.icon); @@ -51,7 +57,9 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.add(this.shinyIcons); // value label - const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { fontSize: "32px" }); + const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { + fontSize: "32px", + }); label.setShadowOffset(2, 2); label.setOrigin(0, 0); label.setVisible(false); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index c2ed625f7e8..ccc56f38368 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -23,8 +23,14 @@ import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; -import type { DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences } from "#app/system/game-data"; -import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; +import type { + DexAttrProps, + DexEntry, + StarterMoveset, + StarterAttributes, + StarterPreferences, +} from "#app/system/game-data"; +import { AbilityAttr, DexAttr, loadStarterPreferences, saveStarterPreferences } from "#app/system/game-data"; import { Tutorial, handleTutorial } from "#app/tutorial"; import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; @@ -53,19 +59,34 @@ import { SelectChallengePhase } from "#app/phases/select-challenge-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { Abilities } from "#enums/abilities"; -import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; -import { BooleanHolder, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; +import { + BooleanHolder, + fixedInt, + getLocalizedSpriteKey, + isNullOrUndefined, + NumberHolder, + padInt, + randIntRange, + rgbHexToRgba, + toReadableString, +} from "#app/utils"; import type { Nature } from "#enums/nature"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { achvs } from "#app/system/achv"; import * as Utils from "../utils"; +import type { GameObjects } from "phaser"; export type StarterSelectCallback = (starters: Starter[]) => void; export interface Starter { species: PokemonSpecies; dexAttr: bigint; - abilityIndex: number, + abilityIndex: number; passive: boolean; nature: Nature; moveset?: StarterMoveset; @@ -75,59 +96,59 @@ export interface Starter { } interface LanguageSetting { - starterInfoTextSize: string, - instructionTextSize: string, - starterInfoXPos?: number, - starterInfoYOffset?: number + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; } const languageSettings: { [key: string]: LanguageSetting } = { - "en":{ + en: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "de":{ + de: { starterInfoTextSize: "48px", instructionTextSize: "35px", starterInfoXPos: 33, }, - "es-ES":{ + "es-ES": { starterInfoTextSize: "52px", instructionTextSize: "35px", }, - "fr":{ + fr: { starterInfoTextSize: "54px", instructionTextSize: "38px", }, - "it":{ + it: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "pt_BR":{ + pt_BR: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoXPos: 33, }, - "zh":{ + zh: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoYOffset: 1, starterInfoXPos: 24, }, - "pt":{ + pt: { starterInfoTextSize: "48px", instructionTextSize: "42px", starterInfoXPos: 33, }, - "ko":{ + ko: { starterInfoTextSize: "52px", instructionTextSize: "38px", }, - "ja":{ + ja: { starterInfoTextSize: "51px", instructionTextSize: "38px", }, - "ca-ES":{ + "ca-ES": { starterInfoTextSize: "56px", instructionTextSize: "38px", }, @@ -149,7 +170,7 @@ const randomSelectionWindowHeight = 20; * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { +function calcStarterPosition(index: number, scrollCursor = 0): { x: number; y: number } { const yOffset = 13; const height = 17; const x = (index % 9) * 18; @@ -175,7 +196,7 @@ function calcStarterIconY(index: number) { * @param teamSize how many Pokemon are in the team (0-6) * @returns index of the closest Pokemon in the team container */ -function findClosestStarterIndex(y: number, teamSize: number = 6): number { +function findClosestStarterIndex(y: number, teamSize = 6): number { let smallestDistance = teamWindowHeight; let closestStarterIndex = 0; for (let i = 0; i < teamSize; i++) { @@ -209,14 +230,14 @@ function findClosestStarterRow(index: number, numberOfRows: number) { } interface SpeciesDetails { - shiny?: boolean, - formIndex?: number - female?: boolean, - variant?: Variant, - abilityIndex?: number, - natureIndex?: number, - forSeen?: boolean, // default = false - teraType?: PokemonType, + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; + abilityIndex?: number; + natureIndex?: number; + forSeen?: boolean; // default = false + teraType?: PokemonType; } export default class StarterSelectUiHandler extends MessageUiHandler { @@ -262,7 +283,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; private pokemonCaughtCountText: Phaser.GameObjects.Text; private pokemonFormText: Phaser.GameObjects.Text; - private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcon: Phaser.GameObjects.Sprite; private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; @@ -290,18 +311,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; private statsContainer: StatsContainer; - private moveInfoOverlay : MoveInfoOverlay; + private moveInfoOverlay: MoveInfoOverlay; private statsMode: boolean; - private starterIconsCursorXOffset: number = -3; - private starterIconsCursorYOffset: number = 1; + private starterIconsCursorXOffset = -3; + private starterIconsCursorYOffset = 1; private starterIconsCursorIndex: number; private filterMode: boolean; - private dexAttrCursor: bigint = 0n; - private abilityCursor: number = -1; - private natureCursor: number = -1; + private dexAttrCursor = 0n; + private abilityCursor = -1; + private natureCursor = -1; private teraCursor: PokemonType = PokemonType.UNKNOWN; - private filterBarCursor: number = 0; + private filterBarCursor = 0; private starterMoveset: StarterMoveset | null; private scrollCursor: number; @@ -347,7 +368,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterPreferences: StarterPreferences; - protected blockInput: boolean = false; + protected blockInput = false; constructor() { super(Mode.STARTER_SELECT); @@ -363,7 +384,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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, 0x006860); + 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); @@ -377,13 +404,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.shinyOverlay); const starterContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); - const starterContainerBg = globalScene.add.image(speciesContainerX + 1, filterBarHeight + 2, "starter_container_bg"); + 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( + 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); // Create and initialise filter bar @@ -406,7 +447,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter - const typeKeys = Object.keys(PokemonType).filter(v => isNaN(Number(v))); + const typeKeys = Object.keys(PokemonType).filter(v => Number.isNaN(Number(v))); const typeOptions: DropDownOption[] = []; typeKeys.forEach((type, index) => { if (index === 0 || index === 19) { @@ -417,7 +458,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { typeSprite.setFrame(type.toLowerCase()); typeOptions.push(new DropDownOption(index, new DropDownLabel("", typeSprite))); }); - this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); + this.filterBar.addFilter( + DropDownColumn.TYPES, + i18next.t("filterBar:typeFilter"), + new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5), + ); // caught filter const shiny1Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); @@ -441,10 +486,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption("SHINY2", new DropDownLabel("", shiny2Sprite)), new DropDownOption("SHINY", new DropDownLabel("", shiny1Sprite)), new DropDownOption("NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), - new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) + new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))), ]; - this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); + this.filterBar.addFilter( + DropDownColumn.CAUGHT, + i18next.t("filterBar:caughtFilter"), + new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID), + ); // unlocks filter const passiveLabels = [ @@ -468,7 +517,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption("COST_REDUCTION", costReductionLabels), ]; - this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.UNLOCKS, + i18next.t("filterBar:unlocksFilter"), + new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL), + ); // misc filter const favoriteLabels = [ @@ -501,19 +554,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownOption("EGG", eggLabels), new DropDownOption("POKERUS", pokerusLabels), ]; - this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.MISC, + i18next.t("filterBar:miscFilter"), + new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL), + ); // sort filter const sortOptions = [ - new DropDownOption(SortCriteria.NUMBER, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)), + new DropDownOption( + SortCriteria.NUMBER, + new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON), + ), new DropDownOption(SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), new DropDownOption(SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), new DropDownOption(SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), new DropDownOption(SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))), new DropDownOption(SortCriteria.CAUGHT, new DropDownLabel(i18next.t("filterBar:sortByNumCaught"))), - new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))) + new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))), ]; - this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + this.filterBar.addFilter( + DropDownColumn.SORT, + i18next.t("filterBar:sortFilter"), + new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE), + ); this.filterBarContainer.add(this.filterBar); this.starterSelectContainer.add(this.filterBarContainer); @@ -536,7 +600,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonGrowthRateLabelText = addTextObject(8, 106, i18next.t("starterSelectUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }); + this.pokemonGrowthRateLabelText = addTextObject( + 8, + 106, + i18next.t("starterSelectUiHandler:growthRate"), + TextStyle.SUMMARY_ALT, + { fontSize: "36px" }, + ); this.pokemonGrowthRateLabelText.setOrigin(0, 0); this.pokemonGrowthRateLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); @@ -549,11 +619,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonGenderText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGenderText); - this.pokemonUncaughtText = addTextObject(6, 127, i18next.t("starterSelectUiHandler:uncaught"), TextStyle.SUMMARY_ALT, { fontSize: "56px" }); + this.pokemonUncaughtText = addTextObject( + 6, + 127, + i18next.t("starterSelectUiHandler:uncaught"), + TextStyle.SUMMARY_ALT, + { fontSize: "56px" }, + ); this.pokemonUncaughtText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonUncaughtText); - // The position should be set per language const starterInfoXPos = textSettings?.starterInfoXPos || 31; const starterInfoYOffset = textSettings?.starterInfoYOffset || 0; @@ -561,24 +636,40 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // The font size should be set per language const starterInfoTextSize = textSettings?.starterInfoTextSize || 56; - this.pokemonAbilityLabelText = addTextObject(6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonAbilityLabelText = addTextObject( + 6, + 127 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:ability"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonAbilityLabelText.setOrigin(0, 0); this.pokemonAbilityLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + 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); - this.pokemonPassiveLabelText = addTextObject(6, 136 + starterInfoYOffset, i18next.t("starterSelectUiHandler:passive"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonPassiveLabelText = addTextObject( + 6, + 136 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:passive"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonPassiveLabelText.setOrigin(0, 0); this.pokemonPassiveLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveLabelText); - this.pokemonPassiveText = addTextObject(starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + 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); @@ -595,12 +686,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveLockedIcon.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveLockedIcon); - this.pokemonNatureLabelText = addTextObject(6, 145 + starterInfoYOffset, i18next.t("starterSelectUiHandler:nature"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonNatureLabelText = addTextObject( + 6, + 145 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:nature"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonNatureLabelText.setOrigin(0, 0); this.pokemonNatureLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonNatureText = addBBCodeTextObject(starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { + fontSize: starterInfoTextSize, + }); this.pokemonNatureText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNatureText); @@ -620,16 +719,43 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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.startCursorObj = globalScene.add.nineslice( + teamWindowX + 4, + 160, + "select_cursor", + undefined, + 26, + 15, + 6, + 6, + 6, + 6, + ); this.startCursorObj.setVisible(false); this.startCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.startCursorObj); - const randomSelectLabel = addTextObject(teamWindowX + 17, 23, i18next.t("starterSelectUiHandler:randomize"), TextStyle.TOOLTIP_CONTENT); + const randomSelectLabel = addTextObject( + teamWindowX + 17, + 23, + i18next.t("starterSelectUiHandler:randomize"), + TextStyle.TOOLTIP_CONTENT, + ); randomSelectLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(randomSelectLabel); - this.randomCursorObj = globalScene.add.nineslice(teamWindowX + 4, 21, "select_cursor", undefined, 26, 15, 6, 6, 6, 6); + 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); @@ -696,7 +822,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); this.pokemonSprite = globalScene.add.sprite(53, 63, "pkmn__sub"); - this.pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.starterSelectContainer.add(this.pokemonSprite); this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); @@ -709,11 +838,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { + fontSize: "56px", + }); this.pokemonLuckLabelText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckLabelText); - this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { + fontSize: "56px", + }); this.pokemonLuckText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckText); @@ -734,7 +867,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyDarknessOverlay.setScale(0.5); this.pokemonCandyDarknessOverlay.setOrigin(0, 0); this.pokemonCandyDarknessOverlay.setTint(0x000000); - this.pokemonCandyDarknessOverlay.setAlpha(0.50); + this.pokemonCandyDarknessOverlay.setAlpha(0.5); this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); @@ -744,7 +877,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonCandyContainer); - this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px" }); + this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { + fontSize: "42px", + }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); @@ -797,7 +932,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonMovesContainer.add(moveContainer); } - this.pokemonAdditionalMoveCountLabel = addTextObject(-this.pokemonMoveBgs[0].width / 2, 56, "(+0)", TextStyle.PARTY); + this.pokemonAdditionalMoveCountLabel = addTextObject( + -this.pokemonMoveBgs[0].width / 2, + 56, + "(+0)", + TextStyle.PARTY, + ); this.pokemonAdditionalMoveCountLabel.setOrigin(0.5, 0); this.pokemonMovesContainer.add(this.pokemonAdditionalMoveCountLabel); @@ -848,53 +988,137 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // 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 = 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.shinyLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleShiny"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + 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.formLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleForm"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.formLabel.setName("text-form-label"); - this.genderIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + 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.genderLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleGender"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.genderLabel.setName("text-gender-label"); - this.abilityIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + 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.abilityLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.abilityLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleAbility"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.abilityLabel.setName("text-ability-label"); - this.natureIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + 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.natureLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.natureLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleNature"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.natureLabel.setName("text-nature-label"); - this.teraIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + 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.teraLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleTera"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.teraLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleTera"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.teraLabel.setName("text-tera-label"); - this.goFilterIconElement = new Phaser.GameObjects.Sprite(globalScene, this.filterInstructionRowX, this.filterInstructionRowY, "keyboard", "C.png"); + this.goFilterIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.filterInstructionRowX, + this.filterInstructionRowY, + "keyboard", + "C.png", + ); this.goFilterIconElement.setName("sprite-goFilter-icon-element"); this.goFilterIconElement.setScale(0.675); this.goFilterIconElement.setOrigin(0.0, 0.0); - this.goFilterLabel = addTextObject(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY, i18next.t("starterSelectUiHandler:goFilter"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.goFilterLabel = addTextObject( + this.filterInstructionRowX + this.instructionRowTextOffset, + this.filterInstructionRowY, + i18next.t("starterSelectUiHandler:goFilter"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.goFilterLabel.setName("text-goFilter-label"); this.hideInstructions(); @@ -941,7 +1165,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.initTutorialOverlay(this.starterSelectContainer); this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); - globalScene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); + globalScene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, e => + this.onCandyUpgradeDisplayChanged(e), + ); this.updateInstructions(); } @@ -949,7 +1175,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { show(args: any[]): boolean { if (!this.starterPreferences) { // starterPreferences haven't been loaded yet - this.starterPreferences = StarterPrefs.load(); + this.starterPreferences = loadStarterPreferences(); } this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers this.pokerusSpecies = getPokerusStarters(); @@ -1016,29 +1242,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; if (starterAttributes.shiny && !hasShiny) { // shiny form wasn't unlocked, purging shiny and variant setting - delete starterAttributes.shiny; - delete starterAttributes.variant; + starterAttributes.shiny = undefined; + starterAttributes.variant = undefined; } else if (starterAttributes.shiny === false && !hasNonShiny) { // non shiny form wasn't unlocked, purging shiny setting - delete starterAttributes.shiny; + starterAttributes.shiny = undefined; } if (starterAttributes.variant !== undefined) { const unlockedVariants = [ hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + hasShiny && caughtAttr & DexAttr.VARIANT_3, ]; - if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0 || !unlockedVariants[starterAttributes.variant]) { + if ( + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 || + !unlockedVariants[starterAttributes.variant] + ) { // variant value is invalid or requested variant wasn't unlocked, purging setting - delete starterAttributes.variant; + starterAttributes.variant = undefined; } } if (starterAttributes.female !== undefined) { if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) { // requested gender wasn't unlocked, purging setting - delete starterAttributes.female; + starterAttributes.female = undefined; } } @@ -1053,25 +1283,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const unlockedAbilities = [ hasAbility1, speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2, - hasHiddenAbility + hasHiddenAbility, ]; if (!unlockedAbilities[starterAttributes.ability]) { // requested ability wasn't unlocked, purging setting - delete starterAttributes.ability; + starterAttributes.ability = undefined; } } const selectedForm = starterAttributes.form; - if (selectedForm !== undefined && (!species.forms[selectedForm]?.isStarterSelectable || !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm)))) { + if ( + selectedForm !== undefined && + (!species.forms[selectedForm]?.isStarterSelectable || + !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm))) + ) { // requested form wasn't unlocked/isn't a starter form, purging setting - delete starterAttributes.form; + starterAttributes.form = undefined; } if (starterAttributes.nature !== undefined) { const unlockedNatures = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr); if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) { // requested nature wasn't unlocked, purging setting - delete starterAttributes.nature; + starterAttributes.nature = undefined; } } @@ -1103,7 +1337,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number, moveToTop?: boolean) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + moveToTop?: boolean, + ) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); const singleLine = text?.indexOf("\n") === -1; @@ -1147,8 +1389,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[speciesId]; - return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[speciesId]) - && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[speciesId]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); } /** @@ -1160,8 +1404,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = globalScene.gameData.starterData[speciesId]; - return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[speciesId])[starterData.valueReduction] - && starterData.valueReduction < valueReductionMax; + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[speciesId])[starterData.valueReduction] && + starterData.valueReduction < valueReductionMax + ); } /** @@ -1182,7 +1429,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * @param species {@linkcode PokemonSpecies} of the icon used to check for upgrades * @param startPaused Should this animation be paused after it is added? */ - setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused: boolean = false): void { + setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused = false): void { globalScene.tweens.killTweensOf(icon); // Skip animations if they are disabled if (globalScene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { @@ -1203,16 +1450,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { y: 2 - 5, duration: fixedInt(125), ease: "Cubic.easeOut", - yoyo: true + yoyo: true, }, { targets: icon, y: 2 - 3, duration: fixedInt(150), ease: "Cubic.easeOut", - yoyo: true - } - ], }; + yoyo: true, + }, + ], + }; const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); @@ -1223,7 +1471,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (isPassiveAvailable) { globalScene.tweens.chain(tweenChain).paused = startPaused; } - // 'On' mode + // 'On' mode } else if (globalScene.candyUpgradeNotification === 2) { if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { globalScene.tweens.chain(tweenChain).paused = startPaused; @@ -1238,7 +1486,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const species = starter.species; const slotVisible = !!species?.speciesId; - if (!species || globalScene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + if ( + !species || + globalScene.candyUpgradeNotification === 0 || + species.speciesId !== species.getRootSpeciesId(false) + ) { starter.candyUpgradeIcon.setVisible(false); starter.candyUpgradeOverlayIcon.setVisible(false); return; @@ -1256,7 +1508,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // 'On' mode } else if (globalScene.candyUpgradeNotification === 2) { starter.candyUpgradeIcon.setVisible( - slotVisible && ( isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable )); + slotVisible && (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable), + ); starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -1266,7 +1519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * @param starterContainer the container for the Pokemon to update */ updateCandyUpgradeDisplay(starterContainer: StarterContainer) { - if (this.isUpgradeIconEnabled() ) { + if (this.isUpgradeIconEnabled()) { this.setUpgradeIcon(starterContainer); } if (this.isUpgradeAnimationEnabled()) { @@ -1286,7 +1539,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Loop through all visible candy icons when set to 'Icon' mode if (globalScene.candyUpgradeDisplay === 0) { - this.filteredStarterContainers.forEach((starter) => { + this.filteredStarterContainers.forEach(starter => { this.setUpgradeIcon(starter); }); @@ -1312,7 +1565,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const numOfRows = Math.ceil(numberOfStarters / maxColumns); const currentRow = Math.floor(this.cursor / maxColumns); const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first starter index on the screen - const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); // this is the last starter index on the screen + const onScreenLastIndex = Math.min( + this.filteredStarterContainers.length - 1, + onScreenFirstIndex + maxRows * maxColumns - 1, + ); // this is the last starter index on the screen const onScreenNumberOfStarters = onScreenLastIndex - onScreenFirstIndex + 1; const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / maxColumns); const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / maxColumns); @@ -1333,7 +1589,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); success = true; - } else if (this.filterMode && !this.filterBar.getFilter(this.filterBar.getColumn(this.filterBarCursor)).hasDefaultValues()) { + } else if ( + this.filterMode && + !this.filterBar.getFilter(this.filterBar.getColumn(this.filterBarCursor)).hasDefaultValues() + ) { if (this.filterBar.getColumn(this.filterBarCursor) === DropDownColumn.CAUGHT) { this.resetCaughtDropdown(); } else { @@ -1362,7 +1621,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setFilterMode(true); this.filterBar.toggleDropDown(this.filterBarCursor); } - } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected + } else if (this.startCursorObj.visible) { + // this checks to see if the start button is selected switch (button) { case Button.ACTION: if (this.tryStart(true)) { @@ -1372,7 +1632,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } break; case Button.UP: - // UP from start button: go to pokemon in team if any, otherwise filter + // UP from start button: go to pokemon in team if any, otherwise filter this.startCursorObj.setVisible(false); if (this.starterSpecies.length > 0) { this.starterIconsCursorIndex = this.starterSpecies.length - 1; @@ -1385,7 +1645,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; break; case Button.DOWN: - // DOWN from start button: Go to filters + // DOWN from start button: Go to filters this.startCursorObj.setVisible(false); this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); @@ -1427,8 +1687,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case Button.UP: if (this.filterBar.openDropDown) { success = this.filterBar.decDropDownCursor(); - } else if (this.filterBarCursor === this.filterBar.numFilters - 1 ) { - // UP from the last filter, move to start button + } else if (this.filterBarCursor === this.filterBar.numFilters - 1) { + // UP from the last filter, move to start button this.setFilterMode(false); this.cursorObj.setVisible(false); if (this.starterSpecies.length > 0) { @@ -1445,9 +1705,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; const targetCol = Math.min(8, Math.floor(proportion * 11)); if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + this.setCursor(numberOfStarters - (numberOfStarters % 9) + targetCol); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + this.setCursor(Math.max(numberOfStarters - (numberOfStarters % 9) + targetCol - 9, 0)); } success = true; } @@ -1456,13 +1716,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.filterBar.openDropDown) { success = this.filterBar.incDropDownCursor(); } else if (this.filterBarCursor === this.filterBar.numFilters - 1) { - // DOWN from the last filter, move to random selection label + // DOWN from the last filter, move to random selection label this.setFilterMode(false); this.cursorObj.setVisible(false); this.randomCursorObj.setVisible(true); success = true; } else if (numberOfStarters > 0) { - // DOWN from filter bar to top of Pokemon list + // DOWN from filter bar to top of Pokemon list this.setFilterMode(false); this.scrollCursor = 0; this.updateScroll(); @@ -1488,11 +1748,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { error = true; break; } - const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, _gen: number, i: number ) => total + globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); + const currentPartyValue = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + total + globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), + 0, + ); // Filter valid starters const validStarters = this.filteredStarterContainers.filter(starter => { const species = starter.species; - const [ isDupe ] = this.isInParty(species); + const [isDupe] = this.isInParty(species); const starterCost = globalScene.gameData.getSpeciesStarterValue(species.speciesId); const isValidForChallenge = new BooleanHolder(true); Challenge.applyChallenges( @@ -1500,11 +1766,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, - globalScene.gameData.getSpeciesDexAttrProps( - species, - this.getCurrentDexProps(species.speciesId) - ), - this.isPartyValid() + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + this.isPartyValid(), ); const isCaught = globalScene.gameData.dexData[species.speciesId].caughtAttr; return ( @@ -1532,14 +1795,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const starterCost = globalScene.gameData.getSpeciesStarterValue(randomSpecies.speciesId); const speciesForm = getPokemonSpeciesForm(randomSpecies.speciesId, props.formIndex); // Load assets and add to party - speciesForm - .loadAssets(props.female, props.formIndex, props.shiny, props.variant, true) - .then(() => { - if (this.tryUpdateValue(starterCost, true)) { - this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, teraType, true); - ui.playSelect(); - } - }); + speciesForm.loadAssets(props.female, props.formIndex, props.shiny, props.variant, true).then(() => { + if (this.tryUpdateValue(starterCost, true)) { + this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, teraType, true); + ui.playSelect(); + } + }); break; case Button.UP: this.randomCursorObj.setVisible(false); @@ -1576,7 +1837,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else { - let starterContainer; + let starterContainer: StarterContainer; const starterData = globalScene.gameData.starterData[this.lastSpecies.speciesId]; // prepare persistent starter data to store changes let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; @@ -1586,68 +1847,110 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterContainer = this.filteredStarterContainers[this.cursor]; } else { // if species is in filtered starters, get the starter container from the filtered starters, it can be undefined if the species is not in the filtered starters - starterContainer = this.filteredStarterContainers[this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies)]; + starterContainer = + this.filteredStarterContainers[ + this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies) + ]; } if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - } else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon + } else if (this.starterSpecies.length <= 6) { + // checks to see if the party has 6 or fewer pokemon const ui = this.getUi(); let options: any[] = []; // TODO: add proper type - const [ isDupe, removeIndex ]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed const isPartyValid = this.isPartyValid(); const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.lastSpecies, isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)), isPartyValid); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + this.lastSpecies, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ), + isPartyValid, + ); - const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, _gen: number, i: number) => total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); + const currentPartyValue = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + (total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId)), + 0, + ); const newCost = globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); - if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < PLAYER_PARTY_MAX_SIZE) { // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party + if ( + !isDupe && + isValidForChallenge.value && + currentPartyValue + newCost <= this.getValueLimit() && + this.starterSpecies.length < PLAYER_PARTY_MAX_SIZE + ) { + // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party options = [ { label: i18next.t("starterSelectUiHandler:addToParty"), handler: () => { ui.setMode(Mode.STARTER_SELECT); - const isOverValueLimit = this.tryUpdateValue(globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), true); + const isOverValueLimit = this.tryUpdateValue( + globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), + true, + ); if (!isDupe && isValidForChallenge.value && isOverValueLimit) { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset, this.teraCursor); + this.addToParty( + this.lastSpecies, + this.dexAttrCursor, + this.abilityCursor, + this.natureCursor as unknown as Nature, + this.starterMoveset?.slice(0) as StarterMoveset, + this.teraCursor, + ); ui.playSelect(); } else { ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party } return true; }, - overrideSound: true - }]; - } else if (isDupe) { // if it already exists in your party, it will give you the option to remove from your party - options = [{ - label: i18next.t("starterSelectUiHandler:removeFromParty"), - handler: () => { - this.popStarter(removeIndex); - ui.setMode(Mode.STARTER_SELECT); - return true; - } - }]; + overrideSound: true, + }, + ]; + } else if (isDupe) { + // if it already exists in your party, it will give you the option to remove from your party + options = [ + { + label: i18next.t("starterSelectUiHandler:removeFromParty"), + handler: () => { + this.popStarter(removeIndex); + ui.setMode(Mode.STARTER_SELECT); + return true; + }, + }, + ]; } - options.push( // this shows the IVs for the pokemon + options.push( + // this shows the IVs for the pokemon { label: i18next.t("starterSelectUiHandler:toggleIVs"), handler: () => { this.toggleStatsMode(); ui.setMode(Mode.STARTER_SELECT); return true; - } - }); - if (this.speciesStarterMoves.length > 1) { // this lets you change the pokemon moves + }, + }, + ); + if (this.speciesStarterMoves.length > 1) { + // this lets you change the pokemon moves const showSwapOptions = (moveset: StarterMoveset) => { - this.blockInput = true; ui.setMode(Mode.STARTER_SELECT).then(() => { @@ -1655,70 +1958,78 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.moveInfoOverlay.show(allMoves[moveset[0]]); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: moveset.map((m: Moves, i: number) => { - const option: OptionSelectItem = { - label: allMoves[m].name, - handler: () => { - this.blockInput = true; - ui.setMode(Mode.STARTER_SELECT).then(() => { - ui.showText(`${i18next.t("starterSelectUiHandler:selectMoveSwapWith")} ${allMoves[m].name}.`, null, () => { - const possibleMoves = this.speciesStarterMoves.filter((sm: Moves) => sm !== m); - this.moveInfoOverlay.show(allMoves[possibleMoves[0]]); + options: moveset + .map((m: Moves, i: number) => { + const option: OptionSelectItem = { + label: allMoves[m].name, + handler: () => { + this.blockInput = true; + ui.setMode(Mode.STARTER_SELECT).then(() => { + ui.showText( + `${i18next.t("starterSelectUiHandler:selectMoveSwapWith")} ${allMoves[m].name}.`, + null, + () => { + const possibleMoves = this.speciesStarterMoves.filter((sm: Moves) => sm !== m); + this.moveInfoOverlay.show(allMoves[possibleMoves[0]]); - ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: possibleMoves.map(sm => { - // make an option for each available starter move - const option = { - label: allMoves[sm].name, - handler: () => { - this.switchMoveHandler(i, sm, m); - showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? - return true; - }, - onHover: () => { - this.moveInfoOverlay.show(allMoves[sm]); - }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), - supportHover: true, - maxOptions: 8, - yOffset: 19 - }); - this.blockInput = false; + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: possibleMoves + .map(sm => { + // make an option for each available starter move + const option = { + label: allMoves[sm].name, + handler: () => { + this.switchMoveHandler(i, sm, m); + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? + return true; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[sm]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + this.blockInput = false; + }, + ); }); - }); + return true; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); return true; }, onHover: () => { - this.moveInfoOverlay.show(allMoves[m]); + this.moveInfoOverlay.clear(); }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.moveInfoOverlay.clear(); - this.clearText(); - ui.setMode(Mode.STARTER_SELECT); - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), + }), supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; }); @@ -1729,48 +2040,51 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? return true; - } + }, }); } if (this.canCycleNature) { // if we could cycle natures, enable the improved nature menu const showNatureOptions = () => { - this.blockInput = true; ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(i18next.t("starterSelectUiHandler:selectNature"), null, () => { const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: natures.map((n: Nature, _i: number) => { - const option: OptionSelectItem = { - label: getNatureName(n, true, true, true, globalScene.uiTheme), + options: natures + .map((n: Nature, _i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, globalScene.uiTheme), + handler: () => { + // update default nature in starter save data + if (!starterAttributes) { + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; + } + starterAttributes.nature = n; + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); + // set nature for starter + this.setSpeciesDetails(this.lastSpecies, { + natureIndex: n, + }); + this.blockInput = false; + return true; + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), handler: () => { - // update default nature in starter save data - if (!starterAttributes) { - starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; - } - starterAttributes.nature = n; this.clearText(); ui.setMode(Mode.STARTER_SELECT); - // set nature for starter - this.setSpeciesDetails(this.lastSpecies, { natureIndex: n }); this.blockInput = false; return true; - } - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.clearText(); - ui.setMode(Mode.STARTER_SELECT); - this.blockInput = false; - return true; - } - }), + }, + }), maxOptions: 8, - yOffset: 19 + yOffset: 19, }); }); }); @@ -1780,12 +2094,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { showNatureOptions(); return true; - } + }, }); } const passiveAttr = starterData.passiveAttr; - if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive + if (passiveAttr & PassiveAttr.UNLOCKED) { + // this is for enabling and disabling the passive if (!(passiveAttr & PassiveAttr.ENABLED)) { options.push({ label: i18next.t("starterSelectUiHandler:enablePassive"), @@ -1794,7 +2109,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies); return true; - } + }, }); } else { options.push({ @@ -1804,7 +2119,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies); return true; - } + }, }); } } @@ -1821,7 +2136,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); } else { options.push({ @@ -1834,7 +2149,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); } options.push({ @@ -1843,26 +2158,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.playSelect(); let nickname = starterAttributes.nickname ? String(starterAttributes.nickname) : ""; nickname = decodeURIComponent(escape(atob(nickname))); - ui.setModeWithoutClear(Mode.RENAME_POKEMON, { - buttonActions: [ - (sanitizedName: string) => { - ui.playSelect(); - starterAttributes.nickname = sanitizedName; - const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); - if (name.length > 0) { - this.pokemonNameText.setText(name); - } else { - this.pokemonNameText.setText(this.lastSpecies.name); - } - ui.setMode(Mode.STARTER_SELECT); - }, - () => { - ui.setMode(Mode.STARTER_SELECT); - } - ] - }, nickname); + ui.setModeWithoutClear( + Mode.RENAME_POKEMON, + { + buttonActions: [ + (sanitizedName: string) => { + ui.playSelect(); + starterAttributes.nickname = sanitizedName; + const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); + if (name.length > 0) { + this.pokemonNameText.setText(name); + } else { + this.pokemonNameText.setText(this.lastSpecies.name); + } + ui.setMode(Mode.STARTER_SELECT); + }, + () => { + ui.setMode(Mode.STARTER_SELECT); + }, + ], + }, + nickname, + ); return true; - } + }, }); // Purchases with Candy @@ -1894,21 +2213,25 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // update the passive background and icon/animation for available upgrade if (starterContainer) { this.updateCandyUpgradeDisplay(starterContainer); - starterContainer.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); + starterContainer.starterPassiveBgs.setVisible( + !!globalScene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr, + ); } return true; } return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); } // Reduce cost option const valueReduction = starterData.valueReduction; if (valueReduction < valueReductionMax) { - const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId])[valueReduction]; + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId])[ + valueReduction + ]; options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { @@ -1937,7 +2260,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); } @@ -1949,7 +2272,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { // Egg list full, show error message at the top of the screen and abort - this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); + this.showText( + i18next.t("egg:tooManyEggs"), + undefined, + () => this.showText("", 0, () => (this.tutorialActive = false)), + 2000, + false, + undefined, + true, + ); return false; } if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { @@ -1957,7 +2288,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - const egg = new Egg({ species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const egg = new Egg({ + species: this.lastSpecies.speciesId, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); egg.addEggToGameData(); globalScene.gameData.saveSystem().then(success => { @@ -1978,18 +2312,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); options.push({ label: i18next.t("menu:cancel"), handler: () => { ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, - yOffset: 47 + yOffset: 47, }); }; options.push({ @@ -2000,12 +2334,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { shiny: starterAttributes.shiny, variant: starterAttributes.variant, form: starterAttributes.form, - female: starterAttributes.female + female: starterAttributes.female, }; ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, starterAttributes.form, attributes); }); return true; - } + }, }); if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { options.push({ @@ -2013,7 +2347,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); return true; - } + }, }); } options.push({ @@ -2021,24 +2355,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, - yOffset: 47 + yOffset: 47, }); success = true; } } else { - const props = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { if (starterAttributes.shiny === false) { // If not shiny, we change to shiny and get the proper default variant - const newProps = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); - const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : newProps.variant; - this.setSpeciesDetails(this.lastSpecies, { shiny: true, variant: newVariant }); + const newProps = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); + const newVariant = starterAttributes.variant + ? (starterAttributes.variant as Variant) + : newProps.variant; + this.setSpeciesDetails(this.lastSpecies, { + shiny: true, + variant: newVariant, + }); globalScene.playSound("se/sparkle"); // Cycle tint based on current sprite tint @@ -2054,29 +2399,37 @@ export default class StarterSelectUiHandler extends MessageUiHandler { do { newVariant = (newVariant + 1) % 3; if (newVariant === 0) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { // TODO: is this bang correct? + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { + // TODO: is this bang correct? break; } } else if (newVariant === 1) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { // TODO: is this bang correct? + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { + // TODO: is this bang correct? break; } } else { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { // TODO: is this bang correct? + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { + // TODO: is this bang correct? break; } } } while (newVariant !== props.variant); starterAttributes.variant = newVariant; // store the selected variant - if ((this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY && newVariant <= props.variant) { // If we have run out of variants, go back to non shiny - this.setSpeciesDetails(this.lastSpecies, { shiny: false, variant: 0 }); + this.setSpeciesDetails(this.lastSpecies, { + shiny: false, + variant: 0, + }); this.pokemonShinyIcon.setVisible(false); success = true; starterAttributes.shiny = false; } else { // If going to a higher variant, or only shiny forms are caught, go to next variant - this.setSpeciesDetails(this.lastSpecies, { variant: newVariant as Variant }); + this.setSpeciesDetails(this.lastSpecies, { + variant: newVariant as Variant, + }); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant as Variant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); @@ -2092,20 +2445,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let newFormIndex = props.formIndex; do { newFormIndex = (newFormIndex + 1) % formCount; - if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr! & globalScene.gameData.getFormAttr(newFormIndex)) { // TODO: are those bangs correct? + if ( + this.lastSpecies.forms[newFormIndex].isStarterSelectable && + this.speciesStarterDexEntry!.caughtAttr! & globalScene.gameData.getFormAttr(newFormIndex) + ) { + // TODO: are those bangs correct? break; } } while (newFormIndex !== props.formIndex); starterAttributes.form = newFormIndex; // store the selected form starterAttributes.tera = this.lastSpecies.forms[newFormIndex].type1; - this.setSpeciesDetails(this.lastSpecies, { formIndex: newFormIndex, teraType: starterAttributes.tera }); + this.setSpeciesDetails(this.lastSpecies, { + formIndex: newFormIndex, + teraType: starterAttributes.tera, + }); success = true; } break; case Button.CYCLE_GENDER: if (this.canCycleGender) { starterAttributes.female = !props.female; - this.setSpeciesDetails(this.lastSpecies, { female: !props.female }); + this.setSpeciesDetails(this.lastSpecies, { + female: !props.female, + }); success = true; } break; @@ -2122,7 +2484,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else if (newAbilityIndex === 1) { - // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 + // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } @@ -2142,7 +2504,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { globalScene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); } - this.setSpeciesDetails(this.lastSpecies, { abilityIndex: newAbilityIndex }); + this.setSpeciesDetails(this.lastSpecies, { + abilityIndex: newAbilityIndex, + }); success = true; } break; @@ -2153,7 +2517,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; // store cycled nature as default starterAttributes.nature = newNature as unknown as number; - this.setSpeciesDetails(this.lastSpecies, { natureIndex: newNature }); + this.setSpeciesDetails(this.lastSpecies, { + natureIndex: newNature, + }); success = true; } break; @@ -2162,10 +2528,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const speciesForm = getPokemonSpeciesForm(this.lastSpecies.speciesId, starterAttributes.form ?? 0); if (speciesForm.type1 === this.teraCursor && !Utils.isNullOrUndefined(speciesForm.type2)) { starterAttributes.tera = speciesForm.type2!; - this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type2! }); + this.setSpeciesDetails(this.lastSpecies, { + teraType: speciesForm.type2!, + }); } else { starterAttributes.tera = speciesForm.type1; - this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type1 }); + this.setSpeciesDetails(this.lastSpecies, { + teraType: speciesForm.type1, + }); } success = true; } @@ -2185,7 +2555,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else { if (this.starterIconsCursorIndex === 0) { - // Up from first Pokemon in the team > go to Random selection + // Up from first Pokemon in the team > go to Random selection this.starterIconsCursorObj.setVisible(false); this.setSpecies(null); this.randomCursorObj.setVisible(true); @@ -2198,19 +2568,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; case Button.DOWN: if (!this.starterIconsCursorObj.visible) { - if (currentRow < numOfRows - 1) { // not last row - if (currentRow - this.scrollCursor === 8) { // last row of visible starters + if (currentRow < numOfRows - 1) { + // not last row + if (currentRow - this.scrollCursor === 8) { + // last row of visible starters this.scrollCursor++; } success = this.setCursor(this.cursor + 9); this.updateScroll(); } else if (numOfRows > 1) { - // DOWN from last row of Pokemon > Wrap around to first row + // DOWN from last row of Pokemon > Wrap around to first row this.scrollCursor = 0; this.updateScroll(); success = this.setCursor(this.cursor % 9); } else { - // DOWN from single row of Pokemon > Go to filters + // DOWN from single row of Pokemon > Go to filters this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); this.setFilterMode(true); success = true; @@ -2232,23 +2604,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.cursor % 9 !== 0) { success = this.setCursor(this.cursor - 1); } else { - // LEFT from filtered Pokemon, on the left edge - if ( onScreenCurrentRow === 0 ) { + // LEFT from filtered Pokemon, on the left edge + if (onScreenCurrentRow === 0) { // from the first row of starters we go to the random selection this.cursorObj.setVisible(false); this.randomCursorObj.setVisible(true); } else if (this.starterSpecies.length === 0) { - // no starter in team and not on first row > wrap around to the last column + // no starter in team and not on first row > wrap around to the last column success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); - } else if (onScreenCurrentRow < 7) { - // at least one pokemon in team > for the first 7 rows, go to closest starter + // at least one pokemon in team > for the first 7 rows, go to closest starter this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.starterIconsCursorIndex = findClosestStarterIndex( + this.cursorObj.y - 1, + this.starterSpecies.length, + ); this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { - // at least one pokemon in team > from the bottom 2 rows, go to start run button + // at least one pokemon in team > from the bottom 2 rows, go to start run button this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); @@ -2256,40 +2629,41 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else if (numberOfStarters > 0) { - // LEFT from team > Go to closest filtered Pokemon + // LEFT from team > Go to closest filtered Pokemon const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); success = true; } else { - // LEFT from team and no Pokemon in filter > do nothing + // LEFT from team and no Pokemon in filter > do nothing success = false; } break; case Button.RIGHT: if (!this.starterIconsCursorObj.visible) { - // is not right edge + // is not right edge if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { success = this.setCursor(this.cursor + 1); } else { - // RIGHT from filtered Pokemon, on the right edge - if ( onScreenCurrentRow === 0 ) { + // RIGHT from filtered Pokemon, on the right edge + if (onScreenCurrentRow === 0) { // from the first row of starters we go to the random selection this.cursorObj.setVisible(false); this.randomCursorObj.setVisible(true); } else if (this.starterSpecies.length === 0) { - // no selected starter in team > wrap around to the first column + // no selected starter in team > wrap around to the first column success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); - } else if (onScreenCurrentRow < 7) { - // at least one pokemon in team > for the first 7 rows, go to closest starter + // at least one pokemon in team > for the first 7 rows, go to closest starter this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.starterIconsCursorIndex = findClosestStarterIndex( + this.cursorObj.y - 1, + this.starterSpecies.length, + ); this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { - // at least one pokemon in team > from the bottom 2 rows, go to start run button + // at least one pokemon in team > from the bottom 2 rows, go to start run button this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); @@ -2297,14 +2671,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else if (numberOfStarters > 0) { - // RIGHT from team > Go to closest filtered Pokemon + // RIGHT from team > Go to closest filtered Pokemon const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); - this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); + this.setCursor( + Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9)), + ); success = true; } else { - // RIGHT from team and no Pokemon in filter > do nothing + // RIGHT from team and no Pokemon in filter > do nothing success = false; } break; @@ -2331,14 +2707,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } - return [ isDupe, removeIndex ]; + return [isDupe, removeIndex]; } - addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, teraType: PokemonType, randomSelection: boolean = false) { + addToParty( + species: PokemonSpecies, + dexAttr: bigint, + abilityIndex: number, + nature: Nature, + moveset: StarterMoveset, + teraType: PokemonType, + randomSelection = false, + ) { const props = globalScene.gameData.getSpeciesDexAttrProps(species, dexAttr); - this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); - this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); - this.checkIconId(this.starterIcons[this.starterSpecies.length], species, props.female, props.formIndex, props.shiny, props.variant); + this.starterIcons[this.starterSpecies.length].setTexture( + species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + ); + this.starterIcons[this.starterSpecies.length].setFrame( + species.getIconId(props.female, props.formIndex, props.shiny, props.variant), + ); + this.checkIconId( + this.starterIcons[this.starterSpecies.length], + species, + props.female, + props.formIndex, + props.shiny, + props.variant, + ); this.starterSpecies.push(species); this.starterAttr.push(dexAttr); @@ -2346,7 +2741,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterNatures.push(nature); this.starterTeras.push(teraType); this.starterMovesets.push(moveset); - if (this.speciesLoaded.get(species.speciesId) || randomSelection ) { + if (this.speciesLoaded.get(species.speciesId) || randomSelection) { getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(); } this.updateInstructions(); @@ -2370,21 +2765,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // 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 }; + 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; + 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; + globalScene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice( + 0, + ) as StarterMoveset; } } } else { @@ -2403,8 +2807,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { - let iconPath; + updateButtonIcon( + iconSetting: SettingKeyboard, + gamepadType: string, + iconElement: GameObjects.Sprite, + controlLabel: GameObjects.Text, + ): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let iconPath: string; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls if (gamepadType === "touch") { @@ -2437,12 +2847,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } else { iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } + // @ts-ignore: 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); - this.instructionsContainer.add([ iconElement, controlLabel ]); + this.instructionsContainer.add([iconElement, controlLabel]); this.instructionRowY += 8; if (this.instructionRowY >= 24) { this.instructionRowY = 0; @@ -2450,8 +2861,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { - let iconPath; + updateFilterButtonIcon( + iconSetting: SettingKeyboard, + gamepadType: string, + iconElement: GameObjects.Sprite, + controlLabel: GameObjects.Text, + ): void { + let iconPath: string; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls if (gamepadType === "touch") { @@ -2465,7 +2881,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { controlLabel.setPosition(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY); iconElement.setVisible(true); controlLabel.setVisible(true); - this.filterInstructionsContainer.add([ iconElement, controlLabel ]); + this.filterInstructionsContainer.add([iconElement, controlLabel]); this.filterInstructionRowY += 8; if (this.filterInstructionRowY >= 24) { this.filterInstructionRowY = 0; @@ -2481,9 +2897,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.hideInstructions(); this.instructionsContainer.removeAll(); this.filterInstructionsContainer.removeAll(); - let gamepadType; + let gamepadType: string; if (globalScene.inputMethod === "gamepad") { - gamepadType = globalScene.inputController.getConfig(globalScene.inputController.selectedDevice[Device.GAMEPAD]).padType; + gamepadType = globalScene.inputController.getConfig( + globalScene.inputController.selectedDevice[Device.GAMEPAD], + ).padType; } else { gamepadType = globalScene.inputMethod; } @@ -2500,13 +2918,28 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); } if (this.canCycleGender) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Gender, + gamepadType, + this.genderIconElement, + this.genderLabel, + ); } if (this.canCycleAbility) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Ability, gamepadType, this.abilityIconElement, this.abilityLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Ability, + gamepadType, + this.abilityIconElement, + this.abilityLabel, + ); } if (this.canCycleNature) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Nature, gamepadType, this.natureIconElement, this.natureLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Nature, + gamepadType, + this.natureIconElement, + this.natureLabel, + ); } if (this.canCycleTera) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Tera, gamepadType, this.teraIconElement, this.teraLabel); @@ -2515,9 +2948,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // if filter mode is inactivated and gamepadType is not undefined, update the button icons if (!this.filterMode) { - this.updateFilterButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.goFilterIconElement, this.goFilterLabel); + this.updateFilterButtonIcon( + SettingKeyboard.Button_Stats, + gamepadType, + this.goFilterIconElement, + this.goFilterLabel, + ); } - } getValueLimit(): number { @@ -2554,16 +2991,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (species.forms?.length > 0) { for (let i = 0; i < species.forms.length; i++) { /* Here we are making a fake form index dex props for challenges - * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge - */ + * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge + */ const tempFormProps = BigInt(Math.pow(2, i)) * DexAttr.DEFAULT_FORM; const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, tempFormProps), true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + container.species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, tempFormProps), + true, + ); allFormsValid = allFormsValid || isValidForChallenge.value; } } else { const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, globalScene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + container.species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + species, + globalScene.gameData.getSpeciesDefaultDexAttr(container.species, false, true), + ), + true, + ); allFormsValid = isValidForChallenge.value; } if (allFormsValid) { @@ -2584,7 +3038,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); const props = globalScene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr); - starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + starterSprite.setTexture( + currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant), + ); currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); } @@ -2600,10 +3057,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isStarterProgressable = speciesEggMoves.hasOwnProperty(container.species.speciesId); // Gen filter - const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); // Type filter - const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + const fitsType = this.filterBar + .getVals(DropDownColumn.TYPES) + .some(type => container.species.isOfType((type as number) - 1)); // Caught / Shiny filter const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); @@ -2615,13 +3074,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { if (caught === "SHINY3") { return isVariant3Caught; - } else if (caught === "SHINY2") { + } + if (caught === "SHINY2") { return isVariant2Caught && !isVariant3Caught; - } else if (caught === "SHINY") { + } + if (caught === "SHINY") { return isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "NORMAL") { + } + if (caught === "NORMAL") { return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "UNCAUGHT") { + } + if (caught === "UNCAUGHT") { return isUncaught; } }); @@ -2632,11 +3095,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { return isPassiveUnlockable; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { return true; } }); @@ -2648,15 +3114,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { return isCostReducedByOne || isCostReducedByTwo; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { return isCostReducedByOne; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { return isCostReducedByTwo; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { return isStarterProgressable && !(isCostReducedByOne || isCostReducedByTwo); - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { return isCostReductionUnlockable; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { return true; } }); @@ -2682,22 +3153,28 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "WIN" && misc.state === DropDownState.ON) { return hasWon; - } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { return hasNotWon || isUndefined; - } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + } + if (misc.val === "WIN" && misc.state === DropDownState.OFF) { return true; } }); // HA Filter - const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const speciesHasHiddenAbility = + container.species.abilityHidden !== container.species.ability1 && + container.species.abilityHidden !== Abilities.NONE; const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { return hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { return speciesHasHiddenAbility && !hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { return true; } }); @@ -2707,9 +3184,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "EGG" && misc.state === DropDownState.ON) { return isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + } + if (misc.val === "EGG" && misc.state === DropDownState.OFF) { return true; } }); @@ -2718,14 +3197,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { return this.pokerusSpecies.includes(container.species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { return !this.pokerusSpecies.includes(container.species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { return true; } }); - if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + if ( + fitsGen && + fitsType && + fitsCaught && + fitsPassive && + fitsCostReduction && + fitsFavorite && + fitsWin && + fitsHA && + fitsEgg && + fitsPokerus + ) { this.filteredStarterContainers.push(container); } }); @@ -2737,26 +3229,38 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; this.filteredStarterContainers.sort((a, b) => { switch (sort.val) { - default: - break; case SortCriteria.NUMBER: return (a.species.speciesId - b.species.speciesId) * -sort.dir; case SortCriteria.COST: return (a.cost - b.cost) * -sort.dir; - case SortCriteria.CANDY: + case SortCriteria.CANDY: { const candyCountA = globalScene.gameData.starterData[a.species.speciesId].candyCount; const candyCountB = globalScene.gameData.starterData[b.species.speciesId].candyCount; return (candyCountA - candyCountB) * -sort.dir; - case SortCriteria.IV: - const avgIVsA = globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[a.species.speciesId].ivs.length; - const avgIVsB = globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[b.species.speciesId].ivs.length; + } + case SortCriteria.IV: { + const avgIVsA = + globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = + globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[b.species.speciesId].ivs.length; return (avgIVsA - avgIVsB) * -sort.dir; + } case SortCriteria.NAME: return a.species.name.localeCompare(b.species.name) * -sort.dir; case SortCriteria.CAUGHT: - return (globalScene.gameData.dexData[a.species.speciesId].caughtCount - globalScene.gameData.dexData[b.species.speciesId].caughtCount) * -sort.dir; + return ( + (globalScene.gameData.dexData[a.species.speciesId].caughtCount - + globalScene.gameData.dexData[b.species.speciesId].caughtCount) * + -sort.dir + ); case SortCriteria.HATCHED: - return (globalScene.gameData.dexData[a.species.speciesId].hatchedCount - globalScene.gameData.dexData[b.species.speciesId].hatchedCount) * -sort.dir; + return ( + (globalScene.gameData.dexData[a.species.speciesId].hatchedCount - + globalScene.gameData.dexData[b.species.speciesId].hatchedCount) * + -sort.dir + ); } return 0; }); @@ -2773,7 +3277,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const maxColumns = 9; const maxRows = 9; const onScreenFirstIndex = this.scrollCursor * maxColumns; - const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); + const onScreenLastIndex = Math.min( + this.filteredStarterContainers.length - 1, + onScreenFirstIndex + maxRows * maxColumns - 1, + ); this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); @@ -2795,57 +3302,65 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); } return; - } else { - container.setVisible(true); + } + container.setVisible(true); - if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); - pokerusCursorIndex++; - } + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].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); - } + 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); + } - const speciesId = container.species.speciesId; - this.updateStarterValueLabel(container); + const speciesId = container.species.speciesId; + this.updateStarterValueLabel(container); - container.label.setVisible(true); - const speciesVariants = speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v)) + container.label.setVisible(true); + const speciesVariants = + speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY + ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v), + ) : []; - for (let v = 0; v < 3; v++) { - const hasVariant = speciesVariants.length > v; - container.shinyIcons[v].setVisible(hasVariant); - if (hasVariant) { - container.shinyIcons[v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); - } + for (let v = 0; v < 3; v++) { + const hasVariant = speciesVariants.length > v; + container.shinyIcons[v].setVisible(hasVariant); + if (hasVariant) { + container.shinyIcons[v].setTint( + getVariantTint( + speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2, + ), + ); + } + } + + container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[speciesId].passiveAttr); + container.hiddenAbilityIcon.setVisible( + !!globalScene.gameData.dexData[speciesId].caughtAttr && + !!(globalScene.gameData.starterData[speciesId].abilityAttr & 4), + ); + container.classicWinIcon.setVisible(globalScene.gameData.starterData[speciesId].classicWinCount > 0); + container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + + // 'Candy Icon' mode + if (globalScene.candyUpgradeDisplay === 0) { + if (!starterColors[speciesId]) { + // Default to white if no colors are found + starterColors[speciesId] = ["ffffff", "ffffff"]; } - container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[speciesId].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!globalScene.gameData.dexData[speciesId].caughtAttr && !!(globalScene.gameData.starterData[speciesId].abilityAttr & 4)); - container.classicWinIcon.setVisible(globalScene.gameData.starterData[speciesId].classicWinCount > 0); - container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + // Set the candy colors + container.candyUpgradeIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][0]))); + container.candyUpgradeOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][1]))); - // 'Candy Icon' mode - if (globalScene.candyUpgradeDisplay === 0) { - - if (!starterColors[speciesId]) { - // Default to white if no colors are found - starterColors[speciesId] = [ "ffffff", "ffffff" ]; - } - - // Set the candy colors - container.candyUpgradeIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][0]))); - container.candyUpgradeOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][1]))); - - this.setUpgradeIcon(container); - } else if (globalScene.candyUpgradeDisplay === 1) { - container.candyUpgradeIcon.setVisible(false); - container.candyUpgradeOverlayIcon.setVisible(false); - } + this.setUpgradeIcon(container); + } else if (globalScene.candyUpgradeDisplay === 1) { + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); } }); }; @@ -2870,7 +3385,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (species) { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = this.starterPreferences[species.speciesId]?.variant ? this.starterPreferences[species.speciesId].variant as Variant : defaultProps.variant; + const variant = this.starterPreferences[species.speciesId]?.variant + ? (this.starterPreferences[species.speciesId].variant as Variant) + : defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonShinyIcon.setTint(tint); @@ -2937,13 +3454,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityText.off("pointerover"); this.pokemonPassiveText.off("pointerover"); - const starterAttributes : StarterAttributes | null = species ? { ...this.starterPreferences[species.speciesId] } : null; + const starterAttributes: StarterAttributes | null = species + ? { ...this.starterPreferences[species.speciesId] } + : null; if (starterAttributes?.nature) { // load default nature from stater save data, if set this.natureCursor = starterAttributes.nature; } - if (starterAttributes?.ability && !isNaN(starterAttributes.ability)) { + if (starterAttributes?.ability && !Number.isNaN(starterAttributes.ability)) { // load default ability from stater save data, if set this.abilityCursor = starterAttributes.ability; } @@ -3000,7 +3519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let growthReadable = toReadableString(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); if (i18next.exists("growth:" + growthAux)) { - growthReadable = i18next.t("growth:" + growthAux as any); + growthReadable = i18next.t(("growth:" + growthAux) as any); } this.pokemonGrowthRateText.setText(growthReadable); @@ -3033,11 +3552,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setY(16); this.pokemonShinyIcon.setY(135); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - [ - this.pokemonCandyContainer, - this.pokemonHatchedIcon, - this.pokemonHatchedCountText - ].map(c => c.setVisible(false)); + [this.pokemonCandyContainer, this.pokemonHatchedIcon, this.pokemonHatchedCountText].map(c => + c.setVisible(false), + ); this.pokemonFormText.setY(25); } else { this.pokemonCaughtHatchedContainer.setY(25); @@ -3051,7 +3568,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedCountText.setVisible(true); const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId); - const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); this.pokemonCandyContainer.on("pointerover", () => { @@ -3062,10 +3579,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { globalScene.ui.hideTooltip(); this.activeTooltip = undefined; }); - } - // Pause the animation when the species is selected const speciesIndex = this.allSpecies.indexOf(species); const icon = this.starterContainers[speciesIndex].icon; @@ -3093,15 +3608,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { variant: props.variant, abilityIndex: this.starterAbilityIndexes[starterIndex], natureIndex: this.starterNatures[starterIndex], - teraType: this.starterTeras[starterIndex] + teraType: this.starterTeras[starterIndex], }); } else { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); - const defaultAbilityIndex = starterAttributes?.ability ?? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const defaultAbilityIndex = + starterAttributes?.ability ?? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); // load default nature from stater save data, if set const defaultNature = starterAttributes?.nature || globalScene.gameData.getSpeciesDefaultNature(species); props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { + if (starterAttributes?.variant && !Number.isNaN(starterAttributes.variant)) { if (props.shiny) { props.variant = starterAttributes.variant as Variant; } @@ -3115,7 +3631,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { female: props.female, variant: props.variant, abilityIndex: defaultAbilityIndex, - natureIndex: defaultNature + natureIndex: defaultNature, }); } @@ -3155,7 +3671,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { variant: props.variant, abilityIndex: defaultAbilityIndex, natureIndex: defaultNature, - forSeen: true + forSeen: true, }); this.pokemonSprite.setTint(0x808080); } @@ -3178,13 +3694,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonFormText.setVisible(false); this.teraIcon.setVisible(false); - this.setSpeciesDetails(species!, { // TODO: is this bang correct? + this.setSpeciesDetails(species!, { + // TODO: is this bang correct? shiny: false, formIndex: 0, female: false, variant: 0, abilityIndex: 0, - natureIndex: 0 + natureIndex: 0, }); this.pokemonSprite.clearTint(); } @@ -3194,16 +3711,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; - const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const oldNatureIndex = this.natureCursor > -1 ? this.natureCursor : globalScene.gameData.getSpeciesDefaultNature(species); + const oldAbilityIndex = + this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const oldNatureIndex = + this.natureCursor > -1 ? this.natureCursor : globalScene.gameData.getSpeciesDefaultNature(species); this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; this.teraCursor = PokemonType.UNKNOWN; // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences - const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) - || !isNullOrUndefined(formIndex) || !isNullOrUndefined(shiny) || !isNullOrUndefined(variant); + const shouldUpdateSprite = + (species?.genderDiffs && !isNullOrUndefined(female)) || + !isNullOrUndefined(formIndex) || + !isNullOrUndefined(shiny) || + !isNullOrUndefined(variant); if (this.activeTooltip === "CANDY") { if (this.lastSpecies && this.pokemonCandyContainer.visible) { @@ -3223,14 +3745,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (species) { - this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps?.shiny)) ? DexAttr.NON_SHINY : DexAttr.SHINY; - this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps?.female)) ? DexAttr.MALE : DexAttr.FEMALE; - this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps?.variant)) ? DexAttr.DEFAULT_VARIANT : variant === 1 ? DexAttr.VARIANT_2 : DexAttr.VARIANT_3; - this.dexAttrCursor |= globalScene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex)); // TODO: is this bang correct? + this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps?.shiny)) + ? DexAttr.NON_SHINY + : DexAttr.SHINY; + this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps?.female)) + ? DexAttr.MALE + : DexAttr.FEMALE; + this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps?.variant)) + ? DexAttr.DEFAULT_VARIANT + : variant === 1 + ? DexAttr.VARIANT_2 + : DexAttr.VARIANT_3; + this.dexAttrCursor |= globalScene.gameData.getFormAttr( + formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex), + ); // TODO: is this bang correct? this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex); this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex); this.teraCursor = !Utils.isNullOrUndefined(teraType) ? teraType : (teraType = species.type1); - const [ isInParty, partyIndex ]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image + const [isInParty, partyIndex]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image if (isInParty) { this.updatePartyIcon(species, partyIndex); } @@ -3284,7 +3816,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); - this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); + this.pokemonNumberText.setShadowColor( + this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true), + ); if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { const starterIndex = this.starterSpecies.indexOf(species); @@ -3300,7 +3834,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.assetLoadCancelled = assetLoadCancelled; if (shouldUpdateSprite) { - species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? + species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { + // TODO: is this bang correct? if (assetLoadCancelled.value) { return; } @@ -3317,18 +3852,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); - const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), + !!this.starterSpecies.length, + ); + const currentFilteredContainer = this.filteredStarterContainers.find( + p => p.species.speciesId === species.speciesId, + ); if (currentFilteredContainer) { const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; - starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); + starterSprite.setTexture( + species.getIconAtlasKey(formIndex, shiny, variant), + species.getIconId(female!, formIndex, shiny, variant), + ); currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); } const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + const caughtVariants = [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => caughtAttr & v, + ); this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); @@ -3348,12 +3897,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { hasAbility2 = 0; } - this.canCycleAbility = [ hasAbility1, hasAbility2, hasHiddenAbility ].filter(a => a).length > 1; + this.canCycleAbility = [hasAbility1, hasAbility2, hasHiddenAbility].filter(a => a).length > 1; - this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) - .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)).filter(f => f).length > 1; + this.canCycleForm = + species.forms + .filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) + .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)) + .filter(f => f).length > 1; this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; - this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); + this.canCycleTera = + !this.statsMode && + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3376,7 +3931,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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.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)]; @@ -3429,22 +3986,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const iconPosition = { x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1, - y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2 + 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); - } else if (this.activeTooltip === "PASSIVE") { // No passive and passive tooltip is active > hide it globalScene.ui.hideTooltip(); } - this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false, globalScene.uiTheme)); + this.pokemonNatureText.setText( + getNatureName(natureIndex as unknown as Nature, true, true, false, globalScene.uiTheme), + ); let levelMoves: LevelMoves; - if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && formIndex && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) { + if ( + pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && + formIndex && + pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex) + ) { levelMoves = pokemonFormLevelMoves[species.speciesId][formIndex]; } else { levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; @@ -3464,18 +4026,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ? speciesMoveData : speciesMoveData[formIndex!] // TODO: is this bang correct? : null; - const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: number) => globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) : []); - this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => availableStarterMoves.find(sm => sm === m)) as StarterMoveset; + const availableStarterMoves = this.speciesStarterMoves.concat( + speciesEggMoves.hasOwnProperty(species.speciesId) + ? speciesEggMoves[species.speciesId].filter( + (_: any, em: number) => globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em), + ) + : [], + ); + this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => + availableStarterMoves.find(sm => sm === m), + ) as StarterMoveset; // Consolidate move data if it contains an incompatible move if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) { - this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset?.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); + this.starterMoveset.push( + ...availableStarterMoves + .filter(sm => this.starterMoveset?.indexOf(sm) === -1) + .slice(0, 4 - this.starterMoveset.length), + ); } // Remove duplicate moves - this.starterMoveset = this.starterMoveset.filter( - (move, i) => { - return this.starterMoveset?.indexOf(move) === i; - }) as StarterMoveset; + this.starterMoveset = this.starterMoveset.filter((move, i) => { + return this.starterMoveset?.indexOf(move) === i; + }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? const formText = species.getFormNameToDisplay(formIndex); @@ -3484,7 +4057,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.teraIcon.setFrame(PokemonType[this.teraCursor].toLowerCase()); - this.teraIcon.setVisible(!this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); + this.teraIcon.setVisible( + !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id), + ); } else { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); @@ -3520,7 +4095,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em); - this.pokemonEggMoveBgs[em].setFrame(PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase()); + this.pokemonEggMoveBgs[em].setFrame( + PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase(), + ); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } @@ -3633,7 +4210,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } tryUpdateValue(add?: number, addingToParty?: boolean): boolean { - const value = this.starterSpecies.map(s => s.generation).reduce((total: number, _gen: number, i: number) => total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); + const value = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + (total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId)), + 0, + ); const newValue = value + (add || 0); const valueLimit = this.getValueLimit(); const overLimit = newValue > valueLimit; @@ -3643,16 +4226,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } 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.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(); // this checks to see if the party is valid - if (addingToParty) { // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean + if (addingToParty) { + // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean const isNewPokemonValid = new BooleanHolder(true); const species = this.filteredStarterContainers[this.cursor].species; - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isNewPokemonValid, globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isNewPokemonValid, + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + false, + ); isPartyValid = isPartyValid || isNewPokemonValid.value; } @@ -3678,19 +4271,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. */ const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.getCurrentDexProps(this.allSpecies[s].speciesId)), isPartyValid); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + this.allSpecies[s], + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + this.allSpecies[s], + this.getCurrentDexProps(this.allSpecies[s].speciesId), + ), + isPartyValid, + ); const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; const isPokemonInParty = this.isInParty(this.allSpecies[s])[0]; // this will get the valud of isDupe from isInParty. This will let us see if the pokemon in question is in our party already so we don't grey out the sprites if they're invalid /* This code does a check to tell whether or not a sprite should be lit up or greyed out. There are 3 ways a pokemon's sprite should be lit up: - * 1) If it's in your party, it's a valid pokemon (i.e. for challenge) and you have enough points to have it - * 2) If it's in your party, it's not valid (i.e. for challenges), and you have enough points to have it - * 3) If it's not in your party, but it's a valid pokemon and you have enough points for it - * Any other time, the sprite should be greyed out. - * For example, if it's in your party, valid, but costs too much, or if it's not in your party and not valid, regardless of cost - */ + * 1) If it's in your party, it's a valid pokemon (i.e. for challenge) and you have enough points to have it + * 2) If it's in your party, it's not valid (i.e. for challenges), and you have enough points to have it + * 3) If it's not in your party, but it's a valid pokemon and you have enough points for it + * Any other time, the sprite should be greyed out. + * For example, if it's in your party, valid, but costs too much, or if it's not in your party and not valid, regardless of cost + */ if (canBeChosen || (isPokemonInParty && remainValue >= speciesStarterValue)) { speciesSprite.setAlpha(1); } else { @@ -3715,24 +4318,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.blockInput = false; }; ui.showText(i18next.t("starterSelectUiHandler:confirmExit"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - ui.setMode(Mode.STARTER_SELECT); - globalScene.clearPhaseQueue(); - if (globalScene.gameMode.isChallenge) { - globalScene.pushPhase(new SelectChallengePhase()); - globalScene.pushPhase(new EncounterPhase()); - } else { - globalScene.pushPhase(new TitlePhase()); - } - this.clearText(); - globalScene.getCurrentPhase()?.end(); - }, cancel, null, null, 19); + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.STARTER_SELECT); + globalScene.clearPhaseQueue(); + if (globalScene.gameMode.isChallenge) { + globalScene.pushPhase(new SelectChallengePhase()); + globalScene.pushPhase(new EncounterPhase()); + } else { + globalScene.pushPhase(new TitlePhase()); + } + this.clearText(); + globalScene.getCurrentPhase()?.end(); + }, + cancel, + null, + null, + 19, + ); }); return true; } - tryStart(manualTrigger: boolean = false): boolean { + tryStart(manualTrigger = false): boolean { if (!this.starterSpecies.length) { return false; } @@ -3751,47 +4361,72 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (canStart) { ui.showText(i18next.t("starterSelectUiHandler:confirmStartTeam"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - const startRun = () => { - globalScene.money = globalScene.gameMode.getStartingMoney(); - ui.setMode(Mode.STARTER_SELECT); - const thisObj = this; - const originalStarterSelectCallback = this.starterSelectCallback; - this.starterSelectCallback = null; - originalStarterSelectCallback && originalStarterSelectCallback(new Array(this.starterSpecies.length).fill(0).map(function (_, i) { - const starterSpecies = thisObj.starterSpecies[i]; - return { - species: starterSpecies, - dexAttr: thisObj.starterAttr[i], - abilityIndex: thisObj.starterAbilityIndexes[i], - passive: !(globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), - nature: thisObj.starterNatures[i] as Nature, - teraType: thisObj.starterTeras[i] as PokemonType, - moveset: thisObj.starterMovesets[i], - pokerus: thisObj.pokerusSpecies.includes(starterSpecies), - nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, - }; - })); - }; - startRun(); - }, cancel, null, null, 19); + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + const startRun = () => { + globalScene.money = globalScene.gameMode.getStartingMoney(); + ui.setMode(Mode.STARTER_SELECT); + const thisObj = this; + const originalStarterSelectCallback = this.starterSelectCallback; + this.starterSelectCallback = null; + originalStarterSelectCallback?.( + new Array(this.starterSpecies.length).fill(0).map((_, i) => { + const starterSpecies = thisObj.starterSpecies[i]; + return { + species: starterSpecies, + dexAttr: thisObj.starterAttr[i], + abilityIndex: thisObj.starterAbilityIndexes[i], + passive: !( + globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ + (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED) + ), + nature: thisObj.starterNatures[i] as Nature, + teraType: thisObj.starterTeras[i] as PokemonType, + moveset: thisObj.starterMovesets[i], + pokerus: thisObj.pokerusSpecies.includes(starterSpecies), + nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, + }; + }), + ); + }; + startRun(); + }, + cancel, + null, + null, + 19, + ); }); } else { this.tutorialActive = true; - this.showText(i18next.t("starterSelectUiHandler:invalidParty"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), undefined, true); + this.showText( + i18next.t("starterSelectUiHandler:invalidParty"), + undefined, + () => this.showText("", 0, () => (this.tutorialActive = false)), + undefined, + true, + ); } return true; } /* This block checks to see if your party is valid * It checks each pokemon against the challenge - noting that due to monotype challenges it needs to check the pokemon while ignoring their evolutions/form change items - */ + */ isPartyValid(): boolean { let canStart = false; for (let s = 0; s < this.starterSpecies.length; s++) { const isValidForChallenge = new BooleanHolder(true); const species = this.starterSpecies[s]; - Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + false, + ); canStart = canStart || isValidForChallenge.value; } return canStart; @@ -3812,7 +4447,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props * If neither of these pass, we add DexAttr.MALE to our temp props */ - if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + if ( + this.starterPreferences[speciesId]?.female || + ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n) + ) { props += DexAttr.FEMALE; } else { props += DexAttr.MALE; @@ -3820,7 +4458,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. * If they're not there, it enables shiny state by default if any shiny was caught */ - if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) { + if ( + this.starterPreferences[speciesId]?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false) + ) { props += DexAttr.SHINY; if (this.starterPreferences[speciesId]?.variant !== undefined) { props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; @@ -3840,7 +4481,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { props += DexAttr.NON_SHINY; props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant } - if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon + if (this.starterPreferences[speciesId]?.form) { + // this checks for the form of the pokemon props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; } else { // Get the first unlocked form @@ -3868,9 +4510,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { //@ts-ignore this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? this.teraIcon.setVisible(globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); - const props = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); const formIndex = props.formIndex; - this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(this.lastSpecies.speciesId, formIndex ?? 0).type2); + this.canCycleTera = + !this.statsMode && + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(getPokemonSpeciesForm(this.lastSpecies.speciesId, formIndex ?? 0).type2); this.updateInstructions(); } } @@ -3910,7 +4558,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { clear(): void { super.clear(); - StarterPrefs.save(this.starterPreferences); + saveStarterPreferences(this.starterPreferences); this.cursor = -1; this.hideInstructions(); this.activeTooltip = undefined; @@ -3928,9 +4576,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { - console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + 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)); } diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index add7eeedbb8..8cc74e64e96 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -4,14 +4,20 @@ import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; import i18next from "i18next"; import { globalScene } from "#app/global-scene"; - const ivChartSize = 24; -const ivChartStatCoordMultipliers = [[ 0, -1 ], [ 0.825, -0.5 ], [ 0.825, 0.5 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ], [ 0, 1 ]]; +const ivChartStatCoordMultipliers = [ + [0, -1], + [0.825, -0.5], + [0.825, 0.5], + [-0.825, -0.5], + [-0.825, 0.5], + [0, 1], +]; const speedLabelOffset = -3; const sideLabelOffset = 1; -const ivLabelOffset = [ 0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset ]; -const ivChartLabelyOffset = [ 0, 5, 0, 5, 0, 0 ]; // doing this so attack does not overlap with (+N) -const ivChartStatIndexes = [ 0, 1, 2, 5, 4, 3 ]; // swap special attack and speed +const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; +const ivChartLabelyOffset = [0, 5, 0, 5, 0, 0]; // doing this so attack does not overlap with (+N) +const ivChartStatIndexes = [0, 1, 2, 5, 4, 3]; // swap special attack and speed const defaultIvChartData = new Array(12).fill(null).map(() => 0); @@ -31,17 +37,33 @@ export class StatsContainer extends Phaser.GameObjects.Container { setup() { this.setName("stats"); - const ivChartBgData = new Array(6).fill(null).map((_, i: number) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); + const ivChartBgData = new Array(6) + .fill(null) + .flatMap((_, i: number) => [ + ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], + ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1], + ]); const ivChartBg = globalScene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); ivChartBg.setOrigin(0, 0); - const ivChartBorder = globalScene.add.polygon(ivChartBg.x, ivChartBg.y, ivChartBgData) - .setStrokeStyle(1, 0x484050); + const ivChartBorder = globalScene.add.polygon(ivChartBg.x, ivChartBg.y, ivChartBgData).setStrokeStyle(1, 0x484050); ivChartBorder.setOrigin(0, 0); - const ivChartBgLines = [[ 0, -1, 0, 1 ], [ -0.825, -0.5, 0.825, 0.5 ], [ 0.825, -0.5, -0.825, 0.5 ]].map(coords => { - const line = new Phaser.GameObjects.Line(globalScene, ivChartBg.x, ivChartBg.y, ivChartSize * coords[0], ivChartSize * coords[1], ivChartSize * coords[2], ivChartSize * coords[3], 0xffffff) - .setLineWidth(0.5); + const ivChartBgLines = [ + [0, -1, 0, 1], + [-0.825, -0.5, 0.825, 0.5], + [0.825, -0.5, -0.825, 0.5], + ].map(coords => { + const line = new Phaser.GameObjects.Line( + globalScene, + ivChartBg.x, + ivChartBg.y, + ivChartSize * coords[0], + ivChartSize * coords[1], + ivChartSize * coords[2], + ivChartSize * coords[3], + 0xffffff, + ).setLineWidth(0.5); line.setOrigin(0, 0); return line; }); @@ -58,17 +80,24 @@ export class StatsContainer extends Phaser.GameObjects.Container { for (const s of PERMANENT_STATS) { const statLabel = addTextObject( - ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), - ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + (this.showDiff ? 0 : ivChartLabelyOffset[s]), + ivChartBg.x + ivChartSize * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), + ivChartBg.y + + ivChartSize * ivChartStatCoordMultipliers[s][1] * 1.325 - + 4 + + (this.showDiff ? 0 : ivChartLabelyOffset[s]), i18next.t(getStatKey(s)), - TextStyle.TOOLTIP_CONTENT + TextStyle.TOOLTIP_CONTENT, ); statLabel.setOrigin(0.5); - this.ivStatValueTexts[s] = addBBCodeTextObject(statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); + this.ivStatValueTexts[s] = addBBCodeTextObject( + statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), + statLabel.y + 8, + "0", + TextStyle.TOOLTIP_CONTENT, + ); this.ivStatValueTexts[s].setOrigin(0.5); - this.add(statLabel); this.add(this.ivStatValueTexts[s]); } @@ -76,7 +105,12 @@ export class StatsContainer extends Phaser.GameObjects.Container { updateIvs(ivs: number[], originalIvs?: number[]): void { if (ivs) { - const ivChartData = new Array(6).fill(null).map((_, i) => [ (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); + const ivChartData = new Array(6) + .fill(null) + .flatMap((_, i) => [ + (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], + (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1], + ]); const lastIvChartData = this.statsIvsCache || defaultIvChartData; const perfectIVColor: string = getTextColor(TextStyle.SUMMARY_GOLD, false, globalScene.uiTheme); this.statsIvsCache = ivChartData.slice(0); @@ -100,12 +134,12 @@ export class StatsContainer extends Phaser.GameObjects.Container { t.setText(`[shadow]${label}[/shadow]`); }); - const newColor = ivs.every(iv => iv === 31) ? parseInt(perfectIVColor.substr(1), 16) : 0x98d8a0; + const newColor = ivs.every(iv => iv === 31) ? Number.parseInt(perfectIVColor.substr(1), 16) : 0x98d8a0; const oldColor = this.ivChart.fillColor; - const interpolateColor = oldColor !== newColor ? [ - Phaser.Display.Color.IntegerToColor(oldColor), - Phaser.Display.Color.IntegerToColor(newColor) - ] : null; + const interpolateColor = + oldColor !== newColor + ? [Phaser.Display.Color.IntegerToColor(oldColor), Phaser.Display.Color.IntegerToColor(newColor)] + : null; globalScene.tweens.addCounter({ from: 0, @@ -114,16 +148,19 @@ export class StatsContainer extends Phaser.GameObjects.Container { ease: "Cubic.easeOut", onUpdate: (tween: Phaser.Tweens.Tween) => { const progress = tween.getValue(); - const interpolatedData = ivChartData.map((v: number, i: number) => v * progress + (lastIvChartData[i] * (1 - progress))); + const interpolatedData = ivChartData.map( + (v: number, i: number) => v * progress + lastIvChartData[i] * (1 - progress), + ); if (interpolateColor) { this.ivChart.setFillStyle( Phaser.Display.Color.ValueToColor( - Phaser.Display.Color.Interpolate.ColorWithColor(interpolateColor[0], interpolateColor[1], 1, progress) + Phaser.Display.Color.Interpolate.ColorWithColor(interpolateColor[0], interpolateColor[1], 1, progress), ).color, - 0.75); + 0.75, + ); } this.ivChart.setTo(interpolatedData); - } + }, }); } else { this.statsIvsCache = defaultIvChartData; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 465f1e2c8ec..d42572cfef4 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -33,24 +33,24 @@ import { achvs } from "#app/system/achv"; enum Page { PROFILE, STATS, - MOVES + MOVES, } export enum SummaryUiMode { DEFAULT, - LEARN_MOVE + LEARN_MOVE, } /** Holds all objects related to an ability for each iteration */ interface abilityContainer { /** An image displaying the summary label */ - labelImage: Phaser.GameObjects.Image, + labelImage: Phaser.GameObjects.Image; /** The ability object */ - ability: Ability | null, + ability: Ability | null; /** The text object displaying the name of the ability */ - nameText: Phaser.GameObjects.Text | null, + nameText: Phaser.GameObjects.Text | null; /** The text object displaying the description of the ability */ - descriptionText: Phaser.GameObjects.Text | null, + descriptionText: Phaser.GameObjects.Text | null; } export default class SummaryUiHandler extends UiHandler { @@ -133,7 +133,7 @@ export default class SummaryUiHandler extends UiHandler { summaryBg.setOrigin(0, 1); this.summaryContainer.add(summaryBg); - this.tabSprite = globalScene.add.sprite(134, (-summaryBg.displayHeight) + 16, "summary_tabs_1"); + this.tabSprite = globalScene.add.sprite(134, -summaryBg.displayHeight + 16, "summary_tabs_1"); this.tabSprite.setOrigin(1, 1); this.summaryContainer.add(this.tabSprite); @@ -150,7 +150,12 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setOrigin(0, 1); this.summaryContainer.add(this.numberText); - this.pokemonSprite = globalScene.initPokemonSprite(globalScene.add.sprite(56, -106, "pkmn__sub"), undefined, false, true); + this.pokemonSprite = globalScene.initPokemonSprite( + globalScene.add.sprite(56, -106, "pkmn__sub"), + undefined, + false, + true, + ); this.summaryContainer.add(this.pokemonSprite); this.nameText = addTextObject(6, -54, "", TextStyle.SUMMARY); @@ -191,12 +196,14 @@ export default class SummaryUiHandler extends UiHandler { this.candyShadow = globalScene.add.sprite(13, -140, "candy"); this.candyShadow.setTint(0x000000); - this.candyShadow.setAlpha(0.50); + this.candyShadow.setAlpha(0.5); this.candyShadow.setScale(0.8); this.candyShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 16), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.candyShadow); - this.candyCountText = addTextObject(20, -146, "x0", TextStyle.WINDOW_ALT, { fontSize: "76px" }); + this.candyCountText = addTextObject(20, -146, "x0", TextStyle.WINDOW_ALT, { + fontSize: "76px", + }); this.candyCountText.setOrigin(0, 0); this.summaryContainer.add(this.candyCountText); @@ -210,12 +217,14 @@ export default class SummaryUiHandler extends UiHandler { this.friendshipShadow = globalScene.add.sprite(13, -60, "friendship"); this.friendshipShadow.setTint(0x000000); - this.friendshipShadow.setAlpha(0.50); + this.friendshipShadow.setAlpha(0.5); this.friendshipShadow.setScale(0.8); this.friendshipShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 50, 16), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.friendshipShadow); - this.friendshipText = addTextObject(20, -66, "x0", TextStyle.WINDOW_ALT, { fontSize: "76px" }); + this.friendshipText = addTextObject(20, -66, "x0", TextStyle.WINDOW_ALT, { + fontSize: "76px", + }); this.friendshipText.setOrigin(0, 0); this.summaryContainer.add(this.friendshipText); @@ -304,14 +313,14 @@ export default class SummaryUiHandler extends UiHandler { super.show(args); /* args[] information - * args[0] : the Pokemon displayed in the Summary-UI - * args[1] : the summaryUiMode (defaults to 0) - * args[2] : the start page (defaults to Page.PROFILE) - * args[3] : contains the function executed when the user exits out of Summary UI - * args[4] : optional boolean used to determine if the Pokemon is part of the player's party or not (defaults to true, necessary for PR #2921 to display all relevant information) - */ + * args[0] : the Pokemon displayed in the Summary-UI + * args[1] : the summaryUiMode (defaults to 0) + * args[2] : the start page (defaults to Page.PROFILE) + * args[3] : contains the function executed when the user exits out of Summary UI + * args[4] : optional boolean used to determine if the Pokemon is part of the player's party or not (defaults to true, necessary for PR #2921 to display all relevant information) + */ this.pokemon = args[0] as PlayerPokemon; - this.summaryUiMode = args.length > 1 ? args[1] as SummaryUiMode : SummaryUiMode.DEFAULT; + this.summaryUiMode = args.length > 1 ? (args[1] as SummaryUiMode) : SummaryUiMode.DEFAULT; this.playerParty = args[4] ?? true; globalScene.ui.bringToTop(this.summaryContainer); @@ -324,10 +333,11 @@ export default class SummaryUiHandler extends UiHandler { this.candyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.candyOverlay.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); - this.numberText.setText(Utils.padInt(this.pokemon.species.speciesId, 4)); this.numberText.setColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD)); - this.numberText.setShadowColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true)); + this.numberText.setShadowColor( + this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true), + ); const spriteKey = this.pokemon.getSpriteKey(true); try { this.pokemonSprite.play(spriteKey); @@ -340,7 +350,7 @@ export default class SummaryUiHandler extends UiHandler { this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; if (this.pokemon?.summonData?.speciesForm) { k += "Base"; @@ -356,11 +366,20 @@ export default class SummaryUiHandler extends UiHandler { this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + 2, 3); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => globalScene.ui.showTooltip("", `${this.pokemon?.species.getName(this.pokemon.formIndex)}/${this.pokemon?.fusionSpecies?.getName(this.pokemon?.fusionFormIndex)}`, true)); + this.splicedIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${this.pokemon?.species.getName(this.pokemon.formIndex)}/${this.pokemon?.fusionSpecies?.getName(this.pokemon?.fusionFormIndex)}`, + true, + ), + ); this.splicedIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } - if (globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + if ( + globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && + globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0 + ) { this.championRibbon.setVisible(true); } else { this.championRibbon.setVisible(false); @@ -372,38 +391,55 @@ export default class SummaryUiHandler extends UiHandler { } const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.pokemon.species.getRootSpeciesId()]); - const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); if (this.candyShadow.visible) { - this.candyShadow.on("pointerover", () => globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true)); + this.candyShadow.on("pointerover", () => + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true), + ); this.candyShadow.on("pointerout", () => globalScene.ui.hideTooltip()); } - this.candyCountText.setText(`x${globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`); + this.candyCountText.setText( + `x${globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`, + ); this.candyShadow.setCrop(0, 0, 16, candyCropY); if (this.friendshipShadow.visible) { - this.friendshipShadow.on("pointerover", () => globalScene.ui.showTooltip("", `${i18next.t("pokemonSummary:friendship")}`, true)); + this.friendshipShadow.on("pointerover", () => + globalScene.ui.showTooltip("", `${i18next.t("pokemonSummary:friendship")}`, true), + ); this.friendshipShadow.on("pointerout", () => globalScene.ui.hideTooltip()); } this.friendshipText.setText(`${this.pokemon?.friendship || "0"} / 255`); - this.friendshipShadow.setCrop(0, 0, 16, 16 - (16 * ((this.pokemon?.friendship || 0) / 255))); + this.friendshipShadow.setCrop(0, 0, 16, 16 - 16 * ((this.pokemon?.friendship || 0) / 255)); const doubleShiny = isFusion && this.pokemon.shiny && this.pokemon.fusionShiny; const baseVariant = !doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant; - this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3); + this.shinyIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, + 3, + ); this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(this.pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : this.pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.shinyIcon.on("pointerover", () => globalScene.ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : this.pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + true, + ), + ); this.shinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } @@ -420,14 +456,15 @@ export default class SummaryUiHandler extends UiHandler { this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); switch (this.summaryUiMode) { - case SummaryUiMode.DEFAULT: - const page = args.length < 2 ? Page.PROFILE : args[2] as Page; + case SummaryUiMode.DEFAULT: { + const page = args.length < 2 ? Page.PROFILE : (args[2] as Page); this.hideMoveEffect(true); this.setCursor(page); if (args.length > 3) { this.selectCallback = args[3]; } break; + } case SummaryUiMode.LEARN_MOVE: this.newMove = args[2] as Move; this.moveSelectFunction = args[3] as Function; @@ -464,7 +501,7 @@ export default class SummaryUiHandler extends UiHandler { if (button === Button.ACTION) { if (this.pokemon && this.moveCursor < this.pokemon.moveset.length) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction && this.moveSelectFunction(this.moveCursor); + this.moveSelectFunction?.(this.moveCursor); } else { if (this.selectedMoveIndex === -1) { this.selectedMoveIndex = this.moveCursor; @@ -475,7 +512,9 @@ export default class SummaryUiHandler extends UiHandler { this.pokemon.moveset[this.selectedMoveIndex] = this.pokemon.moveset[this.moveCursor]; this.pokemon.moveset[this.moveCursor] = tempMove; - const selectedMoveRow = this.moveRowsContainer.getAt(this.selectedMoveIndex) as Phaser.GameObjects.Container; + const selectedMoveRow = this.moveRowsContainer.getAt( + this.selectedMoveIndex, + ) as Phaser.GameObjects.Container; const switchMoveRow = this.moveRowsContainer.getAt(this.moveCursor) as Phaser.GameObjects.Container; this.moveRowsContainer.moveTo(selectedMoveRow, this.moveCursor); @@ -517,11 +556,10 @@ export default class SummaryUiHandler extends UiHandler { this.destroyBlinkCursor(); success = true; break; - } else { - this.hideMoveSelect(); - success = true; - break; } + this.hideMoveSelect(); + success = true; + break; } } } else { @@ -565,10 +603,11 @@ export default class SummaryUiHandler extends UiHandler { const pages = Utils.getEnumValues(Page); switch (button) { case Button.UP: - case Button.DOWN: + case Button.DOWN: { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { break; - } else if (!fromPartyMode) { + } + if (!fromPartyMode) { break; } const isDown = button === Button.DOWN; @@ -577,9 +616,10 @@ export default class SummaryUiHandler extends UiHandler { if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { const page = this.cursor; this.clear(); - this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); + this.show([party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page]); } break; + } case Button.LEFT: if (this.cursor) { success = this.setCursor(this.cursor - 1); @@ -606,7 +646,7 @@ export default class SummaryUiHandler extends UiHandler { return success || error; } - setCursor(cursor: number, overrideChanged: boolean = false): boolean { + setCursor(cursor: number, overrideChanged = false): boolean { let changed: boolean = overrideChanged || this.moveCursor !== cursor; if (this.moveSelect) { @@ -639,7 +679,7 @@ export default class SummaryUiHandler extends UiHandler { loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), - y: `-=${14.83 * (moveDescriptionLineCount - 3)}` + y: `-=${14.83 * (moveDescriptionLineCount - 3)}`, }); } @@ -666,7 +706,7 @@ export default class SummaryUiHandler extends UiHandler { } this.moveCursorObj.setVisible(true); }); - } + }, }); if (this.selectedMoveIndex > -1) { if (!this.selectedMoveCursorObj) { @@ -713,7 +753,7 @@ export default class SummaryUiHandler extends UiHandler { } this.summaryPageTransitionContainer.setVisible(false); this.transitioning = false; - } + }, }); this.summaryPageTransitionContainer.setVisible(true); } else { @@ -739,7 +779,7 @@ export default class SummaryUiHandler extends UiHandler { }); pageContainer.removeBetween(1, undefined, true); } - const pageBg = (pageContainer.getAt(0) as Phaser.GameObjects.Sprite); + const pageBg = pageContainer.getAt(0) as Phaser.GameObjects.Sprite; pageBg.setTexture(this.getPageKey(page)); if (this.descriptionScrollTween) { @@ -748,16 +788,26 @@ export default class SummaryUiHandler extends UiHandler { } switch (page) { - case Page.PROFILE: + case Page.PROFILE: { const profileContainer = globalScene.add.container(0, -pageBg.height); pageContainer.add(profileContainer); // 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)}`, TextStyle.SUMMARY_ALT); + 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)}`, + TextStyle.SUMMARY_ALT, + ); trainerText.setOrigin(0, 0); profileContainer.add(trainerText); - const trainerIdText = addTextObject(141, 12, `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, TextStyle.SUMMARY_ALT); + const trainerIdText = addTextObject( + 141, + 12, + `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, + TextStyle.SUMMARY_ALT, + ); trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); @@ -765,7 +815,7 @@ export default class SummaryUiHandler extends UiHandler { typeLabel.setOrigin(0, 0); profileContainer.add(typeLabel); - const getTypeIcon = (index: number, type: PokemonType, tera: boolean = false) => { + const getTypeIcon = (index: number, type: PokemonType, tera = false) => { const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera ? globalScene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), PokemonType[type].toLowerCase()) @@ -790,13 +840,21 @@ export default class SummaryUiHandler extends UiHandler { luckLabelText.setOrigin(0, 0); profileContainer.add(luckLabelText); - const luckText = addTextObject(141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); + const luckText = addTextObject( + 141 + luckLabelText.displayWidth + 2, + 28, + this.pokemon.getLuck().toString(), + TextStyle.SUMMARY, + ); luckText.setOrigin(0, 0); - luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); + luckText.setTint(getVariantTint(Math.min(this.pokemon.getLuck() - 1, 2) as Variant)); profileContainer.add(luckText); } - if (globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(this.pokemon)) { + if ( + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(this.pokemon) + ) { const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); teraIcon.setName("terrastallize-icon"); teraIcon.setFrame(PokemonType[this.pokemon.getTeraType()].toLowerCase()); @@ -807,20 +865,26 @@ export default class SummaryUiHandler extends UiHandler { labelImage: globalScene.add.image(0, 0, "summary_profile_ability"), ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? nameText: null, - descriptionText: null }; + descriptionText: null, + }; - const allAbilityInfo = [ this.abilityContainer ]; // Creates an array to iterate through + const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through // Only add to the array and set up displaying a passive if it's unlocked if (this.pokemon?.hasPassive()) { this.passiveContainer = { labelImage: globalScene.add.image(0, 0, "summary_profile_passive"), ability: this.pokemon.getPassiveAbility(), nameText: null, - descriptionText: null }; + descriptionText: null, + }; allAbilityInfo.push(this.passiveContainer); // Sets up the pixel button prompt image - this.abilityPrompt = globalScene.add.image(0, 0, !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt = globalScene.add.image( + 0, + 0, + !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a", + ); this.abilityPrompt.setPosition(8, 43); this.abilityPrompt.setVisible(true); this.abilityPrompt.setOrigin(0, 0); @@ -837,14 +901,16 @@ export default class SummaryUiHandler extends UiHandler { abilityInfo.nameText.setOrigin(0, 1); profileContainer.add(abilityInfo.nameText); - abilityInfo.descriptionText = addTextObject(7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 }}); // TODO: is this bang correct? + abilityInfo.descriptionText = addTextObject(7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { + wordWrap: { width: 1224 }, + }); // TODO: is this bang correct? abilityInfo.descriptionText.setOrigin(0, 0); profileContainer.add(abilityInfo.descriptionText); // Sets up the mask that hides the description text to give an illusion of scrolling const descriptionTextMaskRect = globalScene.make.graphics({}); descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.fillStyle(0xffffff); descriptionTextMaskRect.beginPath(); descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); @@ -863,7 +929,7 @@ export default class SummaryUiHandler extends UiHandler { loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), - y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` + y: `-=${14.83 * (abilityDescriptionLineCount - 2)}`, }); } }); @@ -877,19 +943,23 @@ export default class SummaryUiHandler extends UiHandler { const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? const memoString = i18next.t("pokemonSummary:memoString", { - metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, { - biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, - }), - natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) + metFragment: i18next.t( + `pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, + { + biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + wave: `${getBBCodeFrag(this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer"), TextStyle.SUMMARY_RED)}${closeFragment}`, + }, + ), + natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }), }); const memoText = addBBCodeTextObject(7, 113, String(memoString), TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); profileContainer.add(memoText); break; - case Page.STATS: + } + case Page.STATS: { this.statsContainer = globalScene.add.container(0, -pageBg.height); pageContainer.add(this.statsContainer); this.permStatsContainer = globalScene.add.container(27, 56); @@ -905,17 +975,32 @@ export default class SummaryUiHandler extends UiHandler { const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? - const statLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); - const ivLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, this.pokemon?.ivs[stat] === 31 ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY); + const statLabel = addTextObject( + 115 * colIndex + (colIndex === 1 ? 5 : 0), + 16 * rowIndex, + statName, + natureStatMultiplier === 1 + ? TextStyle.SUMMARY + : natureStatMultiplier > 1 + ? TextStyle.SUMMARY_PINK + : TextStyle.SUMMARY_BLUE, + ); + const ivLabel = addTextObject( + 115 * colIndex + (colIndex === 1 ? 5 : 0), + 16 * rowIndex, + statName, + this.pokemon?.ivs[stat] === 31 ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, + ); statLabel.setOrigin(0.5, 0); ivLabel.setOrigin(0.5, 0); this.permStatsContainer.add(statLabel); this.ivContainer.add(ivLabel); - const statValueText = stat !== Stat.HP - ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? - : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const statValueText = + stat !== Stat.HP + ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? + : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? const ivText = `${this.pokemon?.ivs[stat]}/31`; const statValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); @@ -927,9 +1012,12 @@ export default class SummaryUiHandler extends UiHandler { }); this.ivContainer.setVisible(false); - const itemModifiers = (globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) - .sort(modifierSortFunc); + const itemModifiers = ( + globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.pokemon?.id, + this.playerParty, + ) as PokemonHeldItemModifier[] + ).sort(modifierSortFunc); itemModifiers.forEach((item, i) => { const icon = item.getIcon(true); @@ -961,9 +1049,8 @@ export default class SummaryUiHandler extends UiHandler { expText.setOrigin(1, 0); this.statsContainer.add(expText); - const nextLvExp = pkmLvl < globalScene.getMaxExpLevel() - ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp - : 0; + const nextLvExp = + pkmLvl < globalScene.getMaxExpLevel() ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp : 0; const nextLvExpText = addTextObject(208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); nextLvExpText.setOrigin(1, 0); this.statsContainer.add(nextLvExpText); @@ -974,20 +1061,25 @@ export default class SummaryUiHandler extends UiHandler { const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.fillStyle(0xffffff); expMaskRect.beginPath(); expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); const expMask = expMaskRect.createGeometryMask(); expOverlay.setMask(expMask); - this.abilityPrompt = globalScene.add.image(0, 0, !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt = globalScene.add.image( + 0, + 0, + !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a", + ); this.abilityPrompt.setPosition(8, 47); this.abilityPrompt.setVisible(true); this.abilityPrompt.setOrigin(0, 0); this.statsContainer.add(this.abilityPrompt); break; - case Page.MOVES: + } + case Page.MOVES: { this.movesContainer = globalScene.add.container(5, -pageBg.height + 26); pageContainer.add(this.movesContainer); @@ -999,8 +1091,14 @@ export default class SummaryUiHandler extends UiHandler { extraRowOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowOverlay); - const extraRowText = addTextObject(35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove ? this.newMove.name : i18next.t("pokemonSummary:cancel"), - this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); + const extraRowText = addTextObject( + 35, + 0, + this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove + ? this.newMove.name + : i18next.t("pokemonSummary:cancel"), + this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY, + ); extraRowText.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowText); @@ -1028,7 +1126,8 @@ export default class SummaryUiHandler extends UiHandler { this.movesContainer.add(this.moveRowsContainer); for (let m = 0; m < 4; m++) { - const move: PokemonMove | null = this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; + const move: PokemonMove | null = + this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; const moveRowContainer = globalScene.add.container(0, 16 * m); this.moveRowsContainer.add(moveRowContainer); @@ -1060,12 +1159,12 @@ export default class SummaryUiHandler extends UiHandler { moveRowContainer.add(ppText); } - this.moveDescriptionText = addTextObject(2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 }}); + this.moveDescriptionText = addTextObject(2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 } }); this.movesContainer.add(this.moveDescriptionText); const moveDescriptionTextMaskRect = globalScene.make.graphics({}); moveDescriptionTextMaskRect.setScale(6); - moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); + moveDescriptionTextMaskRect.fillStyle(0xffffff); moveDescriptionTextMaskRect.beginPath(); moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); @@ -1073,6 +1172,7 @@ export default class SummaryUiHandler extends UiHandler { this.moveDescriptionText.setMask(moveDescriptionTextMask); break; + } } } @@ -1085,7 +1185,7 @@ export default class SummaryUiHandler extends UiHandler { targets: this.statusContainer, x: 0, duration: instant ? 0 : 250, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); } @@ -1098,7 +1198,7 @@ export default class SummaryUiHandler extends UiHandler { targets: this.statusContainer, x: -106, duration: instant ? 0 : 250, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); } @@ -1109,7 +1209,8 @@ export default class SummaryUiHandler extends UiHandler { if (this.moveCursor < 4 && this.pokemon && this.moveCursor < this.pokemon.moveset.length) { return this.pokemon.moveset[this.moveCursor]!.getMove(); // TODO: is this bang correct? - } else if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { + } + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { return this.newMove; } return null; @@ -1125,7 +1226,7 @@ export default class SummaryUiHandler extends UiHandler { hideMoveSelect() { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction && this.moveSelectFunction(4); + this.moveSelectFunction?.(4); return; } @@ -1161,7 +1262,7 @@ export default class SummaryUiHandler extends UiHandler { targets: this.moveEffectContainer, x: 6, duration: instant ? 0 : 250, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); } @@ -1174,7 +1275,7 @@ export default class SummaryUiHandler extends UiHandler { targets: this.moveEffectContainer, x: 106, duration: instant ? 0 : 250, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 1f2e4955081..d2f72ef4a4c 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -19,7 +19,7 @@ export default class TargetSelectUiHandler extends UiHandler { private cursor0: number; // associated with BattlerIndex.PLAYER private cursor1: number; // associated with BattlerIndex.PLAYER_2 - private isMultipleTargets: boolean = false; + private isMultipleTargets = false; private targets: BattlerIndex[]; private targetsHighlighted: Pokemon[]; private targetFlashTween: Phaser.Tweens.Tween | null; @@ -32,7 +32,7 @@ export default class TargetSelectUiHandler extends UiHandler { this.cursor = -1; } - setup(): void { } + setup(): void {} show(args: any[]): boolean { if (args.length < 3) { @@ -71,7 +71,7 @@ export default class TargetSelectUiHandler extends UiHandler { */ resetCursor(cursorN: number, user: Pokemon): void { if (!Utils.isNullOrUndefined(cursorN)) { - if ([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ].includes(cursorN) || user.battleSummonData.waveTurnCount === 1) { + if ([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2].includes(cursorN) || user.battleSummonData.waveTurnCount === 1) { // Reset cursor on the first turn of a fight or if an ally was targeted last turn cursorN = -1; } @@ -85,7 +85,7 @@ export default class TargetSelectUiHandler extends UiHandler { let success = false; if (button === Button.ACTION || button === Button.CANCEL) { - const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [ this.cursor ]; + const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [this.cursor]; this.targetSelectCallback(button === Button.ACTION ? targetIndexes : []); success = true; if (this.fieldIndex === BattlerIndex.PLAYER) { @@ -135,14 +135,14 @@ export default class TargetSelectUiHandler extends UiHandler { const singleTarget = globalScene.getField()[cursor]; const multipleTargets = this.targets.map(index => globalScene.getField()[index]); - this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [ singleTarget ]; + this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [singleTarget]; const ret = super.setCursor(cursor); if (this.targetFlashTween) { this.targetFlashTween.stop(); for (const pokemon of multipleTargets) { - pokemon.setAlpha(!!pokemon.getTag(SubstituteTag) ? 0.5 : 1); + pokemon.setAlpha(pokemon.getTag(SubstituteTag) ? 0.5 : 1); this.highlightItems(pokemon.id, 1); } } @@ -160,7 +160,7 @@ export default class TargetSelectUiHandler extends UiHandler { target.setAlpha(t.getValue()); this.highlightItems(target.id, t.getValue()); } - } + }, }); if (this.targetBattleInfoMoveTween.length >= 1) { @@ -173,14 +173,16 @@ export default class TargetSelectUiHandler extends UiHandler { const targetsBattleInfo = this.targetsHighlighted.map(target => target.getBattleInfo()); targetsBattleInfo.map(info => { - this.targetBattleInfoMoveTween.push(globalScene.tweens.add({ - targets: [ info ], - y: { start: info.getBaseY(), to: info.getBaseY() + 1 }, - loop: -1, - duration: Utils.fixedInt(250), - ease: "Linear", - yoyo: true - })); + this.targetBattleInfoMoveTween.push( + globalScene.tweens.add({ + targets: [info], + y: { start: info.getBaseY(), to: info.getBaseY() + 1 }, + loop: -1, + duration: Utils.fixedInt(250), + ease: "Linear", + yoyo: true, + }), + ); }); return ret; } @@ -192,7 +194,7 @@ export default class TargetSelectUiHandler extends UiHandler { } for (const pokemon of this.targetsHighlighted) { - pokemon.setAlpha(!!pokemon.getTag(SubstituteTag) ? 0.5 : 1); + pokemon.setAlpha(pokemon.getTag(SubstituteTag) ? 0.5 : 1); this.highlightItems(pokemon.id, 1); } @@ -205,7 +207,7 @@ export default class TargetSelectUiHandler extends UiHandler { } } - private highlightItems(targetId: number, val: number) : void { + private highlightItems(targetId: number, val: number): void { const targetItems = this.enemyModifiers.getAll("name", targetId.toString()); for (const item of targetItems as Phaser.GameObjects.Container[]) { item.setAlpha(val); diff --git a/src/ui/test-dialogue-ui-handler.ts b/src/ui/test-dialogue-ui-handler.ts index c7693ec954d..9fbfc01a317 100644 --- a/src/ui/test-dialogue-ui-handler.ts +++ b/src/ui/test-dialogue-ui-handler.ts @@ -8,7 +8,6 @@ import { isNullOrUndefined } from "#app/utils"; import { Mode } from "./ui"; export default class TestDialogueUiHandler extends FormModalUiHandler { - keys: string[]; constructor(mode) { @@ -19,41 +18,50 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { super.setup(); const flattenKeys = (object?: any, topKey?: string, midleKey?: string[]): Array => { - return Object.keys(object ?? {}).map((t, i) => { - const value = Object.values(object)[i]; + return Object.keys(object ?? {}) + .map((t, i) => { + const value = Object.values(object)[i]; - if (typeof value === "object" && !isNullOrUndefined(value)) { // we check for not null or undefined here because if the language json file has a null key, the typeof will still be an object, but that object will be null, causing issues - // If the value is an object, execute the same process - // si el valor es un objeto ejecuta el mismo proceso + if (typeof value === "object" && !isNullOrUndefined(value)) { + // we check for not null or undefined here because if the language json file has a null key, the typeof will still be an object, but that object will be null, causing issues + // 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((t) => t.length > 0); - } else if (typeof value === "string" || isNullOrUndefined(value)) { // 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 flattenKeys(value, topKey ?? t, topKey ? (midleKey ? [...midleKey, t] : [t]) : undefined).filter( + t => t.length > 0, + ); + } + if (typeof value === "string" || isNullOrUndefined(value)) { + // 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}`; - } - }).filter((t) => t); + // Return in the format expected by i18next + return midleKey ? `${topKey}:${midleKey.map(m => m).join(".")}.${t}` : `${topKey}:${t}`; + } + }) + .filter(t => t); }; - const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter((t) => t.length > 0); // Array of arrays - const keys = keysInArrays.flat(Infinity).map(String); // One array of string + const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter( + t => t.length > 0, + ); // Array of arrays + const keys = keysInArrays.flat(Number.POSITIVE_INFINITY).map(String); // One array of string this.keys = keys; } - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return "Test Dialogue"; } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 300; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ "Check", "Cancel" ]; + getButtonLabels(_config?: ModalConfig): string[] { + return ["Check", "Cancel"]; } getReadableErrorMessage(error: string): string { @@ -78,7 +86,10 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { input.setMaxLength(255); input.on("keydown", (inputObject, evt: KeyboardEvent) => { - if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { + if ( + ["escape", "space"].some(v => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && + ui.getMode() === Mode.AUTO_COMPLETE + ) { // Delete autocomplete list and recovery focus. inputObject.on("blur", () => inputObject.node.focus(), { once: true }); ui.revertMode(); @@ -93,10 +104,12 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { let options: OptionSelectItem[] = []; const splitArr = inputObject.text.split(" "); - const filteredKeys = this.keys.filter((command) => command.toLowerCase().includes(splitArr[splitArr.length - 1].toLowerCase())); + const filteredKeys = this.keys.filter(command => + command.toLowerCase().includes(splitArr[splitArr.length - 1].toLowerCase()), + ); if (inputObject.text !== "" && filteredKeys.length > 0) { // if performance is required, you could reduce the number of total results by changing the slice below to not have all ~8000 inputs going - options = filteredKeys.slice(0).map((value) => { + options = filteredKeys.slice(0).map(value => { return { label: value, handler: () => { @@ -109,7 +122,7 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { } ui.revertMode(); return true; - } + }, }; }); } @@ -118,14 +131,12 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { const modalOpts = { options: options, maxOptions: 5, - modalContainer: this.modalContainer + modalContainer: this.modalContainer, }; ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts); } - }); - if (super.show(args)) { const config = args[0] as ModalConfig; this.inputs[0].resize(1150, 116); @@ -135,7 +146,7 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { } else { this.inputs[0].text = args[1]; } - this.submitAction = (_) => { + this.submitAction = _ => { if (ui.getMode() === Mode.TEST_DIALOGUE) { this.sanitizeInputs(); const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); diff --git a/src/ui/text.ts b/src/ui/text.ts index 19b0eddb494..d3afdef666f 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -42,19 +42,29 @@ export enum TextStyle { 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 + 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 + scale: number; + styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig; + shadowColor: string; + shadowXpos: number; + shadowYpos: number; } -export function addTextObject(x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); +export function addTextObject( + x: number, + y: number, + content: string, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): Phaser.GameObjects.Text { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); const ret = globalScene.add.text(x, y, content, styleOptions); ret.setScale(scale); @@ -70,8 +80,16 @@ export function addTextObject(x: number, y: number, content: string, style: Text return ret; } -export function setTextStyle(obj: Phaser.GameObjects.Text, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); +export function setTextStyle( + obj: Phaser.GameObjects.Text, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +) { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); obj.setScale(scale); obj.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { @@ -83,8 +101,18 @@ export function setTextStyle(obj: Phaser.GameObjects.Text, style: TextStyle, ext } } -export function addBBCodeTextObject(x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): BBCodeText { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); +export function addBBCodeTextObject( + x: number, + y: number, + content: string, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): BBCodeText { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); const ret = new BBCodeText(globalScene, x, y, content, styleOptions as BBCodeText.TextStyle); globalScene.add.existing(ret); @@ -101,7 +129,14 @@ export function addBBCodeTextObject(x: number, y: number, content: string, style return ret; } -export function addTextInputObject(x: number, y: number, width: number, height: number, style: TextStyle, extraStyleOptions?: InputText.IConfig): InputText { +export function addTextInputObject( + x: number, + y: number, + width: number, + height: number, + style: TextStyle, + extraStyleOptions?: InputText.IConfig, +): InputText { const { scale, styleOptions } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); const ret = new InputText(globalScene, x, y, width, height, styleOptions as InputText.IConfig); @@ -111,7 +146,11 @@ export function addTextInputObject(x: number, y: number, width: number, height: return ret; } -export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): TextStyleOptions { +export function getTextStyleOptions( + style: TextStyle, + uiTheme: UiTheme, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): TextStyleOptions { const lang = i18next.resolvedLanguage; let shadowXpos = 4; let shadowYpos = 5; @@ -123,13 +162,13 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { - bottom: 6 - } + bottom: 6, + }, }; if (i18next.resolvedLanguage === "ja") { scale = 0.1388888889; - styleOptions.padding = { top:2, bottom:4 }; + styleOptions.padding = { top: 2, bottom: 4 }; } switch (style) { @@ -148,7 +187,7 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty shadowXpos = 3; shadowYpos = 3; break; - case TextStyle.STATS_LABEL: + case TextStyle.STATS_LABEL: { let fontSizeLabel = "96px"; switch (lang) { case "de": @@ -160,9 +199,10 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSizeLabel = "96px"; break; } - styleOptions.fontSize = fontSizeLabel; + styleOptions.fontSize = fontSizeLabel; break; - case TextStyle.STATS_VALUE: + } + case TextStyle.STATS_VALUE: { shadowXpos = 3; shadowYpos = 3; let fontSizeValue = "96px"; @@ -174,8 +214,9 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSizeValue = "96px"; break; } - styleOptions.fontSize = fontSizeValue; + styleOptions.fontSize = fontSizeValue; break; + } case TextStyle.MESSAGE: case TextStyle.SETTINGS_LABEL: case TextStyle.SETTINGS_LOCKED: @@ -220,7 +261,9 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty if (extraStyleOptions) { if (extraStyleOptions.fontSize) { - const sizeRatio = parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / parseInt(styleOptions.fontSize?.toString().slice(0, -2) ?? "1"); + const sizeRatio = + Number.parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / + Number.parseInt(styleOptions.fontSize?.toString().slice(0, -2) ?? "1"); shadowXpos *= sizeRatio; } styleOptions = Object.assign(styleOptions, extraStyleOptions); @@ -249,10 +292,15 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui * @param forWindow set to `true` if the text is to be displayed in a window ({@linkcode BattleScene.addWindow}) * it will replace all instances of the default MONEY TextStyle by {@linkcode TextStyle.MONEY_WINDOW} */ -export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTheme: UiTheme, forWindow?: boolean): string { +export function getTextWithColors( + content: string, + primaryStyle: TextStyle, + uiTheme: UiTheme, + forWindow?: boolean, +): string { // Apply primary styling before anything else let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; - const primaryStyleString = [ ...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))! ][0]; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; /* For money text displayed in game windows, we can't use the default {@linkcode TextStyle.MONEY} * or it will look wrong in legacy mode because of the different window background color @@ -262,14 +310,20 @@ export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTh } // Set custom colors - text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { - return "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + "[/color][/shadow]" + primaryStyleString; + text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (_substring, textStyle: string, textToColor: string) => { + return ( + "[/color][/shadow]" + + getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + + "[/color][/shadow]" + + primaryStyleString + ); }); // Remove extra style block at the end return text.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); } +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This is a giant switch which is the best option. export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { const isLegacyTheme = uiTheme === UiTheme.LEGACY; switch (textStyle) { diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts index 2a33b475385..bda1f750cb1 100644 --- a/src/ui/time-of-day-widget.ts +++ b/src/ui/time-of-day-widget.ts @@ -6,7 +6,6 @@ import { TimeOfDay } from "#enums/time-of-day"; /** A small self contained UI element that displays the time of day as an icon */ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { - /** The {@linkcode Phaser.GameObjects.Sprite} that represents the foreground of the current time of day */ private readonly timeOfDayIconFgs: Phaser.GameObjects.Sprite[] = new Array(2); /** The {@linkcode Phaser.GameObjects.Sprite} that represents the middle-ground of the current time of day */ @@ -19,9 +18,10 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { /** A map containing all timeOfDayIcon arrays with a matching string key for easier iteration */ private timeOfDayIconPairs: Map = new Map([ - [ "bg", this.timeOfDayIconBgs ], - [ "mg", this.timeOfDayIconMgs ], - [ "fg", this.timeOfDayIconFgs ],]); + ["bg", this.timeOfDayIconBgs], + ["mg", this.timeOfDayIconMgs], + ["fg", this.timeOfDayIconFgs], + ]); /** The current time of day */ private currentTime: TimeOfDay = TimeOfDay.ALL; @@ -38,16 +38,15 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { } /** On set, resumes any paused tweens if true */ public set parentVisible(visible: boolean) { - if (visible && !this._parentVisible) { // Only resume the tweens if parent is newly visible - this.timeOfDayIcons?.forEach( - icon => globalScene.tweens.getTweensOf(icon).forEach( - tween => tween.resume())); + if (visible && !this._parentVisible) { + // Only resume the tweens if parent is newly visible + this.timeOfDayIcons?.forEach(icon => globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume())); } this._parentVisible = visible; } - constructor(x: number = 0, y: number = 0) { + constructor(x = 0, y = 0) { super(globalScene, x, y); this.setVisible(globalScene.showTimeOfDayWidget); @@ -56,14 +55,13 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { } // Initialize all sprites - this.timeOfDayIconPairs.forEach( - (icons, key) => { - for (let i = 0; i < icons.length; i++) { - icons[i] = globalScene.add.sprite(0, 0, "dawn_icon_" + key).setOrigin(); - } - }); + this.timeOfDayIconPairs.forEach((icons, key) => { + for (let i = 0; i < icons.length; i++) { + icons[i] = globalScene.add.sprite(0, 0, "dawn_icon_" + key).setOrigin(); + } + }); // Store a flat array of all icons for later - this.timeOfDayIcons = [ this.timeOfDayIconBgs, this.timeOfDayIconMgs, this.timeOfDayIconFgs ].flat(); + this.timeOfDayIcons = [this.timeOfDayIconBgs, this.timeOfDayIconMgs, this.timeOfDayIconFgs].flat(); this.add(this.timeOfDayIcons); globalScene.eventTarget.addEventListener(BattleSceneEventType.ENCOUNTER_PHASE, this.onEncounterPhaseEvent); @@ -75,21 +73,21 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { */ private getBackTween(): Phaser.Types.Tweens.TweenBuilderConfig[] { const rotate = { - targets: [ this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1] ], + targets: [this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1]], angle: "+=90", duration: Utils.fixedInt(1500), ease: "Back.easeOut", paused: !this.parentVisible, }; const fade = { - targets: [ this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1] ], + targets: [this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1]], alpha: 0, duration: Utils.fixedInt(500), ease: "Linear", paused: !this.parentVisible, }; - return [ rotate, fade ]; + return [rotate, fade]; } /** @@ -98,21 +96,21 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { */ private getBounceTween(): Phaser.Types.Tweens.TweenBuilderConfig[] { const bounce = { - targets: [ this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1] ], + targets: [this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1]], angle: "+=90", duration: Utils.fixedInt(2000), ease: "Bounce.easeOut", paused: !this.parentVisible, }; const fade = { - targets: [ this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1] ], + targets: [this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1]], alpha: 0, duration: Utils.fixedInt(800), ease: "Linear", paused: !this.parentVisible, }; - return [ bounce, fade ]; + return [bounce, fade]; } /** Resets all icons to the proper depth, texture, and alpha so they are ready to tween */ @@ -121,11 +119,10 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { this.moveBelow(this.timeOfDayIconMgs[0], this.timeOfDayIconBgs[1]); this.moveBelow(this.timeOfDayIconFgs[0], this.timeOfDayIconFgs[1]); - this.timeOfDayIconPairs.forEach( - (icons, key) => { - icons[0].setTexture(TimeOfDay[this.currentTime].toLowerCase() + "_icon_" + key); - icons[1].setTexture(TimeOfDay[this.previousTime].toLowerCase() + "_icon_" + key); - }); + this.timeOfDayIconPairs.forEach((icons, key) => { + icons[0].setTexture(TimeOfDay[this.currentTime].toLowerCase() + "_icon_" + key); + icons[1].setTexture(TimeOfDay[this.previousTime].toLowerCase() + "_icon_" + key); + }); this.timeOfDayIconMgs[0].setRotation(-90 * (3.14 / 180)); this.timeOfDayIcons.forEach(icon => icon.setAlpha(1)); @@ -138,23 +135,23 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { this.resetIcons(); // Tween based on the player setting - (globalScene.timeOfDayAnimation === EaseType.BACK ? this.getBackTween() : this.getBounceTween()) - .forEach(tween => globalScene.tweens.add(tween)); + (globalScene.timeOfDayAnimation === EaseType.BACK ? this.getBackTween() : this.getBounceTween()).forEach(tween => + globalScene.tweens.add(tween), + ); // Swaps all elements of the icon arrays by shifting the first element onto the end of the array // This ensures index[0] is always the new time of day icon and index[1] is always the current one - this.timeOfDayIconPairs.forEach( - icons => { - const shifted = icons.shift(); - shifted && icons.push(shifted); - }); + this.timeOfDayIconPairs.forEach(icons => { + const shifted = icons.shift(); + shifted && icons.push(shifted); + }); } /** * Grabs the current time of day from the arena and calls {@linkcode tweenTimeOfDayIcon} - * @param event {@linkcode Event} being sent + * @param _event {@linkcode Event} being sent */ - private onEncounterPhase(event: Event) { + private onEncounterPhase(_event: Event) { const newTime = globalScene.arena.getTimeOfDay(); if (this.currentTime === newTime) { diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 0d69eae0efc..2f797bb4bfb 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -36,7 +36,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { 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.game.canvas.width / 6 / 2, 8, "logo"); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); @@ -48,15 +48,18 @@ export default 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, 0, + globalScene.game.canvas.width / 6 - 2, + 0, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, - { fontSize: "54px" } + { fontSize: "54px" }, ); this.playerCountLabel.setOrigin(1, 0); this.titleContainer.add(this.playerCountLabel); - this.splashMessageText = addTextObject(logo.x + 64, logo.y + logo.displayHeight - 8, "", TextStyle.MONEY, { fontSize: "54px" }); + this.splashMessageText = addTextObject(logo.x + 64, logo.y + logo.displayHeight - 8, "", TextStyle.MONEY, { + fontSize: "54px", + }); this.splashMessageText.setOrigin(0.5, 0.5); this.splashMessageText.setAngle(-20); this.titleContainer.add(this.splashMessageText); @@ -71,14 +74,17 @@ export default class TitleUiHandler extends OptionSelectUiHandler { yoyo: true, }); - this.appVersionText = addTextObject(logo.x - 60, logo.y + logo.displayHeight + 4, "", TextStyle.MONEY, { fontSize: "54px" }); + this.appVersionText = addTextObject(logo.x - 60, logo.y + logo.displayHeight + 4, "", TextStyle.MONEY, { + fontSize: "54px", + }); this.appVersionText.setOrigin(0.5, 0.5); this.appVersionText.setAngle(0); this.titleContainer.add(this.appVersionText); } updateTitleStats(): void { - pokerogueApi.getGameTitleStats() + pokerogueApi + .getGameTitleStats() .then(stats => { if (stats) { this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); @@ -97,10 +103,14 @@ export default 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.game.canvas.height / 6 - 13 - this.getWindowHeight()); this.splashMessage = Utils.randItem(getSplashMessages()); - this.splashMessageText.setText(i18next.t(this.splashMessage, { count: TitleUiHandler.BATTLES_WON_FALLBACK })); + this.splashMessageText.setText( + i18next.t(this.splashMessage, { + count: TitleUiHandler.BATTLES_WON_FALLBACK, + }), + ); this.appVersionText.setText("v" + version); @@ -118,10 +128,10 @@ export default class TitleUiHandler extends OptionSelectUiHandler { }, 60000); globalScene.tweens.add({ - targets: [ this.titleContainer, ui.getMessageHandler().bg ], + targets: [this.titleContainer, ui.getMessageHandler().bg], duration: Utils.fixedInt(325), - alpha: (target: any) => target === this.titleContainer ? 1 : 0, - ease: "Sine.easeInOut" + alpha: (target: any) => (target === this.titleContainer ? 1 : 0), + ease: "Sine.easeInOut", }); } @@ -139,10 +149,10 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleStatsTimer = null; globalScene.tweens.add({ - targets: [ this.titleContainer, ui.getMessageHandler().bg ], + targets: [this.titleContainer, ui.getMessageHandler().bg], duration: Utils.fixedInt(325), - alpha: (target: any) => target === this.titleContainer ? 0 : 1, - ease: "Sine.easeInOut" + alpha: (target: any) => (target === this.titleContainer ? 0 : 1), + ease: "Sine.easeInOut", }); } } diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index f001ab5bd6f..433f85d0f92 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -9,8 +9,8 @@ import type { Button } from "#enums/buttons"; */ export default abstract class UiHandler { protected mode: number | null; - protected cursor: number = 0; - public active: boolean = false; + protected cursor = 0; + public active = false; /** * @param mode The mode of the UI element. These should be unique. @@ -33,7 +33,7 @@ export default abstract class UiHandler { return globalScene.ui; } - getTextColor(style: TextStyle, shadow: boolean = false): string { + getTextColor(style: TextStyle, shadow = false): string { return getTextColor(style, shadow, globalScene.uiTheme); } diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index 36e2e844a56..c3931aea23b 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -5,7 +5,7 @@ import { globalScene } from "#app/global-scene"; export enum WindowVariant { NORMAL, THIN, - XTHIN + XTHIN, } export function getWindowVariantSuffix(windowVariant: WindowVariant): string { @@ -21,29 +21,50 @@ export function getWindowVariantSuffix(windowVariant: WindowVariant): string { const windowTypeControlColors = { [UiTheme.DEFAULT]: { - 0: [ "#6b5a73", "#DD5748", "#7E4955" ], - 1: [ "#6b5a73", "#48DDAA", "#4D7574" ], - 2: [ "#6b5a73", "#C5C5C5", "#766D7E" ], - 3: [ "#6b5a73", "#EBC07C", "#836C66" ], - 4: [ "#686868", "#E8E8E8", "#919191" ] + 0: ["#6b5a73", "#DD5748", "#7E4955"], + 1: ["#6b5a73", "#48DDAA", "#4D7574"], + 2: ["#6b5a73", "#C5C5C5", "#766D7E"], + 3: ["#6b5a73", "#EBC07C", "#836C66"], + 4: ["#686868", "#E8E8E8", "#919191"], }, [UiTheme.LEGACY]: { - 0: [ "#706880", "#8888c8", "#484868" ], - 1: [ "#d04028", "#e0a028", "#902008" ], - 2: [ "#48b840", "#88d880", "#089040" ], - 3: [ "#2068d0", "#80b0e0", "#104888" ], - 4: [ "#706880", "#8888c8", "#484868" ] - } + 0: ["#706880", "#8888c8", "#484868"], + 1: ["#d04028", "#e0a028", "#902008"], + 2: ["#48b840", "#88d880", "#089040"], + 3: ["#2068d0", "#80b0e0", "#104888"], + 4: ["#706880", "#8888c8", "#484868"], + }, }; -export function addWindow(x: number, y: number, width: number, height: number, mergeMaskTop?: boolean, mergeMaskLeft?: boolean, maskOffsetX?: number, maskOffsetY?: number, windowVariant?: WindowVariant): Phaser.GameObjects.NineSlice { +export function addWindow( + x: number, + y: number, + width: number, + height: number, + mergeMaskTop?: boolean, + mergeMaskLeft?: boolean, + maskOffsetX?: number, + maskOffsetY?: number, + windowVariant?: WindowVariant, +): Phaser.GameObjects.NineSlice { if (windowVariant === undefined) { windowVariant = WindowVariant.NORMAL; } const borderSize = globalScene.uiTheme ? 6 : 8; - const window = globalScene.add.nineslice(x, y, `window_${globalScene.windowType}${getWindowVariantSuffix(windowVariant)}`, undefined, width, height, borderSize, borderSize, borderSize, borderSize); + const window = globalScene.add.nineslice( + x, + y, + `window_${globalScene.windowType}${getWindowVariantSuffix(windowVariant)}`, + undefined, + width, + height, + borderSize, + borderSize, + borderSize, + borderSize, + ); window.setOrigin(0, 0); if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { @@ -55,11 +76,11 @@ export function addWindow(x: number, y: number, width: number, height: number, m */ const maskRect = new Phaser.GameObjects.Rectangle( globalScene, - 6 * (x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), + 6 * (x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), 6 * (y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0)), width - (mergeMaskLeft ? 2 : 0), height - (mergeMaskTop ? 2 : 0), - 0xffffff + 0xffffff, ); maskRect.setOrigin(0); maskRect.setScale(6); @@ -85,7 +106,14 @@ export function updateWindowType(windowTypeIndex: number): void { } } else if (object instanceof Phaser.GameObjects.NineSlice) { if (object.texture.key.startsWith("window_")) { - windowObjects.push([ object, object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.XTHIN)) ? WindowVariant.XTHIN : object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.THIN)) ? WindowVariant.THIN : WindowVariant.NORMAL ]); + windowObjects.push([ + object, + object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.XTHIN)) + ? WindowVariant.XTHIN + : object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.THIN)) + ? WindowVariant.THIN + : WindowVariant.NORMAL, + ]); } else if (object.texture?.key === "namebox") { themedObjects.push(object); } @@ -101,11 +129,13 @@ export function updateWindowType(windowTypeIndex: number): void { globalScene.windowType = windowTypeIndex; const rootStyle = document.documentElement.style; - [ "base", "light", "dark" ].map((k, i) => rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[globalScene.uiTheme][windowTypeIndex - 1][i])); + ["base", "light", "dark"].map((k, i) => + rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[globalScene.uiTheme][windowTypeIndex - 1][i]), + ); const windowKey = `window_${windowTypeIndex}`; - for (const [ window, variant ] of windowObjects) { + for (const [window, variant] of windowObjects) { window.setTexture(`${windowKey}${getWindowVariantSuffix(variant)}`); } @@ -116,54 +146,91 @@ export function updateWindowType(windowTypeIndex: number): void { export function addUiThemeOverrides(): void { const originalAddImage = globalScene.add.image; - globalScene.add.image = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Image { + globalScene.add.image = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + ): Phaser.GameObjects.Image { let legacy = false; if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.Image = originalAddImage.apply(this, [ x, y, texture, frame ]); + const ret: Phaser.GameObjects.Image = originalAddImage.apply(this, [x, y, texture, frame]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame ]); + return originalSetTexture.apply(this, [key, frame]); }; } return ret; }; const originalAddSprite = globalScene.add.sprite; - globalScene.add.sprite = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Sprite { + globalScene.add.sprite = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + ): Phaser.GameObjects.Sprite { let legacy = false; if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.Sprite = originalAddSprite.apply(this, [ x, y, texture, frame ]); + const ret: Phaser.GameObjects.Sprite = originalAddSprite.apply(this, [x, y, texture, frame]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame ]); + return originalSetTexture.apply(this, [key, frame]); }; } return ret; }; const originalAddNineslice = globalScene.add.nineslice; - globalScene.add.nineslice = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number): Phaser.GameObjects.NineSlice { + globalScene.add.nineslice = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + width?: number, + height?: number, + leftWidth?: number, + rightWidth?: number, + topHeight?: number, + bottomHeight?: number, + ): Phaser.GameObjects.NineSlice { let legacy = false; if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.NineSlice = originalAddNineslice.apply(this, [ x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight ]); + const ret: Phaser.GameObjects.NineSlice = originalAddNineslice.apply(this, [ + x, + y, + texture, + frame, + width, + height, + leftWidth, + rightWidth, + topHeight, + bottomHeight, + ]); if (legacy) { const originalSetTexture = ret.setTexture; - ret.setTexture = function (key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean) { + ret.setTexture = function ( + key: string | Phaser.Textures.Texture, + frame?: string | number, + updateSize?: boolean, + updateOrigin?: boolean, + ) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame, updateSize, updateOrigin ]); + return originalSetTexture.apply(this, [key, frame, updateSize, updateOrigin]); }; } return ret; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 7fbd10b4668..7c202e9210d 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -103,7 +103,7 @@ export enum Mode { TEST_DIALOGUE, AUTO_COMPLETE, ADMIN, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, } const transitionModes = [ @@ -147,7 +147,7 @@ const noTransitionModes = [ Mode.AUTO_COMPLETE, Mode.ADMIN, Mode.MYSTERY_ENCOUNTER, - Mode.RUN_INFO + Mode.RUN_INFO, ]; export default class UI extends Phaser.GameObjects.Container { @@ -226,19 +226,25 @@ export default 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.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); this.overlay.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); globalScene.uiContainer.add(this.overlay); this.overlay.setVisible(false); this.setupTooltip(); - this.achvBar = new AchvBar; + this.achvBar = new AchvBar(); this.achvBar.setup(); globalScene.uiContainer.add(this.achvBar); - this.savingIcon = new SavingIconHandler; + this.savingIcon = new SavingIconHandler(); this.savingIcon.setup(); globalScene.uiContainer.add(this.savingIcon); @@ -281,7 +287,7 @@ export default class UI extends Phaser.GameObjects.Container { return false; } - if ([ Mode.CONFIRM, Mode.COMMAND, Mode.FIGHT, Mode.MESSAGE, Mode.TARGET_SELECT ].includes(this.mode)) { + if ([Mode.CONFIRM, Mode.COMMAND, Mode.FIGHT, Mode.MESSAGE, Mode.TARGET_SELECT].includes(this.mode)) { globalScene?.processInfoButton(pressed); return true; } @@ -308,15 +314,23 @@ export default class UI extends Phaser.GameObjects.Container { return handler.processInput(button); } - showTextPromise(text: string, callbackDelay: number = 0, prompt: boolean = true, promptDelay?: number | null): Promise { + showTextPromise(text: string, callbackDelay = 0, prompt = true, promptDelay?: number | null): Promise { return new Promise(resolve => { this.showText(text ?? "", null, () => resolve(), callbackDelay, prompt, promptDelay); }); } - showText(text: string, delay?: number | null, callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null): void { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ): void { if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); + // biome-ignore lint/complexity/useOptionalChain: optional chain would change this to be null instead of undefined. let showMessageAndCallback = () => callback && callback(); for (let p = messagePages.length - 1; p >= 0; p--) { const originalFunc = showMessageAndCallback; @@ -330,18 +344,24 @@ export default class UI extends Phaser.GameObjects.Container { } else { this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - } } - showDialogue(keyOrText: string, name: string | undefined, delay: number | null = 0, callback: Function, callbackDelay?: number, promptDelay?: number): void { + showDialogue( + keyOrText: string, + name: string | undefined, + delay: number | null = 0, + callback: Function, + callbackDelay?: number, + promptDelay?: number, + ): void { // Get localized dialogue (if available) let hasi18n = false; let text = keyOrText; const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); - if (i18next.exists(keyOrText) ) { + if (i18next.exists(keyOrText)) { const i18nKey = keyOrText; hasi18n = true; @@ -368,15 +388,31 @@ export default class UI extends Phaser.GameObjects.Container { } else { const handler = this.getHandler(); if (handler instanceof MessageUiHandler) { - (handler as MessageUiHandler).showDialogue(text, name, delay, showMessageAndCallback, callbackDelay, true, promptDelay); + (handler as MessageUiHandler).showDialogue( + text, + name, + delay, + showMessageAndCallback, + callbackDelay, + true, + promptDelay, + ); } else { - this.getMessageHandler().showDialogue(text, name, delay, showMessageAndCallback, callbackDelay, true, promptDelay); + this.getMessageHandler().showDialogue( + text, + name, + delay, + showMessageAndCallback, + callbackDelay, + true, + promptDelay, + ); } } } shouldSkipDialogue(i18nKey: string): boolean { - if (i18next.exists(i18nKey) ) { + if (i18next.exists(i18nKey)) { if (globalScene.skipSeenDialogues && globalScene.gameData.getSeenDialogues()[i18nKey] === true) { return true; } @@ -385,7 +421,11 @@ export default class UI extends Phaser.GameObjects.Container { } getTooltip(): { visible: boolean; title: string; content: string } { - return { visible: this.tooltipContainer.visible, title: this.tooltipTitle.text, content: this.tooltipContent.text }; + return { + visible: this.tooltipContainer.visible, + title: this.tooltipTitle.text, + content: this.tooltipContent.text, + }; } showTooltip(title: string, content: string, overlap?: boolean): void { @@ -403,7 +443,10 @@ export default class UI extends Phaser.GameObjects.Container { const wrappedContent = this.tooltipContent.runWordWrap(content); this.tooltipContent.setText(wrappedContent); this.tooltipContent.y = title ? 16 : 4; - this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 838); + this.tooltipBg.width = Math.min( + Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, + 838, + ); this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1); this.tooltipTitle.x = this.tooltipBg.width / 2; } @@ -485,7 +528,7 @@ export default class UI extends Phaser.GameObjects.Container { alpha: 1, duration: duration, ease: "Sine.easeOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -503,13 +546,19 @@ export default class UI extends Phaser.GameObjects.Container { onComplete: () => { this.overlay.setVisible(false); resolve(); - } + }, }); this.overlayActive = false; }); } - private setModeInternal(mode: Mode, clear: boolean, forceTransition: boolean, chainMode: boolean, args: any[]): Promise { + private setModeInternal( + mode: Mode, + clear: boolean, + forceTransition: boolean, + chainMode: boolean, + args: any[], + ): Promise { return new Promise(resolve => { if (this.mode === mode && !forceTransition) { resolve(); @@ -533,9 +582,13 @@ export default class UI extends Phaser.GameObjects.Container { } resolve(); }; - if (((!chainMode && ((transitionModes.indexOf(this.mode) > -1 || transitionModes.indexOf(mode) > -1) - && (noTransitionModes.indexOf(this.mode) === -1 && noTransitionModes.indexOf(mode) === -1))) - || (chainMode && noTransitionModes.indexOf(mode) === -1))) { + if ( + (!chainMode && + (transitionModes.indexOf(this.mode) > -1 || transitionModes.indexOf(mode) > -1) && + noTransitionModes.indexOf(this.mode) === -1 && + noTransitionModes.indexOf(mode) === -1) || + (chainMode && noTransitionModes.indexOf(mode) === -1) + ) { this.fadeOut(250).then(() => { globalScene.time.delayedCall(100, () => { doSetMode(); @@ -575,7 +628,6 @@ export default class UI extends Phaser.GameObjects.Container { revertMode(): Promise { return new Promise(resolve => { - if (!this?.modeChain?.length) { return resolve(false); } @@ -629,9 +681,8 @@ export default class UI extends Phaser.GameObjects.Container { public getGamepadType(): string { if (globalScene.inputMethod === "gamepad") { return globalScene.inputController.getConfig(globalScene.inputController.selectedDevice[Device.GAMEPAD]).padType; - } else { - return globalScene.inputMethod; } + return globalScene.inputMethod; } /** diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 36f1a191b77..3007f7247f1 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -35,17 +35,23 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { super.setup(); - const label = addTextObject(this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:errorServerDown"), TextStyle.WINDOW, { fontSize: "48px", align: "center" }); + const label = addTextObject( + this.getWidth() / 2, + this.getHeight() / 2, + i18next.t("menu:errorServerDown"), + TextStyle.WINDOW, + { fontSize: "48px", align: "center" }, + ); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -53,7 +59,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { tryReconnect(): void { updateUserInfo().then(response => { - if (response[0] || [ 200, 400 ].includes(response[1])) { + if (response[0] || [200, 400].includes(response[1])) { this.reconnectTimer = null; this.reconnectDuration = this.minTime; globalScene.playSound("se/pb_bounce_1"); @@ -63,11 +69,11 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { globalScene.reset(true, true); } else { this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite - this.reconnectTimer = - setTimeout( - () => this.tryReconnect(), - // Adds a random factor to avoid pendulum effect during long total breakdown - this.reconnectDuration + (Math.random() * this.randVarianceTime)); + this.reconnectTimer = setTimeout( + () => this.tryReconnect(), + // Adds a random factor to avoid pendulum effect during long total breakdown + this.reconnectDuration + Math.random() * this.randVarianceTime, + ); } }); } @@ -75,14 +81,14 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { show(args: any[]): boolean { if (args.length >= 1 && args[0] instanceof Function) { const config: ModalConfig = { - buttonActions: [] + buttonActions: [], }; this.reconnectCallback = args[0]; this.reconnectDuration = this.minTime; this.reconnectTimer = setTimeout(() => this.tryReconnect(), this.reconnectDuration); - return super.show([ config ]); + return super.show([config]); } return false; diff --git a/src/utils.test.ts b/src/utils.test.ts index 3f5b835b03b..cc3f2bb1a04 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -4,7 +4,6 @@ import { randomString, padInt } from "./utils"; import Phaser from "phaser"; describe("utils", () => { - beforeAll(() => { new Phaser.Game({ type: Phaser.HEADLESS, diff --git a/src/utils.ts b/src/utils.ts index 56df3f3f48e..7d3dea0247e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -8,10 +8,14 @@ export type nil = null | undefined; export const MissingTextureKey = "__MISSING"; export function toReadableString(str: string): string { - return str.replace(/\_/g, " ").split(" ").map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`).join(" "); + return str + .replace(/\_/g, " ") + .split(" ") + .map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`) + .join(" "); } -export function randomString(length: number, seeded: boolean = false) { +export function randomString(length: number, seeded = false) { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; let result = ""; @@ -39,7 +43,7 @@ export function shiftCharCodes(str: string, shiftCount: number) { return newStr; } -export function randGauss(stdev: number, mean: number = 0): number { +export function randGauss(stdev: number, mean = 0): number { if (!stdev) { return 0; } @@ -49,7 +53,7 @@ export function randGauss(stdev: number, mean: number = 0): number { return z * stdev + mean; } -export function randSeedGauss(stdev: number, mean: number = 0): number { +export function randSeedGauss(stdev: number, mean = 0): number { if (!stdev) { return 0; } @@ -71,11 +75,11 @@ 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 -*/ -export function randInt(range: number, min: number = 0): number { + * Returns a random integer between min and min + range + * @param range The amount of possible numbers + * @param min The starting number + */ +export function randInt(range: number, min = 0): number { if (range === 1) { return min; } @@ -88,38 +92,32 @@ export function randInt(range: number, min: number = 0): number { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ -export function randSeedInt(range: number, min: number = 0): number { +export function randSeedInt(range: number, min = 0): number { if (range <= 1) { return min; } - return Phaser.Math.RND.integerInRange(min, (range - 1) + min); + return Phaser.Math.RND.integerInRange(min, range - 1 + min); } /** -* Returns a random integer between min and max (non-inclusive) -* @param min The lowest number -* @param max The highest number -*/ + * Returns a random integer between min and max (non-inclusive) + * @param min The lowest number + * @param max The highest number + */ export function randIntRange(min: number, max: number): number { return randInt(max - min, min); } export function randItem(items: T[]): T { - return items.length === 1 - ? items[0] - : items[randInt(items.length)]; + return items.length === 1 ? items[0] : items[randInt(items.length)]; } export function randSeedItem(items: T[]): T { - return items.length === 1 - ? items[0] - : Phaser.Math.RND.pick(items); + return items.length === 1 ? items[0] : Phaser.Math.RND.pick(items); } export function randSeedWeightedItem(items: T[]): T { - return items.length === 1 - ? items[0] - : Phaser.Math.RND.weightedPick(items); + return items.length === 1 ? items[0] : Phaser.Math.RND.weightedPick(items); } /** @@ -134,7 +132,7 @@ export function randSeedShuffle(items: T[]): T[] { const newArray = items.slice(0); for (let i = items.length - 1; i > 0; i--) { const j = Phaser.Math.RND.integerInRange(0, i); - [ newArray[i], newArray[j] ] = [ newArray[j], newArray[i] ]; + [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; } return newArray; } @@ -145,15 +143,15 @@ export function getFrameMs(frameCount: number): number { export function getCurrentTime(): number { const date = new Date(); - return (((date.getHours() * 60 + date.getMinutes()) / 1440) + 0.675) % 1; + return ((date.getHours() * 60 + date.getMinutes()) / 1440 + 0.675) % 1; } const secondsInHour = 3600; export function getPlayTimeString(totalSeconds: number): string { const days = `${Math.floor(totalSeconds / (secondsInHour * 24))}`; - const hours = `${Math.floor(totalSeconds % (secondsInHour * 24) / secondsInHour)}`; - const minutes = `${Math.floor(totalSeconds % secondsInHour / 60)}`; + const hours = `${Math.floor((totalSeconds % (secondsInHour * 24)) / secondsInHour)}`; + const minutes = `${Math.floor((totalSeconds % secondsInHour) / 60)}`; const seconds = `${Math.floor(totalSeconds % 60)}`; return `${days.padStart(2, "0")}:${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}:${seconds.padStart(2, "0")}`; @@ -167,12 +165,12 @@ export function getPlayTimeString(totalSeconds: number): string { */ export function getIvsFromId(id: number): number[] { return [ - (id & 0x3E000000) >>> 25, - (id & 0x01F00000) >>> 20, - (id & 0x000F8000) >>> 15, - (id & 0x00007C00) >>> 10, - (id & 0x000003E0) >>> 5, - (id & 0x0000001F) + (id & 0x3e000000) >>> 25, + (id & 0x01f00000) >>> 20, + (id & 0x000f8000) >>> 15, + (id & 0x00007c00) >>> 10, + (id & 0x000003e0) >>> 5, + id & 0x0000001f, ]; } @@ -210,9 +208,9 @@ export function formatLargeNumber(count: number, threshold: number): string { } // Abbreviations from 10^0 to 10^33 -const AbbreviationsLargeNumber: string[] = [ "", "K", "M", "B", "t", "q", "Q", "s", "S", "o", "n", "d" ]; +const AbbreviationsLargeNumber: string[] = ["", "K", "M", "B", "t", "q", "Q", "s", "S", "o", "n", "d"]; -export function formatFancyLargeNumber(number: number, rounded: number = 3): string { +export function formatFancyLargeNumber(number: number, rounded = 3): string { let exponent: number; if (number < 1000) { @@ -236,16 +234,20 @@ export function formatMoney(format: MoneyFormat, amount: number) { return amount.toLocaleString(); } -export function formatStat(stat: number, forHp: boolean = false): string { +export function formatStat(stat: number, forHp = false): string { return formatLargeNumber(stat, forHp ? 100000 : 1000000); } export function getEnumKeys(enumType: any): string[] { - return Object.values(enumType).filter(v => isNaN(parseInt(v!.toString()))).map(v => v!.toString()); + return Object.values(enumType) + .filter(v => Number.isNaN(Number.parseInt(v!.toString()))) + .map(v => v!.toString()); } export function getEnumValues(enumType: any): number[] { - return Object.values(enumType).filter(v => !isNaN(parseInt(v!.toString()))).map(v => parseInt(v!.toString())); + return Object.values(enumType) + .filter(v => !Number.isNaN(Number.parseInt(v!.toString()))) + .map(v => Number.parseInt(v!.toString())); } export function executeIf(condition: boolean, promiseFunc: () => Promise): Promise { @@ -254,15 +256,16 @@ export function executeIf(condition: boolean, promiseFunc: () => Promise): export const sessionIdKey = "pokerogue_sessionId"; // Check if the current hostname is 'localhost' or an IP address, and ensure a port is specified -export const isLocal = ( - (window.location.hostname === "localhost" || - /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(window.location.hostname)) && - window.location.port !== "") || window.location.hostname === ""; +export const isLocal = + ((window.location.hostname === "localhost" || /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(window.location.hostname)) && + window.location.port !== "") || + window.location.hostname === ""; /** * @deprecated Refer to [pokerogue-api.ts](./plugins/api/pokerogue-api.ts) instead */ -export const localServerUrl = import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port + 1}`; +export const localServerUrl = + import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port + 1}`; /** * Set the server URL based on whether it's local or not @@ -277,7 +280,7 @@ export const isBeta = import.meta.env.MODE === "beta"; // this checks to see if export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); - expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3/*7*/); + expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3 /*7*/); document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Expires=${expiration.toUTCString()}`; } @@ -324,7 +327,7 @@ export async function localPing() { } /** Alias for the constructor of a class */ -export type Constructor = new(...args: unknown[]) => T; +export type Constructor = new (...args: unknown[]) => T; export class BooleanHolder { public value: boolean; @@ -372,14 +375,18 @@ 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(""); + 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); - const h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); - return [ 60 * (h < 0 ? h + 6 : h), v && c / v, v ]; + const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); + return [60 * (h < 0 ? h + 6 : h), v && c / v, v]; } /** @@ -388,23 +395,23 @@ export function rgbToHsv(r: number, g: number, b: number) { * @param {Array} rgb2 Second RGB color in array */ export function deltaRgb(rgb1: number[], rgb2: number[]): number { - const [ r1, g1, b1 ] = rgb1; - const [ r2, g2, b2 ] = rgb2; + const [r1, g1, b1] = rgb1; + const [r2, g2, b2] = rgb2; const drp2 = Math.pow(r1 - r2, 2); const dgp2 = Math.pow(g1 - g2, 2); const dbp2 = Math.pow(b1 - b2, 2); const t = (r1 + r2) / 2; - return Math.ceil(Math.sqrt(2 * drp2 + 4 * dgp2 + 3 * dbp2 + t * (drp2 - dbp2) / 256)); + return Math.ceil(Math.sqrt(2 * drp2 + 4 * dgp2 + 3 * dbp2 + (t * (drp2 - dbp2)) / 256)); } export function rgbHexToRgba(hex: string) { - const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i) ?? [ "000000", "00", "00", "00" ]; + const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i) ?? ["000000", "00", "00", "00"]; return { - r: parseInt(color[1], 16), - g: parseInt(color[2], 16), - b: parseInt(color[3], 16), - a: 255 + r: Number.parseInt(color[1], 16), + g: Number.parseInt(color[2], 16), + b: Number.parseInt(color[3], 16), + a: 255, }; } @@ -427,7 +434,9 @@ export function hslToHex(h: number, s: number, l: number): string { const f = (n: number) => { const k = (n + h / 30) % 12; const rgb = l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)); - return Math.round(rgb * 255).toString(16).padStart(2, "0"); + return Math.round(rgb * 255) + .toString(16) + .padStart(2, "0"); }; return `#${f(0)}${f(8)}${f(4)}`; } @@ -438,7 +447,7 @@ export function hslToHex(h: number, s: number, l: number): string { * If the lang is not in the function, it usually means that lang is going to use the default english version * * English itself counts as not available -*/ + */ export function hasAllLocalizedSprites(lang?: string): boolean { // IMPORTANT - ONLY ADD YOUR LANG HERE IF YOU'VE ALREADY ADDED ALL THE NECESSARY IMAGES if (!lang) { @@ -466,12 +475,13 @@ export function hasAllLocalizedSprites(lang?: string): boolean { * @param container container with game objects inside it */ export function printContainerList(container: Phaser.GameObjects.Container): void { - console.log(container.list.map(go => { - return { type: go.type, name: go.name }; - })); + console.log( + container.list.map(go => { + return { type: go.type, name: go.name }; + }), + ); } - /** * Truncate a string to a specified maximum length and add an ellipsis if it exceeds that length. * @@ -479,7 +489,7 @@ export function printContainerList(container: Phaser.GameObjects.Container): voi * @param maxLength - The maximum length of the truncated string, defaults to 10. * @returns The truncated string with an ellipsis if it was longer than maxLength. */ -export function truncateString(str: String, maxLength: number = 10) { +export function truncateString(str: string, maxLength = 10) { // Check if the string length exceeds the maximum length if (str.length > maxLength) { // Truncate the string and add an ellipsis @@ -524,7 +534,7 @@ export function reverseValueToKeySetting(input) { * @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: boolean = true, returnWithSpaces: boolean = false) { +export function capitalizeString(str: string, sep: string, lowerFirstChar = true, returnWithSpaces = false) { if (str) { const splitedStr = str.toLowerCase().split(sep); @@ -558,7 +568,7 @@ export function capitalizeFirstLetter(str: string) { * @param minValue - The minimum integer value to return. Defaults to 1. * @returns The converted value as an integer. */ -export function toDmgValue(value: number, minValue: number = 1) { +export function toDmgValue(value: number, minValue = 1) { return Math.max(Math.floor(value), minValue); } diff --git a/test/abilities/ability_duplication.test.ts b/test/abilities/ability_duplication.test.ts index 73092b41ce6..08b74f682f2 100644 --- a/test/abilities/ability_duplication.test.ts +++ b/test/abilities/ability_duplication.test.ts @@ -23,7 +23,7 @@ describe("Ability Duplication", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .ability(Abilities.HUGE_POWER) .enemyAbility(Abilities.BALL_FETCH) @@ -33,9 +33,9 @@ describe("Ability Duplication", () => { it("huge power should only be applied once if both normal and passive", async () => { game.override.passiveAbility(Abilities.HUGE_POWER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const [ magikarp ] = game.scene.getPlayerField(); + const [magikarp] = game.scene.getPlayerField(); const magikarpAttack = magikarp.getEffectiveStat(Stat.ATK); magikarp.summonData.abilitySuppressed = true; @@ -46,9 +46,9 @@ describe("Ability Duplication", () => { it("huge power should stack with pure power", async () => { game.override.passiveAbility(Abilities.PURE_POWER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const [ magikarp ] = game.scene.getPlayerField(); + const [magikarp] = game.scene.getPlayerField(); const magikarpAttack = magikarp.getEffectiveStat(Stat.ATK); magikarp.summonData.abilitySuppressed = true; diff --git a/test/abilities/ability_timing.test.ts b/test/abilities/ability_timing.test.ts index 85332b9cd82..d59c4f7c38d 100644 --- a/test/abilities/ability_timing.test.ts +++ b/test/abilities/ability_timing.test.ts @@ -9,7 +9,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Ability Timing", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,12 +36,17 @@ describe("Ability Timing", () => { it("should trigger after switch check", async () => { game.settings.battleStyle = BattleStyle.SWITCH; - await game.classicMode.runToSummon([ Species.EEVEE, Species.FEEBAS ]); + await game.classicMode.runToSummon([Species.EEVEE, Species.FEEBAS]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase), + ); await game.phaseInterceptor.to("MessagePhase"); expect(i18next.t).toHaveBeenCalledWith("battle:statFell", expect.objectContaining({ count: 1 })); diff --git a/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts index 45f7bc55006..e488b467ce0 100644 --- a/test/abilities/analytic.test.ts +++ b/test/abilities/analytic.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Analytic", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.TACKLE ]) + .moveset([Moves.SPLASH, Moves.TACKLE]) .ability(Abilities.ANALYTIC) .battleType("single") .disableCrits() @@ -36,45 +36,45 @@ describe("Abilities - Analytic", () => { }); it("should increase damage if the user moves last", async () => { - await game.classicMode.startBattle([ Species.ARCEUS ]); + await game.classicMode.startBattle([Species.ARCEUS]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const damage1 = enemy.getInverseHp(); enemy.hp = enemy.getMaxHp(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true); }); it("should increase damage only if the user moves last in doubles", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.GENGAR, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.GENGAR, Species.SHUCKLE]); - const [ enemy, ] = game.scene.getEnemyField(); + const [enemy] = game.scene.getEnemyField(); game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.toNextTurn(); const damage1 = enemy.getInverseHp(); enemy.hp = enemy.getMaxHp(); game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true); enemy.hp = enemy.getMaxHp(); game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getInverseHp()).toBe(damage1); }); diff --git a/test/abilities/arena_trap.test.ts b/test/abilities/arena_trap.test.ts index dda6e60e886..e0d093a91aa 100644 --- a/test/abilities/arena_trap.test.ts +++ b/test/abilities/arena_trap.test.ts @@ -46,11 +46,7 @@ describe("Abilities - Arena Trap", () => { }); it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); await game.classicMode.startBattle(); @@ -67,12 +63,12 @@ describe("Abilities - Arena Trap", () => { game.override .battleType("double") .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.ROAR, Moves.SPLASH ]) + .moveset([Moves.ROAR, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.SUDOWOODO, Species.LUNATONE ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.SUDOWOODO, Species.LUNATONE]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); vi.spyOn(enemy1, "getAbility").mockReturnValue(allAbilities[Abilities.ARENA_TRAP]); diff --git a/test/abilities/aroma_veil.test.ts b/test/abilities/aroma_veil.test.ts index 111d682aabe..af8a0233a60 100644 --- a/test/abilities/aroma_veil.test.ts +++ b/test/abilities/aroma_veil.test.ts @@ -27,14 +27,14 @@ describe("Moves - Aroma Veil", () => { game.override .battleType("double") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH ]) + .enemyMoveset([Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) .ability(Abilities.AROMA_VEIL) - .moveset([ Moves.GROWL ]); + .moveset([Moves.GROWL]); }); it("Aroma Veil protects the Pokemon's side against most Move Restriction Battler Tags", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const party = game.scene.getPlayerParty()! as PlayerPokemon[]; @@ -48,7 +48,7 @@ describe("Moves - Aroma Veil", () => { }); it("Aroma Veil does not protect against Imprison", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const party = game.scene.getPlayerParty()! as PlayerPokemon[]; diff --git a/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts index 017bb2cea06..86b6c69ec8b 100644 --- a/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -10,7 +10,7 @@ describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; let game: GameManager; - const auraBreakMultiplier = 9 / 16 * 4 / 3; + const auraBreakMultiplier = ((9 / 16) * 4) / 3; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -25,7 +25,7 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE ]); + game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); @@ -38,7 +38,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.FAIRY_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.MOONBLAST); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -52,7 +52,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.DARK_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.DARK_PULSE); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -66,7 +66,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.BALL_FETCH); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.MOONBLAST); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/test/abilities/battery.test.ts b/test/abilities/battery.test.ts index 7ce37f472f0..cc7570c3d31 100644 --- a/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -29,7 +29,7 @@ describe("Abilities - Battery", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM ]); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.enemyMoveset(Moves.SPLASH); }); @@ -39,7 +39,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.PIKACHU, Species.CHARJABUG ]); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); @@ -54,7 +54,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.PIKACHU, Species.CHARJABUG ]); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); @@ -69,7 +69,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.CHARJABUG, Species.PIKACHU ]); + await game.startBattle([Species.CHARJABUG, Species.PIKACHU]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); diff --git a/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts index b2ba9ceedd9..6305d7dedc5 100644 --- a/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -8,7 +8,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - BATTLE BOND", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,11 +27,12 @@ describe("Abilities - BATTLE BOND", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .startingWave(4) // Leads to arena reset on Wave 5 trainer battle .ability(Abilities.BATTLE_BOND) - .starterForms({ [Species.GRENINJA]: ashForm, }) - .moveset([ Moves.SPLASH, Moves.WATER_SHURIKEN ]) + .starterForms({ [Species.GRENINJA]: ashForm }) + .moveset([Moves.SPLASH, Moves.WATER_SHURIKEN]) .enemySpecies(Species.BULBASAUR) .enemyMoveset(Moves.SPLASH) .startingLevel(100) // Avoid levelling up @@ -40,7 +40,7 @@ describe("Abilities - BATTLE BOND", () => { }); it("check if fainted pokemon switches to base form on arena reset", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.GRENINJA ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.GRENINJA]); const greninja = game.scene.getPlayerParty()[1]; expect(greninja.formIndex).toBe(ashForm); @@ -59,7 +59,7 @@ describe("Abilities - BATTLE BOND", () => { }); it("should not keep buffing Water Shuriken after Greninja switches to base form", async () => { - await game.classicMode.startBattle([ Species.GRENINJA ]); + await game.classicMode.startBattle([Species.GRENINJA]); const waterShuriken = allMoves[Moves.WATER_SHURIKEN]; vi.spyOn(waterShuriken, "calculateBattlePower"); diff --git a/test/abilities/beast_boost.test.ts b/test/abilities/beast_boost.test.ts index c9877709467..b307a9eeeba 100644 --- a/test/abilities/beast_boost.test.ts +++ b/test/abilities/beast_boost.test.ts @@ -29,16 +29,16 @@ describe("Abilities - Beast Boost", () => { .enemyAbility(Abilities.BEAST_BOOST) .ability(Abilities.BEAST_BOOST) .startingLevel(2000) - .moveset([ Moves.FLAMETHROWER ]) + .moveset([Moves.FLAMETHROWER]) .enemyMoveset(Moves.SPLASH); }); - it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => { - await game.classicMode.startBattle([ Species.SLOWBRO ]); + it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async () => { + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.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 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 1000, 200, 100, 100]); console.log(playerPokemon.stats); expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0); @@ -49,33 +49,33 @@ describe("Abilities - Beast Boost", () => { expect(playerPokemon.getStatStage(Stat.DEF)).toBe(1); }, 20000); - it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => { - game.override.enemyMoveset([ Moves.GUARD_SPLIT ]); + it("should use in-battle overriden stats when determining the stat stage to raise by 1", async () => { + game.override.enemyMoveset([Moves.GUARD_SPLIT]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.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 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 201, 200, 100, 100]); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); game.move.select(Moves.FLAMETHROWER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("VictoryPhase"); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); }, 20000); - it("should have order preference in case of stat ties", async() => { + it("should have order preference in case of stat ties", async () => { // Order preference follows the order of EFFECTIVE_STAT - await game.classicMode.startBattle([ Species.SLOWBRO ]); + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.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 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 1, 1, 100, 100, 100]); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); diff --git a/test/abilities/commander.test.ts b/test/abilities/commander.test.ts index 1b054bbd5ea..9d16d474dd4 100644 --- a/test/abilities/commander.test.ts +++ b/test/abilities/commander.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Commander", () => { game.override .startingLevel(100) .enemyLevel(100) - .moveset([ Moves.LIQUIDATION, Moves.MEMENTO, Moves.SPLASH, Moves.FLIP_TURN ]) + .moveset([Moves.LIQUIDATION, Moves.MEMENTO, Moves.SPLASH, Moves.FLIP_TURN]) .ability(Abilities.COMMANDER) .battleType("double") .disableCrits() @@ -44,15 +44,15 @@ describe("Abilities - Commander", () => { }); it("causes the source to jump into Dondozo's mouth, granting a stat boost and hiding the source", async () => { - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); - const affectedStats: EffectiveStat[] = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const affectedStats: EffectiveStat[] = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); - affectedStats.forEach((stat) => expect(dondozo.getStatStage(stat)).toBe(2)); + affectedStats.forEach(stat => expect(dondozo.getStatStage(stat)).toBe(2)); game.move.select(Moves.SPLASH, 1); @@ -70,7 +70,7 @@ describe("Abilities - Commander", () => { it("should activate when a Dondozo switches in and cancel the source's move", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO]); const tatsugiri = game.scene.getPlayerField()[0]; @@ -89,9 +89,9 @@ describe("Abilities - Commander", () => { }); it("source should reenter the field when Dondozo faints", async () => { - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); @@ -103,7 +103,7 @@ describe("Abilities - Commander", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("FaintPhase", false); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeUndefined(); @@ -114,13 +114,11 @@ describe("Abilities - Commander", () => { }); it("source should still take damage from Poison while hidden", async () => { - game.override - .statusEffect(StatusEffect.POISON) - .enemyMoveset(Moves.SPLASH); + game.override.statusEffect(StatusEffect.POISON).enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); @@ -136,9 +134,9 @@ describe("Abilities - Commander", () => { it("source should still take damage from Salt Cure while hidden", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); @@ -154,13 +152,11 @@ describe("Abilities - Commander", () => { }); it("source should still take damage from Sandstorm while hidden", async () => { - game.override - .weather(WeatherType.SANDSTORM) - .enemyMoveset(Moves.SPLASH); + game.override.weather(WeatherType.SANDSTORM).enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); @@ -174,11 +170,11 @@ describe("Abilities - Commander", () => { }); it("should make Dondozo immune to being forced out", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.WHIRLWIND ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); @@ -196,11 +192,9 @@ describe("Abilities - Commander", () => { }); it("should interrupt the source's semi-invulnerability", async () => { - game.override - .moveset([ Moves.SPLASH, Moves.DIVE ]) - .enemyMoveset(Moves.SPLASH); + game.override.moveset([Moves.SPLASH, Moves.DIVE]).enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO]); const tatsugiri = game.scene.getPlayerField()[0]; diff --git a/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts index e4baf9b9855..cad35be18f7 100644 --- a/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -24,16 +24,17 @@ describe("Abilities - Competitive", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.BEEDRILL) .enemyMoveset(Moves.TICKLE) .startingLevel(1) - .moveset([ Moves.SPLASH, Moves.CLOSE_COMBAT ]) + .moveset([Moves.SPLASH, Moves.CLOSE_COMBAT]) .ability(Abilities.COMPETITIVE); }); it("lower atk and def by 1 via tickle, then increase spatk by 4 via competitive", async () => { - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -46,7 +47,7 @@ describe("Abilities - Competitive", () => { it("lowering your own stats should not trigger competitive", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.CLOSE_COMBAT); @@ -59,7 +60,7 @@ describe("Abilities - Competitive", () => { it("white herb should remove only the negative effects", async () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); diff --git a/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts index eaf8d885a83..19041eb2801 100644 --- a/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -30,10 +30,8 @@ describe("Abilities - Contrary", () => { .enemyMoveset(Moves.SPLASH); }); - it("should invert stat changes when applied", async() => { - await game.classicMode.startBattle([ - Species.SLOWBRO - ]); + it("should invert stat changes when applied", async () => { + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -42,10 +40,8 @@ describe("Abilities - Contrary", () => { describe("With Clear Body", () => { it("should apply positive effects", async () => { - game.override - .enemyPassiveAbility(Abilities.CLEAR_BODY) - .moveset([ Moves.TAIL_WHIP ]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + game.override.enemyPassiveAbility(Abilities.CLEAR_BODY).moveset([Moves.TAIL_WHIP]); + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -60,9 +56,9 @@ describe("Abilities - Contrary", () => { it("should block negative effects", async () => { game.override .enemyPassiveAbility(Abilities.CLEAR_BODY) - .enemyMoveset([ Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL ]) - .moveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + .enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL]) + .moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/corrosion.test.ts b/test/abilities/corrosion.test.ts index 2829c3c3b41..b7f316fbe2d 100644 --- a/test/abilities/corrosion.test.ts +++ b/test/abilities/corrosion.test.ts @@ -22,7 +22,7 @@ describe("Abilities - Corrosion", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .disableCrits() .enemySpecies(Species.GRIMER) @@ -32,7 +32,7 @@ describe("Abilities - Corrosion", () => { it("If a Poison- or Steel-type Pokémon with this Ability poisons a target with Synchronize, Synchronize does not gain the ability to poison Poison- or Steel-type Pokémon.", async () => { game.override.ability(Abilities.SYNCHRONIZE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); const enemyPokemon = game.scene.getEnemyPokemon(); diff --git a/test/abilities/costar.test.ts b/test/abilities/costar.test.ts index 09b724a07ec..c6a44bffe54 100644 --- a/test/abilities/costar.test.ts +++ b/test/abilities/costar.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - COSTAR", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,59 +26,52 @@ describe("Abilities - COSTAR", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.ability(Abilities.COSTAR); - game.override.moveset([ Moves.SPLASH, Moves.NASTY_PLOT ]); + game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); game.override.enemyMoveset(Moves.SPLASH); }); + test("ability copies positive stat stages", async () => { + game.override.enemyAbility(Abilities.BALL_FETCH); - test( - "ability copies positive stat stages", - async () => { - game.override.enemyAbility(Abilities.BALL_FETCH); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO ]); + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - let [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); + game.move.select(Moves.NASTY_PLOT); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); - game.move.select(Moves.NASTY_PLOT); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); + expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(0); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.doSwitchPokemon(2); - await game.phaseInterceptor.to(MessagePhase); + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(2); + }); - [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(2); - }, - ); + test("ability copies negative stat stages", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); - test( - "ability copies negative stat stages", - async () => { - game.override.enemyAbility(Abilities.INTIMIDATE); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO ]); + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); - let [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.doSwitchPokemon(2); - await game.phaseInterceptor.to(MessagePhase); - - [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - expect(rightPokemon.getStatStage(Stat.ATK)).toBe(-2); - }, - ); + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(rightPokemon.getStatStage(Stat.ATK)).toBe(-2); + }); }); diff --git a/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts index 99d8a6d588d..56c357b2212 100644 --- a/test/abilities/dancer.test.ts +++ b/test/abilities/dancer.test.ts @@ -29,19 +29,16 @@ describe("Abilities - Dancer", () => { // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability) it("triggers when dance moves are used, doesn't consume extra PP", async () => { - game.override - .enemyAbility(Abilities.DANCER) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset(Moves.VICTORY_DANCE); - await game.classicMode.startBattle([ Species.ORICORIO, Species.FEEBAS ]); + game.override.enemyAbility(Abilities.DANCER).enemySpecies(Species.MAGIKARP).enemyMoveset(Moves.VICTORY_DANCE); + await game.classicMode.startBattle([Species.ORICORIO, Species.FEEBAS]); - const [ oricorio, feebas ] = game.scene.getPlayerField(); - game.move.changeMoveset(oricorio, [ Moves.SWORDS_DANCE, Moves.VICTORY_DANCE, Moves.SPLASH ]); - game.move.changeMoveset(feebas, [ Moves.SWORDS_DANCE, Moves.SPLASH ]); + const [oricorio, feebas] = game.scene.getPlayerField(); + game.move.changeMoveset(oricorio, [Moves.SWORDS_DANCE, Moves.VICTORY_DANCE, Moves.SPLASH]); + game.move.changeMoveset(feebas, [Moves.SWORDS_DANCE, Moves.SPLASH]); game.move.select(Moves.SPLASH); game.move.select(Moves.SWORDS_DANCE, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MovePhase"); // immediately copies ally move await game.phaseInterceptor.to("MovePhase", false); @@ -65,20 +62,20 @@ describe("Abilities - Dancer", () => { // TODO: Enable after Dancer rework to not push to move history it.todo("should not count as the last move used for mirror move/instruct", async () => { game.override - .moveset([ Moves.FIERY_DANCE, Moves.REVELATION_DANCE ]) - .enemyMoveset([ Moves.INSTRUCT, Moves.MIRROR_MOVE, Moves.SPLASH ]) + .moveset([Moves.FIERY_DANCE, Moves.REVELATION_DANCE]) + .enemyMoveset([Moves.INSTRUCT, Moves.MIRROR_MOVE, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) .enemyLevel(10); - await game.classicMode.startBattle([ Species.ORICORIO, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.ORICORIO, Species.FEEBAS]); - const [ oricorio ] = game.scene.getPlayerField(); - const [ , shuckle2 ] = game.scene.getEnemyField(); + const [oricorio] = game.scene.getPlayerField(); + const [, shuckle2] = game.scene.getEnemyField(); game.move.select(Moves.REVELATION_DANCE, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2); game.move.select(Moves.FIERY_DANCE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2); await game.forceEnemyMove(Moves.INSTRUCT, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.MIRROR_MOVE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MovePhase"); // Oricorio rev dance await game.phaseInterceptor.to("MovePhase"); // Feebas fiery dance await game.phaseInterceptor.to("MovePhase"); // Oricorio fiery dance (from dancer) @@ -97,6 +94,5 @@ describe("Abilities - Dancer", () => { currentPhase = game.scene.getCurrentPhase() as MovePhase; expect(currentPhase.pokemon).toBe(oricorio); expect(currentPhase.move.moveId).toBe(Moves.REVELATION_DANCE); - }); }); diff --git a/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts index ce8c7bac8b3..a73002d999c 100644 --- a/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -24,16 +24,17 @@ describe("Abilities - Defiant", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.BEEDRILL) .enemyMoveset(Moves.TICKLE) .startingLevel(1) - .moveset([ Moves.SPLASH, Moves.CLOSE_COMBAT ]) + .moveset([Moves.SPLASH, Moves.CLOSE_COMBAT]) .ability(Abilities.DEFIANT); }); it("lower atk and def by 1 via tickle, then increase atk by 4 via defiant", async () => { - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -45,7 +46,7 @@ describe("Abilities - Defiant", () => { it("lowering your own stats should not trigger defiant", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.CLOSE_COMBAT); @@ -58,7 +59,7 @@ describe("Abilities - Defiant", () => { it("white herb should remove only the negative effects", async () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); diff --git a/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts index 4aa44c97404..67d9ac1cdf5 100644 --- a/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -36,14 +36,12 @@ describe("Abilities - Desolate Land", () => { * is forcefully moved out of the field from moves such as Roar {@linkcode Moves.ROAR} */ it("should lift only when all pokemon with this ability leave the field", async () => { - game.override - .battleType("double") - .enemyMoveset([ Moves.SPLASH, Moves.ROAR ]); - await game.classicMode.startBattle([ Species.MAGCARGO, Species.MAGCARGO, Species.MAGIKARP, Species.MAGIKARP ]); + game.override.battleType("double").enemyMoveset([Moves.SPLASH, Moves.ROAR]); + await game.classicMode.startBattle([Species.MAGCARGO, Species.MAGCARGO, Species.MAGIKARP, Species.MAGIKARP]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); @@ -59,7 +57,7 @@ describe("Abilities - Desolate Land", () => { await game.toNextTurn(); - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min + 1; }); @@ -77,14 +75,14 @@ describe("Abilities - Desolate Land", () => { it("should lift when enemy faints", async () => { game.override .battleType("single") - .moveset([ Moves.SHEER_COLD ]) + .moveset([Moves.SHEER_COLD]) .ability(Abilities.NO_GUARD) .startingLevel(100) .enemyLevel(1) - .enemyMoveset([ Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH]) .enemySpecies(Species.MAGCARGO) .enemyHasPassiveAbility(true); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); @@ -96,11 +94,8 @@ describe("Abilities - Desolate Land", () => { }); it("should lift when pokemon returns upon switching from double to single battle", async () => { - game.override - .battleType("even-doubles") - .enemyMoveset([ Moves.SPLASH, Moves.MEMENTO ]) - .startingWave(12); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGCARGO ]); + game.override.battleType("even-doubles").enemyMoveset([Moves.SPLASH, Moves.MEMENTO]).startingWave(12); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGCARGO]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); @@ -121,10 +116,10 @@ describe("Abilities - Desolate Land", () => { it("should lift when enemy is captured", async () => { game.override .battleType("single") - .enemyMoveset([ Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH]) .enemySpecies(Species.MAGCARGO) .enemyHasPassiveAbility(true); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); diff --git a/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts index cb875e23019..a971f5c2733 100644 --- a/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -8,7 +8,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Disguise", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,7 +31,7 @@ describe("Abilities - Disguise", () => { .enemySpecies(Species.MIMIKYU) .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.REGIELEKI) - .moveset([ Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH ]); + .moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]); }); it("takes no damage from attacking move and transforms to Busted form, takes 1/8 max HP damage from the disguise breaking", async () => { @@ -67,7 +66,7 @@ describe("Abilities - Disguise", () => { }); it("takes no damage from the first hit of a multihit move and transforms to Busted form, then takes damage from the second hit", async () => { - game.override.moveset([ Moves.SURGING_STRIKES ]); + game.override.moveset([Moves.SURGING_STRIKES]); game.override.enemyLevel(5); await game.classicMode.startBattle(); @@ -107,10 +106,10 @@ describe("Abilities - Disguise", () => { }); it("persists form change when switched out", async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); game.override.starterSpecies(0); - await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + await game.classicMode.startBattle([Species.MIMIKYU, Species.FURRET]); const mimikyu = game.scene.getPlayerPokemon()!; const maxHp = mimikyu.getMaxHp(); @@ -134,9 +133,9 @@ describe("Abilities - Disguise", () => { it("persists form change when wave changes with no arena reset", async () => { game.override.starterSpecies(0); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); - await game.classicMode.startBattle([ Species.FURRET, Species.MIMIKYU ]); + await game.classicMode.startBattle([Species.FURRET, Species.MIMIKYU]); const mimikyu = game.scene.getPlayerParty()[1]!; expect(mimikyu.formIndex).toBe(bustedForm); @@ -152,7 +151,7 @@ describe("Abilities - Disguise", () => { game.override.startingWave(4); game.override.starterSpecies(Species.MIMIKYU); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); await game.classicMode.startBattle(); @@ -172,10 +171,10 @@ describe("Abilities - Disguise", () => { game.override.startingWave(10); game.override.starterSpecies(0); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); - await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + await game.classicMode.startBattle([Species.MIMIKYU, Species.FURRET]); const mimikyu1 = game.scene.getPlayerPokemon()!; @@ -193,7 +192,7 @@ describe("Abilities - Disguise", () => { }); it("doesn't faint twice when fainting due to Disguise break damage, nor prevent faint from Disguise break damage if using Endure", async () => { - game.override.enemyMoveset([ Moves.ENDURE ]); + game.override.enemyMoveset([Moves.ENDURE]); await game.classicMode.startBattle(); const mimikyu = game.scene.getEnemyPokemon()!; @@ -208,7 +207,7 @@ describe("Abilities - Disguise", () => { it("activates when Aerilate circumvents immunity to the move's base type", async () => { game.override.ability(Abilities.AERILATE); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); await game.classicMode.startBattle(); @@ -225,13 +224,11 @@ describe("Abilities - Disguise", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyMoveset(Moves.SUBSTITUTE) - .moveset(Moves.POWER_TRIP); + game.override.enemyMoveset(Moves.SUBSTITUTE).moveset(Moves.POWER_TRIP); await game.classicMode.startBattle(); game.move.select(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.formIndex).toBe(disguisedForm); diff --git a/test/abilities/dry_skin.test.ts b/test/abilities/dry_skin.test.ts index f3a67f0c1fd..9d8a29c431a 100644 --- a/test/abilities/dry_skin.test.ts +++ b/test/abilities/dry_skin.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Dry Skin", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.CHARMANDER) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN ]) + .moveset([Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN]) .starterSpecies(Species.CHANDELURE); }); @@ -69,7 +69,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing fire attacks do 25% more damage", async () => { - game.override.moveset([ Moves.FLAMETHROWER ]); + game.override.moveset([Moves.FLAMETHROWER]); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -105,7 +105,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing water attacks do not heal if they were protected from", async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); + game.override.enemyMoveset([Moves.PROTECT]); await game.classicMode.startBattle(); @@ -119,7 +119,7 @@ describe("Abilities - Dry Skin", () => { }); it("multi-strike water attacks only heal once", async () => { - game.override.moveset([ Moves.WATER_GUN, Moves.WATER_SHURIKEN ]); + game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); await game.classicMode.startBattle(); diff --git a/test/abilities/early_bird.test.ts b/test/abilities/early_bird.test.ts index 5889cfe2f89..cc486672c95 100644 --- a/test/abilities/early_bird.test.ts +++ b/test/abilities/early_bird.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Early Bird", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH ]) + .moveset([Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH]) .ability(Abilities.EARLY_BIRD) .battleType("single") .disableCrits() @@ -35,7 +35,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces Rest's sleep time to 1 turn", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; @@ -60,7 +60,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces 3-turn sleep to 1 turn", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 4); @@ -79,7 +79,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces 1-turn sleep to 0 turns", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 2); diff --git a/test/abilities/flash_fire.test.ts b/test/abilities/flash_fire.test.ts index 1c94c694b29..3cec9cd9cb7 100644 --- a/test/abilities/flash_fire.test.ts +++ b/test/abilities/flash_fire.test.ts @@ -35,10 +35,9 @@ describe("Abilities - Flash Fire", () => { .disableCrits(); }); - it("immune to Fire-type moves", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -48,8 +47,8 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not activate if the Pokémon is protected from the Fire-type move", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset([ Moves.PROTECT ]); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -59,8 +58,8 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated by Will-O-Wisp", async () => { - game.override.enemyMoveset([ Moves.WILL_O_WISP ]).moveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.WILL_O_WISP]).moveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -74,9 +73,9 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated after being frozen", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset(Moves.SPLASH); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); game.override.statusEffect(StatusEffect.FREEZE); - await game.classicMode.startBattle([ Species.BLISSEY ]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -87,12 +86,12 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not passing with baton pass", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset([ Moves.BATON_PASS ]); - await game.classicMode.startBattle([ Species.BLISSEY, Species.CHANSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.BATON_PASS]); + await game.classicMode.startBattle([Species.BLISSEY, Species.CHANSEY]); // ensure use baton pass after enemy moved game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); @@ -103,16 +102,16 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("boosts Fire-type move when the ability is activated", async () => { - game.override.enemyMoveset([ Moves.FIRE_PLEDGE ]).moveset([ Moves.EMBER, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.FIRE_PLEDGE]).moveset([Moves.EMBER, Moves.SPLASH]); game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE); - await game.classicMode.startBattle([ Species.BLISSEY ]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; const initialHP = 1000; blissey.hp = initialHP; // first turn game.move.select(Moves.EMBER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(TurnEndPhase); const originalDmg = initialHP - blissey.hp; @@ -131,7 +130,7 @@ describe("Abilities - Flash Fire", () => { game.override.moveset(Moves.FIRE_PLEDGE).enemyMoveset(Moves.EMBER); game.override.enemyAbility(Abilities.NONE).ability(Abilities.FLASH_FIRE); game.override.enemySpecies(Species.BLISSEY); - await game.classicMode.startBattle([ Species.RATTATA ]); + await game.classicMode.startBattle([Species.RATTATA]); const blissey = game.scene.getEnemyPokemon()!; const initialHP = 1000; @@ -139,7 +138,7 @@ describe("Abilities - Flash Fire", () => { // first turn game.move.select(Moves.FIRE_PLEDGE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); await game.move.forceMiss(); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts index 99f4211eeaa..fff509a1f00 100644 --- a/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -21,7 +21,7 @@ describe("Abilities - Flower Gift", () => { */ const testRevertFormAgainstAbility = async (game: GameManager, ability: Abilities) => { game.override.starterForms({ [Species.CASTFORM]: SUNSHINE_FORM }).enemyAbility(ability); - await game.classicMode.startBattle([ Species.CASTFORM ]); + await game.classicMode.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -41,7 +41,7 @@ describe("Abilities - Flower Gift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP ]) + .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); @@ -50,9 +50,9 @@ describe("Abilities - Flower Gift", () => { // TODO: Uncomment expect statements when the ability is implemented - currently does not increase stats of allies it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); - const [ cherrim ] = game.scene.getPlayerField(); + const [cherrim] = game.scene.getPlayerField(); const cherrimAtkStat = cherrim.getEffectiveStat(Stat.ATK); const cherrimSpDefStat = cherrim.getEffectiveStat(Stat.SPDEF); @@ -62,7 +62,7 @@ describe("Abilities - Flower Gift", () => { game.move.select(Moves.SUNNY_DAY, 0); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase"); expect(cherrim.formIndex).toBe(SUNSHINE_FORM); @@ -74,7 +74,7 @@ describe("Abilities - Flower Gift", () => { it("changes the Pokemon's form during Harsh Sunlight", async () => { game.override.weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM ]); + await game.classicMode.startBattle([Species.CHERRIM]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); @@ -91,9 +91,9 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset([ Moves.SKILL_SWAP ]).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM ]); + await game.classicMode.startBattle([Species.CHERRIM]); const cherrim = game.scene.getPlayerPokemon()!; @@ -110,16 +110,16 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Flower Gift is suppressed, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset([ Moves.GASTRO_ACID ]).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(cherrim.summonData.abilitySuppressed).toBe(true); @@ -140,7 +140,7 @@ describe("Abilities - Flower Gift", () => { it("should be in Overcast Form after the user is switched out", async () => { game.override.weather(WeatherType.SUNNY); - await game.classicMode.startBattle([ Species.CASTFORM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CASTFORM, Species.MAGIKARP]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); diff --git a/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts index 31c9942cd98..bdc32604bba 100644 --- a/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Forecast", () => { */ const testWeatherFormChange = async (game: GameManager, weather: WeatherType, form: number, initialForm?: number) => { game.override.weather(weather).starterForms({ [Species.CASTFORM]: initialForm }); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -44,7 +44,7 @@ describe("Abilities - Forecast", () => { */ const testRevertFormAgainstAbility = async (game: GameManager, ability: Abilities) => { game.override.starterForms({ [Species.CASTFORM]: SUNNY_FORM }).enemyAbility(ability); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -64,121 +64,132 @@ describe("Abilities - Forecast", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE ]) + .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); - it("changes form based on weather", async () => { - game.override - .moveset([ Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH ]) - .battleType("double") - .starterForms({ - [Species.KYOGRE]: 1, - [Species.GROUDON]: 1, - [Species.RAYQUAZA]: 1 - }); - await game.startBattle([ Species.CASTFORM, Species.FEEBAS, Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ALTARIA ]); + it( + "changes form based on weather", + async () => { + game.override + .moveset([Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH]) + .battleType("double") + .starterForms({ + [Species.KYOGRE]: 1, + [Species.GROUDON]: 1, + [Species.RAYQUAZA]: 1, + }); + await game.startBattle([ + Species.CASTFORM, + Species.FEEBAS, + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.ALTARIA, + ]); - vi.spyOn(game.scene.getPlayerParty()[5], "getAbility").mockReturnValue(allAbilities[Abilities.CLOUD_NINE]); + vi.spyOn(game.scene.getPlayerParty()[5], "getAbility").mockReturnValue(allAbilities[Abilities.CLOUD_NINE]); - const castform = game.scene.getPlayerField()[0]; - expect(castform.formIndex).toBe(NORMAL_FORM); + const castform = game.scene.getPlayerField()[0]; + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.RAIN_DANCE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.RAIN_DANCE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(RAINY_FORM); + expect(castform.formIndex).toBe(RAINY_FORM); - game.move.select(Moves.SUNNY_DAY); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SUNNY_DAY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SUNNY_FORM); + expect(castform.formIndex).toBe(SUNNY_FORM); - game.move.select(Moves.SNOWSCAPE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.override.moveset([ Moves.HAIL, Moves.SANDSTORM, Moves.SNOWSCAPE, Moves.SPLASH ]); + game.override.moveset([Moves.HAIL, Moves.SANDSTORM, Moves.SNOWSCAPE, Moves.SPLASH]); - game.move.select(Moves.SANDSTORM); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SANDSTORM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.HAIL); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.HAIL); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(2); // Feebas now 2, Kyogre 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Feebas now 2, Kyogre 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(RAINY_FORM); + expect(castform.formIndex).toBe(RAINY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(3); // Kyogre now 3, Groudon 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(3); // Kyogre now 3, Groudon 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SUNNY_FORM); + expect(castform.formIndex).toBe(SUNNY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(4); // Groudon now 4, Rayquaza 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(4); // Groudon now 4, Rayquaza 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(2); // Rayquaza now 2, Feebas 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Rayquaza now 2, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SNOWSCAPE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(5); // Feebas now 5, Altaria 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Feebas now 5, Altaria 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(5); // Altaria now 5, Feebas 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Altaria now 5, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.scene.arena.trySetWeather(WeatherType.FOG, false); - game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("TurnStartPhase"); + game.scene.arena.trySetWeather(WeatherType.FOG, false); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("TurnStartPhase"); - expect(castform.formIndex).toBe(NORMAL_FORM); - }, 30 * 1000); + expect(castform.formIndex).toBe(NORMAL_FORM); + }, + 30 * 1000, + ); it("reverts to Normal Form during Clear weather", async () => { await testWeatherFormChange(game, WeatherType.NONE, NORMAL_FORM, SUNNY_FORM); @@ -190,7 +201,7 @@ describe("Abilities - Forecast", () => { it("has no effect on Pokémon other than Castform", async () => { game.override.enemyAbility(Abilities.FORECAST).enemySpecies(Species.SHUCKLE); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.RAIN_DANCE); await game.phaseInterceptor.to(TurnEndPhase); @@ -200,8 +211,11 @@ describe("Abilities - Forecast", () => { }); it("reverts to Normal Form when Castform loses Forecast, changes form to match the weather when it regains it", async () => { - game.override.moveset([ Moves.SKILL_SWAP, Moves.WORRY_SEED, Moves.SPLASH ]).weather(WeatherType.RAIN).battleType("double"); - await game.startBattle([ Species.CASTFORM, Species.FEEBAS ]); + game.override + .moveset([Moves.SKILL_SWAP, Moves.WORRY_SEED, Moves.SPLASH]) + .weather(WeatherType.RAIN) + .battleType("double"); + await game.startBattle([Species.CASTFORM, Species.FEEBAS]); const castform = game.scene.getPlayerField()[0]; @@ -209,7 +223,7 @@ describe("Abilities - Forecast", () => { game.move.select(Moves.SKILL_SWAP, 0, BattlerIndex.PLAYER_2); game.move.select(Moves.SKILL_SWAP, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(castform.formIndex).toBe(NORMAL_FORM); @@ -221,22 +235,22 @@ describe("Abilities - Forecast", () => { game.move.select(Moves.SPLASH); game.move.select(Moves.WORRY_SEED, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(castform.formIndex).toBe(NORMAL_FORM); }); it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => { - game.override.enemyMoveset([ Moves.GASTRO_ACID ]).weather(WeatherType.RAIN); - await game.startBattle([ Species.CASTFORM, Species.PIKACHU ]); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.RAIN); + await game.startBattle([Species.CASTFORM, Species.PIKACHU]); const castform = game.scene.getPlayerPokemon()!; expect(castform.formIndex).toBe(RAINY_FORM); // First turn - Forecast is suppressed game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.move.forceHit(); await game.phaseInterceptor.to(TurnEndPhase); @@ -259,8 +273,8 @@ describe("Abilities - Forecast", () => { }); it("does not change Castform's form until after Stealth Rock deals damage", async () => { - game.override.weather(WeatherType.RAIN).enemyMoveset([ Moves.STEALTH_ROCK ]); - await game.startBattle([ Species.PIKACHU, Species.CASTFORM ]); + game.override.weather(WeatherType.RAIN).enemyMoveset([Moves.STEALTH_ROCK]); + await game.startBattle([Species.PIKACHU, Species.CASTFORM]); // First turn - set up stealth rock game.move.select(Moves.SPLASH); @@ -284,7 +298,7 @@ describe("Abilities - Forecast", () => { it("should be in Normal Form after the user is switched out", async () => { game.override.weather(WeatherType.RAIN); - await game.startBattle([ Species.CASTFORM, Species.MAGIKARP ]); + await game.startBattle([Species.CASTFORM, Species.MAGIKARP]); const castform = game.scene.getPlayerPokemon()!; expect(castform.formIndex).toBe(RAINY_FORM); diff --git a/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts index 8cb7b0233c2..30175fe37e0 100644 --- a/test/abilities/friend_guard.test.ts +++ b/test/abilities/friend_guard.test.ts @@ -28,15 +28,15 @@ describe("Moves - Friend Guard", () => { game.override .battleType("double") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE ]) + .enemyMoveset([Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE]) .enemySpecies(Species.SHUCKLE) - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .startingLevel(100); }); it("should reduce damage that other allied Pokémon receive from attacks (from any Pokémon) by 25%", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); - const [ player1, player2 ] = game.scene.getPlayerField(); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + const [player1, player2] = game.scene.getPlayerField(); const spy = vi.spyOn(player1, "getAttackDamage"); const enemy1 = game.scene.getEnemyField()[0]; @@ -63,13 +63,15 @@ describe("Moves - Friend Guard", () => { // Get the last return value from `getAttackDamage` const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; // With the ally's Friend Guard, damage should have been reduced from base damage by 25% - expect(turn2Damage).toBe(Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL) * 0.75)); + expect(turn2Damage).toBe( + Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL) * 0.75), + ); }); it("should NOT reduce damage to pokemon with friend guard", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); - const player2 = game.scene.getPlayerField()[1]; + const player2 = game.scene.getPlayerField()[1]; const spy = vi.spyOn(player2, "getAttackDamage"); game.move.select(Moves.SPLASH); @@ -93,9 +95,9 @@ describe("Moves - Friend Guard", () => { }); it("should NOT reduce damage from fixed damage attacks", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [player1, player2] = game.scene.getPlayerField(); const spy = vi.spyOn(player1, "getAttackDamage"); game.move.select(Moves.SPLASH); diff --git a/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts index 9ba57c296d9..c1e02c6c8d8 100644 --- a/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -9,7 +9,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - Galvanize", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,7 +30,7 @@ describe("Abilities - Galvanize", () => { .battleType("single") .startingLevel(100) .ability(Abilities.GALVANIZE) - .moveset([ Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES ]) + .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) .enemySpecies(Species.DUSCLOPS) .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -85,7 +84,7 @@ describe("Abilities - Galvanize", () => { it("should not change the type of variable-type moves", async () => { game.override.enemySpecies(Species.MIGHTYENA); - await game.startBattle([ Species.ESPEON ]); + await game.startBattle([Species.ESPEON]); const playerPokemon = game.scene.getPlayerPokemon()!; vi.spyOn(playerPokemon, "getMoveType"); @@ -111,7 +110,7 @@ describe("Abilities - Galvanize", () => { vi.spyOn(enemyPokemon, "apply"); game.move.select(Moves.FURY_SWIPES); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/test/abilities/good_as_gold.test.ts b/test/abilities/good_as_gold.test.ts index e3367d5b7f8..7cc543c4a0d 100644 --- a/test/abilities/good_as_gold.test.ts +++ b/test/abilities/good_as_gold.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Good As Gold", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.GOOD_AS_GOLD) .battleType("single") .disableCrits() @@ -40,8 +40,8 @@ describe("Abilities - Good As Gold", () => { }); it("should block normal status moves", async () => { - game.override.enemyMoveset( [ Moves.GROWL ] ); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; @@ -54,8 +54,8 @@ describe("Abilities - Good As Gold", () => { }); it("should block memento and prevent the user from fainting", async () => { - game.override.enemyMoveset( [ Moves.MEMENTO ] ); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.MEMENTO]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.MEMENTO); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.getPlayerPokemon()!.isFainted()).toBe(false); @@ -64,10 +64,10 @@ describe("Abilities - Good As Gold", () => { it("should not block any status moves that target the field, one side, or all pokemon", async () => { game.override.battleType("double"); - game.override.enemyMoveset( [ Moves.STEALTH_ROCK, Moves.HAZE ] ); - game.override.moveset([ Moves.SWORDS_DANCE, Moves.SAFEGUARD ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); - const [ good_as_gold, ball_fetch ] = game.scene.getPlayerField(); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.HAZE]); + game.override.moveset([Moves.SWORDS_DANCE, Moves.SAFEGUARD]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + const [good_as_gold, ball_fetch] = game.scene.getPlayerField(); // Force second pokemon to have ball fetch to isolate to a single mon. vi.spyOn(ball_fetch, "getAbility").mockReturnValue(allAbilities[Abilities.BALL_FETCH]); @@ -76,7 +76,7 @@ describe("Abilities - Good As Gold", () => { game.move.select(Moves.SAFEGUARD, 1); await game.forceEnemyMove(Moves.STEALTH_ROCK); await game.forceEnemyMove(Moves.HAZE); - await game.setTurnOrder( [ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ] ); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(good_as_gold.getAbility().id).toBe(Abilities.GOOD_AS_GOLD); expect(good_as_gold.getStatStage(Stat.ATK)).toBe(0); @@ -86,8 +86,8 @@ describe("Abilities - Good As Gold", () => { it("should not block field targeted effects in singles", async () => { game.override.battleType("single"); - game.override.enemyMoveset( [ Moves.SPIKES ] ); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.SPIKES]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH, 0); await game.phaseInterceptor.to("BerryPhase"); @@ -97,8 +97,8 @@ describe("Abilities - Good As Gold", () => { it("should block the ally's helping hand", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.HELPING_HAND, Moves.TACKLE ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + game.override.moveset([Moves.HELPING_HAND, Moves.TACKLE]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); game.move.select(Moves.HELPING_HAND, 0); game.move.select(Moves.TACKLE, 1); @@ -109,10 +109,10 @@ describe("Abilities - Good As Gold", () => { it("should block the ally's heal bell, but only if the good as gold user is on the field", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.HEAL_BELL, Moves.SPLASH ]); + game.override.moveset([Moves.HEAL_BELL, Moves.SPLASH]); game.override.statusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS, Species.ABRA ]); - const [ good_as_gold, ball_fetch ] = game.scene.getPlayerField(); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.ABRA]); + const [good_as_gold, ball_fetch] = game.scene.getPlayerField(); // Force second pokemon to have ball fetch to isolate to a single mon. vi.spyOn(ball_fetch, "getAbility").mockReturnValue(allAbilities[Abilities.BALL_FETCH]); @@ -131,9 +131,9 @@ describe("Abilities - Good As Gold", () => { it("should not block field targeted effects like rain dance", async () => { game.override.battleType("single"); - game.override.enemyMoveset( [ Moves.RAIN_DANCE ] ); + game.override.enemyMoveset([Moves.RAIN_DANCE]); game.override.weather(WeatherType.NONE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH, 0); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/gorilla_tactics.test.ts b/test/abilities/gorilla_tactics.test.ts index e97bca6a725..48dab262b82 100644 --- a/test/abilities/gorilla_tactics.test.ts +++ b/test/abilities/gorilla_tactics.test.ts @@ -25,15 +25,15 @@ describe("Abilities - Gorilla Tactics", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.DISABLE ]) + .enemyMoveset([Moves.SPLASH, Moves.DISABLE]) .enemySpecies(Species.MAGIKARP) .enemyLevel(30) - .moveset([ Moves.SPLASH, Moves.TACKLE, Moves.GROWL ]) + .moveset([Moves.SPLASH, Moves.TACKLE, Moves.GROWL]) .ability(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([ Species.GALAR_DARMANITAN ]); + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; const initialAtkStat = darmanitan.getStat(Stat.ATK); @@ -50,7 +50,7 @@ describe("Abilities - Gorilla Tactics", () => { }); it("should struggle if the only usable move is disabled", async () => { - await game.classicMode.startBattle([ Species.GALAR_DARMANITAN ]); + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -64,7 +64,7 @@ describe("Abilities - Gorilla Tactics", () => { game.move.select(Moves.GROWL); await game.forceEnemyMove(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.getStatStage(Stat.ATK)).toBe(-1); // Only the effect of the first Growl should be applied @@ -73,7 +73,7 @@ describe("Abilities - Gorilla Tactics", () => { await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(darmanitan.hp).toBeLessThan(darmanitan.getMaxHp()); diff --git a/test/abilities/gulp_missile.test.ts b/test/abilities/gulp_missile.test.ts index d34e86ddc08..8ebd583d3ab 100644 --- a/test/abilities/gulp_missile.test.ts +++ b/test/abilities/gulp_missile.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Gulp Missile", () => { * @returns The effect damage of Gulp Missile */ const getEffectDamage = (pokemon: Pokemon): number => { - return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 4)); + return Math.max(1, Math.floor((pokemon.getMaxHp() * 1) / 4)); }; beforeAll(() => { @@ -43,7 +43,7 @@ describe("Abilities - Gulp Missile", () => { game.override .disableCrits() .battleType("single") - .moveset([ Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE ]) + .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -51,7 +51,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([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.DIVE); @@ -59,17 +59,17 @@ describe("Abilities - Gulp Missile", () => { game.move.select(Moves.DIVE); await game.phaseInterceptor.to("MoveEndPhase"); - expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(.5); + expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(0.5); expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); expect(cramorant.formIndex).toBe(GULPING_FORM); }); it("changes to Gorging Form if HP is under half when Surf or Dive is used", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.49); - expect(cramorant.getHpRatio()).toBe(.49); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.49); + expect(cramorant.getHpRatio()).toBe(0.49); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -79,7 +79,7 @@ describe("Abilities - Gulp Missile", () => { }); it("changes to base form when switched out after Surf or Dive is used", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CRAMORANT, Species.MAGIKARP]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.SURF); @@ -94,7 +94,7 @@ describe("Abilities - Gulp Missile", () => { }); it("changes form during Dive's charge turn", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.DIVE); @@ -106,7 +106,7 @@ describe("Abilities - Gulp Missile", () => { it("deals 1/4 of the attacker's maximum HP when hit by a damaging attack", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); @@ -119,10 +119,10 @@ describe("Abilities - Gulp Missile", () => { it("does not have any effect when hit by non-damaging attack", async () => { game.override.enemyMoveset(Moves.TAIL_WHIP); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -138,13 +138,13 @@ describe("Abilities - Gulp Missile", () => { it("lowers attacker's DEF stat stage by 1 when hit in Gulping form", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -162,13 +162,13 @@ describe("Abilities - Gulp Missile", () => { it("paralyzes the enemy when hit in Gorging form", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.45); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.45); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -186,7 +186,7 @@ describe("Abilities - Gulp Missile", () => { it("does not activate the ability when underwater", async () => { game.override.enemyMoveset(Moves.SURF); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -199,12 +199,12 @@ describe("Abilities - Gulp Missile", () => { it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => { game.override.enemyMoveset(Moves.TACKLE).enemyAbility(Abilities.MAGIC_GUARD); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -223,7 +223,7 @@ describe("Abilities - Gulp Missile", () => { it("activates on faint", async () => { game.override.enemyMoveset(Moves.THUNDERBOLT); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -237,10 +237,8 @@ describe("Abilities - Gulp Missile", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyAbility(Abilities.STURDY) - .enemyMoveset([ Moves.SPLASH, Moves.POWER_TRIP ]); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + game.override.enemyAbility(Abilities.STURDY).enemyMoveset([Moves.SPLASH, Moves.POWER_TRIP]); + await game.classicMode.startBattle([Species.CRAMORANT]); game.move.select(Moves.SURF); await game.forceEnemyMove(Moves.SPLASH); @@ -250,7 +248,7 @@ describe("Abilities - Gulp Missile", () => { game.move.select(Moves.SUBSTITUTE); await game.forceEnemyMove(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); expect(game.scene.getPlayerPokemon()!.formIndex).toBe(GULPING_FORM); @@ -258,10 +256,10 @@ describe("Abilities - Gulp Missile", () => { it("cannot be suppressed", async () => { game.override.enemyMoveset(Moves.GASTRO_ACID); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -278,10 +276,10 @@ describe("Abilities - Gulp Missile", () => { it("cannot be swapped with another ability", async () => { game.override.enemyMoveset(Moves.SKILL_SWAP); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -299,7 +297,7 @@ describe("Abilities - Gulp Missile", () => { it("cannot be copied", async () => { game.override.enemyAbility(Abilities.TRACE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnStartPhase"); diff --git a/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts index 6c41460535f..fa065d1ed03 100644 --- a/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Heatproof", () => { .enemyLevel(100) .starterSpecies(Species.CHANDELURE) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.FLAMETHROWER, Moves.SPLASH ]) + .moveset([Moves.FLAMETHROWER, Moves.SPLASH]) .startingLevel(100); }); @@ -55,14 +55,12 @@ describe("Abilities - Heatproof", () => { await game.phaseInterceptor.to(TurnEndPhase); const regularDamage = initialHP - enemy.hp; - expect(heatproofDamage).toBeLessThanOrEqual((regularDamage / 2) + 1); - expect(heatproofDamage).toBeGreaterThanOrEqual((regularDamage / 2) - 1); + expect(heatproofDamage).toBeLessThanOrEqual(regularDamage / 2 + 1); + expect(heatproofDamage).toBeGreaterThanOrEqual(regularDamage / 2 - 1); }); it("reduces Burn damage by half", async () => { - game.override - .enemyStatusEffect(StatusEffect.BURN) - .enemySpecies(Species.ABRA); + game.override.enemyStatusEffect(StatusEffect.BURN).enemySpecies(Species.ABRA); await game.startBattle(); const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/honey_gather.test.ts b/test/abilities/honey_gather.test.ts index a1cad453843..bea5c25c878 100644 --- a/test/abilities/honey_gather.test.ts +++ b/test/abilities/honey_gather.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Honey Gather", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.ROAR, Moves.THUNDERBOLT ]) + .moveset([Moves.SPLASH, Moves.ROAR, Moves.THUNDERBOLT]) .startingLevel(100) .ability(Abilities.HONEY_GATHER) .passiveAbility(Abilities.RUN_AWAY) @@ -36,7 +36,7 @@ describe("Abilities - Honey Gather", () => { }); it("should give money when winning a battle", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); game.scene.money = 1000; game.move.select(Moves.THUNDERBOLT); @@ -46,7 +46,7 @@ describe("Abilities - Honey Gather", () => { }); it("should not give money when the enemy pokemon flees", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); game.scene.money = 1000; game.move.select(Moves.ROAR); @@ -57,7 +57,7 @@ describe("Abilities - Honey Gather", () => { }); it("should not give money when the player flees", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); game.scene.money = 1000; // something weird is going on with the test framework, so this is required to prevent a crash diff --git a/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts index 669e73961e3..40197cf9e97 100644 --- a/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Hustle", () => { game = new GameManager(phaserGame); game.override .ability(Abilities.HUSTLE) - .moveset([ Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE ]) + .moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]) .disableCrits() .battleType("single") .enemyMoveset(Moves.SPLASH) @@ -34,7 +34,7 @@ describe("Abilities - Hustle", () => { }); it("increases the user's Attack stat by 50%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const atk = pikachu.stats[Stat.ATK]; @@ -48,7 +48,7 @@ describe("Abilities - Hustle", () => { }); it("lowers the accuracy of the user's physical moves by 20%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; vi.spyOn(pikachu, "getAccuracyMultiplier"); @@ -60,7 +60,7 @@ describe("Abilities - Hustle", () => { }); it("does not affect non-physical moves", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const spatk = pikachu.stats[Stat.SPATK]; @@ -78,7 +78,7 @@ describe("Abilities - Hustle", () => { game.override.startingLevel(100); game.override.enemyLevel(30); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/hyper_cutter.test.ts b/test/abilities/hyper_cutter.test.ts index c8c4c21c98f..fe5623e4e0f 100644 --- a/test/abilities/hyper_cutter.test.ts +++ b/test/abilities/hyper_cutter.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Hyper Cutter", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset([ Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK ]) + .moveset([Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK]) .ability(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.HYPER_CUTTER) @@ -46,11 +46,13 @@ describe("Abilities - Hyper Cutter", () => { await game.toNextTurn(); game.move.select(Moves.SAND_ATTACK); await game.toNextTurn(); - game.override.moveset([ Moves.STRING_SHOT ]); + game.override.moveset([Moves.STRING_SHOT]); game.move.select(Moves.STRING_SHOT); await game.toNextTurn(); expect(enemy.getStatStage(Stat.ATK)).toEqual(0); - [ Stat.ACC, Stat.DEF, Stat.EVA, Stat.SPATK, Stat.SPDEF, Stat.SPD ].forEach((stat: number) => expect(enemy.getStatStage(stat)).toBeLessThan(0)); + [Stat.ACC, Stat.DEF, Stat.EVA, Stat.SPATK, Stat.SPDEF, Stat.SPD].forEach((stat: number) => + expect(enemy.getStatStage(stat)).toBeLessThan(0), + ); }); }); diff --git a/test/abilities/ice_face.test.ts b/test/abilities/ice_face.test.ts index e4339cb8a28..e85794928d6 100644 --- a/test/abilities/ice_face.test.ts +++ b/test/abilities/ice_face.test.ts @@ -33,11 +33,11 @@ describe("Abilities - Ice Face", () => { game.override.battleType("single"); game.override.enemySpecies(Species.EISCUE); game.override.enemyAbility(Abilities.ICE_FACE); - game.override.moveset([ Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL ]); + game.override.moveset([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); it("takes no damage from physical move and transforms to Noice", async () => { - await game.classicMode.startBattle([ Species.HITMONLEE ]); + await game.classicMode.startBattle([Species.HITMONLEE]); game.move.select(Moves.TACKLE); @@ -51,9 +51,9 @@ describe("Abilities - Ice Face", () => { }); it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { - game.override.moveset([ Moves.SURGING_STRIKES ]); + game.override.moveset([Moves.SURGING_STRIKES]); game.override.enemyLevel(1); - await game.classicMode.startBattle([ Species.HITMONLEE ]); + await game.classicMode.startBattle([Species.HITMONLEE]); game.move.select(Moves.SURGING_STRIKES); @@ -79,7 +79,7 @@ describe("Abilities - Ice Face", () => { }); it("takes damage from special moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.ICE_BEAM); @@ -93,7 +93,7 @@ describe("Abilities - Ice Face", () => { }); it("takes effects from status moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.TOXIC_THREAD); @@ -106,10 +106,10 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when Hail or Snow starts", async () => { - game.override.moveset([ Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL ]); + game.override.moveset([Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.QUICK_ATTACK); @@ -128,10 +128,10 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - game.override.moveset([ Moves.SNOWSCAPE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.moveset([Moves.SNOWSCAPE]); - await game.classicMode.startBattle([ Species.EISCUE, Species.NINJASK ]); + await game.classicMode.startBattle([Species.EISCUE, Species.NINJASK]); game.move.select(Moves.SNOWSCAPE); @@ -156,9 +156,9 @@ describe("Abilities - Ice Face", () => { it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { game.override.enemySpecies(Species.SHUCKLE); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - await game.classicMode.startBattle([ Species.EISCUE ]); + await game.classicMode.startBattle([Species.EISCUE]); game.move.select(Moves.HAIL); const eiscue = game.scene.getPlayerPokemon()!; @@ -175,9 +175,9 @@ describe("Abilities - Ice Face", () => { }); it("persists form change when switched out", async () => { - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); - await game.classicMode.startBattle([ Species.EISCUE, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.EISCUE, Species.MAGIKARP]); game.move.select(Moves.ICE_BEAM); @@ -206,7 +206,7 @@ describe("Abilities - Ice Face", () => { [Species.EISCUE]: noiceForm, }); - await game.classicMode.startBattle([ Species.EISCUE ]); + await game.classicMode.startBattle([Species.EISCUE]); const eiscue = game.scene.getPlayerPokemon()!; @@ -224,22 +224,20 @@ describe("Abilities - Ice Face", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyMoveset(Moves.SUBSTITUTE) - .moveset(Moves.POWER_TRIP); + game.override.enemyMoveset(Moves.SUBSTITUTE).moveset(Moves.POWER_TRIP); await game.classicMode.startBattle(); game.move.select(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.formIndex).toBe(icefaceForm); }); it("cannot be suppressed", async () => { - game.override.moveset([ Moves.GASTRO_ACID ]); + game.override.moveset([Moves.GASTRO_ACID]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GASTRO_ACID); @@ -253,9 +251,9 @@ describe("Abilities - Ice Face", () => { }); it("cannot be swapped with another ability", async () => { - game.override.moveset([ Moves.SKILL_SWAP ]); + game.override.moveset([Moves.SKILL_SWAP]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SKILL_SWAP); @@ -271,7 +269,7 @@ describe("Abilities - Ice Face", () => { it("cannot be copied", async () => { game.override.ability(Abilities.TRACE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SIMPLE_BEAM); diff --git a/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts index c4fbcd2c7a4..6518fec989b 100644 --- a/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -45,11 +45,7 @@ describe("Abilities - Illuminate", () => { }); it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); await game.classicMode.startBattle(); diff --git a/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts index d73b77feda9..b4469cd9042 100644 --- a/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Imposter", () => { }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -75,9 +75,9 @@ describe("Abilities - Imposter", () => { }); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -96,9 +96,9 @@ describe("Abilities - Imposter", () => { }); it("should set each move's pp to a maximum of 5", async () => { - game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + game.override.enemyMoveset([Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.TACKLE); @@ -120,7 +120,7 @@ describe("Abilities - Imposter", () => { it("should activate its ability if it copies one that activates on summon", async () => { game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to("MoveEndPhase"); diff --git a/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts index 35fa816b88b..6278439651c 100644 --- a/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -28,7 +28,7 @@ describe("Abilities - Infiltrator", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES ]) + .moveset([Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES]) .ability(Abilities.INFILTRATOR) .battleType("single") .disableCrits() @@ -40,11 +40,23 @@ describe("Abilities - Infiltrator", () => { }); it.each([ - { effectName: "Light Screen", tagType: ArenaTagType.LIGHT_SCREEN, move: Moves.WATER_GUN }, - { effectName: "Reflect", tagType: ArenaTagType.REFLECT, move: Moves.TACKLE }, - { effectName: "Aurora Veil", tagType: ArenaTagType.AURORA_VEIL, move: Moves.TACKLE } + { + effectName: "Light Screen", + tagType: ArenaTagType.LIGHT_SCREEN, + move: Moves.WATER_GUN, + }, + { + effectName: "Reflect", + tagType: ArenaTagType.REFLECT, + move: Moves.TACKLE, + }, + { + effectName: "Aurora Veil", + tagType: ArenaTagType.AURORA_VEIL, + move: Moves.TACKLE, + }, ])("should bypass the target's $effectName", async ({ tagType, move }) => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -60,7 +72,7 @@ describe("Abilities - Infiltrator", () => { }); it("should bypass the target's Safeguard", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -76,7 +88,7 @@ describe("Abilities - Infiltrator", () => { // TODO: fix this interaction to pass this test it.todo("should bypass the target's Mist", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -91,7 +103,7 @@ describe("Abilities - Infiltrator", () => { }); it("should bypass the target's Substitute", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts index eab59e7c1a2..53286d354c8 100644 --- a/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -24,7 +24,8 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.RATTATA) .enemyAbility(Abilities.INTIMIDATE) .enemyPassiveAbility(Abilities.HYDRATION) @@ -34,7 +35,7 @@ describe("Abilities - Intimidate", () => { }); it("should lower ATK stat stage by 1 of enemy Pokemon on entry and player switch", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -42,7 +43,7 @@ describe("Abilities - Intimidate", () => { game.setMode(Mode.MESSAGE); game.endPhase(); }, - () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase"), ); await game.phaseInterceptor.to("CommandPhase", false); @@ -64,9 +65,8 @@ describe("Abilities - Intimidate", () => { }, 20000); it("should lower ATK stat stage by 1 for every enemy Pokemon in a double battle on entry", async () => { - game.override.battleType("double") - .startingWave(3); - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.battleType("double").startingWave(3); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -74,7 +74,7 @@ describe("Abilities - Intimidate", () => { game.setMode(Mode.MESSAGE); game.endPhase(); }, - () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase"), ); await game.phaseInterceptor.to("CommandPhase", false); @@ -89,8 +89,8 @@ describe("Abilities - Intimidate", () => { it("should not activate again if there is no switch or new entry", async () => { game.override.startingWave(2); - game.override.moveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -106,10 +106,8 @@ describe("Abilities - Intimidate", () => { }, 20000); it("should lower ATK stat stage by 1 for every switch", async () => { - game.override.moveset([ Moves.SPLASH ]) - .enemyMoveset([ Moves.VOLT_SWITCH ]) - .startingWave(5); - await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.moveset([Moves.SPLASH]).enemyMoveset([Moves.VOLT_SWITCH]).startingWave(5); + await game.classicMode.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; let enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/intrepid_sword.test.ts b/test/abilities/intrepid_sword.test.ts index 0f4305d38b4..28d0cd02c7f 100644 --- a/test/abilities/intrepid_sword.test.ts +++ b/test/abilities/intrepid_sword.test.ts @@ -6,7 +6,6 @@ import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Intrepid Sword", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,10 +28,8 @@ describe("Abilities - Intrepid Sword", () => { game.override.ability(Abilities.INTREPID_SWORD); }); - it("should raise ATK stat stage by 1 on entry", async() => { - await game.classicMode.runToSummon([ - Species.ZACIAN, - ]); + it("should raise ATK stat stage by 1 on entry", async () => { + await game.classicMode.runToSummon([Species.ZACIAN]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/libero.test.ts b/test/abilities/libero.test.ts index d36422ade4a..22abf1c248f 100644 --- a/test/abilities/libero.test.ts +++ b/test/abilities/libero.test.ts @@ -13,7 +13,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - Libero", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -34,308 +33,263 @@ describe("Abilities - Libero", () => { game.override.ability(Abilities.LIBERO); game.override.startingLevel(100); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE ]); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); - test( - "ability applies and changes a pokemon's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability applies and changes a pokemon's type", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); // Test for Gen9+ functionality, we are using previous funcionality - test.skip( - "ability applies only once per switch in", - async () => { - game.override.moveset([ Moves.SPLASH, Moves.AGILITY ]); + test.skip("ability applies only once per switch in", async () => { + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR ]); + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); - let leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + let leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - game.move.select(Moves.AGILITY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.AGILITY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.LIBERO)).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; - const moveType = PokemonType[allMoves[Moves.AGILITY].type]; - expect(leadPokemonType).not.toBe(moveType); + expect(leadPokemon.summonData.abilitiesApplied.filter(a => a === Abilities.LIBERO)).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; + expect(leadPokemonType).not.toBe(moveType); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); - leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); - test( - "ability applies correctly even if the pokemon's move has a variable type", - async () => { - game.override.moveset([ Moves.WEATHER_BALL ]); + test("ability applies correctly even if the pokemon's move has a variable type", async () => { + game.override.moveset([Moves.WEATHER_BALL]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.move.select(Moves.WEATHER_BALL); - await game.phaseInterceptor.to(TurnEndPhase); + game.scene.arena.weather = new Weather(WeatherType.SUNNY); + game.move.select(Moves.WEATHER_BALL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], - moveType = PokemonType[PokemonType.FIRE]; - expect(leadPokemonType).toBe(moveType); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; + expect(leadPokemonType).toBe(moveType); + }); - test( - "ability applies correctly even if the type has changed by another ability", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.passiveAbility(Abilities.REFRIGERATE); + test("ability applies correctly even if the type has changed by another ability", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], - moveType = PokemonType[PokemonType.ICE]; - expect(leadPokemonType).toBe(moveType); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; + expect(leadPokemonType).toBe(moveType); + }); - test( - "ability applies correctly even if the pokemon's move calls another move", - async () => { - game.override.moveset([ Moves.NATURE_POWER ]); + test("ability applies correctly even if the pokemon's move calls another move", async () => { + game.override.moveset([Moves.NATURE_POWER]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.scene.arena.biomeType = Biome.MOUNTAIN; - game.move.select(Moves.NATURE_POWER); - await game.phaseInterceptor.to(TurnEndPhase); + game.scene.arena.biomeType = Biome.MOUNTAIN; + game.move.select(Moves.NATURE_POWER); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); + }); - test( - "ability applies correctly even if the pokemon's move is delayed / charging", - async () => { - game.override.moveset([ Moves.DIG ]); + test("ability applies correctly even if the pokemon's move is delayed / charging", async () => { + game.override.moveset([Moves.DIG]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.DIG); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.DIG); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); + }); - test( - "ability applies correctly even if the pokemon's move misses", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset(Moves.SPLASH); + test("ability applies correctly even if the pokemon's move misses", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.move.forceMiss(); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); + await game.phaseInterceptor.to(TurnEndPhase); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon.isFullHp()).toBe(true); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability applies correctly even if the pokemon's move is protected against", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); + test("ability applies correctly even if the pokemon's move is protected against", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability applies correctly even if the pokemon's move fails because of type immunity", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemySpecies(Species.GASTLY); + test("ability applies correctly even if the pokemon's move fails because of type immunity", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability is not applied if pokemon's type is the same as the move's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability is not applied if pokemon's type is the same as the move's type", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [ allMoves[Moves.SPLASH].type ]; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); - test( - "ability is not applied if pokemon is terastallized", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability is not applied if pokemon is terastallized", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - leadPokemon.isTerastallized = true; + leadPokemon.isTerastallized = true; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); - test( - "ability is not applied if pokemon uses struggle", - async () => { - game.override.moveset([ Moves.STRUGGLE ]); + test("ability is not applied if pokemon uses struggle", async () => { + game.override.moveset([Moves.STRUGGLE]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.STRUGGLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.STRUGGLE); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); - test( - "ability is not applied if the pokemon's move fails", - async () => { - game.override.moveset([ Moves.BURN_UP ]); + test("ability is not applied if the pokemon's move fails", async () => { + game.override.moveset([Moves.BURN_UP]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.BURN_UP); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BURN_UP); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); - test( - "ability applies correctly even if the pokemon's Trick-or-Treat fails", - async () => { - game.override.moveset([ Moves.TRICK_OR_TREAT ]); - game.override.enemySpecies(Species.GASTLY); + test("ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TRICK_OR_TREAT); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); + }); - test( - "ability applies correctly and the pokemon curses itself", - async () => { - game.override.moveset([ Moves.CURSE ]); + test("ability applies correctly and the pokemon curses itself", async () => { + game.override.moveset([Moves.CURSE]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.CURSE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); - expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); + expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + }); }); function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { diff --git a/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts index 398d0d530e1..f9a076776aa 100644 --- a/test/abilities/magic_bounce.test.ts +++ b/test/abilities/magic_bounce.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Magic Bounce", () => { game.override .ability(Abilities.BALL_FETCH) .battleType("single") - .moveset( [ Moves.GROWL, Moves.SPLASH ]) + .moveset([Moves.GROWL, Moves.SPLASH]) .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.MAGIC_BOUNCE) @@ -39,7 +39,7 @@ describe("Abilities - Magic Bounce", () => { }); it("should reflect basic status moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -47,13 +47,13 @@ describe("Abilities - Magic Bounce", () => { }); it("should not bounce moves while the target is in the semi-invulnerable state", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); - game.override.moveset([ Moves.GROWL ]); - game.override.enemyMoveset( [ Moves.FLY ]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.GROWL]); + game.override.enemyMoveset([Moves.FLY]); game.move.select(Moves.GROWL); await game.forceEnemyMove(Moves.FLY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); @@ -61,8 +61,8 @@ describe("Abilities - Magic Bounce", () => { it("should individually bounce back multi-target moves", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.GROWL, 0); game.move.select(Moves.SPLASH, 1); @@ -73,9 +73,9 @@ describe("Abilities - Magic Bounce", () => { }); it("should still bounce back a move that would otherwise fail", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); - game.override.moveset([ Moves.GROWL ]); + game.override.moveset([Moves.GROWL]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -85,7 +85,7 @@ describe("Abilities - Magic Bounce", () => { it("should not bounce back a move that was just bounced", async () => { game.override.ability(Abilities.MAGIC_BOUNCE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -95,7 +95,7 @@ describe("Abilities - Magic Bounce", () => { it("should receive the stat change after reflecting a move back to a mirror armor user", async () => { game.override.ability(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -105,7 +105,7 @@ describe("Abilities - Magic Bounce", () => { it("should not bounce back a move from a mold breaker user", async () => { game.override.ability(Abilities.MOLD_BREAKER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -115,9 +115,9 @@ describe("Abilities - Magic Bounce", () => { it("should bounce back a spread status move against both pokemon", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); - game.override.enemyMoveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.GROWL, 0); game.move.select(Moves.SPLASH, 1); @@ -128,8 +128,8 @@ describe("Abilities - Magic Bounce", () => { it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - game.override.moveset([ Moves.SPIKES ]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.SPIKES]); game.move.select(Moves.SPIKES); await game.phaseInterceptor.to("BerryPhase"); @@ -139,9 +139,9 @@ describe("Abilities - Magic Bounce", () => { }); it("should bounce spikes even when the target is protected", async () => { - game.override.moveset([ Moves.SPIKES ]); - game.override.enemyMoveset([ Moves.PROTECT ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPIKES]); + game.override.enemyMoveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPIKES); await game.phaseInterceptor.to("BerryPhase"); @@ -149,20 +149,20 @@ describe("Abilities - Magic Bounce", () => { }); it("should not bounce spikes when the target is in the semi-invulnerable state", async () => { - game.override.moveset([ Moves.SPIKES ]); - game.override.enemyMoveset([ Moves.FLY ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPIKES]); + game.override.enemyMoveset([Moves.FLY]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPIKES); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1); }); - it("should not bounce back curse", async() => { + it("should not bounce back curse", async () => { game.override.starterSpecies(Species.GASTLY); - await game.classicMode.startBattle([ Species.GASTLY ]); - game.override.moveset([ Moves.CURSE ]); + await game.classicMode.startBattle([Species.GASTLY]); + game.override.moveset([Moves.CURSE]); game.move.select(Moves.CURSE); await game.phaseInterceptor.to("BerryPhase"); @@ -171,10 +171,10 @@ describe("Abilities - Magic Bounce", () => { }); it("should not cause encore to be interrupted after bouncing", async () => { - game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.GROWL ]); + game.override.moveset([Moves.SPLASH, Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.GROWL]); // game.override.ability(Abilities.MOLD_BREAKER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -184,34 +184,33 @@ describe("Abilities - Magic Bounce", () => { // turn 1 game.move.select(Moves.ENCORE); await game.forceEnemyMove(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); // turn 2 vi.spyOn(playerPokemon, "getAbility").mockRestore(); game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); - }); // TODO: encore is failing if the last move was virtual. it.todo("should not cause the bounced move to count for encore", async () => { - game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); - game.override.enemyMoveset([ Moves.GROWL, Moves.TACKLE ]); + game.override.moveset([Moves.SPLASH, Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.GROWL, Moves.TACKLE]); game.override.enemyAbility(Abilities.MAGIC_BOUNCE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; // turn 1 game.move.select(Moves.GROWL); await game.forceEnemyMove(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. @@ -220,7 +219,7 @@ describe("Abilities - Magic Bounce", () => { // turn 2 game.move.select(Moves.ENCORE); await game.forceEnemyMove(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); @@ -229,8 +228,8 @@ describe("Abilities - Magic Bounce", () => { // TODO: stomping tantrum should consider moves that were bounced. it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]); const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; vi.spyOn(stomping_tantrum, "calculateBattlePower"); @@ -244,33 +243,36 @@ describe("Abilities - Magic Bounce", () => { }); // TODO: stomping tantrum should consider moves that were bounced. - it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { - game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + it.todo( + "should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", + async () => { + game.override.enemyMoveset([Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); - const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(stomping_tantrum, "calculateBattlePower"); + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); - game.move.select(Moves.SPORE); - await game.forceEnemyMove(Moves.CHARM); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); - await game.phaseInterceptor.to("BerryPhase"); - expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); - await game.toNextTurn(); - game.move.select(Moves.GROWL); - await game.phaseInterceptor.to("BerryPhase"); - expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); - }); + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }, + ); it("should respect immunities when bouncing a move", async () => { vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); - game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.moveset([Moves.THUNDER_WAVE, Moves.GROWL]); game.override.ability(Abilities.SOUNDPROOF); - await game.classicMode.startBattle([ Species.PHANPY ]); + await game.classicMode.startBattle([Species.PHANPY]); // Turn 1 - thunder wave immunity test game.move.select(Moves.THUNDER_WAVE); @@ -284,8 +286,8 @@ describe("Abilities - Magic Bounce", () => { }); it("should bounce back a move before the accuracy check", async () => { - game.override.moveset([ Moves.SPORE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); const attacker = game.scene.getPlayerPokemon()!; @@ -296,8 +298,8 @@ describe("Abilities - Magic Bounce", () => { }); it("should take the accuracy of the magic bounce user into account", async () => { - game.override.moveset([ Moves.SPORE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); const opponent = game.scene.getEnemyPokemon()!; vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); @@ -308,10 +310,10 @@ describe("Abilities - Magic Bounce", () => { it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM ]); + game.override.moveset([Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); - const [ enemy_1, enemy_2 ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + const [enemy_1, enemy_2] = game.scene.getEnemyField(); // set speed just incase logic erroneously checks for speed order enemy_1.setStat(Stat.SPD, enemy_2.getStat(Stat.SPD) + 1); @@ -320,32 +322,41 @@ describe("Abilities - Magic Bounce", () => { game.move.select(Moves.TRICK_ROOM, 1); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + expect( + game.scene.arena + .getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER) + ?.getSourcePokemon() + ?.getBattlerIndex(), + ).toBe(BattlerIndex.ENEMY); game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true); // turn 2 game.move.select(Moves.STICKY_WEB, 0); game.move.select(Moves.TRICK_ROOM, 1); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + expect( + game.scene.arena + .getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER) + ?.getSourcePokemon() + ?.getBattlerIndex(), + ).toBe(BattlerIndex.ENEMY); }); it("should not bounce back status moves that hit through semi-invulnerable states", async () => { - game.override.moveset([ Moves.TOXIC, Moves.CHARM ]); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + game.override.moveset([Moves.TOXIC, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); game.move.select(Moves.TOXIC); await game.forceEnemyMove(Moves.FLY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + 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(); game.override.ability(Abilities.NO_GUARD); game.move.select(Moves.CHARM); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + 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); }); }); - diff --git a/test/abilities/magic_guard.test.ts b/test/abilities/magic_guard.test.ts index a2a88915419..96a9f4dab74 100644 --- a/test/abilities/magic_guard.test.ts +++ b/test/abilities/magic_guard.test.ts @@ -31,7 +31,7 @@ describe("Abilities - Magic Guard", () => { /** Player Pokemon overrides */ game.override.ability(Abilities.MAGIC_GUARD); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); game.override.startingLevel(100); /** Enemy Pokemon overrides */ @@ -43,138 +43,123 @@ describe("Abilities - Magic Guard", () => { //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) - it( - "ability should prevent damage caused by weather", - async () => { - game.override.weather(WeatherType.SANDSTORM); + it("ability should prevent damage caused by weather", async () => { + game.override.weather(WeatherType.SANDSTORM); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from weather - * - The enemy Pokemon (without Magic Guard) has taken damage from weather - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from weather + * - The enemy Pokemon (without Magic Guard) has taken damage from weather + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); - it( - "ability should prevent damage caused by status effects but other non-damage effects still apply", - async () => { - //Toxic keeps track of the turn counters -> important that Magic Guard keeps track of post-Toxic turns - game.override.statusEffect(StatusEffect.POISON); + it("ability should prevent damage caused by status effects but other non-damage effects still apply", async () => { + //Toxic keeps track of the turn counters -> important that Magic Guard keeps track of post-Toxic turns + game.override.statusEffect(StatusEffect.POISON); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from poison - * - The Pokemon's CatchRateMultiplier should be 1.5 - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(getStatusEffectCatchRateMultiplier(leadPokemon.status!.effect)).toBe(1.5); - } - ); + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The Pokemon's CatchRateMultiplier should be 1.5 + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(leadPokemon.status!.effect)).toBe(1.5); + }); - it( - "ability effect should not persist when the ability is replaced", - async () => { - game.override.enemyMoveset([ Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED ]); - game.override.statusEffect(StatusEffect.POISON); + it("ability effect should not persist when the ability is replaced", async () => { + game.override.enemyMoveset([Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED]); + game.override.statusEffect(StatusEffect.POISON); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - /** - * Expect: - * - The player Pokemon (that just lost its Magic Guard ability) has taken damage from poison - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); + /** + * Expect: + * - The player Pokemon (that just lost its Magic Guard ability) has taken damage from poison + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); + it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", async () => { + game.override.enemyStatusEffect(StatusEffect.BURN); + game.override.enemyAbility(Abilities.MAGIC_GUARD); - it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", - async () => { - game.override.enemyStatusEffect(StatusEffect.BURN); - game.override.enemyAbility(Abilities.MAGIC_GUARD); + await game.startBattle([Species.MAGIKARP]); - await game.startBattle([ Species.MAGIKARP ]); + game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + await game.phaseInterceptor.to(TurnEndPhase); - await game.phaseInterceptor.to(TurnEndPhase); + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from burn + * - The enemy Pokemon's physical attack damage is halved (TBD) + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }); - /** - * Expect: - * - The enemy Pokemon (with Magic Guard) has not taken damage from burn - * - The enemy Pokemon's physical attack damage is halved (TBD) - * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 - */ - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); - } - ); + it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", async () => { + game.override.enemyStatusEffect(StatusEffect.TOXIC); + game.override.enemyAbility(Abilities.MAGIC_GUARD); - it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", - async () => { - game.override.enemyStatusEffect(StatusEffect.TOXIC); - game.override.enemyAbility(Abilities.MAGIC_GUARD); + await game.startBattle([Species.MAGIKARP]); - await game.startBattle([ Species.MAGIKARP ]); + game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH); + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const toxicStartCounter = enemyPokemon.status!.toxicTurnCount; + //should be 0 - const toxicStartCounter = enemyPokemon.status!.toxicTurnCount; - //should be 0 - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The enemy Pokemon (with Magic Guard) has not taken damage from toxic - * - The enemy Pokemon's status effect duration should be incremented - * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 - */ - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(enemyPokemon.status!.toxicTurnCount).toBeGreaterThan(toxicStartCounter); - expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from toxic + * - The enemy Pokemon's status effect duration should be incremented + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.status!.toxicTurnCount).toBeGreaterThan(toxicStartCounter); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }); it("Magic Guard prevents damage caused by entry hazards", async () => { //Adds and applies Spikes to both sides of the arena const newTag = getArenaTag(ArenaTagType.SPIKES, 5, Moves.SPIKES, 0, 0, ArenaTagSide.BOTH)!; game.scene.arena.tags.push(newTag); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -184,14 +169,13 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from spikes - * - The enemy Pokemon (without Magic Guard) has taken damage from spikes - */ + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from spikes + * - The enemy Pokemon (without Magic Guard) has taken damage from spikes + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + }); it("Magic Guard does not prevent poison from Toxic Spikes", async () => { //Adds and applies Spikes to both sides of the arena @@ -200,7 +184,7 @@ describe("Abilities - Magic Guard", () => { game.scene.arena.tags.push(playerTag); game.scene.arena.tags.push(enemyTag); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -210,47 +194,44 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - Both Pokemon gain the poison status effect - * - The player Pokemon (with Magic Guard) has not taken damage from poison - * - The enemy Pokemon (without Magic Guard) has taken damage from poison - */ + * Expect: + * - Both Pokemon gain the poison status effect + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The enemy Pokemon (without Magic Guard) has taken damage from poison + */ expect(leadPokemon.status!.effect).toBe(StatusEffect.POISON); expect(enemyPokemon.status!.effect).toBe(StatusEffect.POISON); expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + }); - it("Magic Guard prevents against damage from volatile status effects", - async () => { - await game.startBattle([ Species.DUSKULL ]); - game.override.moveset([ Moves.CURSE ]); - game.override.enemyAbility(Abilities.MAGIC_GUARD); + it("Magic Guard prevents against damage from volatile status effects", async () => { + await game.startBattle([Species.DUSKULL]); + game.override.moveset([Moves.CURSE]); + game.override.enemyAbility(Abilities.MAGIC_GUARD); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.CURSE); + game.move.select(Moves.CURSE); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - /** - * Expect: - * - The player Pokemon (with Magic Guard) has cut its HP to inflict curse - * - The enemy Pokemon (with Magic Guard) is cursed - * - The enemy Pokemon (with Magic Guard) does not lose HP from being cursed - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - expect(enemyPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + /** + * Expect: + * - The player Pokemon (with Magic Guard) has cut its HP to inflict curse + * - The enemy Pokemon (with Magic Guard) is cursed + * - The enemy Pokemon (with Magic Guard) does not lose HP from being cursed + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); it("Magic Guard prevents crash damage", async () => { - game.override.moveset([ Moves.HIGH_JUMP_KICK ]); - await game.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.HIGH_JUMP_KICK]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -260,16 +241,15 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) misses High Jump Kick but does not lose HP as a result - */ + * Expect: + * - The player Pokemon (with Magic Guard) misses High Jump Kick but does not lose HP as a result + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard prevents damage from recoil", async () => { - game.override.moveset([ Moves.TAKE_DOWN ]); - await game.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.TAKE_DOWN]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -278,16 +258,15 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil - */ + * Expect: + * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard does not prevent damage from Struggle's recoil", async () => { - game.override.moveset([ Moves.STRUGGLE ]); - await game.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.STRUGGLE]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -296,17 +275,16 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil - */ + * Expect: + * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil + */ expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); + }); //This tests different move attributes than the recoil tests above it("Magic Guard prevents self-damage from attacking moves", async () => { - game.override.moveset([ Moves.STEEL_BEAM ]); - await game.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.STEEL_BEAM]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -315,12 +293,11 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a move with an HP cost but does not lose HP from using it - */ + * Expect: + * - The player Pokemon (with Magic Guard) uses a move with an HP cost but does not lose HP from using it + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); /* it("Magic Guard does not prevent self-damage from confusion", async () => { @@ -333,8 +310,8 @@ describe("Abilities - Magic Guard", () => { */ it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { - game.override.moveset([ Moves.BELLY_DRUM ]); - await game.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.BELLY_DRUM]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -343,21 +320,20 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a non-attacking move with an HP cost and thus loses HP from using it - */ + * Expect: + * - The player Pokemon (with Magic Guard) uses a non-attacking move with an HP cost and thus loses HP from using it + */ expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async () => { //Tests the ability Bad Dreams game.override.statusEffect(StatusEffect.SLEEP); //enemy pokemon is given Spore just in case player pokemon somehow awakens during test - game.override.enemyMoveset([ Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE ]); + game.override.enemyMoveset([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); game.override.enemyAbility(Abilities.BAD_DREAMS); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -366,21 +342,20 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon is asleep - */ + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon is asleep + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); expect(leadPokemon.status!.effect).toBe(StatusEffect.SLEEP); - } - ); + }); it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async () => { //Tests the abilities Innards Out/Aftermath - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.AFTERMATH); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -391,21 +366,20 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The enemy Pokemon has fainted - */ + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The enemy Pokemon has fainted + */ expect(enemyPokemon.hp).toBe(0); expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async () => { //Tests the abilities Iron Barbs/Rough Skin - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.IRON_BARBS); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -415,21 +389,20 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon's move should have connected - */ + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async () => { //Tests the ability Liquid Ooze - game.override.moveset([ Moves.ABSORB ]); + game.override.moveset([Moves.ABSORB]); game.override.enemyAbility(Abilities.LIQUID_OOZE); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; @@ -439,30 +412,28 @@ describe("Abilities - Magic Guard", () => { await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon's move should have connected - */ + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async () => { //Tests the abilities Solar Power/Dry Skin game.override.passiveAbility(Abilities.SOLAR_POWER); game.override.weather(WeatherType.SUNNY); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - */ + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + */ expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + }); }); diff --git a/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts index 63f8bb5b15e..df6f7905c83 100644 --- a/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -23,7 +23,7 @@ describe("Abilities - Mimicry", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.MIMICRY) .battleType("single") .disableCrits() @@ -33,9 +33,9 @@ describe("Abilities - Mimicry", () => { it("Mimicry activates after the Pokémon with Mimicry is switched in while terrain is present, or whenever there is a change in terrain", async () => { game.override.enemyAbility(Abilities.MISTY_SURGE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.ABRA ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.ABRA]); - const [ playerPokemon1, playerPokemon2 ] = game.scene.getPlayerParty(); + const [playerPokemon1, playerPokemon2] = game.scene.getPlayerParty(); game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(playerPokemon1.getTypes().includes(PokemonType.FAIRY)).toBe(true); @@ -48,10 +48,10 @@ describe("Abilities - Mimicry", () => { it("Pokemon should revert back to its original, root type once terrain ends", async () => { game.override - .moveset([ Moves.SPLASH, Moves.TRANSFORM ]) + .moveset([Moves.SPLASH, Moves.TRANSFORM]) .enemyAbility(Abilities.MIMICRY) - .enemyMoveset([ Moves.SPLASH, Moves.PSYCHIC_TERRAIN ]); - await game.classicMode.startBattle([ Species.REGIELEKI ]); + .enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.TRANSFORM); @@ -70,9 +70,8 @@ describe("Abilities - Mimicry", () => { }); 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([ Moves.FORESTS_CURSE, Moves.GRASSY_TERRAIN ]); - await game.classicMode.startBattle([ Species.FEEBAS ]); + game.override.enemyMoveset([Moves.FORESTS_CURSE, Moves.GRASSY_TERRAIN]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.SPLASH); diff --git a/test/abilities/mirror_armor.test.ts b/test/abilities/mirror_armor.test.ts index 1d103c45be1..6b0c3f10c84 100644 --- a/test/abilities/mirror_armor.test.ts +++ b/test/abilities/mirror_armor.test.ts @@ -26,19 +26,20 @@ describe("Ability - Mirror Armor", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.RATTATA) - .enemyMoveset([ Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK ]) + .enemyMoveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK]) .enemyAbility(Abilities.BALL_FETCH) .startingLevel(2000) - .moveset([ Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK ]) + .moveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK]) .ability(Abilities.BALL_FETCH); }); it("Player side + single battle Intimidate - opponent loses stats", async () => { game.override.ability(Abilities.MIRROR_ARMOR); game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -55,7 +56,7 @@ describe("Ability - Mirror Armor", () => { it("Enemy side + single battle Intimidate - player loses stats", async () => { game.override.enemyAbility(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -73,10 +74,10 @@ describe("Ability - Mirror Armor", () => { game.override.battleType("double"); game.override.ability(Abilities.MIRROR_ARMOR); game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); // Enemy has intimidate, enemy should lose -2 atk each game.move.select(Moves.SPLASH); @@ -95,10 +96,10 @@ describe("Ability - Mirror Armor", () => { game.override.battleType("double"); game.override.enemyAbility(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); // Enemy has intimidate, enemy should lose -1 atk game.move.select(Moves.SPLASH); @@ -116,7 +117,7 @@ describe("Ability - Mirror Armor", () => { it("Player side + single battle Intimidate + Tickle - opponent loses stats", async () => { game.override.ability(Abilities.MIRROR_ARMOR); game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -136,10 +137,10 @@ describe("Ability - Mirror Armor", () => { game.override.battleType("double"); game.override.ability(Abilities.MIRROR_ARMOR); game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -155,13 +156,12 @@ describe("Ability - Mirror Armor", () => { expect(enemy1.getStatStage(Stat.DEF)).toBe(-1); expect(enemy2.getStatStage(Stat.ATK)).toBe(-3); expect(enemy2.getStatStage(Stat.DEF)).toBe(-1); - }); it("Enemy side + single battle Intimidate + Tickle - player loses stats", async () => { game.override.enemyAbility(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -180,7 +180,7 @@ describe("Ability - Mirror Armor", () => { it("Player side + single battle Intimidate + oppoenent has white smoke - no one loses stats", async () => { game.override.enemyAbility(Abilities.WHITE_SMOKE); game.override.ability(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -199,7 +199,7 @@ describe("Ability - Mirror Armor", () => { it("Enemy side + single battle Intimidate + player has white smoke - no one loses stats", async () => { game.override.ability(Abilities.WHITE_SMOKE); game.override.enemyAbility(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -217,7 +217,7 @@ describe("Ability - Mirror Armor", () => { it("Player side + single battle + opponent uses octolock - does not interact with mirror armor, player loses stats", async () => { game.override.ability(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -235,7 +235,7 @@ describe("Ability - Mirror Armor", () => { it("Enemy side + single battle + player uses octolock - does not interact with mirror armor, opponent loses stats", async () => { game.override.enemyAbility(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -255,7 +255,7 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -270,7 +270,7 @@ describe("Ability - Mirror Armor", () => { it("Single battle + sticky web applied player side - player switches out and enemy should lose -1 speed", async () => { game.override.ability(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); const enemyPokemon = game.scene.getEnemyPokemon()!; const userPokemon = game.scene.getPlayerPokemon()!; @@ -290,10 +290,10 @@ describe("Ability - Mirror Armor", () => { it("Double battle + sticky web applied player side - player switches out and enemy 1 should lose -1 speed", async () => { game.override.battleType("double"); game.override.ability(Abilities.MIRROR_ARMOR); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); - const [ player1, player2 ] = game.scene.getPlayerField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); diff --git a/test/abilities/moody.test.ts b/test/abilities/moody.test.ts index 64c2c7d8a07..da24899a4b0 100644 --- a/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -32,57 +32,56 @@ describe("Abilities - Moody", () => { .moveset(Moves.SPLASH); }); - it("should increase one stat stage by 2 and decrease a different stat stage by 1", - async () => { - await game.classicMode.startBattle(); + 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()!; - game.move.select(Moves.SPLASH); - await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.toNextTurn(); - // Find the increased and decreased stats, make sure they are different. - const changedStats = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 2 || playerPokemon.getStatStage(s) === -1); + // Find the increased and decreased stats, make sure they are different. + const changedStats = EFFECTIVE_STATS.filter( + s => playerPokemon.getStatStage(s) === 2 || playerPokemon.getStatStage(s) === -1, + ); - expect(changedStats).toBeTruthy(); - expect(changedStats.length).toBe(2); - expect(changedStats[0] !== changedStats[1]).toBeTruthy(); - }); + expect(changedStats).toBeTruthy(); + expect(changedStats.length).toBe(2); + expect(changedStats[0] !== changedStats[1]).toBeTruthy(); + }); - it("should only increase one stat stage by 2 if all stat stages are at -6", - async () => { - await game.classicMode.startBattle(); + 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.scene.getPlayerPokemon()!; - // Set all stat stages to -6 - vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); + // Set all stat stages to -6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); - // Should increase one stat stage by 2 (from -6, meaning it will be -4) - const increasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === -4); + // Should increase one stat stage by 2 (from -6, meaning it will be -4) + const increasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === -4); - expect(increasedStat).toBeTruthy(); - expect(increasedStat.length).toBe(1); - }); + expect(increasedStat).toBeTruthy(); + expect(increasedStat.length).toBe(1); + }); - it("should only decrease one stat stage by 1 stage if all stat stages are at 6", - async () => { - await game.classicMode.startBattle(); + it("should only decrease one stat stage by 1 stage if all stat stages are at 6", async () => { + await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; - // Set all stat stages to 6 - vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); + // Set all stat stages to 6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); - // Should decrease one stat stage by 1 (from 6, meaning it will be 5) - const decreasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 5); + // Should decrease one stat stage by 1 (from 6, meaning it will be 5) + const decreasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 5); - expect(decreasedStat).toBeTruthy(); - expect(decreasedStat.length).toBe(1); - }); + expect(decreasedStat).toBeTruthy(); + expect(decreasedStat.length).toBe(1); + }); }); diff --git a/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts index c518c55671f..ec93aebd2c0 100644 --- a/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -32,16 +32,13 @@ describe("Abilities - Moxie", () => { game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.MOXIE); game.override.startingLevel(2000); - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should raise ATK stat stage by 1 when winning a battle", async() => { + it("should raise ATK stat stage by 1 when winning a battle", async () => { const moveToUse = Moves.AERIAL_ACE; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -54,25 +51,26 @@ describe("Abilities - Moxie", () => { }, 20000); // TODO: Activate this test when MOXIE is corrected to work on faint and not on battle victory - it.todo("should raise ATK stat stage by 1 when defeating an ally Pokemon", async() => { - game.override.battleType("double"); - const moveToUse = Moves.AERIAL_ACE; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + it.todo( + "should raise ATK stat stage by 1 when defeating an ally Pokemon", + async () => { + game.override.battleType("double"); + const moveToUse = Moves.AERIAL_ACE; + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); - const [ firstPokemon, secondPokemon ] = game.scene.getPlayerField(); + const [firstPokemon, secondPokemon] = game.scene.getPlayerField(); - expect(firstPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(firstPokemon.getStatStage(Stat.ATK)).toBe(0); - secondPokemon.hp = 1; + secondPokemon.hp = 1; - game.move.select(moveToUse); - game.selectTarget(BattlerIndex.PLAYER_2); + game.move.select(moveToUse); + game.selectTarget(BattlerIndex.PLAYER_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(firstPokemon.getStatStage(Stat.ATK)).toBe(1); - }, 20000); + expect(firstPokemon.getStatStage(Stat.ATK)).toBe(1); + }, + 20000, + ); }); diff --git a/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts index 96b5e170c14..0971353c14d 100644 --- a/test/abilities/mummy.test.ts +++ b/test/abilities/mummy.test.ts @@ -22,7 +22,7 @@ describe("Abilities - Mummy", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.MUMMY) .battleType("single") .disableCrits() @@ -32,7 +32,7 @@ describe("Abilities - Mummy", () => { }); it("should set the enemy's ability to mummy when hit by a contact move", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -42,7 +42,7 @@ describe("Abilities - Mummy", () => { it("should not change the enemy's ability hit by a non-contact move", async () => { game.override.enemyMoveset(Moves.EARTHQUAKE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts index 2c0bd39b32a..8c7796ec736 100644 --- a/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -28,9 +28,9 @@ describe("Abilities - Mycelium Might", () => { game.override.disableCrits(); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.CLEAR_BODY); - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); game.override.ability(Abilities.MYCELIUM_MIGHT); - game.override.moveset([ Moves.QUICK_ATTACK, Moves.BABY_DOLL_EYES ]); + game.override.moveset([Moves.QUICK_ATTACK, Moves.BABY_DOLL_EYES]); }); /** @@ -41,7 +41,7 @@ describe("Abilities - Mycelium Might", () => { **/ it("will move last in its priority bracket and ignore protective abilities", async () => { - await game.startBattle([ Species.REGIELEKI ]); + await game.startBattle([Species.REGIELEKI]); const enemyPokemon = game.scene.getEnemyPokemon(); const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); @@ -55,8 +55,8 @@ describe("Abilities - Mycelium Might", () => { const commandOrder = phase.getCommandOrder(); // The opponent Pokemon (without Mycelium Might) goes first despite having lower speed than the player Pokemon. // The player Pokemon (with Mycelium Might) goes last despite having higher speed than the opponent. - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); await game.phaseInterceptor.to(TurnEndPhase); // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced. @@ -64,8 +64,8 @@ describe("Abilities - Mycelium Might", () => { }, 20000); it("will 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([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - await game.startBattle([ Species.REGIELEKI ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + await game.startBattle([Species.REGIELEKI]); const enemyPokemon = game.scene.getEnemyPokemon(); const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); @@ -79,15 +79,15 @@ describe("Abilities - Mycelium Might", () => { const commandOrder = phase.getCommandOrder(); // The player Pokemon (with M.M.) goes first because its move is still within a higher priority bracket than its opponent. // The enemy Pokemon goes second because its move is in a lower priority bracket. - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + 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); }, 20000); it("will not affect non-status moves", async () => { - await game.startBattle([ Species.REGIELEKI ]); + await game.startBattle([Species.REGIELEKI]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -101,7 +101,7 @@ describe("Abilities - Mycelium Might", () => { // The player Pokemon (with M.M.) goes first because it has a higher speed and did not use a status move. // The enemy Pokemon (without M.M.) goes second because its speed is lower. // This means that the commandOrder should be identical to the speedOrder - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); }, 20000); }); diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index a0612078e64..2bba5b83987 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -26,7 +26,7 @@ describe("Abilities - Neutralizing Gas", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.NEUTRALIZING_GAS) .battleType("single") .disableCrits() @@ -37,7 +37,7 @@ describe("Abilities - Neutralizing Gas", () => { it("should prevent other abilities from activating", async () => { game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); @@ -48,7 +48,7 @@ describe("Abilities - Neutralizing Gas", () => { it("should allow the user's passive to activate", async () => { game.override.passiveAbility(Abilities.INTREPID_SWORD); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); @@ -57,11 +57,9 @@ describe("Abilities - Neutralizing Gas", () => { }); it.todo("should activate before other abilities", async () => { - game.override.enemySpecies(Species.ACCELGOR) - .enemyLevel(100) - .enemyAbility(Abilities.INTIMIDATE); + game.override.enemySpecies(Species.ACCELGOR).enemyLevel(100).enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); @@ -71,11 +69,12 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should activate other abilities when removed", async () => { - game.override.enemyAbility(Abilities.INTREPID_SWORD) + game.override + .enemyAbility(Abilities.INTREPID_SWORD) .enemyPassiveAbility(Abilities.DAUNTLESS_SHIELD) .enemyMoveset(Moves.ENTRAINMENT); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemyPokemon = game.scene.getEnemyPokemon(); expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(0); @@ -89,10 +88,9 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should not activate the user's other ability when removed", async () => { - game.override.passiveAbility(Abilities.INTIMIDATE) - .enemyMoveset(Moves.ENTRAINMENT); + game.override.passiveAbility(Abilities.INTIMIDATE).enemyMoveset(Moves.ENTRAINMENT); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); // Neutralising gas user's passive is still active const enemyPokemon = game.scene.getEnemyPokemon(); expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); @@ -104,15 +102,14 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should only deactivate when all setters are off the field", async () => { - game.override.enemyMoveset([ Moves.ENTRAINMENT, Moves.SPLASH ]) - .battleType("double"); + game.override.enemyMoveset([Moves.ENTRAINMENT, Moves.SPLASH]).battleType("double"); - await game.classicMode.startBattle([ Species.ACCELGOR, Species.ACCELGOR ]); + await game.classicMode.startBattle([Species.ACCELGOR, Species.ACCELGOR]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 1); await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); // Now one neut gas user is left @@ -120,7 +117,7 @@ describe("Abilities - Neutralizing Gas", () => { game.move.select(Moves.SPLASH, 1); await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); // No neut gas users are left }); @@ -128,7 +125,7 @@ describe("Abilities - Neutralizing Gas", () => { it("should deactivate when suppressed by gastro acid", async () => { game.override.enemyMoveset(Moves.GASTRO_ACID); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -137,10 +134,9 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should deactivate when the pokemon faints", async () => { - game.override.ability(Abilities.BALL_FETCH) - .enemyAbility(Abilities.NEUTRALIZING_GAS); + game.override.ability(Abilities.BALL_FETCH).enemyAbility(Abilities.NEUTRALIZING_GAS); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); await game.doKillOpponents(); @@ -149,11 +145,8 @@ describe("Abilities - Neutralizing Gas", () => { }); it("should deactivate upon catching a wild pokemon", async () => { - game.override - .battleType("single") - .enemyAbility(Abilities.NEUTRALIZING_GAS) - .ability(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.battleType("single").enemyAbility(Abilities.NEUTRALIZING_GAS).ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([Species.MAGIKARP]); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); game.scene.pokeballCounts[PokeballType.MASTER_BALL] = 1; diff --git a/test/abilities/no_guard.test.ts b/test/abilities/no_guard.test.ts index 1a319eb2611..41b8fbd27b9 100644 --- a/test/abilities/no_guard.test.ts +++ b/test/abilities/no_guard.test.ts @@ -35,13 +35,11 @@ describe("Abilities - No Guard", () => { it("should make moves always hit regardless of move accuracy", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ - Species.REGIELEKI - ]); + await game.classicMode.startBattle([Species.REGIELEKI]); game.move.select(Moves.ZAP_CANNON); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); @@ -54,11 +52,7 @@ describe("Abilities - No Guard", () => { }); it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); await game.classicMode.startBattle(); diff --git a/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts index 55dc39bfbbd..2aa24e78d6e 100644 --- a/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -10,7 +10,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - Parental Bond", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,444 +36,380 @@ describe("Abilities - Parental Bond", () => { game.override.enemyLevel(100); }); - it( - "should add second strike to attack move", - async () => { - game.override.moveset([ Moves.TACKLE ]); + it("should add second strike to attack move", async () => { + game.override.moveset([Moves.TACKLE]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - let enemyStartingHp = enemyPokemon.hp; + let enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("DamageAnimPhase"); - const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; - enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to("DamageAnimPhase"); + const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; + enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; + const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(secondStrikeDamage).toBe(toDmgValue(0.25 * firstStrikeDamage)); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(secondStrikeDamage).toBe(toDmgValue(0.25 * firstStrikeDamage)); + }); - it( - "should apply secondary effects to both strikes", - async () => { - game.override.moveset([ Moves.POWER_UP_PUNCH ]); - game.override.enemySpecies(Species.AMOONGUSS); + it("should apply secondary effects to both strikes", async () => { + game.override.moveset([Moves.POWER_UP_PUNCH]); + game.override.enemySpecies(Species.AMOONGUSS); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.POWER_UP_PUNCH); + game.move.select(Moves.POWER_UP_PUNCH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); - it( - "should not apply to Status moves", - async () => { - game.override.moveset([ Moves.BABY_DOLL_EYES ]); + it("should not apply to Status moves", async () => { + game.override.moveset([Moves.BABY_DOLL_EYES]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BABY_DOLL_EYES); + game.move.select(Moves.BABY_DOLL_EYES); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); - } - ); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + }); - it( - "should not apply to multi-hit moves", - async () => { - game.override.moveset([ Moves.DOUBLE_HIT ]); + it("should not apply to multi-hit moves", async () => { + game.override.moveset([Moves.DOUBLE_HIT]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.DOUBLE_HIT); - await game.move.forceHit(); + game.move.select(Moves.DOUBLE_HIT); + await game.move.forceHit(); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(2); + }); - it( - "should not apply to self-sacrifice moves", - async () => { - game.override.moveset([ Moves.SELF_DESTRUCT ]); + it("should not apply to self-sacrifice moves", async () => { + game.override.moveset([Moves.SELF_DESTRUCT]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SELF_DESTRUCT); + game.move.select(Moves.SELF_DESTRUCT); - await game.phaseInterceptor.to("DamageAnimPhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(1); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(1); + }); - it( - "should not apply to Rollout", - async () => { - game.override.moveset([ Moves.ROLLOUT ]); + it("should not apply to Rollout", async () => { + game.override.moveset([Moves.ROLLOUT]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.ROLLOUT); - await game.move.forceHit(); + game.move.select(Moves.ROLLOUT); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(1); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(1); + }); - it( - "should not apply multiplier to fixed-damage moves", - async () => { - game.override.moveset([ Moves.DRAGON_RAGE ]); + it("should not apply multiplier to fixed-damage moves", async () => { + game.override.moveset([Moves.DRAGON_RAGE]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.DRAGON_RAGE); - await game.phaseInterceptor.to("BerryPhase", false); + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 80); - } - ); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 80); + }); - it( - "should not apply multiplier to counter moves", - async () => { - game.override.moveset([ Moves.COUNTER ]); - game.override.enemyMoveset([ Moves.TACKLE ]); + it("should not apply multiplier to counter moves", async () => { + game.override.moveset([Moves.COUNTER]); + game.override.enemyMoveset([Moves.TACKLE]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.COUNTER); - await game.phaseInterceptor.to("DamageAnimPhase"); + game.move.select(Moves.COUNTER); + await game.phaseInterceptor.to("DamageAnimPhase"); - const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; + const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 4 * playerDamage); - } - ); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 4 * playerDamage); + }); - it( - "should not apply to multi-target moves", - async () => { - game.override.battleType("double"); - game.override.moveset([ Moves.EARTHQUAKE ]); - game.override.passiveAbility(Abilities.LEVITATE); + it("should not apply to multi-target moves", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE]); + game.override.passiveAbility(Abilities.LEVITATE); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.EARTHQUAKE); - game.move.select(Moves.EARTHQUAKE, 1); + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.EARTHQUAKE, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); - } - ); + playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + }); - it( - "should apply to multi-target moves when hitting only one target", - async () => { - game.override.moveset([ Moves.EARTHQUAKE ]); + it("should apply to multi-target moves when hitting only one target", async () => { + game.override.moveset([Moves.EARTHQUAKE]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.EARTHQUAKE); - await game.phaseInterceptor.to("DamageAnimPhase", false); + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to("DamageAnimPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(2); + }); - it( - "should only trigger post-target move effects once", - async () => { - game.override.moveset([ Moves.MIND_BLOWN ]); + it("should only trigger post-target move effects once", async () => { + game.override.moveset([Moves.MIND_BLOWN]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.MIND_BLOWN); + game.move.select(Moves.MIND_BLOWN); - await game.phaseInterceptor.to("DamageAnimPhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); - expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.turnData.hitCount).toBe(2); - // This test will time out if the user faints - await game.phaseInterceptor.to("BerryPhase", false); + // This test will time out if the user faints + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() / 2)); - } - ); + expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() / 2)); + }); - it( - "Burn Up only removes type after the second strike", - async () => { - game.override.moveset([ Moves.BURN_UP ]); + it("Burn Up only removes type after the second strike", async () => { + game.override.moveset([Moves.BURN_UP]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BURN_UP); + game.move.select(Moves.BURN_UP); - await game.phaseInterceptor.to("MoveEffectPhase"); + await game.phaseInterceptor.to("MoveEffectPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.hp).toBeGreaterThan(0); - expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(true); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.hp).toBeGreaterThan(0); + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(true); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(false); - } - ); + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(false); + }); - it( - "Moves boosted by this ability and Multi-Lens should strike 3 times", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + it("Moves boosted by this ability and Multi-Lens should strike 3 times", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(3); - } - ); + expect(leadPokemon.turnData.hitCount).toBe(3); + }); - it( - "Seismic Toss boosted by this ability and Multi-Lens should strike 3 times", - async () => { - game.override.moveset([ Moves.SEISMIC_TOSS ]); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + it("Seismic Toss boosted by this ability and Multi-Lens should strike 3 times", async () => { + game.override.moveset([Moves.SEISMIC_TOSS]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyStartingHp = enemyPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.SEISMIC_TOSS); - await game.move.forceHit(); + game.move.select(Moves.SEISMIC_TOSS); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(3); + expect(leadPokemon.turnData.hitCount).toBe(3); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); - } - ); + expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); + }); - it( - "Hyper Beam boosted by this ability should strike twice, then recharge", - async () => { - game.override.moveset([ Moves.HYPER_BEAM ]); + it("Hyper Beam boosted by this ability should strike twice, then recharge", async () => { + game.override.moveset([Moves.HYPER_BEAM]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.HYPER_BEAM); - await game.move.forceHit(); + game.move.select(Moves.HYPER_BEAM); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); - } - ); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + }); - it( - "Anchor Shot boosted by this ability should only trap the target after the second hit", - async () => { - game.override.moveset([ Moves.ANCHOR_SHOT ]); + it("Anchor Shot boosted by this ability should only trap the target after the second hit", async () => { + game.override.moveset([Moves.ANCHOR_SHOT]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.ANCHOR_SHOT); - await game.move.forceHit(); + game.move.select(Moves.ANCHOR_SHOT); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - await game.phaseInterceptor.to("MoveEndPhase"); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + }); - it( - "Smack Down boosted by this ability should only ground the target after the second hit", - async () => { - game.override.moveset([ Moves.SMACK_DOWN ]); + it("Smack Down boosted by this ability should only ground the target after the second hit", async () => { + game.override.moveset([Moves.SMACK_DOWN]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SMACK_DOWN); - await game.move.forceHit(); + game.move.select(Moves.SMACK_DOWN); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + }); - it( - "U-turn boosted by this ability should strike twice before forcing a switch", - async () => { - game.override.moveset([ Moves.U_TURN ]); + it("U-turn boosted by this ability should strike twice before forcing a switch", async () => { + game.override.moveset([Moves.U_TURN]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.U_TURN); - await game.move.forceHit(); + game.move.select(Moves.U_TURN); + await game.move.forceHit(); - await game.phaseInterceptor.to("MoveEffectPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(leadPokemon.turnData.hitCount).toBe(2); - // This will cause this test to time out if the switch was forced on the first hit. - await game.phaseInterceptor.to("MoveEffectPhase", false); - } - ); + // This will cause this test to time out if the switch was forced on the first hit. + await game.phaseInterceptor.to("MoveEffectPhase", false); + }); - it( - "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", - async () => { - game.override.moveset([ Moves.WAKE_UP_SLAP ]).enemyStatusEffect(StatusEffect.SLEEP); + it("Wake-Up Slap boosted by this ability should only wake up the target after the second hit", async () => { + game.override.moveset([Moves.WAKE_UP_SLAP]).enemyStatusEffect(StatusEffect.SLEEP); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.WAKE_UP_SLAP); - await game.move.forceHit(); + game.move.select(Moves.WAKE_UP_SLAP); + await game.move.forceHit(); - await game.phaseInterceptor.to("DamageAnimPhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.status?.effect).toBeUndefined(); - } - ); + expect(enemyPokemon.status?.effect).toBeUndefined(); + }); - it( - "should not cause user to hit into King's Shield more than once", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.KINGS_SHIELD ]); + it("should not cause user to hit into King's Shield more than once", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.KINGS_SHIELD]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1); - } - ); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1); + }); - it( - "should not cause user to hit into Storm Drain more than once", - async () => { - game.override.moveset([ Moves.WATER_GUN ]); - game.override.enemyAbility(Abilities.STORM_DRAIN); + it("should not cause user to hit into Storm Drain more than once", async () => { + game.override.moveset([Moves.WATER_GUN]); + game.override.enemyAbility(Abilities.STORM_DRAIN); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.WATER_GUN); + game.move.select(Moves.WATER_GUN); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); - } - ); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); + }); it("should not allow Future Sight to hit infinitely many times if the user switches out", async () => { - game.override.enemyLevel(1000) - .moveset(Moves.FUTURE_SIGHT); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + game.override.enemyLevel(1000).moveset(Moves.FUTURE_SIGHT); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "damageAndUpdate"); diff --git a/test/abilities/pastel_veil.test.ts b/test/abilities/pastel_veil.test.ts index cb73a79bae4..65e391b7c22 100644 --- a/test/abilities/pastel_veil.test.ts +++ b/test/abilities/pastel_veil.test.ts @@ -27,14 +27,14 @@ describe("Abilities - Pastel Veil", () => { game = new GameManager(phaserGame); game.override .battleType("double") - .moveset([ Moves.TOXIC_THREAD, Moves.SPLASH ]) + .moveset([Moves.TOXIC_THREAD, Moves.SPLASH]) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SUNKERN) .enemyMoveset(Moves.SPLASH); }); it("prevents the user and its allies from being afflicted by poison", async () => { - await game.startBattle([ Species.MAGIKARP, Species.GALAR_PONYTA ]); + await game.startBattle([Species.MAGIKARP, Species.GALAR_PONYTA]); const ponyta = game.scene.getPlayerField()[1]; const magikarp = game.scene.getPlayerField()[0]; ponyta.abilityIndex = 1; @@ -50,7 +50,7 @@ describe("Abilities - Pastel Veil", () => { }); it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS, Species.GALAR_PONYTA ]); + await game.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.GALAR_PONYTA]); const ponyta = game.scene.getPlayerParty()[2]; const magikarp = game.scene.getPlayerField()[0]; ponyta.abilityIndex = 1; diff --git a/test/abilities/perish_body.test.ts b/test/abilities/perish_body.test.ts index 7084076713a..424d35e2542 100644 --- a/test/abilities/perish_body.test.ts +++ b/test/abilities/perish_body.test.ts @@ -5,7 +5,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Perish Song", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,11 +29,11 @@ describe("Abilities - Perish Song", () => { game.override.starterSpecies(Species.CURSOLA); game.override.ability(Abilities.PERISH_BODY); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); }); it("should trigger when hit with damaging move", async () => { - game.override.enemyMoveset([ Moves.AQUA_JET ]); + game.override.enemyMoveset([Moves.AQUA_JET]); await game.classicMode.startBattle(); const cursola = game.scene.getPlayerPokemon(); const magikarp = game.scene.getEnemyPokemon(); @@ -47,10 +46,8 @@ describe("Abilities - Perish Song", () => { }); it("should trigger even when fainting", async () => { - game.override.enemyMoveset([ Moves.AQUA_JET ]) - .enemyLevel(100) - .startingLevel(1); - await game.classicMode.startBattle([ Species.CURSOLA, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.AQUA_JET]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.CURSOLA, Species.FEEBAS]); const magikarp = game.scene.getEnemyPokemon(); game.move.select(Moves.SPLASH); @@ -61,8 +58,8 @@ describe("Abilities - Perish Song", () => { }); it("should not activate if attacker already has perish song", async () => { - game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.FEEBAS, Species.CURSOLA ]); + game.override.enemyMoveset([Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS, Species.CURSOLA]); const feebas = game.scene.getPlayerPokemon(); const magikarp = game.scene.getEnemyPokemon(); @@ -87,14 +84,13 @@ describe("Abilities - Perish Song", () => { 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 () => { - game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); - game.override.moveset([ Moves.WHIRLWIND, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH]); + game.override.moveset([Moves.WHIRLWIND, Moves.SPLASH]); game.override.startingWave(5); - await game.classicMode.startBattle([ Species.CURSOLA ]); + await game.classicMode.startBattle([Species.CURSOLA]); const cursola = game.scene.getPlayerPokemon(); game.move.select(Moves.WHIRLWIND); diff --git a/test/abilities/power_construct.test.ts b/test/abilities/power_construct.test.ts index b6b7be33753..c253f2ae4df 100644 --- a/test/abilities/power_construct.test.ts +++ b/test/abilities/power_construct.test.ts @@ -8,7 +8,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - POWER CONSTRUCT", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,67 +27,61 @@ describe("Abilities - POWER CONSTRUCT", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.POWER_CONSTRUCT); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - test( - "check if fainted 50% Power Construct Pokemon switches to base form on arena reset", - async () => { - const baseForm = 2, - completeForm = 4; - game.override.startingWave(4); - game.override.starterForms({ - [Species.ZYGARDE]: completeForm, - }); + test("check if fainted 50% Power Construct Pokemon switches to base form on arena reset", async () => { + const baseForm = 2, + completeForm = 4; + game.override.startingWave(4); + game.override.starterForms({ + [Species.ZYGARDE]: completeForm, + }); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.ZYGARDE ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.ZYGARDE]); - const zygarde = game.scene.getPlayerParty().find((p) => p.species.speciesId === Species.ZYGARDE); - expect(zygarde).not.toBe(undefined); - expect(zygarde!.formIndex).toBe(completeForm); + const zygarde = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.ZYGARDE); + expect(zygarde).not.toBe(undefined); + expect(zygarde!.formIndex).toBe(completeForm); - zygarde!.hp = 0; - zygarde!.status = new Status(StatusEffect.FAINT); - expect(zygarde!.isFainted()).toBe(true); + zygarde!.hp = 0; + zygarde!.status = new Status(StatusEffect.FAINT); + expect(zygarde!.isFainted()).toBe(true); - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); - expect(zygarde!.formIndex).toBe(baseForm); - }, - ); + expect(zygarde!.formIndex).toBe(baseForm); + }); - test( - "check if fainted 10% Power Construct Pokemon switches to base form on arena reset", - async () => { - const baseForm = 3, - completeForm = 5; - game.override.startingWave(4); - game.override.starterForms({ - [Species.ZYGARDE]: completeForm, - }); + test("check if fainted 10% Power Construct Pokemon switches to base form on arena reset", async () => { + const baseForm = 3, + completeForm = 5; + game.override.startingWave(4); + game.override.starterForms({ + [Species.ZYGARDE]: completeForm, + }); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.ZYGARDE ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.ZYGARDE]); - const zygarde = game.scene.getPlayerParty().find((p) => p.species.speciesId === Species.ZYGARDE); - expect(zygarde).not.toBe(undefined); - expect(zygarde!.formIndex).toBe(completeForm); + const zygarde = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.ZYGARDE); + expect(zygarde).not.toBe(undefined); + expect(zygarde!.formIndex).toBe(completeForm); - zygarde!.hp = 0; - zygarde!.status = new Status(StatusEffect.FAINT); - expect(zygarde!.isFainted()).toBe(true); + zygarde!.hp = 0; + zygarde!.status = new Status(StatusEffect.FAINT); + expect(zygarde!.isFainted()).toBe(true); - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); - expect(zygarde!.formIndex).toBe(baseForm); - }, - ); + expect(zygarde!.formIndex).toBe(baseForm); + }); }); diff --git a/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts index d4035da33d9..e29b5ecf775 100644 --- a/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM ]); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); @@ -39,7 +39,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.REGIELEKI, Species.STONJOURNER ]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEffectPhase); @@ -53,7 +53,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.REGIELEKI, Species.STONJOURNER ]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEffectPhase); @@ -67,7 +67,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.STONJOURNER, Species.REGIELEKI ]); + await game.startBattle([Species.STONJOURNER, Species.REGIELEKI]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/abilities/protean.test.ts b/test/abilities/protean.test.ts index 6c200f757e9..574033bb13f 100644 --- a/test/abilities/protean.test.ts +++ b/test/abilities/protean.test.ts @@ -13,7 +13,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - Protean", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -34,308 +33,263 @@ describe("Abilities - Protean", () => { game.override.ability(Abilities.PROTEAN); game.override.startingLevel(100); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE ]); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); }); - test( - "ability applies and changes a pokemon's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability applies and changes a pokemon's type", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); // Test for Gen9+ functionality, we are using previous funcionality - test.skip( - "ability applies only once per switch in", - async () => { - game.override.moveset([ Moves.SPLASH, Moves.AGILITY ]); + test.skip("ability applies only once per switch in", async () => { + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR ]); + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); - let leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + let leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - game.move.select(Moves.AGILITY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.AGILITY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.PROTEAN)).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; - const moveType = PokemonType[allMoves[Moves.AGILITY].type]; - expect(leadPokemonType).not.toBe(moveType); + expect(leadPokemon.summonData.abilitiesApplied.filter(a => a === Abilities.PROTEAN)).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; + expect(leadPokemonType).not.toBe(moveType); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); - leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); - test( - "ability applies correctly even if the pokemon's move has a variable type", - async () => { - game.override.moveset([ Moves.WEATHER_BALL ]); + test("ability applies correctly even if the pokemon's move has a variable type", async () => { + game.override.moveset([Moves.WEATHER_BALL]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.move.select(Moves.WEATHER_BALL); - await game.phaseInterceptor.to(TurnEndPhase); + game.scene.arena.weather = new Weather(WeatherType.SUNNY); + game.move.select(Moves.WEATHER_BALL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], - moveType = PokemonType[PokemonType.FIRE]; - expect(leadPokemonType).toBe(moveType); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; + expect(leadPokemonType).toBe(moveType); + }); - test( - "ability applies correctly even if the type has changed by another ability", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.passiveAbility(Abilities.REFRIGERATE); + test("ability applies correctly even if the type has changed by another ability", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], - moveType = PokemonType[PokemonType.ICE]; - expect(leadPokemonType).toBe(moveType); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; + expect(leadPokemonType).toBe(moveType); + }); - test( - "ability applies correctly even if the pokemon's move calls another move", - async () => { - game.override.moveset([ Moves.NATURE_POWER ]); + test("ability applies correctly even if the pokemon's move calls another move", async () => { + game.override.moveset([Moves.NATURE_POWER]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.scene.arena.biomeType = Biome.MOUNTAIN; - game.move.select(Moves.NATURE_POWER); - await game.phaseInterceptor.to(TurnEndPhase); + game.scene.arena.biomeType = Biome.MOUNTAIN; + game.move.select(Moves.NATURE_POWER); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); + }); - test( - "ability applies correctly even if the pokemon's move is delayed / charging", - async () => { - game.override.moveset([ Moves.DIG ]); + test("ability applies correctly even if the pokemon's move is delayed / charging", async () => { + game.override.moveset([Moves.DIG]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.DIG); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.DIG); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); + }); - test( - "ability applies correctly even if the pokemon's move misses", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset(Moves.SPLASH); + test("ability applies correctly even if the pokemon's move misses", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.move.forceMiss(); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); + await game.phaseInterceptor.to(TurnEndPhase); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon.isFullHp()).toBe(true); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability applies correctly even if the pokemon's move is protected against", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); + test("ability applies correctly even if the pokemon's move is protected against", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability applies correctly even if the pokemon's move fails because of type immunity", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemySpecies(Species.GASTLY); + test("ability applies correctly even if the pokemon's move fails because of type immunity", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); - test( - "ability is not applied if pokemon's type is the same as the move's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability is not applied if pokemon's type is the same as the move's type", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - leadPokemon.summonData.types = [ allMoves[Moves.SPLASH].type ]; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); - test( - "ability is not applied if pokemon is terastallized", - async () => { - game.override.moveset([ Moves.SPLASH ]); + test("ability is not applied if pokemon is terastallized", async () => { + game.override.moveset([Moves.SPLASH]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - leadPokemon.isTerastallized = true; + leadPokemon.isTerastallized = true; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); - test( - "ability is not applied if pokemon uses struggle", - async () => { - game.override.moveset([ Moves.STRUGGLE ]); + test("ability is not applied if pokemon uses struggle", async () => { + game.override.moveset([Moves.STRUGGLE]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.STRUGGLE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.STRUGGLE); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); - test( - "ability is not applied if the pokemon's move fails", - async () => { - game.override.moveset([ Moves.BURN_UP ]); + test("ability is not applied if the pokemon's move fails", async () => { + game.override.moveset([Moves.BURN_UP]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.BURN_UP); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BURN_UP); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); - test( - "ability applies correctly even if the pokemon's Trick-or-Treat fails", - async () => { - game.override.moveset([ Moves.TRICK_OR_TREAT ]); - game.override.enemySpecies(Species.GASTLY); + test("ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.TRICK_OR_TREAT); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); + }); - test( - "ability applies correctly and the pokemon curses itself", - async () => { - game.override.moveset([ Moves.CURSE ]); + test("ability applies correctly and the pokemon curses itself", async () => { + game.override.moveset([Moves.CURSE]); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); - game.move.select(Moves.CURSE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to(TurnEndPhase); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); - expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - }, - ); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); + expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + }); }); function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { diff --git a/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts index a122fbad797..d0ae46cd951 100644 --- a/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Protosynthesis", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.TACKLE ]) + .moveset([Moves.SPLASH, Moves.TACKLE]) .ability(Abilities.PROTOSYNTHESIS) .battleType("single") .disableCrits() @@ -34,13 +34,14 @@ describe("Abilities - Protosynthesis", () => { .enemyMoveset(Moves.SPLASH); }); - it("should not consider temporary items when determining which stat to boost", async() => { + it("should not consider temporary items when determining which stat to boost", async () => { // Mew has uniform base stats - game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.DEF }]) + game.override + .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.DEF }]) .enemyMoveset(Moves.SUNNY_DAY) .startingLevel(100) .enemyLevel(100); - await game.classicMode.startBattle([ Species.MEW ]); + await game.classicMode.startBattle([Species.MEW]); const mew = game.scene.getPlayerPokemon()!; // Nature of starting mon is randomized. We need to fix it to a neutral nature for the automated test. mew.setNature(Nature.HARDY); @@ -49,14 +50,14 @@ describe("Abilities - Protosynthesis", () => { const atk_before_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); const initialHp = enemy.hp; game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const unboosted_dmg = initialHp - enemy.hp; enemy.hp = initialHp; const def_after_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); const atk_after_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const boosted_dmg = initialHp - enemy.hp; expect(boosted_dmg).toBeGreaterThan(unboosted_dmg); diff --git a/test/abilities/quick_draw.test.ts b/test/abilities/quick_draw.test.ts index c451218a56c..9969dc2aa75 100644 --- a/test/abilities/quick_draw.test.ts +++ b/test/abilities/quick_draw.test.ts @@ -27,14 +27,16 @@ describe("Abilities - Quick Draw", () => { game.override.starterSpecies(Species.MAGIKARP); game.override.ability(Abilities.QUICK_DRAW); - game.override.moveset([ Moves.TACKLE, Moves.TAIL_WHIP ]); + game.override.moveset([Moves.TACKLE, Moves.TAIL_WHIP]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); - vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); + vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue( + 100, + ); }); test("makes pokemon going first in its priority bracket", async () => { @@ -54,28 +56,31 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - test("does not triggered by non damage moves", { - retry: 5 - }, async () => { - await game.startBattle(); + test( + "does not triggered by non damage moves", + { + retry: 5, + }, + async () => { + await game.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pokemon = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; - pokemon.hp = 1; - enemy.hp = 1; + pokemon.hp = 1; + enemy.hp = 1; - game.move.select(Moves.TAIL_WHIP); - await game.phaseInterceptor.to(FaintPhase, false); + game.move.select(Moves.TAIL_WHIP); + await game.phaseInterceptor.to(FaintPhase, false); - expect(pokemon.isFainted()).toBe(true); - expect(enemy.isFainted()).toBe(false); - expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); - } + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); + }, ); test("does not increase priority", async () => { - game.override.enemyMoveset([ Moves.EXTREME_SPEED ]); + game.override.enemyMoveset([Moves.EXTREME_SPEED]); await game.startBattle(); diff --git a/test/abilities/sand_spit.test.ts b/test/abilities/sand_spit.test.ts index dafae695d3b..6896c286eed 100644 --- a/test/abilities/sand_spit.test.ts +++ b/test/abilities/sand_spit.test.ts @@ -6,7 +6,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Sand Spit", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,11 +30,11 @@ describe("Abilities - Sand Spit", () => { game.override.starterSpecies(Species.SILICOBRA); game.override.ability(Abilities.SAND_SPIT); - game.override.moveset([ Moves.SPLASH, Moves.COIL ]); + game.override.moveset([Moves.SPLASH, Moves.COIL]); }); it("should trigger when hit with damaging move", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); @@ -45,10 +44,8 @@ describe("Abilities - Sand Spit", () => { }, 20000); it("should trigger even when fainting", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]) - .enemyLevel(100) - .startingLevel(1); - await game.classicMode.startBattle([ Species.SILICOBRA, Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.TACKLE]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.SILICOBRA, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.doSelectPartyPokemon(1); @@ -58,7 +55,7 @@ describe("Abilities - Sand Spit", () => { }); it("should not trigger when targetted with status moves", async () => { - game.override.enemyMoveset([ Moves.GROWL ]); + game.override.enemyMoveset([Moves.GROWL]); await game.classicMode.startBattle(); game.move.select(Moves.COIL); diff --git a/test/abilities/sand_veil.test.ts b/test/abilities/sand_veil.test.ts index 0128276075b..5e0a3f567dd 100644 --- a/test/abilities/sand_veil.test.ts +++ b/test/abilities/sand_veil.test.ts @@ -11,7 +11,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; - describe("Abilities - Sand Veil", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,52 +27,47 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); game.override.enemySpecies(Species.MEOWSCARADA); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER ]); + game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override - .weather(WeatherType.SANDSTORM) - .battleType("double"); + game.override.weather(WeatherType.SANDSTORM).battleType("double"); }); - test( - "ability should increase the evasiveness of the source", - async () => { - await game.startBattle([ Species.SNORLAX, Species.BLISSEY ]); + test("ability should increase the evasiveness of the source", async () => { + await game.startBattle([Species.SNORLAX, Species.BLISSEY]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]); + vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]); - const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(StatMultiplierAbAttr)[0]; - vi.spyOn(sandVeilAttr, "applyStatStage").mockImplementation( - (_pokemon, _passive, _simulated, stat, statValue, _args) => { - if (stat === Stat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { - statValue.value *= -1; // will make all attacks miss - return true; - } - return false; + const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(StatMultiplierAbAttr)[0]; + vi.spyOn(sandVeilAttr, "applyStatStage").mockImplementation( + (_pokemon, _passive, _simulated, stat, statValue, _args) => { + if (stat === Stat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + statValue.value *= -1; // will make all attacks miss + return true; } - ); + return false; + }, + ); - expect(leadPokemon[0].hasAbility(Abilities.SAND_VEIL)).toBe(true); - expect(leadPokemon[1].hasAbility(Abilities.SAND_VEIL)).toBe(false); + expect(leadPokemon[0].hasAbility(Abilities.SAND_VEIL)).toBe(true); + expect(leadPokemon[1].hasAbility(Abilities.SAND_VEIL)).toBe(false); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.phaseInterceptor.to(MoveEffectPhase, false); - await game.phaseInterceptor.to(MoveEndPhase, false); + await game.phaseInterceptor.to(MoveEndPhase, false); - expect(leadPokemon[0].isFullHp()).toBe(true); - expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); - } - ); + expect(leadPokemon[0].isFullHp()).toBe(true); + expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); + }); }); diff --git a/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts index 8294d2e1d69..f4f02844cbc 100644 --- a/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -28,7 +28,8 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .disableCrits() .ability(Abilities.SAP_SIPPER) .enemySpecies(Species.RATTATA) @@ -36,12 +37,12 @@ describe("Abilities - Sap Sipper", () => { .enemyMoveset(Moves.SPLASH); }); - it("raises ATK stat stage by 1 and block effects when activated against a grass attack", async() => { + it("raises ATK stat stage by 1 and block effects when activated against a grass attack", async () => { const moveToUse = Moves.LEAFAGE; game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -54,12 +55,12 @@ describe("Abilities - Sap Sipper", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); }); - it("raises ATK stat stage by 1 and block effects when activated against a grass status move", async() => { + it("raises ATK stat stage by 1 and block effects when activated against a grass status move", async () => { const moveToUse = Moves.SPORE; game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -76,7 +77,7 @@ describe("Abilities - Sap Sipper", () => { game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); game.move.select(moveToUse); @@ -92,7 +93,7 @@ describe("Abilities - Sap Sipper", () => { game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -110,7 +111,7 @@ describe("Abilities - Sap Sipper", () => { game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -134,7 +135,7 @@ describe("Abilities - Sap Sipper", () => { game.override.moveset(moveToUse); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -150,7 +151,7 @@ describe("Abilities - Sap Sipper", () => { it("still activates regardless of accuracy check", async () => { game.override.moveset(Moves.LEAF_BLADE); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/schooling.test.ts b/test/abilities/schooling.test.ts index a52c6a06f12..35244b08e4c 100644 --- a/test/abilities/schooling.test.ts +++ b/test/abilities/schooling.test.ts @@ -8,7 +8,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - SCHOOLING", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,37 +27,34 @@ describe("Abilities - SCHOOLING", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.SCHOOLING); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - test( - "check if fainted pokemon switches to base form on arena reset", - async () => { - const soloForm = 0, - schoolForm = 1; - game.override.startingWave(4); - game.override.starterForms({ - [Species.WISHIWASHI]: schoolForm, - }); + test("check if fainted pokemon switches to base form on arena reset", async () => { + const soloForm = 0, + schoolForm = 1; + game.override.startingWave(4); + game.override.starterForms({ + [Species.WISHIWASHI]: schoolForm, + }); - await game.startBattle([ Species.MAGIKARP, Species.WISHIWASHI ]); + await game.startBattle([Species.MAGIKARP, Species.WISHIWASHI]); - const wishiwashi = game.scene.getPlayerParty().find((p) => p.species.speciesId === Species.WISHIWASHI)!; - expect(wishiwashi).not.toBe(undefined); - expect(wishiwashi.formIndex).toBe(schoolForm); + const wishiwashi = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.WISHIWASHI)!; + expect(wishiwashi).not.toBe(undefined); + expect(wishiwashi.formIndex).toBe(schoolForm); - wishiwashi.hp = 0; - wishiwashi.status = new Status(StatusEffect.FAINT); - expect(wishiwashi.isFainted()).toBe(true); + wishiwashi.hp = 0; + wishiwashi.status = new Status(StatusEffect.FAINT); + expect(wishiwashi.isFainted()).toBe(true); - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); - expect(wishiwashi.formIndex).toBe(soloForm); - }, - ); + expect(wishiwashi.formIndex).toBe(soloForm); + }); }); diff --git a/test/abilities/screen_cleaner.test.ts b/test/abilities/screen_cleaner.test.ts index 9c182398765..d8be1d64697 100644 --- a/test/abilities/screen_cleaner.test.ts +++ b/test/abilities/screen_cleaner.test.ts @@ -30,10 +30,10 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Aurora Veil", async () => { - game.override.moveset([ Moves.HAIL ]); - game.override.enemyMoveset([ Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL ]); + game.override.moveset([Moves.HAIL]); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.HAIL); await game.phaseInterceptor.to(TurnEndPhase); @@ -48,9 +48,9 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Light Screen", async () => { - game.override.enemyMoveset([ Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN ]); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -65,9 +65,9 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Reflect", async () => { - game.override.enemyMoveset([ Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT ]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/abilities/seed_sower.test.ts b/test/abilities/seed_sower.test.ts index 6e3acdf6093..d78007f7500 100644 --- a/test/abilities/seed_sower.test.ts +++ b/test/abilities/seed_sower.test.ts @@ -6,7 +6,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Seed Sower", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,11 +30,11 @@ describe("Abilities - Seed Sower", () => { game.override.starterSpecies(Species.ARBOLIVA); game.override.ability(Abilities.SEED_SOWER); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); }); it("should trigger when hit with damaging move", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); @@ -45,10 +44,8 @@ describe("Abilities - Seed Sower", () => { }); it("should trigger even when fainting", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]) - .enemyLevel(100) - .startingLevel(1); - await game.classicMode.startBattle([ Species.ARBOLIVA, Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.TACKLE]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.ARBOLIVA, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.doSelectPartyPokemon(1); @@ -58,7 +55,7 @@ describe("Abilities - Seed Sower", () => { }); it("should not trigger when targetted with status moves", async () => { - game.override.enemyMoveset([ Moves.GROWL ]); + game.override.enemyMoveset([Moves.GROWL]); await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); diff --git a/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts index 7444347401c..65ca96acbbc 100644 --- a/test/abilities/serene_grace.test.ts +++ b/test/abilities/serene_grace.test.ts @@ -28,22 +28,22 @@ describe("Abilities - Serene Grace", () => { .disableCrits() .battleType("single") .ability(Abilities.SERENE_GRACE) - .moveset([ Moves.AIR_SLASH ]) + .moveset([Moves.AIR_SLASH]) .enemySpecies(Species.ALOLA_GEODUDE) .enemyLevel(10) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH ]); + .enemyMoveset([Moves.SPLASH]); }); it("Serene Grace should double the secondary effect chance of a move", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const airSlashMove = allMoves[Moves.AIR_SLASH]; const airSlashFlinchAttr = airSlashMove.getAttrs(FlinchAttr)[0]; vi.spyOn(airSlashFlinchAttr, "getMoveChance"); game.move.select(Moves.AIR_SLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts index 1f9a101f409..4a1c20cde5c 100644 --- a/test/abilities/sheer_force.test.ts +++ b/test/abilities/sheer_force.test.ts @@ -30,15 +30,15 @@ describe("Abilities - Sheer Force", () => { .ability(Abilities.SHEER_FORCE) .enemySpecies(Species.ONIX) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH]) .disableCrits(); }); const SHEER_FORCE_MULT = 5461 / 4096; it("Sheer Force should boost the power of the move but disable secondary effects", async () => { - game.override.moveset([ Moves.AIR_SLASH ]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + game.override.moveset([Moves.AIR_SLASH]); + await game.classicMode.startBattle([Species.SHUCKLE]); const airSlashMove = allMoves[Moves.AIR_SLASH]; vi.spyOn(airSlashMove, "calculateBattlePower"); @@ -47,7 +47,7 @@ describe("Abilities - Sheer Force", () => { game.move.select(Moves.AIR_SLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase", false); @@ -56,15 +56,15 @@ describe("Abilities - Sheer Force", () => { }); it("Sheer Force does not affect the base damage or secondary effects of binding moves", async () => { - game.override.moveset([ Moves.BIND ]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + game.override.moveset([Moves.BIND]); + await game.classicMode.startBattle([Species.SHUCKLE]); const bindMove = allMoves[Moves.BIND]; vi.spyOn(bindMove, "calculateBattlePower"); game.move.select(Moves.BIND); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase", false); @@ -72,14 +72,14 @@ describe("Abilities - Sheer Force", () => { }, 20000); it("Sheer Force does not boost the base damage of moves with no secondary effect", async () => { - game.override.moveset([ Moves.TACKLE ]); - await game.classicMode.startBattle([ Species.PIDGEOT ]); + game.override.moveset([Moves.TACKLE]); + await game.classicMode.startBattle([Species.PIDGEOT]); const tackleMove = allMoves[Moves.TACKLE]; vi.spyOn(tackleMove, "calculateBattlePower"); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase", false); @@ -88,12 +88,12 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force can disable the on-hit activation of specific abilities", async () => { game.override - .moveset([ Moves.HEADBUTT ]) + .moveset([Moves.HEADBUTT]) .enemySpecies(Species.SQUIRTLE) .enemyLevel(10) .enemyAbility(Abilities.COLOR_CHANGE); - await game.classicMode.startBattle([ Species.PIDGEOT ]); + await game.classicMode.startBattle([Species.PIDGEOT]); const enemyPokemon = game.scene.getEnemyPokemon(); const headbuttMove = allMoves[Moves.HEADBUTT]; vi.spyOn(headbuttMove, "calculateBattlePower"); @@ -102,7 +102,7 @@ describe("Abilities - Sheer Force", () => { game.move.select(Moves.HEADBUTT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase", false); @@ -113,14 +113,13 @@ describe("Abilities - Sheer Force", () => { it("Two Pokemon with abilities disabled by Sheer Force hitting each other should not cause a crash", async () => { const moveToUse = Moves.CRUNCH; - game.override.enemyAbility(Abilities.COLOR_CHANGE) + game.override + .enemyAbility(Abilities.COLOR_CHANGE) .ability(Abilities.COLOR_CHANGE) .moveset(moveToUse) .enemyMoveset(moveToUse); - await game.classicMode.startBattle([ - Species.PIDGEOT - ]); + await game.classicMode.startBattle([Species.PIDGEOT]); const pidgeot = game.scene.getPlayerParty()[0]; const onix = game.scene.getEnemyParty()[0]; @@ -132,7 +131,7 @@ describe("Abilities - Sheer Force", () => { await game.toNextTurn(); // Check that both Pokemon's Color Change activated - const expectedTypes = [ allMoves[moveToUse].type ]; + const expectedTypes = [allMoves[moveToUse].type]; expect(pidgeot.getTypes()).toStrictEqual(expectedTypes); expect(onix.getTypes()).toStrictEqual(expectedTypes); }); @@ -140,10 +139,10 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force should disable Meloetta's transformation from Relic Song", async () => { game.override .ability(Abilities.SHEER_FORCE) - .moveset([ Moves.RELIC_SONG ]) - .enemyMoveset([ Moves.SPLASH ]) + .moveset([Moves.RELIC_SONG]) + .enemyMoveset([Moves.SPLASH]) .enemyLevel(100); - await game.classicMode.startBattle([ Species.MELOETTA ]); + await game.classicMode.startBattle([Species.MELOETTA]); const playerPokemon = game.scene.getPlayerPokemon(); const formKeyStart = playerPokemon?.getFormKey(); diff --git a/test/abilities/shield_dust.test.ts b/test/abilities/shield_dust.test.ts index a63898b0c63..8e02b5a7713 100644 --- a/test/abilities/shield_dust.test.ts +++ b/test/abilities/shield_dust.test.ts @@ -1,5 +1,10 @@ import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; +import { + applyAbAttrs, + applyPreDefendAbAttrs, + IgnoreMoveEffectsAbAttr, + MoveEffectChanceMultiplierAbAttr, +} from "#app/data/ability"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { NumberHolder } from "#app/utils"; import { Abilities } from "#enums/abilities"; @@ -10,7 +15,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Shield Dust", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -36,15 +40,14 @@ describe("Abilities - Shield Dust", () => { }); it("Shield Dust", async () => { - await game.classicMode.startBattle([ Species.PIDGEOT ]); - + await game.classicMode.startBattle([Species.PIDGEOT]); game.scene.getEnemyPokemon()!.stats[Stat.SPDEF] = 10000; expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); game.move.select(Moves.AIR_SLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); // Shield Dust negates secondary effect @@ -53,10 +56,26 @@ describe("Abilities - Shield Dust", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new NumberHolder(move.chance); - await applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - await applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); + await applyAbAttrs( + MoveEffectChanceMultiplierAbAttr, + phase.getUserPokemon()!, + null, + false, + chance, + move, + phase.getFirstTarget(), + false, + ); + await applyPreDefendAbAttrs( + IgnoreMoveEffectsAbAttr, + phase.getFirstTarget()!, + phase.getUserPokemon()!, + null, + null, + false, + chance, + ); expect(chance.value).toBe(0); - }); //TODO King's Rock Interaction Unit Test diff --git a/test/abilities/shields_down.test.ts b/test/abilities/shields_down.test.ts index 4e47a018471..4bdf22869cb 100644 --- a/test/abilities/shields_down.test.ts +++ b/test/abilities/shields_down.test.ts @@ -9,7 +9,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - SHIELDS DOWN", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,173 +28,153 @@ describe("Abilities - SHIELDS DOWN", () => { const moveToUse = Moves.SPLASH; game.override.battleType("single"); game.override.ability(Abilities.SHIELDS_DOWN); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE]); }); - test( - "check if fainted pokemon switched to base form on arena reset", - async () => { - const meteorForm = 0, - coreForm = 7; - game.override.startingWave(4); - game.override.starterForms({ - [Species.MINIOR]: coreForm, - }); + test("check if fainted pokemon switched to base form on arena reset", async () => { + const meteorForm = 0, + coreForm = 7; + game.override.startingWave(4); + game.override.starterForms({ + [Species.MINIOR]: coreForm, + }); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MINIOR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); - const minior = game.scene.getPlayerParty().find((p) => p.species.speciesId === Species.MINIOR)!; - expect(minior).not.toBe(undefined); - expect(minior.formIndex).toBe(coreForm); + const minior = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.MINIOR)!; + expect(minior).not.toBe(undefined); + expect(minior.formIndex).toBe(coreForm); - minior.hp = 0; - minior.status = new Status(StatusEffect.FAINT); - expect(minior.isFainted()).toBe(true); + minior.hp = 0; + minior.status = new Status(StatusEffect.FAINT); + expect(minior.isFainted()).toBe(true); - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); - expect(minior.formIndex).toBe(meteorForm); - }, - ); + expect(minior.formIndex).toBe(meteorForm); + }); - test("should ignore non-volatile status moves", - async () => { - game.override.enemyMoveset([ Moves.SPORE ]); + test("should ignore non-volatile status moves", async () => { + game.override.enemyMoveset([Moves.SPORE]); - await game.classicMode.startBattle([ Species.MINIOR ]); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.classicMode.startBattle([Species.MINIOR]); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); - } - ); + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); - test("should still ignore non-volatile status moves used by a pokemon with mold breaker", - async () => { - game.override.enemyAbility(Abilities.MOLD_BREAKER); - game.override.enemyMoveset([ Moves.SPORE ]); + test("should still ignore non-volatile status moves used by a pokemon with mold breaker", async () => { + game.override.enemyAbility(Abilities.MOLD_BREAKER); + game.override.enemyMoveset([Moves.SPORE]); - await game.classicMode.startBattle([ Species.MINIOR ]); + await game.classicMode.startBattle([Species.MINIOR]); - game.move.select(Moves.SPLASH); - await game.forceEnemyMove(Moves.SPORE); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPORE); + await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); - } - ); + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); - test("should ignore non-volatile secondary status effects", - async() => { - game.override.enemyMoveset([ Moves.NUZZLE ]); + test("should ignore non-volatile secondary status effects", async () => { + game.override.enemyMoveset([Moves.NUZZLE]); - await game.classicMode.startBattle([ Species.MINIOR ]); + await game.classicMode.startBattle([Species.MINIOR]); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); - } - ); + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); - test("should ignore status moves even through mold breaker", - async () => { - game.override.enemyMoveset([ Moves.SPORE ]); - game.override.enemyAbility(Abilities.MOLD_BREAKER); + test("should ignore status moves even through mold breaker", async () => { + game.override.enemyMoveset([Moves.SPORE]); + game.override.enemyAbility(Abilities.MOLD_BREAKER); - await game.classicMode.startBattle([ Species.MINIOR ]); + await game.classicMode.startBattle([Species.MINIOR]); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); // toxic spikes currently does not poison flying types when gravity is in effect - test.todo("should become poisoned by toxic spikes when grounded", - async () => { - game.override.enemyMoveset([ Moves.GRAVITY, Moves.TOXIC_SPIKES, Moves.SPLASH ]); - game.override.moveset([ Moves.GRAVITY, Moves.SPLASH ]); + test.todo("should become poisoned by toxic spikes when grounded", async () => { + game.override.enemyMoveset([Moves.GRAVITY, Moves.TOXIC_SPIKES, Moves.SPLASH]); + game.override.moveset([Moves.GRAVITY, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MINIOR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); - // turn 1 - game.move.select(Moves.GRAVITY); - await game.forceEnemyMove(Moves.TOXIC_SPIKES); - await game.toNextTurn(); + // turn 1 + game.move.select(Moves.GRAVITY); + await game.forceEnemyMove(Moves.TOXIC_SPIKES); + await game.toNextTurn(); - // turn 2 - game.doSwitchPokemon(1); - await game.forceEnemyMove(Moves.SPLASH); - await game.toNextTurn(); + // turn 2 + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.MINIOR); - expect(game.scene.getPlayerPokemon()!.species.formIndex).toBe(0); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); - } - ); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.MINIOR); + expect(game.scene.getPlayerPokemon()!.species.formIndex).toBe(0); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); + }); - test("should ignore yawn", - async () => { - game.override.enemyMoveset([ Moves.YAWN ]); + test("should ignore yawn", async () => { + game.override.enemyMoveset([Moves.YAWN]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MINIOR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); - game.move.select(Moves.SPLASH); - await game.forceEnemyMove(Moves.YAWN); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.YAWN); - await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.findTag( (tag ) => tag.tagType === BattlerTagType.DROWSY)).toBe(undefined); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.DROWSY)).toBe(undefined); + }); - test("should not ignore volatile status effects", - async () => { - game.override.enemyMoveset([ Moves.CONFUSE_RAY ]); + test("should not ignore volatile status effects", async () => { + game.override.enemyMoveset([Moves.CONFUSE_RAY]); - await game.classicMode.startBattle([ Species.MINIOR ]); + await game.classicMode.startBattle([Species.MINIOR]); - game.move.select(Moves.SPLASH); - await game.forceEnemyMove(Moves.CONFUSE_RAY); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.CONFUSE_RAY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.findTag( (tag ) => tag.tagType === BattlerTagType.CONFUSED)).not.toBe(undefined); - } - ); + expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.CONFUSED)).not.toBe(undefined); + }); // the `NoTransformAbilityAbAttr` attribute is not checked anywhere, so this test cannot pass. - test.todo("ditto should not be immune to status after transforming", - async () => { - game.override.enemySpecies(Species.DITTO); - game.override.enemyAbility(Abilities.IMPOSTER); - game.override.moveset([ Moves.SPLASH, Moves.SPORE ]); + test.todo("ditto should not be immune to status after transforming", async () => { + game.override.enemySpecies(Species.DITTO); + game.override.enemyAbility(Abilities.IMPOSTER); + game.override.moveset([Moves.SPLASH, Moves.SPORE]); - await game.classicMode.startBattle([ Species.MINIOR ]); + await game.classicMode.startBattle([Species.MINIOR]); - game.move.select(Moves.SPORE); - await game.forceEnemyMove(Moves.SPLASH); + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); test("should not prevent minior from receiving the fainted status effect in trainer battles", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - game.override.moveset([ Moves.THUNDERBOLT ]); + game.override.enemyMoveset([Moves.TACKLE]); + game.override.moveset([Moves.THUNDERBOLT]); game.override.startingLevel(100); game.override.startingWave(5); game.override.enemySpecies(Species.MINIOR); - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const minior = game.scene.getEnemyPokemon()!; game.move.select(Moves.THUNDERBOLT); @@ -203,5 +182,4 @@ describe("Abilities - SHIELDS DOWN", () => { expect(minior.isFainted()).toBe(true); expect(minior.status?.effect).toBe(StatusEffect.FAINT); }); - }); diff --git a/test/abilities/simple.test.ts b/test/abilities/simple.test.ts index e8d478655ab..b6c5fd116c0 100644 --- a/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -30,10 +30,8 @@ describe("Abilities - Simple", () => { .enemyMoveset(Moves.SPLASH); }); - it("should double stat changes when applied", async() => { - await game.startBattle([ - Species.SLOWBRO - ]); + it("should double stat changes when applied", async () => { + await game.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/speed_boost.test.ts b/test/abilities/speed_boost.test.ts index 912bb62bca4..fa20e74108f 100644 --- a/test/abilities/speed_boost.test.ts +++ b/test/abilities/speed_boost.test.ts @@ -33,97 +33,83 @@ describe("Abilities - Speed Boost", () => { .enemyLevel(100) .ability(Abilities.SPEED_BOOST) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.SPLASH, Moves.U_TURN ]); + .moveset([Moves.SPLASH, Moves.U_TURN]); }); - it("should increase speed by 1 stage at end of turn", - async () => { - await game.classicMode.startBattle(); + it("should increase speed by 1 stage at end of turn", async () => { + await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); - await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.toNextTurn(); - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); - }); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); - it("should not trigger this turn if pokemon was switched into combat via attack, but the turn after", - async () => { - await game.classicMode.startBattle([ - Species.SHUCKLE, - Species.NINJASK - ]); + it("should not trigger this turn if pokemon was switched into combat via attack, but the turn after", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); - game.move.select(Moves.U_TURN); - game.doSelectPartyPokemon(1); - await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); - }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); - it("checking back to back swtiches", - async () => { - await game.classicMode.startBattle([ - Species.SHUCKLE, - Species.NINJASK - ]); + it("checking back to back swtiches", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); - const [ shuckle, ninjask ] = game.scene.getPlayerParty(); + const [shuckle, ninjask] = game.scene.getPlayerParty(); - game.move.select(Moves.U_TURN); - game.doSelectPartyPokemon(1); - await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!).toBe(ninjask); - expect(ninjask.getStatStage(Stat.SPD)).toBe(0); + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!).toBe(ninjask); + expect(ninjask.getStatStage(Stat.SPD)).toBe(0); - game.move.select(Moves.U_TURN); - game.doSelectPartyPokemon(1); - await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!).toBe(shuckle); - expect(shuckle.getStatStage(Stat.SPD)).toBe(0); + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!).toBe(shuckle); + expect(shuckle.getStatStage(Stat.SPD)).toBe(0); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(shuckle.getStatStage(Stat.SPD)).toBe(1); - }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(shuckle.getStatStage(Stat.SPD)).toBe(1); + }); - it("should not trigger this turn if pokemon was switched into combat via normal switch, but the turn after", - async () => { - await game.classicMode.startBattle([ - Species.SHUCKLE, - Species.NINJASK - ]); + it("should not trigger this turn if pokemon was switched into combat via normal switch, but the turn after", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); - game.doSwitchPokemon(1); - await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + game.doSwitchPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); - }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); - it("should not trigger if pokemon fails to escape", - async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + it("should not trigger if pokemon fails to escape", async () => { + await game.classicMode.startBattle([Species.SHUCKLE]); - const commandPhase = game.scene.getCurrentPhase() as CommandPhase; - commandPhase.handleCommand(Command.RUN, 0); - const runPhase = game.scene.getCurrentPhase() as AttemptRunPhase; - runPhase.forceFailEscape = true; - await game.phaseInterceptor.to(AttemptRunPhase); - await game.toNextTurn(); + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + const runPhase = game.scene.getCurrentPhase() as AttemptRunPhase; + runPhase.forceFailEscape = true; + await game.phaseInterceptor.to(AttemptRunPhase); + await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); - }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); }); diff --git a/test/abilities/stakeout.test.ts b/test/abilities/stakeout.test.ts index 67442ae1822..b464b3f1dfc 100644 --- a/test/abilities/stakeout.test.ts +++ b/test/abilities/stakeout.test.ts @@ -24,7 +24,7 @@ describe("Abilities - Stakeout", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.SURF ]) + .moveset([Moves.SPLASH, Moves.SURF]) .ability(Abilities.STAKEOUT) .battleType("single") .disableCrits() @@ -32,14 +32,14 @@ describe("Abilities - Stakeout", () => { .enemyLevel(100) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.FLIP_TURN ]) + .enemyMoveset([Moves.SPLASH, Moves.FLIP_TURN]) .startingWave(5); }); it("should do double damage to a pokemon that switched out", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); - const [ enemy1, ] = game.scene.getEnemyParty(); + const [enemy1] = game.scene.getEnemyParty(); game.move.select(Moves.SURF); await game.forceEnemyMove(Moves.SPLASH); @@ -56,13 +56,13 @@ describe("Abilities - Stakeout", () => { await game.toNextTurn(); expect(enemy1.isFainted()).toBe(false); - expect(isBetween(enemy1.getInverseHp(), (damage1 * 2) - 5, (damage1 * 2) + 5)).toBe(true); + expect(isBetween(enemy1.getInverseHp(), damage1 * 2 - 5, damage1 * 2 + 5)).toBe(true); }); it("should do double damage to a pokemon that switched out via U-Turn/etc", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); - const [ enemy1, ] = game.scene.getEnemyParty(); + const [enemy1] = game.scene.getEnemyParty(); game.move.select(Moves.SURF); await game.forceEnemyMove(Moves.SPLASH); @@ -76,10 +76,10 @@ describe("Abilities - Stakeout", () => { game.move.select(Moves.SURF); await game.forceEnemyMove(Moves.FLIP_TURN); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemy1.isFainted()).toBe(false); - expect(isBetween(enemy1.getInverseHp(), (damage1 * 2) - 5, (damage1 * 2) + 5)).toBe(true); + expect(isBetween(enemy1.getInverseHp(), damage1 * 2 - 5, damage1 * 2 + 5)).toBe(true); }); }); diff --git a/test/abilities/stall.test.ts b/test/abilities/stall.test.ts index c0b71221071..5b67e5f4b7a 100644 --- a/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -26,8 +26,8 @@ describe("Abilities - Stall", () => { game.override.disableCrits(); game.override.enemySpecies(Species.REGIELEKI); game.override.enemyAbility(Abilities.STALL); - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); - game.override.moveset([ Moves.QUICK_ATTACK, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + game.override.moveset([Moves.QUICK_ATTACK, Moves.TACKLE]); }); /** @@ -37,7 +37,7 @@ describe("Abilities - Stall", () => { **/ it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => { - await game.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -50,12 +50,12 @@ describe("Abilities - Stall", () => { const commandOrder = phase.getCommandOrder(); // The player Pokemon (without Stall) goes first despite having lower speed than the opponent. // The opponent Pokemon (with Stall) goes last despite having higher speed than the player Pokemon. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); }, 20000); 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.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -68,13 +68,13 @@ describe("Abilities - Stall", () => { const commandOrder = phase.getCommandOrder(); // The opponent Pokemon (with Stall) goes first because its move is still within a higher priority bracket than its opponent. // The player Pokemon goes second because its move is in a lower priority bracket. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); }, 20000); it("If both Pokemon have stall and use the same move, speed is used to determine who goes first.", async () => { game.override.ability(Abilities.STALL); - await game.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -88,7 +88,7 @@ describe("Abilities - Stall", () => { // The opponent Pokemon (with Stall) goes first because it has a higher speed. // The player Pokemon (with Stall) goes second because its speed is lower. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); }, 20000); }); diff --git a/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts index beda5d34e8e..9b4d32efcae 100644 --- a/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -29,13 +29,13 @@ describe("Abilities - Steely Spirit", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.IRON_HEAD, Moves.SPLASH ]); + game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); it("increases Steel-type moves' power used by the user and its allies by 50%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; const enemyToCheck = game.scene.getEnemyPokemon()!; @@ -51,7 +51,7 @@ describe("Abilities - Steely Spirit", () => { }); it("stacks if multiple users with this ability are on the field.", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.PIKACHU]); const enemyToCheck = game.scene.getEnemyPokemon()!; game.scene.getPlayerField().forEach(p => { @@ -64,11 +64,13 @@ describe("Abilities - Steely Spirit", () => { game.move.select(moveToCheck, 1, enemyToCheck.getBattlerIndex()); await game.phaseInterceptor.to("MoveEffectPhase"); - expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * Math.pow(steelySpiritMultiplier, 2)); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith( + ironHeadPower * Math.pow(steelySpiritMultiplier, 2), + ); }); it("does not take effect when suppressed", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; const enemyToCheck = game.scene.getEnemyPokemon()!; @@ -88,14 +90,12 @@ describe("Abilities - Steely Spirit", () => { }); it("affects variable-type moves if their resolved type is Steel", async () => { - game.override - .ability(Abilities.STEELY_SPIRIT) - .moveset([ Moves.REVELATION_DANCE ]); + game.override.ability(Abilities.STEELY_SPIRIT).moveset([Moves.REVELATION_DANCE]); const revelationDance = allMoves[Moves.REVELATION_DANCE]; vi.spyOn(revelationDance, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.KLINKLANG ]); + await game.classicMode.startBattle([Species.KLINKLANG]); game.move.select(Moves.REVELATION_DANCE); diff --git a/test/abilities/sturdy.test.ts b/test/abilities/sturdy.test.ts index 36b098ab69e..7b7254cff15 100644 --- a/test/abilities/sturdy.test.ts +++ b/test/abilities/sturdy.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Abilities - Sturdy", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,64 +28,51 @@ describe("Abilities - Sturdy", () => { game.override.starterSpecies(Species.LUCARIO); game.override.startingLevel(100); - game.override.moveset([ Moves.CLOSE_COMBAT, Moves.FISSURE ]); + game.override.moveset([Moves.CLOSE_COMBAT, Moves.FISSURE]); game.override.enemySpecies(Species.ARON); game.override.enemyLevel(5); game.override.enemyAbility(Abilities.STURDY); }); - test( - "Sturdy activates when user is at full HP", - async () => { - await game.startBattle(); - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(MoveEndPhase); - expect(game.scene.getEnemyParty()[0].hp).toBe(1); - }, - ); + test("Sturdy activates when user is at full HP", async () => { + await game.startBattle(); + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.getEnemyParty()[0].hp).toBe(1); + }); - test( - "Sturdy doesn't activate when user is not at full HP", - async () => { - await game.startBattle(); + test("Sturdy doesn't activate when user is not at full HP", async () => { + await game.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamageAnimPhase); + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(DamageAnimPhase); - expect(enemyPokemon.hp).toBe(0); - expect(enemyPokemon.isFainted()).toBe(true); - }, - ); + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }); - test( - "Sturdy pokemon should be immune to OHKO moves", - async () => { - await game.startBattle(); - game.move.select(Moves.FISSURE); - await game.phaseInterceptor.to(MoveEndPhase); + test("Sturdy pokemon should be immune to OHKO moves", async () => { + await game.startBattle(); + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to(MoveEndPhase); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.isFullHp()).toBe(true); - }, - ); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.isFullHp()).toBe(true); + }); - test( - "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", - async () => { - game.override.ability(Abilities.MOLD_BREAKER); + test("Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", async () => { + game.override.ability(Abilities.MOLD_BREAKER); - await game.startBattle(); - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamageAnimPhase); - - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.hp).toBe(0); - expect(enemyPokemon.isFainted()).toBe(true); - }, - ); + await game.startBattle(); + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(DamageAnimPhase); + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }); }); diff --git a/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts index 18e0823a7cb..b70acbd8d17 100644 --- a/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -34,40 +34,40 @@ describe("Abilities - Supreme Overlord", () => { .startingLevel(1) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.SUPREME_OVERLORD) - .enemyMoveset([ Moves.SPLASH ]) - .moveset([ Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE ]); + .enemyMoveset([Moves.SPLASH]) + .moveset([Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE]); vi.spyOn(move, "calculateBattlePower"); }); - it("should increase Power by 20% if 2 Pokemon are fainted in the party", async() => { - await game.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + it("should increase Power by 20% if 2 Pokemon are fainted in the party", async () => { + await game.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(2); await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.2); }); it("should increase Power by 30% if an ally fainted twice and another one once", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * Bulbasur faints once */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -76,7 +76,7 @@ describe("Abilities - Supreme Overlord", () => { */ game.doRevivePokemon(1); game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -84,31 +84,27 @@ describe("Abilities - Supreme Overlord", () => { * Bulbasur faints twice */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(2); await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.3); }); it("should maintain its power during next battle if it is within the same arena encounter", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(1) - .enemyLevel(1) - .startingLevel(100); + game.override.enemySpecies(Species.MAGIKARP).startingWave(1).enemyLevel(1).startingLevel(100); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * The first Pokemon faints and another Pokemon in the party is selected. - */ + */ game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -116,61 +112,53 @@ describe("Abilities - Supreme Overlord", () => { * Enemy Pokemon faints and new wave is entered. */ game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("TurnEndPhase"); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower * 1.1); }); it("should reset playerFaints count if we enter new trainer battle", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(4) - .enemyLevel(1) - .startingLevel(100); + game.override.enemySpecies(Species.MAGIKARP).startingWave(4).enemyLevel(1).startingLevel(100); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); }); it("should reset playerFaints count if we enter new biome", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(10) - .enemyLevel(1) - .startingLevel(100); + game.override.enemySpecies(Species.MAGIKARP).startingWave(10).enemyLevel(1).startingLevel(100); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); diff --git a/test/abilities/sweet_veil.test.ts b/test/abilities/sweet_veil.test.ts index 14f4f79c3f0..650ee53a474 100644 --- a/test/abilities/sweet_veil.test.ts +++ b/test/abilities/sweet_veil.test.ts @@ -26,14 +26,14 @@ describe("Abilities - Sweet Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.SPLASH, Moves.REST, Moves.YAWN ]); + game.override.moveset([Moves.SPLASH, Moves.REST, Moves.YAWN]); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER ]); + game.override.enemyMoveset([Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER]); }); it("prevents the user and its allies from falling asleep", async () => { - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -45,7 +45,7 @@ describe("Abilities - Sweet Veil", () => { it("causes Rest to fail when used by the user or its allies", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.REST, 1); @@ -56,8 +56,8 @@ describe("Abilities - Sweet Veil", () => { }); it("causes Yawn to fail if used on the user or its allies", async () => { - game.override.enemyMoveset([ Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN ]); - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -73,7 +73,7 @@ describe("Abilities - Sweet Veil", () => { game.override.startingLevel(5); game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX ]); + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); game.move.select(Moves.SPLASH); game.move.select(Moves.YAWN, 1, BattlerIndex.PLAYER); diff --git a/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts index 19b5560f61a..95ebf96f2fd 100644 --- a/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -28,12 +28,12 @@ describe("Abilities - Synchronize", () => { .startingLevel(100) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.SYNCHRONIZE) - .moveset([ Moves.SPLASH, Moves.THUNDER_WAVE, Moves.SPORE, Moves.PSYCHO_SHIFT ]) + .moveset([Moves.SPLASH, Moves.THUNDER_WAVE, Moves.SPORE, Moves.PSYCHO_SHIFT]) .ability(Abilities.NO_GUARD); }); it("does not trigger when no status is applied by opponent Pokemon", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -43,7 +43,7 @@ describe("Abilities - Synchronize", () => { }); it("sets the status of the source pokemon to Paralysis when paralyzed by it", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); @@ -71,7 +71,7 @@ describe("Abilities - Synchronize", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Array(4).fill(Moves.TOXIC_SPIKES)); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); game.move.select(Moves.SPLASH); await game.toNextTurn(); @@ -85,7 +85,7 @@ describe("Abilities - Synchronize", () => { }); it("shows ability even if it fails to set the status of the opponent Pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/tera_shell.test.ts b/test/abilities/tera_shell.test.ts index 38be70f511b..a99ecfd4ce1 100644 --- a/test/abilities/tera_shell.test.ts +++ b/test/abilities/tera_shell.test.ts @@ -26,107 +26,92 @@ describe("Abilities - Tera Shell", () => { game.override .battleType("single") .ability(Abilities.TERA_SHELL) - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.MACH_PUNCH ]) + .enemyMoveset([Moves.MACH_PUNCH]) .startingLevel(100) .enemyLevel(100); }); - it( - "should change the effectiveness of non-resisted attacks when the source is at full HP", - async () => { - await game.classicMode.startBattle([ Species.SNORLAX ]); + it("should change the effectiveness of non-resisted attacks when the source is at full HP", async () => { + await game.classicMode.startBattle([Species.SNORLAX]); - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.5); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.5); - await game.toNextTurn(); + await game.toNextTurn(); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(2); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(2); + }); + + it("should not override type immunities", async () => { + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); + + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0); + }); + + it("should not override type multipliers less than 0.5x", async () => { + game.override.enemyMoveset([Moves.QUICK_ATTACK]); + + await game.classicMode.startBattle([Species.AGGRON]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.25); + }); + + it("should not affect the effectiveness of fixed-damage moves", async () => { + game.override.enemyMoveset([Moves.DRAGON_RAGE]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "apply"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.EFFECTIVE); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40); + }); + + it("should change the effectiveness of all strikes of a multi-strike move", async () => { + game.override.enemyMoveset([Moves.DOUBLE_HIT]); + + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "apply"); + + game.move.select(Moves.SPLASH); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.move.forceHit(); + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.NOT_VERY_EFFECTIVE); } - ); - - it( - "should not override type immunities", - async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); - - await game.classicMode.startBattle([ Species.SNORLAX ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0); - } - ); - - it( - "should not override type multipliers less than 0.5x", - async () => { - game.override.enemyMoveset([ Moves.QUICK_ATTACK ]); - - await game.classicMode.startBattle([ Species.AGGRON ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.25); - } - ); - - it( - "should not affect the effectiveness of fixed-damage moves", - async () => { - game.override.enemyMoveset([ Moves.DRAGON_RAGE ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "apply"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.EFFECTIVE); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40); - } - ); - - it( - "should change the effectiveness of all strikes of a multi-strike move", - async () => { - game.override.enemyMoveset([ Moves.DOUBLE_HIT ]); - - await game.classicMode.startBattle([ Species.SNORLAX ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "apply"); - - game.move.select(Moves.SPLASH); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.move.forceHit(); - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEffectPhase"); - expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.NOT_VERY_EFFECTIVE); - } - expect(playerPokemon.apply).toHaveReturnedTimes(2); - } - ); + expect(playerPokemon.apply).toHaveReturnedTimes(2); + }); }); diff --git a/test/abilities/trace.test.ts b/test/abilities/trace.test.ts index e7059d2b0f1..5d569208d33 100644 --- a/test/abilities/trace.test.ts +++ b/test/abilities/trace.test.ts @@ -23,7 +23,7 @@ describe("Abilities - Trace", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.TRACE) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Abilities - Trace", () => { }); it("should copy the opponent's ability", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -43,7 +43,7 @@ describe("Abilities - Trace", () => { it("should activate a copied post-summon ability", async () => { game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts index a2134a96f4d..8f18604011c 100644 --- a/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -13,7 +13,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - Unburden", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -25,9 +24,8 @@ describe("Abilities - Unburden", () => { const stackCounts = pokemon.getHeldItems().map(m => m.getStackCount()); if (stackCounts.length) { return stackCounts.reduce((a, b) => a + b); - } else { - return 0; } + return 0; } beforeAll(() => { @@ -46,7 +44,7 @@ describe("Abilities - Unburden", () => { .battleType("single") .startingLevel(1) .ability(Abilities.UNBURDEN) - .moveset([ Moves.SPLASH, Moves.KNOCK_OFF, Moves.PLUCK, Moves.FALSE_SWIPE ]) + .moveset([Moves.SPLASH, Moves.KNOCK_OFF, Moves.PLUCK, Moves.FALSE_SWIPE]) .startingHeldItems([ { name: "BERRY", count: 1, type: BerryType.SITRUS }, { name: "BERRY", count: 2, type: BerryType.APICOT }, @@ -62,12 +60,12 @@ describe("Abilities - Unburden", () => { { name: "BERRY", type: BerryType.LUM, count: 1 }, ]); // For the various tests that use Thief, give it a 100% steal rate - vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([ new StealHeldItemChanceAttr(1.0) ]); + vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([new StealHeldItemChanceAttr(1.0)]); }); it("should activate when a berry is eaten", async () => { game.override.enemyMoveset(Moves.FALSE_SWIPE); - await game.classicMode.startBattle([ Species.TREECKO ]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -82,9 +80,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when a berry is eaten, even if Berry Pouch preserves the berry", async () => { - game.override.enemyMoveset(Moves.FALSE_SWIPE) - .startingModifier([{ name: "BERRY_POUCH", count: 5850 }]); - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.enemyMoveset(Moves.FALSE_SWIPE).startingModifier([{ name: "BERRY_POUCH", count: 5850 }]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -99,7 +96,7 @@ describe("Abilities - Unburden", () => { }); it("should activate for the target, and not the stealer, when a berry is stolen", async () => { - await game.classicMode.startBattle([ Species.TREECKO ]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -117,7 +114,7 @@ describe("Abilities - Unburden", () => { }); it("should activate when an item is knocked off", async () => { - await game.classicMode.startBattle([ Species.TREECKO ]); + await game.classicMode.startBattle([Species.TREECKO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyHeldItemCt = getHeldItemCount(enemyPokemon); @@ -132,10 +129,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when an item is stolen via attacking ability", async () => { - game.override - .ability(Abilities.MAGICIAN) - .startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.ability(Abilities.MAGICIAN).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items + await game.classicMode.startBattle([Species.TREECKO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyHeldItemCt = getHeldItemCount(enemyPokemon); @@ -150,10 +145,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when an item is stolen via defending ability", async () => { - game.override - .enemyAbility(Abilities.PICKPOCKET) - .enemyHeldItems([]); // Remove opponent's full stacks of held items so it can steal player's held items - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.enemyAbility(Abilities.PICKPOCKET).enemyHeldItems([]); // Remove opponent's full stacks of held items so it can steal player's held items + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -168,9 +161,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when an item is stolen via move", async () => { - game.override.moveset(Moves.THIEF) - .startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.moveset(Moves.THIEF).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items + await game.classicMode.startBattle([Species.TREECKO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyHeldItemCt = getHeldItemCount(enemyPokemon); @@ -185,11 +177,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when an item is stolen via grip claw", async () => { - game.override - .startingHeldItems([ - { name: "GRIP_CLAW", count: 1 }, - ]); - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; @@ -208,9 +197,8 @@ describe("Abilities - Unburden", () => { }); it("should not activate when a neutralizing ability is present", async () => { - game.override.enemyAbility(Abilities.NEUTRALIZING_GAS) - .enemyMoveset(Moves.FALSE_SWIPE); - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.enemyAbility(Abilities.NEUTRALIZING_GAS).enemyMoveset(Moves.FALSE_SWIPE); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -227,7 +215,7 @@ describe("Abilities - Unburden", () => { it("should activate when a move that consumes a berry is used", async () => { game.override.moveset(Moves.STUFF_CHEEKS); - await game.classicMode.startBattle([ Species.TREECKO ]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItemCt = getHeldItemCount(playerPokemon); @@ -243,13 +231,10 @@ describe("Abilities - Unburden", () => { }); it("should deactivate temporarily when a neutralizing gas user is on the field", async () => { - game.override - .battleType("double") - .ability(Abilities.NONE); // Disable ability override so that we can properly set abilities below - await game.classicMode.startBattle([ Species.TREECKO, Species.MEOWTH, Species.WEEZING ]); + game.override.battleType("double").ability(Abilities.NONE); // Disable ability override so that we can properly set abilities below + await game.classicMode.startBattle([Species.TREECKO, Species.MEOWTH, Species.WEEZING]); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [ treecko, _meowth, weezing ] = game.scene.getPlayerParty(); + const [treecko, _meowth, weezing] = game.scene.getPlayerParty(); treecko.abilityIndex = 2; // Treecko has Unburden weezing.abilityIndex = 1; // Weezing has Neutralizing Gas const playerHeldItems = getHeldItemCount(treecko); @@ -285,11 +270,10 @@ describe("Abilities - Unburden", () => { }); it("should not activate when passing a baton to a teammate switching in", async () => { - game.override.startingHeldItems([{ name: "BATON" }]) - .moveset(Moves.BATON_PASS); - await game.classicMode.startBattle([ Species.TREECKO, Species.PURRLOIN ]); + game.override.startingHeldItems([{ name: "BATON" }]).moveset(Moves.BATON_PASS); + await game.classicMode.startBattle([Species.TREECKO, Species.PURRLOIN]); - const [ treecko, purrloin ] = game.scene.getPlayerParty(); + const [treecko, purrloin] = game.scene.getPlayerParty(); const initialTreeckoSpeed = treecko.getStat(Stat.SPD); const initialPurrloinSpeed = purrloin.getStat(Stat.SPD); const unburdenAttr = treecko.getAbilityAttrs(PostItemLostAbAttr)[0]; @@ -308,8 +292,8 @@ describe("Abilities - Unburden", () => { }); it("should not speed up a Pokemon after it loses the ability Unburden", async () => { - game.override.enemyMoveset([ Moves.FALSE_SWIPE, Moves.WORRY_SEED ]); - await game.classicMode.startBattle([ Species.PURRLOIN ]); + game.override.enemyMoveset([Moves.FALSE_SWIPE, Moves.WORRY_SEED]); + await game.classicMode.startBattle([Species.PURRLOIN]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -333,9 +317,8 @@ describe("Abilities - Unburden", () => { }); it("should activate when a reviver seed is used", async () => { - game.override.startingHeldItems([{ name: "REVIVER_SEED" }]) - .enemyMoveset([ Moves.WING_ATTACK ]); - await game.classicMode.startBattle([ Species.TREECKO ]); + game.override.startingHeldItems([{ name: "REVIVER_SEED" }]).enemyMoveset([Moves.WING_ATTACK]); + await game.classicMode.startBattle([Species.TREECKO]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerHeldItems = getHeldItemCount(playerPokemon); @@ -351,8 +334,8 @@ describe("Abilities - Unburden", () => { // test for `.bypassFaint()` - singles it("shouldn't persist when revived normally if activated while fainting", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.THIEF ]); - await game.classicMode.startBattle([ Species.TREECKO, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.THIEF]); + await game.classicMode.startBattle([Species.TREECKO, Species.FEEBAS]); const treecko = game.scene.getPlayerPokemon()!; const treeckoInitialHeldItems = getHeldItemCount(treecko); @@ -377,10 +360,10 @@ describe("Abilities - Unburden", () => { it("shouldn't persist when revived by revival blessing if activated while fainting", async () => { game.override .battleType("double") - .enemyMoveset([ Moves.SPLASH, Moves.THIEF ]) - .moveset([ Moves.SPLASH, Moves.REVIVAL_BLESSING ]) + .enemyMoveset([Moves.SPLASH, Moves.THIEF]) + .moveset([Moves.SPLASH, Moves.REVIVAL_BLESSING]) .startingHeldItems([{ name: "WIDE_LENS" }]); - await game.classicMode.startBattle([ Species.TREECKO, Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.TREECKO, Species.FEEBAS, Species.MILOTIC]); const treecko = game.scene.getPlayerField()[0]; const treeckoInitialHeldItems = getHeldItemCount(treecko); @@ -390,7 +373,7 @@ describe("Abilities - Unburden", () => { game.move.select(Moves.REVIVAL_BLESSING, 1); await game.forceEnemyMove(Moves.THIEF, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); await game.toNextTurn(); diff --git a/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts index de93aef0988..73ae25ff3b0 100644 --- a/test/abilities/unseen_fist.test.ts +++ b/test/abilities/unseen_fist.test.ts @@ -8,7 +8,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; - describe("Abilities - Unseen Fist", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,63 +27,54 @@ describe("Abilities - Unseen Fist", () => { game.override.battleType("single"); game.override.starterSpecies(Species.URSHIFU); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); game.override.startingLevel(100); game.override.enemyLevel(100); }); - it( - "should cause a contact move to ignore Protect", - () => testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true), - ); + it("should cause a contact move to ignore Protect", () => + testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true)); - it( - "should not cause a non-contact move to ignore Protect", - () => testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false), - ); + it("should not cause a non-contact move to ignore Protect", () => + testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false)); - it( - "should not apply if the source has Long Reach", - async () => { - game.override.passiveAbility(Abilities.LONG_REACH); - await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); - } - ); + it("should not apply if the source has Long Reach", async () => { + game.override.passiveAbility(Abilities.LONG_REACH); + await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); + }); - it( - "should cause a contact move to ignore Wide Guard", - () => testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true), - ); + it("should cause a contact move to ignore Wide Guard", () => + testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true)); - it( - "should not cause a non-contact move to ignore Wide Guard", - () => testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false), - ); + it("should not cause a non-contact move to ignore Wide Guard", () => + testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false)); - it( - "should cause a contact move to ignore Protect, but not Substitute", - async () => { - game.override.enemyLevel(1); - game.override.moveset([ Moves.TACKLE ]); + it("should cause a contact move to ignore Protect, but not Substitute", async () => { + game.override.enemyLevel(1); + game.override.moveset([Moves.TACKLE]); - await game.classicMode.startBattle(); + await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); }); -async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { - game.override.moveset([ attackMove ]); - game.override.enemyMoveset([ protectMove, protectMove, protectMove, protectMove ]); +async function testUnseenFistHitResult( + game: GameManager, + attackMove: Moves, + protectMove: Moves, + shouldSucceed = true, +): Promise { + game.override.moveset([attackMove]); + game.override.enemyMoveset([protectMove, protectMove, protectMove, protectMove]); await game.classicMode.startBattle(); diff --git a/test/abilities/volt_absorb.test.ts b/test/abilities/volt_absorb.test.ts index 2221619af07..10735f31987 100644 --- a/test/abilities/volt_absorb.test.ts +++ b/test/abilities/volt_absorb.test.ts @@ -34,9 +34,9 @@ describe("Abilities - Volt Absorb", () => { const moveToUse = Moves.CHARGE; const ability = Abilities.VOLT_ABSORB; - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.ability(ability); - game.override.enemyMoveset([ Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); game.override.enemyAbility(Abilities.BALL_FETCH); @@ -65,7 +65,7 @@ describe("Abilities - Volt Absorb", () => { game.move.select(Moves.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEffectPhase"); await game.move.forceMiss(); @@ -85,7 +85,7 @@ describe("Abilities - Volt Absorb", () => { game.move.select(Moves.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); diff --git a/test/abilities/wandering_spirit.test.ts b/test/abilities/wandering_spirit.test.ts index 48c7afa5751..375faa41972 100644 --- a/test/abilities/wandering_spirit.test.ts +++ b/test/abilities/wandering_spirit.test.ts @@ -23,7 +23,7 @@ describe("Abilities - Wandering Spirit", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.WANDERING_SPIRIT) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Abilities - Wandering Spirit", () => { }); it("should exchange abilities when hit with a contact move", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -44,7 +44,7 @@ describe("Abilities - Wandering Spirit", () => { it("should not exchange abilities when hit with a non-contact move", async () => { game.override.enemyMoveset(Moves.EARTHQUAKE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); @@ -55,7 +55,7 @@ describe("Abilities - Wandering Spirit", () => { it("should activate post-summon abilities", async () => { game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts index a37885834c4..ef201cbf8dd 100644 --- a/test/abilities/wimp_out.test.ts +++ b/test/abilities/wimp_out.test.ts @@ -37,13 +37,13 @@ describe("Abilities - Wimp Out", () => { .enemyPassiveAbility(Abilities.NO_GUARD) .startingLevel(90) .enemyLevel(70) - .moveset([ Moves.SPLASH, Moves.FALSE_SWIPE, Moves.ENDURE ]) + .moveset([Moves.SPLASH, Moves.FALSE_SWIPE, Moves.ENDURE]) .enemyMoveset(Moves.FALSE_SWIPE) .disableCrits(); }); function confirmSwitch(): void { - const [ pokemon1, pokemon2 ] = game.scene.getPlayerParty(); + const [pokemon1, pokemon2] = game.scene.getPlayerParty(); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); @@ -55,7 +55,7 @@ describe("Abilities - Wimp Out", () => { } function confirmNoSwitch(): void { - const [ pokemon1, pokemon2 ] = game.scene.getPlayerParty(); + const [pokemon1, pokemon2] = game.scene.getPlayerParty(); expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); @@ -67,14 +67,8 @@ describe("Abilities - Wimp Out", () => { } it("triggers regenerator passive single time when switching out with wimp out", async () => { - game.override - .passiveAbility(Abilities.REGENERATOR) - .startingLevel(5) - .enemyLevel(100); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.passiveAbility(Abilities.REGENERATOR).startingLevel(5).enemyLevel(100); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const wimpod = game.scene.getPlayerPokemon()!; @@ -88,10 +82,7 @@ describe("Abilities - Wimp Out", () => { it("It makes wild pokemon flee if triggered", async () => { game.override.enemyAbility(Abilities.WIMP_OUT); - await game.classicMode.startBattle([ - Species.GOLISOPOD, - Species.TYRUNT - ]); + await game.classicMode.startBattle([Species.GOLISOPOD, Species.TYRUNT]); const enemyPokemon = game.scene.getEnemyPokemon()!; enemyPokemon.hp *= 0.52; @@ -105,10 +96,7 @@ describe("Abilities - Wimp Out", () => { }); it("Does not trigger when HP already below half", async () => { - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const wimpod = game.scene.getPlayerPokemon()!; wimpod.hp = 5; @@ -120,14 +108,8 @@ describe("Abilities - Wimp Out", () => { }); it("Trapping moves do not prevent Wimp Out from activating.", async () => { - game.override - .enemyMoveset([ Moves.SPIRIT_SHACKLE ]) - .startingLevel(53) - .enemyLevel(45); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset([Moves.SPIRIT_SHACKLE]).startingLevel(53).enemyLevel(45); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.move.select(Moves.SPLASH); game.doSelectPartyPokemon(1); @@ -141,13 +123,8 @@ describe("Abilities - Wimp Out", () => { }); it("If this Ability activates due to being hit by U-turn or Volt Switch, the user of that move will not be switched out.", async () => { - game.override - .startingLevel(95) - .enemyMoveset([ Moves.U_TURN ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.startingLevel(95).enemyMoveset([Moves.U_TURN]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.move.select(Moves.SPLASH); game.doSelectPartyPokemon(1); @@ -160,14 +137,8 @@ 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([ Moves.U_TURN ]); - await game.classicMode.startBattle([ - Species.GOLISOPOD, - Species.TYRUNT - ]); + game.override.startingLevel(190).startingWave(8).enemyMoveset([Moves.U_TURN]); + await game.classicMode.startBattle([Species.GOLISOPOD, Species.TYRUNT]); const RIVAL_NINJASK1 = game.scene.getEnemyPokemon()?.id; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase", false); @@ -175,13 +146,8 @@ describe("Abilities - Wimp Out", () => { }); it("Dragon Tail and Circle Throw switch out Pokémon before the Ability activates.", async () => { - game.override - .startingLevel(69) - .enemyMoveset([ Moves.DRAGON_TAIL ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.startingLevel(69).enemyMoveset([Moves.DRAGON_TAIL]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const wimpod = game.scene.getPlayerPokemon()!; @@ -197,13 +163,8 @@ describe("Abilities - Wimp Out", () => { }); it("triggers when recoil damage is taken", async () => { - game.override - .moveset([ Moves.HEAD_SMASH ]) - .enemyMoveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.moveset([Moves.HEAD_SMASH]).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.move.select(Moves.HEAD_SMASH); game.doSelectPartyPokemon(1); @@ -213,13 +174,8 @@ describe("Abilities - Wimp Out", () => { }); it("It does not activate when the Pokémon cuts its own HP", async () => { - game.override - .moveset([ Moves.SUBSTITUTE ]) - .enemyMoveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.moveset([Moves.SUBSTITUTE]).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const wimpod = game.scene.getPlayerPokemon()!; wimpod.hp *= 0.52; @@ -231,13 +187,8 @@ describe("Abilities - Wimp Out", () => { }); it("Does not trigger when neutralized", async () => { - game.override - .enemyAbility(Abilities.NEUTRALIZING_GAS) - .startingLevel(5); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyAbility(Abilities.NEUTRALIZING_GAS).startingLevel(5); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); @@ -252,10 +203,10 @@ describe("Abilities - Wimp Out", () => { "If it falls below half and recovers back above half from a Shell Bell, Wimp Out will activate even after the Shell Bell recovery", async () => { game.override - .moveset([ Moves.DOUBLE_EDGE ]) - .enemyMoveset([ Moves.SPLASH ]) + .moveset([Moves.DOUBLE_EDGE]) + .enemyMoveset([Moves.SPLASH]) .startingHeldItems([{ name: "SHELL_BELL", count: 4 }]); - await game.classicMode.startBattle([ Species.WIMPOD, Species.TYRUNT ]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const wimpod = game.scene.getPlayerPokemon()!; @@ -273,13 +224,8 @@ describe("Abilities - Wimp Out", () => { ); it("Wimp Out will activate due to weather damage", async () => { - game.override - .weather(WeatherType.HAIL) - .enemyMoveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.weather(WeatherType.HAIL).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -291,14 +237,8 @@ describe("Abilities - Wimp Out", () => { }); it("Does not trigger when enemy has sheer force", async () => { - game.override - .enemyAbility(Abilities.SHEER_FORCE) - .enemyMoveset(Moves.SLUDGE_BOMB) - .startingLevel(95); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyAbility(Abilities.SHEER_FORCE).enemyMoveset(Moves.SLUDGE_BOMB).startingLevel(95); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -309,13 +249,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to post turn status damage", async () => { - game.override - .statusEffect(StatusEffect.POISON) - .enemyMoveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.statusEffect(StatusEffect.POISON).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -327,13 +262,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to bad dreams", async () => { - game.override - .statusEffect(StatusEffect.SLEEP) - .enemyAbility(Abilities.BAD_DREAMS); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.statusEffect(StatusEffect.SLEEP).enemyAbility(Abilities.BAD_DREAMS); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.52; @@ -345,12 +275,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to leech seed", async () => { - game.override - .enemyMoveset([ Moves.LEECH_SEED ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset([Moves.LEECH_SEED]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.52; game.move.select(Moves.SPLASH); @@ -361,13 +287,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to curse damage", async () => { - game.override - .enemySpecies(Species.DUSKNOIR) - .enemyMoveset([ Moves.CURSE ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemySpecies(Species.DUSKNOIR).enemyMoveset([Moves.CURSE]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.52; game.move.select(Moves.SPLASH); @@ -378,15 +299,9 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to salt cure damage", async () => { - game.override - .enemySpecies(Species.NACLI) - .enemyMoveset([ Moves.SALT_CURE ]) - .enemyLevel(1); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); - game.scene.getPlayerPokemon()!.hp *= 0.70; + game.override.enemySpecies(Species.NACLI).enemyMoveset([Moves.SALT_CURE]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.7; game.move.select(Moves.SPLASH); game.doSelectPartyPokemon(1); @@ -396,14 +311,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out will activate due to damaging trap damage", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .enemyMoveset([ Moves.WHIRLPOOL ]) - .enemyLevel(1); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemySpecies(Species.MAGIKARP).enemyMoveset([Moves.WHIRLPOOL]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.55; game.move.select(Moves.SPLASH); @@ -418,13 +327,10 @@ describe("Abilities - Wimp Out", () => { game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); game.override .passiveAbility(Abilities.MAGIC_GUARD) - .enemyMoveset([ Moves.LEECH_SEED ]) + .enemyMoveset([Moves.LEECH_SEED]) .weather(WeatherType.HAIL) .statusEffect(StatusEffect.POISON); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; game.move.select(Moves.SPLASH); @@ -436,15 +342,8 @@ describe("Abilities - Wimp Out", () => { }); it("Wimp Out activating should not cancel a double battle", async () => { - game.override - .battleType("double") - .enemyAbility(Abilities.WIMP_OUT) - .enemyMoveset([ Moves.SPLASH ]) - .enemyLevel(1); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.battleType("double").enemyAbility(Abilities.WIMP_OUT).enemyMoveset([Moves.SPLASH]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); const enemyLeadPokemon = game.scene.getEnemyParty()[0]; const enemySecPokemon = game.scene.getEnemyParty()[1]; @@ -464,15 +363,12 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to aftermath", async () => { game.override - .moveset([ Moves.THUNDER_PUNCH ]) + .moveset([Moves.THUNDER_PUNCH]) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.AFTERMATH) - .enemyMoveset([ Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH]) .enemyLevel(1); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; game.move.select(Moves.THUNDER_PUNCH); @@ -485,26 +381,16 @@ describe("Abilities - Wimp Out", () => { it("Activates due to entry hazards", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0, ArenaTagSide.ENEMY); game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); - game.override - .enemySpecies(Species.CENTISKORCH) - .enemyAbility(Abilities.WIMP_OUT) - .startingWave(4); - await game.classicMode.startBattle([ - Species.TYRUNT - ]); + game.override.enemySpecies(Species.CENTISKORCH).enemyAbility(Abilities.WIMP_OUT).startingWave(4); + await game.classicMode.startBattle([Species.TYRUNT]); expect(game.phaseInterceptor.log).not.toContain("MovePhase"); expect(game.phaseInterceptor.log).toContain("BattleEndPhase"); }); it("Wimp Out will activate due to Nightmare", async () => { - game.override - .enemyMoveset([ Moves.NIGHTMARE ]) - .statusEffect(StatusEffect.SLEEP); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset([Moves.NIGHTMARE]).statusEffect(StatusEffect.SLEEP); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.65; game.move.select(Moves.SPLASH); @@ -515,13 +401,8 @@ describe("Abilities - Wimp Out", () => { }); it("triggers status on the wimp out user before a new pokemon is switched in", async () => { - game.override - .enemyMoveset(Moves.SLUDGE_BOMB) - .startingLevel(80); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset(Moves.SLUDGE_BOMB).startingLevel(80); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); vi.spyOn(allMoves[Moves.SLUDGE_BOMB], "chance", "get").mockReturnValue(100); game.move.select(Moves.SPLASH); @@ -533,13 +414,8 @@ describe("Abilities - Wimp Out", () => { }); it("triggers after last hit of multi hit move", async () => { - game.override - .enemyMoveset(Moves.BULLET_SEED) - .enemyAbility(Abilities.SKILL_LINK); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset(Moves.BULLET_SEED).enemyAbility(Abilities.SKILL_LINK); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -554,13 +430,8 @@ describe("Abilities - Wimp Out", () => { }); it("triggers after last hit of multi hit move (multi lens)", async () => { - game.override - .enemyMoveset(Moves.TACKLE) - .enemyHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset(Moves.TACKLE).enemyHeldItems([{ name: "MULTI_LENS", count: 1 }]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -574,13 +445,8 @@ describe("Abilities - Wimp Out", () => { confirmSwitch(); }); it("triggers after last hit of Parental Bond", async () => { - game.override - .enemyMoveset(Moves.TACKLE) - .enemyAbility(Abilities.PARENTAL_BOND); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); + game.override.enemyMoveset(Moves.TACKLE).enemyAbility(Abilities.PARENTAL_BOND); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); game.scene.getPlayerPokemon()!.hp *= 0.51; @@ -595,34 +461,30 @@ describe("Abilities - Wimp Out", () => { }); // TODO: This interaction is not implemented yet - it.todo("Wimp Out will not activate if the Pokémon's HP falls below half due to hurting itself in confusion", async () => { - game.override - .moveset([ Moves.SWORDS_DANCE ]) - .enemyMoveset([ Moves.SWAGGER ]); - await game.classicMode.startBattle([ - Species.WIMPOD, - Species.TYRUNT - ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.hp *= 0.51; - playerPokemon.setStatStage(Stat.ATK, 6); - playerPokemon.addTag(BattlerTagType.CONFUSED); + it.todo( + "Wimp Out will not activate if the Pokémon's HP falls below half due to hurting itself in confusion", + async () => { + game.override.moveset([Moves.SWORDS_DANCE]).enemyMoveset([Moves.SWAGGER]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.hp *= 0.51; + playerPokemon.setStatStage(Stat.ATK, 6); + playerPokemon.addTag(BattlerTagType.CONFUSED); - // TODO: add helper function to force confusion self-hits + // TODO: add helper function to force confusion self-hits - while (playerPokemon.getHpRatio() > 0.49) { - game.move.select(Moves.SWORDS_DANCE); - await game.phaseInterceptor.to("TurnEndPhase"); - } + while (playerPokemon.getHpRatio() > 0.49) { + game.move.select(Moves.SWORDS_DANCE); + await game.phaseInterceptor.to("TurnEndPhase"); + } - confirmNoSwitch(); - }); + confirmNoSwitch(); + }, + ); it("should not activate on wave X0 bosses", async () => { - game.override.enemyAbility(Abilities.WIMP_OUT) - .startingLevel(5850) - .startingWave(10); - await game.classicMode.startBattle([ Species.GOLISOPOD ]); + game.override.enemyAbility(Abilities.WIMP_OUT).startingLevel(5850).startingWave(10); + await game.classicMode.startBattle([Species.GOLISOPOD]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -642,20 +504,17 @@ describe("Abilities - Wimp Out", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.WIMPOD) .enemyAbility(Abilities.WIMP_OUT) - .moveset([ Moves.MATCHA_GOTCHA, Moves.FALSE_SWIPE ]) + .moveset([Moves.MATCHA_GOTCHA, Moves.FALSE_SWIPE]) .startingLevel(50) .enemyLevel(1) .battleType("double") .startingWave(wave); - await game.classicMode.startBattle([ - Species.RAICHU, - Species.PIKACHU - ]); - const [ wimpod0, wimpod1 ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.RAICHU, Species.PIKACHU]); + const [wimpod0, wimpod1] = game.scene.getEnemyField(); game.move.select(Moves.FALSE_SWIPE, 0, BattlerIndex.ENEMY); game.move.select(Moves.MATCHA_GOTCHA, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase"); expect(wimpod0.hp).toBeGreaterThan(0); diff --git a/test/abilities/wind_power.test.ts b/test/abilities/wind_power.test.ts index f9be5393d15..b28ac3362eb 100644 --- a/test/abilities/wind_power.test.ts +++ b/test/abilities/wind_power.test.ts @@ -26,12 +26,12 @@ describe("Abilities - Wind Power", () => { game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_POWER); - game.override.moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(Moves.SPLASH); }); it("it becomes charged when hit by wind moves", async () => { - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const shiftry = game.scene.getEnemyPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -46,7 +46,7 @@ describe("Abilities - Wind Power", () => { game.override.ability(Abilities.WIND_POWER); game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -61,7 +61,7 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.ability(Abilities.WIND_POWER); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -79,7 +79,7 @@ describe("Abilities - Wind Power", () => { it("does not interact with Sandstorm", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); diff --git a/test/abilities/wind_rider.test.ts b/test/abilities/wind_rider.test.ts index 7cebd70a11a..8fdae1b24ec 100644 --- a/test/abilities/wind_rider.test.ts +++ b/test/abilities/wind_rider.test.ts @@ -26,12 +26,12 @@ describe("Abilities - Wind Rider", () => { .battleType("single") .enemySpecies(Species.SHIFTRY) .enemyAbility(Abilities.WIND_RIDER) - .moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]) + .moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]) .enemyMoveset(Moves.SPLASH); }); 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([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const shiftry = game.scene.getEnemyPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -45,11 +45,9 @@ describe("Abilities - Wind Rider", () => { }); it("ATK stat stage is raised by 1 when Tailwind is present on its side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -62,11 +60,9 @@ describe("Abilities - Wind Rider", () => { }); it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -82,11 +78,9 @@ describe("Abilities - Wind Rider", () => { }); it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -104,7 +98,7 @@ describe("Abilities - Wind Rider", () => { it("does not interact with Sandstorm", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); diff --git a/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts index d6c49ed4abe..f2cb0faed72 100644 --- a/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -25,7 +25,7 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.TACKLE, Moves.CHARM ]); + game.override.moveset([Moves.TACKLE, Moves.CHARM]); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.WONDER_SKIN); @@ -37,7 +37,7 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.CHARM); await game.phaseInterceptor.to(MoveEffectPhase); @@ -49,14 +49,14 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(MoveEffectPhase); expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); }); - const bypassAbilities = [ Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE ]; + const bypassAbilities = [Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE]; bypassAbilities.forEach(ability => { it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { @@ -65,7 +65,7 @@ describe("Abilities - Wonder Skin", () => { game.override.ability(ability); vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.CHARM); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/test/abilities/zen_mode.test.ts b/test/abilities/zen_mode.test.ts index cb4c82e00dc..d552d8c88ca 100644 --- a/test/abilities/zen_mode.test.ts +++ b/test/abilities/zen_mode.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - ZEN MODE", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -38,7 +37,7 @@ describe("Abilities - ZEN MODE", () => { }); it("shouldn't change form when taking damage if not dropping below 50% HP", async () => { - await game.classicMode.startBattle([ Species.DARMANITAN ]); + await game.classicMode.startBattle([Species.DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; expect(darmanitan.formIndex).toBe(baseForm); @@ -51,10 +50,10 @@ describe("Abilities - ZEN MODE", () => { }); it("should change form when falling below 50% HP", async () => { - await game.classicMode.startBattle([ Species.DARMANITAN ]); + await game.classicMode.startBattle([Species.DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; - darmanitan.hp = (darmanitan.getMaxHp() / 2) + 1; + darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; expect(darmanitan.formIndex).toBe(baseForm); game.move.select(Moves.SPLASH); @@ -65,9 +64,9 @@ describe("Abilities - ZEN MODE", () => { }); it("should stay zen mode when fainted", async () => { - await game.classicMode.startBattle([ Species.DARMANITAN, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.DARMANITAN, Species.CHARIZARD]); const darmanitan = game.scene.getPlayerPokemon()!; - darmanitan.hp = (darmanitan.getMaxHp() / 2) + 1; + darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; expect(darmanitan.formIndex).toBe(baseForm); game.move.select(Moves.SPLASH); @@ -91,7 +90,7 @@ describe("Abilities - ZEN MODE", () => { [Species.DARMANITAN]: zenForm, }); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.DARMANITAN ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.DARMANITAN]); const darmanitan = game.scene.getPlayerParty()[1]; darmanitan.hp = 1; diff --git a/test/abilities/zero_to_hero.test.ts b/test/abilities/zero_to_hero.test.ts index 338ebd6344f..4565aa3e8b2 100644 --- a/test/abilities/zero_to_hero.test.ts +++ b/test/abilities/zero_to_hero.test.ts @@ -8,7 +8,6 @@ import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - ZERO TO HERO", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -40,7 +39,7 @@ describe("Abilities - ZERO TO HERO", () => { [Species.PALAFIN]: heroForm, }); - await game.startBattle([ Species.FEEBAS, Species.PALAFIN, Species.PALAFIN ]); + await game.startBattle([Species.FEEBAS, Species.PALAFIN, Species.PALAFIN]); const palafin1 = game.scene.getPlayerParty()[1]; const palafin2 = game.scene.getPlayerParty()[2]; @@ -62,7 +61,7 @@ describe("Abilities - ZERO TO HERO", () => { }); it("should swap to Hero form when switching out during a battle", async () => { - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(baseForm); @@ -73,7 +72,7 @@ describe("Abilities - ZERO TO HERO", () => { }); it("should not swap to Hero form if switching due to faint", async () => { - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(baseForm); @@ -90,7 +89,7 @@ describe("Abilities - ZERO TO HERO", () => { [Species.PALAFIN]: heroForm, }); - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(heroForm); diff --git a/test/account.test.ts b/test/account.test.ts index 099564ce7a8..3f6b9f3f80b 100644 --- a/test/account.test.ts +++ b/test/account.test.ts @@ -17,7 +17,7 @@ describe("account", () => { it("should set loggedInUser! to Guest if bypassLogin is true", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(true); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(true); expect(status).toBe(200); @@ -38,7 +38,7 @@ describe("account", () => { 200, ]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(true); expect(status).toBe(200); @@ -48,9 +48,9 @@ describe("account", () => { it("should handle resolved API errors", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([ null, 401 ]); + vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([null, 401]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(false); expect(status).toBe(401); @@ -58,9 +58,9 @@ describe("account", () => { it("should handle 500 API errors", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([ null, 500 ]); + vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([null, 500]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(false); expect(status).toBe(500); diff --git a/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts index 3c6dc8aefe8..26d33adb00a 100644 --- a/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -1,5 +1,15 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; -import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; +import { + Achv, + AchvTier, + DamageAchv, + HealAchv, + LevelAchv, + ModifierAchv, + MoneyAchv, + RibbonAchv, + achvs, +} from "#app/system/achv"; import { NumberHolder } from "#app/utils"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; @@ -7,13 +17,12 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { - it ("should check Achievement creation", () => { + it("should check Achievement creation", () => { const ach = new MoneyAchv("", "Achievement", 1000, null!, 100); expect(ach.name).toBe("Achievement"); }); }); - describe("Achv", () => { let achv: Achv; @@ -61,8 +70,8 @@ describe("Achv", () => { const conditionFunc = vi.fn((args: any[]) => args[0] === 10); const achv = new Achv("", "Test Achievement", "Test Description", "test_icon", 10, conditionFunc); - expect(achv.validate([ 5 ])).toBe(false); - expect(achv.validate([ 10 ])).toBe(true); + expect(achv.validate([5])).toBe(false); + expect(achv.validate([10])).toBe(true); expect(conditionFunc).toHaveBeenCalledTimes(2); }); }); @@ -140,10 +149,10 @@ describe("DamageAchv", () => { const damageAchv = new DamageAchv("", "Test Damage Achievement", 250, "damage_icon", 10); const numberHolder = new NumberHolder(200); - expect(damageAchv.validate([ numberHolder ])).toBe(false); + expect(damageAchv.validate([numberHolder])).toBe(false); numberHolder.value = 300; - expect(damageAchv.validate([ numberHolder ])).toBe(true); + expect(damageAchv.validate([numberHolder])).toBe(true); }); }); @@ -158,10 +167,10 @@ describe("HealAchv", () => { const healAchv = new HealAchv("", "Test Heal Achievement", 250, "heal_icon", 10); const numberHolder = new NumberHolder(200); - expect(healAchv.validate([ numberHolder ])).toBe(false); + expect(healAchv.validate([numberHolder])).toBe(false); numberHolder.value = 300; - expect(healAchv.validate([ numberHolder ])).toBe(true); + expect(healAchv.validate([numberHolder])).toBe(true); }); }); @@ -176,25 +185,39 @@ describe("LevelAchv", () => { const levelAchv = new LevelAchv("", "Test Level Achievement", 100, "level_icon", 10); const integerHolder = new NumberHolder(50); - expect(levelAchv.validate([ integerHolder ])).toBe(false); + expect(levelAchv.validate([integerHolder])).toBe(false); integerHolder.value = 150; - expect(levelAchv.validate([ integerHolder ])).toBe(true); + expect(levelAchv.validate([integerHolder])).toBe(true); }); }); describe("ModifierAchv", () => { it("should create an instance of ModifierAchv", () => { - const modifierAchv = new ModifierAchv("", "Test Modifier Achievement", "Test Description", "modifier_icon", 10, () => true); + const modifierAchv = new ModifierAchv( + "", + "Test Modifier Achievement", + "Test Description", + "modifier_icon", + 10, + () => true, + ); expect(modifierAchv).toBeInstanceOf(ModifierAchv); expect(modifierAchv instanceof Achv).toBe(true); }); it("should validate the achievement based on the modifier function", () => { - const modifierAchv = new ModifierAchv("", "Test Modifier Achievement", "Test Description", "modifier_icon", 10, () => true); + const modifierAchv = new ModifierAchv( + "", + "Test Modifier Achievement", + "Test Description", + "modifier_icon", + 10, + () => true, + ); const modifier = new TurnHeldItemTransferModifier(null!, 3, 1); - expect(modifierAchv.validate([ modifier ])).toBe(true); + expect(modifierAchv.validate([modifier])).toBe(true); }); }); @@ -243,7 +266,6 @@ describe("achvs", () => { }); it("should initialize the achievements with IDs and parent IDs", () => { - expect(achvs._10K_MONEY.id).toBe("_10K_MONEY"); expect(achvs._10K_MONEY.hasParent).toBe(undefined); expect(achvs._100K_MONEY.id).toBe("_100K_MONEY"); diff --git a/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts index 4bacf51f094..a5ce84667f0 100644 --- a/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -27,7 +27,7 @@ describe("Arena - Gravity", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset([ Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE ]) + .moveset([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]) .ability(Abilities.UNNERVE) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) @@ -43,7 +43,7 @@ describe("Arena - Gravity", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to("TurnEndPhase"); @@ -64,7 +64,7 @@ describe("Arena - Gravity", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to("TurnEndPhase"); @@ -80,11 +80,9 @@ describe("Arena - Gravity", () => { describe("Against flying types", () => { it("can be hit by ground-type moves now", async () => { - game.override - .enemySpecies(Species.PIDGEOT) - .moveset([ Moves.GRAVITY, Moves.EARTHQUAKE ]); + game.override.enemySpecies(Species.PIDGEOT).moveset([Moves.GRAVITY, Moves.EARTHQUAKE]); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); @@ -111,11 +109,9 @@ describe("Arena - Gravity", () => { }); it("keeps super-effective moves super-effective after using gravity", async () => { - game.override - .enemySpecies(Species.PIDGEOT) - .moveset([ Moves.GRAVITY, Moves.THUNDERBOLT ]); + game.override.enemySpecies(Species.PIDGEOT).moveset([Moves.GRAVITY, Moves.THUNDERBOLT]); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); @@ -136,12 +132,9 @@ describe("Arena - Gravity", () => { }); it("cancels Fly if its user is semi-invulnerable", async () => { - game.override - .enemySpecies(Species.SNORLAX) - .enemyMoveset(Moves.FLY) - .moveset([ Moves.GRAVITY, Moves.SPLASH ]); + game.override.enemySpecies(Species.SNORLAX).enemyMoveset(Moves.FLY).moveset([Moves.GRAVITY, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const charizard = game.scene.getPlayerPokemon()!; const snorlax = game.scene.getEnemyPokemon()!; @@ -152,7 +145,7 @@ describe("Arena - Gravity", () => { expect(snorlax.getTag(BattlerTagType.FLYING)).toBeDefined(); game.move.select(Moves.GRAVITY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(snorlax.getTag(BattlerTagType.INTERRUPTED)).toBeDefined(); diff --git a/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts index a9a955efdfe..d92fb24be5a 100644 --- a/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -28,12 +28,12 @@ describe("Arena - Grassy Terrain", () => { .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.STURDY) .enemyMoveset(Moves.FLY) - .moveset([ Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE ]) + .moveset([Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE]) .ability(Abilities.NO_GUARD); }); it("halves the damage of Earthquake", async () => { - await game.classicMode.startBattle([ Species.TAUROS ]); + await game.classicMode.startBattle([Species.TAUROS]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); @@ -53,7 +53,7 @@ describe("Arena - Grassy Terrain", () => { }); it("Does not halve the damage of Earthquake if opponent is not grounded", async () => { - await game.classicMode.startBattle([ Species.NINJASK ]); + await game.classicMode.startBattle([Species.NINJASK]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); diff --git a/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts index 1b98b791aec..784c4886648 100644 --- a/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -24,14 +24,12 @@ describe("Weather - Fog", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .weather(WeatherType.FOG) - .battleType("single"); - game.override.moveset([ Moves.TACKLE ]); + game.override.weather(WeatherType.FOG).battleType("single"); + game.override.moveset([Moves.TACKLE]); game.override.ability(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); }); it("move accuracy is multiplied by 90%", async () => { @@ -39,7 +37,7 @@ describe("Weather - Fog", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/test/arena/weather_hail.test.ts b/test/arena/weather_hail.test.ts index 137c7622517..7af2edf26f2 100644 --- a/test/arena/weather_hail.test.ts +++ b/test/arena/weather_hail.test.ts @@ -31,10 +31,10 @@ describe("Weather - Hail", () => { }); it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); @@ -44,11 +44,11 @@ describe("Weather - Hail", () => { }); it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { - game.override.moveset([ Moves.DIG ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.DIG]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.DIG); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); @@ -60,7 +60,7 @@ describe("Weather - Hail", () => { }); it("does not inflict damage to Ice type Pokemon", async () => { - await game.classicMode.startBattle([ Species.CLOYSTER ]); + await game.classicMode.startBattle([Species.CLOYSTER]); game.move.select(Moves.SPLASH); diff --git a/test/arena/weather_sandstorm.test.ts b/test/arena/weather_sandstorm.test.ts index 6420117d107..d43983c4c01 100644 --- a/test/arena/weather_sandstorm.test.ts +++ b/test/arena/weather_sandstorm.test.ts @@ -32,7 +32,7 @@ describe("Weather - Sandstorm", () => { }); it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH); @@ -44,8 +44,8 @@ describe("Weather - Sandstorm", () => { }); it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { - game.override.moveset([ Moves.DIVE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.DIVE]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.DIVE); @@ -65,7 +65,7 @@ describe("Weather - Sandstorm", () => { .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.ROCKRUFF, Species.KLINK ]); + await game.classicMode.startBattle([Species.ROCKRUFF, Species.KLINK]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 1); @@ -78,7 +78,7 @@ describe("Weather - Sandstorm", () => { }); it("increases Rock type Pokemon Sp.Def by 50%", async () => { - await game.classicMode.startBattle([ Species.ROCKRUFF ]); + await game.classicMode.startBattle([Species.ROCKRUFF]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerSpdef = playerPokemon.getStat(Stat.SPDEF); diff --git a/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts index edc3025111d..3a9235d9eb9 100644 --- a/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -28,13 +28,13 @@ describe("Weather - Strong Winds", () => { game.override.startingLevel(10); game.override.enemySpecies(Species.TAILLOW); game.override.enemyAbility(Abilities.DELTA_STREAM); - game.override.moveset([ Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE ]); + game.override.moveset([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); }); it("electric type move is not very effective on Rayquaza", async () => { game.override.enemySpecies(Species.RAYQUAZA); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -45,7 +45,7 @@ describe("Weather - Strong Winds", () => { }); it("electric type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -56,7 +56,7 @@ describe("Weather - Strong Winds", () => { }); it("ice type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -67,7 +67,7 @@ describe("Weather - Strong Winds", () => { }); it("rock type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -80,7 +80,7 @@ describe("Weather - Strong Winds", () => { it("weather goes away when last trainer pokemon dies to indirect damage", async () => { game.override.enemyStatusEffect(StatusEffect.POISON); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; enemy.hp = 1; diff --git a/test/battle/ability_swap.test.ts b/test/battle/ability_swap.test.ts index ff3f7c002bc..b9c609e89f6 100644 --- a/test/battle/ability_swap.test.ts +++ b/test/battle/ability_swap.test.ts @@ -24,7 +24,7 @@ describe("Test Ability Swapping", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -34,7 +34,7 @@ describe("Test Ability Swapping", () => { }); it("should activate post-summon abilities", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.INTIMIDATE]); @@ -45,7 +45,7 @@ describe("Test Ability Swapping", () => { it("should remove primal weather when the setter's ability is removed", async () => { game.override.ability(Abilities.DESOLATE_LAND); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); @@ -56,7 +56,7 @@ describe("Test Ability Swapping", () => { it("should not activate passive abilities", async () => { game.override.passiveAbility(Abilities.INTREPID_SWORD); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); diff --git a/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts index 165a2fc916c..012f1ecd4bd 100644 --- a/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -28,18 +28,16 @@ describe("Battle order", () => { game.override.enemySpecies(Species.MEWTWO); game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); }); it("opponent faster than player 50 vs 150", async () => { - await game.startBattle([ - Species.BULBASAUR, - ]); + await game.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.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 + 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 game.move.select(Moves.TACKLE); await game.phaseInterceptor.run(EnemyCommandPhase); @@ -53,14 +51,12 @@ describe("Battle order", () => { }, 20000); it("Player faster than opponent 150 vs 50", async () => { - await game.startBattle([ - Species.BULBASAUR, - ]); + await game.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.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 + 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 game.move.select(Moves.TACKLE); await game.phaseInterceptor.run(EnemyCommandPhase); @@ -75,16 +71,13 @@ describe("Battle order", () => { it("double - both opponents faster than player 50/50 vs 150/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 50 ])); // set both playerPokemons' speed to 50 - enemyPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ])); // set both enemyPokemons' speed to 150 + playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50])); // set both playerPokemons' speed to 50 + enemyPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150])); // set both enemyPokemons' speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); @@ -102,16 +95,13 @@ describe("Battle order", () => { it("double - speed tie except 1 - 100/100 vs 100/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ])); //set both playerPokemons' speed to 100 - vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set enemyPokemon's speed to 100 - vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set enemyPokemon's speed to 150 + playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100])); //set both playerPokemons' speed to 100 + vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set enemyPokemon's speed to 100 + vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); @@ -129,17 +119,14 @@ describe("Battle order", () => { it("double - speed tie 100/150 vs 100/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set one playerPokemon's speed to 100 - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set other playerPokemon's speed to 150 - vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set one enemyPokemon's speed to 100 - vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set other enemyPokemon's speed to 150 + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one playerPokemon's speed to 100 + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other playerPokemon's speed to 150 + vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one enemyPokemon's speed to 100 + vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other enemyPokemon's speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); diff --git a/test/battle/battle.test.ts b/test/battle/battle.test.ts index edd04cf8ed0..36d197d1289 100644 --- a/test/battle/battle.test.ts +++ b/test/battle/battle.test.ts @@ -59,7 +59,6 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.run(TitlePhase); await game.waitMode(Mode.TITLE); - expect(game.scene.ui?.getMode()).toBe(Mode.TITLE); expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); @@ -81,7 +80,6 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.run(TitlePhase); await game.waitMode(Mode.TITLE); - expect(game.scene.ui?.getMode()).toBe(Mode.TITLE); expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); @@ -96,12 +94,10 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(2000); - game.override - .startingWave(3) - .battleType("single"); - game.override.moveset([ Moves.TACKLE ]); + game.override.startingWave(3).battleType("single"); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); game.move.select(Moves.TACKLE); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(SelectModifierPhase, false); @@ -112,9 +108,9 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(5); game.override.startingWave(3); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP ]); + game.override.enemyMoveset([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); game.override.battleType("single"); await game.startBattle(); game.move.select(Moves.TACKLE); @@ -123,7 +119,7 @@ describe("Test Battle Phase", () => { it("load 100% data file", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -131,11 +127,7 @@ describe("Test Battle Phase", () => { }, 20000); it("start battle with selected team", async () => { - await game.startBattle([ - Species.CHARIZARD, - Species.CHANSEY, - Species.MEW - ]); + await game.startBattle([Species.CHARIZARD, Species.CHANSEY, Species.MEW]); expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.CHARIZARD); expect(game.scene.getPlayerParty()[1].species.speciesId).toBe(Species.CHANSEY); expect(game.scene.getPlayerParty()[2].species.speciesId).toBe(Species.MEW); @@ -150,7 +142,7 @@ describe("Test Battle Phase", () => { it("wrong phase", async () => { await game.phaseInterceptor.run(LoginPhase); - await game.phaseInterceptor.run(LoginPhase).catch((e) => { + await game.phaseInterceptor.run(LoginPhase).catch(e => { expect(e).toBe("Wrong phase: this is SelectGenderPhase and not LoginPhase"); }); }, 20000); @@ -162,29 +154,44 @@ describe("Test Battle Phase", () => { it("good run", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); await game.phaseInterceptor.run(SelectGenderPhase, () => game.isCurrentPhase(TitlePhase)); await game.phaseInterceptor.run(TitlePhase); }, 20000); it("good run from select gender to title", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); await game.phaseInterceptor.runFrom(SelectGenderPhase).to(TitlePhase); }, 20000); it("good run to SummonPhase phase", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); game.onNextPrompt("TitlePhase", Mode.TITLE, () => { game.scene.gameMode = getGameMode(GameModes.CLASSIC); const starters = generateStarter(game.scene); @@ -200,10 +207,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -213,9 +217,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - await game.startBattle([ - Species.BLASTOISE, - ]); + await game.startBattle([Species.BLASTOISE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -226,10 +228,7 @@ describe("Test Battle Phase", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -240,12 +239,7 @@ describe("Test Battle Phase", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - Species.DARKRAI, - Species.GABITE, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD, Species.DARKRAI, Species.GABITE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -259,12 +253,9 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - await game.startBattle([ - Species.DARMANITAN, - Species.CHARIZARD, - ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + await game.startBattle([Species.DARMANITAN, Species.CHARIZARD]); game.move.select(moveToUse); await game.phaseInterceptor.to(DamageAnimPhase, false); @@ -282,8 +273,8 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; game.move.select(moveToUse); @@ -302,8 +293,8 @@ describe("Test Battle Phase", () => { .startingLevel(2000) .startingWave(3) .startingBiome(Biome.LAKE) - .moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + .moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.classicMode.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.move.select(moveToUse); @@ -323,7 +314,7 @@ describe("Test Battle Phase", () => { .enemySpecies(Species.RATTATA) .startingWave(1) .startingLevel(100) - .moveset([ moveToUse ]) + .moveset([moveToUse]) .enemyMoveset(Moves.SPLASH) .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]); @@ -335,10 +326,14 @@ describe("Test Battle Phase", () => { game.doRevivePokemon(0); // pretend max revive was picked game.doSelectModifier(); - game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { - expect.fail("Switch was forced"); - }, () => game.isCurrentPhase(NextEncounterPhase)); + game.onNextPrompt( + "SwitchPhase", + Mode.PARTY, + () => { + expect.fail("Switch was forced"); + }, + () => game.isCurrentPhase(NextEncounterPhase), + ); await game.phaseInterceptor.to(SwitchPhase); }, 20000); }); - diff --git a/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts index 111a53a0c9b..dab1fc81caa 100644 --- a/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -33,11 +33,11 @@ describe("Battle Mechanics - Damage Calculation", () => { .startingLevel(100) .enemyLevel(100) .disableCrits() - .moveset([ Moves.TACKLE, Moves.DRAGON_RAGE, Moves.FISSURE, Moves.JUMP_KICK ]); + .moveset([Moves.TACKLE, Moves.DRAGON_RAGE, Moves.FISSURE, Moves.JUMP_KICK]); }); it("Tackle deals expected base damage", async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const playerPokemon = game.scene.getPlayerPokemon()!; vi.spyOn(playerPokemon, "getEffectiveStat").mockReturnValue(80); @@ -51,11 +51,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("Attacks deal 1 damage at minimum", async () => { - game.override - .startingLevel(1) - .enemySpecies(Species.AGGRON); + game.override.startingLevel(1).enemySpecies(Species.AGGRON); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const aggron = game.scene.getEnemyPokemon()!; @@ -68,13 +66,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("Attacks deal 1 damage at minimum even with many tokens", async () => { - game.override - .startingLevel(1) - .enemySpecies(Species.AGGRON) - .enemyAbility(Abilities.STURDY) - .enemyLevel(10000); + game.override.startingLevel(1).enemySpecies(Species.AGGRON).enemyAbility(Abilities.STURDY).enemyLevel(10000); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const dmg_redux_modifier = modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier; dmg_redux_modifier.stackCount = 1000; @@ -90,11 +84,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("Fixed-damage moves ignore damage multipliers", async () => { - game.override - .enemySpecies(Species.DRAGONITE) - .enemyAbility(Abilities.MULTISCALE); + game.override.enemySpecies(Species.DRAGONITE).enemyAbility(Abilities.MULTISCALE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const magikarp = game.scene.getPlayerPokemon()!; const dragonite = game.scene.getEnemyPokemon()!; @@ -103,11 +95,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("One-hit KO moves ignore damage multipliers", async () => { - game.override - .enemySpecies(Species.AGGRON) - .enemyAbility(Abilities.MULTISCALE); + game.override.enemySpecies(Species.AGGRON).enemyAbility(Abilities.MULTISCALE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const magikarp = game.scene.getPlayerPokemon()!; const aggron = game.scene.getEnemyPokemon()!; @@ -116,11 +106,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => { - game.override - .enemySpecies(Species.GASTLY) - .ability(Abilities.WONDER_GUARD); + game.override.enemySpecies(Species.GASTLY).ability(Abilities.WONDER_GUARD); - await game.classicMode.startBattle([ Species.SHEDINJA ]); + await game.classicMode.startBattle([Species.SHEDINJA]); const shedinja = game.scene.getPlayerPokemon()!; @@ -131,15 +119,11 @@ describe("Battle Mechanics - Damage Calculation", () => { expect(shedinja.hp).toBe(shedinja.getMaxHp() - 1); }); - it("Charizard with odd HP survives Stealth Rock damage twice", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); - game.override - .seed("Charizard Stealth Rock test") - .enemySpecies(Species.CHARIZARD) - .enemyAbility(Abilities.BLAZE); + game.override.seed("Charizard Stealth Rock test").enemySpecies(Species.CHARIZARD).enemyAbility(Abilities.BLAZE); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const charizard = game.scene.getEnemyPokemon()!; diff --git a/test/battle/double_battle.test.ts b/test/battle/double_battle.test.ts index de65245698e..21d27573d22 100644 --- a/test/battle/double_battle.test.ts +++ b/test/battle/double_battle.test.ts @@ -34,11 +34,7 @@ describe("Double Battles", () => { // (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc) it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => { game.override.battleType("double").enemyMoveset(Moves.SPLASH).moveset(Moves.SPLASH); - await game.startBattle([ - Species.BULBASAUR, - Species.CHARIZARD, - Species.SQUIRTLE, - ]); + await game.startBattle([Species.BULBASAUR, Species.CHARIZARD, Species.SQUIRTLE]); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -70,13 +66,14 @@ describe("Double Battles", () => { return rngSweepProgress * (max - min) + min; }); - game.override.enemyMoveset(Moves.SPLASH) + game.override + .enemyMoveset(Moves.SPLASH) .moveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH); // Play through endless, waves 1 to 9, counting number of double battles from waves 2 to 9 - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); game.scene.gameMode = getGameMode(GameModes.ENDLESS); for (let i = 0; i < DOUBLE_CHANCE; i++) { diff --git a/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts index 9d23a34a45e..83109c35740 100644 --- a/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -10,7 +10,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Inverse Battle", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -40,10 +39,7 @@ describe("Inverse Battle", () => { }); it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.SANDSHREW); - + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.SANDSHREW); await game.challengeMode.startBattle(); @@ -51,16 +47,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.PIDGEY); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.PIDGEY); await game.challengeMode.startBattle(); @@ -68,16 +62,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.5); }); it("0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.CHIKORITA); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.CHIKORITA); await game.challengeMode.startBattle(); @@ -85,7 +77,7 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); @@ -93,9 +85,7 @@ describe("Inverse Battle", () => { it("Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); - game.override - .enemySpecies(Species.CHARIZARD) - .enemyLevel(100); + game.override.enemySpecies(Species.CHARIZARD).enemyLevel(100); await game.challengeMode.startBattle(); @@ -107,14 +97,17 @@ describe("Inverse Battle", () => { const currentHp = charizard.hp; const expectedHP = maxHp - damage_prediction; - console.log("Charizard's max HP: " + maxHp, "Damage: " + damage_prediction, "Current HP: " + currentHp, "Expected HP: " + expectedHP); - expect(currentHp).toBeGreaterThan(maxHp * 31 / 32 - 1); + console.log( + "Charizard's max HP: " + maxHp, + "Damage: " + damage_prediction, + "Current HP: " + currentHp, + "Expected HP: " + expectedHP, + ); + expect(currentHp).toBeGreaterThan((maxHp * 31) / 32 - 1); }); it("Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => { - game.override - .moveset([ Moves.FREEZE_DRY ]) - .enemySpecies(Species.SQUIRTLE); + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.SQUIRTLE); await game.challengeMode.startBattle(); @@ -122,39 +115,35 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("Water Absorb should heal against water moves - Water Absorb against Water gun", async () => { - game.override - .moveset([ Moves.WATER_GUN ]) - .enemyAbility(Abilities.WATER_ABSORB); + game.override.moveset([Moves.WATER_GUN]).enemyAbility(Abilities.WATER_ABSORB); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; enemy.hp = enemy.getMaxHp() - 1; game.move.select(Moves.WATER_GUN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.hp).toBe(enemy.getMaxHp()); }); it("Fire type does not get burned - Will-O-Wisp against Charmander", async () => { - game.override - .moveset([ Moves.WILL_O_WISP ]) - .enemySpecies(Species.CHARMANDER); + game.override.moveset([Moves.WILL_O_WISP]).enemySpecies(Species.CHARMANDER); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.WILL_O_WISP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEndPhase"); @@ -162,45 +151,36 @@ describe("Inverse Battle", () => { }); it("Electric type does not get paralyzed - Nuzzle against Pikachu", async () => { - game.override - .moveset([ Moves.NUZZLE ]) - .enemySpecies(Species.PIKACHU) - .enemyLevel(50); + game.override.moveset([Moves.NUZZLE]).enemySpecies(Species.PIKACHU).enemyLevel(50); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.NUZZLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).not.toBe(StatusEffect.PARALYSIS); }); it("Ground type is not immune to Thunder Wave - Thunder Wave against Sandshrew", async () => { - game.override - .moveset([ Moves.THUNDER_WAVE ]) - .enemySpecies(Species.SANDSHREW); + game.override.moveset([Moves.THUNDER_WAVE]).enemySpecies(Species.SANDSHREW); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.THUNDER_WAVE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS); }); - it("Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.SANDSHREW) - .enemyAbility(Abilities.ANTICIPATION); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.SANDSHREW).enemyAbility(Abilities.ANTICIPATION); await game.challengeMode.startBattle(); @@ -209,15 +189,15 @@ describe("Inverse Battle", () => { it("Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => { game.override - .moveset([ Moves.CONVERSION_2 ]) - .enemyMoveset([ Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW ]); + .moveset([Moves.CONVERSION_2]) + .enemyMoveset([Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW]); await game.challengeMode.startBattle(); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.CONVERSION_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); @@ -225,9 +205,7 @@ describe("Inverse Battle", () => { }); it("Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => { - game.override - .moveset([ Moves.FLYING_PRESS ]) - .enemySpecies(Species.MEOWSCARADA); + game.override.moveset([Moves.FLYING_PRESS]).enemySpecies(Species.MEOWSCARADA); await game.challengeMode.startBattle(); @@ -235,17 +213,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FLYING_PRESS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.25); }); it("Scrappy ability has no effect - Tackle against Ghost Type still 2x effective with Scrappy", async () => { - game.override - .moveset([ Moves.TACKLE ]) - .ability(Abilities.SCRAPPY) - .enemySpecies(Species.GASTLY); + game.override.moveset([Moves.TACKLE]).ability(Abilities.SCRAPPY).enemySpecies(Species.GASTLY); await game.challengeMode.startBattle(); @@ -253,16 +228,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("FORESIGHT has no effect - Tackle against Ghost Type still 2x effective with Foresight", async () => { - game.override - .moveset([ Moves.FORESIGHT, Moves.TACKLE ]) - .enemySpecies(Species.GASTLY); + game.override.moveset([Moves.FORESIGHT, Moves.TACKLE]).enemySpecies(Species.GASTLY); await game.challengeMode.startBattle(); @@ -270,11 +243,11 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FORESIGHT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); diff --git a/test/battle/special_battle.test.ts b/test/battle/special_battle.test.ts index df24626766c..cf7f3733484 100644 --- a/test/battle/special_battle.test.ts +++ b/test/battle/special_battle.test.ts @@ -25,119 +25,72 @@ describe("Test Battle Phase", () => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(2000); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it("startBattle 2vs1 boss", async() => { - game.override - .battleType("single") - .startingWave(10); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 boss", async () => { + game.override.battleType("single").startingWave(10); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 boss", async() => { - game.override - .battleType("double") - .startingWave(10); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 boss", async () => { + game.override.battleType("double").startingWave(10); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs1 trainer", async() => { - game.override - .battleType("single") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 trainer", async () => { + game.override.battleType("single").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs1 rival", async() => { - game.override - .battleType("single") - .startingWave(8); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 rival", async () => { + game.override.battleType("single").startingWave(8); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 rival", async() => { - game.override - .battleType("double") - .startingWave(8); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 rival", async () => { + game.override.battleType("double").startingWave(8); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 1vs1 trainer", async() => { - game.override - .battleType("single") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - ]); + it("startBattle 1vs1 trainer", async () => { + game.override.battleType("single").startingWave(5); + await game.startBattle([Species.BLASTOISE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 4vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - Species.DARKRAI, - Species.GABITE, - ]); + it("startBattle 4vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD, Species.DARKRAI, Species.GABITE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); }); - diff --git a/test/battlerTags/octolock.test.ts b/test/battlerTags/octolock.test.ts index f161d90d466..6189bd7febe 100644 --- a/test/battlerTags/octolock.test.ts +++ b/test/battlerTags/octolock.test.ts @@ -31,7 +31,7 @@ describe("BattlerTag - OctolockTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(-1); - expect((phase as StatStageChangePhase)["stats"]).toEqual([ Stat.DEF, Stat.SPDEF ]); + expect((phase as StatStageChangePhase)["stats"]).toEqual([Stat.DEF, Stat.SPDEF]); }); subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END); @@ -40,7 +40,7 @@ describe("BattlerTag - OctolockTag", () => { }); }); - it ("traps its target (extends TrappedTag)", async () => { + it("traps its target (extends TrappedTag)", async () => { expect(new OctolockTag(1)).toBeInstanceOf(TrappedTag); }); }); diff --git a/test/battlerTags/stockpiling.test.ts b/test/battlerTags/stockpiling.test.ts index 5970b5abbc6..20fade13d92 100644 --- a/test/battlerTags/stockpiling.test.ts +++ b/test/battlerTags/stockpiling.test.ts @@ -39,9 +39,9 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onAdd(mockPokemon); @@ -65,9 +65,9 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onAdd(mockPokemon); @@ -89,9 +89,9 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onOverlap(mockPokemon); @@ -117,10 +117,10 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // def doesn't change - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [ 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.SPDEF], [1]); }); subject.onAdd(mockPokemon); @@ -129,10 +129,10 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // def doesn't change - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [ 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.SPDEF], [1]); }); subject.onOverlap(mockPokemon); @@ -141,7 +141,7 @@ describe("BattlerTag - StockpilingTag", () => { vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // neither stat changes, stack count should still increase }); @@ -156,13 +156,16 @@ describe("BattlerTag - StockpilingTag", () => { // fourth stack should not be applied subject.onOverlap(mockPokemon); expect(subject.stockpiledCount).toBe(3); - expect(subject.statChangeCounts).toMatchObject({ [Stat.DEF]: 0, [Stat.SPDEF]: 2 }); + expect(subject.statChangeCounts).toMatchObject({ + [Stat.DEF]: 0, + [Stat.SPDEF]: 2, + }); // removing tag should reverse stat changes vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(-2); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.SPDEF])); }); subject.onRemove(mockPokemon); diff --git a/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts index 7e27cf9a826..e80453d2933 100644 --- a/test/battlerTags/substitute.test.ts +++ b/test/battlerTags/substitute.test.ts @@ -20,65 +20,58 @@ describe("BattlerTag - SubstituteTag", () => { hp: 101, id: 0, getMaxHp: vi.fn().mockReturnValue(101) as Pokemon["getMaxHp"], - findAndRemoveTags: vi.fn().mockImplementation((tagFilter) => { + findAndRemoveTags: vi.fn().mockImplementation(tagFilter => { // simulate a Trapped tag set by another Pokemon, then expect the filter to catch it. const trapTag = new BindTag(5, 0); expect(tagFilter(trapTag)).toBeTruthy(); return true; - }) as Pokemon["findAndRemoveTags"] + }) as Pokemon["findAndRemoveTags"], } as unknown as Pokemon; vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); - vi.spyOn(mockPokemon.scene as BattleScene, "getPokemonById").mockImplementation(pokemonId => mockPokemon.id === pokemonId ? mockPokemon : null); + vi.spyOn(mockPokemon.scene as BattleScene, "getPokemonById").mockImplementation(pokemonId => + mockPokemon.id === pokemonId ? mockPokemon : null, + ); }); - it( - "sets the tag's HP to 1/4 of the source's max HP (rounded down)", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("sets the tag's HP to 1/4 of the source's max HP (rounded down)", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - subject.onAdd(mockPokemon); + subject.onAdd(mockPokemon); - expect(subject.hp).toBe(25); - } - ); + expect(subject.hp).toBe(25); + }); - it( - "triggers on-add effects that bring the source out of focus", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("triggers on-add effects that bring the source out of focus", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_ADD); - return true; - } - ); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_ADD); + return true; + }, + ); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - subject.onAdd(mockPokemon); + subject.onAdd(mockPokemon); - expect(subject.sourceInFocus).toBeFalsy(); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); - } - ); + expect(subject.sourceInFocus).toBeFalsy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); - it( - "removes effects that trap the source", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("removes effects that trap the source", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - subject.onAdd(mockPokemon); - expect(mockPokemon.findAndRemoveTags).toHaveBeenCalledTimes(1); - } - ); + subject.onAdd(mockPokemon); + expect(mockPokemon.findAndRemoveTags).toHaveBeenCalledTimes(1); + }); }); describe("onRemove behavior", () => { @@ -87,33 +80,30 @@ describe("BattlerTag - SubstituteTag", () => { scene: new BattleScene(), hp: 101, id: 0, - isFainted: vi.fn().mockReturnValue(false) as Pokemon["isFainted"] + isFainted: vi.fn().mockReturnValue(false) as Pokemon["isFainted"], } as unknown as Pokemon; vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); }); - it( - "triggers on-remove animation and message", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - subject.sourceInFocus = false; + it("triggers on-remove animation and message", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + subject.sourceInFocus = false; - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_REMOVE); - return true; - } - ); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_REMOVE); + return true; + }, + ); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - subject.onRemove(mockPokemon); + subject.onRemove(mockPokemon); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); - } - ); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); }); describe("lapse behavior", () => { @@ -123,109 +113,98 @@ describe("BattlerTag - SubstituteTag", () => { hp: 101, id: 0, turnData: { acted: true } as PokemonTurnData, - getLastXMoves: vi.fn().mockReturnValue([ { move: Moves.TACKLE, result: MoveResult.SUCCESS } as TurnMove ]) as Pokemon["getLastXMoves"], + getLastXMoves: vi + .fn() + .mockReturnValue([ + { move: Moves.TACKLE, result: MoveResult.SUCCESS } as TurnMove, + ]) as Pokemon["getLastXMoves"], } as unknown as Pokemon; vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); }); - it( - "PRE_MOVE lapse triggers pre-move animation", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("PRE_MOVE lapse triggers pre-move animation", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_PRE_MOVE); - return true; - } - ); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_PRE_MOVE); + return true; + }, + ); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - expect(subject.lapse(mockPokemon, BattlerTagLapseType.PRE_MOVE)).toBeTruthy(); + expect(subject.lapse(mockPokemon, BattlerTagLapseType.PRE_MOVE)).toBeTruthy(); - expect(subject.sourceInFocus).toBeTruthy(); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); - } - ); + expect(subject.sourceInFocus).toBeTruthy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); - it( - "AFTER_MOVE lapse triggers post-move animation", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("AFTER_MOVE lapse triggers post-move animation", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_POST_MOVE); - return true; - } - ); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_POST_MOVE); + return true; + }, + ); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - expect(subject.lapse(mockPokemon, BattlerTagLapseType.AFTER_MOVE)).toBeTruthy(); + expect(subject.lapse(mockPokemon, BattlerTagLapseType.AFTER_MOVE)).toBeTruthy(); - expect(subject.sourceInFocus).toBeFalsy(); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); - } - ); + expect(subject.sourceInFocus).toBeFalsy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); // TODO: Figure out how to mock a MoveEffectPhase correctly for this test - it.todo( - "HIT lapse triggers on-hit message", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it.todo("HIT lapse triggers on-hit message", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - const pokemonMove = { - getMove: vi.fn().mockReturnValue(allMoves[Moves.TACKLE]) as PokemonMove["getMove"] - } as PokemonMove; + const pokemonMove = { + getMove: vi.fn().mockReturnValue(allMoves[Moves.TACKLE]) as PokemonMove["getMove"], + } as PokemonMove; - const moveEffectPhase = { - move: pokemonMove, - getUserPokemon: vi.fn().mockReturnValue(undefined) as MoveEffectPhase["getUserPokemon"] - } as MoveEffectPhase; + const moveEffectPhase = { + move: pokemonMove, + getUserPokemon: vi.fn().mockReturnValue(undefined) as MoveEffectPhase["getUserPokemon"], + } as MoveEffectPhase; - vi.spyOn(mockPokemon.scene as BattleScene, "getCurrentPhase").mockReturnValue(moveEffectPhase); - vi.spyOn(allMoves[Moves.TACKLE], "hitsSubstitute").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "getCurrentPhase").mockReturnValue(moveEffectPhase); + vi.spyOn(allMoves[Moves.TACKLE], "hitsSubstitute").mockReturnValue(true); - expect(subject.lapse(mockPokemon, BattlerTagLapseType.HIT)).toBeTruthy(); + expect(subject.lapse(mockPokemon, BattlerTagLapseType.HIT)).toBeTruthy(); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); - expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); - } - ); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); - it( - "CUSTOM lapse flags the tag for removal", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("CUSTOM lapse flags the tag for removal", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - expect(subject.lapse(mockPokemon, BattlerTagLapseType.CUSTOM)).toBeFalsy(); - } - ); + expect(subject.lapse(mockPokemon, BattlerTagLapseType.CUSTOM)).toBeFalsy(); + }); - it( - "Unsupported lapse type does nothing", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + it("Unsupported lapse type does nothing", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); - expect(subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END)).toBeTruthy(); + expect(subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END)).toBeTruthy(); - expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); - expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); - } - ); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); }); }); diff --git a/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts index ea5a9000000..6b150de2d2b 100644 --- a/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -33,7 +33,7 @@ describe("Boss Pokemon / Shields", () => { .enemyMoveset(Moves.SPLASH) .enemyHeldItems([]) .startingLevel(1000) - .moveset([ Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH, Moves.PSYCHIC ]) + .moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH, Moves.PSYCHIC]) .ability(Abilities.NO_GUARD); }); @@ -63,11 +63,9 @@ describe("Boss Pokemon / Shields", () => { }); it("should reduce the number of shields if we are in a double battle", async () => { - game.override - .battleType("double") - .startingWave(150); // Floor 150 > 2 shields / 3 health segments + game.override.battleType("double").startingWave(150); // Floor 150 > 2 shields / 3 health segments - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!; const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!; @@ -80,7 +78,7 @@ describe("Boss Pokemon / Shields", () => { it("shields should stop overflow damage and give stat stage boosts when broken", async () => { game.override.startingWave(150); // Floor 150 > 2 shields / 3 health segments - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const segmentHp = enemyPokemon.getMaxHp() / enemyPokemon.bossSegments; @@ -104,15 +102,12 @@ describe("Boss Pokemon / Shields", () => { expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(2 * segmentHp)); // Breaking the last shield gives a +2 boost to ATK, DEF, SP ATK, SP DEF or SPD expect(getTotalStatStageBoosts(enemyPokemon)).toBe(3); - }); it("breaking multiple shields at once requires extra damage", async () => { - game.override - .battleType("double") - .enemyHealthSegments(5); + game.override.battleType("double").enemyHealthSegments(5); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); // In this test we want to break through 3 shields at once const brokenShields = 3; @@ -140,17 +135,14 @@ describe("Boss Pokemon / Shields", () => { boss2.damageAndUpdate(Math.ceil(requiredDamageBoss2)); expect(boss2.bossSegmentIndex).toBe(0); expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * 4)); - }); it("the number of stat stage boosts is consistent when several shields are broken at once", async () => { const shieldsToBreak = 4; - game.override - .battleType("double") - .enemyHealthSegments(shieldsToBreak + 1); + game.override.battleType("double").enemyHealthSegments(shieldsToBreak + 1); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!; const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments; @@ -160,7 +152,6 @@ describe("Boss Pokemon / Shields", () => { expect(boss1.bossSegmentIndex).toBe(shieldsToBreak); expect(getTotalStatStageBoosts(boss1)).toBe(0); - let totalStatStages = 0; // Break the shields one by one @@ -193,15 +184,12 @@ describe("Boss Pokemon / Shields", () => { game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(getTotalStatStageBoosts(boss2)).toBe(totalStatStages); - }); it("the boss enduring does not proc an extra stat boost", async () => { - game.override - .enemyHealthSegments(2) - .enemyAbility(Abilities.STURDY); + game.override.enemyHealthSegments(2).enemyAbility(Abilities.STURDY); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon.isBoss()).toBe(true); @@ -215,7 +203,6 @@ describe("Boss Pokemon / Shields", () => { expect(enemyPokemon.bossSegmentIndex).toBe(0); expect(enemyPokemon.hp).toBe(1); expect(getTotalStatStageBoosts(enemyPokemon)).toBe(1); - }); /** @@ -231,4 +218,3 @@ describe("Boss Pokemon / Shields", () => { return boosts; } }); - diff --git a/test/daily_mode.test.ts b/test/daily_mode.test.ts index 95c01b51434..c530fca61a6 100644 --- a/test/daily_mode.test.ts +++ b/test/daily_mode.test.ts @@ -34,7 +34,7 @@ describe("Daily Mode", () => { const party = game.scene.getPlayerParty(); expect(party).toHaveLength(3); - party.forEach((pkm) => { + party.forEach(pkm => { expect(pkm.level).toBe(20); expect(pkm.moveset.length).toBeGreaterThan(0); }); @@ -60,11 +60,9 @@ describe("Shop modifications", async () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); - game.modifiers - .addCheck("EVIOLITE") - .addCheck("MINI_BLACK_HOLE"); + game.modifiers.addCheck("EVIOLITE").addCheck("MINI_BLACK_HOLE"); vi.spyOn(pokerogueApi.daily, "getSeed").mockResolvedValue("test-seed"); }); @@ -74,15 +72,13 @@ describe("Shop modifications", async () => { }); it("should not have Eviolite and Mini Black Hole available in Classic if not unlocked", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to("BattleEndPhase"); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { expect(game.scene.ui.getHandler()).toBeInstanceOf(ModifierSelectUiHandler); - game.modifiers - .testCheck("EVIOLITE", false) - .testCheck("MINI_BLACK_HOLE", false); + game.modifiers.testCheck("EVIOLITE", false).testCheck("MINI_BLACK_HOLE", false); }); }); @@ -93,9 +89,7 @@ describe("Shop modifications", async () => { await game.phaseInterceptor.to("BattleEndPhase"); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { expect(game.scene.ui.getHandler()).toBeInstanceOf(ModifierSelectUiHandler); - game.modifiers - .testCheck("EVIOLITE", true) - .testCheck("MINI_BLACK_HOLE", true); + game.modifiers.testCheck("EVIOLITE", true).testCheck("MINI_BLACK_HOLE", true); }); }); }); diff --git a/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts index b9ed5b9d365..8ae13366670 100644 --- a/test/data/splash_messages.test.ts +++ b/test/data/splash_messages.test.ts @@ -9,7 +9,7 @@ describe("Data - Splash Messages", () => { // make sure to adjust this test if the weight it changed! it("should add contain 10 `battlesWon` splash messages", () => { - const battlesWonMessages = getSplashMessages().filter((message) => message === "splashMessages:battlesWon"); + const battlesWonMessages = getSplashMessages().filter(message => message === "splashMessages:battlesWon"); expect(battlesWonMessages).toHaveLength(10); }); @@ -51,8 +51,8 @@ function testSeason(startDate: Date, endDate: Date, prefix: string) { const afterDate = new Date(endDate); afterDate.setDate(endDate.getDate() + 1); - const dates: Date[] = [ beforeDate, startDate, endDate, afterDate ]; - const [ before, start, end, after ] = dates.map((date) => { + const dates: Date[] = [beforeDate, startDate, endDate, afterDate]; + const [before, start, end, after] = dates.map(date => { vi.setSystemTime(date); console.log("System time set to", date); const count = getSplashMessages().filter(filterFn).length; diff --git a/test/data/status_effect.test.ts b/test/data/status_effect.test.ts index e94cb193f0a..61dafc1c9b8 100644 --- a/test/data/status_effect.test.ts +++ b/test/data/status_effect.test.ts @@ -328,13 +328,13 @@ describe("Status Effects", () => { .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.QUICK_ATTACK ]) + .moveset([Moves.QUICK_ATTACK]) .ability(Abilities.BALL_FETCH) .statusEffect(StatusEffect.PARALYSIS); }); it("causes the pokemon's move to fail when activated", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.QUICK_ATTACK); await game.move.forceStatusActivation(true); @@ -362,7 +362,7 @@ describe("Status Effects", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -372,7 +372,7 @@ describe("Status Effects", () => { }); it("should last the appropriate number of turns", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 4); @@ -418,7 +418,7 @@ describe("Status Effects", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -429,7 +429,7 @@ describe("Status Effects", () => { }); it("should not inflict a 0 HP mon with a status", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); const player = game.scene.getPlayerPokemon()!; player.hp = 0; diff --git a/test/eggs/egg.test.ts b/test/eggs/egg.test.ts index e4a7cc31709..8875300780b 100644 --- a/test/eggs/egg.test.ts +++ b/test/eggs/egg.test.ts @@ -55,7 +55,12 @@ describe("Egg Generation Tests", () => { let gachaSpeciesCount = 0; for (let i = 0; i < EGG_HATCH_COUNT; i++) { - const result = new Egg({ scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.LEGENDARY }).generatePlayerPokemon().species.speciesId; + const result = new Egg({ + scene, + timestamp, + sourceType: EggSourceType.GACHA_LEGENDARY, + tier: EggTier.LEGENDARY, + }).generatePlayerPokemon().species.speciesId; if (result === expectedSpecies) { gachaSpeciesCount++; } @@ -74,7 +79,10 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedSpecies = Species.ARCEUS; - const result = new Egg({ scene, species: expectedSpecies }).generatePlayerPokemon().species.speciesId; + const result = new Egg({ + scene, + species: expectedSpecies, + }).generatePlayerPokemon().species.speciesId; expect(result).toBe(expectedSpecies); }); @@ -122,7 +130,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({ scene, tier: EggTier.COMMON, id: 204 }).isManaphyEgg(); + const result = new Egg({ + scene, + tier: EggTier.COMMON, + id: 204, + }).isManaphyEgg(); expect(result).toBe(expectedResult); }); @@ -138,7 +150,13 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({ scene, isShiny: expectedResult, species: Species.BULBASAUR }).generatePlayerPokemon().isShiny(); + const result = new Egg({ + scene, + isShiny: expectedResult, + species: Species.BULBASAUR, + }) + .generatePlayerPokemon() + .isShiny(); expect(result).toBe(expectedResult); }); @@ -146,7 +164,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.STANDARD; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon().variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -154,7 +177,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.RARE; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon().variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -162,7 +190,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.EPIC; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon().variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -185,7 +218,11 @@ describe("Egg Generation Tests", () => { it("should return a hatched pokemon with a hidden ability", () => { const scene = game.scene; - const playerPokemon = new Egg({ scene, overrideHiddenAbility: true, species: Species.BULBASAUR }).generatePlayerPokemon(); + const playerPokemon = new Egg({ + scene, + overrideHiddenAbility: true, + species: Species.BULBASAUR, + }).generatePlayerPokemon(); const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; const result = playerPokemon.abilityIndex; @@ -206,7 +243,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedEggTier = EggTier.COMMON; - const result = new Egg({ scene, tier: EggTier.LEGENDARY, species: Species.BULBASAUR }).tier; + const result = new Egg({ + scene, + tier: EggTier.LEGENDARY, + species: Species.BULBASAUR, + }).tier; expect(result).toBe(expectedEggTier); }); @@ -214,7 +255,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedHatchWaves = 10; - const result = new Egg({ scene, tier: EggTier.LEGENDARY, species: Species.BULBASAUR }).hatchWaves; + const result = new Egg({ + scene, + tier: EggTier.LEGENDARY, + species: Species.BULBASAUR, + }).hatchWaves; expect(result).toBe(expectedHatchWaves); }); @@ -243,9 +288,14 @@ describe("Egg Generation Tests", () => { }); it("should increase egg pity", () => { const scene = game.scene; - const startPityValues = [ ...scene.gameData.eggPity ]; + const startPityValues = [...scene.gameData.eggPity]; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.COMMON, + }); expect(scene.gameData.eggPity[EggTier.RARE]).toBe(startPityValues[EggTier.RARE] + 1); expect(scene.gameData.eggPity[EggTier.EPIC]).toBe(startPityValues[EggTier.EPIC] + 1); @@ -253,9 +303,14 @@ describe("Egg Generation Tests", () => { }); it("should increase legendary egg pity by two", () => { const scene = game.scene; - const startPityValues = [ ...scene.gameData.eggPity ]; + const startPityValues = [...scene.gameData.eggPity]; - new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_LEGENDARY, + pulled: true, + tier: EggTier.COMMON, + }); expect(scene.gameData.eggPity[EggTier.RARE]).toBe(startPityValues[EggTier.RARE] + 1); expect(scene.gameData.eggPity[EggTier.EPIC]).toBe(startPityValues[EggTier.EPIC] + 1); @@ -266,7 +321,12 @@ describe("Egg Generation Tests", () => { const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; for (let i = 0; i < 200; i++) { - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + species: Species.BULBASAUR, + }); } expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); @@ -275,7 +335,13 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + id: 204, + tier: EggTier.COMMON, + }); expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); }); @@ -283,7 +349,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.RARE }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.RARE, + }); expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); }); @@ -291,7 +362,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.EPIC }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.EPIC, + }); expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); }); @@ -299,7 +375,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.LEGENDARY }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.LEGENDARY, + }); expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); }); @@ -310,8 +391,16 @@ describe("Egg Generation Tests", () => { const expectedTier1 = EggTier.LEGENDARY; const expectedTier2 = EggTier.EPIC; - const result1 = new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true }).tier; - const result2 = new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true }).tier; + const result1 = new Egg({ + scene, + sourceType: EggSourceType.GACHA_LEGENDARY, + pulled: true, + }).tier; + const result2 = new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + }).tier; expect(result1).toBe(expectedTier1); expect(result2).toBe(expectedTier2); @@ -319,7 +408,12 @@ describe("Egg Generation Tests", () => { it("should generate an epic shiny from pokemon with a different form", () => { const scene = game.scene; - const egg = new Egg({ scene, isShiny: true, variantTier: VariantTier.EPIC, species: Species.MIRAIDON }); + const egg = new Egg({ + scene, + isShiny: true, + variantTier: VariantTier.EPIC, + species: Species.MIRAIDON, + }); expect(egg.variantTier).toBe(VariantTier.EPIC); }); @@ -329,7 +423,11 @@ describe("Egg Generation Tests", () => { scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); scene.resetSeed(); - const firstEgg = new Egg({ scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON }); + const firstEgg = new Egg({ + scene, + sourceType: EggSourceType.GACHA_SHINY, + tier: EggTier.COMMON, + }); const firstHatch = firstEgg.generatePlayerPokemon(); let diffEggMove = false; let diffSpecies = false; @@ -340,12 +438,16 @@ describe("Egg Generation Tests", () => { scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); scene.resetSeed(); // Make sure that eggs are unpredictable even if using same seed - const newEgg = new Egg({ scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON }); + const newEgg = new Egg({ + scene, + sourceType: EggSourceType.GACHA_SHINY, + tier: EggTier.COMMON, + }); const newHatch = newEgg.generatePlayerPokemon(); - diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex); - diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId); - diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny); - diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex); + diffEggMove = diffEggMove || newEgg.eggMoveIndex !== firstEgg.eggMoveIndex; + diffSpecies = diffSpecies || newHatch.species.speciesId !== firstHatch.species.speciesId; + diffShiny = diffShiny || newHatch.shiny !== firstHatch.shiny; + diffAbility = diffAbility || newHatch.abilityIndex !== firstHatch.abilityIndex; } expect(diffEggMove).toBe(true); @@ -371,10 +473,10 @@ describe("Egg Generation Tests", () => { const newEgg = new Egg({ scene, species: Species.BULBASAUR }); const newHatch = newEgg.generatePlayerPokemon(); - diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex); - diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId); - diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny); - diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex); + diffEggMove = diffEggMove || newEgg.eggMoveIndex !== firstEgg.eggMoveIndex; + diffSpecies = diffSpecies || newHatch.species.speciesId !== firstHatch.species.speciesId; + diffShiny = diffShiny || newHatch.shiny !== firstHatch.shiny; + diffAbility = diffAbility || newHatch.abilityIndex !== firstHatch.abilityIndex; } expect(diffEggMove).toBe(true); diff --git a/test/eggs/manaphy-egg.test.ts b/test/eggs/manaphy-egg.test.ts index c63dbae7780..1e7f67a7bb5 100644 --- a/test/eggs/manaphy-egg.test.ts +++ b/test/eggs/manaphy-egg.test.ts @@ -10,7 +10,7 @@ describe("Manaphy Eggs", () => { let phaserGame: Phaser.Game; let game: GameManager; const EGG_HATCH_COUNT: number = 48; - let rngSweepProgress: number = 0; + let rngSweepProgress = 0; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -47,7 +47,12 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, tier: EggTier.COMMON, sourceType: EggSourceType.GACHA_SHINY, id: 204 }); + const newEgg = new Egg({ + scene, + tier: EggTier.COMMON, + sourceType: EggSourceType.GACHA_SHINY, + id: 204, + }); const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; @@ -60,8 +65,8 @@ describe("Manaphy Eggs", () => { } expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); - expect(manaphyCount).toBe(1 / 8 * EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 12 * EGG_HATCH_COUNT); + expect(manaphyCount).toBe((1 / 8) * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 12) * EGG_HATCH_COUNT); }); it("should have correct Manaphy rates and Rare Egg Move rates, from Phione species eggs", () => { @@ -73,7 +78,11 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, species: Species.PHIONE, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const newEgg = new Egg({ + scene, + species: Species.PHIONE, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; @@ -86,8 +95,8 @@ describe("Manaphy Eggs", () => { } expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); - expect(manaphyCount).toBe(1 / 8 * EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 6 * EGG_HATCH_COUNT); + expect(manaphyCount).toBe((1 / 8) * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 6) * EGG_HATCH_COUNT); }); it("should have correct Manaphy rates and Rare Egg Move rates, from Manaphy species eggs", () => { @@ -99,7 +108,11 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, species: Species.MANAPHY, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const newEgg = new Egg({ + scene, + species: Species.MANAPHY, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; @@ -113,6 +126,6 @@ describe("Manaphy Eggs", () => { expect(phioneCount).toBe(0); expect(manaphyCount).toBe(EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 6 * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 6) * EGG_HATCH_COUNT); }); }); diff --git a/test/endless_boss.test.ts b/test/endless_boss.test.ts index ab7df412c12..4be1e379215 100644 --- a/test/endless_boss.test.ts +++ b/test/endless_boss.test.ts @@ -6,7 +6,7 @@ import GameManager from "#test/testUtils/gameManager"; const EndlessBossWave = { Minor: 250, - Major: 1000 + Major: 1000, }; describe("Endless Boss", () => { @@ -21,9 +21,7 @@ describe("Endless Boss", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .startingBiome(Biome.END) - .disableCrits(); + game.override.startingBiome(Biome.END).disableCrits(); }); afterEach(() => { @@ -32,7 +30,7 @@ describe("Endless Boss", () => { it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Endless`, async () => { game.override.startingWave(EndlessBossWave.Minor); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -44,7 +42,7 @@ describe("Endless Boss", () => { it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Endless`, async () => { game.override.startingWave(EndlessBossWave.Major); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -56,7 +54,7 @@ describe("Endless Boss", () => { it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Spliced Endless`, async () => { game.override.startingWave(EndlessBossWave.Minor); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.SPLICED_ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -68,7 +66,7 @@ describe("Endless Boss", () => { it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Spliced Endless`, async () => { game.override.startingWave(EndlessBossWave.Major); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.SPLICED_ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -80,7 +78,7 @@ describe("Endless Boss", () => { it(`should NOT spawn major or minor boss outside wave ${EndlessBossWave.Minor}s in END biome`, async () => { game.override.startingWave(EndlessBossWave.Minor - 1); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).not.toBe(EndlessBossWave.Minor); expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS); diff --git a/test/enemy_command.test.ts b/test/enemy_command.test.ts index 2d6a65e3edd..6d5cc2698a3 100644 --- a/test/enemy_command.test.ts +++ b/test/enemy_command.test.ts @@ -26,8 +26,8 @@ function getEnemyMoveChoices(pokemon: EnemyPokemon, moveChoices: MoveChoiceSet): moveChoices[queuedMove.move]++; } - for (const [ moveId, count ] of Object.entries(moveChoices)) { - console.log(`Move: ${allMoves[moveId].name} Count: ${count} (${count / NUM_TRIALS * 100}%)`); + for (const [moveId, count] of Object.entries(moveChoices)) { + console.log(`Move: ${allMoves[moveId].name} Count: ${count} (${(count / NUM_TRIALS) * 100}%)`); } } @@ -49,62 +49,54 @@ describe("Enemy Commands - Move Selection", () => { game = new GameManager(phaserGame); globalScene = game.scene; - game.override - .ability(Abilities.BALL_FETCH) - .enemyAbility(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH).enemyAbility(Abilities.BALL_FETCH); }); - it( - "should never use Status moves if an attack can KO", - async () => { - game.override - .enemySpecies(Species.ETERNATUS) - .enemyMoveset([ Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER ]) - .startingLevel(1) - .enemyLevel(100); + it("should never use Status moves if an attack can KO", async () => { + game.override + .enemySpecies(Species.ETERNATUS) + .enemyMoveset([Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER]) + .startingLevel(1) + .enemyLevel(100); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.aiType = AiType.SMART_RANDOM; + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; - const moveChoices: MoveChoiceSet = {}; - const enemyMoveset = enemyPokemon.getMoveset(); - enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); - getEnemyMoveChoices(enemyPokemon, moveChoices); + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => (moveChoices[mv!.moveId] = 0)); + getEnemyMoveChoices(enemyPokemon, moveChoices); - enemyMoveset.forEach(mv => { - if (mv?.getMove().category === MoveCategory.STATUS) { - expect(moveChoices[mv.moveId]).toBe(0); - } - }); - } - ); + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }); - it( - "should not select Last Resort if it would fail, even if the move KOs otherwise", - async () => { - game.override - .enemySpecies(Species.KANGASKHAN) - .enemyMoveset([ Moves.LAST_RESORT, Moves.GIGA_IMPACT, Moves.SPLASH, Moves.SWORDS_DANCE ]) - .startingLevel(1) - .enemyLevel(100); + it("should not select Last Resort if it would fail, even if the move KOs otherwise", async () => { + game.override + .enemySpecies(Species.KANGASKHAN) + .enemyMoveset([Moves.LAST_RESORT, Moves.GIGA_IMPACT, Moves.SPLASH, Moves.SWORDS_DANCE]) + .startingLevel(1) + .enemyLevel(100); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.aiType = AiType.SMART_RANDOM; + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; - const moveChoices: MoveChoiceSet = {}; - const enemyMoveset = enemyPokemon.getMoveset(); - enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); - getEnemyMoveChoices(enemyPokemon, moveChoices); + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => (moveChoices[mv!.moveId] = 0)); + getEnemyMoveChoices(enemyPokemon, moveChoices); - enemyMoveset.forEach(mv => { - if (mv?.getMove().category === MoveCategory.STATUS || mv?.moveId === Moves.LAST_RESORT) { - expect(moveChoices[mv.moveId]).toBe(0); - } - }); - } - ); + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS || mv?.moveId === Moves.LAST_RESORT) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }); }); diff --git a/test/escape-calculations.test.ts b/test/escape-calculations.test.ts index 6c5c8777d01..0cbf11dd230 100644 --- a/test/escape-calculations.test.ts +++ b/test/escape-calculations.test.ts @@ -32,13 +32,13 @@ describe("Escape chance calculations", () => { }); it("single non-boss opponent", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); const enemySpeed = 100; // set enemyPokemon's speed to 100 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemySpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -48,7 +48,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 7 }, { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 11 }, @@ -79,7 +83,14 @@ describe("Escape chance calculations", () => { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * enemySpeed, + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); } @@ -87,7 +98,7 @@ describe("Escape chance calculations", () => { it("double non-boss opponent", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.ABOMASNOW ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); @@ -98,9 +109,9 @@ describe("Escape chance calculations", () => { // this is used to find the ratio of the player's first pokemon const playerASpeedPercentage = 0.4; // set enemyAPokemon's speed to 70 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyASpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); // set enemyBPokemon's speed to 30 - vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyBSpeed ]); + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -110,7 +121,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 12 }, { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 21 }, { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 39 }, @@ -134,33 +149,48 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 2.4, escapeAttempts: 9, expectedEscapeChance: 95 }, { pokemonSpeedRatio: 1.8, escapeAttempts: 7, expectedEscapeChance: 95 }, { pokemonSpeedRatio: 2, escapeAttempts: 10, expectedEscapeChance: 95 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set the first playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage) ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage), + ]); // set the second playerPokemon's speed to the remaining value of speed - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5] ]); + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5], + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); // checks to make sure the escape values are the same expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed - expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe( + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed, + ); } }, 20000); it("single boss opponent", async () => { game.override.startingWave(10); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerField()!; const enemyField = game.scene.getEnemyField()!; const enemySpeed = 100; // set enemyPokemon's speed to 100 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemySpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -170,7 +200,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 6 }, @@ -208,14 +242,20 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 5.9, escapeAttempts: 2, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 6.1, escapeAttempts: 3, expectedEscapeChance: 25 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * enemySpeed, + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); } @@ -224,7 +264,7 @@ describe("Escape chance calculations", () => { it("double boss opponent", async () => { game.override.battleType("double"); game.override.startingWave(10); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.ABOMASNOW ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); @@ -235,9 +275,9 @@ describe("Escape chance calculations", () => { // this is used to find the ratio of the player's first pokemon const playerASpeedPercentage = 0.8; // set enemyAPokemon's speed to 70 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyASpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); // set enemyBPokemon's speed to 30 - vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyBSpeed ]); + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -247,7 +287,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 6 }, { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 7 }, { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 10 }, @@ -283,21 +327,36 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 6.5, escapeAttempts: 1, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 12, escapeAttempts: 4, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 5.2, escapeAttempts: 2, expectedEscapeChance: 25 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set the first playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage) ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage), + ]); // set the second playerPokemon's speed to the remaining value of speed - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5] ]); + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5], + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); // checks to make sure the escape values are the same expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed - expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe( + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed, + ); } }, 20000); }); diff --git a/test/evolution.test.ts b/test/evolution.test.ts index dbd4ef3a0d7..dd6795bf161 100644 --- a/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -1,4 +1,8 @@ -import { pokemonEvolutions, SpeciesFormEvolution, SpeciesWildEvolutionDelay } from "#app/data/balance/pokemon-evolutions"; +import { + pokemonEvolutions, + SpeciesFormEvolution, + SpeciesWildEvolutionDelay, +} from "#app/data/balance/pokemon-evolutions"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; @@ -33,7 +37,7 @@ describe("Evolution", () => { }); it("should keep hidden ability after evolving", async () => { - await game.classicMode.runToSummon([ Species.EEVEE, Species.TRAPINCH ]); + await game.classicMode.runToSummon([Species.EEVEE, Species.TRAPINCH]); const eevee = game.scene.getPlayerParty()[0]; const trapinch = game.scene.getPlayerParty()[1]; @@ -48,7 +52,7 @@ describe("Evolution", () => { }); it("should keep same ability slot after evolving", async () => { - await game.classicMode.runToSummon([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.runToSummon([Species.BULBASAUR, Species.CHARMANDER]); const bulbasaur = game.scene.getPlayerParty()[0]; const charmander = game.scene.getPlayerParty()[1]; @@ -63,7 +67,7 @@ describe("Evolution", () => { }); it("should handle illegal abilityIndex values", async () => { - await game.classicMode.runToSummon([ Species.SQUIRTLE ]); + await game.classicMode.runToSummon([Species.SQUIRTLE]); const squirtle = game.scene.getPlayerPokemon()!; squirtle.abilityIndex = 5; @@ -73,7 +77,7 @@ describe("Evolution", () => { }); it("should handle nincada's unique evolution", async () => { - await game.classicMode.runToSummon([ Species.NINCADA ]); + await game.classicMode.runToSummon([Species.NINCADA]); const nincada = game.scene.getPlayerPokemon()!; nincada.abilityIndex = 2; @@ -98,14 +102,15 @@ describe("Evolution", () => { }); it("should increase both HP and max HP when evolving", async () => { - game.override.moveset([ Moves.SURF ]) + game.override + .moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(16) .enemyLevel(50); - await game.startBattle([ Species.TOTODILE ]); + await game.startBattle([Species.TOTODILE]); const totodile = game.scene.getPlayerPokemon()!; const hpBefore = totodile.hp; @@ -125,14 +130,15 @@ describe("Evolution", () => { }); it("should not fully heal HP when evolving", async () => { - game.override.moveset([ Moves.SURF ]) + game.override + .moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(13) .enemyLevel(30); - await game.startBattle([ Species.CYNDAQUIL ]); + await game.startBattle([Species.CYNDAQUIL]); const cyndaquil = game.scene.getPlayerPokemon()!; cyndaquil.hp = Math.floor(cyndaquil.getMaxHp() / 2); @@ -165,7 +171,7 @@ describe("Evolution", () => { * If the value is 0, it's a 3 family maushold, whereas if the value is * 1, 2 or 3, it's a 4 family maushold */ - await game.startBattle([ Species.TANDEMAUS ]); // starts us off with a tandemaus + await game.startBattle([Species.TANDEMAUS]); // starts us off with a tandemaus const playerPokemon = game.scene.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 diff --git a/test/field/pokemon.test.ts b/test/field/pokemon.test.ts index 0ea1e08c31d..85128a31f7f 100644 --- a/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -26,7 +26,7 @@ describe("Spec - Pokemon", () => { }); it("should not crash when trying to set status of undefined", async () => { - await game.classicMode.runToSummon([ Species.ABRA ]); + await game.classicMode.runToSummon([Species.ABRA]); const pkm = game.scene.getPlayerPokemon()!; expect(pkm).toBeDefined(); @@ -39,7 +39,7 @@ describe("Spec - Pokemon", () => { beforeEach(async () => { game.override.enemySpecies(Species.ZUBAT); - await game.classicMode.runToSummon([ Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA ]); // 5 Abra, only 1 slot left + await game.classicMode.runToSummon([Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA]); // 5 Abra, only 1 slot left scene = game.scene; }); @@ -49,7 +49,7 @@ describe("Spec - Pokemon", () => { const party = scene.getPlayerParty(); expect(party).toHaveLength(6); - party.forEach((pkm, index) =>{ + party.forEach((pkm, index) => { expect(pkm.species.speciesId).toBe(index === 5 ? Species.ZUBAT : Species.ABRA); }); }); @@ -61,7 +61,7 @@ describe("Spec - Pokemon", () => { const party = scene.getPlayerParty(); expect(party).toHaveLength(6); - party.forEach((pkm, index) =>{ + party.forEach((pkm, index) => { expect(pkm.species.speciesId).toBe(index === slotIndex ? Species.ZUBAT : Species.ABRA); }); }); @@ -70,7 +70,7 @@ describe("Spec - Pokemon", () => { it("should not share tms between different forms", async () => { game.override.starterForms({ [Species.ROTOM]: 4 }); - await game.classicMode.startBattle([ Species.ROTOM ]); + await game.classicMode.startBattle([Species.ROTOM]); const fanRotom = game.scene.getPlayerPokemon()!; @@ -97,12 +97,12 @@ describe("Spec - Pokemon", () => { expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.FIRE); - pokemon.customPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; + pokemon.customPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.FIRE); - pokemon.customPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; + pokemon.customPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.NORMAL); expect(types[1]).toBe(PokemonType.FIRE); @@ -112,18 +112,18 @@ describe("Spec - Pokemon", () => { } pokemon.customPokemonData.types = []; - pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.NORMAL); - pokemon.fusionCustomPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.NORMAL); - pokemon.customPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; - pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; + pokemon.customPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.NORMAL); expect(types[1]).toBe(PokemonType.FIRE); @@ -172,13 +172,13 @@ describe("Spec - Pokemon", () => { expect(types[1]).toBe(PokemonType.FIRE); // Natu Psychic/Grass - pokemon.customPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; + pokemon.customPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.FIRE); // Natu Grass/Flying - pokemon.customPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; + pokemon.customPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.GRASS); expect(types[1]).toBe(PokemonType.FIRE); @@ -189,21 +189,21 @@ describe("Spec - Pokemon", () => { pokemon.customPokemonData.types = []; // Houndour Dark/Grass - pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.GRASS); // Houndour Grass/Fire - pokemon.fusionCustomPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types[1]).toBe(PokemonType.FIRE); // Natu Grass/Flying // Houndour Dark/Grass - pokemon.customPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; - pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; + pokemon.customPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; types = pokemon.getTypes(); expect(types[0]).toBe(PokemonType.GRASS); expect(types[1]).toBe(PokemonType.DARK); diff --git a/test/final_boss.test.ts b/test/final_boss.test.ts index f7675c17005..1b0cdce60a0 100644 --- a/test/final_boss.test.ts +++ b/test/final_boss.test.ts @@ -29,7 +29,7 @@ describe("Final Boss", () => { .startingBiome(Biome.END) .disableCrits() .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ]) + .moveset([Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE]) .startingLevel(10000); }); @@ -38,7 +38,7 @@ describe("Final Boss", () => { }); it("should spawn Eternatus on wave 200 in END biome", async () => { - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -47,7 +47,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus before wave 200 in END biome", async () => { game.override.startingWave(FinalWave.Classic - 1); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -56,7 +56,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus outside of END biome", async () => { game.override.startingBiome(Biome.FOREST); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).not.toBe(Biome.END); @@ -64,7 +64,7 @@ describe("Final Boss", () => { }); it("should not have passive enabled on Eternatus", async () => { - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); const eternatus = game.scene.getEnemyPokemon()!; expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); @@ -72,7 +72,7 @@ describe("Final Boss", () => { }); it("should change form on direct hit down to last boss fragment", async () => { - await game.runToFinalBossEncounter([ Species.KYUREM ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.KYUREM], GameModes.CLASSIC); await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 @@ -101,7 +101,7 @@ describe("Final Boss", () => { it("should change form on status damage down to last boss fragment", async () => { game.override.ability(Abilities.NO_GUARD); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 @@ -140,5 +140,4 @@ describe("Final Boss", () => { expect(miniBlackHole).toBeDefined(); expect(miniBlackHole?.stackCount).toBe(1); }); - }); diff --git a/test/game-mode.test.ts b/test/game-mode.test.ts index 3f5819f9a38..a2da7d1690a 100644 --- a/test/game-mode.test.ts +++ b/test/game-mode.test.ts @@ -28,9 +28,7 @@ describe("game-mode", () => { it("does NOT spawn trainers within 3 waves of fixed battle", () => { const { arena } = game.scene; /** set wave 16 to be a fixed trainer fight meaning wave 13-19 don't allow trainer spawns */ - vi.spyOn(classicGameMode, "isFixedBattle").mockImplementation( - (n: number) => (n === 16 ? true : false) - ); + vi.spyOn(classicGameMode, "isFixedBattle").mockImplementation((n: number) => n === 16); vi.spyOn(arena, "getTrainerChance").mockReturnValue(1); vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); expect(classicGameMode.isWaveTrainer(11, arena)).toBeFalsy(); diff --git a/test/imports.test.ts b/test/imports.test.ts index 305eccdc465..128308dbd14 100644 --- a/test/imports.test.ts +++ b/test/imports.test.ts @@ -32,4 +32,3 @@ describe("tests to debug the import, with trace", () => { expect(module.Species).toBeDefined(); }); }); - diff --git a/test/inputs/inputs.test.ts b/test/inputs/inputs.test.ts index 2cdab4b3eb2..1f566672f00 100644 --- a/test/inputs/inputs.test.ts +++ b/test/inputs/inputs.test.ts @@ -5,7 +5,6 @@ import InputsHandler from "#test/testUtils/inputsHandler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Inputs", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -52,39 +51,38 @@ describe("Inputs", () => { expect(game.inputsHandler.log.length).toBe(5); }); - it("keyboard - test input holding for 200ms - 1 input", async() => { + it("keyboard - test input holding for 200ms - 1 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 200); expect(game.inputsHandler.log.length).toBe(1); }); - it("keyboard - test input holding for 300ms - 2 input", async() => { + it("keyboard - test input holding for 300ms - 2 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 300); expect(game.inputsHandler.log.length).toBe(2); }); - it("keyboard - test input holding for 1000ms - 4 input", async() => { + it("keyboard - test input holding for 1000ms - 4 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 1050); expect(game.inputsHandler.log.length).toBe(5); }); - it("gamepad - test input holding for 1ms - 1 input", async() => { + it("gamepad - test input holding for 1ms - 1 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 1); expect(game.inputsHandler.log.length).toBe(1); }); - it("gamepad - test input holding for 200ms - 1 input", async() => { + it("gamepad - test input holding for 200ms - 1 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 200); expect(game.inputsHandler.log.length).toBe(1); }); - it("gamepad - test input holding for 300ms - 2 input", async() => { + it("gamepad - test input holding for 300ms - 2 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 300); expect(game.inputsHandler.log.length).toBe(2); }); - it("gamepad - test input holding for 1000ms - 4 input", async() => { + it("gamepad - test input holding for 1000ms - 4 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 1050); expect(game.inputsHandler.log.length).toBe(5); }); }); - diff --git a/test/internals.test.ts b/test/internals.test.ts index 2cc827a8906..558b363caf0 100644 --- a/test/internals.test.ts +++ b/test/internals.test.ts @@ -23,7 +23,7 @@ describe("Internals", () => { }); it("should provide Eevee with 3 defined abilities", async () => { - await game.classicMode.runToSummon([ Species.EEVEE ]); + await game.classicMode.runToSummon([Species.EEVEE]); const eevee = game.scene.getPlayerPokemon()!; expect(eevee.getSpeciesForm().getAbilityCount()).toBe(3); @@ -34,7 +34,7 @@ describe("Internals", () => { }); it("should set Eeeve abilityIndex between 0-2", async () => { - await game.classicMode.runToSummon([ Species.EEVEE ]); + await game.classicMode.runToSummon([Species.EEVEE]); const eevee = game.scene.getPlayerPokemon()!; expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); diff --git a/test/items/dire_hit.test.ts b/test/items/dire_hit.test.ts index 4a94030ab93..038d88ddc73 100644 --- a/test/items/dire_hit.test.ts +++ b/test/items/dire_hit.test.ts @@ -34,17 +34,14 @@ describe("Items - Dire Hit", () => { game.override .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.POUND ]) + .moveset([Moves.POUND]) .startingHeldItems([{ name: "DIRE_HIT" }]) .battleType("single") .disableCrits(); - }, 20000); it("should raise CRIT stage by 1", async () => { - await game.startBattle([ - Species.GASTLY - ]); + await game.startBattle([Species.GASTLY]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -57,12 +54,10 @@ describe("Items - Dire Hit", () => { expect(enemyPokemon.getCritStage).toHaveReturnedWith(1); }, 20000); - it("should renew how many battles are left of existing DIRE_HIT when picking up new DIRE_HIT", async() => { + it("should renew how many battles are left of existing DIRE_HIT when picking up new DIRE_HIT", async () => { game.override.itemRewards([{ name: "DIRE_HIT" }]); - await game.startBattle([ - Species.PIKACHU - ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -74,13 +69,19 @@ describe("Items - Dire Hit", () => { expect(modifier.getBattleCount()).toBe(4); // Forced DIRE_HIT to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), + true, + ); await game.phaseInterceptor.to(TurnInitPhase); diff --git a/test/items/double_battle_chance_booster.test.ts b/test/items/double_battle_chance_booster.test.ts index 2a86a151685..b4818e7e7ba 100644 --- a/test/items/double_battle_chance_booster.test.ts +++ b/test/items/double_battle_chance_booster.test.ts @@ -27,12 +27,7 @@ describe("Items - Double Battle Chance Boosters", () => { }); it("should guarantee double battle with 2 unique tiers", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - { name: "SUPER_LURE" } - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }, { name: "SUPER_LURE" }]).startingWave(2); await game.classicMode.startBattle(); @@ -40,13 +35,7 @@ describe("Items - Double Battle Chance Boosters", () => { }); it("should guarantee double boss battle with 3 unique tiers", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - { name: "SUPER_LURE" }, - { name: "MAX_LURE" } - ]) - .startingWave(10); + game.override.startingModifier([{ name: "LURE" }, { name: "SUPER_LURE" }, { name: "MAX_LURE" }]).startingWave(10); await game.classicMode.startBattle(); @@ -57,16 +46,14 @@ describe("Items - Double Battle Chance Boosters", () => { expect(enemyField[1].isBoss()).toBe(true); }); - it("should renew how many battles are left of existing booster when picking up new booster of same tier", async() => { + it("should renew how many battles are left of existing booster when picking up new booster of same tier", async () => { game.override .startingModifier([{ name: "LURE" }]) .itemRewards([{ name: "LURE" }]) .moveset(Moves.SPLASH) .startingLevel(200); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -74,17 +61,25 @@ describe("Items - Double Battle Chance Boosters", () => { await game.phaseInterceptor.to("BattleEndPhase"); - const modifier = game.scene.findModifier(m => m instanceof DoubleBattleChanceBoosterModifier) as DoubleBattleChanceBoosterModifier; + const modifier = game.scene.findModifier( + m => m instanceof DoubleBattleChanceBoosterModifier, + ) as DoubleBattleChanceBoosterModifier; expect(modifier.getBattleCount()).toBe(9); // Forced LURE to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/test/items/eviolite.test.ts b/test/items/eviolite.test.ts index 64038cc9b82..2b82e2145e9 100644 --- a/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -22,13 +22,11 @@ describe("Items - Eviolite", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .battleType("single") - .startingHeldItems([{ name: "EVIOLITE" }]); + game.override.battleType("single").startingHeldItems([{ name: "EVIOLITE" }]); }); - it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async() => { - await game.classicMode.startBattle([ Species.PICHU ]); + it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -48,8 +46,8 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5)); }); - it("should not provide a boost for fully evolved, unfused pokemon", async() => { - await game.classicMode.startBattle([ Species.RAICHU ]); + it("should not provide a boost for fully evolved, unfused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -67,13 +65,12 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat); - }); - it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async() => { - await game.classicMode.startBattle([ Species.PICHU, Species.CLEFFA ]); + it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU, Species.CLEFFA]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -100,10 +97,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5)); }); - it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async() => { - await game.classicMode.startBattle([ Species.PICHU, Species.CLEFABLE ]); + it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU, Species.CLEFABLE]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -130,10 +127,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25)); }); - it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async() => { - await game.classicMode.startBattle([ Species.RAICHU, Species.CLEFFA ]); + it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU, Species.CLEFFA]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -160,10 +157,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25)); }); - it("should not provide a boost for fully evolved, fused pokemon", async() => { - await game.classicMode.startBattle([ Species.RAICHU, Species.CLEFABLE ]); + it("should not provide a boost for fully evolved, fused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU, Species.CLEFABLE]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -190,17 +187,17 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat); }); - it("should not provide a boost for Gigantamax Pokémon", async() => { + it("should not provide a boost for Gigantamax Pokémon", async () => { game.override.starterForms({ [Species.PIKACHU]: 8, [Species.EEVEE]: 2, [Species.DURALUDON]: 1, - [Species.MEOWTH]: 1 + [Species.MEOWTH]: 1, }); - const gMaxablePokemon = [ Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH ]; + const gMaxablePokemon = [Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH]; - await game.classicMode.startBattle([ randItem(gMaxablePokemon) ]); + await game.classicMode.startBattle([randItem(gMaxablePokemon)]); const partyMember = game.scene.getPlayerPokemon()!; diff --git a/test/items/exp_booster.test.ts b/test/items/exp_booster.test.ts index 4519df29b01..e4491b22637 100644 --- a/test/items/exp_booster.test.ts +++ b/test/items/exp_booster.test.ts @@ -27,7 +27,7 @@ describe("EXP Modifier Items", () => { game.override.battleType("single"); }); - it("EXP booster items stack multiplicatively", async() => { + it("EXP booster items stack multiplicatively", async () => { game.override.startingHeldItems([{ name: "LUCKY_EGG", count: 3 }, { name: "GOLDEN_EGG" }]); await game.startBattle(); diff --git a/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts index 854e0998d3b..1d169006116 100644 --- a/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -28,10 +28,8 @@ describe("Items - Grip Claw", () => { game.override .battleType("double") - .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.ATTRACT ]) - .startingHeldItems([ - { name: "GRIP_CLAW", count: 1 }, - ]) + .moveset([Moves.TACKLE, Moves.SPLASH, Moves.ATTRACT]) + .startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.UNNERVE) .ability(Abilities.UNNERVE) @@ -41,13 +39,12 @@ describe("Items - Grip Claw", () => { { name: "BERRY", type: BerryType.LUM, count: 2 }, ]) .enemyLevel(100); - }); it("should steal items on contact and only from the attack target", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); - const [ playerPokemon, ] = game.scene.getPlayerField(); + const [playerPokemon] = game.scene.getPlayerField(); const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); @@ -74,9 +71,9 @@ describe("Items - Grip Claw", () => { }); it("should not steal items when using a targetted, non attack move", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); - const [ playerPokemon, ] = game.scene.getPlayerField(); + const [playerPokemon] = game.scene.getPlayerField(); const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); @@ -109,4 +106,3 @@ describe("Items - Grip Claw", () => { function getHeldItemCount(pokemon: Pokemon) { return pokemon.getHeldItems().reduce((currentTotal, item) => currentTotal + item.getStackCount(), 0); } - diff --git a/test/items/leek.test.ts b/test/items/leek.test.ts index a3c509d19dd..ec4d075fe19 100644 --- a/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -25,17 +25,15 @@ describe("Items - Leek", () => { game.override .enemySpecies(Species.MAGIKARP) - .enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]) .startingHeldItems([{ name: "LEEK" }]) - .moveset([ Moves.TACKLE ]) + .moveset([Moves.TACKLE]) .disableCrits() .battleType("single"); }); it("should raise CRIT stage by 2 when held by FARFETCHD", async () => { - await game.startBattle([ - Species.FARFETCHD - ]); + await game.startBattle([Species.FARFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -49,9 +47,7 @@ describe("Items - Leek", () => { }, 20000); it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => { - await game.startBattle([ - Species.GALAR_FARFETCHD - ]); + await game.startBattle([Species.GALAR_FARFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -65,9 +61,7 @@ describe("Items - Leek", () => { }, 20000); it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => { - await game.startBattle([ - Species.SIRFETCHD - ]); + await game.startBattle([Species.SIRFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -82,14 +76,11 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by FARFETCHD line fused with Pokemon", async () => { // Randomly choose from the Farfetch'd line - const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; - await game.startBattle([ - species[Utils.randInt(species.length)], - Species.PIKACHU, - ]); + await game.startBattle([species[Utils.randInt(species.length)], Species.PIKACHU]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -113,14 +104,11 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by Pokemon fused with FARFETCHD line", async () => { // Randomly choose from the Farfetch'd line - const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; - await game.startBattle([ - Species.PIKACHU, - species[Utils.randInt(species.length)] - ]); + await game.startBattle([Species.PIKACHU, species[Utils.randInt(species.length)]]); - const [ partyMember, ally ] = game.scene.getPlayerParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -131,7 +119,6 @@ describe("Items - Leek", () => { partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; - const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); @@ -144,9 +131,7 @@ describe("Items - Leek", () => { }, 20000); it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => { - await game.startBattle([ - Species.PIKACHU - ]); + await game.startBattle([Species.PIKACHU]); const enemyMember = game.scene.getEnemyPokemon()!; diff --git a/test/items/leftovers.test.ts b/test/items/leftovers.test.ts index 8d74301968f..ad22e9c3cae 100644 --- a/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Items - Leftovers", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,15 +26,15 @@ describe("Items - Leftovers", () => { game.override.battleType("single"); game.override.startingLevel(2000); game.override.ability(Abilities.UNNERVE); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.UNNERVE); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.startingHeldItems([{ name: "LEFTOVERS", count: 1 }]); }); it("leftovers works", async () => { - await game.startBattle([ Species.ARCANINE ]); + await game.startBattle([Species.ARCANINE]); // Make sure leftovers are there expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); diff --git a/test/items/light_ball.test.ts b/test/items/light_ball.test.ts index 8dff8001ffc..e4959002904 100644 --- a/test/items/light_ball.test.ts +++ b/test/items/light_ball.test.ts @@ -28,45 +28,61 @@ describe("Items - Light Ball", () => { game.override.battleType("single"); }); - it("LIGHT_BALL activates in battle correctly", async() => { + it("LIGHT_BALL activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Light Ball is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); }); - it("LIGHT_BALL held by PIKACHU", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("LIGHT_BALL held by PIKACHU", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerParty()[0]; @@ -83,7 +99,10 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -91,11 +110,8 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL held by fused PIKACHU (base)", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU, - Species.MAROWAK - ]); + it("LIGHT_BALL held by fused PIKACHU (base)", async () => { + await game.classicMode.startBattle([Species.PIKACHU, Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -122,7 +138,10 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -130,11 +149,8 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL held by fused PIKACHU (part)", async() => { - await game.startBattle([ - Species.MAROWAK, - Species.PIKACHU - ]); + it("LIGHT_BALL held by fused PIKACHU (part)", async () => { + await game.startBattle([Species.MAROWAK, Species.PIKACHU]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -161,7 +177,10 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -169,10 +188,8 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL not held by PIKACHU", async() => { - await game.startBattle([ - Species.MAROWAK - ]); + it("LIGHT_BALL not held by PIKACHU", async () => { + await game.startBattle([Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; @@ -189,7 +206,10 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); diff --git a/test/items/lock_capsule.test.ts b/test/items/lock_capsule.test.ts index 4cdd3b8a8a0..4e4182b3038 100644 --- a/test/items/lock_capsule.test.ts +++ b/test/items/lock_capsule.test.ts @@ -27,14 +27,19 @@ describe("Items - Lock Capsule", () => { game.override .battleType("single") .startingLevel(200) - .moveset([ Moves.SURF ]) + .moveset([Moves.SURF]) .enemyAbility(Abilities.BALL_FETCH) .startingModifier([{ name: "LOCK_CAPSULE" }]); }); it("doesn't set the cost of common tier items to 0", async () => { await game.classicMode.startBattle(); - game.scene.overridePhase(new SelectModifierPhase(0, undefined, { guaranteedModifierTiers: [ ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON ], fillRemaining: false })); + game.scene.overridePhase( + new SelectModifierPhase(0, undefined, { + guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON], + fillRemaining: false, + }), + ); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { const selectModifierPhase = game.scene.getCurrentPhase() as SelectModifierPhase; diff --git a/test/items/metal_powder.test.ts b/test/items/metal_powder.test.ts index c1345af35df..460a95d0f06 100644 --- a/test/items/metal_powder.test.ts +++ b/test/items/metal_powder.test.ts @@ -28,45 +28,61 @@ describe("Items - Metal Powder", () => { game.override.battleType("single"); }); - it("METAL_POWDER activates in battle correctly", async() => { + it("METAL_POWDER activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.classicMode.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Metal Powder is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); }); - it("METAL_POWDER held by DITTO", async() => { - await game.startBattle([ - Species.DITTO - ]); + it("METAL_POWDER held by DITTO", async () => { + await game.startBattle([Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; @@ -79,17 +95,17 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER held by fused DITTO (base)", async() => { - await game.startBattle([ - Species.DITTO, - Species.MAROWAK - ]); + it("METAL_POWDER held by fused DITTO (base)", async () => { + await game.startBattle([Species.DITTO, Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -112,17 +128,17 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER held by fused DITTO (part)", async() => { - await game.startBattle([ - Species.MAROWAK, - Species.DITTO - ]); + it("METAL_POWDER held by fused DITTO (part)", async () => { + await game.startBattle([Species.MAROWAK, Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -145,16 +161,17 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER not held by DITTO", async() => { - await game.startBattle([ - Species.MAROWAK - ]); + it("METAL_POWDER not held by DITTO", async () => { + await game.startBattle([Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; @@ -167,7 +184,10 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); diff --git a/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts index 01447a29544..90e73ae88ea 100644 --- a/test/items/multi_lens.test.ts +++ b/test/items/multi_lens.test.ts @@ -24,7 +24,7 @@ describe("Items - Multi Lens", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER, Moves.FUTURE_SIGHT ]) + .moveset([Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER, Moves.FUTURE_SIGHT]) .ability(Abilities.BALL_FETCH) .startingHeldItems([{ name: "MULTI_LENS" }]) .battleType("single") @@ -38,19 +38,20 @@ describe("Items - Multi Lens", () => { it.each([ { stackCount: 1, firstHitDamage: 0.75 }, - { stackCount: 2, firstHitDamage: 0.50 } - ])("$stackCount count: should deal {$firstHitDamage}x damage on the first hit, then hit $stackCount times for 0.25x", + { stackCount: 2, firstHitDamage: 0.5 }, + ])( + "$stackCount count: should deal {$firstHitDamage}x damage on the first hit, then hit $stackCount times for 0.25x", async ({ stackCount, firstHitDamage }) => { game.override.startingHeldItems([{ name: "MULTI_LENS", count: stackCount }]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyPokemon = game.scene.getEnemyPokemon()!; const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); vi.spyOn(enemyPokemon, "getBaseDamage").mockReturnValue(100); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); const damageResults = spy.mock.results.map(result => result.value?.damage); @@ -58,24 +59,25 @@ describe("Items - Multi Lens", () => { expect(damageResults).toHaveLength(1 + stackCount); expect(damageResults[0]).toBe(firstHitDamage * 100); damageResults.slice(1).forEach(dmg => expect(dmg).toBe(25)); - }); + }, + ); it("should stack additively with Parental Bond", async () => { game.override.ability(Abilities.PARENTAL_BOND); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(playerPokemon.turnData.hitCount).toBe(3); }); it("should apply secondary effects on each hit", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -86,7 +88,7 @@ describe("Items - Multi Lens", () => { }); it("should not enhance multi-hit moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -97,18 +99,16 @@ describe("Items - Multi Lens", () => { }); it("should enhance multi-target moves", async () => { - game.override - .battleType("double") - .moveset([ Moves.SWIFT, Moves.SPLASH ]); + game.override.battleType("double").moveset([Moves.SWIFT, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); - const [ magikarp, ] = game.scene.getPlayerField(); + const [magikarp] = game.scene.getPlayerField(); game.move.select(Moves.SWIFT, 0); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -116,17 +116,16 @@ describe("Items - Multi Lens", () => { }); it("should enhance fixed-damage moves while also applying damage reduction", async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]) - .moveset(Moves.SEISMIC_TOSS); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]).moveset(Moves.SEISMIC_TOSS); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); game.move.select(Moves.SEISMIC_TOSS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); const damageResults = spy.mock.results.map(result => result.value?.damage); @@ -137,42 +136,45 @@ describe("Items - Multi Lens", () => { }); it("should result in correct damage for hp% attacks with 1 lens", async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]) + game.override + .startingHeldItems([{ name: "MULTI_LENS", count: 1 }]) .moveset(Moves.SUPER_FANG) .ability(Abilities.COMPOUND_EYES) .enemyLevel(1000) .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SUPER_FANG); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.5, 5); }); it("should result in correct damage for hp% attacks with 2 lenses", async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + game.override + .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) .moveset(Moves.SUPER_FANG) .ability(Abilities.COMPOUND_EYES) .enemyMoveset(Moves.SPLASH) .enemyLevel(1000) .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SUPER_FANG); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.5, 5); }); it("should result in correct damage for hp% attacks with 2 lenses + Parental Bond", async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + game.override + .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) .moveset(Moves.SUPER_FANG) .ability(Abilities.PARENTAL_BOND) .passiveAbility(Abilities.COMPOUND_EYES) @@ -180,19 +182,19 @@ describe("Items - Multi Lens", () => { .enemyLevel(1000) .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SUPER_FANG); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.25, 5); }); it("should not allow Future Sight to hit infinitely many times if the user switches out", async () => { game.override.enemyLevel(1000); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "damageAndUpdate"); diff --git a/test/items/quick_powder.test.ts b/test/items/quick_powder.test.ts index 80ff0d7ba33..26faf5a0f4f 100644 --- a/test/items/quick_powder.test.ts +++ b/test/items/quick_powder.test.ts @@ -28,45 +28,61 @@ describe("Items - Quick Powder", () => { game.override.battleType("single"); }); - it("QUICK_POWDER activates in battle correctly", async() => { + it("QUICK_POWDER activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.classicMode.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Quick Powder is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); }); - it("QUICK_POWDER held by DITTO", async() => { - await game.classicMode.startBattle([ - Species.DITTO - ]); + it("QUICK_POWDER held by DITTO", async () => { + await game.classicMode.startBattle([Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; @@ -79,17 +95,17 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); }); - it("QUICK_POWDER held by fused DITTO (base)", async() => { - await game.classicMode.startBattle([ - Species.DITTO, - Species.MAROWAK - ]); + it("QUICK_POWDER held by fused DITTO (base)", async () => { + await game.classicMode.startBattle([Species.DITTO, Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -112,17 +128,17 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); }); - it("QUICK_POWDER held by fused DITTO (part)", async() => { - await game.classicMode.startBattle([ - Species.MAROWAK, - Species.DITTO - ]); + it("QUICK_POWDER held by fused DITTO (part)", async () => { + await game.classicMode.startBattle([Species.MAROWAK, Species.DITTO]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -145,16 +161,17 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); }); - it("QUICK_POWDER not held by DITTO", async() => { - await game.classicMode.startBattle([ - Species.MAROWAK - ]); + it("QUICK_POWDER not held by DITTO", async () => { + await game.classicMode.startBattle([Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; @@ -167,7 +184,10 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); diff --git a/test/items/scope_lens.test.ts b/test/items/scope_lens.test.ts index 98e374b6969..abd5cd7e75c 100644 --- a/test/items/scope_lens.test.ts +++ b/test/items/scope_lens.test.ts @@ -25,17 +25,14 @@ describe("Items - Scope Lens", () => { game.override .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.POUND ]) + .moveset([Moves.POUND]) .startingHeldItems([{ name: "SCOPE_LENS" }]) .battleType("single") .disableCrits(); - }, 20000); it("should raise CRIT stage by 1", async () => { - await game.startBattle([ - Species.GASTLY - ]); + await game.startBattle([Species.GASTLY]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/items/temp_stat_stage_booster.test.ts b/test/items/temp_stat_stage_booster.test.ts index 8bbd9f4f29d..6417f898e3e 100644 --- a/test/items/temp_stat_stage_booster.test.ts +++ b/test/items/temp_stat_stage_booster.test.ts @@ -12,7 +12,6 @@ import { Button } from "#app/enums/buttons"; import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; - describe("Items - Temporary Stat Stage Boosters", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -35,14 +34,12 @@ describe("Items - Temporary Stat Stage Boosters", () => { .enemySpecies(Species.SHUCKLE) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM ]) + .moveset([Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM]) .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); }); - it("should provide a x1.3 stat stage multiplier", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("should provide a x1.3 stat stage multiplier", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -55,14 +52,10 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.3); }, 20000); - it("should increase existing ACC stat stage by 1 for X_ACCURACY only", async() => { - game.override - .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]) - .ability(Abilities.SIMPLE); + it("should increase existing ACC stat stage by 1 for X_ACCURACY only", async () => { + game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]).ability(Abilities.SIMPLE); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -81,11 +74,8 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getAccuracyMultiplier).toHaveReturnedWith(2); }, 20000); - - it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -104,13 +94,14 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.8); }, 20000); - it("should not increase past maximum stat stage multiplier", async() => { - game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - - await game.classicMode.startBattle([ - Species.PIKACHU + it("should not increase past maximum stat stage multiplier", async () => { + game.override.startingModifier([ + { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, + { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }, ]); + await game.classicMode.startBattle([Species.PIKACHU]); + const partyMember = game.scene.getPlayerPokemon()!; vi.spyOn(partyMember, "getStatStageMultiplier"); @@ -127,14 +118,10 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(4); }, 20000); - it("should renew how many battles are left of existing booster when picking up new booster of same type", async() => { - game.override - .startingLevel(200) - .itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); + it("should renew how many battles are left of existing booster when picking up new booster of same type", async () => { + game.override.startingLevel(200).itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -142,17 +129,25 @@ describe("Items - Temporary Stat Stage Boosters", () => { await game.phaseInterceptor.to("BattleEndPhase"); - const modifier = game.scene.findModifier(m => m instanceof TempStatStageBoosterModifier) as TempStatStageBoosterModifier; + const modifier = game.scene.findModifier( + m => m instanceof TempStatStageBoosterModifier, + ) as TempStatStageBoosterModifier; expect(modifier.getBattleCount()).toBe(4); // Forced X_ATTACK to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/test/items/thick_club.test.ts b/test/items/thick_club.test.ts index f18c0bd073e..9edbbcdc7d9 100644 --- a/test/items/thick_club.test.ts +++ b/test/items/thick_club.test.ts @@ -28,45 +28,61 @@ describe("Items - Thick Club", () => { game.override.battleType("single"); }); - it("THICK_CLUB activates in battle correctly", async() => { + it("THICK_CLUB activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.classicMode.startBattle([ - Species.CUBONE - ]); + await game.classicMode.startBattle([Species.CUBONE]); const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Thick Club is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); }); - it("THICK_CLUB held by CUBONE", async() => { - await game.classicMode.startBattle([ - Species.CUBONE - ]); + it("THICK_CLUB held by CUBONE", async () => { + await game.classicMode.startBattle([Species.CUBONE]); const partyMember = game.scene.getPlayerParty()[0]; @@ -79,16 +95,17 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); }); - it("THICK_CLUB held by MAROWAK", async() => { - await game.classicMode.startBattle([ - Species.MAROWAK - ]); + it("THICK_CLUB held by MAROWAK", async () => { + await game.classicMode.startBattle([Species.MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; @@ -101,16 +118,17 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); }); - it("THICK_CLUB held by ALOLA_MAROWAK", async() => { - await game.classicMode.startBattle([ - Species.ALOLA_MAROWAK - ]); + it("THICK_CLUB held by ALOLA_MAROWAK", async () => { + await game.classicMode.startBattle([Species.ALOLA_MAROWAK]); const partyMember = game.scene.getPlayerParty()[0]; @@ -123,21 +141,21 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); }); - it("THICK_CLUB held by fused CUBONE line (base)", async() => { + it("THICK_CLUB held by fused CUBONE line (base)", async () => { // Randomly choose from the Cubone line - const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const species = [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK]; const randSpecies = Utils.randInt(species.length); - await game.classicMode.startBattle([ - species[randSpecies], - Species.PIKACHU - ]); + await game.classicMode.startBattle([species[randSpecies], Species.PIKACHU]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -160,21 +178,21 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); }); - it("THICK_CLUB held by fused CUBONE line (part)", async() => { + it("THICK_CLUB held by fused CUBONE line (part)", async () => { // Randomly choose from the Cubone line - const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const species = [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK]; const randSpecies = Utils.randInt(species.length); - await game.classicMode.startBattle([ - Species.PIKACHU, - species[randSpecies] - ]); + await game.classicMode.startBattle([Species.PIKACHU, species[randSpecies]]); const partyMember = game.scene.getPlayerParty()[0]; const ally = game.scene.getPlayerParty()[1]; @@ -197,16 +215,17 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); }); - it("THICK_CLUB not held by CUBONE", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("THICK_CLUB not held by CUBONE", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerParty()[0]; @@ -219,7 +238,10 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(1); diff --git a/test/items/toxic_orb.test.ts b/test/items/toxic_orb.test.ts index 8201036b927..57e6b651b66 100644 --- a/test/items/toxic_orb.test.ts +++ b/test/items/toxic_orb.test.ts @@ -30,15 +30,17 @@ describe("Items - Toxic orb", () => { .enemyAbility(Abilities.BALL_FETCH) .moveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH) - .startingHeldItems([{ - name: "TOXIC_ORB", - }]); + .startingHeldItems([ + { + name: "TOXIC_ORB", + }, + ]); vi.spyOn(i18next, "t"); }); it("should badly poison the holder", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; expect(player.getHeldItems()[0].type.id).toBe("TOXIC_ORB"); diff --git a/test/misc.test.ts b/test/misc.test.ts index f2b89418ef5..12ed165d9d9 100644 --- a/test/misc.test.ts +++ b/test/misc.test.ts @@ -24,14 +24,16 @@ describe("Test misc", () => { it("test fetch mock async", async () => { const spy = vi.fn(); - await fetch("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 }); - }); + await fetch("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(); }); @@ -54,7 +56,7 @@ describe("Test misc", () => { expect(response.ok).toBe(true); expect(response.status).toBe(200); - expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); + expect(data).toEqual({ username: "greenlamp", lastSessionSlot: 0 }); }); it("test apifetch mock sync", async () => { @@ -64,7 +66,7 @@ describe("Test misc", () => { it("testing wait phase queue", async () => { const fakeScene = { - phaseQueue: [ 1, 2, 3 ] // Initially not empty + phaseQueue: [1, 2, 3], // Initially not empty }; setTimeout(() => { fakeScene.phaseQueue = []; diff --git a/test/moves/after_you.test.ts b/test/moves/after_you.test.ts index bf030027436..fde19b87b5d 100644 --- a/test/moves/after_you.test.ts +++ b/test/moves/after_you.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - After You", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,11 +31,11 @@ describe("Moves - After You", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.AFTER_YOU, Moves.SPLASH ]); + .moveset([Moves.AFTER_YOU, Moves.SPLASH]); }); it("makes the target move immediately after the user", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.SHUCKLE]); game.move.select(Moves.AFTER_YOU, 0, BattlerIndex.PLAYER_2); game.move.select(Moves.SPLASH, 1); @@ -50,7 +49,7 @@ describe("Moves - After You", () => { it("fails if target already moved", async () => { game.override.enemySpecies(Species.SHUCKLE); - await game.classicMode.startBattle([ Species.REGIELEKI, Species.PIKACHU ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.PIKACHU]); game.move.select(Moves.SPLASH); game.move.select(Moves.AFTER_YOU, 1, BattlerIndex.PLAYER); diff --git a/test/moves/alluring_voice.test.ts b/test/moves/alluring_voice.test.ts index bf5a9f90f82..777078e4786 100644 --- a/test/moves/alluring_voice.test.ts +++ b/test/moves/alluring_voice.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Alluring Voice", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,13 +29,12 @@ describe("Moves - Alluring Voice", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset([ Moves.HOWL ]) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.ALLURING_VOICE ]); - + .moveset([Moves.ALLURING_VOICE]); }); it("should confuse the opponent if their stat stages were raised", async () => { @@ -45,7 +43,7 @@ describe("Moves - Alluring Voice", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.ALLURING_VOICE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(BerryPhase); expect(enemy.getTag(BattlerTagType.CONFUSED)?.tagType).toBe("CONFUSED"); diff --git a/test/moves/aromatherapy.test.ts b/test/moves/aromatherapy.test.ts index e70384355a0..fe7a008249f 100644 --- a/test/moves/aromatherapy.test.ts +++ b/test/moves/aromatherapy.test.ts @@ -24,7 +24,7 @@ describe("Moves - Aromatherapy", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.AROMATHERAPY, Moves.SPLASH ]) + .moveset([Moves.AROMATHERAPY, Moves.SPLASH]) .statusEffect(StatusEffect.BURN) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) @@ -32,8 +32,8 @@ describe("Moves - Aromatherapy", () => { }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getPlayerParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); @@ -55,8 +55,8 @@ describe("Moves - Aromatherapy", () => { it("should not cure status effect of the target/target's allies", async () => { game.override.enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); @@ -78,8 +78,8 @@ describe("Moves - Aromatherapy", () => { it("should not cure status effect of allies ON FIELD with Sap Sipper, should still cure allies in party", async () => { game.override.ability(Abilities.SAP_SIPPER); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getPlayerParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/assist.test.ts b/test/moves/assist.test.ts index 4168ec6295a..68322a7f193 100644 --- a/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -39,16 +39,16 @@ describe("Moves - Assist", () => { it("should only use an ally's moves", async () => { game.override.enemyMoveset(Moves.SWORDS_DANCE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); - const [ feebas, shuckle ] = game.scene.getPlayerField(); + const [feebas, shuckle] = game.scene.getPlayerField(); // These are all moves Assist cannot call; Sketch will be used to test that it can call other moves properly - game.move.changeMoveset(feebas, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); - game.move.changeMoveset(shuckle, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); game.move.select(Moves.ASSIST, 0); game.move.select(Moves.SKETCH, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER]); // Player_2 uses Sketch, copies Swords Dance, Player_1 uses Assist, uses Player_2's Sketched Swords Dance await game.toNextTurn(); @@ -56,10 +56,10 @@ describe("Moves - Assist", () => { }); it("should fail if there are no allies", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const feebas = game.scene.getPlayerPokemon()!; - game.move.changeMoveset(feebas, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); game.move.select(Moves.ASSIST, 0); await game.toNextTurn(); @@ -68,15 +68,15 @@ describe("Moves - Assist", () => { it("should fail if ally has no usable moves and user has usable moves", async () => { game.override.enemyMoveset(Moves.SWORDS_DANCE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); - const [ feebas, shuckle ] = game.scene.getPlayerField(); - game.move.changeMoveset(feebas, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); - game.move.changeMoveset(shuckle, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); + const [feebas, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); game.move.select(Moves.SKETCH, 0); game.move.select(Moves.PROTECT, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); // Player uses Sketch to copy Swords Dance, Player_2 stalls a turn. Player will attempt Assist and should have no usable moves await game.toNextTurn(); game.move.select(Moves.ASSIST, 0); @@ -88,12 +88,12 @@ describe("Moves - Assist", () => { }); it("should apply secondary effects of a move", async () => { - game.override.moveset([ Moves.ASSIST, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER ]); - await game.classicMode.startBattle([ Species.FEEBAS, Species.SHUCKLE ]); + game.override.moveset([Moves.ASSIST, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER]); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); - const [ feebas, shuckle ] = game.scene.getPlayerField(); - game.move.changeMoveset(feebas, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); - game.move.changeMoveset(shuckle, [ Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL ]); + const [feebas, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); game.move.select(Moves.ASSIST, 0); await game.phaseInterceptor.to(CommandPhase); diff --git a/test/moves/astonish.test.ts b/test/moves/astonish.test.ts index f6e447ec7c5..53922060ae6 100644 --- a/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -11,7 +11,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; - describe("Moves - Astonish", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,43 +28,40 @@ describe("Moves - Astonish", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.ASTONISH, Moves.SPLASH ]); + game.override.moveset([Moves.ASTONISH, Moves.SPLASH]); game.override.enemySpecies(Species.BLASTOISE); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.startingLevel(100); game.override.enemyLevel(100); vi.spyOn(allMoves[Moves.ASTONISH], "chance", "get").mockReturnValue(100); }); - test( - "move effect should cancel the target's move on the turn it applies", - async () => { - await game.startBattle([ Species.MEOWSCARADA ]); + test("move effect should cancel the target's move on the turn it applies", async () => { + await game.startBattle([Species.MEOWSCARADA]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.ASTONISH); + game.move.select(Moves.ASTONISH); - await game.phaseInterceptor.to(MoveEndPhase, false); + await game.phaseInterceptor.to(MoveEndPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); - await game.phaseInterceptor.to(CommandPhase, false); + await game.phaseInterceptor.to(CommandPhase, false); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); }); diff --git a/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts index eb77cdc3a44..31f6497bae5 100644 --- a/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -37,22 +37,26 @@ describe("Moves - Aurora Veil", () => { globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL ]); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); game.override.disableCrits(); game.override.weather(WeatherType.HAIL); }); it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -61,26 +65,34 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -89,39 +101,51 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("does not affect physical critical hits", async () => { - game.override.moveset([ Moves.WICKED_BLOW ]); + game.override.moveset([Moves.WICKED_BLOW]); const moveToUse = Moves.WICKED_BLOW; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); it("does not affect critical hits", async () => { - game.override.moveset([ Moves.FROST_BREATH ]); + game.override.moveset([Moves.FROST_BREATH]); const moveToUse = Moves.FROST_BREATH; vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); }); @@ -141,7 +165,14 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = if (globalScene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { if (move.getAttrs(CritOnlyAttr).length === 0) { - globalScene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, false, attacker, move.category, multiplierHolder); + globalScene.arena.applyTagsForSide( + ArenaTagType.AURORA_VEIL, + side, + false, + attacker, + move.category, + multiplierHolder, + ); } } diff --git a/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts index 29d2edbcf4e..62ef185dea8 100644 --- a/test/moves/autotomize.test.ts +++ b/test/moves/autotomize.test.ts @@ -23,76 +23,87 @@ describe("Moves - Autotomize", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.AUTOTOMIZE, Moves.KINGS_SHIELD, Moves.FALSE_SWIPE ]) + .moveset([Moves.AUTOTOMIZE, Moves.KINGS_SHIELD, Moves.FALSE_SWIPE]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH); }); - it("Autotomize should reduce weight", async () => { - const baseDracozoltWeight = 190; - const oneAutotomizeDracozoltWeight = 90; - const twoAutotomizeDracozoltWeight = 0.1; - const threeAutotomizeDracozoltWeight = 0.1; + it( + "Autotomize should reduce weight", + async () => { + const baseDracozoltWeight = 190; + const oneAutotomizeDracozoltWeight = 90; + const twoAutotomizeDracozoltWeight = 0.1; + const threeAutotomizeDracozoltWeight = 0.1; - await game.classicMode.startBattle([ Species.DRACOZOLT ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getWeight()).toBe(baseDracozoltWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(oneAutotomizeDracozoltWeight); + await game.classicMode.startBattle([Species.DRACOZOLT]); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getWeight()).toBe(baseDracozoltWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(oneAutotomizeDracozoltWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(twoAutotomizeDracozoltWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(twoAutotomizeDracozoltWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(threeAutotomizeDracozoltWeight); + }, + TIMEOUT, + ); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(threeAutotomizeDracozoltWeight); - }, TIMEOUT); + it( + "Changing forms should revert weight", + async () => { + const baseAegislashWeight = 53; + const autotomizeAegislashWeight = 0.1; - it("Changing forms should revert weight", async () => { - const baseAegislashWeight = 53; - const autotomizeAegislashWeight = 0.1; + await game.classicMode.startBattle([Species.AEGISLASH]); + const playerPokemon = game.scene.getPlayerPokemon()!; - await game.classicMode.startBattle([ Species.AEGISLASH ]); - const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + // Transform to sword form + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - // Transform to sword form - game.move.select(Moves.FALSE_SWIPE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + // Transform to shield form + game.move.select(Moves.KINGS_SHIELD); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - // Transform to shield form - game.move.select(Moves.KINGS_SHIELD); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + }, + TIMEOUT, + ); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - }, TIMEOUT); - - it("Autotomize should interact with light metal correctly", async () => { - const baseLightGroudonWeight = 475; - const autotomizeLightGroudonWeight = 425; - game.override.ability(Abilities.LIGHT_METAL); - await game.classicMode.startBattle([ Species.GROUDON ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getWeight()).toBe(baseLightGroudonWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeLightGroudonWeight); - }, TIMEOUT); + it( + "Autotomize should interact with light metal correctly", + async () => { + const baseLightGroudonWeight = 475; + const autotomizeLightGroudonWeight = 425; + game.override.ability(Abilities.LIGHT_METAL); + await game.classicMode.startBattle([Species.GROUDON]); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getWeight()).toBe(baseLightGroudonWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeLightGroudonWeight); + }, + TIMEOUT, + ); }); diff --git a/test/moves/baddy_bad.test.ts b/test/moves/baddy_bad.test.ts index 78e7c63d49f..cba13c7ac68 100644 --- a/test/moves/baddy_bad.test.ts +++ b/test/moves/baddy_bad.test.ts @@ -21,7 +21,7 @@ describe("Moves - Baddy Bad", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) @@ -31,7 +31,7 @@ describe("Moves - Baddy Bad", () => { it("should not activate Reflect if the move fails due to Protect", async () => { game.override.enemyMoveset(Moves.PROTECT); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.BADDY_BAD); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/baneful_bunker.test.ts b/test/moves/baneful_bunker.test.ts index 55b4b7d985e..4624d77dc42 100644 --- a/test/moves/baneful_bunker.test.ts +++ b/test/moves/baneful_bunker.test.ts @@ -7,7 +7,6 @@ import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; import { StatusEffect } from "#app/enums/status-effect"; - describe("Moves - Baneful Bunker", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -36,57 +35,48 @@ describe("Moves - Baneful Bunker", () => { game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user and poison attackers that make contact", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + test("should protect the user and poison attackers that make contact", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); - } - ); - test( - "should protect the user and poison attackers that make contact, regardless of accuracy checks", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }); + test("should protect the user and poison attackers that make contact, regardless of accuracy checks", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("MoveEffectPhase"); + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); - await game.move.forceMiss(); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); - } - ); + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }); - test( - "should not poison attackers that don't make contact", - async () => { - game.override.moveset(Moves.FLASH_CANNON); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + test("should not poison attackers that don't make contact", async () => { + game.override.moveset(Moves.FLASH_CANNON); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.FLASH_CANNON); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("MoveEffectPhase"); + game.move.select(Moves.FLASH_CANNON); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); - await game.move.forceMiss(); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeFalsy(); - } - ); + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeFalsy(); + }); }); diff --git a/test/moves/baton_pass.test.ts b/test/moves/baton_pass.test.ts index 6abd2d95f7b..9db6ec7c518 100644 --- a/test/moves/baton_pass.test.ts +++ b/test/moves/baton_pass.test.ts @@ -28,7 +28,7 @@ describe("Moves - Baton Pass", () => { .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH ]) + .moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .disableCrits(); @@ -36,7 +36,7 @@ describe("Moves - Baton Pass", () => { it("transfers all stat stages when player uses it", async () => { // arrange - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // round 1 - buff game.move.select(Moves.NASTY_PLOT); @@ -59,10 +59,8 @@ describe("Moves - Baton Pass", () => { it("passes stat stage buffs when AI uses it", async () => { // arrange - game.override - .startingWave(5) - .enemyMoveset(new Array(4).fill([ Moves.NASTY_PLOT ])); - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + game.override.startingWave(5).enemyMoveset(new Array(4).fill([Moves.NASTY_PLOT])); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // round 1 - ai buffs game.move.select(Moves.SPLASH); @@ -70,7 +68,7 @@ describe("Moves - Baton Pass", () => { // round 2 - baton pass game.scene.getEnemyPokemon()!.hp = 100; - game.override.enemyMoveset([ Moves.BATON_PASS ]); + game.override.enemyMoveset([Moves.BATON_PASS]); // Force moveset to update mid-battle // TODO: replace with enemy ai control function when it's added game.scene.getEnemyParty()[0].getMoveset(); @@ -87,35 +85,35 @@ describe("Moves - Baton Pass", () => { "MoveEffectPhase", "SwitchSummonPhase", "SummonPhase", - "PostSummonPhase" + "PostSummonPhase", ]); }, 20000); it("doesn't transfer effects that aren't transferrable", async () => { - game.override.enemyMoveset([ Moves.SALT_CURE ]); - await game.classicMode.startBattle([ Species.PIKACHU, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.SALT_CURE]); + await game.classicMode.startBattle([Species.PIKACHU, Species.FEEBAS]); - const [ player1, player2 ] = game.scene.getPlayerParty(); + const [player1, player2] = game.scene.getPlayerParty(); game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEndPhase"); - expect(player1.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeTruthy(); + expect(player1.findTag(t => t.tagType === BattlerTagType.SALT_CURED)).toBeTruthy(); game.doSelectPartyPokemon(1); await game.toNextTurn(); - expect(player2.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined(); + expect(player2.findTag(t => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined(); }, 20000); it("doesn't allow binding effects from the user to persist", async () => { - game.override.moveset([ Moves.FIRE_SPIN, Moves.BATON_PASS ]); + game.override.moveset([Moves.FIRE_SPIN, Moves.BATON_PASS]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.FIRE_SPIN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.toNextTurn(); @@ -123,7 +121,7 @@ describe("Moves - Baton Pass", () => { expect(enemy.getTag(BattlerTagType.FIRE_SPIN)).toBeDefined(); game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); diff --git a/test/moves/beak_blast.test.ts b/test/moves/beak_blast.test.ts index 177610182b0..9f8b1e3d5c3 100644 --- a/test/moves/beak_blast.test.ts +++ b/test/moves/beak_blast.test.ts @@ -10,7 +10,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Beak Blast", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,106 +29,91 @@ describe("Moves - Beak Blast", () => { game.override .battleType("single") .ability(Abilities.UNNERVE) - .moveset([ Moves.BEAK_BLAST ]) + .moveset([Moves.BEAK_BLAST]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.TACKLE ]) + .enemyMoveset([Moves.TACKLE]) .startingLevel(100) .enemyLevel(100); }); - it( - "should add a charge effect that burns attackers on contact", - async () => { - await game.startBattle([ Species.BLASTOISE ]); + it("should add a charge effect that burns attackers on contact", async () => { + await game.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }); - it( - "should still charge and burn opponents if the user is sleeping", - async () => { - game.override.statusEffect(StatusEffect.SLEEP); + it("should still charge and burn opponents if the user is sleeping", async () => { + game.override.statusEffect(StatusEffect.SLEEP); - await game.startBattle([ Species.BLASTOISE ]); + await game.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }); - it( - "should not burn attackers that don't make contact", - async () => { - game.override.enemyMoveset([ Moves.WATER_GUN ]); + it("should not burn attackers that don't make contact", async () => { + game.override.enemyMoveset([Moves.WATER_GUN]); - await game.startBattle([ Species.BLASTOISE ]); + await game.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); + }); - it( - "should only hit twice with Multi-Lens", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + it("should only hit twice with Multi-Lens", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([ Species.BLASTOISE ]); + await game.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(leadPokemon.turnData.hitCount).toBe(2); + }); - it( - "should be blocked by Protect", - async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); + it("should be blocked by Protect", async () => { + game.override.enemyMoveset([Moves.PROTECT]); - await game.startBattle([ Species.BLASTOISE ]); + await game.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeUndefined(); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeUndefined(); + }); }); diff --git a/test/moves/beat_up.test.ts b/test/moves/beat_up.test.ts index 1ac2ae238b8..7e67f2ea363 100644 --- a/test/moves/beat_up.test.ts +++ b/test/moves/beat_up.test.ts @@ -27,51 +27,59 @@ describe("Moves - Beat Up", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyLevel(100); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); - game.override.moveset([ Moves.BEAT_UP ]); + game.override.moveset([Moves.BEAT_UP]); }); - it( - "should hit once for each healthy player Pokemon", - async () => { - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE ]); + it("should hit once for each healthy player Pokemon", async () => { + await game.startBattle([ + Species.MAGIKARP, + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.PIKACHU, + Species.EEVEE, + ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - let enemyStartingHp = enemyPokemon.hp; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + let enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.BEAT_UP); + game.move.select(Moves.BEAT_UP); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(6); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + + while (playerPokemon.turnData.hitsLeft > 0) { + enemyStartingHp = enemyPokemon.hp; await game.phaseInterceptor.to(MoveEffectPhase); - - expect(playerPokemon.turnData.hitCount).toBe(6); expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - - while (playerPokemon.turnData.hitsLeft > 0) { - enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to(MoveEffectPhase); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } } - ); + }); - it( - "should not count player Pokemon with status effects towards hit count", - async () => { - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE ]); + it("should not count player Pokemon with status effects towards hit count", async () => { + await game.startBattle([ + Species.MAGIKARP, + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.PIKACHU, + Species.EEVEE, + ]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; - game.scene.getPlayerParty()[1].trySetStatus(StatusEffect.BURN); + game.scene.getPlayerParty()[1].trySetStatus(StatusEffect.BURN); - game.move.select(Moves.BEAT_UP); + game.move.select(Moves.BEAT_UP); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(playerPokemon.turnData.hitCount).toBe(5); - } - ); + expect(playerPokemon.turnData.hitCount).toBe(5); + }); }); diff --git a/test/moves/belly_drum.test.ts b/test/moves/belly_drum.test.ts index 7d8b17262d7..f01a50f8a79 100644 --- a/test/moves/belly_drum.test.ts +++ b/test/moves/belly_drum.test.ts @@ -8,7 +8,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Abilities } from "#app/enums/abilities"; - // RATIO : HP Cost of Move const RATIO = 2; // PREDAMAGE : Amount of extra HP lost @@ -35,77 +34,69 @@ describe("Moves - BELLY DRUM", () => { .enemySpecies(Species.SNORLAX) .startingLevel(100) .enemyLevel(100) - .moveset([ Moves.BELLY_DRUM ]) + .moveset([Moves.BELLY_DRUM]) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) - test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }); - test("will still take effect if an uninvolved stat stage is at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("will still take effect if an uninvolved stat stage is at max", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - // Here - Stat.ATK -> -3 and Stat.SPATK -> 6 - leadPokemon.setStatStage(Stat.ATK, -3); - leadPokemon.setStatStage(Stat.SPATK, 6); + // Here - Stat.ATK -> -3 and Stat.SPATK -> 6 + leadPokemon.setStatStage(Stat.ATK, -3); + leadPokemon.setStatStage(Stat.SPATK, 6); - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + }); - test("fails if the pokemon's ATK stat stage is at its maximum", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("fails if the pokemon's ATK stat stage is at its maximum", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.ATK, 6); - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }); - test("fails if the user's health is less than 1/2", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("fails if the user's health is less than 1/2", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - } - ); + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); }); diff --git a/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts index acdce23db92..60387df4226 100644 --- a/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Burning Jealousy", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,13 +29,12 @@ describe("Moves - Burning Jealousy", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset([ Moves.HOWL ]) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.BURNING_JEALOUSY, Moves.GROWL ]); - + .moveset([Moves.BURNING_JEALOUSY, Moves.GROWL]); }); it("should burn the opponent if their stat stages were raised", async () => { @@ -45,33 +43,28 @@ describe("Moves - Burning Jealousy", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.BURNING_JEALOUSY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.status?.effect).toBe(StatusEffect.BURN); }); it("should still burn the opponent if their stat stages were both raised and lowered in the same turn", async () => { - game.override - .starterSpecies(0) - .battleType("double"); - await game.classicMode.startBattle([ Species.FEEBAS, Species.ABRA ]); + game.override.starterSpecies(0).battleType("double"); + await game.classicMode.startBattle([Species.FEEBAS, Species.ABRA]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.BURNING_JEALOUSY); game.move.select(Moves.GROWL, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.status?.effect).toBe(StatusEffect.BURN); }); it("should ignore stat stages raised by IMPOSTER", async () => { - game.override - .enemySpecies(Species.DITTO) - .enemyAbility(Abilities.IMPOSTER) - .enemyMoveset(Moves.SPLASH); + game.override.enemySpecies(Species.DITTO).enemyAbility(Abilities.IMPOSTER).enemyMoveset(Moves.SPLASH); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -88,15 +81,15 @@ describe("Moves - Burning Jealousy", () => { }); it("should be boosted by Sheer Force even if opponent didn't raise stat stages", async () => { - game.override - .ability(Abilities.SHEER_FORCE) - .enemyMoveset(Moves.SPLASH); + game.override.ability(Abilities.SHEER_FORCE).enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[Moves.BURNING_JEALOUSY], "calculateBattlePower"); await game.classicMode.startBattle(); game.move.select(Moves.BURNING_JEALOUSY); await game.phaseInterceptor.to("BerryPhase"); - expect(allMoves[Moves.BURNING_JEALOUSY].calculateBattlePower).toHaveReturnedWith(allMoves[Moves.BURNING_JEALOUSY].power * 5461 / 4096); + expect(allMoves[Moves.BURNING_JEALOUSY].calculateBattlePower).toHaveReturnedWith( + (allMoves[Moves.BURNING_JEALOUSY].power * 5461) / 4096, + ); }); }); diff --git a/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts index b329170cc42..0bbab6a629a 100644 --- a/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -25,7 +25,7 @@ describe("Moves - Camouflage", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.CAMOUFLAGE ]) + .moveset([Moves.CAMOUFLAGE]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -35,12 +35,12 @@ describe("Moves - Camouflage", () => { }); it("Camouflage should look at terrain first when selecting a type to change into", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.CAMOUFLAGE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.getTerrainType()).toBe(TerrainType.PSYCHIC); const pokemonType = playerPokemon.getTypes()[0]; diff --git a/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts index 2d929221e0b..d54f1bd9f21 100644 --- a/test/moves/ceaseless_edge.test.ts +++ b/test/moves/ceaseless_edge.test.ts @@ -10,7 +10,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; - describe("Moves - Ceaseless Edge", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -33,86 +32,76 @@ describe("Moves - Ceaseless Edge", () => { game.override.enemyPassiveAbility(Abilities.RUN_AWAY); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); + game.override.moveset([Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR]); game.override.enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); - }); - test( - "move should hit and apply spikes", - async () => { - await game.classicMode.startBattle([ Species.ILLUMISE ]); + test("move should hit and apply spikes", async () => { + await game.classicMode.startBattle([Species.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyStartingHp = enemyPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.CEASELESS_EDGE); + game.move.select(Moves.CEASELESS_EDGE); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - await game.phaseInterceptor.to(TurnEndPhase); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(1); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(1); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }); - test( - "move should hit twice with multi lens and apply two layers of spikes", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS" }]); - await game.classicMode.startBattle([ Species.ILLUMISE ]); + test("move should hit twice with multi lens and apply two layers of spikes", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + await game.classicMode.startBattle([Species.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyStartingHp = enemyPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.CEASELESS_EDGE); + game.move.select(Moves.CEASELESS_EDGE); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - await game.phaseInterceptor.to(TurnEndPhase); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(2); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }); - test( - "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS" }]); - game.override.startingWave(25); + test("trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + game.override.startingWave(25); - await game.classicMode.startBattle([ Species.ILLUMISE ]); + await game.classicMode.startBattle([Species.ILLUMISE]); - game.move.select(Moves.CEASELESS_EDGE); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + game.move.select(Moves.CEASELESS_EDGE); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - await game.toNextTurn(); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(2); + await game.toNextTurn(); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); - const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp; - // Check HP of pokemon that WILL BE switched in (index 1) - game.forceEnemyToSwitch(); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase, false); - expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes); - } - ); + const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp; + // Check HP of pokemon that WILL BE switched in (index 1) + game.forceEnemyToSwitch(); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase, false); + expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes); + }); }); diff --git a/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts index 0d99175a9bc..f90aaf6bb02 100644 --- a/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -23,16 +23,16 @@ describe("Moves - Chilly Reception", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") - .moveset([ Moves.CHILLY_RECEPTION, Moves.SNOWSCAPE ]) + game.override + .battleType("single") + .moveset([Moves.CHILLY_RECEPTION, Moves.SNOWSCAPE]) .enemyMoveset(Array(4).fill(Moves.SPLASH)) .enemyAbility(Abilities.NONE) .ability(Abilities.NONE); - }); it("should still change the weather if user can't switch out", async () => { - await game.classicMode.startBattle([ Species.SLOWKING ]); + await game.classicMode.startBattle([Species.SLOWKING]); game.move.select(Moves.CHILLY_RECEPTION); @@ -41,7 +41,7 @@ describe("Moves - Chilly Reception", () => { }); it("should switch out even if it's snowing", async () => { - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); // first turn set up snow with snowscape, try chilly reception on second turn game.move.select(Moves.SNOWSCAPE); await game.phaseInterceptor.to("BerryPhase", false); @@ -57,8 +57,7 @@ describe("Moves - Chilly Reception", () => { }); it("happy case - switch out and weather changes", async () => { - - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); game.move.select(Moves.CHILLY_RECEPTION); game.doSelectPartyPokemon(1); @@ -70,12 +69,13 @@ describe("Moves - Chilly Reception", () => { // enemy uses another move and weather doesn't change it("check case - enemy not selecting chilly reception doesn't change weather ", async () => { - game.override.battleType("single") - .enemyMoveset([ Moves.CHILLY_RECEPTION, Moves.TACKLE ]) + game.override + .battleType("single") + .enemyMoveset([Moves.CHILLY_RECEPTION, Moves.TACKLE]) .enemyAbility(Abilities.NONE) .moveset(Array(4).fill(Moves.SPLASH)); - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.TACKLE); @@ -85,14 +85,15 @@ describe("Moves - Chilly Reception", () => { }); it("enemy trainer - expected behavior ", async () => { - game.override.battleType("single") + game.override + .battleType("single") .startingWave(8) .enemyMoveset(Array(4).fill(Moves.CHILLY_RECEPTION)) .enemyAbility(Abilities.NONE) .enemySpecies(Species.MAGIKARP) - .moveset([ Moves.SPLASH, Moves.THUNDERBOLT ]); + .moveset([Moves.SPLASH, Moves.THUNDERBOLT]); - await game.classicMode.startBattle([ Species.JOLTEON ]); + await game.classicMode.startBattle([Species.JOLTEON]); const RIVAL_MAGIKARP1 = game.scene.getEnemyPokemon()?.id; game.move.select(Moves.SPLASH); @@ -119,6 +120,5 @@ describe("Moves - Chilly Reception", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); - }); }); diff --git a/test/moves/chloroblast.test.ts b/test/moves/chloroblast.test.ts index ee01935291a..f08eca100c4 100644 --- a/test/moves/chloroblast.test.ts +++ b/test/moves/chloroblast.test.ts @@ -22,7 +22,7 @@ describe("Moves - Chloroblast", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.CHLOROBLAST ]) + .moveset([Moves.CHLOROBLAST]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -32,7 +32,7 @@ describe("Moves - Chloroblast", () => { }); it("should not deal recoil damage if the opponent uses protect", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.CHLOROBLAST); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/clangorous_soul.test.ts b/test/moves/clangorous_soul.test.ts index 6bb50b9ba59..56f19a0e088 100644 --- a/test/moves/clangorous_soul.test.ts +++ b/test/moves/clangorous_soul.test.ts @@ -6,7 +6,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; - /** HP Cost of Move */ const RATIO = 3; /** Amount of extra HP lost */ @@ -32,97 +31,89 @@ describe("Moves - Clangorous Soul", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.CLANGOROUS_SOUL ]); + game.override.moveset([Moves.CLANGOROUS_SOUL]); game.override.enemyMoveset(Moves.SPLASH); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) - 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.startBattle([ Species.MAGIKARP ]); + 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.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(1); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(1); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); + }); - it("will still take effect if one or more of the involved stat stages are not at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + it("will still take effect if one or more of the involved stat stages are not at max", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4 - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.DEF, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPDEF, 4); + //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4 + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.DEF, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPDEF, 4); - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(5); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(5); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); + }); - it("fails if all stat stages involved are at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + it("fails if all stat stages involved are at max", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.DEF, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPDEF, 6); - leadPokemon.setStatStage(Stat.SPD, 6); + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.DEF, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPDEF, 6); + leadPokemon.setStatStage(Stat.SPD, 6); - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); + }); - it("fails if the user's health is less than 1/3", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + it("fails if the user's health is less than 1/3", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); + }); }); diff --git a/test/moves/copycat.test.ts b/test/moves/copycat.test.ts index f682aeb7b5e..c7242f0940e 100644 --- a/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -28,7 +28,7 @@ describe("Moves - Copycat", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.COPYCAT, Moves.SPIKY_SHIELD, Moves.SWORDS_DANCE, Moves.SPLASH ]) + .moveset([Moves.COPYCAT, Moves.SPIKY_SHIELD, Moves.SWORDS_DANCE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -65,14 +65,12 @@ describe("Moves - Copycat", () => { }); it("should copy the called move when the last move successfully calls another", async () => { - game.override - .moveset([ Moves.SPLASH, Moves.METRONOME ]) - .enemyMoveset(Moves.COPYCAT); + game.override.moveset([Moves.SPLASH, Moves.METRONOME]).enemyMoveset(Moves.COPYCAT); await game.classicMode.startBattle(); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.SWORDS_DANCE); game.move.select(Moves.METRONOME); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); // Player moves first, so enemy can copy Swords Dance + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); // Player moves first, so enemy can copy Swords Dance await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(2); @@ -83,7 +81,7 @@ describe("Moves - Copycat", () => { await game.classicMode.startBattle(); game.move.select(Moves.COPYCAT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); diff --git a/test/moves/crafty_shield.test.ts b/test/moves/crafty_shield.test.ts index 054d19debf8..3a2df6a3446 100644 --- a/test/moves/crafty_shield.test.ts +++ b/test/moves/crafty_shield.test.ts @@ -9,7 +9,6 @@ import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { CommandPhase } from "#app/phases/command-phase"; - describe("Moves - Crafty Shield", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,95 +28,83 @@ describe("Moves - Crafty Shield", () => { game.override.battleType("double"); - game.override.moveset([ Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE ]); + game.override.moveset([Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.GROWL ]); + game.override.enemyMoveset([Moves.GROWL]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user and allies from status moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + test("should protect the user and allies from status moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.CRAFTY_SHIELD); + game.move.select(Moves.CRAFTY_SHIELD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); - test( - "should not protect the user and allies from attack moves", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + test("should not protect the user and allies from attack moves", async () => { + game.override.enemyMoveset([Moves.TACKLE]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.CRAFTY_SHIELD); + game.move.select(Moves.CRAFTY_SHIELD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); - } - ); + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }); - test( - "should protect the user and allies from moves that ignore other protection", - async () => { - game.override.enemySpecies(Species.DUSCLOPS); - game.override.enemyMoveset([ Moves.CURSE ]); + test("should protect the user and allies from moves that ignore other protection", async () => { + game.override.enemySpecies(Species.DUSCLOPS); + game.override.enemyMoveset([Moves.CURSE]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.CRAFTY_SHIELD); + game.move.select(Moves.CRAFTY_SHIELD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); - } - ); + leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); + }); - test( - "should not block allies' self-targeted moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + test("should not block allies' self-targeted moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.CRAFTY_SHIELD); + game.move.select(Moves.CRAFTY_SHIELD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SWORDS_DANCE, 1); + game.move.select(Moves.SWORDS_DANCE, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); - } - ); + expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); + }); }); diff --git a/test/moves/defog.test.ts b/test/moves/defog.test.ts index 52c51df657a..64904e964c4 100644 --- a/test/moves/defog.test.ts +++ b/test/moves/defog.test.ts @@ -23,17 +23,17 @@ describe("Moves - Defog", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.MIST, Moves.SAFEGUARD, Moves.SPLASH ]) + .moveset([Moves.MIST, Moves.SAFEGUARD, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.DEFOG, Moves.GROWL ]); + .enemyMoveset([Moves.DEFOG, Moves.GROWL]); }); it("should not allow Safeguard to be active", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); @@ -44,13 +44,11 @@ describe("Moves - Defog", () => { expect(playerPokemon[0].isSafeguarded(enemyPokemon[0])).toBe(false); - expect(true).toBe(true); }); - it("should not allow Mist to be active", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerField(); diff --git a/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts index a64065178ce..c39d40427ad 100644 --- a/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -12,14 +12,13 @@ import { BattlerIndex } from "#app/battle"; import { StatusEffect } from "#enums/status-effect"; import { PokemonInstantReviveModifier } from "#app/modifier/modifier"; - describe("Moves - Destiny Bond", () => { let phaserGame: Phaser.Game; let game: GameManager; - const defaultParty = [ Species.BULBASAUR, Species.SQUIRTLE ]; - const enemyFirst = [ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]; - const playerFirst = [ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]; + const defaultParty = [Species.BULBASAUR, Species.SQUIRTLE]; + const enemyFirst = [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; + const playerFirst = [BattlerIndex.PLAYER, BattlerIndex.ENEMY]; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -33,7 +32,8 @@ describe("Moves - Destiny Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .ability(Abilities.UNNERVE) // Pre-emptively prevent flakiness from opponent berries .enemySpecies(Species.RATTATA) .enemyAbility(Abilities.RUN_AWAY) @@ -62,7 +62,7 @@ describe("Moves - Destiny Bond", () => { it("should KO the opponent on the next turn", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPLASH, moveToUse ]); + game.override.moveset([Moves.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -88,7 +88,7 @@ describe("Moves - Destiny Bond", () => { it("should fail if used twice in a row", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPLASH, moveToUse ]); + game.override.moveset([Moves.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -115,8 +115,7 @@ describe("Moves - Destiny Bond", () => { // Opponent will be reduced to 1 HP by False Swipe, then faint to Sandstorm const moveToUse = Moves.FALSE_SWIPE; - game.override.moveset(moveToUse) - .ability(Abilities.SAND_STREAM); + game.override.moveset(moveToUse).ability(Abilities.SAND_STREAM); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -133,7 +132,7 @@ describe("Moves - Destiny Bond", () => { it("should not KO the opponent if the user had another turn", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPORE, moveToUse ]); + game.override.moveset([Moves.SPORE, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -158,9 +157,8 @@ describe("Moves - Destiny Bond", () => { }); it("should not KO an ally", async () => { - game.override.moveset([ Moves.DESTINY_BOND, Moves.CRUNCH ]) - .battleType("double"); - await game.classicMode.startBattle([ Species.SHEDINJA, Species.BULBASAUR, Species.SQUIRTLE ]); + game.override.moveset([Moves.DESTINY_BOND, Moves.CRUNCH]).battleType("double"); + await game.classicMode.startBattle([Species.SHEDINJA, Species.BULBASAUR, Species.SQUIRTLE]); const enemyPokemon0 = game.scene.getEnemyField()[0]; const enemyPokemon1 = game.scene.getEnemyField()[1]; @@ -170,7 +168,7 @@ describe("Moves - Destiny Bond", () => { // Shedinja uses Destiny Bond, then ally Bulbasaur KO's Shedinja with Crunch game.move.select(Moves.DESTINY_BOND, 0); game.move.select(Moves.CRUNCH, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon0?.isFainted()).toBe(false); @@ -203,8 +201,7 @@ describe("Moves - Destiny Bond", () => { }); it("should not cause a crash if the user is KO'd by Pledge moves", async () => { - game.override.moveset([ Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE ]) - .battleType("double"); + game.override.moveset([Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE]).battleType("double"); await game.classicMode.startBattle(defaultParty); const enemyPokemon0 = game.scene.getEnemyField()[0]; @@ -214,7 +211,7 @@ describe("Moves - Destiny Bond", () => { game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY); game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon0?.isFainted()).toBe(true); @@ -235,8 +232,7 @@ describe("Moves - Destiny Bond", () => { it("should not allow the opponent to revive via Reviver Seed", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset(moveToUse) - .startingHeldItems([{ name: "REVIVER_SEED" }]); + game.override.moveset(moveToUse).startingHeldItems([{ name: "REVIVER_SEED" }]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -250,7 +246,9 @@ describe("Moves - Destiny Bond", () => { 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); + const revSeeds = game.scene + .getModifiers(PokemonInstantReviveModifier) + .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 3c81f8221ba..2363122f0d7 100644 --- a/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -24,7 +24,7 @@ describe("Moves - Diamond Storm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.DIAMOND_STORM ]) + .moveset([Moves.DIAMOND_STORM]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) @@ -36,7 +36,7 @@ describe("Moves - Diamond Storm", () => { const diamondStorm = allMoves[Moves.DIAMOND_STORM]; vi.spyOn(diamondStorm, "chance", "get").mockReturnValue(100); vi.spyOn(diamondStorm, "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.DIAMOND_STORM); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/dig.test.ts b/test/moves/dig.test.ts index d9cf4845a67..81339111656 100644 --- a/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -36,7 +36,7 @@ describe("Moves - Dig", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,7 +62,7 @@ describe("Moves - Dig", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -75,11 +75,9 @@ describe("Moves - Dig", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -94,7 +92,7 @@ describe("Moves - Dig", () => { }); it("should cause the user to take double damage from Earthquake", async () => { - await game.classicMode.startBattle([ Species.DONDOZO ]); + await game.classicMode.startBattle([Species.DONDOZO]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -102,7 +100,7 @@ describe("Moves - Dig", () => { const preDigEarthquakeDmg = playerPokemon.getAttackDamage(enemyPokemon, allMoves[Moves.EARTHQUAKE]).damage; game.move.select(Moves.DIG); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/test/moves/disable.test.ts b/test/moves/disable.test.ts index 044cfc762cd..fdfb748df9d 100644 --- a/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -12,7 +12,7 @@ describe("Moves - Disable", () => { beforeAll(() => { phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS + type: Phaser.HEADLESS, }); }); @@ -26,7 +26,7 @@ describe("Moves - Disable", () => { .battleType("single") .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.DISABLE, Moves.SPLASH ]) + .moveset([Moves.DISABLE, Moves.SPLASH]) .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.PIKACHU) .enemySpecies(Species.SHUCKLE); @@ -38,34 +38,37 @@ describe("Moves - Disable", () => { const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyMon.getMoveHistory()).toHaveLength(1); expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(true); }); - it("fails if enemy has no move history", async() => { + it("fails if enemy has no move history", async () => { await game.classicMode.startBattle(); const playerMon = game.scene.getPlayerPokemon()!; const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); - expect(playerMon.getMoveHistory()[0]).toMatchObject({ move: Moves.DISABLE, result: MoveResult.FAIL }); + expect(playerMon.getMoveHistory()[0]).toMatchObject({ + move: Moves.DISABLE, + result: MoveResult.FAIL, + }); expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(false); }, 20000); - it("causes STRUGGLE if all usable moves are disabled", async() => { + it("causes STRUGGLE if all usable moves are disabled", async () => { await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.move.select(Moves.SPLASH); @@ -77,15 +80,15 @@ describe("Moves - Disable", () => { expect(enemyHistory[1].move).toBe(Moves.STRUGGLE); }, 20000); - it("cannot disable STRUGGLE", async() => { - game.override.enemyMoveset([ Moves.STRUGGLE ]); + it("cannot disable STRUGGLE", async () => { + game.override.enemyMoveset([Moves.STRUGGLE]); await game.classicMode.startBattle(); const playerMon = game.scene.getPlayerPokemon()!; const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(playerMon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); @@ -93,7 +96,7 @@ describe("Moves - Disable", () => { expect(enemyMon.isMoveRestricted(Moves.STRUGGLE)).toBe(false); }, 20000); - it("interrupts target's move when target moves after", async() => { + it("interrupts target's move when target moves after", async () => { await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; @@ -103,43 +106,46 @@ describe("Moves - Disable", () => { // Both mons just used Splash last turn; now have player use Disable. game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const enemyHistory = enemyMon.getMoveHistory(); expect(enemyHistory).toHaveLength(2); - expect(enemyHistory[0]).toMatchObject({ move: Moves.SPLASH, result: MoveResult.SUCCESS }); + expect(enemyHistory[0]).toMatchObject({ + move: Moves.SPLASH, + result: MoveResult.SUCCESS, + }); expect(enemyHistory[1].result).toBe(MoveResult.FAIL); }, 20000); - it("disables NATURE POWER, not the move invoked by it", async() => { - game.override.enemyMoveset([ Moves.NATURE_POWER ]); + it("disables NATURE POWER, not the move invoked by it", async () => { + game.override.enemyMoveset([Moves.NATURE_POWER]); await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyMon.isMoveRestricted(Moves.NATURE_POWER)).toBe(true); expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[0].move)).toBe(false); }, 20000); - it("disables most recent move", async() => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.TACKLE ]); + it("disables most recent move", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.TACKLE]); await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.move.select(Moves.DISABLE); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyMon.isMoveRestricted(Moves.TACKLE)).toBe(true); diff --git a/test/moves/dive.test.ts b/test/moves/dive.test.ts index e8febaa72f6..8d7b0f9dd00 100644 --- a/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -36,7 +36,7 @@ describe("Moves - Dive", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,7 +62,7 @@ describe("Moves - Dive", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -75,11 +75,9 @@ describe("Moves - Dive", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -94,11 +92,9 @@ describe("Moves - Dive", () => { }); it("should trigger on-contact post-defend ability effects", async () => { - game.override - .enemyAbility(Abilities.ROUGH_SKIN) - .enemyMoveset(Moves.SPLASH); + game.override.enemyAbility(Abilities.ROUGH_SKIN).enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -115,7 +111,7 @@ describe("Moves - Dive", () => { it("should cancel attack after Harsh Sunlight is set", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/moves/doodle.test.ts b/test/moves/doodle.test.ts index 6272a822094..822e415c918 100644 --- a/test/moves/doodle.test.ts +++ b/test/moves/doodle.test.ts @@ -24,7 +24,7 @@ describe("Moves - Doodle", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.DOODLE ]) + .moveset([Moves.SPLASH, Moves.DOODLE]) .ability(Abilities.ADAPTABILITY) .battleType("single") .disableCrits() @@ -34,7 +34,7 @@ describe("Moves - Doodle", () => { }); it("should copy the opponent's ability in singles", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.DOODLE); await game.phaseInterceptor.to("BerryPhase"); @@ -44,7 +44,7 @@ describe("Moves - Doodle", () => { it("should copy the opponent's ability to itself and its ally in doubles", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); @@ -55,10 +55,9 @@ describe("Moves - Doodle", () => { }); it("should activate post-summon abilities", async () => { - game.override.battleType("double") - .enemyAbility(Abilities.INTIMIDATE); + game.override.battleType("double").enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); diff --git a/test/moves/double_team.test.ts b/test/moves/double_team.test.ts index 9145265bf93..f6791573132 100644 --- a/test/moves/double_team.test.ts +++ b/test/moves/double_team.test.ts @@ -24,16 +24,16 @@ describe("Moves - Double Team", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.DOUBLE_TEAM ]); + game.override.moveset([Moves.DOUBLE_TEAM]); game.override.disableCrits(); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("raises the user's EVA stat stage by 1", async () => { - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const ally = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -46,6 +46,6 @@ describe("Moves - Double Team", () => { await game.toNextTurn(); expect(ally.getStatStage(Stat.EVA)).toBe(1); - expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75); + expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(0.75); }); }); diff --git a/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts index 0c5b0d69675..30d5af3a51b 100644 --- a/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -27,11 +27,11 @@ describe("Moves - Dragon Cheer", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemyLevel(20) - .moveset([ Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH ]); + .moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]); }); it("increases the user's allies' critical hit ratio by one stage", async () => { - await game.classicMode.startBattle([ Species.DRAGONAIR, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); const enemy = game.scene.getEnemyField()[0]; @@ -40,7 +40,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -48,7 +48,7 @@ describe("Moves - Dragon Cheer", () => { }); it("increases the user's Dragon-type allies' critical hit ratio by two stages", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.DRAGONAIR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.DRAGONAIR]); const enemy = game.scene.getEnemyField()[0]; @@ -57,7 +57,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -65,7 +65,7 @@ describe("Moves - Dragon Cheer", () => { }); it("applies the effect based on the allies' type upon use of the move, and do not change if the allies' type changes later in battle", async () => { - await game.classicMode.startBattle([ Species.DRAGONAIR, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); const magikarp = game.scene.getPlayerField()[1]; const enemy = game.scene.getEnemyField()[0]; @@ -75,7 +75,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -84,13 +84,13 @@ describe("Moves - Dragon Cheer", () => { await game.toNextTurn(); // Change Magikarp's type to Dragon - vi.spyOn(magikarp, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); - expect(magikarp.getTypes()).toEqual([ PokemonType.DRAGON ]); + vi.spyOn(magikarp, "getTypes").mockReturnValue([PokemonType.DRAGON]); + expect(magikarp.getTypes()).toEqual([PokemonType.DRAGON]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender diff --git a/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts index 6540bc2f327..99d66421463 100644 --- a/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -34,7 +34,7 @@ describe("Moves - Dragon Rage", () => { game.override.battleType("single"); game.override.starterSpecies(Species.SNORLAX); - game.override.moveset([ Moves.DRAGON_RAGE ]); + game.override.moveset([Moves.DRAGON_RAGE]); game.override.ability(Abilities.BALL_FETCH); game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); @@ -53,7 +53,7 @@ describe("Moves - Dragon Rage", () => { it("ignores weaknesses", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([PokemonType.DRAGON]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -63,7 +63,7 @@ describe("Moves - Dragon Rage", () => { it("ignores resistances", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ PokemonType.STEEL ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([PokemonType.STEEL]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -83,7 +83,7 @@ describe("Moves - Dragon Rage", () => { it("ignores stab", async () => { game.override.disableCrits(); - vi.spyOn(partyPokemon, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([PokemonType.DRAGON]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts index 545ad9fe8eb..37e8aa2fe1b 100644 --- a/test/moves/dragon_tail.test.ts +++ b/test/moves/dragon_tail.test.ts @@ -27,8 +27,9 @@ describe("Moves - Dragon Tail", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") - .moveset([ Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER ]) + game.override + .battleType("single") + .moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]) .enemySpecies(Species.WAILORD) .enemyMoveset(Moves.SPLASH) .startingLevel(5) @@ -38,7 +39,7 @@ describe("Moves - Dragon Tail", () => { }); it("should cause opponent to flee, and not crash", async () => { - await game.classicMode.startBattle([ Species.DRATINI ]); + await game.classicMode.startBattle([Species.DRATINI]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -56,7 +57,7 @@ describe("Moves - Dragon Tail", () => { it("should cause opponent to flee, display ability, and not crash", async () => { game.override.enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI ]); + await game.classicMode.startBattle([Species.DRATINI]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -72,10 +73,8 @@ describe("Moves - Dragon Tail", () => { }); it("should proceed without crashing in a double battle", async () => { - game.override - .battleType("double").enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD ]); + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemyAbility(Abilities.ROUGH_SKIN); + await game.classicMode.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); const leadPokemon = game.scene.getPlayerParty()[0]!; @@ -103,11 +102,8 @@ describe("Moves - Dragon Tail", () => { }); it("should redirect targets upon opponent flee", async () => { - game.override - .battleType("double") - .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD ]); + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemyAbility(Abilities.ROUGH_SKIN); + await game.classicMode.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); const leadPokemon = game.scene.getPlayerParty()[0]!; const secPokemon = game.scene.getPlayerParty()[1]!; @@ -134,7 +130,7 @@ describe("Moves - Dragon Tail", () => { it("doesn't switch out if the target has suction cups", async () => { game.override.enemyAbility(Abilities.SUCTION_CUPS); - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const enemy = game.scene.getEnemyPokemon()!; @@ -145,9 +141,8 @@ describe("Moves - Dragon Tail", () => { }); it("should force a switch upon fainting an opponent normally", async () => { - game.override.startingWave(5) - .startingLevel(1000); // To make sure Dragon Tail KO's the opponent - await game.classicMode.startBattle([ Species.DRATINI ]); + game.override.startingWave(5).startingLevel(1000); // To make sure Dragon Tail KO's the opponent + await game.classicMode.startBattle([Species.DRATINI]); game.move.select(Moves.DRAGON_TAIL); @@ -165,10 +160,11 @@ describe("Moves - Dragon Tail", () => { }); it("should not cause a softlock when activating an opponent trainer's reviver seed", async () => { - game.override.startingWave(5) + game.override + .startingWave(5) .enemyHeldItems([{ name: "REVIVER_SEED" }]) .startingLevel(1000); // To make sure Dragon Tail KO's the opponent - await game.classicMode.startBattle([ Species.DRATINI ]); + await game.classicMode.startBattle([Species.DRATINI]); game.move.select(Moves.DRAGON_TAIL); @@ -182,10 +178,11 @@ describe("Moves - Dragon Tail", () => { }); it("should not cause a softlock when activating a player's reviver seed", async () => { - game.override.startingHeldItems([{ name: "REVIVER_SEED" }]) + game.override + .startingHeldItems([{ name: "REVIVER_SEED" }]) .enemyMoveset(Moves.DRAGON_TAIL) .enemyLevel(1000); // To make sure Dragon Tail KO's the player - await game.classicMode.startBattle([ Species.DRATINI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.DRATINI, Species.BULBASAUR]); game.move.select(Moves.SPLASH); @@ -199,15 +196,13 @@ describe("Moves - Dragon Tail", () => { }); it("should force switches randomly", async () => { - game.override.enemyMoveset(Moves.DRAGON_TAIL) - .startingLevel(100) - .enemyLevel(1); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + game.override.enemyMoveset(Moves.DRAGON_TAIL).startingLevel(100).enemyLevel(1); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); - const [ bulbasaur, charmander, squirtle ] = game.scene.getPlayerParty(); + const [bulbasaur, charmander, squirtle] = game.scene.getPlayerParty(); // Turn 1: Mock an RNG call that calls for switching to 1st backup Pokemon (Charmander) - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -220,7 +215,7 @@ describe("Moves - Dragon Tail", () => { expect(bulbasaur.getInverseHp()).toBeGreaterThan(0); // Turn 2: Mock an RNG call that calls for switching to 2nd backup Pokemon (Squirtle) - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min + 1; }); game.move.select(Moves.SPLASH); @@ -233,17 +228,15 @@ describe("Moves - Dragon Tail", () => { }); it("should not force a switch to a challenge-ineligible Pokemon", async () => { - game.override.enemyMoveset(Moves.DRAGON_TAIL) - .startingLevel(100) - .enemyLevel(1); + game.override.enemyMoveset(Moves.DRAGON_TAIL).startingLevel(100).enemyLevel(1); // Mono-Water challenge, Eevee is ineligible game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.WATER + 1, 0); - await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + await game.challengeMode.startBattle([Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA]); - const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + const [lapras, eevee, toxapex, primarina] = game.scene.getPlayerParty(); // Turn 1: Mock an RNG call that would normally call for switching to Eevee, but it is ineligible - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -257,12 +250,10 @@ describe("Moves - Dragon Tail", () => { }); it("should not force a switch to a fainted Pokemon", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.DRAGON_TAIL ]) - .startingLevel(100) - .enemyLevel(1); - await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.DRAGON_TAIL]).startingLevel(100).enemyLevel(1); + await game.classicMode.startBattle([Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA]); - const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + const [lapras, eevee, toxapex, primarina] = game.scene.getPlayerParty(); // Turn 1: Eevee faints eevee.hp = 0; @@ -273,7 +264,7 @@ describe("Moves - Dragon Tail", () => { await game.toNextTurn(); // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -288,12 +279,10 @@ describe("Moves - Dragon Tail", () => { }); it("should not force a switch if there are no available Pokemon to switch into", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.DRAGON_TAIL ]) - .startingLevel(100) - .enemyLevel(1); - await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.DRAGON_TAIL]).startingLevel(100).enemyLevel(1); + await game.classicMode.startBattle([Species.LAPRAS, Species.EEVEE]); - const [ lapras, eevee ] = game.scene.getPlayerParty(); + const [lapras, eevee] = game.scene.getPlayerParty(); // Turn 1: Eevee faints eevee.hp = 0; @@ -304,7 +293,7 @@ describe("Moves - Dragon Tail", () => { await game.toNextTurn(); // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); diff --git a/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts index 63e88808218..0ff0712710d 100644 --- a/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -27,7 +27,7 @@ describe("Moves - Dynamax Cannon", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ dynamaxCannon.id ]); + game.override.moveset([dynamaxCannon.id]); game.override.startingLevel(200); // Note that, for Waves 1-10, the level cap is 10 @@ -36,16 +36,14 @@ describe("Moves - Dynamax Cannon", () => { game.override.disableCrits(); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(dynamaxCannon, "calculateBattlePower"); }); it("should return 100 power against an enemy below level cap", async () => { game.override.enemyLevel(1); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -57,9 +55,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 100 power against an enemy at level cap", async () => { game.override.enemyLevel(10); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -71,9 +67,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 120 power against an enemy 1% above level cap", async () => { game.override.enemyLevel(101); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -88,9 +82,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 140 power against an enemy 2% above level capp", async () => { game.override.enemyLevel(102); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -105,9 +97,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 160 power against an enemy 3% above level cap", async () => { game.override.enemyLevel(103); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -122,9 +112,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 180 power against an enemy 4% above level cap", async () => { game.override.enemyLevel(104); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -139,9 +127,7 @@ describe("Moves - Dynamax Cannon", () => { it("should return 200 power against an enemy 5% above level cap", async () => { game.override.enemyLevel(105); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -156,12 +142,10 @@ describe("Moves - Dynamax Cannon", () => { it("should return 200 power against an enemy way above level cap", async () => { game.override.enemyLevel(999); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); diff --git a/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts index 31c8ee715c6..dc55392f8bf 100644 --- a/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -10,8 +10,14 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; -function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, - expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: PokemonType): void { +function testMoveEffectiveness( + game: GameManager, + move: Moves, + targetSpecies: Species, + expected: number, + targetAbility: Abilities = Abilities.BALL_FETCH, + teraType?: PokemonType, +): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); game.override.enemyAbility(targetAbility); @@ -46,65 +52,49 @@ describe("Moves - Type Effectiveness", () => { game.phaseInterceptor.restoreOg(); }); - it("Normal-type attacks are neutrally effective against Normal-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1) - ); + it("Normal-type attacks are neutrally effective against Normal-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1)); - it("Normal-type attacks are not very effective against Steel-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5) - ); + it("Normal-type attacks are not very effective against Steel-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5)); - it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25) - ); + it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25)); - it("Normal-type attacks have no effect on Ghost-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0) - ); + it("Normal-type attacks have no effect on Ghost-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0)); - it("Normal-type status moves are not affected by type matchups", - () => testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1) - ); + it("Normal-type status moves are not affected by type matchups", () => + testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1)); - it("Electric-type attacks are super-effective against Water-type Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2) - ); + it("Electric-type attacks are super-effective against Water-type Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2)); - it("Ghost-type attacks have no effect on Normal-type Pokemon", - () => testMoveEffectiveness(game, Moves.SHADOW_BALL, Species.URSALUNA, 0) - ); + it("Ghost-type attacks have no effect on Normal-type Pokemon", () => + testMoveEffectiveness(game, Moves.SHADOW_BALL, Species.URSALUNA, 0)); - it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4) - ); + it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4)); - it("Electric-type attacks are negated by Volt Absorb", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) - ); + it("Electric-type attacks are negated by Volt Absorb", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB)); - it("Electric-type attacks are super-effective against Tera-Water Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, PokemonType.WATER) - ); + it("Electric-type attacks are super-effective against Tera-Water Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, PokemonType.WATER)); - it("Powder moves have no effect on Grass-type Pokemon", - () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0) - ); + it("Powder moves have no effect on Grass-type Pokemon", () => + testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0)); - it("Powder moves have no effect on Tera-Grass Pokemon", - () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.GRASS) - ); + it("Powder moves have no effect on Tera-Grass Pokemon", () => + testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.GRASS)); - it("Prankster-boosted status moves have no effect on Dark-type Pokemon", - () => { - game.override.ability(Abilities.PRANKSTER); - testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); - } - ); + it("Prankster-boosted status moves have no effect on Dark-type Pokemon", () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); + }); - it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", - () => { - game.override.ability(Abilities.PRANKSTER); - testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.DARK); - } - ); + it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.DARK); + }); }); diff --git a/test/moves/electrify.test.ts b/test/moves/electrify.test.ts index 7f6221f4036..69e7504b406 100644 --- a/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -34,7 +34,7 @@ describe("Moves - Electrify", () => { }); it("should convert attacks to Electric type", async () => { - await game.classicMode.startBattle([ Species.EXCADRILL ]); + await game.classicMode.startBattle([Species.EXCADRILL]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -42,7 +42,7 @@ describe("Moves - Electrify", () => { game.move.select(Moves.ELECTRIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); @@ -52,7 +52,7 @@ describe("Moves - Electrify", () => { it("should override type changes from abilities", async () => { game.override.enemyAbility(Abilities.PIXILATE); - await game.classicMode.startBattle([ Species.EXCADRILL ]); + await game.classicMode.startBattle([Species.EXCADRILL]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getPlayerPokemon()!; @@ -60,7 +60,7 @@ describe("Moves - Electrify", () => { game.move.select(Moves.ELECTRIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); diff --git a/test/moves/electro_shot.test.ts b/test/moves/electro_shot.test.ts index 7cc7e793f4a..05ab9c24a7c 100644 --- a/test/moves/electro_shot.test.ts +++ b/test/moves/electro_shot.test.ts @@ -36,7 +36,7 @@ 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([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,11 +62,11 @@ describe("Moves - Electro Shot", () => { it.each([ { weatherType: WeatherType.RAIN, name: "Rain" }, - { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" }, ])("should fully resolve in one turn if $name is active", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -87,11 +87,9 @@ describe("Moves - Electro Shot", () => { }); it("should only increase Sp. Atk once with Multi-Lens", async () => { - game.override - .weather(WeatherType.RAIN) - .startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + game.override.weather(WeatherType.RAIN).startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/encore.test.ts b/test/moves/encore.test.ts index 4cf466a7f2a..43b9eb6a77f 100644 --- a/test/moves/encore.test.ts +++ b/test/moves/encore.test.ts @@ -25,19 +25,19 @@ describe("Moves - Encore", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.ENCORE ]) + .moveset([Moves.SPLASH, Moves.ENCORE]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.TACKLE ]) + .enemyMoveset([Moves.SPLASH, Moves.TACKLE]) .startingLevel(100) .enemyLevel(100); }); it("should prevent the target from using any move except the last used move", async () => { - await game.classicMode.startBattle([ Species.SNORLAX ]); + await game.classicMode.startBattle([Species.SNORLAX]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -61,26 +61,24 @@ describe("Moves - Encore", () => { { moveId: Moves.MIMIC, name: "Mimic", delay: true }, { moveId: Moves.SKETCH, name: "Sketch", delay: true }, { moveId: Moves.ENCORE, name: "Encore", delay: false }, - { moveId: Moves.STRUGGLE, name: "Struggle", delay: false } + { moveId: Moves.STRUGGLE, name: "Struggle", delay: false }, ])("$name", async ({ moveId, delay }) => { game.override.enemyMoveset(moveId); - await game.classicMode.startBattle([ Species.SNORLAX ]); + await game.classicMode.startBattle([Species.SNORLAX]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; if (delay) { game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); } game.move.select(Moves.ENCORE); - const turnOrder = delay - ? [ BattlerIndex.PLAYER, BattlerIndex.ENEMY ] - : [ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]; + const turnOrder = delay ? [BattlerIndex.PLAYER, BattlerIndex.ENEMY] : [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; await game.setTurnOrder(turnOrder); await game.phaseInterceptor.to("BerryPhase", false); @@ -90,9 +88,9 @@ describe("Moves - Encore", () => { }); it("Pokemon under both Encore and Torment should alternate between Struggle and restricted move", async () => { - const turnOrder = [ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]; - game.override.moveset([ Moves.ENCORE, Moves.TORMENT, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.FEEBAS ]); + const turnOrder = [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; + game.override.moveset([Moves.ENCORE, Moves.TORMENT, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemyPokemon = game.scene.getEnemyPokemon(); game.move.select(Moves.ENCORE); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts index 8514470d59c..8151128479d 100644 --- a/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -22,7 +22,7 @@ describe("Moves - Endure", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC ]) + .moveset([Moves.THUNDER, Moves.BULLET_SEED, Moves.TOXIC]) .ability(Abilities.SKILL_LINK) .startingLevel(100) .battleType("single") @@ -33,7 +33,7 @@ describe("Moves - Endure", () => { }); it("should let the pokemon survive with 1 HP", async () => { - await game.classicMode.startBattle([ Species.ARCEUS ]); + await game.classicMode.startBattle([Species.ARCEUS]); game.move.select(Moves.THUNDER); await game.phaseInterceptor.to("BerryPhase"); @@ -42,7 +42,7 @@ describe("Moves - Endure", () => { }); it("should let the pokemon survive with 1 HP when hit with a multihit move", async () => { - await game.classicMode.startBattle([ Species.ARCEUS ]); + await game.classicMode.startBattle([Species.ARCEUS]); game.move.select(Moves.BULLET_SEED); await game.phaseInterceptor.to("BerryPhase"); @@ -52,7 +52,7 @@ describe("Moves - Endure", () => { it("shouldn't prevent fainting from indirect damage", async () => { game.override.enemyLevel(100); - await game.classicMode.startBattle([ Species.ARCEUS ]); + await game.classicMode.startBattle([Species.ARCEUS]); const enemy = game.scene.getEnemyPokemon()!; enemy.hp = 2; diff --git a/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts index 608c6ef3676..b2a0baf3e27 100644 --- a/test/moves/entrainment.test.ts +++ b/test/moves/entrainment.test.ts @@ -23,7 +23,7 @@ describe("Moves - Entrainment", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.ENTRAINMENT ]) + .moveset([Moves.SPLASH, Moves.ENTRAINMENT]) .ability(Abilities.ADAPTABILITY) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Moves - Entrainment", () => { }); it("gives its ability to the target", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.ENTRAINMENT); await game.phaseInterceptor.to("BerryPhase"); @@ -43,7 +43,7 @@ describe("Moves - Entrainment", () => { it("should activate post-summon abilities", async () => { game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.ENTRAINMENT); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/fairy_lock.test.ts b/test/moves/fairy_lock.test.ts index 627eac401cc..a47143add4f 100644 --- a/test/moves/fairy_lock.test.ts +++ b/test/moves/fairy_lock.test.ts @@ -24,17 +24,17 @@ describe("Moves - Fairy Lock", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.FAIRY_LOCK, Moves.SPLASH ]) + .moveset([Moves.FAIRY_LOCK, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("double") .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.U_TURN ]); + .enemyMoveset([Moves.SPLASH, Moves.U_TURN]); }); it("Applies Fairy Lock tag for two turns", async () => { - await game.classicMode.startBattle([ Species.KLEFKI, Species.TYRUNT ]); + await game.classicMode.startBattle([Species.KLEFKI, Species.TYRUNT]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); @@ -66,7 +66,7 @@ describe("Moves - Fairy Lock", () => { }); it("Ghost types can escape Fairy Lock", async () => { - await game.classicMode.startBattle([ Species.DUSKNOIR, Species.GENGAR, Species.TYRUNT ]); + await game.classicMode.startBattle([Species.DUSKNOIR, Species.GENGAR, Species.TYRUNT]); game.move.select(Moves.FAIRY_LOCK); game.move.select(Moves.SPLASH, 1); @@ -93,8 +93,8 @@ describe("Moves - Fairy Lock", () => { }); it("Phasing moves will still switch out", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.WHIRLWIND ]); - await game.classicMode.startBattle([ Species.KLEFKI, Species.TYRUNT, Species.ZYGARDE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]); + await game.classicMode.startBattle([Species.KLEFKI, Species.TYRUNT, Species.ZYGARDE]); game.move.select(Moves.FAIRY_LOCK); game.move.select(Moves.SPLASH, 1); @@ -120,8 +120,8 @@ describe("Moves - Fairy Lock", () => { }); it("If a Pokemon faints and is replaced the replacement is also trapped", async () => { - game.override.moveset([ Moves.FAIRY_LOCK, Moves.SPLASH, Moves.MEMENTO ]); - await game.classicMode.startBattle([ Species.KLEFKI, Species.GUZZLORD, Species.TYRUNT, Species.ZYGARDE ]); + game.override.moveset([Moves.FAIRY_LOCK, Moves.SPLASH, Moves.MEMENTO]); + await game.classicMode.startBattle([Species.KLEFKI, Species.GUZZLORD, Species.TYRUNT, Species.ZYGARDE]); game.move.select(Moves.FAIRY_LOCK); game.move.select(Moves.MEMENTO, 1); diff --git a/test/moves/fake_out.test.ts b/test/moves/fake_out.test.ts index 21a129b6410..929c760ee5b 100644 --- a/test/moves/fake_out.test.ts +++ b/test/moves/fake_out.test.ts @@ -23,15 +23,15 @@ describe("Moves - Fake Out", () => { game.override .battleType("single") .enemySpecies(Species.CORVIKNIGHT) - .moveset([ Moves.FAKE_OUT, Moves.SPLASH ]) + .moveset([Moves.FAKE_OUT, Moves.SPLASH]) .enemyMoveset(Moves.SPLASH) .enemyLevel(10) .startingLevel(10) // prevent LevelUpPhase from happening .disableCrits(); }); - it("can only be used on the first turn a pokemon is sent out in a battle", async() => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + it("can only be used on the first turn a pokemon is sent out in a battle", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; @@ -48,8 +48,8 @@ describe("Moves - Fake Out", () => { }, 20000); // This is a PokeRogue buff to Fake Out - it("can be used at the start of every wave even if the pokemon wasn't recalled", async() => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + it("can be used at the start of every wave even if the pokemon wasn't recalled", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; enemy.damageAndUpdate(enemy.getMaxHp() - 1); @@ -63,9 +63,9 @@ describe("Moves - Fake Out", () => { expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); }, 20000); - it("can be used again if recalled and sent back out", async() => { + it("can be used again if recalled and sent back out", async () => { game.override.startingWave(4); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyPokemon()!; diff --git a/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts index c7cd616a95e..2ffa44c5a3a 100644 --- a/test/moves/fell_stinger.test.ts +++ b/test/moves/fell_stinger.test.ts @@ -9,7 +9,6 @@ import { StatusEffect } from "#app/enums/status-effect"; import { WeatherType } from "#app/enums/weather-type"; import { allMoves } from "#app/data/moves/move"; - describe("Moves - Fell Stinger", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,13 +26,9 @@ describe("Moves - Fell Stinger", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") - .moveset([ - Moves.FELL_STINGER, - Moves.SALT_CURE, - Moves.BIND, - Moves.LEECH_SEED - ]) + game.override + .battleType("single") + .moveset([Moves.FELL_STINGER, Moves.SALT_CURE, Moves.BIND, Moves.LEECH_SEED]) .startingLevel(50) .disableCrits() .enemyAbility(Abilities.STURDY) @@ -43,9 +38,9 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if opponent gets KO'd by recoil", async () => { - game.override.enemyMoveset([ Moves.DOUBLE_EDGE ]); + game.override.enemyMoveset([Moves.DOUBLE_EDGE]); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.FELL_STINGER); @@ -55,11 +50,9 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy is KO'd by status effect", async () => { - game.override - .enemyMoveset(Moves.SPLASH) - .enemyStatusEffect(StatusEffect.BURN); + game.override.enemyMoveset(Moves.SPLASH).enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.FELL_STINGER); @@ -71,7 +64,7 @@ describe("Moves - Fell Stinger", () => { it("should not grant stat boost if enemy is KO'd by damaging weather", async () => { game.override.weather(WeatherType.HAIL); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.FELL_STINGER); @@ -82,12 +75,9 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy is KO'd by Dry Skin + Harsh Sunlight", async () => { - game.override - .enemyPassiveAbility(Abilities.STURDY) - .enemyAbility(Abilities.DRY_SKIN) - .weather(WeatherType.HARSH_SUN); + game.override.enemyPassiveAbility(Abilities.STURDY).enemyAbility(Abilities.DRY_SKIN).weather(WeatherType.HARSH_SUN); - await game.challengeMode.startBattle([ Species.LEAVANNY ]); + await game.challengeMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.FELL_STINGER); @@ -98,11 +88,9 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy is saved by Reviver Seed", async () => { - game.override - .enemyAbility(Abilities.BALL_FETCH) - .enemyHeldItems([{ name: "REVIVER_SEED" }]); + game.override.enemyAbility(Abilities.BALL_FETCH).enemyHeldItems([{ name: "REVIVER_SEED" }]); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.FELL_STINGER); @@ -111,14 +99,13 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy is KO'd by Salt Cure", async () => { - game.override.battleType("double") - .startingLevel(5); + game.override.battleType("double").startingLevel(5); const saltCure = allMoves[Moves.SALT_CURE]; const fellStinger = allMoves[Moves.FELL_STINGER]; vi.spyOn(saltCure, "accuracy", "get").mockReturnValue(100); vi.spyOn(fellStinger, "power", "get").mockReturnValue(50000); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; const leftEnemy = game.scene.getEnemyField()[0]!; @@ -137,12 +124,11 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy dies to Bind or a similar effect", async () => { - game.override.battleType("double") - .startingLevel(5); + game.override.battleType("double").startingLevel(5); vi.spyOn(allMoves[Moves.BIND], "accuracy", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; const leftEnemy = game.scene.getEnemyField()[0]!; @@ -161,12 +147,11 @@ describe("Moves - Fell Stinger", () => { }); it("should not grant stat boost if enemy dies to Leech Seed", async () => { - game.override.battleType("double") - .startingLevel(5); + game.override.battleType("double").startingLevel(5); vi.spyOn(allMoves[Moves.LEECH_SEED], "accuracy", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon()!; const leftEnemy = game.scene.getEnemyField()[0]!; @@ -187,7 +172,7 @@ describe("Moves - Fell Stinger", () => { it("should grant stat boost if enemy dies directly to hit", async () => { game.override.enemyAbility(Abilities.KLUTZ); - await game.classicMode.startBattle([ Species.LEAVANNY ]); + await game.classicMode.startBattle([Species.LEAVANNY]); const leadPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.FELL_STINGER); diff --git a/test/moves/fillet_away.test.ts b/test/moves/fillet_away.test.ts index 076a3011afa..cc462b3746a 100644 --- a/test/moves/fillet_away.test.ts +++ b/test/moves/fillet_away.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - /** HP Cost of Move */ const RATIO = 2; /** Amount of extra HP lost */ @@ -33,85 +32,77 @@ describe("Moves - FILLET AWAY", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.FILLET_AWAY ]); + game.override.moveset([Moves.FILLET_AWAY]); game.override.enemyMoveset(Moves.SPLASH); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) - 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.startBattle([ Species.MAGIKARP ]); + 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.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }); - test("still takes effect if one or more of the involved stat stages are not at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("still takes effect if one or more of the involved stat stages are not at max", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - //Here - Stat.SPD -> 0 and Stat.SPATK -> 3 - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.SPATK, 3); + //Here - Stat.SPD -> 0 and Stat.SPATK -> 3 + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.SPATK, 3); - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }); - test("fails if all stat stages involved are at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("fails if all stat stages involved are at max", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPD, 6); + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPD, 6); - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); + }); - test("fails if the user's health is less than 1/2", - async() => { - await game.startBattle([ Species.MAGIKARP ]); + test("fails if the user's health is less than 1/2", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); + }); }); diff --git a/test/moves/fissure.test.ts b/test/moves/fissure.test.ts index 07f2a3bfacb..63de58eb2e7 100644 --- a/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -32,7 +32,7 @@ describe("Moves - Fissure", () => { game.override.disableCrits(); game.override.starterSpecies(Species.SNORLAX); - game.override.moveset([ Moves.FISSURE ]); + game.override.moveset([Moves.FISSURE]); game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); diff --git a/test/moves/flame_burst.test.ts b/test/moves/flame_burst.test.ts index 7bcf06d92ae..b6a425e7bb5 100644 --- a/test/moves/flame_burst.test.ts +++ b/test/moves/flame_burst.test.ts @@ -20,7 +20,7 @@ describe("Moves - Flame Burst", () => { * @returns Effect damage of Flame Burst */ const getEffectDamage = (pokemon: Pokemon): number => { - return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 16)); + return Math.max(1, Math.floor((pokemon.getMaxHp() * 1) / 16)); }; beforeAll(() => { @@ -36,18 +36,18 @@ describe("Moves - Flame Burst", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.FLAME_BURST, Moves.SPLASH ]); + game.override.moveset([Moves.FLAME_BURST, Moves.SPLASH]); game.override.disableCrits(); game.override.ability(Abilities.UNNERVE); game.override.startingWave(4); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); }); it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); game.move.select(Moves.SPLASH, 1); @@ -60,8 +60,8 @@ describe("Moves - Flame Burst", () => { it("does not inflict damage to the target's ally if the target was not affected by Flame Burst", async () => { game.override.enemyAbility(Abilities.FLASH_FIRE); - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); game.move.select(Moves.SPLASH, 1); @@ -72,8 +72,8 @@ describe("Moves - Flame Burst", () => { }); it("does not interact with the target ally's abilities", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.FLASH_FIRE]); @@ -86,8 +86,8 @@ describe("Moves - Flame Burst", () => { }); it("effect damage is prevented by Magic Guard", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.MAGIC_GUARD]); @@ -99,7 +99,11 @@ describe("Moves - Flame Burst", () => { expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp()); }); - it("is not affected by protection moves and Endure", async () => { - // TODO: update this test when it's possible to select move for each enemy - }, { skip: true }); + it( + "is not affected by protection moves and Endure", + async () => { + // TODO: update this test when it's possible to select move for each enemy + }, + { skip: true }, + ); }); diff --git a/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts index f51cb8a085e..b66847651c1 100644 --- a/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -29,14 +29,14 @@ describe("Moves - Flower Shield", () => { game.override.ability(Abilities.NONE); game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); - game.override.moveset([ Moves.FLOWER_SHIELD, Moves.SPLASH ]); + game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); }); it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - single battle", async () => { game.override.enemySpecies(Species.CHERRIM); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const cherrim = game.scene.getEnemyPokemon()!; const magikarp = game.scene.getPlayerPokemon()!; @@ -53,7 +53,7 @@ describe("Moves - Flower Shield", () => { it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - double battle", async () => { game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS).battleType("double"); - await game.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); const grassPokemons = field.filter(p => p.getTypes().includes(PokemonType.GRASS)); @@ -72,13 +72,13 @@ describe("Moves - Flower Shield", () => { /** * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} - */ + */ it("does not raise DEF stat stage for a Pokemon in semi-vulnerable state", async () => { game.override.enemySpecies(Species.PARAS); - game.override.enemyMoveset([ Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG ]); + game.override.enemyMoveset([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); game.override.enemyLevel(50); - await game.startBattle([ Species.CHERRIM ]); + await game.startBattle([Species.CHERRIM]); const paras = game.scene.getEnemyPokemon()!; const cherrim = game.scene.getPlayerPokemon()!; @@ -97,7 +97,7 @@ describe("Moves - Flower Shield", () => { it("does nothing if there are no Grass-type Pokemon on the field", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; const ally = game.scene.getPlayerPokemon()!; diff --git a/test/moves/fly.test.ts b/test/moves/fly.test.ts index 2471372f97c..0bd7d22b2a7 100644 --- a/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -39,7 +39,7 @@ describe("Moves - Fly", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -65,7 +65,7 @@ describe("Moves - Fly", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -78,11 +78,9 @@ describe("Moves - Fly", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -97,9 +95,9 @@ describe("Moves - Fly", () => { }); it("should be cancelled when another Pokemon uses Gravity", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.GRAVITY ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.GRAVITY]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -110,7 +108,7 @@ describe("Moves - Fly", () => { await game.toNextTurn(); await game.forceEnemyMove(Moves.GRAVITY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); diff --git a/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts index 1f14a19fbd7..2dc5f20f2bf 100644 --- a/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -11,7 +11,6 @@ import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Focus Punch", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,7 +30,7 @@ describe("Moves - Focus Punch", () => { game.override .battleType("single") .ability(Abilities.UNNERVE) - .moveset([ Moves.FOCUS_PUNCH ]) + .moveset([Moves.FOCUS_PUNCH]) .enemySpecies(Species.GROUDON) .enemyAbility(Abilities.INSOMNIA) .enemyMoveset(Moves.SPLASH) @@ -39,101 +38,89 @@ describe("Moves - Focus Punch", () => { .enemyLevel(100); }); - it( - "should deal damage at the end of turn if uninterrupted", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should deal damage at the end of turn if uninterrupted", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyStartingHp = enemyPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.FOCUS_PUNCH); + game.move.select(Moves.FOCUS_PUNCH); - await game.phaseInterceptor.to(MessagePhase); + await game.phaseInterceptor.to(MessagePhase); - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(0); + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.totalDamageDealt).toBe(enemyStartingHp - enemyPokemon.hp); - } - ); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.totalDamageDealt).toBe(enemyStartingHp - enemyPokemon.hp); + }); - it( - "should fail if the user is hit", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + it("should fail if the user is hit", async () => { + game.override.enemyMoveset([Moves.TACKLE]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const enemyStartingHp = enemyPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; - game.move.select(Moves.FOCUS_PUNCH); + game.move.select(Moves.FOCUS_PUNCH); - await game.phaseInterceptor.to(MessagePhase); + await game.phaseInterceptor.to(MessagePhase); - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(0); + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.totalDamageDealt).toBe(0); - } - ); + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.totalDamageDealt).toBe(0); + }); - it( - "should be cancelled if the user falls asleep mid-turn", - async () => { - game.override.enemyMoveset([ Moves.SPORE ]); + it("should be cancelled if the user falls asleep mid-turn", async () => { + game.override.enemyMoveset([Moves.SPORE]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.FOCUS_PUNCH); + game.move.select(Moves.FOCUS_PUNCH); - await game.phaseInterceptor.to(MessagePhase); // Header message + await game.phaseInterceptor.to(MessagePhase); // Header message - expect(leadPokemon.getMoveHistory().length).toBe(0); + expect(leadPokemon.getMoveHistory().length).toBe(0); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should not queue its pre-move message before an enemy switches", - async () => { - /** Guarantee a Trainer battle with multiple enemy Pokemon */ - game.override.startingWave(25); + it("should not queue its pre-move message before an enemy switches", async () => { + /** Guarantee a Trainer battle with multiple enemy Pokemon */ + game.override.startingWave(25); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - game.forceEnemyToSwitch(); - game.move.select(Moves.FOCUS_PUNCH); + game.forceEnemyToSwitch(); + game.move.select(Moves.FOCUS_PUNCH); - await game.phaseInterceptor.to(TurnStartPhase); + await game.phaseInterceptor.to(TurnStartPhase); - expect(game.scene.getCurrentPhase() instanceof SwitchSummonPhase).toBeTruthy(); - expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); - } - ); + expect(game.scene.getCurrentPhase() instanceof SwitchSummonPhase).toBeTruthy(); + expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); + }); it("should replace the 'but it failed' text when the user gets hit", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + game.override.enemyMoveset([Moves.TACKLE]); + await game.classicMode.startBattle([Species.CHARIZARD]); game.move.select(Moves.FOCUS_PUNCH); await game.phaseInterceptor.to("MoveEndPhase", true); diff --git a/test/moves/follow_me.test.ts b/test/moves/follow_me.test.ts index bef9b9ddb01..eeb11b36f24 100644 --- a/test/moves/follow_me.test.ts +++ b/test/moves/follow_me.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Moves - Follow Me", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,99 +30,87 @@ describe("Moves - Follow Me", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.FOLLOW_ME, Moves.SPLASH ]); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.TACKLE, Moves.FOLLOW_ME, Moves.SPLASH]); }); - test( - "move should redirect enemy attacks to the user", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + test("move should redirect enemy attacks to the user", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY); - // Force both enemies to target the player Pokemon that did not use Follow Me - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + // Force both enemies to target the player Pokemon that did not use Follow Me + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(playerPokemon[0].hp).toBeLessThan(playerPokemon[0].getMaxHp()); - expect(playerPokemon[1].hp).toBe(playerPokemon[1].getMaxHp()); - } - ); + expect(playerPokemon[0].hp).toBeLessThan(playerPokemon[0].getMaxHp()); + expect(playerPokemon[1].hp).toBe(playerPokemon[1].getMaxHp()); + }); - test( - "move should redirect enemy attacks to the first ally that uses it", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + test("move should redirect enemy attacks to the first ally that uses it", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.FOLLOW_ME, 1); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.FOLLOW_ME, 1); - // Each player is targeted by an enemy - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + // Each player is targeted by an enemy + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(TurnEndPhase, false); - playerPokemon.sort((a, b) => a.getEffectiveStat(Stat.SPD) - b.getEffectiveStat(Stat.SPD)); + playerPokemon.sort((a, b) => a.getEffectiveStat(Stat.SPD) - b.getEffectiveStat(Stat.SPD)); - expect(playerPokemon[1].hp).toBeLessThan(playerPokemon[1].getMaxHp()); - expect(playerPokemon[0].hp).toBe(playerPokemon[0].getMaxHp()); - } - ); + expect(playerPokemon[1].hp).toBeLessThan(playerPokemon[1].getMaxHp()); + expect(playerPokemon[0].hp).toBe(playerPokemon[0].getMaxHp()); + }); - test( - "move effect should be bypassed by Stalwart", - async () => { - game.override.ability(Abilities.STALWART); - game.override.moveset([ Moves.QUICK_ATTACK ]); + test("move effect should be bypassed by Stalwart", async () => { + game.override.ability(Abilities.STALWART); + game.override.moveset([Moves.QUICK_ATTACK]); - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - // Target doesn't need to be specified if the move is self-targeted - await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.forceEnemyMove(Moves.SPLASH); + // Target doesn't need to be specified if the move is self-targeted + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(TurnEndPhase, false); - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); - test( - "move effect should be bypassed by Snipe Shot", - async () => { - game.override.moveset([ Moves.SNIPE_SHOT ]); + test("move effect should be bypassed by Snipe Shot", async () => { + game.override.moveset([Moves.SNIPE_SHOT]); - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(TurnEndPhase, false); - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); }); diff --git a/test/moves/foresight.test.ts b/test/moves/foresight.test.ts index 7dccd0fefca..d33a00bf136 100644 --- a/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -27,7 +27,7 @@ describe("Moves - Foresight", () => { .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) - .moveset([ Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH ]); + .moveset([Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH]); }); it("should allow Normal and Fighting moves to hit Ghost types", async () => { @@ -54,7 +54,7 @@ describe("Moves - Foresight", () => { }); it("should ignore target's evasiveness boosts", async () => { - game.override.enemyMoveset([ Moves.MINIMIZE ]); + game.override.enemyMoveset([Moves.MINIMIZE]); await game.startBattle(); const pokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts index f275db8d2bb..8850b92662d 100644 --- a/test/moves/forests_curse.test.ts +++ b/test/moves/forests_curse.test.ts @@ -23,7 +23,7 @@ describe("Moves - Forest's Curse", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT ]) + .moveset([Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Moves - Forest's Curse", () => { }); it("will replace the added type from Trick Or Treat", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemyPokemon = game.scene.getEnemyPokemon(); game.move.select(Moves.TRICK_OR_TREAT); diff --git a/test/moves/freeze_dry.test.ts b/test/moves/freeze_dry.test.ts index 62375393563..8cab56ddfd2 100644 --- a/test/moves/freeze_dry.test.ts +++ b/test/moves/freeze_dry.test.ts @@ -30,7 +30,7 @@ describe("Moves - Freeze-Dry", () => { .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.FREEZE_DRY, Moves.FORESTS_CURSE, Moves.SOAK ]); + .moveset([Moves.FREEZE_DRY, Moves.FORESTS_CURSE, Moves.SOAK]); }); it("should deal 2x damage to pure water types", async () => { @@ -40,7 +40,7 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); @@ -54,7 +54,7 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); @@ -68,7 +68,7 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1); @@ -82,14 +82,14 @@ describe("Moves - Freeze-Dry", () => { .enemySpecies(Species.SHEDINJA) .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.MAGIKARP) - .moveset([ Moves.SOAK, Moves.FREEZE_DRY ]); + .moveset([Moves.SOAK, Moves.FREEZE_DRY]); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.SOAK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); game.move.select(Moves.FREEZE_DRY); @@ -110,7 +110,7 @@ describe("Moves - Freeze-Dry", () => { await game.toNextTurn(); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(8); @@ -126,7 +126,7 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); @@ -142,15 +142,14 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.5); }); it("should deal 0.5x damage to water type Terapagos with Tera Shell", async () => { - game.override.enemySpecies(Species.TERAPAGOS) - .enemyAbility(Abilities.TERA_SHELL); + game.override.enemySpecies(Species.TERAPAGOS).enemyAbility(Abilities.TERA_SHELL); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -160,7 +159,7 @@ describe("Moves - Freeze-Dry", () => { await game.toNextTurn(); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.5); @@ -174,130 +173,114 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); }); it("should deal 0.25x damage to rock/steel type under Normalize", async () => { - game.override - .ability(Abilities.NORMALIZE) - .enemySpecies(Species.SHIELDON); + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.SHIELDON); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.25); }); it("should deal 0x damage to water/ghost type under Normalize", async () => { - game.override - .ability(Abilities.NORMALIZE) - .enemySpecies(Species.JELLICENT); + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.JELLICENT); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0); }); it("should deal 2x damage to water type under Electrify", async () => { - game.override.enemyMoveset([ Moves.ELECTRIFY ]); + game.override.enemyMoveset([Moves.ELECTRIFY]); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); }); it("should deal 4x damage to water/flying type under Electrify", async () => { - game.override - .enemyMoveset([ Moves.ELECTRIFY ]) - .enemySpecies(Species.GYARADOS); + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.GYARADOS); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); }); it("should deal 0x damage to water/ground type under Electrify", async () => { - game.override - .enemyMoveset([ Moves.ELECTRIFY ]) - .enemySpecies(Species.BARBOACH); + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.BARBOACH); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0); }); it("should deal 0.25x damage to Grass/Dragon type under Electrify", async () => { - game.override - .enemyMoveset([ Moves.ELECTRIFY ]) - .enemySpecies(Species.FLAPPLE); + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.FLAPPLE); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.25); }); it("should deal 2x damage to Water type during inverse battle", async () => { - game.override - .moveset([ Moves.FREEZE_DRY ]) - .enemySpecies(Species.MAGIKARP); + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.MAGIKARP); game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); - await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("should deal 2x damage to Water type during inverse battle under Normalize", async () => { - game.override - .moveset([ Moves.FREEZE_DRY ]) - .ability(Abilities.NORMALIZE) - .enemySpecies(Species.MAGIKARP); + game.override.moveset([Moves.FREEZE_DRY]).ability(Abilities.NORMALIZE).enemySpecies(Species.MAGIKARP); game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); await game.challengeMode.startBattle(); @@ -306,17 +289,14 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("should deal 2x damage to Water type during inverse battle under Electrify", async () => { - game.override - .moveset([ Moves.FREEZE_DRY ]) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset([ Moves.ELECTRIFY ]); + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.MAGIKARP).enemyMoveset([Moves.ELECTRIFY]); game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); await game.challengeMode.startBattle(); @@ -325,16 +305,14 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("should deal 1x damage to water/flying type during inverse battle under Electrify", async () => { - game.override - .enemyMoveset([ Moves.ELECTRIFY ]) - .enemySpecies(Species.GYARADOS); + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.GYARADOS); game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); @@ -344,7 +322,7 @@ describe("Moves - Freeze-Dry", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1); diff --git a/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts index fe7fee10ad1..c1ac4054e70 100644 --- a/test/moves/freezy_frost.test.ts +++ b/test/moves/freezy_frost.test.ts @@ -27,79 +27,73 @@ describe("Moves - Freezy Frost", () => { .battleType("single") .enemySpecies(Species.RATTATA) .enemyLevel(100) - .enemyMoveset([ Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL ]) + .enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL]) .enemyAbility(Abilities.BALL_FETCH) .startingLevel(100) - .moveset([ Moves.FREEZY_FROST, Moves.HOWL, Moves.SPLASH ]) + .moveset([Moves.FREEZY_FROST, Moves.HOWL, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100); }); - it( - "should clear stat changes of user and opponent", - async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); - const user = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + it("should clear stat changes of user and opponent", async () => { + await game.classicMode.startBattle([Species.SHUCKLE]); + const user = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; - game.move.select(Moves.HOWL); - await game.toNextTurn(); + game.move.select(Moves.HOWL); + await game.toNextTurn(); - expect(user.getStatStage(Stat.ATK)).toBe(1); - expect(enemy.getStatStage(Stat.ATK)).toBe(1); + expect(user.getStatStage(Stat.ATK)).toBe(1); + expect(enemy.getStatStage(Stat.ATK)).toBe(1); - game.move.select(Moves.FREEZY_FROST); - await game.toNextTurn(); + game.move.select(Moves.FREEZY_FROST); + await game.toNextTurn(); - expect(user.getStatStage(Stat.ATK)).toBe(0); - expect(enemy.getStatStage(Stat.ATK)).toBe(0); - }); + expect(user.getStatStage(Stat.ATK)).toBe(0); + expect(enemy.getStatStage(Stat.ATK)).toBe(0); + }); - it( - "should clear all stat changes even when enemy uses the move", - async () => { - game.override.enemyMoveset([ Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST ]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it. - const user = game.scene.getPlayerPokemon()!; + it("should clear all stat changes even when enemy uses the move", async () => { + game.override.enemyMoveset([Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST]); + await game.classicMode.startBattle([Species.SHUCKLE]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it. + const user = game.scene.getPlayerPokemon()!; - game.move.select(Moves.HOWL); - await game.toNextTurn(); + game.move.select(Moves.HOWL); + await game.toNextTurn(); - const userAtkBefore = user.getStatStage(Stat.ATK); - expect(userAtkBefore).toBe(1); + const userAtkBefore = user.getStatStage(Stat.ATK); + expect(userAtkBefore).toBe(1); - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(user.getStatStage(Stat.ATK)).toBe(0); - }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(user.getStatStage(Stat.ATK)).toBe(0); + }); - it( - "should clear all stat changes in double battle", - async () => { - game.override.battleType("double"); - await game.classicMode.startBattle([ Species.SHUCKLE, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + it("should clear all stat changes in double battle", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.SHUCKLE, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); - game.move.select(Moves.HOWL, 0); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); + game.move.select(Moves.HOWL, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); - expect(leftPlayer.getStatStage(Stat.ATK)).toBe(1); - expect(rightPlayer.getStatStage(Stat.ATK)).toBe(1); - expect(leftOpp.getStatStage(Stat.ATK)).toBe(2); // Both enemies use Howl - expect(rightOpp.getStatStage(Stat.ATK)).toBe(2); + expect(leftPlayer.getStatStage(Stat.ATK)).toBe(1); + expect(rightPlayer.getStatStage(Stat.ATK)).toBe(1); + expect(leftOpp.getStatStage(Stat.ATK)).toBe(2); // Both enemies use Howl + expect(rightOpp.getStatStage(Stat.ATK)).toBe(2); - game.move.select(Moves.FREEZY_FROST, 0, leftOpp.getBattlerIndex()); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); + game.move.select(Moves.FREEZY_FROST, 0, leftOpp.getBattlerIndex()); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); - expect(leftPlayer.getStatStage(Stat.ATK)).toBe(0); - expect(rightPlayer.getStatStage(Stat.ATK)).toBe(0); - expect(leftOpp.getStatStage(Stat.ATK)).toBe(0); - expect(rightOpp.getStatStage(Stat.ATK)).toBe(0); - }); + expect(leftPlayer.getStatStage(Stat.ATK)).toBe(0); + expect(rightPlayer.getStatStage(Stat.ATK)).toBe(0); + expect(leftOpp.getStatStage(Stat.ATK)).toBe(0); + expect(rightOpp.getStatStage(Stat.ATK)).toBe(0); + }); }); diff --git a/test/moves/fusion_bolt.test.ts b/test/moves/fusion_bolt.test.ts index 9bb53ef8fb0..fc47a0f04be 100644 --- a/test/moves/fusion_bolt.test.ts +++ b/test/moves/fusion_bolt.test.ts @@ -23,12 +23,12 @@ describe("Moves - Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionBolt ]); + game.override.moveset([fusionBolt]); game.override.startingLevel(1); game.override.enemySpecies(Species.RESHIRAM); game.override.enemyAbility(Abilities.ROUGH_SKIN); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.battleType("single"); game.override.startingWave(97); @@ -36,9 +36,7 @@ describe("Moves - Fusion Bolt", () => { }); it("should not make contact", async () => { - await game.startBattle([ - Species.ZEKROM, - ]); + await game.startBattle([Species.ZEKROM]); const partyMember = game.scene.getPlayerPokemon()!; const initialHp = partyMember.hp; diff --git a/test/moves/fusion_flare.test.ts b/test/moves/fusion_flare.test.ts index 02f5b19d97f..17653cf58bc 100644 --- a/test/moves/fusion_flare.test.ts +++ b/test/moves/fusion_flare.test.ts @@ -24,11 +24,11 @@ describe("Moves - Fusion Flare", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionFlare ]); + game.override.moveset([fusionFlare]); game.override.startingLevel(1); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); game.override.battleType("single"); game.override.startingWave(97); @@ -36,9 +36,7 @@ describe("Moves - Fusion Flare", () => { }); it("should thaw freeze status condition", async () => { - await game.startBattle([ - Species.RESHIRAM, - ]); + await game.startBattle([Species.RESHIRAM]); const partyMember = game.scene.getPlayerPokemon()!; diff --git a/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts index aa2b0cb1bc3..9a379cb4588 100644 --- a/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -30,11 +30,11 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionFlare.id, fusionBolt.id ]); + game.override.moveset([fusionFlare.id, fusionBolt.id]); game.override.startingLevel(1); game.override.enemySpecies(Species.RESHIRAM); - game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); game.override.battleType("double"); game.override.startingWave(97); @@ -45,16 +45,13 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }); it("FUSION_FLARE should double power of subsequent FUSION_BOLT", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); @@ -68,16 +65,13 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_BOLT should double power of subsequent FUSION_FLARE", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionBolt.id, 0, BattlerIndex.ENEMY); game.move.select(fusionFlare.id, 1, BattlerIndex.ENEMY); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); @@ -91,16 +85,13 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE should double power of subsequent FUSION_BOLT if a move failed in between", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.PLAYER); game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); // Force first enemy to act (and fail) in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); @@ -119,17 +110,14 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE should not double power of subsequent FUSION_BOLT if a move succeeded in between", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); @@ -147,16 +135,13 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE should double power of subsequent FUSION_BOLT if moves are aimed at allies", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.RESHIRAM - ]); + await game.startBattle([Species.ZEKROM, Species.RESHIRAM]); game.move.select(fusionBolt.id, 0, BattlerIndex.PLAYER_2); game.move.select(fusionFlare.id, 1, BattlerIndex.PLAYER); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); @@ -170,11 +155,8 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async () => { - game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); @@ -185,19 +167,17 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { // Mock stats by replacing entries in copy with desired values for specific stats const stats = { - enemy: [ - [ ...enemyParty[0].stats ], - [ ...enemyParty[1].stats ], - ], - player: [ - [ ...party[0].stats ], - [ ...party[1].stats ], - ] + enemy: [[...enemyParty[0].stats], [...enemyParty[1].stats]], + player: [[...party[0].stats], [...party[1].stats]], }; // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def - vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); - vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue( + stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue( + stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); @@ -205,7 +185,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); @@ -229,11 +209,8 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }, 20000); it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves if moves are aimed at allies", async () => { - game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); @@ -244,19 +221,17 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { // Mock stats by replacing entries in copy with desired values for specific stats const stats = { - enemy: [ - [ ...enemyParty[0].stats ], - [ ...enemyParty[1].stats ], - ], - player: [ - [ ...party[0].stats ], - [ ...party[1].stats ], - ] + enemy: [[...enemyParty[0].stats], [...enemyParty[1].stats]], + player: [[...party[0].stats], [...party[1].stats]], }; // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def - vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); - vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue( + stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue( + stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); @@ -264,7 +239,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); diff --git a/test/moves/future_sight.test.ts b/test/moves/future_sight.test.ts index e0a9a1efd04..40a940447e4 100644 --- a/test/moves/future_sight.test.ts +++ b/test/moves/future_sight.test.ts @@ -23,7 +23,7 @@ describe("Moves - Future Sight", () => { game = new GameManager(phaserGame); game.override .startingLevel(50) - .moveset([ Moves.FUTURE_SIGHT, Moves.SPLASH ]) + .moveset([Moves.FUTURE_SIGHT, Moves.SPLASH]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.STURDY) @@ -31,7 +31,7 @@ describe("Moves - Future Sight", () => { }); it("hits 2 turns after use, ignores user switch out", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); game.move.select(Moves.FUTURE_SIGHT); await game.toNextTurn(); diff --git a/test/moves/gastro_acid.test.ts b/test/moves/gastro_acid.test.ts index 2e4f7938306..c9f2428845e 100644 --- a/test/moves/gastro_acid.test.ts +++ b/test/moves/gastro_acid.test.ts @@ -6,7 +6,6 @@ import { MoveResult } from "#app/field/pokemon"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Gastro Acid", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,7 +26,7 @@ describe("Moves - Gastro Acid", () => { game.override.startingLevel(1); game.override.enemyLevel(100); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER ]); + game.override.moveset([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.WATER_ABSORB); @@ -68,7 +67,7 @@ describe("Moves - Gastro Acid", () => { game.move.select(Moves.CORE_ENFORCER); // Force player to be slower to enable Core Enforcer to proc its suppression effect - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts index 914e4f7188a..34281c96c60 100644 --- a/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -35,31 +35,31 @@ describe("Moves - Geomancy", () => { }); it("should boost the user's stats on the second turn of use", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; - const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(Moves.GEOMANCY); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(0)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(0)); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.OTHER); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(2)); expect(player.getMoveHistory()).toHaveLength(2); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); - const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + const playerGeomancy = player.getMoveset().find(mv => mv && mv.moveId === Moves.GEOMANCY); expect(playerGeomancy?.ppUsed).toBe(1); }); it("should execute over 2 turns between waves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; - const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(Moves.GEOMANCY); @@ -69,11 +69,11 @@ describe("Moves - Geomancy", () => { await game.toNextWave(); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(2)); expect(player.getMoveHistory()).toHaveLength(2); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); - const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + const playerGeomancy = player.getMoveset().find(mv => mv && mv.moveId === Moves.GEOMANCY); expect(playerGeomancy?.ppUsed).toBe(1); }); }); diff --git a/test/moves/gigaton_hammer.test.ts b/test/moves/gigaton_hammer.test.ts index 37735b29a3b..a6f7438a0a2 100644 --- a/test/moves/gigaton_hammer.test.ts +++ b/test/moves/gigaton_hammer.test.ts @@ -25,20 +25,20 @@ describe("Moves - Gigaton Hammer", () => { .battleType("single") .enemySpecies(Species.MAGIKARP) .starterSpecies(Species.FEEBAS) - .moveset([ Moves.GIGATON_HAMMER ]) + .moveset([Moves.GIGATON_HAMMER]) .startingLevel(10) .enemyLevel(100) .enemyMoveset(Moves.SPLASH) .disableCrits(); }); - it("can't be used two turns in a row", async() => { + it("can't be used two turns in a row", async () => { await game.classicMode.startBattle(); const enemy1 = game.scene.getEnemyPokemon()!; game.move.select(Moves.GIGATON_HAMMER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); @@ -54,14 +54,14 @@ describe("Moves - Gigaton Hammer", () => { expect(enemy2.hp).toBe(enemy2.getMaxHp()); }, 20000); - it("can be used again if recalled and sent back out", async() => { + it("can be used again if recalled and sent back out", async () => { game.override.startingWave(4); await game.classicMode.startBattle(); const enemy1 = game.scene.getEnemyPokemon()!; game.move.select(Moves.GIGATON_HAMMER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); diff --git a/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts index 278cea86c83..d3531b172e2 100644 --- a/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -6,7 +6,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Glaive Rush", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,10 +27,10 @@ describe("Moves - Glaive Rush", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.GLAIVE_RUSH ]) + .enemyMoveset([Moves.GLAIVE_RUSH]) .starterSpecies(Species.KLINK) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH ]); + .moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); it("takes double damage from attacks", async () => { @@ -46,8 +45,7 @@ describe("Moves - Glaive Rush", () => { await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.SHADOW_SNEAK); await game.phaseInterceptor.to("DamageAnimPhase"); - expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); - + expect(enemy.hp).toBeLessThanOrEqual(1001 - damageDealt * 3); }); it("always gets hit by attacks", async () => { @@ -60,13 +58,10 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.AVALANCHE); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.hp).toBeLessThan(1000); - }); it("interacts properly with multi-lens", async () => { - game.override - .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) - .enemyMoveset([ Moves.AVALANCHE ]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]).enemyMoveset([Moves.AVALANCHE]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -83,11 +78,10 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1000); - }); it("secondary effects only last until next move", async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -109,14 +103,11 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(damagedHp); - }); it("secondary effects are removed upon switching", async () => { - game.override - .enemyMoveset([ Moves.SHADOW_SNEAK ]) - .starterSpecies(0); - await game.classicMode.startBattle([ Species.KLINK, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]).starterSpecies(0); + await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -133,11 +124,10 @@ describe("Moves - Glaive Rush", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(player.getMaxHp()); - }); it("secondary effects don't activate if move fails", async () => { - game.override.moveset([ Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH ]); + game.override.moveset([Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -151,7 +141,7 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SHADOW_SNEAK); await game.phaseInterceptor.to("TurnEndPhase"); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); const damagedHP1 = 1000 - enemy.hp; enemy.hp = 1000; @@ -159,6 +149,6 @@ describe("Moves - Glaive Rush", () => { await game.phaseInterceptor.to("TurnEndPhase"); const damagedHP2 = 1000 - enemy.hp; - expect(damagedHP2).toBeGreaterThanOrEqual((damagedHP1 * 2) - 1); + expect(damagedHP2).toBeGreaterThanOrEqual(damagedHP1 * 2 - 1); }); }); diff --git a/test/moves/growth.test.ts b/test/moves/growth.test.ts index dfc41acd757..926593a4f72 100644 --- a/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -27,14 +27,12 @@ describe("Moves - Growth", () => { game.override.battleType("single"); game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.INSOMNIA); - game.override.moveset([ Moves.GROWTH ]); + game.override.moveset([Moves.GROWTH]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should raise SPATK stat stage by 1", async() => { - await game.startBattle([ - Species.MIGHTYENA - ]); + it("should raise SPATK stat stage by 1", async () => { + await game.startBattle([Species.MIGHTYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/grudge.test.ts b/test/moves/grudge.test.ts index 4b9683dd417..ebd062a76ee 100644 --- a/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -23,22 +23,22 @@ describe("Moves - Grudge", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.EMBER, Moves.SPLASH ]) + .moveset([Moves.EMBER, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() .enemySpecies(Species.SHEDINJA) .enemyAbility(Abilities.WONDER_GUARD) - .enemyMoveset([ Moves.GRUDGE, Moves.SPLASH ]); + .enemyMoveset([Moves.GRUDGE, Moves.SPLASH]); }); it("should reduce the PP of the Pokemon's move to 0 when the user has fainted", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.EMBER); await game.forceEnemyMove(Moves.GRUDGE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); @@ -47,17 +47,17 @@ describe("Moves - Grudge", () => { }); it("should remain in effect until the user's next move", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.GRUDGE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); game.move.select(Moves.EMBER); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); @@ -68,18 +68,18 @@ describe("Moves - Grudge", () => { it("should not reduce the opponent's 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([ Moves.FALSE_SWIPE ]) + .moveset([Moves.FALSE_SWIPE]) .startingLevel(100) .ability(Abilities.SAND_STREAM) .enemySpecies(Species.RATTATA); - await game.classicMode.startBattle([ Species.GEODUDE ]); + await game.classicMode.startBattle([Species.GEODUDE]); const enemyPokemon = game.scene.getEnemyPokemon(); const playerPokemon = game.scene.getPlayerPokemon(); game.move.select(Moves.FALSE_SWIPE); await game.forceEnemyMove(Moves.GRUDGE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon?.isFainted()).toBe(true); diff --git a/test/moves/guard_split.test.ts b/test/moves/guard_split.test.ts index af5023608d3..5db07e4e82c 100644 --- a/test/moves/guard_split.test.ts +++ b/test/moves/guard_split.test.ts @@ -28,15 +28,13 @@ describe("Moves - Guard Split", () => { .enemyAbility(Abilities.NONE) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.GUARD_SPLIT ]) + .moveset([Moves.GUARD_SPLIT]) .ability(Abilities.NONE); }); it("should average the user's DEF and SPDEF stats with those of the target", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -55,10 +53,8 @@ describe("Moves - Guard Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset([ Moves.GUARD_SPLIT ]); - await game.startBattle([ - Species.INDEEDEE - ]); + game.override.enemyMoveset([Moves.GUARD_SPLIT]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/guard_swap.test.ts b/test/moves/guard_swap.test.ts index 592307ff168..be824672f32 100644 --- a/test/moves/guard_swap.test.ts +++ b/test/moves/guard_swap.test.ts @@ -29,14 +29,12 @@ describe("Moves - Guard Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.GUARD_SWAP ]) + .moveset([Moves.GUARD_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's DEF and SPDEF stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.INDEEDEE - ]); + await game.classicMode.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts index 32c9190e06e..1bb6adc8e90 100644 --- a/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -30,12 +30,12 @@ describe("Moves - Hard Press", () => { game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Moves.SPLASH); - game.override.moveset([ Moves.HARD_PRESS ]); + game.override.moveset([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); }); it("should return 100 power if target HP ratio is at 100%", async () => { - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.HARD_PRESS); await game.phaseInterceptor.to(MoveEffectPhase); @@ -44,8 +44,8 @@ describe("Moves - Hard Press", () => { }); it("should return 50 power if target HP ratio is at 50%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .5; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.5; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -57,8 +57,8 @@ describe("Moves - Hard Press", () => { }); it("should return 1 power if target HP ratio is at 1%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .01; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.01; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -70,8 +70,8 @@ describe("Moves - Hard Press", () => { }); it("should return 1 power if target HP ratio is less than 1%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .005; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.005; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); diff --git a/test/moves/haze.test.ts b/test/moves/haze.test.ts index 11071bdc07d..d890678b466 100644 --- a/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -31,12 +31,12 @@ describe("Moves - Haze", () => { game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); - game.override.moveset([ Moves.HAZE, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH ]); + game.override.moveset([Moves.HAZE, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); it("should reset all stat changes of all Pokemon on field", async () => { - await game.startBattle([ Species.RATTATA ]); + await game.startBattle([Species.RATTATA]); const user = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/heal_bell.test.ts b/test/moves/heal_bell.test.ts index 72957ee21e7..4c0148bfd04 100644 --- a/test/moves/heal_bell.test.ts +++ b/test/moves/heal_bell.test.ts @@ -24,7 +24,7 @@ describe("Moves - Heal Bell", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.HEAL_BELL, Moves.SPLASH ]) + .moveset([Moves.HEAL_BELL, Moves.SPLASH]) .statusEffect(StatusEffect.BURN) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) @@ -32,8 +32,8 @@ describe("Moves - Heal Bell", () => { }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getPlayerParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); @@ -55,8 +55,8 @@ describe("Moves - Heal Bell", () => { it("should not cure status effect of the target/target's allies", async () => { game.override.enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); @@ -78,8 +78,8 @@ describe("Moves - Heal Bell", () => { it("should not cure status effect of allies ON FIELD with Soundproof, should still cure allies in party", async () => { game.override.ability(Abilities.SOUNDPROOF); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getPlayerParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/heal_block.test.ts b/test/moves/heal_block.test.ts index a0e8eaf541c..4ef67214a91 100644 --- a/test/moves/heal_block.test.ts +++ b/test/moves/heal_block.test.ts @@ -28,7 +28,7 @@ describe("Moves - Heal Block", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.ABSORB, Moves.WISH, Moves.SPLASH, Moves.AQUA_RING ]) + .moveset([Moves.ABSORB, Moves.WISH, Moves.SPLASH, Moves.AQUA_RING]) .enemyMoveset(Moves.HEAL_BLOCK) .ability(Abilities.NO_GUARD) .enemyAbility(Abilities.BALL_FETCH) @@ -36,9 +36,8 @@ describe("Moves - Heal Block", () => { .disableCrits(); }); - it("shouldn't stop damage from HP-drain attacks, just HP restoration", async() => { - - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("shouldn't stop damage from HP-drain attacks, just HP restoration", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -46,31 +45,31 @@ describe("Moves - Heal Block", () => { player.damageAndUpdate(enemy.getMaxHp() - 1); game.move.select(Moves.ABSORB); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1); expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); }); - it("shouldn't stop Liquid Ooze from dealing damage", async() => { + it("shouldn't stop Liquid Ooze from dealing damage", async () => { game.override.enemyAbility(Abilities.LIQUID_OOZE); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.ABSORB); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.isFullHp()).toBe(false); expect(enemy.isFullHp()).toBe(false); }); - it("should stop delayed heals, such as from Wish", async() => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should stop delayed heals, such as from Wish", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -88,10 +87,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent Grassy Terrain from restoring HP", async() => { + it("should prevent Grassy Terrain from restoring HP", async () => { game.override.enemyAbility(Abilities.GRASSY_SURGE); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -103,8 +102,8 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent healing from heal-over-time moves", async() => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should prevent healing from heal-over-time moves", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -117,12 +116,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent abilities from restoring HP", async() => { - game.override - .weather(WeatherType.RAIN) - .ability(Abilities.RAIN_DISH); + it("should prevent abilities from restoring HP", async () => { + game.override.weather(WeatherType.RAIN).ability(Abilities.RAIN_DISH); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -134,10 +131,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should stop healing from items", async() => { + it("should stop healing from items", async () => { game.override.startingHeldItems([{ name: "LEFTOVERS" }]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.getMaxHp() - 1); diff --git a/test/moves/heart_swap.test.ts b/test/moves/heart_swap.test.ts index 43569a32a69..a3d892cd518 100644 --- a/test/moves/heart_swap.test.ts +++ b/test/moves/heart_swap.test.ts @@ -29,14 +29,12 @@ describe("Moves - Heart Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.HEART_SWAP ]) + .moveset([Moves.HEART_SWAP]) .ability(Abilities.NONE); }); it("should swap all of the user's stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.MANAPHY - ]); + await game.classicMode.startBattle([Species.MANAPHY]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts index f03d54426d6..5cd54e9b46a 100644 --- a/test/moves/hyper_beam.test.ts +++ b/test/moves/hyper_beam.test.ts @@ -15,7 +15,7 @@ describe("Moves - Hyper Beam", () => { beforeAll(() => { phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS + type: Phaser.HEADLESS, }); }); @@ -30,41 +30,38 @@ describe("Moves - Hyper Beam", () => { game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); game.override.enemyLevel(100); - game.override.moveset([ Moves.HYPER_BEAM, Moves.TACKLE ]); + game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]); vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); }); - it( - "should force the user to recharge on the next turn (and only that turn)", - async () => { - await game.startBattle([ Species.MAGIKARP ]); + it("should force the user to recharge on the next turn (and only that turn)", async () => { + await game.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.HYPER_BEAM); + game.move.select(Moves.HYPER_BEAM); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); - const enemyPostAttackHp = enemyPokemon.hp; + const enemyPostAttackHp = enemyPokemon.hp; - /** Game should progress without a new command from the player */ - await game.phaseInterceptor.to(TurnEndPhase); + /** Game should progress without a new command from the player */ + await game.phaseInterceptor.to(TurnEndPhase); - expect(enemyPokemon.hp).toBe(enemyPostAttackHp); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + expect(enemyPokemon.hp).toBe(enemyPostAttackHp); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); - } - ); + expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); + }); }); diff --git a/test/moves/imprison.test.ts b/test/moves/imprison.test.ts index 85d529d7a74..89ef9981040 100644 --- a/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -25,13 +25,13 @@ describe("Moves - Imprison", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.IMPRISON, Moves.SPLASH, Moves.GROWL ]) + .enemyMoveset([Moves.IMPRISON, Moves.SPLASH, Moves.GROWL]) .enemySpecies(Species.SHUCKLE) - .moveset([ Moves.TRANSFORM, Moves.SPLASH ]); + .moveset([Moves.TRANSFORM, Moves.SPLASH]); }); it("Pokemon under Imprison cannot use shared moves", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -39,7 +39,10 @@ describe("Moves - Imprison", () => { await game.forceEnemyMove(Moves.IMPRISON); await game.toNextTurn(); const playerMoveset = playerPokemon.getMoveset().map(x => x?.moveId); - const enemyMoveset = game.scene.getEnemyPokemon()!.getMoveset().map(x => x?.moveId); + const enemyMoveset = game.scene + .getEnemyPokemon()! + .getMoveset() + .map(x => x?.moveId); expect(enemyMoveset.includes(playerMoveset[0])).toBeTruthy(); const imprisonArenaTag = game.scene.arena.getTag(ArenaTagType.IMPRISON); const imprisonBattlerTag = playerPokemon.getTag(BattlerTagType.IMPRISON); @@ -55,7 +58,7 @@ describe("Moves - Imprison", () => { }); it("Imprison applies to Pokemon switched into Battle", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const playerPokemon1 = game.scene.getPlayerPokemon()!; @@ -78,8 +81,8 @@ describe("Moves - Imprison", () => { }); it("The effects of Imprison only end when the source is no longer active", async () => { - game.override.moveset([ Moves.SPLASH, Moves.IMPRISON ]); - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + game.override.moveset([Moves.SPLASH, Moves.IMPRISON]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/moves/instruct.test.ts b/test/moves/instruct.test.ts index db9801932cc..079c8803ddc 100644 --- a/test/moves/instruct.test.ts +++ b/test/moves/instruct.test.ts @@ -41,17 +41,15 @@ describe("Moves - Instruct", () => { }); it("should repeat target's last used move", async () => { - game.override - .moveset(Moves.INSTRUCT) - .enemyLevel(1000); // ensures shuckle no die - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset(Moves.INSTRUCT).enemyLevel(1000); // ensures shuckle no die + await game.classicMode.startBattle([Species.AMOONGUSS]); const enemy = game.scene.getEnemyPokemon()!; game.move.changeMoveset(enemy, Moves.SONIC_BOOM); game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.SONIC_BOOM); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MovePhase"); // enemy attacks us await game.phaseInterceptor.to("MovePhase", false); // instruct @@ -70,20 +68,20 @@ describe("Moves - Instruct", () => { }); it("should repeat enemy's move through substitute", async () => { - game.override.moveset([ Moves.INSTRUCT, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset([Moves.INSTRUCT, Moves.SPLASH]); + await game.classicMode.startBattle([Species.AMOONGUSS]); const enemy = game.scene.getEnemyPokemon()!; - game.move.changeMoveset(enemy, [ Moves.SONIC_BOOM, Moves.SUBSTITUTE ]); + game.move.changeMoveset(enemy, [Moves.SONIC_BOOM, Moves.SUBSTITUTE]); game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.SUBSTITUTE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.SONIC_BOOM); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); instructSuccess(game.scene.getEnemyPokemon()!, Moves.SONIC_BOOM); @@ -91,18 +89,16 @@ describe("Moves - Instruct", () => { }); it("should repeat ally's attack on enemy", async () => { - game.override - .battleType("double") - .enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.SHUCKLE ]); + game.override.battleType("double").enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.SHUCKLE]); - const [ amoonguss, shuckle ] = game.scene.getPlayerField(); - game.move.changeMoveset(amoonguss, [ Moves.INSTRUCT, Moves.SONIC_BOOM ]); - game.move.changeMoveset(shuckle, [ Moves.INSTRUCT, Moves.SONIC_BOOM ]); + const [amoonguss, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(amoonguss, [Moves.INSTRUCT, Moves.SONIC_BOOM]); + game.move.changeMoveset(shuckle, [Moves.INSTRUCT, Moves.SONIC_BOOM]); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2); game.move.select(Moves.SONIC_BOOM, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); instructSuccess(shuckle, Moves.SONIC_BOOM); @@ -111,16 +107,14 @@ describe("Moves - Instruct", () => { // TODO: Enable test case once gigaton hammer (and blood moon) are reworked it.todo("should repeat enemy's Gigaton Hammer", async () => { - game.override - .moveset(Moves.INSTRUCT) - .enemyLevel(5); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset(Moves.INSTRUCT).enemyLevel(5); + await game.classicMode.startBattle([Species.AMOONGUSS]); const enemy = game.scene.getEnemyPokemon()!; - game.move.changeMoveset(enemy, [ Moves.GIGATON_HAMMER, Moves.BLOOD_MOON ]); + game.move.changeMoveset(enemy, [Moves.GIGATON_HAMMER, Moves.BLOOD_MOON]); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); instructSuccess(enemy, Moves.GIGATON_HAMMER); @@ -128,18 +122,15 @@ describe("Moves - Instruct", () => { }); it("should add moves to move queue for copycat", async () => { - game.override - .battleType("double") - .moveset(Moves.INSTRUCT) - .enemyLevel(5); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.battleType("double").moveset(Moves.INSTRUCT).enemyLevel(5); + await game.classicMode.startBattle([Species.AMOONGUSS]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField()!; + const [enemy1, enemy2] = game.scene.getEnemyField()!; game.move.changeMoveset(enemy1, Moves.WATER_GUN); game.move.changeMoveset(enemy2, Moves.COPYCAT); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); instructSuccess(enemy1, Moves.WATER_GUN); @@ -148,17 +139,15 @@ describe("Moves - Instruct", () => { }); it("should respect enemy's status condition", async () => { - game.override - .moveset([ Moves.INSTRUCT, Moves.THUNDER_WAVE ]) - .enemyMoveset(Moves.SONIC_BOOM); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset([Moves.INSTRUCT, Moves.THUNDER_WAVE]).enemyMoveset(Moves.SONIC_BOOM); + await game.classicMode.startBattle([Species.AMOONGUSS]); game.move.select(Moves.THUNDER_WAVE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MovePhase"); // force enemy's instructed move to bork and then immediately thaw out await game.move.forceStatusActivation(true); @@ -166,15 +155,13 @@ describe("Moves - Instruct", () => { await game.phaseInterceptor.to("TurnEndPhase", false); const moveHistory = game.scene.getEnemyPokemon()?.getLastXMoves(-1)!; - expect(moveHistory.map(m => m.move)).toEqual([ Moves.SONIC_BOOM, Moves.NONE, Moves.SONIC_BOOM ]); + expect(moveHistory.map(m => m.move)).toEqual([Moves.SONIC_BOOM, Moves.NONE, Moves.SONIC_BOOM]); expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); }); it("should not repeat enemy's out of pp move", async () => { - game.override - .moveset(Moves.INSTRUCT) - .enemySpecies(Species.UNOWN); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset(Moves.INSTRUCT).enemySpecies(Species.UNOWN); + await game.classicMode.startBattle([Species.AMOONGUSS]); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.changeMoveset(enemyPokemon, Moves.HIDDEN_POWER); @@ -183,7 +170,7 @@ describe("Moves - Instruct", () => { game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.HIDDEN_POWER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); const playerMoves = game.scene.getPlayerPokemon()!.getLastXMoves(-1)!; @@ -192,20 +179,16 @@ describe("Moves - Instruct", () => { }); it("should redirect attacking moves if enemy faints", async () => { - game.override - .battleType("double") - .enemyMoveset(Moves.SPLASH) - .enemySpecies(Species.MAGIKARP) - .enemyLevel(1); - await game.classicMode.startBattle([ Species.HISUI_ELECTRODE, Species.KOMMO_O ]); + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemySpecies(Species.MAGIKARP).enemyLevel(1); + await game.classicMode.startBattle([Species.HISUI_ELECTRODE, Species.KOMMO_O]); - const [ electrode, kommo_o ] = game.scene.getPlayerField()!; + const [electrode, kommo_o] = game.scene.getPlayerField()!; game.move.changeMoveset(electrode, Moves.CHLOROBLAST); game.move.changeMoveset(kommo_o, Moves.INSTRUCT); game.move.select(Moves.CHLOROBLAST, BattlerIndex.PLAYER, BattlerIndex.ENEMY); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); // Chloroblast always deals 50% max HP% recoil UNLESS you whiff @@ -213,19 +196,15 @@ describe("Moves - Instruct", () => { // so all we have to do is check whether electrode fainted or not. // Naturally, both karps should also be dead as well. expect(electrode.isFainted()).toBe(true); - const [ karp1, karp2 ] = game.scene.getEnemyField()!; + const [karp1, karp2] = game.scene.getEnemyField()!; expect(karp1.isFainted()).toBe(true); expect(karp2.isFainted()).toBe(true); - }), - + }); it("should allow for dancer copying of instructed dance move", async () => { - game.override - .battleType("double") - .enemyMoveset([ Moves.INSTRUCT, Moves.SPLASH ]) - .enemyLevel(1000); - await game.classicMode.startBattle([ Species.ORICORIO, Species.VOLCARONA ]); + game.override.battleType("double").enemyMoveset([Moves.INSTRUCT, Moves.SPLASH]).enemyLevel(1000); + await game.classicMode.startBattle([Species.ORICORIO, Species.VOLCARONA]); - const [ oricorio, volcarona ] = game.scene.getPlayerField(); + const [oricorio, volcarona] = game.scene.getPlayerField(); game.move.changeMoveset(oricorio, Moves.SPLASH); game.move.changeMoveset(volcarona, Moves.FIERY_DANCE); @@ -233,7 +212,7 @@ describe("Moves - Instruct", () => { game.move.select(Moves.FIERY_DANCE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.forceEnemyMove(Moves.INSTRUCT, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); // fiery dance triggered dancer successfully for a total of 4 hits @@ -243,15 +222,19 @@ describe("Moves - Instruct", () => { }); it("should not repeat move when switching out", async () => { - game.override - .enemyMoveset(Moves.INSTRUCT) - .enemySpecies(Species.UNOWN); - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.TOXICROAK ]); + game.override.enemyMoveset(Moves.INSTRUCT).enemySpecies(Species.UNOWN); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.TOXICROAK]); const amoonguss = game.scene.getPlayerPokemon()!; game.move.changeMoveset(amoonguss, Moves.SEED_BOMB); - amoonguss.battleSummonData.moveHistory = [{ move: Moves.SEED_BOMB, targets: [ BattlerIndex.ENEMY ], result: MoveResult.SUCCESS }]; + amoonguss.battleSummonData.moveHistory = [ + { + move: Moves.SEED_BOMB, + targets: [BattlerIndex.ENEMY], + result: MoveResult.SUCCESS, + }, + ]; game.doSwitchPokemon(1); await game.phaseInterceptor.to("TurnEndPhase", false); @@ -261,49 +244,50 @@ describe("Moves - Instruct", () => { }); it("should fail if no move has yet been used by target", async () => { - game.override - .moveset(Moves.INSTRUCT) - .enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset(Moves.INSTRUCT).enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.AMOONGUSS]); game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should attempt to call enemy's disabled move, but move use itself should fail", async () => { - game.override - .moveset([ Moves.INSTRUCT, Moves.DISABLE ]) - .battleType("double"); - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.DROWZEE ]); + game.override.moveset([Moves.INSTRUCT, Moves.DISABLE]).battleType("double"); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.DROWZEE]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.changeMoveset(enemy1, Moves.SONIC_BOOM); game.move.changeMoveset(enemy2, Moves.SPLASH); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); game.move.select(Moves.DISABLE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.forceEnemyMove(Moves.SONIC_BOOM, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(game.scene.getPlayerField()[0].getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); const enemyMove = game.scene.getEnemyField()[0]!.getLastXMoves()[0]; expect(enemyMove.result).toBe(MoveResult.FAIL); - expect(game.scene.getEnemyField()[0].getMoveset().find(m => m?.moveId === Moves.SONIC_BOOM)?.ppUsed).toBe(1); + expect( + game.scene + .getEnemyField()[0] + .getMoveset() + .find(m => m?.moveId === Moves.SONIC_BOOM)?.ppUsed, + ).toBe(1); }); it("should not repeat enemy's move through protect", async () => { - game.override.moveset([ Moves.INSTRUCT ]); - await game.classicMode.startBattle([ Species.AMOONGUSS ]); + game.override.moveset([Moves.INSTRUCT]); + await game.classicMode.startBattle([Species.AMOONGUSS]); const enemy = game.scene.getEnemyPokemon()!; game.move.changeMoveset(enemy, Moves.PROTECT); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(enemy.getLastXMoves(-1)[0].move).toBe(Moves.PROTECT); @@ -312,62 +296,68 @@ describe("Moves - Instruct", () => { }); it("should not repeat enemy's charging move", async () => { - game.override - .moveset([ Moves.INSTRUCT ]) - .enemyMoveset([ Moves.SONIC_BOOM, Moves.HYPER_BEAM ]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + game.override.moveset([Moves.INSTRUCT]).enemyMoveset([Moves.SONIC_BOOM, Moves.HYPER_BEAM]); + await game.classicMode.startBattle([Species.SHUCKLE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; - enemy.battleSummonData.moveHistory = [{ move: Moves.SONIC_BOOM, targets: [ BattlerIndex.PLAYER ], result: MoveResult.SUCCESS, virtual: false }]; + enemy.battleSummonData.moveHistory = [ + { + move: Moves.SONIC_BOOM, + targets: [BattlerIndex.PLAYER], + result: MoveResult.SUCCESS, + virtual: false, + }, + ]; game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.HYPER_BEAM); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); // instruct fails at copying last move due to charging turn (rather than instructing sonic boom) expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should not repeat move since forgotten by target", async () => { - game.override - .enemyLevel(5) - .xpMultiplier(0) - .enemySpecies(Species.WURMPLE) - .enemyMoveset(Moves.INSTRUCT); - await game.classicMode.startBattle([ Species.REGIELEKI ]); + game.override.enemyLevel(5).xpMultiplier(0).enemySpecies(Species.WURMPLE).enemyMoveset(Moves.INSTRUCT); + await game.classicMode.startBattle([Species.REGIELEKI]); const regieleki = game.scene.getPlayerPokemon()!; // fill out moveset with random moves - game.move.changeMoveset(regieleki, [ Moves.ELECTRO_DRIFT, Moves.SPLASH, Moves.ICE_BEAM, Moves.ANCIENT_POWER ]); + game.move.changeMoveset(regieleki, [Moves.ELECTRO_DRIFT, Moves.SPLASH, Moves.ICE_BEAM, Moves.ANCIENT_POWER]); game.move.select(Moves.ELECTRO_DRIFT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("FaintPhase"); await game.move.learnMove(Moves.ELECTROWEB); await game.toNextWave(); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(game.scene.getEnemyField()[0].getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should disregard priority of instructed move on use", async () => { - game.override - .enemyMoveset([ Moves.SPLASH, Moves.WHIRLWIND ]) - .moveset(Moves.INSTRUCT); - await game.classicMode.startBattle([ Species.LUCARIO, Species.BANETTE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]).moveset(Moves.INSTRUCT); + await game.classicMode.startBattle([Species.LUCARIO, Species.BANETTE]); const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.battleSummonData.moveHistory = [{ move: Moves.WHIRLWIND, targets: [ BattlerIndex.PLAYER ], result: MoveResult.SUCCESS, virtual: false }]; + enemyPokemon.battleSummonData.moveHistory = [ + { + move: Moves.WHIRLWIND, + targets: [BattlerIndex.PLAYER], + result: MoveResult.SUCCESS, + virtual: false, + }, + ]; game.move.select(Moves.INSTRUCT); await game.forceEnemyMove(Moves.SPLASH); @@ -381,11 +371,11 @@ describe("Moves - Instruct", () => { }); it("should respect moves' original priority for psychic terrain", async () => { - game.override. - battleType("double") - .moveset([ Moves.QUICK_ATTACK, Moves.SPLASH, Moves.INSTRUCT ]) - .enemyMoveset([ Moves.SPLASH, Moves.PSYCHIC_TERRAIN ]); - await game.classicMode.startBattle([ Species.BANETTE, Species.KLEFKI ]); + game.override + .battleType("double") + .moveset([Moves.QUICK_ATTACK, Moves.SPLASH, Moves.INSTRUCT]) + .enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.BANETTE, Species.KLEFKI]); game.move.select(Moves.QUICK_ATTACK, BattlerIndex.PLAYER, BattlerIndex.ENEMY); // succeeds due to terrain no game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); @@ -395,7 +385,7 @@ describe("Moves - Instruct", () => { game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); // quick attack failed when instructed @@ -405,14 +395,12 @@ describe("Moves - Instruct", () => { }); it("should still work w/ prankster in psychic terrain", async () => { - game.override. - battleType("double") - .enemyMoveset([ Moves.SPLASH, Moves.PSYCHIC_TERRAIN ]); - await game.classicMode.startBattle([ Species.BANETTE, Species.KLEFKI ]); + game.override.battleType("double").enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.BANETTE, Species.KLEFKI]); - const [ banette, klefki ] = game.scene.getPlayerField()!; - game.move.changeMoveset(banette, [ Moves.VINE_WHIP, Moves.SPLASH ]); - game.move.changeMoveset(klefki, [ Moves.INSTRUCT, Moves.SPLASH ]); + const [banette, klefki] = game.scene.getPlayerField()!; + game.move.changeMoveset(banette, [Moves.VINE_WHIP, Moves.SPLASH]); + game.move.changeMoveset(klefki, [Moves.INSTRUCT, Moves.SPLASH]); game.move.select(Moves.VINE_WHIP, BattlerIndex.PLAYER, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); @@ -422,74 +410,78 @@ describe("Moves - Instruct", () => { game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); // copies vine whip - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(banette.getLastXMoves(-1)[1].move).toBe(Moves.VINE_WHIP); expect(banette.getLastXMoves(-1)[2].move).toBe(Moves.VINE_WHIP); - expect(banette.getMoveset().find(m => m?.moveId === Moves.VINE_WHIP )?.ppUsed).toBe(2); + expect(banette.getMoveset().find(m => m?.moveId === Moves.VINE_WHIP)?.ppUsed).toBe(2); }); it("should cause spread moves to correctly hit targets in doubles after singles", async () => { game.override .battleType("even-doubles") - .moveset([ Moves.BREAKING_SWIPE, Moves.INSTRUCT, Moves.SPLASH ]) + .moveset([Moves.BREAKING_SWIPE, Moves.INSTRUCT, Moves.SPLASH]) .enemyMoveset(Moves.SONIC_BOOM) .enemySpecies(Species.AXEW) .startingLevel(500); - await game.classicMode.startBattle([ Species.KORAIDON, Species.KLEFKI ]); + await game.classicMode.startBattle([Species.KORAIDON, Species.KLEFKI]); const koraidon = game.scene.getPlayerField()[0]!; game.move.select(Moves.BREAKING_SWIPE); await game.phaseInterceptor.to("TurnEndPhase", false); expect(koraidon.getInverseHp()).toBe(0); - expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([ BattlerIndex.ENEMY ]); + expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([BattlerIndex.ENEMY]); await game.toNextWave(); game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); // did not take damage since enemies died beforehand; // last move used hit both enemies expect(koraidon.getInverseHp()).toBe(0); - expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); }); it("should cause AoE moves to correctly hit everyone in doubles after singles", async () => { game.override .battleType("even-doubles") - .moveset([ Moves.BRUTAL_SWING, Moves.INSTRUCT, Moves.SPLASH ]) + .moveset([Moves.BRUTAL_SWING, Moves.INSTRUCT, Moves.SPLASH]) .enemySpecies(Species.AXEW) .enemyMoveset(Moves.SONIC_BOOM) .startingLevel(500); - await game.classicMode.startBattle([ Species.KORAIDON, Species.KLEFKI ]); + await game.classicMode.startBattle([Species.KORAIDON, Species.KLEFKI]); const koraidon = game.scene.getPlayerField()[0]!; game.move.select(Moves.BRUTAL_SWING); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("TurnEndPhase", false); expect(koraidon.getInverseHp()).toBe(0); - expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([ BattlerIndex.ENEMY ]); + expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([BattlerIndex.ENEMY]); await game.toNextWave(); game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase", false); // did not take damage since enemies died beforehand; // last move used hit everything around it expect(koraidon.getInverseHp()).toBe(0); - expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([ + BattlerIndex.PLAYER_2, + BattlerIndex.ENEMY, + BattlerIndex.ENEMY_2, + ]); }); it("should cause multi-hit moves to hit the appropriate number of times in singles", async () => { game.override .enemyAbility(Abilities.SKILL_LINK) - .moveset([ Moves.SPLASH, Moves.INSTRUCT ]) + .moveset([Moves.SPLASH, Moves.INSTRUCT]) .enemyMoveset(Moves.BULLET_SEED); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; @@ -497,14 +489,14 @@ describe("Moves - Instruct", () => { await game.toNextTurn(); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); expect(bulbasaur.turnData.attacksReceived.length).toBe(10); await game.toNextTurn(); game.move.select(Moves.INSTRUCT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(bulbasaur.turnData.attacksReceived.length).toBe(10); @@ -514,12 +506,12 @@ describe("Moves - Instruct", () => { game.override .battleType("double") .enemyAbility(Abilities.SKILL_LINK) - .moveset([ Moves.SPLASH, Moves.INSTRUCT ]) - .enemyMoveset([ Moves.BULLET_SEED, Moves.SPLASH ]) + .moveset([Moves.SPLASH, Moves.INSTRUCT]) + .enemyMoveset([Moves.BULLET_SEED, Moves.SPLASH]) .enemyLevel(5); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.IVYSAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.IVYSAUR]); - const [ , ivysaur ] = game.scene.getPlayerField(); + const [, ivysaur] = game.scene.getPlayerField(); game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); @@ -531,7 +523,7 @@ describe("Moves - Instruct", () => { game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(ivysaur.turnData.attacksReceived.length).toBe(15); @@ -541,7 +533,7 @@ describe("Moves - Instruct", () => { game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); await game.phaseInterceptor.to("BerryPhase"); expect(ivysaur.turnData.attacksReceived.length).toBe(15); diff --git a/test/moves/jaw_lock.test.ts b/test/moves/jaw_lock.test.ts index 4f9c6481a9a..fc71397e624 100644 --- a/test/moves/jaw_lock.test.ts +++ b/test/moves/jaw_lock.test.ts @@ -11,7 +11,6 @@ import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Jaw Lock", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -34,136 +33,121 @@ describe("Moves - Jaw Lock", () => { .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.JAW_LOCK, Moves.SPLASH ]) + .moveset([Moves.JAW_LOCK, Moves.SPLASH]) .startingLevel(100) .enemyLevel(100) .disableCrits(); }); - it( - "should trap the move's user and target", - async () => { - await game.startBattle([ Species.BULBASAUR ]); + it("should trap the move's user and target", async () => { + await game.startBattle([Species.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.phaseInterceptor.to(MoveEffectPhase, false); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - } - ); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + }); - it( - "should not trap either pokemon if the target faints", - async () => { - game.override.enemyLevel(1); - await game.startBattle([ Species.BULBASAUR ]); + it("should not trap either pokemon if the target faints", async () => { + game.override.enemyLevel(1); + await game.startBattle([Species.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.phaseInterceptor.to(MoveEffectPhase, false); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - await game.phaseInterceptor.to(FaintPhase); + await game.phaseInterceptor.to(FaintPhase); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); - it( - "should only trap the user until the target faints", - async () => { - await game.startBattle([ Species.BULBASAUR ]); + it("should only trap the user until the target faints", async () => { + await game.startBattle([Species.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - await game.doKillOpponents(); + await game.doKillOpponents(); - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); - it( - "should not trap other targets after the first target is trapped", - async () => { - game.override.battleType("double"); + it("should not trap other targets after the first target is trapped", async () => { + game.override.battleType("double"); - await game.startBattle([ Species.CHARMANDER, Species.BULBASAUR ]); + await game.startBattle([Species.CHARMANDER, Species.BULBASAUR]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - await game.toNextTurn(); + await game.toNextTurn(); - game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(MoveEffectPhase); - expect(enemyPokemon[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)?.sourceId).toBe(enemyPokemon[0].id); - } - ); + expect(enemyPokemon[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)?.sourceId).toBe(enemyPokemon[0].id); + }); - it( - "should not trap either pokemon if the target is protected", - async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); + it("should not trap either pokemon if the target is protected", async () => { + game.override.enemyMoveset([Moves.PROTECT]); - await game.startBattle([ Species.BULBASAUR ]); + await game.startBattle([Species.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.JAW_LOCK); + game.move.select(Moves.JAW_LOCK); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(playerPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); + expect(playerPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); }); diff --git a/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts index 7ba507b66b9..8395633f5c0 100644 --- a/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Lash Out", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,13 +28,12 @@ describe("Moves - Lash Out", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.FUR_COAT) - .enemyMoveset([ Moves.GROWL ]) + .enemyMoveset([Moves.GROWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.LASH_OUT ]); - + .moveset([Moves.LASH_OUT]); }); it("should deal double damage if the user's stat stages were lowered this turn", async () => { @@ -43,7 +41,7 @@ describe("Moves - Lash Out", () => { await game.classicMode.startBattle(); game.move.select(Moves.LASH_OUT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(allMoves[Moves.LASH_OUT].calculateBattlePower).toHaveReturnedWith(150); diff --git a/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts index 272c6bc71b7..57752cea1af 100644 --- a/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -30,7 +30,7 @@ describe("Moves - Last Respects", () => { game.override .battleType("single") .disableCrits() - .moveset([ Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE ]) + .moveset([Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE]) .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.MAGIKARP) @@ -42,13 +42,13 @@ describe("Moves - Last Respects", () => { }); it("should have 150 power if 2 allies faint before using move", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * Bulbasur faints once */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -56,25 +56,25 @@ describe("Moves - Last Respects", () => { * Charmander faints once */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(2); await game.toNextTurn(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); - expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (2 * 50)); + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + 2 * 50); }); it("should have 200 power if an ally fainted twice and another one once", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * Bulbasur faints once */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -83,7 +83,7 @@ describe("Moves - Last Respects", () => { */ game.doRevivePokemon(1); game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -91,15 +91,15 @@ describe("Moves - Last Respects", () => { * Bulbasur faints twice */ game.move.select(Moves.EXPLOSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(2); await game.toNextTurn(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); - expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (3 * 50)); + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + 3 * 50); }); it("should maintain its power for the player during the next battle if it is within the same arena encounter", async () => { @@ -110,13 +110,13 @@ describe("Moves - Last Respects", () => { .startingLevel(100) .enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * The first Pokemon faints and another Pokemon in the party is selected. - */ + */ game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -124,14 +124,14 @@ describe("Moves - Last Respects", () => { * Enemy Pokemon faints and new wave is entered. */ game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); expect(game.scene.arena.playerFaints).toBe(1); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); - expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + (1 * 50)); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + 1 * 50); }); it("should reset enemyFaints count on progressing to the next wave.", async () => { @@ -141,15 +141,15 @@ describe("Moves - Last Respects", () => { .enemyLevel(1) .startingLevel(100) .enemyMoveset(Moves.LAST_RESPECTS) - .moveset([ Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH ]); + .moveset([Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); /** * The first Pokemon faints and another Pokemon in the party is selected. - */ + */ game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); @@ -157,61 +157,53 @@ describe("Moves - Last Respects", () => { * Enemy Pokemon faints and new wave is entered. */ game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); expect(game.scene.currentBattle.enemyFaints).toBe(0); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEndPhase"); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); }); it("should reset playerFaints count if we enter new trainer battle", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(4) - .enemyLevel(1) - .startingLevel(100); + game.override.enemySpecies(Species.MAGIKARP).startingWave(4).enemyLevel(1).startingLevel(100); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); }); it("should reset playerFaints count if we enter new biome", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(10) - .enemyLevel(1) - .startingLevel(100); + game.override.enemySpecies(Species.MAGIKARP).startingWave(10).enemyLevel(1).startingLevel(100); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); game.move.select(Moves.LUNAR_DANCE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); await game.toNextTurn(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.LAST_RESPECTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); diff --git a/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts index 2a4a1568136..9cc6944ed3e 100644 --- a/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -36,22 +36,26 @@ describe("Moves - Light Screen", () => { globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN ]); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); game.override.disableCrits(); }); it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -60,39 +64,51 @@ describe("Moves - Light Screen", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("does not affect physical attacks", async () => { const moveToUse = Moves.TACKLE; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); it("does not affect critical hits", async () => { - game.override.moveset([ Moves.FROST_BREATH ]); + game.override.moveset([Moves.FROST_BREATH]); const moveToUse = Moves.FROST_BREATH; vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); }); @@ -112,7 +128,14 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = if (globalScene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { if (move.getAttrs(CritOnlyAttr).length === 0) { - globalScene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, false, attacker, move.category, multiplierHolder); + globalScene.arena.applyTagsForSide( + ArenaTagType.LIGHT_SCREEN, + side, + false, + attacker, + move.category, + multiplierHolder, + ); } } diff --git a/test/moves/lucky_chant.test.ts b/test/moves/lucky_chant.test.ts index 7f943732192..21802574e79 100644 --- a/test/moves/lucky_chant.test.ts +++ b/test/moves/lucky_chant.test.ts @@ -7,14 +7,13 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "#test/testUtils/gameManager"; - describe("Moves - Lucky Chant", () => { let phaserGame: Phaser.Game; let game: GameManager; beforeAll(() => { phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS + type: Phaser.HEADLESS, }); }); @@ -27,86 +26,77 @@ describe("Moves - Lucky Chant", () => { game.override .battleType("single") - .moveset([ Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME ]) + .moveset([Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.FLOWER_TRICK ]) + .enemyMoveset([Moves.FLOWER_TRICK]) .startingLevel(100) .enemyLevel(100); }); - it( - "should prevent critical hits from moves", - async () => { - await game.startBattle([ Species.CHARIZARD ]); + it("should prevent critical hits from moves", async () => { + await game.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; - game.move.select(Moves.LUCKY_CHANT); + game.move.select(Moves.LUCKY_CHANT); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); - it( - "should prevent critical hits against the user's ally", - async () => { - game.override.battleType("double"); + it("should prevent critical hits against the user's ally", async () => { + game.override.battleType("double"); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - const firstTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp; + const firstTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp; - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.LUCKY_CHANT, 1); + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.LUCKY_CHANT, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - const secondTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); + const secondTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); - it( - "should prevent critical hits from field effects", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + it("should prevent critical hits from field effects", async () => { + game.override.enemyMoveset([Moves.TACKLE]); - await game.startBattle([ Species.CHARIZARD ]); + await game.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 2, Moves.NONE, 0); + enemyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 2, Moves.NONE, 0); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; - game.move.select(Moves.LUCKY_CHANT); + game.move.select(Moves.LUCKY_CHANT); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); }); diff --git a/test/moves/lunar_blessing.test.ts b/test/moves/lunar_blessing.test.ts index a81e967a6d9..d97e6c978eb 100644 --- a/test/moves/lunar_blessing.test.ts +++ b/test/moves/lunar_blessing.test.ts @@ -28,13 +28,13 @@ describe("Moves - Lunar Blessing", () => { game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.LUNAR_BLESSING, Moves.SPLASH ]); + game.override.moveset([Moves.LUNAR_BLESSING, Moves.SPLASH]); game.override.ability(Abilities.BALL_FETCH); }); it("should restore 25% HP of the user and its ally", async () => { - await game.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); vi.spyOn(leftPlayer, "getMaxHp").mockReturnValue(100); vi.spyOn(rightPlayer, "getMaxHp").mockReturnValue(100); @@ -47,7 +47,6 @@ describe("Moves - Lunar Blessing", () => { vi.spyOn(leftPlayer, "heal"); vi.spyOn(rightPlayer, "heal"); - game.move.select(Moves.LUNAR_BLESSING, 0); await game.phaseInterceptor.to(CommandPhase); game.move.select(Moves.SPLASH, 1); @@ -62,8 +61,8 @@ describe("Moves - Lunar Blessing", () => { it("should cure status effect of the user and its ally", async () => { game.override.statusEffect(StatusEffect.BURN); - await game.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/lunar_dance.test.ts b/test/moves/lunar_dance.test.ts index 37e96e0dc3e..d3dceba087c 100644 --- a/test/moves/lunar_dance.test.ts +++ b/test/moves/lunar_dance.test.ts @@ -31,12 +31,12 @@ describe("Moves - Lunar Dance", () => { }); it("should full restore HP, PP and status of switched in pokemon, then fail second use because no remaining backup pokemon in party", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.ODDISH, Species.RATTATA ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ODDISH, Species.RATTATA]); - const [ bulbasaur, oddish, rattata ] = game.scene.getPlayerParty(); - game.move.changeMoveset(bulbasaur, [ Moves.LUNAR_DANCE, Moves.SPLASH ]); - game.move.changeMoveset(oddish, [ Moves.LUNAR_DANCE, Moves.SPLASH ]); - game.move.changeMoveset(rattata, [ Moves.LUNAR_DANCE, Moves.SPLASH ]); + const [bulbasaur, oddish, rattata] = game.scene.getPlayerParty(); + game.move.changeMoveset(bulbasaur, [Moves.LUNAR_DANCE, Moves.SPLASH]); + game.move.changeMoveset(oddish, [Moves.LUNAR_DANCE, Moves.SPLASH]); + game.move.changeMoveset(rattata, [Moves.LUNAR_DANCE, Moves.SPLASH]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 1); diff --git a/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts index c3e2e6e9f51..2cc8dea8938 100644 --- a/test/moves/magic_coat.test.ts +++ b/test/moves/magic_coat.test.ts @@ -38,8 +38,8 @@ describe("Moves - Magic Coat", () => { }); it("should fail if the user goes last in the turn", async () => { - game.override.moveset([ Moves.PROTECT ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.PROTECT); await game.phaseInterceptor.to("BerryPhase"); @@ -47,8 +47,8 @@ describe("Moves - Magic Coat", () => { }); it("should fail if called again in the same turn due to moves like instruct", async () => { - game.override.moveset([ Moves.INSTRUCT ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.INSTRUCT]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.INSTRUCT); await game.phaseInterceptor.to("BerryPhase"); @@ -56,9 +56,9 @@ describe("Moves - Magic Coat", () => { }); it("should not reflect moves used on the next turn", async () => { - game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); - game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.MAGIC_COAT, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP]); // turn 1 game.move.select(Moves.SPLASH); @@ -73,8 +73,8 @@ describe("Moves - Magic Coat", () => { }); it("should reflect basic status moves", async () => { - game.override.moveset([ Moves.GROWL ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -83,8 +83,8 @@ describe("Moves - Magic Coat", () => { it("should individually bounce back multi-target moves when used by both targets in doubles", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.GROWL, 0); game.move.select(Moves.SPLASH, 1); @@ -96,9 +96,9 @@ describe("Moves - Magic Coat", () => { it("should bounce back a spread status move against both pokemon", async () => { game.override.battleType("double"); - game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH, Moves.MAGIC_COAT]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.GROWL, 0); game.move.select(Moves.SPLASH, 1); @@ -110,9 +110,9 @@ describe("Moves - Magic Coat", () => { }); it("should still bounce back a move that would otherwise fail", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); - game.override.moveset([ Moves.GROWL ]); + game.override.moveset([Moves.GROWL]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -123,9 +123,9 @@ describe("Moves - Magic Coat", () => { it("should not bounce back a move that was just bounced", async () => { game.override.battleType("double"); game.override.ability(Abilities.MAGIC_BOUNCE); - game.override.moveset([ Moves.GROWL, Moves.MAGIC_COAT ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL, Moves.MAGIC_COAT]); + game.override.enemyMoveset([Moves.SPLASH, Moves.MAGIC_COAT]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.MAGIC_COAT, 0); game.move.select(Moves.GROWL, 1); @@ -138,7 +138,7 @@ describe("Moves - Magic Coat", () => { // todo while Mirror Armor is not implemented it.todo("should receive the stat change after reflecting a move back to a mirror armor user", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -148,8 +148,8 @@ describe("Moves - Magic Coat", () => { it("should still bounce back a move from a mold breaker user", async () => { game.override.ability(Abilities.MOLD_BREAKER); - game.override.moveset([ Moves.GROWL ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GROWL); await game.phaseInterceptor.to("BerryPhase"); @@ -160,8 +160,8 @@ describe("Moves - Magic Coat", () => { it("should only bounce spikes back once when both targets use magic coat in doubles", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - game.override.moveset([ Moves.SPIKES ]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.SPIKES]); game.move.select(Moves.SPIKES); await game.phaseInterceptor.to("BerryPhase"); @@ -170,10 +170,10 @@ describe("Moves - Magic Coat", () => { expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); }); - it("should not bounce back curse", async() => { + it("should not bounce back curse", async () => { game.override.starterSpecies(Species.GASTLY); - await game.classicMode.startBattle([ Species.GASTLY ]); - game.override.moveset([ Moves.CURSE ]); + await game.classicMode.startBattle([Species.GASTLY]); + game.override.moveset([Moves.CURSE]); game.move.select(Moves.CURSE); await game.phaseInterceptor.to("BerryPhase"); @@ -183,11 +183,11 @@ describe("Moves - Magic Coat", () => { // TODO: encore is failing if the last move was virtual. it.todo("should not cause the bounced move to count for encore", async () => { - game.override.moveset([ Moves.GROWL, Moves.ENCORE ]); - game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.TACKLE ]); + game.override.moveset([Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.MAGIC_COAT, Moves.TACKLE]); game.override.enemyAbility(Abilities.MAGIC_BOUNCE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyPokemon = game.scene.getEnemyPokemon()!; // turn 1 @@ -198,7 +198,7 @@ describe("Moves - Magic Coat", () => { // turn 2 game.move.select(Moves.ENCORE); await game.forceEnemyMove(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); @@ -207,8 +207,8 @@ describe("Moves - Magic Coat", () => { // TODO: stomping tantrum should consider moves that were bounced. it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]); const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; vi.spyOn(stomping_tantrum, "calculateBattlePower"); @@ -222,33 +222,36 @@ describe("Moves - Magic Coat", () => { }); // TODO: stomping tantrum should consider moves that were bounced. - it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { - game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + it.todo( + "should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", + async () => { + game.override.enemyMoveset([Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); - const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(stomping_tantrum, "calculateBattlePower"); + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); - game.move.select(Moves.SPORE); - await game.forceEnemyMove(Moves.CHARM); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); - await game.phaseInterceptor.to("BerryPhase"); - expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); - await game.toNextTurn(); - game.move.select(Moves.GROWL); - await game.phaseInterceptor.to("BerryPhase"); - expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); - }); + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }, + ); it("should respect immunities when bouncing a move", async () => { vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); - game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.moveset([Moves.THUNDER_WAVE, Moves.GROWL]); game.override.ability(Abilities.SOUNDPROOF); - await game.classicMode.startBattle([ Species.PHANPY ]); + await game.classicMode.startBattle([Species.PHANPY]); // Turn 1 - thunder wave immunity test game.move.select(Moves.THUNDER_WAVE); @@ -262,8 +265,8 @@ describe("Moves - Magic Coat", () => { }); it("should bounce back a move before the accuracy check", async () => { - game.override.moveset([ Moves.SPORE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); const attacker = game.scene.getPlayerPokemon()!; @@ -274,8 +277,8 @@ describe("Moves - Magic Coat", () => { }); it("should take the accuracy of the magic bounce user into account", async () => { - game.override.moveset([ Moves.SPORE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); const opponent = game.scene.getEnemyPokemon()!; vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); diff --git a/test/moves/magnet_rise.test.ts b/test/moves/magnet_rise.test.ts index e4ceeaea929..725bbb99276 100644 --- a/test/moves/magnet_rise.test.ts +++ b/test/moves/magnet_rise.test.ts @@ -26,10 +26,10 @@ describe("Moves - Magnet Rise", () => { game.override.battleType("single"); game.override.starterSpecies(Species.MAGNEZONE); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN ]); + game.override.enemyMoveset([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); game.override.disableCrits(); game.override.enemyLevel(1); - game.override.moveset([ moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS ]); + game.override.moveset([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); it("MAGNET RISE", async () => { diff --git a/test/moves/make_it_rain.test.ts b/test/moves/make_it_rain.test.ts index 8de6777bddf..38460d99e63 100644 --- a/test/moves/make_it_rain.test.ts +++ b/test/moves/make_it_rain.test.ts @@ -8,7 +8,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; - describe("Moves - Make It Rain", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -26,7 +25,7 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.MAKE_IT_RAIN, Moves.SPLASH ]); + game.override.moveset([Moves.MAKE_IT_RAIN, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(Moves.SPLASH); @@ -35,7 +34,7 @@ describe("Moves - Make It Rain", () => { }); it("should only lower SPATK stat stage by 1 once in a double battle", async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -51,7 +50,7 @@ describe("Moves - Make It Rain", () => { game.override.enemyLevel(1); // ensures the enemy will faint game.override.battleType("single"); - await game.startBattle([ Species.CHARIZARD ]); + await game.startBattle([Species.CHARIZARD]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -67,7 +66,7 @@ describe("Moves - Make It Rain", () => { it("should reduce Sp. Atk. once after KOing two enemies", async () => { game.override.enemyLevel(1); // ensures the enemy will faint - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyField(); @@ -82,7 +81,7 @@ describe("Moves - Make It Rain", () => { }); it("should lower SPATK stat stage by 1 if it only hits the second target", async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/mat_block.test.ts b/test/moves/mat_block.test.ts index b9e66253058..ddfa29a53da 100644 --- a/test/moves/mat_block.test.ts +++ b/test/moves/mat_block.test.ts @@ -9,7 +9,6 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; - describe("Moves - Mat Block", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,79 +28,70 @@ describe("Moves - Mat Block", () => { game.override.battleType("double"); - game.override.moveset([ Moves.MAT_BLOCK, Moves.SPLASH ]); + game.override.moveset([Moves.MAT_BLOCK, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user and allies from attack moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + test("should protect the user and allies from attack moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.MAT_BLOCK); + game.move.select(Moves.MAT_BLOCK); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - test( - "should not protect the user and allies from status moves", - async () => { - game.override.enemyMoveset([ Moves.GROWL ]); + test("should not protect the user and allies from status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.MAT_BLOCK); + game.move.select(Moves.MAT_BLOCK); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2)); - } - ); + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2)); + }); - test( - "should fail when used after the first turn", - async () => { - await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + test("should fail when used after the first turn", async () => { + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - const leadStartingHp = leadPokemon.map(p => p.hp); + const leadStartingHp = leadPokemon.map(p => p.hp); - await game.phaseInterceptor.to(CommandPhase, false); - game.move.select(Moves.MAT_BLOCK); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.MAT_BLOCK, 1); + await game.phaseInterceptor.to(CommandPhase, false); + game.move.select(Moves.MAT_BLOCK); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.MAT_BLOCK, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.some((p, i) => p.hp < leadStartingHp[i])).toBeTruthy(); - } - ); + expect(leadPokemon.some((p, i) => p.hp < leadStartingHp[i])).toBeTruthy(); + }); }); diff --git a/test/moves/metal_burst.test.ts b/test/moves/metal_burst.test.ts index 7f7cfa841da..2cbc999436f 100644 --- a/test/moves/metal_burst.test.ts +++ b/test/moves/metal_burst.test.ts @@ -24,7 +24,7 @@ describe("Moves - Metal Burst", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.METAL_BURST, Moves.FISSURE, Moves.PRECIPICE_BLADES ]) + .moveset([Moves.METAL_BURST, Moves.FISSURE, Moves.PRECIPICE_BLADES]) .ability(Abilities.PURE_POWER) .startingLevel(10) .battleType("double") @@ -35,9 +35,9 @@ describe("Moves - Metal Burst", () => { }); it("should redirect target if intended target faints", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.FEEBAS]); - const [ , enemy2 ] = game.scene.getEnemyField(); + const [, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.METAL_BURST); game.move.select(Moves.FISSURE, 1, BattlerIndex.ENEMY); @@ -45,7 +45,7 @@ describe("Moves - Metal Burst", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); await game.move.forceHit(); @@ -56,9 +56,9 @@ describe("Moves - Metal Burst", () => { }); it("should not crash if both opponents faint before the move is used", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.ARCEUS ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.ARCEUS]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.METAL_BURST); game.move.select(Moves.PRECIPICE_BLADES, 1); @@ -66,7 +66,7 @@ describe("Moves - Metal Burst", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); await game.move.forceHit(); diff --git a/test/moves/metronome.test.ts b/test/moves/metronome.test.ts index a1253334f0f..15790777ed3 100644 --- a/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -28,7 +28,7 @@ describe("Moves - Metronome", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.METRONOME, Moves.SPLASH ]) + .moveset([Moves.METRONOME, Moves.SPLASH]) .battleType("single") .startingLevel(100) .starterSpecies(Species.REGIELEKI) @@ -79,9 +79,9 @@ describe("Moves - Metronome", () => { it("should only target ally for Aromatic Mist", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.REGIELEKI, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.REGIELEKI, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.AROMATIC_MIST); game.move.select(Moves.METRONOME, 0); diff --git a/test/moves/miracle_eye.test.ts b/test/moves/miracle_eye.test.ts index 068f4f70493..2dbfb962540 100644 --- a/test/moves/miracle_eye.test.ts +++ b/test/moves/miracle_eye.test.ts @@ -28,7 +28,7 @@ describe("Moves - Miracle Eye", () => { .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) - .moveset([ Moves.MIRACLE_EYE, Moves.CONFUSION ]); + .moveset([Moves.MIRACLE_EYE, Moves.CONFUSION]); }); it("should allow Psychic moves to hit Dark types", async () => { @@ -43,7 +43,7 @@ describe("Moves - Miracle Eye", () => { game.move.select(Moves.MIRACLE_EYE); await game.toNextTurn(); game.move.select(Moves.CONFUSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); diff --git a/test/moves/mirror_move.test.ts b/test/moves/mirror_move.test.ts index a6fe90548be..9178410adb2 100644 --- a/test/moves/mirror_move.test.ts +++ b/test/moves/mirror_move.test.ts @@ -25,7 +25,7 @@ describe("Moves - Mirror Move", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.MIRROR_MOVE, Moves.SPLASH ]) + .moveset([Moves.MIRROR_MOVE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -35,16 +35,14 @@ describe("Moves - Mirror Move", () => { }); it("should use the last move that the target used on the user", async () => { - game.override - .battleType("double") - .enemyMoveset([ Moves.TACKLE, Moves.GROWL ]); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + game.override.battleType("double").enemyMoveset([Moves.TACKLE, Moves.GROWL]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); game.move.select(Moves.MIRROR_MOVE, 0, BattlerIndex.ENEMY); // target's last move is Tackle, enemy should receive damage from Mirror Move copying Tackle game.move.select(Moves.SPLASH, 1); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); await game.forceEnemyMove(Moves.GROWL, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyField()[0].isFullHp()).toBeFalsy(); @@ -52,10 +50,10 @@ describe("Moves - Mirror Move", () => { it("should apply secondary effects of a move", async () => { game.override.enemyMoveset(Moves.ACID_SPRAY); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.MIRROR_MOVE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); @@ -63,20 +61,20 @@ describe("Moves - Mirror Move", () => { it("should be able to copy status moves", async () => { game.override.enemyMoveset(Moves.GROWL); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.MIRROR_MOVE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); }); it("should fail if the target has not used any moves", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.MIRROR_MOVE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); diff --git a/test/moves/mist.test.ts b/test/moves/mist.test.ts index a9b69bccc6c..2deb6f9b90d 100644 --- a/test/moves/mist.test.ts +++ b/test/moves/mist.test.ts @@ -23,7 +23,7 @@ describe("Moves - Mist", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.MIST, Moves.SPLASH ]) + .moveset([Moves.MIST, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("double") .disableCrits() @@ -33,7 +33,7 @@ describe("Moves - Mist", () => { }); it("should prevent the user's side from having stats lowered", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const playerPokemon = game.scene.getPlayerField(); diff --git a/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts index 5b36129fe2a..117fe513e17 100644 --- a/test/moves/moongeist_beam.test.ts +++ b/test/moves/moongeist_beam.test.ts @@ -23,7 +23,7 @@ describe("Moves - Moongeist Beam", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.MOONGEIST_BEAM, Moves.METRONOME ]) + .moveset([Moves.MOONGEIST_BEAM, Moves.METRONOME]) .ability(Abilities.BALL_FETCH) .startingLevel(200) .battleType("single") @@ -35,7 +35,7 @@ describe("Moves - Moongeist Beam", () => { // Also covers Photon Geyser and Sunsteel Strike it("should ignore enemy abilities", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); + await game.classicMode.startBattle([Species.MILOTIC]); const enemy = game.scene.getEnemyPokemon()!; @@ -47,8 +47,10 @@ describe("Moves - Moongeist Beam", () => { // Also covers Photon Geyser and Sunsteel Strike it("should not ignore enemy abilities when called by another move, such as metronome", async () => { - await game.classicMode.startBattle([ Species.MILOTIC ]); - vi.spyOn(allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0], "getMoveOverride").mockReturnValue(Moves.MOONGEIST_BEAM); + await game.classicMode.startBattle([Species.MILOTIC]); + vi.spyOn(allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0], "getMoveOverride").mockReturnValue( + Moves.MOONGEIST_BEAM, + ); game.move.select(Moves.METRONOME); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/multi_target.test.ts b/test/moves/multi_target.test.ts index a2379524c73..2b17929a5df 100644 --- a/test/moves/multi_target.test.ts +++ b/test/moves/multi_target.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Multi-target damage reduction", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,18 +31,18 @@ describe("Multi-target damage reduction", () => { .enemySpecies(Species.POLIWAG) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH ]) + .moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); }); it("should reduce d.gleam damage when multiple enemies but not tackle", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); const gleam1 = enemy1.getMaxHp() - enemy1.hp; @@ -59,7 +58,7 @@ describe("Multi-target damage reduction", () => { game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -77,14 +76,14 @@ describe("Multi-target damage reduction", () => { }); it("should reduce earthquake when more than one pokemon other than user is not fainted", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); const player2 = game.scene.getPlayerParty()[1]; - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.EARTHQUAKE); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -99,7 +98,7 @@ describe("Multi-target damage reduction", () => { game.move.select(Moves.EARTHQUAKE); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -117,7 +116,7 @@ describe("Multi-target damage reduction", () => { await game.toNextTurn(); game.move.select(Moves.EARTHQUAKE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); diff --git a/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts index 0a2392fe833..e1cef0084ee 100644 --- a/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -23,17 +23,18 @@ describe("Moves - Nightmare", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.RATTATA) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .enemyStatusEffect(StatusEffect.SLEEP) .startingLevel(5) - .moveset([ Moves.NIGHTMARE, Moves.SPLASH ]); + .moveset([Moves.NIGHTMARE, Moves.SPLASH]); }); it("lowers enemy hp by 1/4 each turn while asleep", async () => { - await game.classicMode.startBattle([ Species.HYPNO ]); + await game.classicMode.startBattle([Species.HYPNO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyMaxHP = enemyPokemon.hp; diff --git a/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts index e2c469e21f0..d8e3a949f08 100644 --- a/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -27,7 +27,7 @@ describe("Moves - Obstruct", () => { .enemyMoveset(Moves.TACKLE) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.OBSTRUCT ]) + .moveset([Moves.OBSTRUCT]) .starterSpecies(Species.FEEBAS); }); @@ -57,8 +57,7 @@ describe("Moves - Obstruct", () => { await game.phaseInterceptor.to("TurnEndPhase"); expect(player.isFullHp()).toBe(true); expect(enemy.getStatStage(Stat.DEF)).toBe(-2); - } - ); + }); it("protects from non-contact damaging moves and doesn't lower the opponent's defense by 2 stages", async () => { game.override.enemyMoveset(Moves.WATER_GUN); diff --git a/test/moves/octolock.test.ts b/test/moves/octolock.test.ts index 882a2357e1a..c9c5fd42f7e 100644 --- a/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -30,12 +30,12 @@ describe("Moves - Octolock", () => { .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .startingLevel(2000) - .moveset([ Moves.OCTOLOCK, Moves.SPLASH, Moves.TRICK_OR_TREAT ]) + .moveset([Moves.OCTOLOCK, Moves.SPLASH, Moves.TRICK_OR_TREAT]) .ability(Abilities.BALL_FETCH); }); it("lowers DEF and SPDEF stat stages of the target Pokemon by 1 each turn", async () => { - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -56,7 +56,7 @@ describe("Moves - Octolock", () => { it("if target pokemon has BIG_PECKS, should only lower SPDEF stat stage by 1", async () => { game.override.enemyAbility(Abilities.BIG_PECKS); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -70,7 +70,7 @@ describe("Moves - Octolock", () => { it("if target pokemon has WHITE_SMOKE, should not reduce any stat stages", async () => { game.override.enemyAbility(Abilities.WHITE_SMOKE); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -84,7 +84,7 @@ describe("Moves - Octolock", () => { it("if target pokemon has CLEAR_BODY, should not reduce any stat stages", async () => { game.override.enemyAbility(Abilities.CLEAR_BODY); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -97,7 +97,7 @@ describe("Moves - Octolock", () => { }); it("traps the target pokemon", async () => { - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -113,7 +113,7 @@ describe("Moves - Octolock", () => { it("does not work on ghost type pokemon", async () => { game.override.enemyMoveset(Moves.OCTOLOCK); - await game.classicMode.startBattle([ Species.GASTLY ]); + await game.classicMode.startBattle([Species.GASTLY]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -130,7 +130,7 @@ describe("Moves - Octolock", () => { }); it("does not work on pokemon with added ghost type via Trick-or-Treat", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/order_up.test.ts b/test/moves/order_up.test.ts index 339f3f31584..516f7f625a3 100644 --- a/test/moves/order_up.test.ts +++ b/test/moves/order_up.test.ts @@ -43,34 +43,35 @@ describe("Moves - Order Up", () => { it.each([ { formIndex: 0, formName: "Curly", stat: Stat.ATK, statName: "Attack" }, { formIndex: 1, formName: "Droopy", stat: Stat.DEF, statName: "Defense" }, - { formIndex: 2, formName: "Stretchy", stat: Stat.SPD, statName: "Speed" } - ])("should raise the user's $statName when the user is commanded by a $formName Tatsugiri", async ({ formIndex, stat }) => { - game.override.starterForms({ [Species.TATSUGIRI]: formIndex }); + { formIndex: 2, formName: "Stretchy", stat: Stat.SPD, statName: "Speed" }, + ])( + "should raise the user's $statName when the user is commanded by a $formName Tatsugiri", + async ({ formIndex, stat }) => { + game.override.starterForms({ [Species.TATSUGIRI]: formIndex }); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); - expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); - expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); - game.move.select(Moves.ORDER_UP, 1, BattlerIndex.ENEMY); - expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + game.move.select(Moves.ORDER_UP, 1, BattlerIndex.ENEMY); + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - const affectedStats: EffectiveStat[] = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; - affectedStats.forEach(st => expect(dondozo.getStatStage(st)).toBe(st === stat ? 3 : 2)); - }); + const affectedStats: EffectiveStat[] = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; + 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(Abilities.SHEER_FORCE) - .starterForms({ [Species.TATSUGIRI]: 0 }); + game.override.passiveAbility(Abilities.SHEER_FORCE).starterForms({ [Species.TATSUGIRI]: 0 }); - await game.classicMode.startBattle([ Species.TATSUGIRI, Species.DONDOZO ]); + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); - const [ tatsugiri, dondozo ] = game.scene.getPlayerField(); + const [tatsugiri, dondozo] = game.scene.getPlayerField(); expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); diff --git a/test/moves/parting_shot.test.ts b/test/moves/parting_shot.test.ts index 43a6d833949..699d960f882 100644 --- a/test/moves/parting_shot.test.ts +++ b/test/moves/parting_shot.test.ts @@ -10,7 +10,6 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { MessagePhase } from "#app/phases/message-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; - describe("Moves - Parting Shot", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,58 +27,48 @@ describe("Moves - Parting Shot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.PARTING_SHOT, Moves.SPLASH ]); + game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); game.override.startingLevel(5); game.override.enemyLevel(5); - }); - test( - "Parting Shot when buffed by prankster should fail against dark types", - async () => { - game.override - .enemySpecies(Species.POOCHYENA) - .ability(Abilities.PRANKSTER); - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + test("Parting Shot when buffed by prankster should fail against dark types", async () => { + game.override.enemySpecies(Species.POOCHYENA).ability(Abilities.PRANKSTER); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); - game.move.select(Moves.PARTING_SHOT); + game.move.select(Moves.PARTING_SHOT); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); + }); - test( - "Parting shot should fail against good as gold ability", - async () => { - game.override - .enemySpecies(Species.GHOLDENGO) - .enemyAbility(Abilities.GOOD_AS_GOLD); - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + test("Parting shot should fail against good as gold ability", async () => { + game.override.enemySpecies(Species.GHOLDENGO).enemyAbility(Abilities.GOOD_AS_GOLD); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); - game.move.select(Moves.PARTING_SHOT); + game.move.select(Moves.PARTING_SHOT); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); + }); - it.todo( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot should fail if target is -6/-6 de-buffed", async () => { - game.override.moveset([ Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH ]); - await game.startBattle([ Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA ]); + game.override.moveset([Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH]); + await game.startBattle([Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA]); // use Memento 3 times to debuff enemy game.move.select(Moves.MEMENTO); @@ -114,17 +103,15 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-6); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.todo( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot shouldn't allow switch out when mist is active", async () => { - game.override - .enemySpecies(Species.ALTARIA) - .enemyAbility(Abilities.NONE) - .enemyMoveset([ Moves.MIST ]); - await game.startBattle([ Species.SNORLAX, Species.MEOWTH ]); + game.override.enemySpecies(Species.ALTARIA).enemyAbility(Abilities.NONE).enemyMoveset([Moves.MIST]); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -135,16 +122,15 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.todo( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot shouldn't allow switch out against clear body ability", async () => { - game.override - .enemySpecies(Species.TENTACOOL) - .enemyAbility(Abilities.CLEAR_BODY); - await game.startBattle([ Species.SNORLAX, Species.MEOWTH ]); + game.override.enemySpecies(Species.TENTACOOL).enemyAbility(Abilities.CLEAR_BODY); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -155,13 +141,14 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.todo( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot should de-buff and not fail if no party available to switch - party size 1", async () => { - await game.startBattle([ Species.MURKROW ]); + await game.startBattle([Species.MURKROW]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -172,13 +159,14 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.todo( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot regularly not fail if no party available to switch - party fainted", async () => { - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); game.move.select(Moves.SPLASH); // intentionally kill party pokemon, switch to second slot (now 1 party mon is fainted) @@ -195,6 +183,6 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MEOWTH); - } + }, ); }); diff --git a/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts index 276b5fd999a..fe19ab4a460 100644 --- a/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -24,7 +24,7 @@ describe("Moves - Plasma Fists", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.PLASMA_FISTS, Moves.TACKLE ]) + .moveset([Moves.PLASMA_FISTS, Moves.TACKLE]) .battleType("double") .startingLevel(100) .enemySpecies(Species.DUSCLOPS) @@ -34,7 +34,7 @@ describe("Moves - Plasma Fists", () => { }); it("should convert all subsequent Normal-type attacks to Electric-type", async () => { - await game.classicMode.startBattle([ Species.DUSCLOPS, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.DUSCLOPS, Species.BLASTOISE]); const field = game.scene.getField(true); field.forEach(p => vi.spyOn(p, "getMoveType")); @@ -45,7 +45,7 @@ describe("Moves - Plasma Fists", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase", false); @@ -56,11 +56,9 @@ describe("Moves - Plasma Fists", () => { }); it("should not affect Normal-type attacks boosted by Pixilate", async () => { - game.override - .battleType("single") - .enemyAbility(Abilities.PIXILATE); + game.override.battleType("single").enemyAbility(Abilities.PIXILATE); - await game.classicMode.startBattle([ Species.ONIX ]); + await game.classicMode.startBattle([Species.ONIX]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -68,7 +66,7 @@ describe("Moves - Plasma Fists", () => { game.move.select(Moves.PLASMA_FISTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.FAIRY); @@ -76,12 +74,9 @@ describe("Moves - Plasma Fists", () => { }); it("should affect moves that become Normal type due to Normalize", async () => { - game.override - .battleType("single") - .enemyAbility(Abilities.NORMALIZE) - .enemyMoveset(Moves.WATER_GUN); + game.override.battleType("single").enemyAbility(Abilities.NORMALIZE).enemyMoveset(Moves.WATER_GUN); - await game.classicMode.startBattle([ Species.DUSCLOPS ]); + await game.classicMode.startBattle([Species.DUSCLOPS]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -89,7 +84,7 @@ describe("Moves - Plasma Fists", () => { game.move.select(Moves.PLASMA_FISTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); diff --git a/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts index 62606489d0b..c866d15357c 100644 --- a/test/moves/pledge_moves.test.ts +++ b/test/moves/pledge_moves.test.ts @@ -19,7 +19,7 @@ describe("Moves - Pledge Moves", () => { beforeAll(() => { phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS + type: Phaser.HEADLESS, }); }); @@ -32,306 +32,270 @@ describe("Moves - Pledge Moves", () => { game.override .battleType("double") .startingLevel(100) - .moveset([ Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE, Moves.SPLASH ]) + .moveset([Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE, Moves.SPLASH]) .enemySpecies(Species.SNORLAX) .enemyLevel(100) .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH); }); - it( - "Fire Pledge - should be an 80-power Fire-type attack outside of combination", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Fire Pledge - should be an 80-power Fire-type attack outside of combination", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); - const playerPokemon = game.scene.getPlayerField(); - vi.spyOn(playerPokemon[0], "getMoveType"); + const playerPokemon = game.scene.getPlayerField(); + vi.spyOn(playerPokemon[0], "getMoveType"); - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); - } - ); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + }); - it( - "Fire Pledge - should not combine with an ally using Fire Pledge", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Fire Pledge - should not combine with an ally using Fire Pledge", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); - const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => vi.spyOn(p, "getMoveType")); + const playerPokemon = game.scene.getPlayerField(); + playerPokemon.forEach(p => vi.spyOn(p, "getMoveType")); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); + + it("Fire Pledge - should not combine with an enemy's Pledge move", async () => { + game.override.battleType("single").enemyMoveset(Moves.GRASS_PLEDGE); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FIRE_PLEDGE); + + await game.toNextTurn(); + + // Neither Pokemon should defer their move's effects as they would + // if they combined moves, so both should be damaged. + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(game.scene.arena.getTag(ArenaTagType.FIRE_GRASS_PLEDGE)).toBeUndefined(); + }); + + it("Grass Pledge - should combine with Fire Pledge to form a 150-power Fire-type attack that creates a 'sea of fire'", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const grassPledge = allMoves[Moves.GRASS_PLEDGE]; + vi.spyOn(grassPledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + vi.spyOn(playerPokemon[1], "getMoveType"); + const baseDmgMock = vi.spyOn(enemyPokemon[0], "getBaseDamage"); + + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { await game.phaseInterceptor.to("MoveEndPhase"); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); - - await game.phaseInterceptor.to("BerryPhase", false); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); - - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); } - ); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + expect(grassPledge.calculateBattlePower).toHaveLastReturnedWith(150); - it( - "Fire Pledge - should not combine with an enemy's Pledge move", - async () => { - game.override - .battleType("single") - .enemyMoveset(Moves.GRASS_PLEDGE); + const baseDmg = baseDmgMock.mock.results[baseDmgMock.mock.results.length - 1].value; + expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5)); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked + expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + const enemyStartingHp = enemyPokemon.map(p => p.hp); + await game.toNextTurn(); + enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(toDmgValue(p.getMaxHp() / 8))); + }); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + it("Fire Pledge - should combine with Water Pledge to form a 150-power Water-type attack that creates a 'rainbow'", async () => { + game.override.moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.FIERY_DANCE, Moves.SPLASH]); - game.move.select(Moves.FIRE_PLEDGE); + await game.classicMode.startBattle([Species.BLASTOISE, Species.VENUSAUR]); - await game.toNextTurn(); + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); - // Neither Pokemon should defer their move's effects as they would - // if they combined moves, so both should be damaged. - expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(game.scene.arena.getTag(ArenaTagType.FIRE_GRASS_PLEDGE)).toBeUndefined(); - } - ); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - it( - "Grass Pledge - should combine with Fire Pledge to form a 150-power Fire-type attack that creates a 'sea of fire'", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + vi.spyOn(playerPokemon[1], "getMoveType"); - const grassPledge = allMoves[Moves.GRASS_PLEDGE]; - vi.spyOn(grassPledge, "calculateBattlePower"); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - vi.spyOn(playerPokemon[1], "getMoveType"); - const baseDmgMock = vi.spyOn(enemyPokemon[0], "getBaseDamage"); - - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); - expect(grassPledge.calculateBattlePower).toHaveLastReturnedWith(150); - - const baseDmg = baseDmgMock.mock.results[baseDmgMock.mock.results.length - 1].value; - expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5)); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked - expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); - - const enemyStartingHp = enemyPokemon.map(p => p.hp); - await game.toNextTurn(); - enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(toDmgValue(p.getMaxHp() / 8))); - } - ); - - it( - "Fire Pledge - should combine with Water Pledge to form a 150-power Water-type attack that creates a 'rainbow'", - async () => { - game.override.moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.FIERY_DANCE, Moves.SPLASH ]); - - await game.classicMode.startBattle([ Species.BLASTOISE, Species.VENUSAUR ]); - - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - vi.spyOn(playerPokemon[1], "getMoveType"); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); - - await game.toNextTurn(); - - game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { await game.phaseInterceptor.to("MoveEndPhase"); - - // Rainbow effect should increase Fiery Dance's chance of raising Sp. Atk to 100% - expect(playerPokemon[0].getStatStage(Stat.SPATK)).toBe(1); } - ); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked + expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); - it( - "Water Pledge - should combine with Grass Pledge to form a 150-power Grass-type attack that creates a 'swamp'", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + await game.toNextTurn(); - const waterPledge = allMoves[Moves.WATER_PLEDGE]; - vi.spyOn(waterPledge, "calculateBattlePower"); + game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - const enemyStartingSpd = enemyPokemon.map(p => p.getEffectiveStat(Stat.SPD)); + // Rainbow effect should increase Fiery Dance's chance of raising Sp. Atk to 100% + expect(playerPokemon[0].getStatStage(Stat.SPATK)).toBe(1); + }); - vi.spyOn(playerPokemon[1], "getMoveType"); + it("Water Pledge - should combine with Grass Pledge to form a 150-power Grass-type attack that creates a 'swamp'", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); + const waterPledge = allMoves[Moves.WATER_PLEDGE]; + vi.spyOn(waterPledge, "calculateBattlePower"); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + const enemyStartingSpd = enemyPokemon.map(p => p.getEffectiveStat(Stat.SPD)); - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.GRASS); - expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + vi.spyOn(playerPokemon[1], "getMoveType"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); - enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4))); + game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); } - ); - it( - "Pledge Moves - should alter turn order when used in combination", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.GRASS); + expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - const enemyPokemon = game.scene.getEnemyField(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); + enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4))); + }); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + it("Pledge Moves - should alter turn order when used in combination", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); - // PLAYER_2 should act with a combined move immediately after PLAYER as the second move in the turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); + // PLAYER_2 should act with a combined move immediately after PLAYER as the second move in the turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); } - ); + expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); - it( - "Pledge Moves - 'rainbow' effect should not stack with Serene Grace when applied to flinching moves", - async () => { - game.override - .ability(Abilities.SERENE_GRACE) - .moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.IRON_HEAD, Moves.SPLASH ]); + it("Pledge Moves - 'rainbow' effect should not stack with Serene Grace when applied to flinching moves", async () => { + game.override + .ability(Abilities.SERENE_GRACE) + .moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.IRON_HEAD, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const ironHeadFlinchAttr = allMoves[Moves.IRON_HEAD].getAttrs(FlinchAttr)[0]; - vi.spyOn(ironHeadFlinchAttr, "getMoveChance"); + const ironHeadFlinchAttr = allMoves[Moves.IRON_HEAD].getAttrs(FlinchAttr)[0]; + vi.spyOn(ironHeadFlinchAttr, "getMoveChance"); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); - game.move.select(Moves.IRON_HEAD, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.IRON_HEAD, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(ironHeadFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); - } - ); + expect(ironHeadFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); + }); - it( - "Pledge Moves - should have no effect when the second ally's move is cancelled", - async () => { - game.override - .enemyMoveset([ Moves.SPLASH, Moves.SPORE ]); + it("Pledge Moves - should have no effect when the second ally's move is cancelled", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.SPORE]); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.SPORE, BattlerIndex.PLAYER_2); - await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPORE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2]); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - enemyPokemon.forEach((p) => expect(p.hp).toBe(p.getMaxHp())); - } - ); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - it( - "Pledge Moves - should ignore redirection from another Pokemon's Storm Drain", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Pledge Moves - should ignore redirection from another Pokemon's Storm Drain", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); - vi.spyOn(enemyPokemon[1], "getAbility").mockReturnValue(allAbilities[Abilities.STORM_DRAIN]); + const enemyPokemon = game.scene.getEnemyField(); + vi.spyOn(enemyPokemon[1], "getAbility").mockReturnValue(allAbilities[Abilities.STORM_DRAIN]); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].getStatStage(Stat.SPATK)).toBe(0); - } - ); + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].getStatStage(Stat.SPATK)).toBe(0); + }); - it( - "Pledge Moves - should not ignore redirection from another Pokemon's Follow Me", - async () => { - game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Pledge Moves - should not ignore redirection from another Pokemon's Follow Me", async () => { + game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.SPLASH]); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); }); diff --git a/test/moves/powder.test.ts b/test/moves/powder.test.ts index b43772bd703..522b0b74ca7 100644 --- a/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -35,284 +35,245 @@ describe("Moves - Powder", () => { .enemyMoveset(Moves.EMBER) .enemyAbility(Abilities.INSOMNIA) .startingLevel(100) - .moveset([ Moves.POWDER, Moves.SPLASH, Moves.FIERY_DANCE, Moves.ROAR ]); + .moveset([Moves.POWDER, Moves.SPLASH, Moves.FIERY_DANCE, Moves.ROAR]); }); - it( - "should cancel the target's Fire-type move, damage the target, and still consume the target's PP", - async () => { - // Cannot use enemy moveset override for this test, since it interferes with checking PP - game.override.enemyMoveset([]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should cancel the target's Fire-type move, damage the target, and still consume the target's PP", async () => { + // Cannot use enemy moveset override for this test, since it interferes with checking PP + game.override.enemyMoveset([]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.moveset = [ new PokemonMove(Moves.EMBER) ]; + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.moveset = [new PokemonMove(Moves.EMBER)]; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - expect(enemyPokemon.moveset[0]!.ppUsed).toBe(1); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + expect(enemyPokemon.moveset[0]!.ppUsed).toBe(1); - await game.toNextTurn(); + await game.toNextTurn(); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - expect(enemyPokemon.moveset[0]!.ppUsed).toBe(2); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + expect(enemyPokemon.moveset[0]!.ppUsed).toBe(2); + }); - it( - "should have no effect against Grass-type Pokemon", - async () => { - game.override.enemySpecies(Species.AMOONGUSS); + it("should have no effect against Grass-type Pokemon", async () => { + game.override.enemySpecies(Species.AMOONGUSS); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should have no effect against Pokemon with Overcoat", - async () => { - game.override.enemyAbility(Abilities.OVERCOAT); + it("should have no effect against Pokemon with Overcoat", async () => { + game.override.enemyAbility(Abilities.OVERCOAT); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should not damage the target if the target has Magic Guard", - async () => { - game.override.enemyAbility(Abilities.MAGIC_GUARD); + it("should not damage the target if the target has Magic Guard", async () => { + game.override.enemyAbility(Abilities.MAGIC_GUARD); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should not damage the target if Primordial Sea is active", - async () => { - game.override.enemyAbility(Abilities.PRIMORDIAL_SEA); + it("should not damage the target if Primordial Sea is active", async () => { + game.override.enemyAbility(Abilities.PRIMORDIAL_SEA); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should not prevent the target from thawing out with Flame Wheel", - async () => { - game.override - .enemyMoveset(Array(4).fill(Moves.FLAME_WHEEL)) - .enemyStatusEffect(StatusEffect.FREEZE); + it("should not prevent the target from thawing out with Flame Wheel", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.FLAME_WHEEL)).enemyStatusEffect(StatusEffect.FREEZE); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.FREEZE); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.FREEZE); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + }); - it( - "should not allow a target with Protean to change to Fire type", - async () => { - game.override.enemyAbility(Abilities.PROTEAN); + it("should not allow a target with Protean to change to Fire type", async () => { + game.override.enemyAbility(Abilities.PROTEAN); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(enemyPokemon.summonData?.types).not.toBe(PokemonType.FIRE); - }); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(enemyPokemon.summonData?.types).not.toBe(PokemonType.FIRE); + }); - it( - "should cancel Fire-type moves generated by the target's Dancer ability", - async () => { - game.override - .battleType("double") - .enemySpecies(Species.BLASTOISE) - .enemyAbility(Abilities.DANCER); + it("should cancel Fire-type moves generated by the target's Dancer ability", async () => { + game.override.battleType("double").enemySpecies(Species.BLASTOISE).enemyAbility(Abilities.DANCER); - await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD, Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - // Turn 1: Roar away 1 opponent - game.move.select(Moves.ROAR, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); - await game.toNextTurn(); // Requires game.toNextTurn() twice due to double battle + // Turn 1: Roar away 1 opponent + game.move.select(Moves.ROAR, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + await game.toNextTurn(); // Requires game.toNextTurn() twice due to double battle - // Turn 2: Enemy should activate Powder twice: From using Ember, and from copying Fiery Dance via Dancer - playerPokemon.hp = playerPokemon.getMaxHp(); - game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.POWDER, 1, BattlerIndex.ENEMY); + // Turn 2: Enemy should activate Powder twice: From using Ember, and from copying Fiery Dance via Dancer + playerPokemon.hp = playerPokemon.getMaxHp(); + game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.POWDER, 1, BattlerIndex.ENEMY); - await game.phaseInterceptor.to(MoveEffectPhase); - const enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to(MoveEffectPhase); + const enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); + // player should not take damage + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + // enemy should have taken damage from player's Fiery Dance + 2 Powder procs + expect(enemyPokemon.hp).toBe( + enemyStartingHp - playerPokemon.turnData.totalDamageDealt - 2 * Math.floor(enemyPokemon.getMaxHp() / 4), + ); + }); - // player should not take damage - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); - // enemy should have taken damage from player's Fiery Dance + 2 Powder procs - expect(enemyPokemon.hp).toBe(enemyStartingHp - playerPokemon.turnData.totalDamageDealt - 2 * Math.floor(enemyPokemon.getMaxHp() / 4)); - }); + it("should cancel Fiery Dance, then prevent it from triggering Dancer", async () => { + game.override.ability(Abilities.DANCER).enemyMoveset(Moves.FIERY_DANCE); - it( - "should cancel Fiery Dance, then prevent it from triggering Dancer", - async () => { - game.override.ability(Abilities.DANCER) - .enemyMoveset(Moves.FIERY_DANCE); + await game.classicMode.startBattle([Species.CHARIZARD]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + game.move.select(Moves.POWDER); - game.move.select(Moves.POWDER); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + expect(playerPokemon.getLastXMoves()[0].move).toBe(Moves.POWDER); + }); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - expect(playerPokemon.getLastXMoves()[0].move).toBe(Moves.POWDER); - }); + it("should cancel Revelation Dance if it becomes a Fire-type move", async () => { + game.override.enemySpecies(Species.CHARIZARD).enemyMoveset(Array(4).fill(Moves.REVELATION_DANCE)); - it( - "should cancel Revelation Dance if it becomes a Fire-type move", - async () => { - game.override - .enemySpecies(Species.CHARIZARD) - .enemyMoveset(Array(4).fill(Moves.REVELATION_DANCE)); + await game.classicMode.startBattle([Species.CHARIZARD]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.POWDER); + game.move.select(Moves.POWDER); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - }); - - it( - "should cancel Shell Trap and damage the target, even if the move would fail", - async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SHELL_TRAP)); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + }); - game.move.select(Moves.POWDER); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - }); - - it( - "should cancel Grass Pledge if used after ally's Fire Pledge", - async () => { - game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE ]) - .battleType("double"); - - await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - await game.forceEnemyMove(Moves.GRASS_PLEDGE, BattlerIndex.PLAYER); - await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY ]); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - }); - - it( - "should cancel Fire Pledge if used before ally's Water Pledge", - async () => { - game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE ]) - .battleType("double"); - - await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + it("should cancel Shell Trap and damage the target, even if the move would fail", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SHELL_TRAP)); - game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); - await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); - }); - - it( - "should NOT cancel Fire Pledge if used after ally's Water Pledge", - async () => { - game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE ]) - .battleType("double"); - - await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); - await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY ]); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - }); + await game.classicMode.startBattle([Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + }); + + it("should cancel Grass Pledge if used after ally's Fire Pledge", async () => { + game.override.enemyMoveset([Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE]).battleType("double"); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.CHARIZARD]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.GRASS_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + }); + + it("should cancel Fire Pledge if used before ally's Water Pledge", async () => { + game.override.enemyMoveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE]).battleType("double"); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.CHARIZARD]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil((3 * enemyPokemon.getMaxHp()) / 4)); + }); + + it("should NOT cancel Fire Pledge if used after ally's Water Pledge", async () => { + game.override.enemyMoveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE]).battleType("double"); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.CHARIZARD]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); }); diff --git a/test/moves/power_shift.test.ts b/test/moves/power_shift.test.ts index bb98d8cf3ed..fbc6d732d30 100644 --- a/test/moves/power_shift.test.ts +++ b/test/moves/power_shift.test.ts @@ -22,7 +22,7 @@ describe("Moves - Power Shift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.POWER_SHIFT, Moves.BULK_UP ]) + .moveset([Moves.POWER_SHIFT, Moves.BULK_UP]) .battleType("single") .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) @@ -30,7 +30,7 @@ describe("Moves - Power Shift", () => { }); it("switches the user's raw Attack stat with its raw Defense stat", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/power_split.test.ts b/test/moves/power_split.test.ts index 69ea92c69ef..9150a707ad5 100644 --- a/test/moves/power_split.test.ts +++ b/test/moves/power_split.test.ts @@ -28,15 +28,13 @@ describe("Moves - Power Split", () => { .enemyAbility(Abilities.NONE) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.POWER_SPLIT ]) + .moveset([Moves.POWER_SPLIT]) .ability(Abilities.NONE); }); it("should average the user's ATK and SPATK stats with those of the target", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -55,10 +53,8 @@ describe("Moves - Power Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); - await game.startBattle([ - Species.INDEEDEE - ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/power_swap.test.ts b/test/moves/power_swap.test.ts index 637714f1277..d6f5e782e66 100644 --- a/test/moves/power_swap.test.ts +++ b/test/moves/power_swap.test.ts @@ -29,14 +29,12 @@ describe("Moves - Power Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.POWER_SWAP ]) + .moveset([Moves.POWER_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's ATK and SPATK stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.INDEEDEE - ]); + await game.classicMode.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/power_trick.test.ts b/test/moves/power_trick.test.ts index e60172b5304..0cd849bbcc5 100644 --- a/test/moves/power_trick.test.ts +++ b/test/moves/power_trick.test.ts @@ -30,12 +30,12 @@ describe("Moves - Power Trick", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.POWER_TRICK ]) + .moveset([Moves.POWER_TRICK]) .ability(Abilities.BALL_FETCH); }); it("swaps the user's ATK and DEF stats", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const player = game.scene.getPlayerPokemon()!; const baseATK = player.getStat(Stat.ATK, false); @@ -51,7 +51,7 @@ describe("Moves - Power Trick", () => { }); it("resets initial ATK and DEF stat swap when used consecutively", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const player = game.scene.getPlayerPokemon()!; const baseATK = player.getStat(Stat.ATK, false); @@ -71,8 +71,8 @@ describe("Moves - Power Trick", () => { }); it("should pass effect when using BATON_PASS", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); - await game.override.moveset([ Moves.POWER_TRICK, Moves.BATON_PASS ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + await game.override.moveset([Moves.POWER_TRICK, Moves.BATON_PASS]); const player = game.scene.getPlayerPokemon()!; player.addTag(BattlerTagType.POWER_TRICK); @@ -92,8 +92,8 @@ describe("Moves - Power Trick", () => { }); it("should remove effect after using Transform", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); - await game.override.moveset([ Moves.POWER_TRICK, Moves.TRANSFORM ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + await game.override.moveset([Moves.POWER_TRICK, Moves.TRANSFORM]); const player = game.scene.getPlayerPokemon()!; player.addTag(BattlerTagType.POWER_TRICK); diff --git a/test/moves/protect.test.ts b/test/moves/protect.test.ts index 7f5484ab7c9..d50c490f7d3 100644 --- a/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -10,7 +10,6 @@ import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import { BattlerIndex } from "#app/battle"; import { MoveResult } from "#app/field/pokemon"; - describe("Moves - Protect", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,104 +29,89 @@ describe("Moves - Protect", () => { game.override.battleType("single"); - game.override.moveset([ Moves.PROTECT ]); + game.override.moveset([Moves.PROTECT]); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user from attacks", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + test("should protect the user from attacks", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.PROTECT); + game.move.select(Moves.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); - test( - "should prevent secondary effects from the opponent's attack", - async () => { - game.override.enemyMoveset([ Moves.CEASELESS_EDGE ]); - vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); + test("should prevent secondary effects from the opponent's attack", async () => { + game.override.enemyMoveset([Moves.CEASELESS_EDGE]); + vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.PROTECT); + game.move.select(Moves.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); + }); - test( - "should protect the user from status moves", - async () => { - game.override.enemyMoveset([ Moves.CHARM ]); + test("should protect the user from status moves", async () => { + game.override.enemyMoveset([Moves.CHARM]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.PROTECT); + game.move.select(Moves.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - } - ); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); - test( - "should stop subsequent hits of a multi-hit move", - async () => { - game.override.enemyMoveset([ Moves.TACHYON_CUTTER ]); + test("should stop subsequent hits of a multi-hit move", async () => { + game.override.enemyMoveset([Moves.TACHYON_CUTTER]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.PROTECT); + game.move.select(Moves.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.turnData.hitCount).toBe(1); - } - ); + expect(leadPokemon.hp).toBe(leadPokemon.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([ Moves.PROTECT ]); + test("should fail if the user is the last to move in the turn", async () => { + game.override.enemyMoveset([Moves.PROTECT]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.PROTECT); + game.move.select(Moves.PROTECT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); }); diff --git a/test/moves/psycho_shift.test.ts b/test/moves/psycho_shift.test.ts index d5890a3af0b..0a82189d201 100644 --- a/test/moves/psycho_shift.test.ts +++ b/test/moves/psycho_shift.test.ts @@ -23,7 +23,7 @@ describe("Moves - Psycho Shift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.PSYCHO_SHIFT ]) + .moveset([Moves.PSYCHO_SHIFT]) .ability(Abilities.BALL_FETCH) .statusEffect(StatusEffect.POISON) .battleType("single") @@ -35,7 +35,7 @@ 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([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); const enemyPokemon = game.scene.getEnemyPokemon(); diff --git a/test/moves/purify.test.ts b/test/moves/purify.test.ts index eba8e9d851f..30d9df8ff67 100644 --- a/test/moves/purify.test.ts +++ b/test/moves/purify.test.ts @@ -9,7 +9,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Moves - Purify", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,49 +29,42 @@ describe("Moves - Purify", () => { game.override.starterSpecies(Species.PYUKUMUKU); game.override.startingLevel(10); - game.override.moveset([ Moves.PURIFY, Moves.SIZZLY_SLIDE ]); + game.override.moveset([Moves.PURIFY, Moves.SIZZLY_SLIDE]); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyLevel(10); - game.override.enemyMoveset([ Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); - test( - "Purify heals opponent status effect and restores user hp", - async () => { - await game.startBattle(); + test("Purify heals opponent status effect and restores user hp", async () => { + await game.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.hp = playerPokemon.getMaxHp() - 1; - enemyPokemon.status = new Status(StatusEffect.BURN); + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + enemyPokemon.status = new Status(StatusEffect.BURN); - game.move.select(Moves.PURIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEndPhase); + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEndPhase); - expect(enemyPokemon.status).toBeNull(); - expect(playerPokemon.isFullHp()).toBe(true); - }, - ); + expect(enemyPokemon.status).toBeNull(); + expect(playerPokemon.isFullHp()).toBe(true); + }); - test( - "Purify does not heal if opponent doesnt have any status effect", - async () => { - await game.startBattle(); + test("Purify does not heal if opponent doesnt have any status effect", async () => { + await game.startBattle(); - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.hp = playerPokemon.getMaxHp() - 1; - const playerInitialHp = playerPokemon.hp; + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + const playerInitialHp = playerPokemon.hp; - game.move.select(Moves.PURIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEndPhase); - - expect(playerPokemon.hp).toBe(playerInitialHp); - }, - ); + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEndPhase); + expect(playerPokemon.hp).toBe(playerInitialHp); + }); }); diff --git a/test/moves/quash.test.ts b/test/moves/quash.test.ts index dd91820a8db..f85dbd89517 100644 --- a/test/moves/quash.test.ts +++ b/test/moves/quash.test.ts @@ -29,13 +29,13 @@ describe("Moves - Quash", () => { .enemyLevel(1) .enemySpecies(Species.SLOWPOKE) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.RAIN_DANCE, Moves.SPLASH ]) + .enemyMoveset([Moves.RAIN_DANCE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.QUASH, Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH ]); + .moveset([Moves.QUASH, Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH]); }); it("makes the target move last in a turn, ignoring priority", async () => { - await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); game.move.select(Moves.QUASH, 0, BattlerIndex.PLAYER_2); game.move.select(Moves.SUNNY_DAY, 1); @@ -48,7 +48,7 @@ describe("Moves - Quash", () => { }); it("fails if the target has already moved", async () => { - await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.QUASH, 1, BattlerIndex.PLAYER); @@ -59,10 +59,9 @@ describe("Moves - Quash", () => { }); it("makes multiple quashed targets move in speed order at the end of the turn", async () => { - game.override.enemySpecies(Species.NINJASK) - .enemyLevel(100); + game.override.enemySpecies(Species.NINJASK).enemyLevel(100); - await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); // both users are quashed - rattata is slower so sun should be up at end of turn game.move.select(Moves.RAIN_DANCE, 0); @@ -76,9 +75,9 @@ describe("Moves - Quash", () => { }); it("respects trick room", async () => { - game.override.enemyMoveset([ Moves.RAIN_DANCE, Moves.SPLASH, Moves.TRICK_ROOM ]); + game.override.enemyMoveset([Moves.RAIN_DANCE, Moves.SPLASH, Moves.TRICK_ROOM]); - await game.classicMode.startBattle([ Species.ACCELGOR, Species.RATTATA ]); + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 1); @@ -95,5 +94,4 @@ describe("Moves - Quash", () => { await game.phaseInterceptor.to("TurnEndPhase", false); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.RAIN); }); - }); diff --git a/test/moves/quick_guard.test.ts b/test/moves/quick_guard.test.ts index c326e77d057..22d4a5078ac 100644 --- a/test/moves/quick_guard.test.ts +++ b/test/moves/quick_guard.test.ts @@ -8,7 +8,6 @@ import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle"; import { MoveResult } from "#app/field/pokemon"; - describe("Moves - Quick Guard", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,90 +27,78 @@ describe("Moves - Quick Guard", () => { game.override.battleType("double"); - game.override.moveset([ Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME ]); + game.override.moveset([Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user and allies from priority moves", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + test("should protect the user and allies from priority moves", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); + playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - test( - "should protect the user and allies from Prankster-boosted moves", - async () => { - game.override.enemyAbility(Abilities.PRANKSTER); - game.override.enemyMoveset([ Moves.GROWL ]); + test("should protect the user and allies from Prankster-boosted moves", async () => { + game.override.enemyAbility(Abilities.PRANKSTER); + game.override.enemyMoveset([Moves.GROWL]); - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); + const playerPokemon = game.scene.getPlayerField(); - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); + playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); - test( - "should stop subsequent hits of a multi-hit priority move", - async () => { - game.override.enemyMoveset([ Moves.WATER_SHURIKEN ]); + test("should stop subsequent hits of a multi-hit priority move", async () => { + game.override.enemyMoveset([Moves.WATER_SHURIKEN]); - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.FOLLOW_ME, 1); + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.FOLLOW_ME, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - enemyPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); - } - ); + 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.battleType("single"); - game.override.enemyMoveset([ Moves.QUICK_GUARD ]); + test("should fail if the user is the last to move in the turn", async () => { + game.override.battleType("single"); + game.override.enemyMoveset([Moves.QUICK_GUARD]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.QUICK_GUARD); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); }); diff --git a/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts index 15c8794a469..8bcb212d60e 100644 --- a/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -26,7 +26,7 @@ describe("Moves - Rage Fist", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset([ Moves.RAGE_FIST, Moves.SPLASH, Moves.SUBSTITUTE ]) + .moveset([Moves.RAGE_FIST, Moves.SPLASH, Moves.SUBSTITUTE]) .startingLevel(100) .enemyLevel(1) .enemyAbility(Abilities.BALL_FETCH) @@ -36,96 +36,84 @@ describe("Moves - Rage Fist", () => { }); it("should have 100 more power if hit twice before calling Rage Fist", async () => { - game.override - .enemySpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.MAGIKARP); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(move.calculateBattlePower).toHaveLastReturnedWith(150); }); it("should maintain its power during next battle if it is within the same arena encounter", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(1); + game.override.enemySpecies(Species.MAGIKARP).startingWave(1); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(250); }); it("should reset the hitRecCounter if we enter new trainer battle", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(4); + game.override.enemySpecies(Species.MAGIKARP).startingWave(4); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(150); }); it("should not increase the hitCounter if Substitute is hit", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(4); + game.override.enemySpecies(Species.MAGIKARP).startingWave(4); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SUBSTITUTE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(game.scene.getPlayerPokemon()?.customPokemonData.hitsRecCount).toBe(0); }); it("should reset the hitRecCounter if we enter new biome", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(10); + game.override.enemySpecies(Species.MAGIKARP).startingWave(10); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.move.select(Moves.RAGE_FIST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(move.calculateBattlePower).toHaveLastReturnedWith(150); }); it("should not reset the hitRecCounter if switched out", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .startingWave(1) - .enemyMoveset(Moves.TACKLE); + game.override.enemySpecies(Species.MAGIKARP).startingWave(1).enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.doSwitchPokemon(1); diff --git a/test/moves/rage_powder.test.ts b/test/moves/rage_powder.test.ts index 15a9bfd951c..ab05ae2e0bc 100644 --- a/test/moves/rage_powder.test.ts +++ b/test/moves/rage_powder.test.ts @@ -6,7 +6,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Moves - Rage Powder", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,54 +26,48 @@ describe("Moves - Rage Powder", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH ]); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH]); }); - test( - "move effect should be bypassed by Grass type", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); + test("move effect should be bypassed by Grass type", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.VENUSAUR]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.RAGE_POWDER); - await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.RAGE_POWDER); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - } - ); + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + }); - test( - "move effect should be bypassed by Overcoat", - async () => { - game.override.ability(Abilities.OVERCOAT); + test("move effect should be bypassed by Overcoat", async () => { + game.override.ability(Abilities.OVERCOAT); - // Test with two non-Grass type player Pokemon - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + // Test with two non-Grass type player Pokemon + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + const enemyStartingHp = enemyPokemon.map(p => p.hp); - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.RAGE_POWDER); - await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.RAGE_POWDER); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); - expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); - } - ); + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }); }); diff --git a/test/moves/reflect.test.ts b/test/moves/reflect.test.ts index 4f818afb071..ac879a7cc2b 100644 --- a/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -36,21 +36,25 @@ describe("Moves - Reflect", () => { globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT ]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); game.override.disableCrits(); }); it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -59,39 +63,68 @@ describe("Moves - Reflect", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("does not affect special attacks", async () => { const moveToUse = Moves.ABSORB; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); it("does not affect critical hits", async () => { - game.override.moveset([ Moves.WICKED_BLOW ]); + game.override.moveset([Moves.WICKED_BLOW]); const moveToUse = Moves.WICKED_BLOW; - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); + + it("does not affect critical hits", async () => { + game.override.moveset([Moves.WICKED_BLOW]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); }); diff --git a/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts index aa61f00a083..78371d35475 100644 --- a/test/moves/reflect_type.test.ts +++ b/test/moves/reflect_type.test.ts @@ -22,20 +22,16 @@ describe("Moves - Reflect Type", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .ability(Abilities.BALL_FETCH) - .battleType("single") - .disableCrits() - .enemyAbility(Abilities.BALL_FETCH); + game.override.ability(Abilities.BALL_FETCH).battleType("single").disableCrits().enemyAbility(Abilities.BALL_FETCH); }); it("will make the user Normal/Grass if targetting a typeless Pokemon affected by Forest's Curse", async () => { game.override - .moveset([ Moves.FORESTS_CURSE, Moves.REFLECT_TYPE ]) + .moveset([Moves.FORESTS_CURSE, Moves.REFLECT_TYPE]) .startingLevel(60) .enemySpecies(Species.CHARMANDER) - .enemyMoveset([ Moves.BURN_UP, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.FEEBAS ]); + .enemyMoveset([Moves.BURN_UP, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS]); const playerPokemon = game.scene.getPlayerPokemon(); const enemyPokemon = game.scene.getEnemyPokemon(); diff --git a/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts index 48e945f596a..d8f1373b4c0 100644 --- a/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -23,7 +23,7 @@ describe("Moves - Relic Song", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.RELIC_SONG, Moves.SPLASH ]) + .moveset([Moves.RELIC_SONG, Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -32,7 +32,7 @@ describe("Moves - Relic Song", () => { }); it("swaps Meloetta's form between Aria and Pirouette", async () => { - await game.classicMode.startBattle([ Species.MELOETTA ]); + await game.classicMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; @@ -49,7 +49,7 @@ describe("Moves - Relic Song", () => { it("doesn't swap Meloetta's form during a mono-type challenge", async () => { game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.PSYCHIC + 1, 0); - await game.challengeMode.startBattle([ Species.MELOETTA ]); + await game.challengeMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; @@ -63,10 +63,8 @@ describe("Moves - Relic Song", () => { }); it("doesn't swap Meloetta's form during biome change (arena reset)", async () => { - game.override - .starterForms({ [Species.MELOETTA]: 1 }) - .startingWave(10); - await game.classicMode.startBattle([ Species.MELOETTA ]); + game.override.starterForms({ [Species.MELOETTA]: 1 }).startingWave(10); + await game.classicMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; diff --git a/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts index 33bba2af211..5cc0b08ccc6 100644 --- a/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -26,16 +26,16 @@ describe("Moves - Retaliate", () => { game.override .battleType("single") .enemySpecies(Species.SNORLAX) - .enemyMoveset([ Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE ]) + .enemyMoveset([Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE]) .enemyLevel(100) - .moveset([ Moves.RETALIATE, Moves.SPLASH ]) + .moveset([Moves.RETALIATE, Moves.SPLASH]) .startingLevel(80) .disableCrits(); }); it("increases power if ally died previous turn", async () => { vi.spyOn(retaliate, "calculateBattlePower"); - await game.startBattle([ Species.ABRA, Species.COBALION ]); + await game.startBattle([Species.ABRA, Species.COBALION]); game.move.select(Moves.RETALIATE); await game.phaseInterceptor.to("TurnEndPhase"); expect(retaliate.calculateBattlePower).toHaveLastReturnedWith(70); diff --git a/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts index 647771fa23b..187b5e62e76 100644 --- a/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -25,7 +25,7 @@ describe("Moves - Revival Blessing", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.REVIVAL_BLESSING, Moves.MEMENTO ]) + .moveset([Moves.SPLASH, Moves.REVIVAL_BLESSING, Moves.MEMENTO]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -35,7 +35,7 @@ describe("Moves - Revival Blessing", () => { }); it("should revive a selected fainted Pokemon when used by the player", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); game.move.select(Moves.MEMENTO); game.doSelectPartyPokemon(1, "SwitchPhase"); @@ -46,7 +46,7 @@ describe("Moves - Revival Blessing", () => { expect(player.species.speciesId).toBe(Species.MAGIKARP); game.move.select(Moves.REVIVAL_BLESSING); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1, "RevivalBlessingPhase"); await game.phaseInterceptor.to("MoveEndPhase", false); @@ -59,14 +59,14 @@ describe("Moves - Revival Blessing", () => { it("should revive a random fainted enemy when used by an enemy Trainer", async () => { game.override.enemyMoveset(Moves.REVIVAL_BLESSING).startingWave(8); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.toNextTurn(); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEndPhase", false); @@ -76,10 +76,10 @@ describe("Moves - Revival Blessing", () => { }); it("should fail when there are no fainted Pokemon to target", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); game.move.select(Moves.REVIVAL_BLESSING); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase", false); const player = game.scene.getPlayerPokemon()!; @@ -89,10 +89,10 @@ describe("Moves - Revival Blessing", () => { it("should revive a player pokemon and immediately send it back out if used in the same turn it fainted in doubles", async () => { game.override .battleType("double") - .enemyMoveset([ Moves.SPLASH, Moves.FISSURE ]) + .enemyMoveset([Moves.SPLASH, Moves.FISSURE]) .enemyAbility(Abilities.NO_GUARD) .enemyLevel(100); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC, Species.GYARADOS ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC, Species.GYARADOS]); const feebas = game.scene.getPlayerField()[0]; @@ -100,7 +100,7 @@ describe("Moves - Revival Blessing", () => { game.move.select(Moves.REVIVAL_BLESSING, 1); await game.forceEnemyMove(Moves.FISSURE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); await game.phaseInterceptor.to("MoveEndPhase"); await game.phaseInterceptor.to("MoveEndPhase"); diff --git a/test/moves/role_play.test.ts b/test/moves/role_play.test.ts index edc41de5c68..2a899b6e987 100644 --- a/test/moves/role_play.test.ts +++ b/test/moves/role_play.test.ts @@ -23,7 +23,7 @@ describe("Moves - Role Play", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.ROLE_PLAY ]) + .moveset([Moves.SPLASH, Moves.ROLE_PLAY]) .ability(Abilities.ADAPTABILITY) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Moves - Role Play", () => { }); it("should set the user's ability to the target's ability", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.ROLE_PLAY); await game.phaseInterceptor.to("BerryPhase"); @@ -43,7 +43,7 @@ describe("Moves - Role Play", () => { it("should activate post-summon abilities", async () => { game.override.enemyAbility(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.ROLE_PLAY); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/rollout.test.ts b/test/moves/rollout.test.ts index 08c18267a75..89270c2dfc7 100644 --- a/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -35,7 +35,7 @@ describe("Moves - Rollout", () => { }); it("should double it's dmg on sequential uses but reset after 5", async () => { - game.override.moveset([ Moves.ROLLOUT ]); + game.override.moveset([Moves.ROLLOUT]); vi.spyOn(allMoves[Moves.ROLLOUT], "accuracy", "get").mockReturnValue(100); //always hit const variance = 5; @@ -45,10 +45,10 @@ describe("Moves - Rollout", () => { await game.startBattle(); const playerPkm = game.scene.getPlayerParty()[0]; - vi.spyOn(playerPkm, "stats", "get").mockReturnValue([ 500000, 1, 1, 1, 1, 1 ]); // HP, ATK, DEF, SPATK, SPDEF, SPD + vi.spyOn(playerPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD const enemyPkm = game.scene.getEnemyParty()[0]; - vi.spyOn(enemyPkm, "stats", "get").mockReturnValue([ 500000, 1, 1, 1, 1, 1 ]); // HP, ATK, DEF, SPATK, SPDEF, SPD + vi.spyOn(enemyPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD vi.spyOn(enemyPkm, "getHeldItems").mockReturnValue([]); //no berries enemyPkm.hp = enemyPkm.getMaxHp(); @@ -62,7 +62,7 @@ describe("Moves - Rollout", () => { previousHp = enemyPkm.hp; } - const [ turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg ] = dmgHistory; + const [turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg] = dmgHistory; expect(turn2Dmg).toBeGreaterThanOrEqual(turn1Dmg * 2 - variance); expect(turn2Dmg).toBeLessThanOrEqual(turn1Dmg * 2 + variance); diff --git a/test/moves/roost.test.ts b/test/moves/roost.test.ts index 470313a27fb..a52b81085c8 100644 --- a/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -9,7 +9,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Moves - Roost", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,7 +30,7 @@ describe("Moves - Roost", () => { game.override.startingLevel(100); game.override.enemyLevel(100); game.override.enemyMoveset(Moves.EARTHQUAKE); - game.override.moveset([ Moves.ROOST, Moves.BURN_UP, Moves.DOUBLE_SHOCK ]); + game.override.moveset([Moves.ROOST, Moves.BURN_UP, Moves.DOUBLE_SHOCK]); }); /** @@ -47,222 +46,199 @@ describe("Moves - Roost", () => { * 6. Non flying types using roost (such as dunsparce) are already grounded, so this move will only heal and have no other effects. */ - test( - "Non flying type uses roost -> no type change, took damage", - async () => { - await game.classicMode.startBattle([ Species.DUNSPARCE ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + test("Non flying type uses roost -> no type change, took damage", async () => { + await game.classicMode.startBattle([Species.DUNSPARCE]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - // Should only be normal type, and NOT flying type - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); + // Should only be normal type, and NOT flying type + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - // Lose HP, still normal type - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - } - ); + // Lose HP, still normal type + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + }); - test( - "Pure flying type -> becomes normal after roost and takes damage from ground moves -> regains flying", - async () => { - await game.classicMode.startBattle([ Species.TORNADUS ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + test("Pure flying type -> becomes normal after roost and takes damage from ground moves -> regains flying", async () => { + await game.classicMode.startBattle([Species.TORNADUS]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - // Should only be normal type, and NOT flying type - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeFalsy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); + // Should only be normal type, and NOT flying type + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeFalsy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - // Should have lost HP and is now back to being pure flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeFalsy(); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); + // Should have lost HP and is now back to being pure flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeFalsy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); - } - ); + test("Dual X/flying type -> becomes type X after roost and takes damage from ground moves -> regains flying", async () => { + await game.classicMode.startBattle([Species.HAWLUCHA]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - test( - "Dual X/flying type -> becomes type X after roost and takes damage from ground moves -> regains flying", - async () => { - await game.classicMode.startBattle([ Species.HAWLUCHA ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + // Should only be pure fighting type and grounded + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - // Should only be pure fighting type and grounded - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); + await game.phaseInterceptor.to(TurnEndPhase); - await game.phaseInterceptor.to(TurnEndPhase); + // Should have lost HP and is now back to being fighting/flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); - // Should have lost HP and is now back to being fighting/flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); - expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); + test("Pokemon with levitate after using roost should lose flying type but still be unaffected by ground moves", async () => { + game.override.starterForms({ [Species.ROTOM]: 4 }); + await game.classicMode.startBattle([Species.ROTOM]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - } - ); + // Should only be pure eletric type and grounded + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); - test( - "Pokemon with levitate after using roost should lose flying type but still be unaffected by ground moves", - async () => { - game.override.starterForms({ [Species.ROTOM]: 4 }); - await game.classicMode.startBattle([ Species.ROTOM ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(TurnEndPhase); - // Should only be pure eletric type and grounded - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); + // Should have lost HP and is now back to being electric/flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBe(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); - await game.phaseInterceptor.to(TurnEndPhase); + test("A fire/flying type that uses burn up, then roost should be typeless until end of turn", async () => { + await game.classicMode.startBattle([Species.MOLTRES]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.BURN_UP); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - // Should have lost HP and is now back to being electric/flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBe(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); - expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); + // Should only be pure flying type after burn up + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - test( - "A fire/flying type that uses burn up, then roost should be typeless until end of turn", - async () => { - await game.classicMode.startBattle([ Species.MOLTRES ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.BURN_UP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + // Should only be typeless type after roost and is grounded + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - // Should only be pure flying type after burn up - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); + await game.phaseInterceptor.to(TurnEndPhase); - await game.phaseInterceptor.to(TurnEndPhase); - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); - // Should only be typeless type after roost and is grounded - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); + test("An electric/flying type that uses double shock, then roost should be typeless until end of turn", async () => { + game.override.enemySpecies(Species.ZEKROM); + await game.classicMode.startBattle([Species.ZAPDOS]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.DOUBLE_SHOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(TurnEndPhase); + // Should only be pure flying type after burn up + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); - // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); + await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); - } - ); + // Should only be typeless type after roost and is grounded + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - test( - "An electric/flying type that uses double shock, then roost should be typeless until end of turn", - async () => { - game.override.enemySpecies(Species.ZEKROM); - await game.classicMode.startBattle([ Species.ZAPDOS ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.DOUBLE_SHOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to(TurnEndPhase); - // Should only be pure flying type after burn up - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); + // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); - await game.phaseInterceptor.to(TurnEndPhase); - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); + test("Dual Type Pokemon afflicted with Forests Curse/Trick or Treat and post roost will become dual type and then become 3 type at end of turn", async () => { + game.override.enemyMoveset([ + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + ]); + await game.classicMode.startBattle([Species.MOLTRES]); + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.ROOST); + await game.phaseInterceptor.to(MoveEffectPhase); - // Should only be typeless type after roost and is grounded - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FIRE).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); - await game.phaseInterceptor.to(TurnEndPhase); - - // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "Dual Type Pokemon afflicted with Forests Curse/Trick or Treat and post roost will become dual type and then become 3 type at end of turn", - async () => { - game.override.enemyMoveset([ Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT ]); - await game.classicMode.startBattle([ Species.MOLTRES ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.ROOST); - await game.phaseInterceptor.to(MoveEffectPhase); - - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === PokemonType.FIRE).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should be fire/flying/ghost - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes.filter(type => type === PokemonType.FLYING)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === PokemonType.FIRE)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === PokemonType.GHOST)).toHaveLength(1); - expect(playerPokemonTypes.length === 3).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); + await game.phaseInterceptor.to(TurnEndPhase); + // Should be fire/flying/ghost + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes.filter(type => type === PokemonType.FLYING)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.FIRE)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.GHOST)).toHaveLength(1); + expect(playerPokemonTypes.length === 3).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); }); diff --git a/test/moves/round.test.ts b/test/moves/round.test.ts index 01efa098f5a..82f080a25ea 100644 --- a/test/moves/round.test.ts +++ b/test/moves/round.test.ts @@ -25,19 +25,19 @@ describe("Moves - Round", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.ROUND ]) + .moveset([Moves.SPLASH, Moves.ROUND]) .ability(Abilities.BALL_FETCH) .battleType("double") .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.ROUND ]) + .enemyMoveset([Moves.SPLASH, Moves.ROUND]) .startingLevel(100) .enemyLevel(100); }); it("should cue other instances of Round together in Speed order", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const round = allMoves[Moves.ROUND]; const spy = vi.spyOn(round, "calculateBattlePower"); @@ -48,7 +48,7 @@ describe("Moves - Round", () => { await game.forceEnemyMove(Moves.ROUND, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); const actualTurnOrder: BattlerIndex[] = []; @@ -58,8 +58,13 @@ describe("Moves - Round", () => { await game.phaseInterceptor.to("MoveEndPhase"); } - expect(actualTurnOrder).toEqual([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + expect(actualTurnOrder).toEqual([ + BattlerIndex.PLAYER, + BattlerIndex.PLAYER_2, + BattlerIndex.ENEMY, + BattlerIndex.ENEMY_2, + ]); const powerResults = spy.mock.results.map(result => result.value); - expect(powerResults).toEqual( [ 60, 120, 120 ]); + expect(powerResults).toEqual([60, 120, 120]); }); }); diff --git a/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts index 9768b24f170..2235b59e1af 100644 --- a/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -8,7 +8,6 @@ import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Safeguard", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,11 +27,11 @@ describe("Moves - Safeguard", () => { game.override .battleType("single") .enemySpecies(Species.DRATINI) - .enemyMoveset([ Moves.SAFEGUARD ]) + .enemyMoveset([Moves.SAFEGUARD]) .enemyAbility(Abilities.BALL_FETCH) .enemyLevel(5) .starterSpecies(Species.DRATINI) - .moveset([ Moves.NUZZLE, Moves.SPORE, Moves.YAWN, Moves.SPLASH ]) + .moveset([Moves.NUZZLE, Moves.SPORE, Moves.YAWN, Moves.SPLASH]) .ability(Abilities.UNNERVE); // Stop wild Pokemon from potentially eating Lum Berry }); @@ -41,7 +40,7 @@ describe("Moves - Safeguard", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.NUZZLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemy.status).toBeUndefined(); @@ -52,19 +51,19 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPORE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.status).toBeUndefined(); }); it("protects from confusion", async () => { - game.override.moveset([ Moves.CONFUSE_RAY ]); + game.override.moveset([Moves.CONFUSE_RAY]); await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.CONFUSE_RAY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.summonData.tags).toEqual([]); @@ -78,7 +77,7 @@ describe("Moves - Safeguard", () => { game.move.select(Moves.SPORE, 0, BattlerIndex.ENEMY_2); game.move.select(Moves.NUZZLE, 1, BattlerIndex.ENEMY_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); @@ -93,7 +92,7 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.summonData.tags).toEqual([]); @@ -104,7 +103,7 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); game.move.select(Moves.SPLASH); @@ -119,13 +118,13 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); enemyPokemon.damageAndUpdate(1); expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN); - game.override.enemyMoveset([ Moves.REST ]); + game.override.enemyMoveset([Moves.REST]); // Force the moveset to update mid-battle // TODO: Remove after enemy AI rework is in enemyPokemon.getMoveset(); @@ -138,14 +137,18 @@ describe("Moves - Safeguard", () => { it("protects from ability-inflicted status", async () => { game.override.ability(Abilities.STATIC); - vi.spyOn(allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], "chance", "get").mockReturnValue(100); + vi.spyOn( + allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], + "chance", + "get", + ).mockReturnValue(100); await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); game.move.select(Moves.SPLASH); await game.toNextTurn(); diff --git a/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts index 118b37795a1..2be632adb54 100644 --- a/test/moves/scale_shot.test.ts +++ b/test/moves/scale_shot.test.ts @@ -29,7 +29,7 @@ describe("Moves - Scale Shot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SCALE_SHOT ]) + .moveset([Moves.SCALE_SHOT]) .battleType("single") .disableCrits() .ability(Abilities.NO_GUARD) @@ -41,11 +41,11 @@ describe("Moves - Scale Shot", () => { it("applies stat changes after last hit", async () => { game.override.enemySpecies(Species.FORRETRESS); - await game.classicMode.startBattle([ Species.MINCCINO ]); + await game.classicMode.startBattle([Species.MINCCINO]); const minccino = game.scene.getPlayerPokemon()!; game.move.select(Moves.SCALE_SHOT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); await game.phaseInterceptor.to(DamageAnimPhase); @@ -69,7 +69,7 @@ describe("Moves - Scale Shot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.MINCCINO ]); + await game.classicMode.startBattle([Species.MINCCINO]); const minccino = game.scene.getPlayerPokemon()!; game.move.select(Moves.SCALE_SHOT); diff --git a/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts index 26fec5fabc3..28dc7efc434 100644 --- a/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -30,7 +30,7 @@ describe("Moves - Secret Power", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SECRET_POWER ]) + .moveset([Moves.SECRET_POWER]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -40,13 +40,11 @@ describe("Moves - Secret Power", () => { }); it("Secret Power checks for an active terrain first then looks at the biome for its secondary effect", async () => { - game.override - .startingBiome(Biome.VOLCANO) - .enemyMoveset([ Moves.SPLASH, Moves.MISTY_TERRAIN ]); + game.override.startingBiome(Biome.VOLCANO).enemyMoveset([Moves.SPLASH, Moves.MISTY_TERRAIN]); vi.spyOn(allMoves[Moves.SECRET_POWER], "chance", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; // No Terrain + Biome.VOLCANO --> Burn game.move.select(Moves.SECRET_POWER); @@ -61,38 +59,36 @@ describe("Moves - Secret Power", () => { expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1); }); - it("Secret Power's effect chance is doubled by Serene Grace, but not by the 'rainbow' effect from Fire/Water Pledge", - async () => { - game.override - .moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.SECRET_POWER, Moves.SPLASH ]) - .ability(Abilities.SERENE_GRACE) - .enemyMoveset([ Moves.SPLASH ]) - .battleType("double"); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Secret Power's effect chance is doubled by Serene Grace, but not by the 'rainbow' effect from Fire/Water Pledge", async () => { + game.override + .moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.SECRET_POWER, Moves.SPLASH]) + .ability(Abilities.SERENE_GRACE) + .enemyMoveset([Moves.SPLASH]) + .battleType("double"); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0]; - vi.spyOn(sereneGraceAttr, "apply"); + const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0]; + vi.spyOn(sereneGraceAttr, "apply"); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER); - expect(rainbowEffect).toBeDefined(); + let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER); + expect(rainbowEffect).toBeDefined(); - rainbowEffect = rainbowEffect!; - vi.spyOn(rainbowEffect, "apply"); + rainbowEffect = rainbowEffect!; + vi.spyOn(rainbowEffect, "apply"); - game.move.select(Moves.SECRET_POWER, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SECRET_POWER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(sereneGraceAttr.apply).toHaveBeenCalledOnce(); - expect(sereneGraceAttr.apply).toHaveLastReturnedWith(true); + expect(sereneGraceAttr.apply).toHaveBeenCalledOnce(); + expect(sereneGraceAttr.apply).toHaveLastReturnedWith(true); - expect(rainbowEffect.apply).toHaveBeenCalledTimes(0); - } - ); + expect(rainbowEffect.apply).toHaveBeenCalledTimes(0); + }); }); diff --git a/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts index be746aacd78..6744c4e9ed8 100644 --- a/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -24,7 +24,7 @@ describe("Moves - Shed Tail", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SHED_TAIL ]) + .moveset([Moves.SHED_TAIL]) .battleType("single") .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) @@ -32,7 +32,7 @@ describe("Moves - Shed Tail", () => { }); it("transfers a Substitute doll to the switched in Pokemon", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const magikarp = game.scene.getPlayerPokemon()!; @@ -53,7 +53,7 @@ describe("Moves - Shed Tail", () => { }); it("should fail if no ally is available to switch in", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const magikarp = game.scene.getPlayerPokemon()!; expect(game.scene.getPlayerParty().length).toBe(1); diff --git a/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts index c23bb316ba0..47da5e1c2f7 100644 --- a/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -26,7 +26,7 @@ describe("Moves - Shell Side Arm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SHELL_SIDE_ARM, Moves.SPLASH ]) + .moveset([Moves.SHELL_SIDE_ARM, Moves.SPLASH]) .battleType("single") .startingLevel(100) .enemyLevel(100) @@ -37,7 +37,7 @@ describe("Moves - Shell Side Arm", () => { it("becomes a physical attack if forecasted to deal more damage as physical", async () => { game.override.enemySpecies(Species.SNORLAX); - await game.classicMode.startBattle([ Species.RAMPARDOS ]); + await game.classicMode.startBattle([Species.RAMPARDOS]); vi.spyOn(shellSideArmAttr, "apply"); @@ -50,7 +50,7 @@ describe("Moves - Shell Side Arm", () => { it("remains a special attack if forecasted to deal more damage as special", async () => { game.override.enemySpecies(Species.SLOWBRO); - await game.classicMode.startBattle([ Species.XURKITREE ]); + await game.classicMode.startBattle([Species.XURKITREE]); vi.spyOn(shellSideArmAttr, "apply"); @@ -61,11 +61,9 @@ describe("Moves - Shell Side Arm", () => { }); it("respects stat stage changes when forecasting base damage", async () => { - game.override - .enemySpecies(Species.SNORLAX) - .enemyMoveset(Moves.COTTON_GUARD); + game.override.enemySpecies(Species.SNORLAX).enemyMoveset(Moves.COTTON_GUARD); - await game.classicMode.startBattle([ Species.MANAPHY ]); + await game.classicMode.startBattle([Species.MANAPHY]); vi.spyOn(shellSideArmAttr, "apply"); @@ -73,7 +71,7 @@ describe("Moves - Shell Side Arm", () => { await game.toNextTurn(); game.move.select(Moves.SHELL_SIDE_ARM); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(shellSideArmAttr.apply).toHaveLastReturnedWith(false); diff --git a/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts index 2e9d9ed69d6..2df94cdb828 100644 --- a/test/moves/shell_trap.test.ts +++ b/test/moves/shell_trap.test.ts @@ -10,7 +10,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Shell Trap", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,134 +28,119 @@ describe("Moves - Shell Trap", () => { game = new GameManager(phaserGame); game.override .battleType("double") - .moveset([ Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE ]) + .moveset([Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE]) .enemySpecies(Species.SNORLAX) - .enemyMoveset([ Moves.RAZOR_LEAF ]) + .enemyMoveset([Moves.RAZOR_LEAF]) .startingLevel(100) .enemyLevel(100); vi.spyOn(allMoves[Moves.RAZOR_LEAF], "accuracy", "get").mockReturnValue(100); }); - it( - "should activate after the user is hit by a physical attack", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); + it("should activate after the user is hit by a physical attack", async () => { + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).toBe(playerPokemon[1]); + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).toBe(playerPokemon[1]); - await game.phaseInterceptor.to(MoveEndPhase); - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); - } - ); + await game.phaseInterceptor.to(MoveEndPhase); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); - it( - "should fail if the user is only hit by special attacks", - async () => { - game.override.enemyMoveset([ Moves.SWIFT ]); + it("should fail if the user is only hit by special attacks", async () => { + game.override.enemyMoveset([Moves.SWIFT]); - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - it( - "should fail if the user isn't hit with any attack", - async () => { - game.override.enemyMoveset(Moves.SPLASH); + it("should fail if the user isn't hit with any attack", async () => { + game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - it( - "should not activate from an ally's attack", - async () => { - game.override.enemyMoveset(Moves.SPLASH); + it("should not activate from an ally's attack", async () => { + game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SHELL_TRAP); - game.move.select(Moves.BULLDOZE, 1); + game.move.select(Moves.SHELL_TRAP); + game.move.select(Moves.BULLDOZE, 1); - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to(MoveEndPhase); - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - const enemyStartingHp = enemyPokemon.map(p => p.hp); + const enemyStartingHp = enemyPokemon.map(p => p.hp); - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach((p, i) => expect(p.hp).toBe(enemyStartingHp[i])); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach((p, i) => expect(p.hp).toBe(enemyStartingHp[i])); + }); - it( - "should not activate from a subsequent physical attack", - async () => { - game.override.battleType("single"); - vi.spyOn(allMoves[Moves.RAZOR_LEAF], "priority", "get").mockReturnValue(-4); + it("should not activate from a subsequent physical attack", async () => { + game.override.battleType("single"); + vi.spyOn(allMoves[Moves.RAZOR_LEAF], "priority", "get").mockReturnValue(-4); - await game.startBattle([ Species.CHARIZARD ]); + await game.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SHELL_TRAP); + game.move.select(Moves.SHELL_TRAP); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); }); diff --git a/test/moves/simple_beam.test.ts b/test/moves/simple_beam.test.ts index 1fb8b54e8aa..ce86f42671e 100644 --- a/test/moves/simple_beam.test.ts +++ b/test/moves/simple_beam.test.ts @@ -22,7 +22,7 @@ describe("Moves - Simple Beam", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.SIMPLE_BEAM ]) + .moveset([Moves.SPLASH, Moves.SIMPLE_BEAM]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -32,7 +32,7 @@ describe("Moves - Simple Beam", () => { }); it("sets the target's ability to simple", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SIMPLE_BEAM); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/sketch.test.ts b/test/moves/sketch.test.ts index 0b63598ba9b..dfbf2eca713 100644 --- a/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -35,10 +35,10 @@ 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([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; // can't use normal moveset override because we need to check moveset changes - playerPokemon.moveset = [ new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH) ]; + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH)]; game.move.select(Moves.SKETCH); await game.phaseInterceptor.to("TurnEndPhase"); @@ -57,20 +57,20 @@ 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([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; - playerPokemon.moveset = [ new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.GROWL) ]; + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.GROWL)]; game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.move.forceStatusActivation(false); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); await game.toNextTurn(); game.move.select(Moves.SKETCH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.move.forceStatusActivation(true); await game.phaseInterceptor.to("TurnEndPhase"); expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); @@ -82,14 +82,14 @@ describe("Moves - Sketch", () => { const randomMoveAttr = allMoves[Moves.METRONOME].findAttr(attr => attr instanceof RandomMoveAttr) as RandomMoveAttr; vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.FALSE_SWIPE); - game.override.enemyMoveset([ Moves.METRONOME ]); - await game.classicMode.startBattle([ Species.REGIELEKI ]); + game.override.enemyMoveset([Moves.METRONOME]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.moveset = [ new PokemonMove(Moves.SKETCH) ]; + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH)]; // Opponent uses Metronome -> False Swipe, then player uses Sketch, which should sketch Metronome game.move.select(Moves.SKETCH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); expect(playerPokemon.moveset[0]?.moveId).toBe(Moves.METRONOME); diff --git a/test/moves/skill_swap.test.ts b/test/moves/skill_swap.test.ts index e39dac8bb01..f807a85eaf6 100644 --- a/test/moves/skill_swap.test.ts +++ b/test/moves/skill_swap.test.ts @@ -23,7 +23,7 @@ describe("Moves - Skill Swap", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.SKILL_SWAP ]) + .moveset([Moves.SPLASH, Moves.SKILL_SWAP]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -34,7 +34,7 @@ describe("Moves - Skill Swap", () => { it("should swap the two abilities", async () => { game.override.ability(Abilities.ADAPTABILITY); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SKILL_SWAP); await game.phaseInterceptor.to("BerryPhase"); @@ -45,7 +45,7 @@ describe("Moves - Skill Swap", () => { it("should activate post-summon abilities", async () => { game.override.ability(Abilities.INTIMIDATE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SKILL_SWAP); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/sleep_talk.test.ts b/test/moves/sleep_talk.test.ts index b9c98f4fb65..d31eff34a7a 100644 --- a/test/moves/sleep_talk.test.ts +++ b/test/moves/sleep_talk.test.ts @@ -25,7 +25,7 @@ describe("Moves - Sleep Talk", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.SLEEP_TALK ]) + .moveset([Moves.SPLASH, Moves.SLEEP_TALK]) .statusEffect(StatusEffect.SLEEP) .ability(Abilities.BALL_FETCH) .battleType("single") @@ -38,7 +38,7 @@ describe("Moves - Sleep Talk", () => { it("should fail when the user is not asleep", async () => { game.override.statusEffect(StatusEffect.NONE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SLEEP_TALK); await game.toNextTurn(); @@ -46,8 +46,8 @@ describe("Moves - Sleep Talk", () => { }); it("should fail if the user has no valid moves", async () => { - game.override.moveset([ Moves.SLEEP_TALK, Moves.DIG, Moves.METRONOME, Moves.SOLAR_BEAM ]); - await game.classicMode.startBattle([ Species.FEEBAS ]); + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.METRONOME, Moves.SOLAR_BEAM]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SLEEP_TALK); await game.toNextTurn(); @@ -55,8 +55,8 @@ describe("Moves - Sleep Talk", () => { }); it("should call a random valid move if the user is asleep", async () => { - game.override.moveset([ Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.SWORDS_DANCE ]); // Dig and Fly are invalid moves, Swords Dance should always be called - await game.classicMode.startBattle([ Species.FEEBAS ]); + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.SWORDS_DANCE]); // Dig and Fly are invalid moves, Swords Dance should always be called + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SLEEP_TALK); await game.toNextTurn(); @@ -64,7 +64,7 @@ describe("Moves - Sleep Talk", () => { }); it("should apply secondary effects of a move", async () => { - game.override.moveset([ Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.WOOD_HAMMER ]); // Dig and Fly are invalid moves, Wood Hammer should always be called + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.WOOD_HAMMER]); // Dig and Fly are invalid moves, Wood Hammer should always be called await game.classicMode.startBattle(); game.move.select(Moves.SLEEP_TALK); diff --git a/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts index c3025db57d0..dffd4f210e5 100644 --- a/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -36,7 +36,7 @@ describe("Moves - Solar Beam", () => { }); it("should deal damage in two turns if no weather is active", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -60,11 +60,11 @@ describe("Moves - Solar Beam", () => { it.each([ { weatherType: WeatherType.SUNNY, name: "Sun" }, - { weatherType: WeatherType.HARSH_SUN, name: "Harsh Sun" } + { weatherType: WeatherType.HARSH_SUN, name: "Harsh Sun" }, ])("should deal damage in one turn if $name is active", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -83,11 +83,11 @@ describe("Moves - Solar Beam", () => { it.each([ { weatherType: WeatherType.RAIN, name: "Rain" }, - { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" }, ])("should have its power halved in $name", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const solarBeam = allMoves[Moves.SOLAR_BEAM]; diff --git a/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts index f865c00271f..6cd357c7e0e 100644 --- a/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -27,18 +27,16 @@ describe("Moves - Sparkly Swirl", () => { .enemyLevel(100) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.SPARKLY_SWIRL, Moves.SPLASH ]) + .moveset([Moves.SPARKLY_SWIRL, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); vi.spyOn(allMoves[Moves.SPARKLY_SWIRL], "accuracy", "get").mockReturnValue(100); }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - game.override - .battleType("double") - .statusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getPlayerParty(); + game.override.battleType("double").statusEffect(StatusEffect.BURN); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); const leftOpp = game.scene.getEnemyPokemon()!; vi.spyOn(leftPlayer, "resetStatus"); @@ -60,11 +58,9 @@ describe("Moves - Sparkly Swirl", () => { }); it("should not cure status effect of the target/target's allies", async () => { - game.override - .battleType("double") - .enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + game.override.battleType("double").enemyStatusEffect(StatusEffect.BURN); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); diff --git a/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts index d7524586d66..2e52b118a74 100644 --- a/test/moves/spectral_thief.test.ts +++ b/test/moves/spectral_thief.test.ts @@ -28,9 +28,8 @@ describe("Moves - Spectral Thief", () => { .enemyLevel(100) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.SPECTRAL_THIEF, Moves.SPLASH ]) - .ability(Abilities.BALL_FETCH) - .disableCrits; + .moveset([Moves.SPECTRAL_THIEF, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH).disableCrits; }); it("should steal max possible positive stat changes and ignore negative ones.", async () => { @@ -61,14 +60,12 @@ describe("Moves - Spectral Thief", () => { * enemy has -6 SPDEF and player 0 => player should not steal * enemy has +3 SPD and player -2 => player only steals +3 */ - expect(player.getStatStages()).toEqual([ 6, 1, 6, 0, 1, 0, 0 ]); - expect(enemy.getStatStages()).toEqual([ 4, -6, 0, -6, 0, 0, 0 ]); + expect(player.getStatStages()).toEqual([6, 1, 6, 0, 1, 0, 0]); + expect(enemy.getStatStages()).toEqual([4, -6, 0, -6, 0, 0, 0]); }); it("should steal stat stages before dmg calculation", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .enemyLevel(50); + game.override.enemySpecies(Species.MAGIKARP).enemyLevel(50); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -87,8 +84,7 @@ describe("Moves - Spectral Thief", () => { }); it("should steal stat stages as a negative value with Contrary.", async () => { - game.override - .ability(Abilities.CONTRARY); + game.override.ability(Abilities.CONTRARY); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -106,8 +102,7 @@ describe("Moves - Spectral Thief", () => { }); it("should steal double the stat stages with Simple.", async () => { - game.override - .ability(Abilities.SIMPLE); + game.override.ability(Abilities.SIMPLE); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -125,8 +120,7 @@ describe("Moves - Spectral Thief", () => { }); it("should steal the stat stages through Clear Body.", async () => { - game.override - .enemyAbility(Abilities.CLEAR_BODY); + game.override.enemyAbility(Abilities.CLEAR_BODY); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -144,8 +138,7 @@ describe("Moves - Spectral Thief", () => { }); it("should steal the stat stages through White Smoke.", async () => { - game.override - .enemyAbility(Abilities.WHITE_SMOKE); + game.override.enemyAbility(Abilities.WHITE_SMOKE); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -163,8 +156,7 @@ describe("Moves - Spectral Thief", () => { }); it("should steal the stat stages through Hyper Cutter.", async () => { - game.override - .enemyAbility(Abilities.HYPER_CUTTER); + game.override.enemyAbility(Abilities.HYPER_CUTTER); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -182,8 +174,7 @@ describe("Moves - Spectral Thief", () => { }); it("should bypass Substitute.", async () => { - game.override - .enemyMoveset(Moves.SUBSTITUTE); + game.override.enemyMoveset(Moves.SUBSTITUTE); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -194,7 +185,7 @@ describe("Moves - Spectral Thief", () => { player.setStatStage(Stat.ATK, 0); game.move.select(Moves.SPECTRAL_THIEF); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(TurnEndPhase); expect(player.getStatStage(Stat.ATK)).toEqual(3); @@ -203,8 +194,7 @@ describe("Moves - Spectral Thief", () => { }); it("should get blocked by protect.", async () => { - game.override - .enemyMoveset(Moves.PROTECT); + game.override.enemyMoveset(Moves.PROTECT); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; diff --git a/test/moves/speed_swap.test.ts b/test/moves/speed_swap.test.ts index 5cdea223296..a1385ce5386 100644 --- a/test/moves/speed_swap.test.ts +++ b/test/moves/speed_swap.test.ts @@ -29,14 +29,12 @@ describe("Moves - Speed Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.SPEED_SWAP ]) + .moveset([Moves.SPEED_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's SPD and the target's SPD stats", async () => { - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/spikes.test.ts b/test/moves/spikes.test.ts index 11ef295a62f..9bf0e5e1437 100644 --- a/test/moves/spikes.test.ts +++ b/test/moves/spikes.test.ts @@ -5,7 +5,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Spikes", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,11 +27,11 @@ describe("Moves - Spikes", () => { .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.SPIKES, Moves.SPLASH, Moves.ROAR ]); + .moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]); }); it("should not damage the team that set them", async () => { - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -52,7 +51,7 @@ describe("Moves - Spikes", () => { it("should damage opposing pokemon that are forced to switch in", async () => { game.override.startingWave(5); - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -66,7 +65,7 @@ describe("Moves - Spikes", () => { it("should damage opposing pokemon that choose to switch in", async () => { game.override.startingWave(5); - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -78,5 +77,4 @@ describe("Moves - Spikes", () => { const enemy = game.scene.getEnemyParty()[0]; expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); }, 20000); - }); diff --git a/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts index 59dca04fe26..d986ae4d141 100644 --- a/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -48,7 +48,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 1; const expectedPower = 100; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -70,7 +70,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 2; const expectedPower = 200; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -93,7 +93,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 3; const expectedPower = 300; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -115,7 +115,7 @@ describe("Moves - Spit Up", () => { }); it("fails without stacks", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; @@ -125,14 +125,18 @@ describe("Moves - Spit Up", () => { game.move.select(Moves.SPIT_UP); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.FAIL, targets: [ game.scene.getEnemyPokemon()!.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.FAIL, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).not.toHaveBeenCalled(); }); describe("restores stat boosts granted by stacks", () => { it("decreases stats based on stored values (both boosts equal)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -148,7 +152,11 @@ describe("Moves - Spit Up", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS, targets: [ game.scene.getEnemyPokemon()!.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.SUCCESS, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); @@ -159,7 +167,7 @@ describe("Moves - Spit Up", () => { }); it("decreases stats based on stored values (different boosts)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -176,7 +184,11 @@ describe("Moves - Spit Up", () => { game.move.select(Moves.SPIT_UP); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS, targets: [ game.scene.getEnemyPokemon()!.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.SUCCESS, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); diff --git a/test/moves/spotlight.test.ts b/test/moves/spotlight.test.ts index 2a883d403a7..91705dbb2fa 100644 --- a/test/moves/spotlight.test.ts +++ b/test/moves/spotlight.test.ts @@ -6,7 +6,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - describe("Moves - Spotlight", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,47 +27,41 @@ describe("Moves - Spotlight", () => { game.override.enemySpecies(Species.SNORLAX); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.SPLASH ]); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.SPLASH]); }); - test( - "move should redirect attacks to the target", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + test("move should redirect attacks to the target", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(TurnEndPhase, false); - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - } - ); + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + }); - test( - "move should cause other redirection moves to fail", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + test("move should cause other redirection moves to fail", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - } - ); + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + }); }); diff --git a/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts index e83b67e9d9c..ba96928e01d 100644 --- a/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -25,12 +25,12 @@ describe("Moves - Steamroller", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ Moves.STEAMROLLER ]).battleType("single").enemyAbility(Abilities.BALL_FETCH); + game.override.moveset([Moves.STEAMROLLER]).battleType("single").enemyAbility(Abilities.BALL_FETCH); }); it("should always hit a minimzed target with double damage", async () => { game.override.enemySpecies(Species.DITTO).enemyMoveset(Moves.MINIMIZE); - await game.classicMode.startBattle([ Species.IRON_BOULDER ]); + await game.classicMode.startBattle([Species.IRON_BOULDER]); const ditto = game.scene.getEnemyPokemon()!; vi.spyOn(ditto, "getAttackDamage"); @@ -41,15 +41,15 @@ describe("Moves - Steamroller", () => { vi.spyOn(ironBoulder, "getAccuracyMultiplier"); // Turn 1 game.move.select(Moves.STEAMROLLER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); // Turn 2 game.move.select(Moves.STEAMROLLER); await game.toNextTurn(); - const [ dmgCalcTurn1, dmgCalcTurn2 ]: DamageCalculationResult[] = vi + const [dmgCalcTurn1, dmgCalcTurn2]: DamageCalculationResult[] = vi .mocked(ditto.getAttackDamage) - .mock.results.map((r) => r.value); + .mock.results.map(r => r.value); expect(dmgCalcTurn2.damage).toBeGreaterThanOrEqual(dmgCalcTurn1.damage * 2); expect(ditto.getTag(BattlerTagType.MINIMIZED)).toBeDefined(); diff --git a/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts index 0d0a1de4840..033f24d5229 100644 --- a/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -34,12 +34,12 @@ describe("Moves - Stockpile", () => { game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(2000); - game.override.moveset([ Moves.STOCKPILE, Moves.SPLASH ]); + game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); 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.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const user = game.scene.getPlayerPokemon()!; @@ -61,24 +61,29 @@ describe("Moves - Stockpile", () => { const stockpilingTag = user.getTag(StockpilingTag)!; - if (i < 3) { // first three uses should behave normally + if (i < 3) { + // first three uses should behave normally expect(user.getStatStage(Stat.DEF)).toBe(i + 1); expect(user.getStatStage(Stat.SPDEF)).toBe(i + 1); expect(stockpilingTag).toBeDefined(); expect(stockpilingTag.stockpiledCount).toBe(i + 1); - - } else { // fourth should have failed + } else { + // fourth should have failed expect(user.getStatStage(Stat.DEF)).toBe(3); expect(user.getStatStage(Stat.SPDEF)).toBe(3); expect(stockpilingTag).toBeDefined(); expect(stockpilingTag.stockpiledCount).toBe(3); - expect(user.getMoveHistory().at(-1)).toMatchObject({ result: MoveResult.FAIL, move: Moves.STOCKPILE, targets: [ user.getBattlerIndex() ]}); + expect(user.getMoveHistory().at(-1)).toMatchObject({ + result: MoveResult.FAIL, + move: Moves.STOCKPILE, + targets: [user.getBattlerIndex()], + }); } } }); it("gains a stockpile stack even if user's DEF and SPDEF stat stages are at +6", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const user = game.scene.getPlayerPokemon()!; diff --git a/test/moves/substitute.test.ts b/test/moves/substitute.test.ts index ce5fbdd99d8..23f7f4af4b9 100644 --- a/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -18,7 +18,6 @@ import { StatusEffect } from "#enums/status-effect"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Substitute", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -38,7 +37,7 @@ describe("Moves - Substitute", () => { game.override .battleType("single") - .moveset([ Moves.SUBSTITUTE, Moves.SWORDS_DANCE, Moves.TACKLE, Moves.SPLASH ]) + .moveset([Moves.SUBSTITUTE, Moves.SWORDS_DANCE, Moves.TACKLE, Moves.SPLASH]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) .enemyMoveset(Moves.SPLASH) @@ -46,557 +45,477 @@ describe("Moves - Substitute", () => { .enemyLevel(100); }); - it( - "should cause the user to take damage", - async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + it("should cause the user to take damage", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - } - ); + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + }); - it( - "should redirect enemy attack damage to the Substitute doll", - async () => { - game.override.enemyMoveset(Moves.TACKLE); + it("should redirect enemy attack damage to the Substitute doll", async () => { + game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.SKARMORY ]); + await game.classicMode.startBattle([Species.SKARMORY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(postSubHp); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - } - ); + expect(leadPokemon.hp).toBe(postSubHp); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + }); - it( - "should fade after redirecting more damage than its remaining HP", - async () => { - // Giga Impact OHKOs Magikarp if substitute isn't up - game.override.enemyMoveset(Moves.GIGA_IMPACT); - vi.spyOn(allMoves[Moves.GIGA_IMPACT], "accuracy", "get").mockReturnValue(100); + it("should fade after redirecting more damage than its remaining HP", async () => { + // Giga Impact OHKOs Magikarp if substitute isn't up + game.override.enemyMoveset(Moves.GIGA_IMPACT); + vi.spyOn(allMoves[Moves.GIGA_IMPACT], "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(postSubHp); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); - } - ); + expect(leadPokemon.hp).toBe(postSubHp); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); + }); - it( - "should block stat changes from status moves", - async () => { - game.override.enemyMoveset(Moves.CHARM); + it("should block stat changes from status moves", async () => { + game.override.enemyMoveset(Moves.CHARM); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - } - ); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + }); - it( - "should be bypassed by sound-based moves", - async () => { - game.override.enemyMoveset(Moves.ECHOED_VOICE); + it("should be bypassed by sound-based moves", async () => { + game.override.enemyMoveset(Moves.ECHOED_VOICE); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - expect(leadPokemon.hp).toBeLessThan(postSubHp); - } - ); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + expect(leadPokemon.hp).toBeLessThan(postSubHp); + }); - it( - "should be bypassed by attackers with Infiltrator", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.enemyAbility(Abilities.INFILTRATOR); + it("should be bypassed by attackers with Infiltrator", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.enemyAbility(Abilities.INFILTRATOR); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - expect(leadPokemon.hp).toBeLessThan(postSubHp); - } - ); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + expect(leadPokemon.hp).toBeLessThan(postSubHp); + }); - it( - "shouldn't block the user's own status moves", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE ]); + it("shouldn't block the user's own status moves", async () => { + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("MoveEndPhase"); - await game.toNextTurn(); + await game.phaseInterceptor.to("MoveEndPhase"); + await game.toNextTurn(); - game.move.select(Moves.SWORDS_DANCE); + game.move.select(Moves.SWORDS_DANCE); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); - it( - "shouldn't block moves that target the user's side of the field", - async () => { - game.override.moveset(Moves.LIGHT_SCREEN); + it("shouldn't block moves that target the user's side of the field", async () => { + game.override.moveset(Moves.LIGHT_SCREEN); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(leadPokemon, "getMoveEffectiveness"); + const leadPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(leadPokemon, "getMoveEffectiveness"); - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.LIGHT_SCREEN); + game.move.select(Moves.LIGHT_SCREEN); - await game.toNextTurn(); + await game.toNextTurn(); - expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); - expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER)).toBeDefined(); - } - ); + expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); + expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER)).toBeDefined(); + }); - it( - "shouldn't block the opponent from setting hazards", - async () => { - game.override.enemyMoveset(Moves.STEALTH_ROCK); + it("shouldn't block the opponent from setting hazards", async () => { + game.override.enemyMoveset(Moves.STEALTH_ROCK); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(leadPokemon, "getMoveEffectiveness"); + const leadPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(leadPokemon, "getMoveEffectiveness"); - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.toNextTurn(); + await game.toNextTurn(); - expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); - expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined(); - } - ); + expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); + expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined(); + }); - it( - "shouldn't block moves that target both sides of the field", - async () => { - game.override - .moveset(Moves.TRICK_ROOM) - .enemyMoveset(Moves.GRAVITY); + it("shouldn't block moves that target both sides of the field", async () => { + game.override.moveset(Moves.TRICK_ROOM).enemyMoveset(Moves.GRAVITY); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const pokemon = game.scene.getField(true); - pokemon.forEach(p => { - vi.spyOn(p, "getMoveEffectiveness"); - p.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, p.id); - }); + const pokemon = game.scene.getField(true); + pokemon.forEach(p => { + vi.spyOn(p, "getMoveEffectiveness"); + p.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, p.id); + }); - game.move.select(Moves.TRICK_ROOM); + game.move.select(Moves.TRICK_ROOM); - await game.toNextTurn(); + await game.toNextTurn(); - pokemon.forEach(p => expect(p.getMoveEffectiveness).not.toHaveReturnedWith(0)); - expect(game.scene.arena.getTag(ArenaTagType.TRICK_ROOM)).toBeDefined(); - expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); - } - ); + pokemon.forEach(p => expect(p.getMoveEffectiveness).not.toHaveReturnedWith(0)); + expect(game.scene.arena.getTag(ArenaTagType.TRICK_ROOM)).toBeDefined(); + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + }); - it( - "should protect the user from flinching", - async () => { - game.override.enemyMoveset(Moves.FAKE_OUT); - game.override.startingLevel(1); // Ensures the Substitute will break + it("should protect the user from flinching", async () => { + game.override.enemyMoveset(Moves.FAKE_OUT); + game.override.startingLevel(1); // Ensures the Substitute will break - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); - it( - "should protect the user from being trapped", - async () => { - vi.spyOn(allMoves[Moves.SAND_TOMB], "accuracy", "get").mockReturnValue(100); - game.override.enemyMoveset(Moves.SAND_TOMB); + it("should protect the user from being trapped", async () => { + vi.spyOn(allMoves[Moves.SAND_TOMB], "accuracy", "get").mockReturnValue(100); + game.override.enemyMoveset(Moves.SAND_TOMB); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getTag(TrappedTag)).toBeUndefined(); - } - ); + expect(leadPokemon.getTag(TrappedTag)).toBeUndefined(); + }); - it( - "should prevent the user's stats from being lowered", - async () => { - vi.spyOn(allMoves[Moves.LIQUIDATION], "chance", "get").mockReturnValue(100); - game.override.enemyMoveset(Moves.LIQUIDATION); + it("should prevent the user's stats from being lowered", async () => { + vi.spyOn(allMoves[Moves.LIQUIDATION], "chance", "get").mockReturnValue(100); + game.override.enemyMoveset(Moves.LIQUIDATION); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); - } - ); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); + }); - it( - "should protect the user from being afflicted with status effects", - async () => { - game.override.enemyMoveset(Moves.NUZZLE); + it("should protect the user from being afflicted with status effects", async () => { + game.override.enemyMoveset(Moves.NUZZLE); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); - } - ); + expect(leadPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); + }); - it( - "should prevent the user's items from being stolen", - async () => { - game.override.enemyMoveset(Moves.THIEF); - vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([ new StealHeldItemChanceAttr(1.0) ]); // give Thief 100% steal rate - game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + it("should prevent the user's items from being stolen", async () => { + game.override.enemyMoveset(Moves.THIEF); + vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([new StealHeldItemChanceAttr(1.0)]); // give Thief 100% steal rate + game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getHeldItems().length).toBe(1); - } - ); + expect(leadPokemon.getHeldItems().length).toBe(1); + }); - it( - "should prevent the user's items from being removed", - async () => { - game.override.moveset([ Moves.KNOCK_OFF ]); - game.override.enemyHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + it("should prevent the user's items from being removed", async () => { + game.override.moveset([Moves.KNOCK_OFF]); + game.override.enemyHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); - const enemyNumItems = enemyPokemon.getHeldItems().length; + enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); + const enemyNumItems = enemyPokemon.getHeldItems().length; - game.move.select(Moves.KNOCK_OFF); + game.move.select(Moves.KNOCK_OFF); - await game.phaseInterceptor.to("MoveEndPhase", false); + await game.phaseInterceptor.to("MoveEndPhase", false); - expect(enemyPokemon.getHeldItems().length).toBe(enemyNumItems); - } - ); + expect(enemyPokemon.getHeldItems().length).toBe(enemyNumItems); + }); - it( - "move effect should prevent the user's berries from being stolen and eaten", - async () => { - game.override.enemyMoveset(Moves.BUG_BITE); - game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + it("move effect should prevent the user's berries from being stolen and eaten", async () => { + game.override.enemyMoveset(Moves.BUG_BITE); + game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.TACKLE); + game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("MoveEndPhase", false); - const enemyPostAttackHp = enemyPokemon.hp; + await game.phaseInterceptor.to("MoveEndPhase", false); + const enemyPostAttackHp = enemyPokemon.hp; - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getHeldItems().length).toBe(1); - expect(enemyPokemon.hp).toBe(enemyPostAttackHp); - } - ); + expect(leadPokemon.getHeldItems().length).toBe(1); + expect(enemyPokemon.hp).toBe(enemyPostAttackHp); + }); - it( - "should prevent the user's stats from being reset by Clear Smog", - async () => { - game.override.enemyMoveset(Moves.CLEAR_SMOG); + it("should prevent the user's stats from being reset by Clear Smog", async () => { + game.override.enemyMoveset(Moves.CLEAR_SMOG); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SWORDS_DANCE); + game.move.select(Moves.SWORDS_DANCE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); - it( - "should prevent the user from becoming confused", - async () => { - game.override.enemyMoveset(Moves.MAGICAL_TORQUE); - vi.spyOn(allMoves[Moves.MAGICAL_TORQUE], "chance", "get").mockReturnValue(100); + it("should prevent the user from becoming confused", async () => { + game.override.enemyMoveset(Moves.MAGICAL_TORQUE); + vi.spyOn(allMoves[Moves.MAGICAL_TORQUE], "chance", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - game.move.select(Moves.SWORDS_DANCE); + game.move.select(Moves.SWORDS_DANCE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.getTag(BattlerTagType.CONFUSED)).toBeUndefined(); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); + expect(leadPokemon.getTag(BattlerTagType.CONFUSED)).toBeUndefined(); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); - it( - "should transfer to the switched in Pokemon when the source uses Baton Pass", - async () => { - game.override.moveset([ Moves.SUBSTITUTE, Moves.BATON_PASS ]); + it("should transfer to the switched in Pokemon when the source uses Baton Pass", async () => { + game.override.moveset([Moves.SUBSTITUTE, Moves.BATON_PASS]); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - // Simulate a Baton switch for the player this turn - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, 1, true); - }); + // Simulate a Baton switch for the player this turn + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, 1, true); + }); - await game.phaseInterceptor.to("MovePhase", false); + await game.phaseInterceptor.to("MovePhase", false); - const switchedPokemon = game.scene.getPlayerPokemon()!; - const subTag = switchedPokemon.getTag(SubstituteTag)!; - expect(subTag).toBeDefined(); - expect(subTag.hp).toBe(Math.floor(leadPokemon.getMaxHp() * 1 / 4)); - } - ); + const switchedPokemon = game.scene.getPlayerPokemon()!; + const subTag = switchedPokemon.getTag(SubstituteTag)!; + expect(subTag).toBeDefined(); + expect(subTag.hp).toBe(Math.floor((leadPokemon.getMaxHp() * 1) / 4)); + }); - it( - "should prevent the source's Rough Skin from activating when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.ability(Abilities.ROUGH_SKIN); + it("should prevent the source's Rough Skin from activating when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.ability(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SUBSTITUTE); + game.move.select(Moves.SUBSTITUTE); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should prevent the source's Focus Punch from failing when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.FOCUS_PUNCH ]); + it("should prevent the source's Focus Punch from failing when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.FOCUS_PUNCH]); - // Make Focus Punch 40 power to avoid a KO - vi.spyOn(allMoves[Moves.FOCUS_PUNCH], "calculateBattlePower").mockReturnValue(40); + // Make Focus Punch 40 power to avoid a KO + vi.spyOn(allMoves[Moves.FOCUS_PUNCH], "calculateBattlePower").mockReturnValue(40); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - game.move.select(Moves.FOCUS_PUNCH); + game.move.select(Moves.FOCUS_PUNCH); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); - it( - "should not allow Shell Trap to activate when attacked", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.SHELL_TRAP ]); + it("should not allow Shell Trap to activate when attacked", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.SHELL_TRAP]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - game.move.select(Moves.SHELL_TRAP); + game.move.select(Moves.SHELL_TRAP); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); - it( - "should not allow Beak Blast to burn opponents when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.BEAK_BLAST ]); + it("should not allow Beak Blast to burn opponents when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.BEAK_BLAST]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - game.move.select(Moves.BEAK_BLAST); + game.move.select(Moves.BEAK_BLAST); - await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); - expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); - } - ); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); + }); - it( - "should cause incoming attacks to not activate Counter", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.COUNTER ]); + it("should cause incoming attacks to not activate Counter", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.COUNTER]); - await game.classicMode.startBattle([ Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - game.move.select(Moves.COUNTER); + game.move.select(Moves.COUNTER); - await game.phaseInterceptor.to("BerryPhase", false); + await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); - it( - "should prevent Sappy Seed from applying its Leech Seed effect to the user", - async () => { - game.override.enemyMoveset(Moves.SAPPY_SEED); + it("should prevent Sappy Seed from applying its Leech Seed effect to the user", async () => { + game.override.enemyMoveset(Moves.SAPPY_SEED); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); // enemy uses Sappy Seed first - await game.move.forceHit(); // forces Sappy Seed to hit - await game.phaseInterceptor.to("MoveEndPhase"); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); // enemy uses Sappy Seed first + await game.move.forceHit(); // forces Sappy Seed to hit + await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getTag(BattlerTagType.SEEDED)).toBeUndefined(); - } - ); + expect(playerPokemon.getTag(BattlerTagType.SEEDED)).toBeUndefined(); + }); }); diff --git a/test/moves/swallow.test.ts b/test/moves/swallow.test.ts index 1ede5808d82..baa03801079 100644 --- a/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -34,7 +34,7 @@ describe("Moves - Swallow", () => { game.override.enemyAbility(Abilities.NONE); game.override.enemyLevel(2000); - game.override.moveset([ Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW ]); + game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); game.override.ability(Abilities.NONE); }); @@ -43,7 +43,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 1; const expectedHeal = 25; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -70,7 +70,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 2; const expectedHeal = 50; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -98,7 +98,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 3; const expectedHeal = 100; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -125,7 +125,7 @@ describe("Moves - Swallow", () => { }); it("fails without stacks", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; @@ -135,12 +135,16 @@ describe("Moves - Swallow", () => { game.move.select(Moves.SWALLOW); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL, targets: [ pokemon.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.FAIL, + targets: [pokemon.getBattlerIndex()], + }); }); describe("restores stat stage boosts granted by stacks", () => { it("decreases stats based on stored values (both boosts equal)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -156,7 +160,11 @@ describe("Moves - Swallow", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS, targets: [ pokemon.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.SUCCESS, + targets: [pokemon.getBattlerIndex()], + }); expect(pokemon.getStatStage(Stat.DEF)).toBe(0); expect(pokemon.getStatStage(Stat.SPDEF)).toBe(0); @@ -165,7 +173,7 @@ describe("Moves - Swallow", () => { }); it("lower stat stages based on stored values (different boosts)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -183,7 +191,11 @@ describe("Moves - Swallow", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS, targets: [ pokemon.getBattlerIndex() ]}); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.SUCCESS, + targets: [pokemon.getBattlerIndex()], + }); expect(pokemon.getStatStage(Stat.DEF)).toBe(1); expect(pokemon.getStatStage(Stat.SPDEF)).toBe(-2); diff --git a/test/moves/syrup_bomb.test.ts b/test/moves/syrup_bomb.test.ts index a284e6fa669..1e193793d82 100644 --- a/test/moves/syrup_bomb.test.ts +++ b/test/moves/syrup_bomb.test.ts @@ -31,60 +31,56 @@ describe("Moves - SYRUP BOMB", () => { .ability(Abilities.BALL_FETCH) .startingLevel(30) .enemyLevel(100) - .moveset([ Moves.SYRUP_BOMB, Moves.SPLASH ]) + .moveset([Moves.SYRUP_BOMB, Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/syrup_bomb_(move) - it("decreases the target Pokemon's speed stat once per turn for 3 turns", - async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + it("decreases the target Pokemon's speed stat once per turn for 3 turns", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); - const targetPokemon = game.scene.getEnemyPokemon()!; - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); - - game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.move.forceHit(); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-1); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-2); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-3); - } - ); - - it("does not affect Pokemon with the ability Bulletproof", - async () => { - game.override.enemyAbility(Abilities.BULLETPROOF); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const targetPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.move.forceHit(); - await game.toNextTurn(); - expect(targetPokemon.isFullHp()).toBe(true); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); - - it("stops lowering the target's speed if the user leaves the field", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + const targetPokemon = game.scene.getEnemyPokemon()!; + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-2); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-3); + }); + + it("does not affect Pokemon with the ability Bulletproof", async () => { + game.override.enemyAbility(Abilities.BULLETPROOF); + await game.classicMode.startBattle([Species.MAGIKARP]); + + const targetPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SYRUP_BOMB); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.toNextTurn(); + expect(targetPokemon.isFullHp()).toBe(true); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); + }); + + it("stops lowering the target's speed if the user leaves the field", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); + + game.move.select(Moves.SYRUP_BOMB); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.toNextTurn(); diff --git a/test/moves/tackle.test.ts b/test/moves/tackle.test.ts index 2ee811d3137..44fc698ec62 100644 --- a/test/moves/tackle.test.ts +++ b/test/moves/tackle.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Tackle", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,17 +28,15 @@ describe("Moves - Tackle", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.startingLevel(1); game.override.startingWave(97); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.GROWTH, Moves.GROWTH, Moves.GROWTH, Moves.GROWTH ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.GROWTH, Moves.GROWTH, Moves.GROWTH, Moves.GROWTH]); game.override.disableCrits(); }); it("TACKLE against ghost", async () => { const moveToUse = Moves.TACKLE; game.override.enemySpecies(Species.GENGAR); - await game.startBattle([ - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA]); const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; game.move.select(moveToUse); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); @@ -49,13 +46,10 @@ describe("Moves - Tackle", () => { it("TACKLE against not resistant", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA]); game.scene.currentBattle.enemyParty[0].stats[Stat.DEF] = 50; game.scene.getPlayerParty()[0].stats[Stat.ATK] = 50; - const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; game.move.select(moveToUse); diff --git a/test/moves/tail_whip.test.ts b/test/moves/tail_whip.test.ts index fea334e4708..41c39ab22ca 100644 --- a/test/moves/tail_whip.test.ts +++ b/test/moves/tail_whip.test.ts @@ -8,7 +8,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; - describe("Moves - Tail whip", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,16 +30,13 @@ describe("Moves - Tail whip", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should lower DEF stat stage by 1", async() => { + it("should lower DEF stat stage by 1", async () => { const moveToUse = Moves.TAIL_WHIP; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); diff --git a/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts index 56cf85749cd..24a7fa25061 100644 --- a/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -25,12 +25,12 @@ describe("Moves - Tailwind", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(Moves.SPLASH); }); it("doubles the Speed stat of the Pokemons on its side", async () => { - await game.startBattle([ Species.MAGIKARP, Species.MEOWTH ]); + await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); const magikarp = game.scene.getPlayerField()[0]; const meowth = game.scene.getPlayerField()[1]; @@ -53,7 +53,7 @@ describe("Moves - Tailwind", () => { it("lasts for 4 turns", async () => { game.override.battleType("single"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); game.move.select(Moves.TAILWIND); await game.toNextTurn(); @@ -76,7 +76,7 @@ describe("Moves - Tailwind", () => { it("does not affect the opposing side", async () => { game.override.battleType("single"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const ally = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -84,7 +84,6 @@ describe("Moves - Tailwind", () => { const allySpd = ally.getStat(Stat.SPD); const enemySpd = enemy.getStat(Stat.SPD); - expect(ally.getEffectiveStat(Stat.SPD)).equal(allySpd); expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); diff --git a/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts index e5adfe6112d..ac3ba534446 100644 --- a/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -29,12 +29,12 @@ describe("Moves - Tar Shot", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.TANGELA) .enemyLevel(1000) - .moveset([ Moves.TAR_SHOT, Moves.FIRE_PUNCH ]) + .moveset([Moves.TAR_SHOT, Moves.FIRE_PUNCH]) .disableCrits(); }); 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([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -48,14 +48,14 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); }); 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([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -76,7 +76,7 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); @@ -84,7 +84,7 @@ describe("Moves - Tar Shot", () => { it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => { game.override.enemySpecies(Species.SPRIGATITO); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; enemy.teraType = PokemonType.GRASS; @@ -100,7 +100,7 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); @@ -108,7 +108,7 @@ describe("Moves - Tar Shot", () => { it("doubles the effectiveness of Fire-type moves against a Pokémon that is already under the effects of Tar Shot before it Terastallized", async () => { game.override.enemySpecies(Species.SPRIGATITO); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -125,7 +125,7 @@ describe("Moves - Tar Shot", () => { enemy.isTerastallized = true; game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); diff --git a/test/moves/taunt.test.ts b/test/moves/taunt.test.ts index c5cdd512704..adc1434c7dd 100644 --- a/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -25,13 +25,13 @@ describe("Moves - Taunt", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.TAUNT, Moves.SPLASH ]) + .enemyMoveset([Moves.TAUNT, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) - .moveset([ Moves.GROWL ]); + .moveset([Moves.GROWL]); }); it("Pokemon should not be able to use Status Moves", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts index f24f972b44c..1355cb975f3 100644 --- a/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -26,16 +26,16 @@ describe("Moves - Telekinesis", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TELEKINESIS, Moves.TACKLE, Moves.MUD_SHOT, Moves.SMACK_DOWN ]) + .moveset([Moves.TELEKINESIS, Moves.TACKLE, Moves.MUD_SHOT, Moves.SMACK_DOWN]) .battleType("single") .enemySpecies(Species.SNORLAX) .enemyLevel(60) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH ]); + .enemyMoveset([Moves.SPLASH]); }); it("Telekinesis makes the affected vulnerable to most attacking moves regardless of accuracy", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -52,7 +52,7 @@ describe("Moves - Telekinesis", () => { }); it("Telekinesis makes the affected airborne and immune to most Ground-moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -70,7 +70,7 @@ describe("Moves - Telekinesis", () => { it("Telekinesis can still affect Pokemon that have been transformed into invalid Pokemon", async () => { game.override.enemyMoveset(Moves.TRANSFORM); - await game.classicMode.startBattle([ Species.DIGLETT ]); + await game.classicMode.startBattle([Species.DIGLETT]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -82,7 +82,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([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -99,8 +99,8 @@ describe("Moves - Telekinesis", () => { }); it("Ingrain will remove the floating effect of Telekinesis, but not the 100% hit", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.INGRAIN ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.INGRAIN]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -124,14 +124,15 @@ describe("Moves - Telekinesis", () => { }); it("should not be baton passed onto a mega gengar", async () => { - game.override.moveset([ Moves.BATON_PASS ]) - .enemyMoveset([ Moves.TELEKINESIS ]) + game.override + .moveset([Moves.BATON_PASS]) + .enemyMoveset([Moves.TELEKINESIS]) .starterForms({ [Species.GENGAR]: 1 }); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.GENGAR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.GENGAR]); game.move.select(Moves.BATON_PASS); game.doSelectPartyPokemon(1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TELEKINESIS)).toBeUndefined(); }); diff --git a/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts index 772b14d9f36..dffe39f4d87 100644 --- a/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -1,191 +1,190 @@ -import { BattlerIndex } from "#app/battle"; -import { Stat } from "#enums/stat"; -import { allMoves, TeraMoveCategoryAttr } from "#app/data/moves/move"; -import { PokemonType } from "#enums/pokemon-type"; -import { Abilities } from "#app/enums/abilities"; -import { HitResult } from "#app/field/pokemon"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import GameManager from "#test/testUtils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - -describe("Moves - Tera Blast", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - const moveToCheck = allMoves[Moves.TERA_BLAST]; - const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - - game.override - .battleType("single") - .disableCrits() - .starterSpecies(Species.FEEBAS) - .moveset([ Moves.TERA_BLAST ]) - .ability(Abilities.BALL_FETCH) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.STURDY) - .enemyLevel(50); - - vi.spyOn(moveToCheck, "calculateBattlePower"); - }); - - it("changes type to match user's tera type", async () => { - game.override.enemySpecies(Species.FURRET); - await game.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(enemyPokemon, "apply"); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = PokemonType.FIGHTING; - playerPokemon.isTerastallized = true; - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); - }, 20000); - - it("increases power if user is Stellar tera type", async () => { - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = PokemonType.STELLAR; - playerPokemon.isTerastallized = true; - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); - }, 20000); - - it("is super effective against terastallized targets if user is Stellar tera type", async () => { - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = PokemonType.STELLAR; - playerPokemon.isTerastallized = true; - - const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(enemyPokemon, "apply"); - enemyPokemon.isTerastallized = true; - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); - }); - - it("uses the higher ATK for damage calculation", async () => { - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.stats[Stat.ATK] = 100; - playerPokemon.stats[Stat.SPATK] = 1; - playerPokemon.isTerastallized = true; - - vi.spyOn(teraBlastAttr, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.toNextTurn(); - expect(teraBlastAttr.apply).toHaveLastReturnedWith(true); - }); - - it("uses the higher SPATK for damage calculation", async () => { - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.stats[Stat.ATK] = 1; - playerPokemon.stats[Stat.SPATK] = 100; - - vi.spyOn(teraBlastAttr, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.toNextTurn(); - expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); - }); - - it("should stay as a special move if ATK turns lower than SPATK mid-turn", async () => { - game.override.enemyMoveset([ Moves.CHARM ]); - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.stats[Stat.ATK] = 51; - playerPokemon.stats[Stat.SPATK] = 50; - - vi.spyOn(teraBlastAttr, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.toNextTurn(); - expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); - }); - - it("does not change its move category from stat changes due to held items", async () => { - game.override - .startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]) - .starterSpecies(Species.CUBONE); - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - playerPokemon.stats[Stat.ATK] = 50; - playerPokemon.stats[Stat.SPATK] = 51; - - vi.spyOn(teraBlastAttr, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.toNextTurn(); - - expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); - }); - - it("does not change its move category from stat changes due to abilities", async () => { - game.override.ability(Abilities.HUGE_POWER); - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.stats[Stat.ATK] = 50; - playerPokemon.stats[Stat.SPATK] = 51; - - vi.spyOn(teraBlastAttr, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.toNextTurn(); - expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); - }); - - - it("causes stat drops if user is Stellar tera type", async () => { - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = PokemonType.STELLAR; - playerPokemon.isTerastallized = true; - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1); - expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); - }, 20000); -}); +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves, TeraMoveCategoryAttr } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { Abilities } from "#app/enums/abilities"; +import { HitResult } from "#app/field/pokemon"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Tera Blast", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const moveToCheck = allMoves[Moves.TERA_BLAST]; + const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .disableCrits() + .starterSpecies(Species.FEEBAS) + .moveset([Moves.TERA_BLAST]) + .ability(Abilities.BALL_FETCH) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.STURDY) + .enemyLevel(50); + + vi.spyOn(moveToCheck, "calculateBattlePower"); + }); + + it("changes type to match user's tera type", async () => { + game.override.enemySpecies(Species.FURRET); + await game.startBattle(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.FIGHTING; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }, 20000); + + it("increases power if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); + }, 20000); + + it("is super effective against terastallized targets if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + enemyPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }); + + it("uses the higher ATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 100; + playerPokemon.stats[Stat.SPATK] = 1; + playerPokemon.isTerastallized = true; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(true); + }); + + it("uses the higher SPATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 1; + playerPokemon.stats[Stat.SPATK] = 100; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("should stay as a special move if ATK turns lower than SPATK mid-turn", async () => { + game.override.enemyMoveset([Moves.CHARM]); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 51; + playerPokemon.stats[Stat.SPATK] = 50; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to held items", async () => { + game.override + .startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]) + .starterSpecies(Species.CUBONE); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to abilities", async () => { + game.override.ability(Abilities.HUGE_POWER); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("causes stat drops if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1); + expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); + }, 20000); +}); diff --git a/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts index 9e2a06c7f0f..19fe58f4057 100644 --- a/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -24,7 +24,7 @@ describe("Moves - Tera Starstorm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TERA_STARSTORM, Moves.SPLASH ]) + .moveset([Moves.TERA_STARSTORM, Moves.SPLASH]) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -34,7 +34,7 @@ describe("Moves - Tera Starstorm", () => { it("changes type to Stellar when used by Terapagos in its Stellar Form", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ Species.TERAPAGOS ]); + await game.classicMode.startBattle([Species.TERAPAGOS]); const terapagos = game.scene.getPlayerPokemon()!; terapagos.isTerastallized = true; @@ -48,7 +48,7 @@ describe("Moves - Tera Starstorm", () => { }); it("targets both opponents in a double battle when used by Terapagos in its Stellar Form", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.TERAPAGOS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.TERAPAGOS]); const terapagos = game.scene.getPlayerParty()[1]; terapagos.isTerastallized = true; @@ -56,7 +56,7 @@ describe("Moves - Tera Starstorm", () => { game.move.select(Moves.TERA_STARSTORM, 0, BattlerIndex.ENEMY); game.move.select(Moves.TERA_STARSTORM, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); const enemyField = game.scene.getEnemyField(); @@ -70,7 +70,7 @@ describe("Moves - Tera Starstorm", () => { }); it("applies the effects when Terapagos in Stellar Form is fused with another Pokemon", async () => { - await game.classicMode.startBattle([ Species.TERAPAGOS, Species.CHARMANDER, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.TERAPAGOS, Species.CHARMANDER, Species.MAGIKARP]); const fusionedMon = game.scene.getPlayerParty()[0]; const magikarp = game.scene.getPlayerParty()[2]; diff --git a/test/moves/thousand_arrows.test.ts b/test/moves/thousand_arrows.test.ts index 563f99c030d..109fc2c6936 100644 --- a/test/moves/thousand_arrows.test.ts +++ b/test/moves/thousand_arrows.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Thousand Arrows", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,71 +28,62 @@ describe("Moves - Thousand Arrows", () => { game.override.enemySpecies(Species.TOGETIC); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.moveset([ Moves.THOUSAND_ARROWS ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.moveset([Moves.THOUSAND_ARROWS]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); - it( - "move should hit and ground Flying-type targets", - async () => { - await game.startBattle([ Species.ILLUMISE ]); + it("move should hit and ground Flying-type targets", async () => { + await game.startBattle([Species.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.THOUSAND_ARROWS); + game.move.select(Moves.THOUSAND_ARROWS); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Enemy should not be grounded before move effect is applied - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); - it( - "move should hit and ground targets with Levitate", - async () => { - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.LEVITATE); + it("move should hit and ground targets with Levitate", async () => { + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.LEVITATE); - await game.startBattle([ Species.ILLUMISE ]); + await game.startBattle([Species.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.THOUSAND_ARROWS); + game.move.select(Moves.THOUSAND_ARROWS); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Enemy should not be grounded before move effect is applied - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); - it( - "move should hit and ground targets under the effects of Magnet Rise", - async () => { - game.override.enemySpecies(Species.SNORLAX); + it("move should hit and ground targets under the effects of Magnet Rise", async () => { + game.override.enemySpecies(Species.SNORLAX); - await game.startBattle([ Species.ILLUMISE ]); + await game.startBattle([Species.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.addTag(BattlerTagType.FLOATING, undefined, Moves.MAGNET_RISE); + enemyPokemon.addTag(BattlerTagType.FLOATING, undefined, Moves.MAGNET_RISE); - game.move.select(Moves.THOUSAND_ARROWS); + game.move.select(Moves.THOUSAND_ARROWS); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.FLOATING)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); + expect(enemyPokemon.getTag(BattlerTagType.FLOATING)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); }); diff --git a/test/moves/throat_chop.test.ts b/test/moves/throat_chop.test.ts index d69205aadf3..755e60fe425 100644 --- a/test/moves/throat_chop.test.ts +++ b/test/moves/throat_chop.test.ts @@ -32,12 +32,12 @@ describe("Moves - Throat Chop", () => { }); it("prevents the target from using sound-based moves for two turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); // First turn, move is interrupted await game.phaseInterceptor.to("TurnEndPhase"); @@ -47,7 +47,7 @@ describe("Moves - Throat Chop", () => { await game.toNextTurn(); game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.isFullHp()).toBe(false); diff --git a/test/moves/thunder_wave.test.ts b/test/moves/thunder_wave.test.ts index 34ab64e081a..9f907e38b62 100644 --- a/test/moves/thunder_wave.test.ts +++ b/test/moves/thunder_wave.test.ts @@ -7,7 +7,6 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Thunder Wave", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,7 +26,7 @@ describe("Moves - Thunder Wave", () => { game.override .battleType("single") .starterSpecies(Species.PIKACHU) - .moveset([ Moves.THUNDER_WAVE ]) + .moveset([Moves.THUNDER_WAVE]) .enemyMoveset(Moves.SPLASH); }); diff --git a/test/moves/tidy_up.test.ts b/test/moves/tidy_up.test.ts index 5b5b67847ce..9d98feb13f5 100644 --- a/test/moves/tidy_up.test.ts +++ b/test/moves/tidy_up.test.ts @@ -10,7 +10,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SubstituteTag } from "#app/data/battler-tags"; - describe("Moves - Tidy Up", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -33,13 +32,13 @@ describe("Moves - Tidy Up", () => { game.override.enemyMoveset(Moves.SPLASH); game.override.starterSpecies(Species.FEEBAS); game.override.ability(Abilities.BALL_FETCH); - game.override.moveset([ Moves.TIDY_UP ]); + game.override.moveset([Moves.TIDY_UP]); game.override.startingLevel(50); }); it("spikes are cleared", async () => { - game.override.moveset([ Moves.SPIKES, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES ]); + game.override.moveset([Moves.SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.classicMode.startBattle(); game.move.select(Moves.SPIKES); @@ -47,12 +46,11 @@ describe("Moves - Tidy Up", () => { game.move.select(Moves.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined(); - }, 20000); it("stealth rocks are cleared", async () => { - game.override.moveset([ Moves.STEALTH_ROCK, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK ]); + game.override.moveset([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); await game.classicMode.startBattle(); game.move.select(Moves.STEALTH_ROCK); @@ -63,8 +61,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("toxic spikes are cleared", async () => { - game.override.moveset([ Moves.TOXIC_SPIKES, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES ]); + game.override.moveset([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); await game.classicMode.startBattle(); game.move.select(Moves.TOXIC_SPIKES); @@ -75,8 +73,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("sticky webs are cleared", async () => { - game.override.moveset([ Moves.STICKY_WEB, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB ]); + game.override.moveset([Moves.STICKY_WEB, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); await game.classicMode.startBattle(); @@ -88,8 +86,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("substitutes are cleared", async () => { - game.override.moveset([ Moves.SUBSTITUTE, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE ]); + game.override.moveset([Moves.SUBSTITUTE, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.classicMode.startBattle(); @@ -98,7 +96,7 @@ describe("Moves - Tidy Up", () => { game.move.select(Moves.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); - const pokemon = [ game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()! ]; + const pokemon = [game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()!]; pokemon.forEach(p => { expect(p).toBeDefined(); expect(p!.getTag(SubstituteTag)).toBeUndefined(); diff --git a/test/moves/torment.test.ts b/test/moves/torment.test.ts index 8cc835aad48..75143053321 100644 --- a/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -26,15 +26,15 @@ describe("Moves - Torment", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.TORMENT, Moves.SPLASH ]) + .enemyMoveset([Moves.TORMENT, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) .enemyLevel(30) - .moveset([ Moves.TACKLE ]) + .moveset([Moves.TACKLE]) .ability(Abilities.BALL_FETCH); }); it("Pokemon should not be able to use the same move consecutively", async () => { - await game.classicMode.startBattle([ Species.CHANSEY ]); + await game.classicMode.startBattle([Species.CHANSEY]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/toxic.test.ts b/test/moves/toxic.test.ts index 4fea079638a..f2b1f82fe02 100644 --- a/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -23,16 +23,12 @@ describe("Moves - Toxic", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .battleType("single") - .moveset(Moves.TOXIC) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset(Moves.SPLASH); + game.override.battleType("single").moveset(Moves.TOXIC).enemySpecies(Species.MAGIKARP).enemyMoveset(Moves.SPLASH); }); it("should be guaranteed to hit if user is Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); @@ -42,7 +38,7 @@ describe("Moves - Toxic", () => { it("may miss if user is not Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); - await game.classicMode.startBattle([ Species.UMBREON ]); + await game.classicMode.startBattle([Species.UMBREON]); game.move.select(Moves.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); @@ -53,10 +49,10 @@ describe("Moves - Toxic", () => { it("should hit semi-invulnerable targets if user is Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.TOXIC); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); @@ -65,10 +61,10 @@ describe("Moves - Toxic", () => { it("should miss semi-invulnerable targets if user is not Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(-1); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.UMBREON ]); + await game.classicMode.startBattle([Species.UMBREON]); game.move.select(Moves.TOXIC); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.getEnemyPokemon()!.status).toBeUndefined(); @@ -77,10 +73,10 @@ describe("Moves - Toxic", () => { it("moves other than Toxic should not hit semi-invulnerable targets even if user is Poison-type", async () => { game.override.moveset(Moves.SWIFT); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.SWIFT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/moves/toxic_spikes.test.ts b/test/moves/toxic_spikes.test.ts index 2bddbc2eccb..d457ec5cb56 100644 --- a/test/moves/toxic_spikes.test.ts +++ b/test/moves/toxic_spikes.test.ts @@ -34,11 +34,11 @@ describe("Moves - Toxic Spikes", () => { .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR, Moves.COURT_CHANGE ]); + .moveset([Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR, Moves.COURT_CHANGE]); }); it("should not affect the opponent if they do not switch", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); const enemy = game.scene.getEnemyField()[0]; @@ -54,7 +54,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should poison the opponent if they switch into 1 layer", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -68,7 +68,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should badly poison the opponent if they switch into 2 layers", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -83,7 +83,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should be removed if a grounded poison pokemon switches in", async () => { - await game.classicMode.runToSummon([ Species.MUK, Species.PIDGEY ]); + await game.classicMode.runToSummon([Species.MUK, Species.PIDGEY]); const muk = game.scene.getPlayerPokemon()!; @@ -106,12 +106,12 @@ describe("Moves - Toxic Spikes", () => { }); it("shouldn't create multiple layers per use in doubles", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); - const arenaTags = (game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag); + const arenaTags = game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; expect(arenaTags.tagType).toBe(ArenaTagType.TOXIC_SPIKES); expect(arenaTags.layers).toBe(1); }); @@ -120,7 +120,7 @@ describe("Moves - Toxic Spikes", () => { game.override.startingWave(1); const gameData = new GameData(); - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -129,9 +129,11 @@ describe("Moves - Toxic Spikes", () => { await game.phaseInterceptor.to("BattleEndPhase"); await game.toNextWave(); - const sessionData : SessionSaveData = gameData["getSessionSaveData"](); + const sessionData: SessionSaveData = gameData["getSessionSaveData"](); localStorage.setItem("sessionTestData", encrypt(JSON.stringify(sessionData), true)); - const recoveredData : SessionSaveData = gameData.parseSessionData(decrypt(localStorage.getItem("sessionTestData")!, true)); + const recoveredData: SessionSaveData = gameData.parseSessionData( + decrypt(localStorage.getItem("sessionTestData")!, true), + ); await gameData.loadSession(0, recoveredData); expect(sessionData.arena.tags).toEqual(recoveredData.arena.tags); diff --git a/test/moves/transform.test.ts b/test/moves/transform.test.ts index 781e83b7e89..5140202a383 100644 --- a/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -32,11 +32,11 @@ describe("Moves - Transform", () => { .enemyPassiveAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .ability(Abilities.INTIMIDATE) - .moveset([ Moves.TRANSFORM ]); + .moveset([Moves.TRANSFORM]); }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.TRANSFORM); await game.phaseInterceptor.to(TurnEndPhase); @@ -75,9 +75,9 @@ describe("Moves - Transform", () => { }); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -96,9 +96,9 @@ describe("Moves - Transform", () => { }); it("should set each move's pp to a maximum of 5", async () => { - game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + game.override.enemyMoveset([Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.TRANSFORM); @@ -118,10 +118,9 @@ describe("Moves - Transform", () => { }); it("should activate its ability if it copies one that activates on summon", async () => { - game.override.enemyAbility(Abilities.INTIMIDATE) - .ability(Abilities.BALL_FETCH); + game.override.enemyAbility(Abilities.INTIMIDATE).ability(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.TRANSFORM); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts index 927d625fbb8..108028f3008 100644 --- a/test/moves/trick_or_treat.test.ts +++ b/test/moves/trick_or_treat.test.ts @@ -23,7 +23,7 @@ describe("Moves - Trick Or Treat", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT ]) + .moveset([Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -33,7 +33,7 @@ describe("Moves - Trick Or Treat", () => { }); it("will replace added type from Forest's Curse", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemyPokemon = game.scene.getEnemyPokemon(); game.move.select(Moves.FORESTS_CURSE); diff --git a/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts index 11926b4066d..c1114b69b99 100644 --- a/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -27,7 +27,7 @@ describe("Moves - Triple Arrows", () => { game = new GameManager(phaserGame); game.override .ability(Abilities.BALL_FETCH) - .moveset([ Moves.TRIPLE_ARROWS ]) + .moveset([Moves.TRIPLE_ARROWS]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.STURDY) @@ -38,7 +38,7 @@ describe("Moves - Triple Arrows", () => { }); it("has a 30% flinch chance and 50% defense drop chance", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.TRIPLE_ARROWS); await game.phaseInterceptor.to("BerryPhase"); @@ -49,7 +49,7 @@ describe("Moves - Triple Arrows", () => { it("is affected normally by Serene Grace", async () => { game.override.ability(Abilities.SERENE_GRACE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.TRIPLE_ARROWS); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/u_turn.test.ts b/test/moves/u_turn.test.ts index f57dec2e39f..f1d212f3f47 100644 --- a/test/moves/u_turn.test.ts +++ b/test/moves/u_turn.test.ts @@ -27,7 +27,7 @@ describe("Moves - U-turn", () => { .enemySpecies(Species.GENGAR) .startingLevel(90) .startingWave(97) - .moveset([ Moves.U_TURN ]) + .moveset([Moves.U_TURN]) .enemyMoveset(Moves.SPLASH) .disableCrits(); }); @@ -36,7 +36,7 @@ describe("Moves - U-turn", () => { // arrange const playerHp = 1; game.override.ability(Abilities.REGENERATOR); - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); game.scene.getPlayerPokemon()!.hp = playerHp; // act @@ -45,7 +45,9 @@ describe("Moves - U-turn", () => { await game.phaseInterceptor.to("TurnEndPhase"); // assert - expect(game.scene.getPlayerParty()[1].hp).toEqual(Math.floor(game.scene.getPlayerParty()[1].getMaxHp() * 0.33 + playerHp)); + expect(game.scene.getPlayerParty()[1].hp).toEqual( + Math.floor(game.scene.getPlayerParty()[1].getMaxHp() * 0.33 + playerHp), + ); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.SHUCKLE); }, 20000); @@ -53,7 +55,7 @@ describe("Moves - U-turn", () => { it("triggers rough skin on the u-turn user before a new pokemon is switched in", async () => { // arrange game.override.enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // act game.move.select(Moves.U_TURN); @@ -71,7 +73,7 @@ describe("Moves - U-turn", () => { it("triggers contact abilities on the u-turn user (eg poison point) before a new pokemon is switched in", async () => { // arrange game.override.enemyAbility(Abilities.POISON_POINT); - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); vi.spyOn(game.scene.getEnemyPokemon()!, "randSeedInt").mockReturnValue(0); // act @@ -88,10 +90,7 @@ describe("Moves - U-turn", () => { 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([ - Species.RAICHU, - Species.SHUCKLE - ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); const enemy = game.scene.getEnemyPokemon()!; // KO the opponent with U-Turn diff --git a/test/moves/upper_hand.test.ts b/test/moves/upper_hand.test.ts index c7556c1fa91..ecfd9f0735c 100644 --- a/test/moves/upper_hand.test.ts +++ b/test/moves/upper_hand.test.ts @@ -36,7 +36,7 @@ describe("Moves - Upper Hand", () => { }); it("should flinch the opponent before they use a priority attack", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const feebas = game.scene.getPlayerPokemon()!; const magikarp = game.scene.getEnemyPokemon()!; @@ -51,11 +51,11 @@ describe("Moves - Upper Hand", () => { it.each([ { descriptor: "non-priority attack", move: Moves.TACKLE }, - { descriptor: "status move", move: Moves.BABY_DOLL_EYES } + { descriptor: "status move", move: Moves.BABY_DOLL_EYES }, ])("should fail when the opponent selects a $descriptor", async ({ move }) => { game.override.enemyMoveset(move); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const feebas = game.scene.getPlayerPokemon()!; @@ -66,11 +66,9 @@ describe("Moves - Upper Hand", () => { }); it("should flinch the opponent before they use an attack boosted by Gale Wings", async () => { - game.override - .enemyAbility(Abilities.GALE_WINGS) - .enemyMoveset(Moves.GUST); + game.override.enemyAbility(Abilities.GALE_WINGS).enemyMoveset(Moves.GUST); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const feebas = game.scene.getPlayerPokemon()!; const magikarp = game.scene.getEnemyPokemon()!; @@ -84,17 +82,15 @@ describe("Moves - Upper Hand", () => { }); it("should fail if the target has already moved", async () => { - game.override - .enemyMoveset(Moves.FAKE_OUT) - .enemyAbility(Abilities.SHEER_FORCE); + game.override.enemyMoveset(Moves.FAKE_OUT).enemyAbility(Abilities.SHEER_FORCE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const feebas = game.scene.getPlayerPokemon()!; game.move.select(Moves.UPPER_HAND); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.FAIL); diff --git a/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts index 7bf99f0ff21..d6124b6c766 100644 --- a/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -31,7 +31,7 @@ describe("Moves - Whirlwind", () => { .battleType("single") .moveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.WHIRLWIND ]) + .enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]) .enemySpecies(Species.PIDGEY); }); @@ -40,8 +40,8 @@ describe("Moves - Whirlwind", () => { { move: Moves.BOUNCE, name: "Bounce" }, { move: Moves.SKY_DROP, name: "Sky Drop" }, ])("should not hit a flying target: $name (=$move)", async ({ move }) => { - game.override.moveset([ move ]); - await game.classicMode.startBattle([ Species.STARAPTOR ]); + game.override.moveset([move]); + await game.classicMode.startBattle([Species.STARAPTOR]); const staraptor = game.scene.getPlayerPokemon()!; @@ -50,17 +50,17 @@ describe("Moves - Whirlwind", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(staraptor.findTag((t) => t.tagType === BattlerTagType.FLYING)).toBeDefined(); + expect(staraptor.findTag(t => t.tagType === BattlerTagType.FLYING)).toBeDefined(); expect(game.scene.getEnemyPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); }); it("should force switches randomly", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); - const [ bulbasaur, charmander, squirtle ] = game.scene.getPlayerParty(); + const [bulbasaur, charmander, squirtle] = game.scene.getPlayerParty(); // Turn 1: Mock an RNG call that calls for switching to 1st backup Pokemon (Charmander) - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -72,7 +72,7 @@ describe("Moves - Whirlwind", () => { expect(squirtle.isOnField()).toBe(false); // Turn 2: Mock an RNG call that calls for switching to 2nd backup Pokemon (Squirtle) - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min + 1; }); game.move.select(Moves.SPLASH); @@ -87,12 +87,12 @@ describe("Moves - Whirlwind", () => { it("should not force a switch to a challenge-ineligible Pokemon", async () => { // Mono-Water challenge, Eevee is ineligible game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.WATER + 1, 0); - await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + await game.challengeMode.startBattle([Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA]); - const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + const [lapras, eevee, toxapex, primarina] = game.scene.getPlayerParty(); // Turn 1: Mock an RNG call that would normally call for switching to Eevee, but it is ineligible - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -106,9 +106,9 @@ describe("Moves - Whirlwind", () => { }); it("should not force a switch to a fainted Pokemon", async () => { - await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + await game.classicMode.startBattle([Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA]); - const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + const [lapras, eevee, toxapex, primarina] = game.scene.getPlayerParty(); // Turn 1: Eevee faints eevee.hp = 0; @@ -119,7 +119,7 @@ describe("Moves - Whirlwind", () => { await game.toNextTurn(); // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); @@ -133,9 +133,9 @@ describe("Moves - Whirlwind", () => { }); it("should not force a switch if there are no available Pokemon to switch into", async () => { - await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE ]); + await game.classicMode.startBattle([Species.LAPRAS, Species.EEVEE]); - const [ lapras, eevee ] = game.scene.getPlayerParty(); + const [lapras, eevee] = game.scene.getPlayerParty(); // Turn 1: Eevee faints eevee.hp = 0; @@ -146,7 +146,7 @@ describe("Moves - Whirlwind", () => { await game.toNextTurn(); // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted - vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { return min; }); game.move.select(Moves.SPLASH); diff --git a/test/moves/wide_guard.test.ts b/test/moves/wide_guard.test.ts index 1f0579e24ee..c466f104f67 100644 --- a/test/moves/wide_guard.test.ts +++ b/test/moves/wide_guard.test.ts @@ -8,7 +8,6 @@ import { Stat } from "#enums/stat"; import { BerryPhase } from "#app/phases/berry-phase"; import { CommandPhase } from "#app/phases/command-phase"; - describe("Moves - Wide Guard", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,97 +27,85 @@ describe("Moves - Wide Guard", () => { game.override.battleType("double"); - game.override.moveset([ Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF ]); + game.override.moveset([Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.SWIFT ]); + game.override.enemyMoveset([Moves.SWIFT]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); game.override.enemyLevel(100); }); - test( - "should protect the user and allies from multi-target attack moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + test("should protect the user and allies from multi-target attack moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.WIDE_GUARD); + game.move.select(Moves.WIDE_GUARD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); - test( - "should protect the user and allies from multi-target status moves", - async () => { - game.override.enemyMoveset([ Moves.GROWL ]); + test("should protect the user and allies from multi-target status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.WIDE_GUARD); + game.move.select(Moves.WIDE_GUARD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); - test( - "should not protect the user and allies from single-target moves", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); + test("should not protect the user and allies from single-target moves", async () => { + game.override.enemyMoveset([Moves.TACKLE]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const leadPokemon = game.scene.getPlayerField(); - game.move.select(Moves.WIDE_GUARD); + game.move.select(Moves.WIDE_GUARD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); + game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); - } - ); + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }); - test( - "should protect the user from its ally's multi-target move", - async () => { - game.override.enemyMoveset([ Moves.SPLASH ]); + test("should protect the user from its ally's multi-target move", async () => { + game.override.enemyMoveset([Moves.SPLASH]); - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const leadPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); - game.move.select(Moves.WIDE_GUARD); + game.move.select(Moves.WIDE_GUARD); - await game.phaseInterceptor.to(CommandPhase); + await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SURF, 1); + game.move.select(Moves.SURF, 1); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); - } - ); + expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); }); diff --git a/test/moves/will_o_wisp.test.ts b/test/moves/will_o_wisp.test.ts index 473f0d4d0a8..0d19fec954c 100644 --- a/test/moves/will_o_wisp.test.ts +++ b/test/moves/will_o_wisp.test.ts @@ -24,7 +24,7 @@ describe("Moves - Will-O-Wisp", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.WILL_O_WISP, Moves.SPLASH ]) + .moveset([Moves.WILL_O_WISP, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -34,12 +34,12 @@ describe("Moves - Will-O-Wisp", () => { }); it("should burn the opponent", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.WILL_O_WISP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.toNextTurn(); diff --git a/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts index 97f292ef6b1..19ec364618e 100644 --- a/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -2,7 +2,12 @@ import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encount import { Status } from "#app/data/status-effect"; import { CommandPhase } from "#app/phases/command-phase"; import { MessagePhase } from "#app/phases/message-phase"; -import { MysteryEncounterBattlePhase, MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; +import { + MysteryEncounterBattlePhase, + MysteryEncounterOptionSelectedPhase, + MysteryEncounterPhase, + MysteryEncounterRewardsPhase, +} from "#app/phases/mystery-encounter-phases"; import { VictoryPhase } from "#app/phases/victory-phase"; import type MessageUiHandler from "#app/ui/message-ui-handler"; import type MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; @@ -22,31 +27,56 @@ import { expect, vi } from "vitest"; * @param secondaryOptionSelect * @param isBattle If selecting option should lead to battle, set to `true` */ -export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }, isBattle: boolean = false) { +export async function runMysteryEncounterToEnd( + game: GameManager, + optionNo: number, + secondaryOptionSelect?: { pokemonNo: number; optionNo?: number }, + isBattle = false, +) { vi.spyOn(EncounterPhaseUtils, "selectPokemonForOption"); await runSelectMysteryEncounterOption(game, optionNo, secondaryOptionSelect); // run the selected options phase - game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase)); + game.onNextPrompt( + "MysteryEncounterOptionSelectedPhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase), + ); if (isBattle) { - game.onNextPrompt("DamageAnimPhase", Mode.MESSAGE, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "DamageAnimPhase", + Mode.MESSAGE, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); - game.onNextPrompt("CheckSwitchPhase", Mode.MESSAGE, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.MESSAGE, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); // If a battle is started, fast forward to end of the battle game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { @@ -74,22 +104,36 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb } } -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }) { +export async function runSelectMysteryEncounterOption( + game: GameManager, + optionNo: number, + secondaryOptionSelect?: { pokemonNo: number; optionNo?: number }, +) { // Handle any eventual queued messages (e.g. weather phase, etc.) - game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); + game.onNextPrompt( + "MessagePhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase), + ); if (game.isCurrentPhase(MessagePhase)) { await game.phaseInterceptor.run(MessagePhase); } // dispose of intro messages - game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); + game.onNextPrompt( + "MysteryEncounterPhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase), + ); await game.phaseInterceptor.to(MysteryEncounterPhase, true); @@ -98,10 +142,6 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that switch (optionNo) { - default: - case 1: - // no movement needed. Default cursor position - break; case 2: uiHandler.processInput(Button.RIGHT); break; @@ -112,6 +152,9 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.RIGHT); uiHandler.processInput(Button.DOWN); break; + default: + // no movement needed. Default cursor position + break; } if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) { @@ -162,7 +205,7 @@ async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, * @param game * @param runRewardsPhase */ -export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager, runRewardsPhase: boolean = true) { +export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager, runRewardsPhase = true) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); game.scene.getEnemyParty().forEach(p => { diff --git a/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index d7f0ed6e20e..43d582c5b70 100644 --- a/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -6,7 +6,10 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -19,7 +22,7 @@ import { PartyHealPhase } from "#app/phases/party-heal-phase"; import i18next from "i18next"; const namespace = "mysteryEncounters/aTrainersTest"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -41,10 +44,10 @@ describe("A Trainer's Test - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.A_TRAINERS_TEST ]); + biomeMap.set(biome, [MysteryEncounterType.A_TRAINERS_TEST]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -107,8 +110,17 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(scene.currentBattle.trainer).toBeDefined(); - expect([ i18next.t("trainerNames:buck"), i18next.t("trainerNames:cheryl"), i18next.t("trainerNames:marley"), i18next.t("trainerNames:mira"), i18next.t("trainerNames:riley") ] - .map(name => name.toLowerCase()).includes(scene.currentBattle.trainer!.config.name)).toBeTruthy(); + expect( + [ + i18next.t("trainerNames:buck"), + i18next.t("trainerNames:cheryl"), + i18next.t("trainerNames:marley"), + i18next.t("trainerNames:mira"), + i18next.t("trainerNames:riley"), + ] + .map(name => name.toLowerCase()) + .includes(scene.currentBattle.trainer!.config.name), + ).toBeTruthy(); expect(enemyField[0]).toBeDefined(); }); @@ -138,7 +150,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { vi.spyOn(scene, "playSoundWithoutBgm").mockImplementation(() => { return { totalDuration: 1, - destroy: () => null + destroy: () => null, } as any; }); }); diff --git a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 0503a60cf1b..3e1588f3a72 100644 --- a/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -4,7 +4,10 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -19,7 +22,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import i18next from "i18next"; const namespace = "mysteryEncounters/absoluteAvarice"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 45; @@ -42,9 +45,9 @@ describe("Absolute Avarice - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.PLAINS, [ MysteryEncounterType.ABSOLUTE_AVARICE ]], - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.PLAINS, [MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -85,7 +88,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should spawn if player has enough berries", async () => { game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + ]); await game.runToMysteryEncounter(); @@ -93,7 +99,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("should remove all player's berries at the start of the encounter", async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -129,7 +138,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(Species.GREEDENT); const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); - expect(moveset).toEqual([ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH ]); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH]); const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); expect(movePhases.length).toBe(1); @@ -145,9 +154,13 @@ describe("Absolute Avarice - Mystery Encounter", () => { for (const partyPokemon of scene.getPlayerParty()) { const pokemonId = partyPokemon.id; - const pokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === pokemonId, true) as PokemonHeldItemModifier[]; - const revSeed = pokemonItems.find(i => i.type.name === i18next.t("modifierType:ModifierType.REVIVER_SEED.name")); + const pokemonItems = scene.findModifiers( + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId, + true, + ) as PokemonHeldItemModifier[]; + const revSeed = pokemonItems.find( + i => i.type.name === i18next.t("modifierType:ModifierType.REVIVER_SEED.name"), + ); expect(revSeed).toBeDefined; expect(revSeed?.stackCount).toBe(1); } @@ -171,7 +184,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 3 (2/5ths floored) berries if 8 were stolen", { retry: 5 }, async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }, { name: "BERRY", count: 3, type: BerryType.APICOT }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + { name: "BERRY", count: 3, type: BerryType.APICOT }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -187,7 +204,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 2 (2/5ths floored) berries if 7 were stolen", { retry: 5 }, async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }, { name: "BERRY", count: 2, type: BerryType.APICOT }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -240,7 +261,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(greedent.species.speciesId).toBe(Species.GREEDENT); const moveset = greedent.moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); - expect(moveset).toEqual([ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF ]); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); }); it("should leave encounter without battle", async () => { diff --git a/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index b88e02be6ab..3c7bda8febd 100644 --- a/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -22,7 +22,7 @@ import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/anOfferYouCantRefuse"; /** Gyarados for Indimidate */ -const defaultParty = [ Species.GYARADOS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.GYARADOS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -38,17 +38,18 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .startingWave(defaultWave) .startingBiome(defaultBiome) .disableTrainerWaves() .ability(Abilities.INTIMIDATE); // Extortion ability const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE ]); + biomeMap.set(biome, [MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -67,10 +68,12 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(AnOfferYouCantRefuseEncounter.dialogue).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, ]); expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(AnOfferYouCantRefuseEncounter.options.length).toBe(3); }); @@ -80,7 +83,9 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe( + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + ); }); it("should initialize fully ", async () => { @@ -96,10 +101,14 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); - expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe(i18next.t("ability:intimidate.name")); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe( + i18next.t("ability:intimidate.name"), + ); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.moveOrAbility).toBe(i18next.t("ability:intimidate.name")); expect(AnOfferYouCantRefuseEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); - expect(AnOfferYouCantRefuseEncounter.misc?.price?.toString()).toBe(AnOfferYouCantRefuseEncounter.dialogueTokens?.price); + expect(AnOfferYouCantRefuseEncounter.misc?.price?.toString()).toBe( + AnOfferYouCantRefuseEncounter.dialogueTokens?.price, + ); expect(onInitResult).toBe(true); }); @@ -187,27 +196,29 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should award EXP to a pokemon with an ability in EXTORTION_ABILITIES", async () => { await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); const party = scene.getPlayerParty(); - const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS)!; + const gyarados = party.find(pkm => pkm.species.speciesId === Species.GYARADOS)!; const expBefore = gyarados.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(gyarados.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + expect(gyarados.exp).toBe( + expBefore + Math.floor((getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave) / 5 + 1), + ); }); it("should award EXP to a pokemon with a move in EXTORTION_MOVES", async () => { game.override.ability(Abilities.SYNCHRONIZE); // Not an extortion ability, so we can test extortion move - await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [ Species.ABRA ]); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [Species.ABRA]); const party = scene.getPlayerParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; - abra.moveset = [ new PokemonMove(Moves.BEAT_UP) ]; + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; + abra.moveset = [new PokemonMove(Moves.BEAT_UP)]; const expBefore = abra.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(abra.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + expect(abra.exp).toBe(expBefore + Math.floor((getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave) / 5 + 1)); }); it("Should update the player's money properly", async () => { diff --git a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts index d623d1ce7a8..e19726f49fd 100644 --- a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -4,7 +4,10 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; @@ -20,7 +23,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/berriesAbound"; -const defaultParty = [ Species.PYUKUMUKU, Species.MAGIKARP, Species.PIKACHU ]; +const defaultParty = [Species.PYUKUMUKU, Species.MAGIKARP, Species.PIKACHU]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -36,7 +39,8 @@ describe("Berries Abound - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .mysteryEncounterTier(MysteryEncounterTier.COMMON) .startingWave(defaultWave) .startingBiome(defaultBiome) @@ -47,9 +51,7 @@ describe("Berries Abound - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.BERRIES_ABOUND ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.BERRIES_ABOUND]]]), ); }); @@ -152,7 +154,9 @@ describe("Berries Abound - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BERRY"); @@ -191,7 +195,7 @@ describe("Berries Abound - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); // Should be enraged - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); }); @@ -215,7 +219,7 @@ describe("Berries Abound - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); // Should be enraged - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); }); @@ -235,7 +239,9 @@ describe("Berries Abound - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BERRY"); 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 6827ea5a463..9befe77e688 100644 --- a/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -4,7 +4,11 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; @@ -22,7 +26,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; const namespace = "mysteryEncounters/bugTypeSuperfan"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.WEEDLE ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.WEEDLE]; const defaultBiome = Biome.CAVE; const defaultWave = 24; @@ -49,7 +53,7 @@ const POOL_1_POKEMON = [ Species.CHARJABUG, Species.RIBOMBEE, Species.SPIDOPS, - Species.LOKIX + Species.LOKIX, ]; const POOL_2_POKEMON = [ @@ -78,26 +82,26 @@ const POOL_2_POKEMON = [ Species.KLEAVOR, ]; -const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ +const POOL_3_POKEMON: { species: Species; formIndex?: number }[] = [ { species: Species.PINSIR, - formIndex: 1 + formIndex: 1, }, { species: Species.SCIZOR, - formIndex: 1 + formIndex: 1, }, { species: Species.HERACROSS, - formIndex: 1 + formIndex: 1, }, { species: Species.ORBEETLE, - formIndex: 1 + formIndex: 1, }, { species: Species.CENTISKORCH, - formIndex: 1 + formIndex: 1, }, { species: Species.DURANT, @@ -110,35 +114,19 @@ const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ }, ]; -const POOL_4_POKEMON = [ - Species.GENESECT, - Species.SLITHER_WING, - Species.BUZZWOLE, - Species.PHEROMOSA -]; +const POOL_4_POKEMON = [Species.GENESECT, Species.SLITHER_WING, Species.BUZZWOLE, Species.PHEROMOSA]; const PHYSICAL_TUTOR_MOVES = [ Moves.MEGAHORN, Moves.X_SCISSOR, Moves.ATTACK_ORDER, Moves.PIN_MISSILE, - Moves.FIRST_IMPRESSION + Moves.FIRST_IMPRESSION, ]; -const SPECIAL_TUTOR_MOVES = [ - Moves.SILVER_WIND, - Moves.BUG_BUZZ, - Moves.SIGNAL_BEAM, - Moves.POLLEN_PUFF -]; +const SPECIAL_TUTOR_MOVES = [Moves.SILVER_WIND, Moves.BUG_BUZZ, Moves.SIGNAL_BEAM, Moves.POLLEN_PUFF]; -const STATUS_TUTOR_MOVES = [ - Moves.STRING_SHOT, - Moves.STICKY_WEB, - Moves.SILK_TRAP, - Moves.RAGE_POWDER, - Moves.HEAL_ORDER -]; +const STATUS_TUTOR_MOVES = [Moves.STRING_SHOT, Moves.STICKY_WEB, Moves.SILK_TRAP, Moves.RAGE_POWDER, Moves.HEAL_ORDER]; const MISC_TUTOR_MOVES = [ Moves.BUG_BITE, @@ -147,7 +135,7 @@ const MISC_TUTOR_MOVES = [ Moves.QUIVER_DANCE, Moves.TAIL_GLOW, Moves.INFESTATION, - Moves.U_TURN + Moves.U_TURN, ]; describe("Bug-Type Superfan - Mystery Encounter", () => { @@ -168,9 +156,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.BUG_TYPE_SUPERFAN ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.BUG_TYPE_SUPERFAN]]]), ); }); @@ -400,12 +386,12 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip` + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, }); }); it("should NOT be selectable if the player doesn't have any Bug types", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.ABRA ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.ABRA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -431,21 +417,25 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(2); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("SUPER_LURE"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("GREAT_BALL"); }); it("should proceed to rewards screen with 2-3 Bug Types reward options", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE, Species.BEEDRILL]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("QUICK_CLAW"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); @@ -453,14 +443,21 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should proceed to rewards screen with 4-5 Bug Types reward options", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ + Species.BUTTERFREE, + Species.BEEDRILL, + Species.GALVANTULA, + Species.VOLCARONA, + ]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("GRIP_CLAW"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); @@ -468,14 +465,23 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should proceed to rewards screen with 6 Bug Types reward options (including form change item)", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA, Species.ANORITH, Species.GENESECT ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ + Species.BUTTERFREE, + Species.BEEDRILL, + Species.GALVANTULA, + Species.VOLCARONA, + Species.ANORITH, + Species.GENESECT, + ]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MASTER_BALL"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MEGA_BRACELET"); @@ -538,9 +544,10 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { it("should remove the gifted item and proceed to rewards screen", async () => { game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); - const gripClawCountBefore = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + const gripClawCountBefore = + scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -548,12 +555,15 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(2); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_GOLDEN_BUG_NET"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("REVIVER_SEED"); - const gripClawCountAfter = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + const gripClawCountAfter = + scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; expect(gripClawCountBefore - 1).toBe(gripClawCountAfter); }); @@ -561,7 +571,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); const leaveEncounterWithoutBattleSpy = vi.spyOn(encounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index 2f690a1d990..4bbe76e5c72 100644 --- a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -8,7 +8,10 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import type Pokemon from "#app/field/pokemon"; @@ -36,7 +39,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { NewBattlePhase } from "#app/phases/new-battle-phase"; const namespace = "mysteryEncounters/clowningAround"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -58,9 +61,7 @@ describe("Clowning Around - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.CLOWNING_AROUND ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.CLOWNING_AROUND]]]), ); }); @@ -116,13 +117,13 @@ describe("Clowning Around - Mystery Encounter", () => { expect(config.pokemonConfigs?.[0]).toEqual({ species: getPokemonSpecies(Species.MR_MIME), isBoss: true, - moveSet: [ Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC ] + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC], }); expect(config.pokemonConfigs?.[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), customPokemonData: expect.anything(), isBoss: true, - moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN], }); expect(config.pokemonConfigs?.[1].customPokemonData?.types.length).toBe(2); expect([ @@ -140,7 +141,7 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MISTY_SURGE, Abilities.MAGICIAN, Abilities.SHEER_FORCE, - Abilities.PRANKSTER + Abilities.PRANKSTER, ]).toContain(config.pokemonConfigs?.[1].customPokemonData?.ability); expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].customPokemonData?.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); @@ -175,9 +176,19 @@ describe("Clowning Around - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(Species.MR_MIME); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.TEETER_DANCE), new PokemonMove(Moves.ALLY_SWITCH), new PokemonMove(Moves.DAZZLING_GLEAM), new PokemonMove(Moves.PSYCHIC) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.TEETER_DANCE), + new PokemonMove(Moves.ALLY_SWITCH), + new PokemonMove(Moves.DAZZLING_GLEAM), + new PokemonMove(Moves.PSYCHIC), + ]); expect(enemyField[1].species.speciesId).toBe(Species.BLACEPHALON); - expect(enemyField[1].moveset).toEqual([ new PokemonMove(Moves.TRICK), new PokemonMove(Moves.HYPNOSIS), new PokemonMove(Moves.SHADOW_BALL), new PokemonMove(Moves.MIND_BLOWN) ]); + expect(enemyField[1].moveset).toEqual([ + new PokemonMove(Moves.TRICK), + new PokemonMove(Moves.HYPNOSIS), + new PokemonMove(Moves.SHADOW_BALL), + new PokemonMove(Moves.MIND_BLOWN), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -253,14 +264,14 @@ describe("Clowning Around - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); // Set some moves on party for attack type booster generation - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.THIEF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.THIEF)]; // 2 Sitrus Berries on lead scene.modifiers = []; - let itemType = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType; + let itemType = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getPlayerParty()[0], 2, itemType); // 2 Ganlon Berries on lead - itemType = generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType; + itemType = generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getPlayerParty()[0], 2, itemType); // 5 Golden Punch on lead (ultra) itemType = generateModifierType(modifierTypes.GOLDEN_PUNCH) as PokemonHeldItemModifierType; @@ -338,9 +349,9 @@ describe("Clowning Around - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); // Same type moves on lead - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.ICE_BEAM), new PokemonMove(Moves.SURF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.ICE_BEAM), new PokemonMove(Moves.SURF)]; // Different type moves on second - scene.getPlayerParty()[1].moveset = [ new PokemonMove(Moves.GRASS_KNOT), new PokemonMove(Moves.ELECTRO_BALL) ]; + scene.getPlayerParty()[1].moveset = [new PokemonMove(Moves.GRASS_KNOT), new PokemonMove(Moves.ELECTRO_BALL)]; // No moves on third scene.getPlayerParty()[2].moveset = []; await runMysteryEncounterToEnd(game, 3); @@ -351,11 +362,11 @@ describe("Clowning Around - Mystery Encounter", () => { expect(leadTypesAfter.length).toBe(2); expect(leadTypesAfter[0]).toBe(PokemonType.WATER); - expect([ PokemonType.WATER, PokemonType.ICE ].includes(leadTypesAfter[1])).toBeFalsy(); + expect([PokemonType.WATER, PokemonType.ICE].includes(leadTypesAfter[1])).toBeFalsy(); expect(secondaryTypesAfter.length).toBe(2); expect(secondaryTypesAfter[0]).toBe(PokemonType.GHOST); - expect([ PokemonType.GHOST, PokemonType.POISON ].includes(secondaryTypesAfter[1])).toBeFalsy(); - expect([ PokemonType.GRASS, PokemonType.ELECTRIC ].includes(secondaryTypesAfter[1])).toBeTruthy(); + expect([PokemonType.GHOST, PokemonType.POISON].includes(secondaryTypesAfter[1])).toBeFalsy(); + expect([PokemonType.GRASS, PokemonType.ELECTRIC].includes(secondaryTypesAfter[1])).toBeTruthy(); expect(thirdTypesAfter.length).toBe(2); expect(thirdTypesAfter[0]).toBe(PokemonType.PSYCHIC); expect(secondaryTypesAfter[1]).not.toBe(PokemonType.PSYCHIC); @@ -372,7 +383,12 @@ describe("Clowning Around - Mystery Encounter", () => { }); }); -async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: number, itemType: PokemonHeldItemModifierType) { +async function addItemToPokemon( + scene: BattleScene, + pokemon: Pokemon, + stackCount: number, + itemType: PokemonHeldItemModifierType, +) { const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; itemMod.stackCount = stackCount; scene.addModifier(itemMod, true, false, false, true); diff --git a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 46217cca5e2..a4c1052463c 100644 --- a/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -4,7 +4,11 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -21,7 +25,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; const namespace = "mysteryEncounters/dancingLessons"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 45; @@ -44,9 +48,9 @@ describe("Dancing Lessons - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.PLAINS, [ MysteryEncounterType.DANCING_LESSONS ]], - [ Biome.SPACE, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.PLAINS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.SPACE, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -107,7 +111,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]); const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); @@ -129,7 +133,9 @@ describe("Dancing Lessons - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); // Should fill remaining expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toContain("BATON"); }); @@ -195,7 +201,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should add Oricorio to the party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); const partyCountBefore = scene.getPlayerParty().length; - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.DRAGON_DANCE) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); const partyCountAfter = scene.getPlayerParty().length; @@ -210,7 +216,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should NOT be selectable if the player doesn't have a Dance type move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); const partyCountBefore = scene.getPlayerParty().length; - scene.getPlayerParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -234,7 +240,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.DRAGON_DANCE) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index baea430fdaf..94faf070a39 100644 --- a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -4,21 +4,33 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import type { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { BerryModifier, HealingBoosterModifier, HitHealModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; +import { + BerryModifier, + HealingBoosterModifier, + HitHealModifier, + LevelIncrementBoosterModifier, + MoneyMultiplierModifier, + PokemonInstantReviveModifier, + PokemonNatureWeightModifier, + PreserveBerryModifier, +} from "#app/modifier/modifier"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; const namespace = "mysteryEncounters/delibirdy"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -40,9 +52,7 @@ describe("Delibird-y - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.DELIBIRDY ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.DELIBIRDY]]]), ); }); @@ -98,7 +108,8 @@ describe("Delibird-y - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); await runMysteryEncounterToEnd(game, 1); - const price = (scene.currentBattle.mysteryEncounter?.options[0].requirements[0] as MoneyRequirement).requiredMoney; + const price = (scene.currentBattle.mysteryEncounter?.options[0].requirements[0] as MoneyRequirement) + .requiredMoney; expect(updateMoneySpy).toHaveBeenCalledWith(-price, true, false); expect(scene.money).toBe(initialMoney - price); @@ -190,7 +201,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 2 Sitrus berries on party lead scene.modifiers = []; - const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; scene.addModifier(sitrusMod, true, false, false, true); @@ -235,7 +246,7 @@ describe("Delibird-y - Mystery Encounter", () => { const candyJar = generateModifierType(modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; scene.addModifier(candyJar, true, false, false, true); - const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; // Sitrus berries on party const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; diff --git a/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index 224a4403942..d4b0de30535 100644 --- a/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -16,7 +16,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/departmentStoreSale"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 37; @@ -38,10 +38,10 @@ describe("Department Store Sale - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]); + biomeMap.set(biome, [MysteryEncounterType.DEPARTMENT_STORE_SALE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -63,10 +63,12 @@ describe("Department Store Sale - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(DepartmentStoreSaleEncounter.options.length).toBe(4); }); @@ -97,7 +99,9 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("TM_"); @@ -132,11 +136,15 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("PP_UP") || - option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER")).toBeTruthy(); + expect( + option.modifierTypeOption.type.id.includes("PP_UP") || + option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER"), + ).toBeTruthy(); } }); @@ -168,11 +176,15 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("DIRE_HIT") || - option.modifierTypeOption.type.id.includes("TEMP_STAT_STAGE_BOOSTER")).toBeTruthy(); + expect( + option.modifierTypeOption.type.id.includes("DIRE_HIT") || + option.modifierTypeOption.type.id.includes("TEMP_STAT_STAGE_BOOSTER"), + ).toBeTruthy(); } }); @@ -204,7 +216,9 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BALL"); diff --git a/test/mystery-encounter/encounters/field-trip-encounter.test.ts b/test/mystery-encounter/encounters/field-trip-encounter.test.ts index b831a52f116..8bd35d6013f 100644 --- a/test/mystery-encounter/encounters/field-trip-encounter.test.ts +++ b/test/mystery-encounter/encounters/field-trip-encounter.test.ts @@ -17,7 +17,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import i18next from "i18next"; const namespace = "mysteryEncounters/fieldTrip"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -37,12 +37,10 @@ describe("Field Trip - Mystery Encounter", () => { game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - game.override.moveset([ Moves.TACKLE, Moves.UPROAR, Moves.SWORDS_DANCE ]); + game.override.moveset([Moves.TACKLE, Moves.UPROAR, Moves.SWORDS_DANCE]); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.FIELD_TRIP ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.FIELD_TRIP]]]), ); }); @@ -60,12 +58,12 @@ describe("Field Trip - Mystery Encounter", () => { expect(FieldTripEncounter.dialogue).toBeDefined(); expect(FieldTripEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue` - } + text: `${namespace}:intro_dialogue`, + }, ]); expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -91,7 +89,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -101,13 +101,25 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_attack")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_defense")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.DIRE_HIT.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_attack"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_defense"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.DIRE_HIT.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { @@ -138,7 +150,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -148,13 +162,25 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_sp_atk")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_sp_def")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.DIRE_HIT.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_sp_atk"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_sp_def"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.DIRE_HIT.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { @@ -185,7 +211,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -196,14 +224,32 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_accuracy")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { modifierCount: 5, pokeballName: i18next.t("pokeball:greatBall") })); - expect(i18next.t).toHaveBeenCalledWith(("modifierType:ModifierType.AddPokeballModifierType.name"), expect.objectContaining({ modifierCount: 5 })); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.IV_SCANNER.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_accuracy"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { + modifierCount: 5, + pokeballName: i18next.t("pokeball:greatBall"), + }), + ); + expect(i18next.t).toHaveBeenCalledWith( + "modifierType:ModifierType.AddPokeballModifierType.name", + expect.objectContaining({ modifierCount: 5 }), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.IV_SCANNER.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { diff --git a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index a49cadb5549..3d311134d4e 100644 --- a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -9,7 +9,11 @@ import { Gender } from "#app/data/gender"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; @@ -29,7 +33,7 @@ import { StatusEffect } from "#enums/status-effect"; const namespace = "mysteryEncounters/fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ -const defaultParty = [ Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.VOLCANO; const defaultWave = 56; @@ -45,17 +49,18 @@ describe("Fiery Fallout - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .startingWave(defaultWave) .startingBiome(defaultBiome) .disableTrainerWaves() - .moveset([ Moves.PAYBACK, Moves.THUNDERBOLT ]); // Required for attack type booster item generation + .moveset([Moves.PAYBACK, Moves.THUNDERBOLT]); // Required for attack type booster item generation vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIERY_FALLOUT ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -114,20 +119,20 @@ describe("Fiery Fallout - Mystery Encounter", () => { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, gender: Gender.MALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), }, { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, gender: Gender.FEMALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) - } + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), + }, ], doubleBattle: true, - disableSwitch: true - } + disableSwitch: true, + }, ]); expect(weatherSpy).toHaveBeenCalledTimes(1); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); @@ -177,8 +182,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const leadPokemonId = scene.getPlayerParty()?.[0].id; - const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; + const leadPokemonItems = scene.findModifiers( + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, + true, + ) as PokemonHeldItemModifier[]; const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); expect(item).toBeDefined; }); @@ -204,22 +211,30 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); const party = scene.getPlayerParty(); - const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS)!; + const lapras = party.find(pkm => pkm.species.speciesId === Species.LAPRAS)!; lapras.status = new Status(StatusEffect.POISON); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 2); - const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(PokemonType.FIRE)); - const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(PokemonType.FIRE)); + const burnablePokemon = party.filter( + pkm => pkm.isAllowedInBattle() && !pkm.getTypes().includes(PokemonType.FIRE), + ); + const notBurnablePokemon = party.filter( + pkm => !pkm.isAllowedInBattle() || pkm.getTypes().includes(PokemonType.FIRE), + ); expect(scene.currentBattle.mysteryEncounter?.dialogueTokens["burnedPokemon"]).toBe(i18next.t("pokemon:gengar")); - burnablePokemon.forEach((pkm) => { - expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2)); + burnablePokemon.forEach(pkm => { + expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( + pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2), + ); }); expect(burnablePokemon.some(pkm => pkm.status?.effect === StatusEffect.BURN)).toBeTruthy(); expect(burnablePokemon.some(pkm => pkm.customPokemonData.ability === Abilities.HEATPROOF)); - notBurnablePokemon.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + notBurnablePokemon.forEach(pkm => + expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp()), + ); }); it("should leave encounter without battle", async () => { @@ -270,12 +285,12 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should be disabled if not enough FIRE types are in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [ Species.MAGIKARP ]); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [Species.MAGIKARP]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); - const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + const continueEncounterSpy = vi.spyOn(encounterPhase as MysteryEncounterPhase, "continueEncounter"); await runSelectMysteryEncounterOption(game, 3); diff --git a/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index 116c45c1faf..d233e72932a 100644 --- a/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -4,7 +4,11 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; @@ -20,7 +24,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/fightOrFlight"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -42,9 +46,7 @@ describe("Fight or Flight - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]), ); }); @@ -126,7 +128,9 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); }); @@ -144,14 +148,14 @@ describe("Fight or Flight - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't have a Stealing move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); - scene.getPlayerParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -175,7 +179,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); // Mock moveset - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.KNOCK_OFF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; const item = game.scene.currentBattle.mysteryEncounter!.misc; await runMysteryEncounterToEnd(game, 2); @@ -184,7 +188,9 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); 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 de351e48c76..4bb44c4d19e 100644 --- a/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -5,7 +5,10 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -23,7 +26,7 @@ import { Command } from "#app/ui/command-ui-handler"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; const namespace = "mysteryEncounters/funAndGames"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -44,11 +47,9 @@ describe("Fun And Games! - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.FUN_AND_GAMES ]); + biomeMap.set(biome, [MysteryEncounterType.FUN_AND_GAMES]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -69,7 +70,7 @@ describe("Fun And Games! - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -137,13 +138,13 @@ describe("Fun And Games! - Mystery Encounter", () => { it("should get 3 turns to attack the Wobbuffet for a reward", async () => { scene.money = 20000; - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.getEnemyPokemon()?.species.speciesId).toBe(Species.WOBBUFFET); - expect(scene.getEnemyPokemon()?.ivs).toEqual([ 0, 0, 0, 0, 0, 0 ]); + expect(scene.getEnemyPokemon()?.ivs).toEqual([0, 0, 0, 0, 0, 0]); expect(scene.getEnemyPokemon()?.nature).toBe(Nature.MILD); game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { @@ -186,13 +187,15 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); it("should have Wide Lens item in rewards if Wubboffet is at 15-33% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -213,14 +216,16 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("WIDE_LENS"); }); it("should have Scope Lens item in rewards if Wubboffet is at 3-15% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -241,14 +246,16 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("SCOPE_LENS"); }); it("should have Multi Lens item in rewards if Wubboffet is at <3% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -269,7 +276,9 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MULTI_LENS"); }); 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 f898b1f574f..f68561c2286 100644 --- a/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -21,7 +21,7 @@ import { ModifierTier } from "#app/modifier/modifier-tier"; import * as Utils from "#app/utils"; const namespace = "mysteryEncounters/globalTradeSystem"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -43,10 +43,10 @@ describe("Global Trade System - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.GLOBAL_TRADE_SYSTEM ]); + biomeMap.set(biome, [MysteryEncounterType.GLOBAL_TRADE_SYSTEM]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -71,7 +71,7 @@ describe("Global Trade System - Mystery Encounter", () => { }); it("should not loop infinitely when generating trade options for extreme BST non-legendaries", async () => { - const extremeBstTeam = [ Species.SLAKING, Species.WISHIWASHI, Species.SUNKERN ]; + const extremeBstTeam = [Species.SLAKING, Species.WISHIWASHI, Species.SUNKERN]; await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, extremeBstTeam); expect(GlobalTradeSystemEncounter.encounterType).toBe(MysteryEncounterType.GLOBAL_TRADE_SYSTEM); @@ -160,7 +160,7 @@ describe("Global Trade System - Mystery Encounter", () => { expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` + buttonTooltip: `${namespace}:option.2.tooltip`, }); }); @@ -232,7 +232,9 @@ describe("Global Trade System - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier).toBe(ModifierTier.MASTER); const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); diff --git a/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 09ecbc6c31a..f23bc8738f2 100644 --- a/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -16,10 +16,9 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; import i18next from "i18next"; - const namespace = "mysteryEncounters/lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ -const defaultParty = [ Species.BLASTOISE, Species.PIDGEOT, Species.ABRA ]; +const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultBiome = Biome.SEA; const defaultWave = 33; @@ -42,9 +41,9 @@ describe("Lost at Sea - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.SEA, [ MysteryEncounterType.LOST_AT_SEA ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -115,13 +114,13 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getPlayerParty(); - const blastoise = party.find((pkm) => pkm.species.speciesId === Species.BLASTOISE); + const blastoise = party.find(pkm => pkm.species.speciesId === Species.BLASTOISE); const expBefore = blastoise!.exp; await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(PartyExpPhase); - expect(blastoise?.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); + expect(blastoise?.exp).toBe(expBefore + Math.floor((laprasSpecies.baseExp * defaultWave) / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -135,7 +134,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no surfable PKM is in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [ Species.ARCANINE ]); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -180,13 +179,13 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getPlayerParty(); - const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + const pidgeot = party.find(pkm => pkm.species.speciesId === Species.PIDGEOT); const expBefore = pidgeot!.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(PartyExpPhase); - expect(pidgeot!.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); + expect(pidgeot!.exp).toBe(expBefore + Math.floor((laprasBaseExp * defaultWave) / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -200,7 +199,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no flyable PKM is in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [ Species.ARCANINE ]); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -242,18 +241,22 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getPlayerParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 3); - const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); - const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); - allowedPkm.forEach((pkm) => - expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + const allowedPkm = party.filter(pkm => pkm.isAllowedInBattle()); + const notAllowedPkm = party.filter(pkm => !pkm.isAllowedInBattle()); + allowedPkm.forEach(pkm => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( + pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25), + ), ); - notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + notAllowedPkm.forEach(pkm => + expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp()), + ); }); it("should leave encounter without battle", async () => { diff --git a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index e42cd321cde..8e825dc2c9b 100644 --- a/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -5,7 +5,10 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -22,7 +25,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/mysteriousChallengers"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -43,11 +46,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]); + biomeMap.set(biome, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -66,7 +67,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { expect(MysteriousChallengersEncounter.dialogue).toBeDefined(); expect(MysteriousChallengersEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(MysteriousChallengersEncounter.options.length).toBe(3); }); @@ -108,16 +111,20 @@ describe("Mysterious Challengers - Mystery Encounter", () => { trainerConfig: expect.any(TrainerConfig), levelAdditiveModifier: 1.5, female: expect.any(Boolean), - } + }, ]); - expect(encounter.enemyPartyConfigs[1].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true) - )); - expect(encounter.enemyPartyConfigs[2].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + expect(encounter.enemyPartyConfigs[1].trainerConfig?.partyTemplates[0]).toEqual( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + ), + ); + expect(encounter.enemyPartyConfigs[2].trainerConfig?.partyTemplates[0]).toEqual( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), ); expect(encounter.spriteConfigs).toBeDefined(); expect(encounter.spriteConfigs.length).toBe(3); @@ -158,7 +165,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toContain("TM_COMMON"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toContain("TM_GREAT"); @@ -200,12 +209,26 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); }); }); @@ -243,12 +266,26 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); }); }); }); diff --git a/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts index 0cd7bc9bc76..639a2e140ff 100644 --- a/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -5,7 +5,10 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -17,7 +20,7 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; const namespace = "mysteryEncounters/partTimer"; // Pyukumuku for lowest speed, Regieleki for highest speed, Feebas for lowest "bulk", Melmetal for highest "bulk" -const defaultParty = [ Species.PYUKUMUKU, Species.REGIELEKI, Species.FEEBAS, Species.MELMETAL ]; +const defaultParty = [Species.PYUKUMUKU, Species.REGIELEKI, Species.FEEBAS, Species.MELMETAL]; const defaultBiome = Biome.PLAINS; const defaultWave = 37; @@ -39,10 +42,10 @@ describe("Part-Timer - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.PART_TIMER ]); + biomeMap.set(biome, [MysteryEncounterType.PART_TIMER]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -64,7 +67,7 @@ describe("Part-Timer - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -90,9 +93,9 @@ describe("Part-Timer - Mystery Encounter", () => { buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.1.selected` - } - ] + text: `${namespace}:option.1.selected`, + }, + ], }); }); @@ -122,7 +125,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Override party levels to 50 so stats can be fully reflective scene.getPlayerParty().forEach(p => { p.level = 50; - p.ivs = [ 20, 20, 20, 20, 20, 20 ]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 2 }); @@ -155,9 +158,9 @@ describe("Part-Timer - Mystery Encounter", () => { buttonTooltip: `${namespace}:option.2.tooltip`, selected: [ { - text: `${namespace}:option.2.selected` - } - ] + text: `${namespace}:option.2.selected`, + }, + ], }); }); @@ -187,7 +190,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Override party levels to 50 so stats can be fully reflective scene.getPlayerParty().forEach(p => { p.level = 50; - p.ivs = [ 20, 20, 20, 20, 20, 20 ]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 4 }); @@ -221,9 +224,9 @@ describe("Part-Timer - Mystery Encounter", () => { disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.3.selected` - } - ] + text: `${namespace}:option.3.selected`, + }, + ], }); }); @@ -232,7 +235,7 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Mock movesets - scene.getPlayerParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -256,7 +259,7 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Mock moveset - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.ATTRACT) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.ATTRACT)]; await runMysteryEncounterToEnd(game, 3); expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(2.5), true, false); diff --git a/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts index 068e28547f4..3506020aae4 100644 --- a/test/mystery-encounter/encounters/safari-zone.test.ts +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -4,19 +4,25 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { getSafariSpeciesSpawn, SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; +import { + getSafariSpeciesSpawn, + SafariZoneEncounter, +} from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; const namespace = "mysteryEncounters/safariZone"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.SWAMP; const defaultWave = 45; @@ -38,10 +44,10 @@ describe("Safari Zone - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - [ Biome.FOREST, [ MysteryEncounterType.SAFARI_ZONE ]], - [ Biome.SWAMP, [ MysteryEncounterType.SAFARI_ZONE ]], - [ Biome.JUNGLE, [ MysteryEncounterType.SAFARI_ZONE ]], + [Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]], + [Biome.FOREST, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.SWAMP, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.JUNGLE, [MysteryEncounterType.SAFARI_ZONE]], ]); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -58,9 +64,7 @@ describe("Safari Zone - Mystery Encounter", () => { expect(SafariZoneEncounter.encounterType).toBe(MysteryEncounterType.SAFARI_ZONE); expect(SafariZoneEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(SafariZoneEncounter.dialogue).toBeDefined(); - expect(SafariZoneEncounter.dialogue.intro).toStrictEqual([ - { text: `${namespace}:intro` }, - ]); + expect(SafariZoneEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); diff --git a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index c7fcc1e967f..85c823038e8 100644 --- a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -13,17 +13,21 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const namespace = "mysteryEncounters/teleportingHijinks"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; -const TRANSPORT_BIOMES = [ Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE, Biome.WASTELAND, Biome.DOJO ]; +const TRANSPORT_BIOMES = [Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE, Biome.WASTELAND, Biome.DOJO]; describe("Teleporting Hijinks - Mystery Encounter", () => { let phaserGame: Phaser.Game; @@ -47,9 +51,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.TELEPORTING_HIJINKS ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.TELEPORTING_HIJINKS]]]), ); }); @@ -181,7 +183,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); @@ -190,7 +192,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); }); @@ -207,13 +209,13 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't the right type pokemon", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.BLASTOISE ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.BLASTOISE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -232,14 +234,14 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { }); it("should be selectable if the player has the right type pokemon", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.METAGROSS ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.METAGROSS]); await runMysteryEncounterToEnd(game, 2, undefined, true); expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); }); it("should transport to a new area", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); const previousBiome = scene.arena.biomeType; @@ -250,19 +252,19 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { }); it("should start a battle against an enraged boss below wave 50", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); it("should start a battle against an extra enraged boss above wave 50", { retry: 5 }, async () => { game.override.startingWave(56); - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); }); @@ -287,7 +289,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 3, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 0, 0, 0, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 0, 0, 0, 0, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); @@ -300,9 +302,19 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.some(opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.metal_coat"))).toBe(true); - expect(modifierSelectHandler.options.some(opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.magnet"))).toBe(true); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect( + modifierSelectHandler.options.some( + opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.metal_coat"), + ), + ).toBe(true); + expect( + modifierSelectHandler.options.some( + opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.magnet"), + ), + ).toBe(true); }); }); }); diff --git a/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index 7b10adc9680..9160126ffc3 100644 --- a/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -5,7 +5,10 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -21,7 +24,7 @@ import { PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phases" import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#app/data/balance/starters"; const namespace = "mysteryEncounters/theExpertPokemonBreeder"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -42,11 +45,9 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER ]); + biomeMap.set(biome, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -65,15 +66,17 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(TheExpertPokemonBreederEncounter.dialogue).toBeDefined(); expect(TheExpertPokemonBreederEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: "trainerNames:expert_pokemon_breeder", - text: `${namespace}:intro_dialogue` + text: `${namespace}:intro_dialogue`, }, ]); expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(TheExpertPokemonBreederEncounter.options.length).toBe(3); }); @@ -83,7 +86,9 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe( + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, + ); }); it("should initialize fully", async () => { @@ -133,12 +138,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; @@ -215,12 +223,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; @@ -294,12 +305,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; diff --git a/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 3a3d94dbc44..4adb8c6b076 100644 --- a/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -5,11 +5,17 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; -import { getSalesmanSpeciesOffer, ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; +import { + getSalesmanSpeciesOffer, + ThePokemonSalesmanEncounter, +} from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; @@ -17,7 +23,7 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; const namespace = "mysteryEncounters/thePokemonSalesman"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -39,10 +45,10 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_POKEMON_SALESMAN ]); + biomeMap.set(biome, [MysteryEncounterType.THE_POKEMON_SALESMAN]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -63,7 +69,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(dialogue).toBeDefined(); expect(dialogue.intro).toStrictEqual([ { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, ]); const { title, description, query } = dialogue.encounterOptionsDialogue!; expect(title).toBe(`${namespace}:title`); diff --git a/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 1a075ffaff2..57d55af5dac 100644 --- a/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -7,7 +7,10 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; @@ -28,7 +31,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/theStrongStuff"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -54,9 +57,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.CAVE, [ MysteryEncounterType.THE_STRONG_STUFF ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -112,13 +115,13 @@ describe("The Strong Stuff - Mystery Encounter", () => { shiny: false, customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, - moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], + moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], modifierConfigs: expect.any(Array), - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) - } + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), + }, ], - } + }, ]); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); @@ -195,15 +198,28 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.SHUCKLE); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 2, 0, 2, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 2, 0, 2, 0, 0, 0]); const shuckleItems = enemyField[0].getHeldItems(); expect(shuckleItems.length).toBe(5); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.SITRUS)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.ENIGMA)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.GANLON)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.APICOT)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.SITRUS)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.ENIGMA)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.GANLON)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.APICOT)?.stackCount).toBe( + 1, + ); expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.LUM)?.stackCount).toBe(2); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.INFESTATION), new PokemonMove(Moves.SALT_CURE), new PokemonMove(Moves.GASTRO_ACID), new PokemonMove(Moves.HEAL_ORDER) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.INFESTATION), + new PokemonMove(Moves.SALT_CURE), + new PokemonMove(Moves.GASTRO_ACID), + new PokemonMove(Moves.HEAL_ORDER), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -221,7 +237,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("SOUL_DEW"); }); diff --git a/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index 85dbb4e23ff..94c8141aa1e 100644 --- a/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -28,7 +28,7 @@ import { VictoryPhase } from "#app/phases/victory-phase"; import { StatusEffect } from "#enums/status-effect"; const namespace = "mysteryEncounters/theWinstrateChallenge"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -49,11 +49,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_WINSTRATE_CHALLENGE ]); + biomeMap.set(biome, [MysteryEncounterType.THE_WINSTRATE_CHALLENGE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -75,10 +73,12 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(TheWinstrateChallengeEncounter.options.length).toBe(2); }); @@ -115,42 +115,42 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Soundproof nature: Nature.MODEST, - moveSet: [ Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.SWALOT), isBoss: false, abilityIndex: 2, // Gluttony nature: Nature.QUIET, - moveSet: [ Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.DODRIO), isBoss: false, abilityIndex: 2, // Tangled Feet nature: Nature.JOLLY, - moveSet: [ Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.ALAKAZAM), isBoss: false, formIndex: 1, nature: Nature.BOLD, - moveSet: [ Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.DARMANITAN), isBoss: false, abilityIndex: 0, // Sheer Force nature: Nature.IMPISH, - moveSet: [ Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICKY, @@ -160,10 +160,10 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, formIndex: 1, nature: Nature.IMPISH, - moveSet: [ Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VIVI, @@ -173,26 +173,26 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 3, // Lightning Rod nature: Nature.ADAMANT, - moveSet: [ Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.BRELOOM), isBoss: false, abilityIndex: 1, // Poison Heal nature: Nature.JOLLY, - moveSet: [ Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.CAMERUPT), isBoss: false, formIndex: 1, nature: Nature.CALM, - moveSet: [ Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICTORIA, @@ -202,18 +202,18 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Natural Cure nature: Nature.CALM, - moveSet: [ Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.GARDEVOIR), isBoss: false, formIndex: 1, nature: Nature.TIMID, - moveSet: [ Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICTOR, @@ -223,19 +223,19 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.OBSTAGOON), isBoss: false, abilityIndex: 1, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH ], - modifierConfigs: expect.any(Array) - } - ] - } + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], + modifierConfigs: expect.any(Array), + }, + ], + }, ]); expect(encounter.spriteConfigs).toBeDefined(); expect(encounter.spriteConfigs.length).toBe(5); @@ -300,7 +300,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_MACHO_BRACE"); }, 15000); @@ -340,7 +342,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("RARER_CANDY"); }); @@ -352,7 +356,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { * @param game * @param isFinalBattle */ -async function skipBattleToNextBattle(game: GameManager, isFinalBattle: boolean = false) { +async function skipBattleToNextBattle(game: GameManager, isFinalBattle = false) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); const commandUiHandler = game.scene.ui.handlers[Mode.COMMAND]; diff --git a/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 90a13c75dc3..90e2312e624 100644 --- a/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -7,7 +7,10 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; @@ -24,7 +27,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; const namespace = "mysteryEncounters/trashToTreasure"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -46,9 +49,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.TRASH_TO_TREASURE ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.TRASH_TO_TREASURE]]]), ); }); @@ -95,10 +96,10 @@ describe("Trash to Treasure - Mystery Encounter", () => { shiny: false, formIndex: 1, bossSegmentModifier: 1, - moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ], - } + moveSet: [Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH], + }, ], - } + }, ]); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); @@ -176,7 +177,12 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.GARBODOR); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.PAYBACK), new PokemonMove(Moves.GUNK_SHOT), new PokemonMove(Moves.STOMPING_TANTRUM), new PokemonMove(Moves.DRAIN_PUNCH) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.PAYBACK), + new PokemonMove(Moves.GUNK_SHOT), + new PokemonMove(Moves.STOMPING_TANTRUM), + new PokemonMove(Moves.DRAIN_PUNCH), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -194,12 +200,26 @@ describe("Trash to Treasure - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); }); }); }); diff --git a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 1bdc45348d6..452dfcf3784 100644 --- a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -4,7 +4,10 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; @@ -27,7 +30,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/uncommonBreed"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -43,7 +46,8 @@ describe("Uncommon Breed - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .mysteryEncounterTier(MysteryEncounterTier.COMMON) .startingWave(defaultWave) .startingBiome(defaultBiome) @@ -52,9 +56,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.UNCOMMON_BREED ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.UNCOMMON_BREED]]]), ); }); @@ -126,7 +128,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); const statStagePhases = unshiftPhaseSpy.mock.calls.filter(p => p[0] instanceof StatStageChangePhase)[0][0] as any; - expect(statStagePhases.stats).toEqual([ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]); + expect(statStagePhases.stats).toEqual([Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]); // Should have used its egg move pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -153,7 +155,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); const statStagePhases = unshiftPhaseSpy.mock.calls.filter(p => p[0] instanceof StatStageChangePhase)[0][0] as any; - expect(statStagePhases.stats).toEqual([ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]); + expect(statStagePhases.stats).toEqual([Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]); // Should have used its egg move pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -176,7 +178,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); @@ -213,11 +215,11 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); // Berries on party lead - const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; scene.addModifier(sitrusMod, true, false, false, true); - const ganlon = generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ])!; + const ganlon = generateModifierType(modifierTypes.BERRY, [BerryType.GANLON])!; const ganlonMod = ganlon.newModifier(scene.getPlayerParty()[0]) as BerryModifier; ganlonMod.stackCount = 3; scene.addModifier(ganlonMod, true, false, false, true); @@ -241,14 +243,14 @@ describe("Uncommon Breed - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.3.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't have an Attracting move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); - scene.getPlayerParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -270,7 +272,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); // Mock moveset - scene.getPlayerParty()[0].moveset = [ new PokemonMove(Moves.CHARM) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.CHARM)]; await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index 073893f340d..fbb88e346a8 100644 --- a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -5,7 +5,10 @@ import { Species } from "#app/enums/species"; import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; @@ -19,7 +22,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { ModifierTier } from "#app/modifier/modifier-tier"; const namespace = "mysteryEncounters/weirdDream"; -const defaultParty = [ Species.MAGBY, Species.HAUNTER, Species.ABRA ]; +const defaultParty = [Species.MAGBY, Species.HAUNTER, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -39,12 +42,12 @@ describe("Weird Dream - Mystery Encounter", () => { game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation(() => new Promise(resolve => resolve())); + vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation( + () => new Promise(resolve => resolve()), + ); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.WEIRD_DREAM ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.WEIRD_DREAM]]]), ); }); @@ -62,7 +65,7 @@ describe("Weird Dream - Mystery Encounter", () => { expect(WeirdDreamEncounter.dialogue).toBeDefined(); expect(WeirdDreamEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: `${namespace}:speaker`, @@ -142,7 +145,9 @@ describe("Weird Dream - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("ROGUE_BALL"); @@ -196,14 +201,34 @@ describe("Weird Dream - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(6); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); - expect(modifierSelectHandler.options[5].modifierTypeOption.type.tier - modifierSelectHandler.options[5].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[4].modifierTypeOption.type.tier - + modifierSelectHandler.options[4].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[5].modifierTypeOption.type.tier - + modifierSelectHandler.options[5].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); }); }); diff --git a/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts index 25981b444a4..1c4a2cf89bd 100644 --- a/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -1,8 +1,19 @@ import type BattleScene from "#app/battle-scene"; import { speciesStarterCosts } from "#app/data/balance/starters"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterCost, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + getEncounterText, + queueEncounterMessage, + showEncounterDialogue, + showEncounterText, +} from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { + getHighestLevelPlayerPokemon, + getLowestLevelPlayerPokemon, + getRandomPlayerPokemon, + getRandomSpeciesByStarterCost, + koPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { PokemonType } from "#enums/pokemon-type"; import { MessagePhase } from "#app/phases/message-phase"; @@ -31,7 +42,7 @@ describe("Mystery Encounter Utils", () => { beforeEach(() => { game = new GameManager(phaserGame); scene = game.scene; - initSceneWithoutEncounterPhase(game.scene, [ Species.ARCEUS, Species.MANAPHY ]); + initSceneWithoutEncounterPhase(game.scene, [Species.ARCEUS, Species.MANAPHY]); }); describe("getRandomPlayerPokemon", () => { @@ -214,7 +225,7 @@ describe("Mystery Encounter Utils", () => { }); it("gets species for a starter tier range", () => { - const result = getRandomSpeciesByStarterCost([ 5, 8 ]); + const result = getRandomSpeciesByStarterCost([5, 8]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(result); @@ -224,14 +235,22 @@ describe("Mystery Encounter Utils", () => { it("excludes species from search", () => { // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos - const result = getRandomSpeciesByStarterCost(9, [ Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ARCEUS, Species.KORAIDON, Species.MIRAIDON, Species.TERAPAGOS ]); + const result = getRandomSpeciesByStarterCost(9, [ + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.ARCEUS, + Species.KORAIDON, + Species.MIRAIDON, + Species.TERAPAGOS, + ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.ZACIAN); }); it("gets species of specified types", () => { // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos - const result = getRandomSpeciesByStarterCost(9, undefined, [ PokemonType.GROUND ]); + const result = getRandomSpeciesByStarterCost(9, undefined, [PokemonType.GROUND]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); }); @@ -288,7 +307,14 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showText"); await showEncounterText("mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("mysteryEncounter:unit_test_dialogue", null, expect.any(Function), 0, true, null); + expect(spy).toHaveBeenCalledWith( + "mysteryEncounter:unit_test_dialogue", + null, + expect.any(Function), + 0, + true, + null, + ); }); }); @@ -299,8 +325,13 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showDialogue"); await showEncounterDialogue("mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue", null, expect.any(Function), 0); + expect(spy).toHaveBeenCalledWith( + "mysteryEncounter:unit_test_dialogue", + "mysteryEncounter:unit_test_dialogue", + null, + expect.any(Function), + 0, + ); }); }); }); - diff --git a/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts index c70193a5d56..c9d31f28717 100644 --- a/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -29,7 +29,10 @@ describe("Mystery Encounters", () => { }); it("Spawns a mystery encounter", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); @@ -51,4 +54,3 @@ describe("Mystery Encounters", () => { expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); }); }); - diff --git a/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts index 92b956d6531..deac21ed0dd 100644 --- a/test/phases/form-change-phase.test.ts +++ b/test/phases/form-change-phase.test.ts @@ -25,7 +25,7 @@ describe("Form Change Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -35,16 +35,16 @@ describe("Form Change Phase", () => { }); it("Zacian should successfully change into Crowned form", async () => { - await game.classicMode.startBattle([ Species.ZACIAN ]); + await game.classicMode.startBattle([Species.ZACIAN]); // Before the form change: Should be Hero form const zacian = game.scene.getPlayerParty()[0]; expect(zacian.getFormKey()).toBe("hero-of-many-battles"); - expect(zacian.getTypes()).toStrictEqual([ PokemonType.FAIRY ]); - expect(zacian.calculateBaseStats()).toStrictEqual([ 92, 120, 115, 80, 115, 138 ]); + expect(zacian.getTypes()).toStrictEqual([PokemonType.FAIRY]); + expect(zacian.calculateBaseStats()).toStrictEqual([92, 120, 115, 80, 115, 138]); // Give Zacian a Rusted Sword - const rustedSwordType = generateModifierType( modifierTypes.RARE_FORM_CHANGE_ITEM)!; + const rustedSwordType = generateModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM)!; const rustedSword = rustedSwordType.newModifier(zacian); await game.scene.addModifier(rustedSword); @@ -54,7 +54,7 @@ describe("Form Change Phase", () => { // After the form change: Should be Crowned form expect(game.phaseInterceptor.log.includes("FormChangePhase")).toBe(true); expect(zacian.getFormKey()).toBe("crowned"); - expect(zacian.getTypes()).toStrictEqual([ PokemonType.FAIRY, PokemonType.STEEL ]); - expect(zacian.calculateBaseStats()).toStrictEqual([ 92, 150, 115, 80, 115, 148 ]); + expect(zacian.getTypes()).toStrictEqual([PokemonType.FAIRY, PokemonType.STEEL]); + expect(zacian.calculateBaseStats()).toStrictEqual([92, 150, 115, 80, 115, 148]); }); }); diff --git a/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts index 0bea8e87f47..2f628f8a8c4 100644 --- a/test/phases/frenzy-move-reset.test.ts +++ b/test/phases/frenzy-move-reset.test.ts @@ -37,32 +37,32 @@ describe("Frenzy Move Reset", () => { }); /* - * Thrash (or frenzy moves in general) should not continue to run if attack fails due to paralysis - * - * This is a 3-turn Thrash test: - * 1. Thrash is selected and succeeds to hit the enemy -> Enemy Faints - * - * 2. Thrash is automatically selected but misses due to paralysis - * Note: After missing the Pokemon should stop automatically attacking - * - * 3. At the start of the 3rd turn the Player should be able to select a move/switch Pokemon/etc. - * Note: This means that BattlerTag.FRENZY is not anymore in pokemon.summonData.tags and pokemon.summonData.moveQueue is empty - * - */ + * Thrash (or frenzy moves in general) should not continue to run if attack fails due to paralysis + * + * This is a 3-turn Thrash test: + * 1. Thrash is selected and succeeds to hit the enemy -> Enemy Faints + * + * 2. Thrash is automatically selected but misses due to paralysis + * Note: After missing the Pokemon should stop automatically attacking + * + * 3. At the start of the 3rd turn the Player should be able to select a move/switch Pokemon/etc. + * Note: This means that BattlerTag.FRENZY is not anymore in pokemon.summonData.tags and pokemon.summonData.moveQueue is empty + * + */ it("should cancel frenzy move if move fails turn 2", async () => { await game.classicMode.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.THRASH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceStatusActivation(false); await game.toNextTurn(); expect(playerPokemon.summonData.moveQueue.length).toBe(2); expect(playerPokemon.summonData.tags.some(tag => tag.tagType === BattlerTagType.FRENZY)).toBe(true); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceStatusActivation(true); await game.toNextTurn(); diff --git a/test/phases/game-over-phase.test.ts b/test/phases/game-over-phase.test.ts index 4f5e215959a..438efc85167 100644 --- a/test/phases/game-over-phase.test.ts +++ b/test/phases/game-over-phase.test.ts @@ -25,7 +25,7 @@ describe("Game Over Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.MEMENTO, Moves.ICE_BEAM, Moves.SPLASH ]) + .moveset([Moves.MEMENTO, Moves.ICE_BEAM, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -37,7 +37,7 @@ describe("Game Over Phase", () => { }); it("winning a run should give rewards", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); vi.spyOn(game.scene, "validateAchv"); // Note: `game.doKillOpponents()` does not properly handle final boss @@ -60,7 +60,7 @@ describe("Game Over Phase", () => { }); it("losing a run should not give rewards", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); vi.spyOn(game.scene, "validateAchv"); game.move.select(Moves.MEMENTO); diff --git a/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts index 6eb86620877..55b9d8b79d4 100644 --- a/test/phases/learn-move-phase.test.ts +++ b/test/phases/learn-move-phase.test.ts @@ -27,8 +27,8 @@ 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([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + game.override.moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.BULBASAUR]); const pokemon = game.scene.getPlayerPokemon()!; const newMovePos = pokemon?.getMoveset().length; game.move.select(Moves.SPLASH); @@ -42,9 +42,9 @@ 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([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; - const prevMoveset = [ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]; + const prevMoveset = [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]; const moveSlotNum = 3; game.move.changeMoveset(bulbasaur, prevMoveset); @@ -69,17 +69,17 @@ describe("Learn Move Phase", () => { expect(bulbasaur.level).toBeGreaterThanOrEqual(levelReq); // Check each of mr mime's moveslots to make sure the changed move (and ONLY the changed move) is different bulbasaur.getMoveset().forEach((move, index) => { - const expectedMove: Moves = (index === moveSlotNum ? levelMoveId : prevMoveset[index]); + const expectedMove: Moves = index === moveSlotNum ? levelMoveId : prevMoveset[index]; expect(move?.moveId).toBe(expectedMove); }); }); it("selecting the newly deleted move will reject it and keep old moveset", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; - const prevMoveset = [ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]; + const prevMoveset = [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]; - game.move.changeMoveset(bulbasaur, [ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]); + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); @@ -104,47 +104,62 @@ describe("Learn Move Phase", () => { }); it("macro should add moves in free slots normally", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; - game.move.changeMoveset(bulbasaur, [ Moves.SPLASH, Moves.ABSORB, Moves.ACID ]); + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID]); game.move.select(Moves.SPLASH); await game.move.learnMove(Moves.SACRED_FIRE, 0, 1); - expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.SACRED_FIRE ]); - + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.ABSORB, + Moves.ACID, + Moves.SACRED_FIRE, + ]); }); it("macro should replace moves", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; - game.move.changeMoveset(bulbasaur, [ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]); + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); game.move.select(Moves.SPLASH); await game.move.learnMove(Moves.SACRED_FIRE, 0, 1); - expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ Moves.SPLASH, Moves.SACRED_FIRE, Moves.ACID, Moves.VINE_WHIP ]); - + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.SACRED_FIRE, + Moves.ACID, + Moves.VINE_WHIP, + ]); }); it("macro should allow for cancelling move learning", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const bulbasaur = game.scene.getPlayerPokemon()!; - game.move.changeMoveset(bulbasaur, [ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]); + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); game.move.select(Moves.SPLASH); await game.move.learnMove(Moves.SACRED_FIRE, 0, 4); - expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP ]); - + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.ABSORB, + Moves.ACID, + Moves.VINE_WHIP, + ]); }); it("macro works on off-field party members", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR, Species.SQUIRTLE ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.SQUIRTLE]); const squirtle = game.scene.getPlayerParty()[1]!; - game.move.changeMoveset(squirtle, [ Moves.SPLASH, Moves.WATER_GUN, Moves.FREEZE_DRY, Moves.GROWL ]); + game.move.changeMoveset(squirtle, [Moves.SPLASH, Moves.WATER_GUN, Moves.FREEZE_DRY, Moves.GROWL]); game.move.select(Moves.TACKLE); await game.move.learnMove(Moves.SHELL_SMASH, 1, 0); - expect(squirtle.getMoveset().map(m => m?.moveId)).toEqual([ Moves.SHELL_SMASH, Moves.WATER_GUN, Moves.FREEZE_DRY, Moves.GROWL ]); - + expect(squirtle.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SHELL_SMASH, + Moves.WATER_GUN, + Moves.FREEZE_DRY, + Moves.GROWL, + ]); }); - }); diff --git a/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts index aa4e1683aae..f903932d2cb 100644 --- a/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -34,15 +34,21 @@ describe("Mystery Encounter Phases", () => { }); describe("MysteryEncounterPhase", () => { - it("Runs to MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + it("Runs to MysteryEncounterPhase", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); }); - it("Runs MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + it("Runs MysteryEncounterPhase", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { // End phase early for test @@ -51,16 +57,21 @@ describe("Mystery Encounter Phases", () => { await game.phaseInterceptor.run(MysteryEncounterPhase); expect(game.scene.mysteryEncounterSaveData.encounteredEvents.length).toBeGreaterThan(0); - expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].type).toEqual(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].type).toEqual( + MysteryEncounterType.MYSTERIOUS_CHALLENGERS, + ); expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].tier).toEqual(MysteryEncounterTier.GREAT); expect(game.scene.ui.getMode()).toBe(Mode.MYSTERY_ENCOUNTER); }); - it("Selects an option for MysteryEncounterPhase", async() => { + it("Selects an option for MysteryEncounterPhase", async () => { const { ui } = game.scene; vi.spyOn(ui, "showDialogue"); vi.spyOn(ui, "showText"); - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { const handler = game.scene.ui.getHandler() as MessageUiHandler; @@ -75,82 +86,70 @@ describe("Mystery Encounter Phases", () => { handler.processInput(Button.ACTION); // Waitfor required so that option select messages and preOptionPhase logic are handled - await vi.waitFor(() => expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name)); + await vi.waitFor(() => + expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name), + ); expect(ui.getMode()).toBe(Mode.MESSAGE); expect(ui.showDialogue).toHaveBeenCalledTimes(1); expect(ui.showText).toHaveBeenCalledTimes(2); - expect(ui.showDialogue).toHaveBeenCalledWith(i18next.t("battle:mysteryEncounterAppeared"), "???", null, expect.any(Function)); - expect(ui.showText).toHaveBeenCalledWith(i18next.t("mysteryEncounters/mysteriousChallengers:intro"), null, expect.any(Function), 750, true); - expect(ui.showText).toHaveBeenCalledWith(i18next.t("mysteryEncounters/mysteriousChallengers:option.selected"), null, expect.any(Function), 300, true); + expect(ui.showDialogue).toHaveBeenCalledWith( + i18next.t("battle:mysteryEncounterAppeared"), + "???", + null, + expect.any(Function), + ); + expect(ui.showText).toHaveBeenCalledWith( + i18next.t("mysteryEncounters/mysteriousChallengers:intro"), + null, + expect.any(Function), + 750, + true, + ); + expect(ui.showText).toHaveBeenCalledWith( + i18next.t("mysteryEncounters/mysteriousChallengers:option.selected"), + null, + expect.any(Function), + 300, + true, + ); }); }); describe("MysteryEncounterOptionSelectedPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles onOptionSelect execution", () => {}); - it("handles onOptionSelect execution", () => { + it("hides intro visuals", () => {}); - }); - - it("hides intro visuals", () => { - - }); - - it("does not hide intro visuals if option disabled", () => { - - }); + it("does not hide intro visuals if option disabled", () => {}); }); describe("MysteryEncounterBattlePhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles TRAINER_BATTLE variant", () => {}); - it("handles TRAINER_BATTLE variant", () => { + it("handles BOSS_BATTLE variant", () => {}); - }); + it("handles WILD_BATTLE variant", () => {}); - it("handles BOSS_BATTLE variant", () => { - - }); - - it("handles WILD_BATTLE variant", () => { - - }); - - it("handles double battle", () => { - - }); + it("handles double battle", () => {}); }); describe("MysteryEncounterRewardsPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles doEncounterRewards", () => {}); - it("handles doEncounterRewards", () => { - - }); - - it("handles heal phase if enabled", () => { - - }); + it("handles heal phase if enabled", () => {}); }); describe("PostMysteryEncounterPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles onPostOptionSelect execution", () => {}); - it("handles onPostOptionSelect execution", () => { - - }); - - it("runs to next EncounterPhase", () => { - - }); + it("runs to next EncounterPhase", () => {}); }); }); - diff --git a/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts index 0949eeec955..bb3d5debc7c 100644 --- a/test/phases/select-modifier-phase.test.ts +++ b/test/phases/select-modifier-phase.test.ts @@ -33,7 +33,7 @@ describe("SelectModifierPhase", () => { scene = game.scene; game.override - .moveset([ Moves.FISSURE, Moves.SPLASH ]) + .moveset([Moves.FISSURE, Moves.SPLASH]) .ability(Abilities.NO_GUARD) .startingLevel(200) .enemySpecies(Species.MAGIKARP); @@ -46,7 +46,7 @@ describe("SelectModifierPhase", () => { }); it("should start a select modifier phase", async () => { - initSceneWithoutEncounterPhase(scene, [ Species.ABRA, Species.VOLCARONA ]); + initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); const selectModifierPhase = new SelectModifierPhase(); scene.pushPhase(selectModifierPhase); await game.phaseInterceptor.run(SelectModifierPhase); @@ -55,25 +55,32 @@ describe("SelectModifierPhase", () => { }); it("should generate random modifiers", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); game.move.select(Moves.FISSURE); await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); }); it("should modify reroll cost", async () => { - initSceneWithoutEncounterPhase(scene, [ Species.ABRA, Species.VOLCARONA ]); + initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); const options = [ new ModifierTypeOption(modifierTypes.POTION(), 0, 100), new ModifierTypeOption(modifierTypes.ETHER(), 0, 400), - new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000) + new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000), ]; - const selectModifierPhase1 = new SelectModifierPhase(0, undefined, { guaranteedModifierTypeOptions: options }); - const selectModifierPhase2 = new SelectModifierPhase(0, undefined, { guaranteedModifierTypeOptions: options, rerollMultiplier: 2 }); + const selectModifierPhase1 = new SelectModifierPhase(0, undefined, { + guaranteedModifierTypeOptions: options, + }); + const selectModifierPhase2 = new SelectModifierPhase(0, undefined, { + guaranteedModifierTypeOptions: options, + rerollMultiplier: 2, + }); const cost1 = selectModifierPhase1.getRerollCost(false); const cost2 = selectModifierPhase2.getRerollCost(false); @@ -81,7 +88,7 @@ describe("SelectModifierPhase", () => { }); it.todo("should generate random modifiers from reroll", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; scene.shopCursorTarget = 0; @@ -91,7 +98,9 @@ describe("SelectModifierPhase", () => { // TODO: nagivate the ui to reroll somehow //const smphase = scene.getCurrentPhase() as SelectModifierPhase; expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); modifierSelectHandler.processInput(Button.ACTION); @@ -103,12 +112,12 @@ describe("SelectModifierPhase", () => { it.todo("should generate random modifiers of same tier for reroll with reroll lock", async () => { game.override.startingModifier([{ name: "LOCK_CAPSULE" }]); - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; // Just use fully random seed for this test vi.spyOn(scene, "resetSeed").mockImplementation(() => { scene.waveSeed = shiftCharCodes(scene.seed, 5); - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); console.log("Wave Seed:", scene.waveSeed, 5); scene.rngCounter = 0; }); @@ -117,7 +126,9 @@ describe("SelectModifierPhase", () => { await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); const firstRollTiers: ModifierTier[] = modifierSelectHandler.options.map(o => o.modifierTypeOption.type.tier); @@ -126,16 +137,31 @@ describe("SelectModifierPhase", () => { expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); expect(modifierSelectHandler.options.length).toEqual(3); // Reroll with lock can still upgrade - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[0]); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[1]); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[2]); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[0]); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[1]); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[2]); }); it("should generate custom modifiers", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_ULTRA, modifierTypes.LEFTOVERS, modifierTypes.AMULET_COIN, modifierTypes.GOLDEN_PUNCH ] + guaranteedModifierTypeFuncs: [ + modifierTypes.MEMORY_MUSHROOM, + modifierTypes.TM_ULTRA, + modifierTypes.LEFTOVERS, + modifierTypes.AMULET_COIN, + modifierTypes.GOLDEN_PUNCH, + ], }; const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); scene.unshiftPhase(selectModifierPhase); @@ -143,7 +169,9 @@ describe("SelectModifierPhase", () => { await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_ULTRA"); @@ -153,10 +181,16 @@ describe("SelectModifierPhase", () => { }); it("should generate custom modifier tiers that can upgrade from luck", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; const customModifiers: CustomModifierSettings = { - guaranteedModifierTiers: [ ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.ULTRA, ModifierTier.ROGUE, ModifierTier.MASTER ] + guaranteedModifierTiers: [ + ModifierTier.COMMON, + ModifierTier.GREAT, + ModifierTier.ULTRA, + ModifierTier.ROGUE, + ModifierTier.MASTER, + ], }; const pokemon = new PlayerPokemon(getPokemonSpecies(Species.BULBASAUR), 10, undefined, 0, undefined, true, 2); @@ -172,30 +206,48 @@ describe("SelectModifierPhase", () => { await game.phaseInterceptor.to("SelectModifierPhase"); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.COMMON); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.MASTER); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.COMMON); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[4].modifierTypeOption.type.tier - + modifierSelectHandler.options[4].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.MASTER); }); it("should generate custom modifiers and modifier tiers together", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON ], - guaranteedModifierTiers: [ ModifierTier.MASTER, ModifierTier.MASTER ] + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON], + guaranteedModifierTiers: [ModifierTier.MASTER, ModifierTier.MASTER], }; const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); scene.unshiftPhase(selectModifierPhase); game.move.select(Moves.SPLASH); await game.phaseInterceptor.run(SelectModifierPhase); - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON"); @@ -204,21 +256,22 @@ describe("SelectModifierPhase", () => { }); it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => { - await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); scene.money = 1000000; const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM ], - guaranteedModifierTiers: [ ModifierTier.MASTER ], - fillRemaining: true + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM], + guaranteedModifierTiers: [ModifierTier.MASTER], + fillRemaining: true, }; const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); scene.unshiftPhase(selectModifierPhase); game.move.select(Moves.SPLASH); await game.phaseInterceptor.run(SelectModifierPhase); - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); diff --git a/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts index e9033c859de..9ec98b6a59f 100644 --- a/test/plugins/api/pokerogue-account-api.test.ts +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -30,7 +30,7 @@ describe("Pokerogue Account API", () => { }; server.use(http.get(`${apiBase}/account/info`, () => HttpResponse.json(expectedAccountInfo))); - const [ accountInfo, status ] = await accountApi.getInfo(); + const [accountInfo, status] = await accountApi.getInfo(); expect(accountInfo).toEqual(expectedAccountInfo); expect(status).toBe(200); @@ -39,7 +39,7 @@ describe("Pokerogue Account API", () => { it("should return null + status-code anad report a warning on FAILURE", async () => { server.use(http.get(`${apiBase}/account/info`, () => new HttpResponse("", { status: 401 }))); - const [ accountInfo, status ] = await accountApi.getInfo(); + const [accountInfo, status] = await accountApi.getInfo(); expect(accountInfo).toBeNull(); expect(status).toBe(401); @@ -49,7 +49,7 @@ describe("Pokerogue Account API", () => { it("should return null + 500 anad report a warning on ERROR", async () => { server.use(http.get(`${apiBase}/account/info`, () => HttpResponse.error())); - const [ accountInfo, status ] = await accountApi.getInfo(); + const [accountInfo, status] = await accountApi.getInfo(); expect(accountInfo).toBeNull(); expect(status).toBe(500); @@ -70,7 +70,7 @@ describe("Pokerogue Account API", () => { it("should return error message on FAILURE", async () => { server.use( - http.post(`${apiBase}/account/register`, () => new HttpResponse("Username is already taken", { status: 400 })) + http.post(`${apiBase}/account/register`, () => new HttpResponse("Username is already taken", { status: 400 })), ); const error = await accountApi.register(registerParams); @@ -78,7 +78,7 @@ describe("Pokerogue Account API", () => { expect(error).toBe("Username is already taken"); }); - it("should return \"Unknown error\" and report a warning on ERROR", async () => { + it('should return "Unknown error" and report a warning on ERROR', async () => { server.use(http.post(`${apiBase}/account/register`, () => HttpResponse.error())); const error = await accountApi.register(registerParams); @@ -103,7 +103,7 @@ describe("Pokerogue Account API", () => { it("should return error message and report a warning on FAILURE", async () => { server.use( - http.post(`${apiBase}/account/login`, () => new HttpResponse("Password is incorrect", { status: 401 })) + http.post(`${apiBase}/account/login`, () => new HttpResponse("Password is incorrect", { status: 401 })), ); const error = await accountApi.login(loginParams); @@ -112,7 +112,7 @@ describe("Pokerogue Account API", () => { expect(console.warn).toHaveBeenCalledWith("Login failed!", 401, "Unauthorized"); }); - it("should return \"Unknown error\" and report a warning on ERROR", async () => { + it('should return "Unknown error" and report a warning on ERROR', async () => { server.use(http.post(`${apiBase}/account/login`, () => HttpResponse.error())); const error = await accountApi.login(loginParams); diff --git a/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts index 5af55967ae2..0ce727b88da 100644 --- a/test/plugins/api/pokerogue-admin-api.test.ts +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -25,7 +25,10 @@ describe("Pokerogue Admin API", () => { }); describe("Link Account to Discord", () => { - const params: LinkAccountToDiscordIdRequest = { username: "test", discordId: "test-12575756" }; + const params: LinkAccountToDiscordIdRequest = { + username: "test", + discordId: "test-12575756", + }; it("should return null on SUCCESS", async () => { server.use(http.post(`${apiBase}/admin/account/discordLink`, () => HttpResponse.json(true))); @@ -64,7 +67,10 @@ describe("Pokerogue Admin API", () => { }); describe("Unlink Account from Discord", () => { - const params: UnlinkAccountFromDiscordIdRequest = { username: "test", discordId: "test-12575756" }; + const params: UnlinkAccountFromDiscordIdRequest = { + username: "test", + discordId: "test-12575756", + }; it("should return null on SUCCESS", async () => { server.use(http.post(`${apiBase}/admin/account/discordUnlink`, () => HttpResponse.json(true))); @@ -103,7 +109,10 @@ describe("Pokerogue Admin API", () => { }); describe("Link Account to Google", () => { - const params: LinkAccountToGoogledIdRequest = { username: "test", googleId: "test-12575756" }; + const params: LinkAccountToGoogledIdRequest = { + username: "test", + googleId: "test-12575756", + }; it("should return null on SUCCESS", async () => { server.use(http.post(`${apiBase}/admin/account/googleLink`, () => HttpResponse.json(true))); @@ -142,7 +151,10 @@ describe("Pokerogue Admin API", () => { }); describe("Unlink Account from Google", () => { - const params: UnlinkAccountFromGoogledIdRequest = { username: "test", googleId: "test-12575756" }; + const params: UnlinkAccountFromGoogledIdRequest = { + username: "test", + googleId: "test-12575756", + }; it("should return null on SUCCESS", async () => { server.use(http.post(`${apiBase}/admin/account/googleUnlink`, () => HttpResponse.json(true))); @@ -193,7 +205,7 @@ describe("Pokerogue Admin API", () => { }; server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => HttpResponse.json(responseData))); - const [ data, err ] = await adminApi.searchAccount(params); + const [data, err] = await adminApi.searchAccount(params); expect(data).toStrictEqual(responseData); expect(err).toBeUndefined(); @@ -202,7 +214,7 @@ describe("Pokerogue Admin API", () => { it("should return [undefined, ERR_GENERIC] and report a warning on on FAILURE", async () => { server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => new HttpResponse("", { status: 400 }))); - const [ data, err ] = await adminApi.searchAccount(params); + const [data, err] = await adminApi.searchAccount(params); expect(data).toBeUndefined(); expect(err).toBe(adminApi.ERR_GENERIC); @@ -212,7 +224,7 @@ describe("Pokerogue Admin API", () => { it("should return [undefined, ERR_USERNAME_NOT_FOUND] and report a warning on on 404", async () => { server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => new HttpResponse("", { status: 404 }))); - const [ data, err ] = await adminApi.searchAccount(params); + const [data, err] = await adminApi.searchAccount(params); expect(data).toBeUndefined(); expect(err).toBe(adminApi.ERR_USERNAME_NOT_FOUND); @@ -222,7 +234,7 @@ describe("Pokerogue Admin API", () => { it("should return [undefined, ERR_GENERIC] and report a warning on on ERROR", async () => { server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => HttpResponse.error())); - const [ data, err ] = await adminApi.searchAccount(params); + const [data, err] = await adminApi.searchAccount(params); expect(data).toBeUndefined(); expect(err).toBe(adminApi.ERR_GENERIC); diff --git a/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts index d8103428d59..67abc9c9336 100644 --- a/test/plugins/api/pokerogue-session-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -29,7 +29,7 @@ describe("Pokerogue Session Savedata API", () => { const params: NewClearSessionSavedataRequest = { clientSessionId: "test-session-id", isVictory: true, - slot: 3 + slot: 3, }; it("should return true on SUCCESS", async () => { @@ -132,7 +132,7 @@ describe("Pokerogue Session Savedata API", () => { it("should return an error string on FAILURE", async () => { server.use( - http.get(`${apiBase}/savedata/session/delete`, () => new HttpResponse("Failed to delete!", { status: 400 })) + http.get(`${apiBase}/savedata/session/delete`, () => new HttpResponse("Failed to delete!", { status: 400 })), ); const error = await sessionSavedataApi.delete(params); @@ -162,8 +162,8 @@ describe("Pokerogue Session Savedata API", () => { http.post(`${apiBase}/savedata/session/clear`, () => HttpResponse.json({ success: true, - }) - ) + }), + ), ); const { success, error } = await sessionSavedataApi.clear(params, {} as SessionSaveData); @@ -178,8 +178,8 @@ describe("Pokerogue Session Savedata API", () => { HttpResponse.json({ success: false, error: "Failed to clear!", - }) - ) + }), + ), ); const { success, error } = await sessionSavedataApi.clear(params, {} as SessionSaveData); diff --git a/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts index f108e22ee2c..81d863049f0 100644 --- a/test/plugins/api/pokerogue-system-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -59,8 +59,8 @@ describe("Pokerogue System Savedata API", () => { trainerId: 123456789, } as SystemSaveData, valid: true, - }) - ) + }), + ), ); const savedata = await systemSavedataApi.verify(params); @@ -76,8 +76,8 @@ describe("Pokerogue System Savedata API", () => { trainerId: 123456789, } as SystemSaveData, valid: false, - }) - ) + }), + ), ); const savedata = await systemSavedataApi.verify(params); diff --git a/test/reload.test.ts b/test/reload.test.ts index 019da0a4c2a..f54885eccfb 100644 --- a/test/reload.test.ts +++ b/test/reload.test.ts @@ -26,7 +26,10 @@ describe("Reload", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(pokerogueApi, "getGameTitleStats").mockResolvedValue({ battleCount: -1, playerCount: -1 }); + vi.spyOn(pokerogueApi, "getGameTitleStats").mockResolvedValue({ + battleCount: -1, + playerCount: -1, + }); vi.spyOn(pokerogueApi.daily, "getSeed").mockResolvedValue("test-seed"); }); @@ -48,7 +51,7 @@ describe("Reload", () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); await game.dailyMode.startBattle(); @@ -81,7 +84,7 @@ describe("Reload", () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); await game.classicMode.startBattle(); // Apparently daily mode would override the biome @@ -153,7 +156,7 @@ describe("Reload", () => { it("should not have RNG inconsistencies at a Daily run wave 50 Boss fight", async () => { game.override.battleType("single").startingWave(50); - await game.runToFinalBossEncounter([ Species.BULBASAUR ], GameModes.DAILY); + await game.runToFinalBossEncounter([Species.BULBASAUR], GameModes.DAILY); const preReloadRngState = Phaser.Math.RND.state(); diff --git a/test/settingMenu/helpers/inGameManip.ts b/test/settingMenu/helpers/inGameManip.ts index b81e577f5b9..ca1fac3bc65 100644 --- a/test/settingMenu/helpers/inGameManip.ts +++ b/test/settingMenu/helpers/inGameManip.ts @@ -45,7 +45,9 @@ export class InGameManip { icon = "KEY_" + icon; } this.icon = this.config.icons[icon]; - expect(getIconForLatestInput(this.configs, this.latestSource, this.selectedDevice, this.settingName)).toEqual(this.icon); + expect(getIconForLatestInput(this.configs, this.latestSource, this.selectedDevice, this.settingName)).toEqual( + this.icon, + ); return this; } diff --git a/test/settingMenu/helpers/menuManip.ts b/test/settingMenu/helpers/menuManip.ts index 1d53b845047..1ddd842c864 100644 --- a/test/settingMenu/helpers/menuManip.ts +++ b/test/settingMenu/helpers/menuManip.ts @@ -40,7 +40,10 @@ export class MenuManip { const parts = input.split("_"); // Skip the first part and join the rest with an underscore - const result = parts.slice(1).map(part => part.toUpperCase()).join("_"); + const result = parts + .slice(1) + .map(part => part.toUpperCase()) + .join("_"); return result; } @@ -54,7 +57,7 @@ export class MenuManip { } iconDisplayedIs(icon) { - if (!(icon.toUpperCase().includes("KEY_"))) { + if (!icon.toUpperCase().includes("KEY_")) { icon = "KEY_" + icon.toUpperCase(); } this.iconDisplayed = this.config.icons[icon]; @@ -110,7 +113,6 @@ export class MenuManip { this.confirm(); } - confirm() { assign(this.config, this.settingName, this.keycode); } diff --git a/test/settingMenu/rebinding_setting.test.ts b/test/settingMenu/rebinding_setting.test.ts index 46a37f4e137..28b5d73d7cc 100644 --- a/test/settingMenu/rebinding_setting.test.ts +++ b/test/settingMenu/rebinding_setting.test.ts @@ -9,10 +9,12 @@ import { InGameManip } from "#test/settingMenu/helpers/inGameManip"; import { MenuManip } from "#test/settingMenu/helpers/menuManip"; import { beforeEach, describe, expect, it } from "vitest"; - describe("Test Rebinding", () => { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let config; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let inGame; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let inTheSettingMenu; const configs: Map = new Map(); const selectedDevice = { @@ -100,7 +102,12 @@ describe("Test Rebinding", () => { it("Check prevent rebind indirectly the d-pad buttons", () => { inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("A"); inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").iconDisplayedIs("D"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("A").weWantThisBindInstead("LEFT").weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("A") + .weWantThisBindInstead("LEFT") + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Left"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); @@ -109,7 +116,12 @@ describe("Test Rebinding", () => { it("Swap alt with a d-pad main", () => { inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").weWantThisBindInstead("W").weCantOverrideThisBind().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .weWantThisBindInstead("W") + .weCantOverrideThisBind() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); }); @@ -118,19 +130,37 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("UP").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("UP") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); @@ -142,19 +172,31 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_D").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Left"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_W").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); @@ -162,18 +204,36 @@ describe("Test Rebinding", () => { }); it("Check if triple swap d-pad is prevented", () => { - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Right").iconDisplayedIs("KEY_ARROW_RIGHT").weWantThisBindInstead("UP").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Right") + .iconDisplayedIs("KEY_ARROW_RIGHT") + .weWantThisBindInstead("UP") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("LEFT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("LEFT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); @@ -184,19 +244,31 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").thereShouldBeNoIcon().weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Right") + .thereShouldBeNoIcon() + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_D").weWantThisBindInstead("A").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("A") + .confirm(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); @@ -216,12 +288,20 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("R").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Shiny").iconDisplayedIs("KEY_R").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Shiny") + .iconDisplayedIs("KEY_R") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Form").iconDisplayedIs("KEY_F").weWantThisBindInstead("R").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Form") + .iconDisplayedIs("KEY_F") + .weWantThisBindInstead("R") + .confirm(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("R").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); @@ -231,7 +311,11 @@ describe("Test Rebinding", () => { it("Swap alt with a key not binded yet", () => { inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Up"); }); @@ -252,7 +336,11 @@ describe("Test Rebinding", () => { inTheSettingMenu.whenWeDelete("Alt_Button_Left").thereShouldBeNoIconAnymore(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); }); @@ -261,13 +349,21 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Shiny").iconDisplayedIs("KEY_R").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Shiny") + .iconDisplayedIs("KEY_R") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Form").iconDisplayedIs("KEY_F").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Form") + .iconDisplayedIs("KEY_F") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Button_Cycle_Form"); @@ -283,7 +379,11 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Down").iconDisplayedIs("KEY_S").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Down") + .iconDisplayedIs("KEY_S") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Button_Cycle_Form"); @@ -293,9 +393,7 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Down"); }); - it("Delete bind then assign not already existing button", () => { - inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); @@ -303,23 +401,34 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); }); - it("change alt bind to not already existing button, than another one alt bind with another not already existing button", () => { inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); inGame.whenWePressOnKeyboard("U").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("U").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").iconDisplayedIs("KEY_D").weWantThisBindInstead("U").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Right") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("U") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); @@ -331,26 +440,38 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_D").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); }); - it("Delete 2 bind then reassign one of them", () => { - inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); @@ -362,7 +483,11 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("A").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("A") + .confirm(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); }); @@ -391,15 +516,53 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("ESC").weShouldTriggerTheButton("Button_Menu"); inGame.whenWePressOnKeyboard("HOME").nothingShouldHappen(); inGame.whenWePressOnKeyboard("DELETE").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Submit").iconDisplayedIs("KEY_ENTER").whenWeDelete().iconDisplayedIs("KEY_ENTER"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").whenWeDelete().iconDisplayedIs("KEY_ARROW_UP"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Down").iconDisplayedIs("KEY_ARROW_DOWN").whenWeDelete().iconDisplayedIs("KEY_ARROW_DOWN"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").whenWeDelete().iconDisplayedIs("KEY_ARROW_LEFT"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Right").iconDisplayedIs("KEY_ARROW_RIGHT").whenWeDelete().iconDisplayedIs("KEY_ARROW_RIGHT"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Menu").iconDisplayedIs("KEY_ESC").whenWeDelete().iconDisplayedIs("KEY_ESC"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").thereShouldBeNoIcon().weWantThisBindInstead("DELETE").weCantAssignThisKey().butLetsForceIt(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").thereShouldBeNoIcon().weWantThisBindInstead("HOME").weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Submit") + .iconDisplayedIs("KEY_ENTER") + .whenWeDelete() + .iconDisplayedIs("KEY_ENTER"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_UP"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Down") + .iconDisplayedIs("KEY_ARROW_DOWN") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_DOWN"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_LEFT"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Right") + .iconDisplayedIs("KEY_ARROW_RIGHT") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_RIGHT"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Menu") + .iconDisplayedIs("KEY_ESC") + .whenWeDelete() + .iconDisplayedIs("KEY_ESC"); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .thereShouldBeNoIcon() + .weWantThisBindInstead("DELETE") + .weCantAssignThisKey() + .butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .thereShouldBeNoIcon() + .weWantThisBindInstead("HOME") + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("DELETE").nothingShouldHappen(); inGame.whenWePressOnKeyboard("HOME").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); @@ -407,8 +570,20 @@ describe("Test Rebinding", () => { it("check to delete all the binds of an action", () => { inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Tera"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Tera").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Cycle_Tera") + .thereShouldBeNoIcon() + .weWantThisBindInstead("K") + .confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Cycle_Tera") + .iconDisplayedIs("KEY_K") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Tera") + .iconDisplayedIs("KEY_V") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); }); }); diff --git a/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts index 43749015e1c..5bd08a58cda 100644 --- a/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -42,7 +42,7 @@ describe("check if every variant's sprite are correctly set", () => { const errors: string[] = []; const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath).filter((filename) => !/^\..*/.test(filename)); + const files = fs.readdirSync(dirpath).filter(filename => !/^\..*/.test(filename)); for (const filename of files) { const filePath = `${dirpath}${filename}`; const trimmedFilePath = `${trimmedDirpath}${filename}`; @@ -54,7 +54,7 @@ describe("check if every variant's sprite are correctly set", () => { if (name.includes("_")) { const id = name.split("_")[0]; const variant = name.split("_")[1]; - const index = parseInt(variant, 10) - 1; + const index = Number.parseInt(variant, 10) - 1; if (ext !== "json") { const urlJsonFile = `${dirpath}${id}.json`; if (mlist.hasOwnProperty(id)) { @@ -78,7 +78,9 @@ describe("check if every variant's sprite are correctly set", () => { const trimmedUrlSpriteFilepath = `${trimmedDirpath}${id}_${variant}.json`; const spriteFileExists = fs.existsSync(urlSpriteJsonFile); if (spriteFileExists) { - errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${index} - ${trimmedUrlSpriteFilepath}`); + errors.push( + `[${id}] [${mlist[id]}] - the value should be 2 for the index ${index} - ${trimmedUrlSpriteFilepath}`, + ); } } } @@ -92,10 +94,12 @@ describe("check if every variant's sprite are correctly set", () => { for (const key of Object.keys(data)) { if (mlist[name][key] !== 1) { // if 2, check if json there - const urlSpriteJsonFile = `${dirpath}${name}_${parseInt(key, 10) + 1}.json`; + const urlSpriteJsonFile = `${dirpath}${name}_${Number.parseInt(key, 10) + 1}.json`; const spriteFileExists = fs.existsSync(urlSpriteJsonFile); if (!spriteFileExists) { - errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); + errors.push( + `[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`, + ); } } } @@ -109,10 +113,9 @@ describe("check if every variant's sprite are correctly set", () => { const errors: string[] = []; for (const key of Object.keys(keys)) { const row = keys[key]; - for (const [ index, elm ] of row.entries()) { + for (const [index, elm] of row.entries()) { let url: string; if (elm === 0) { - continue; } else if (elm === 1) { url = `${key}.json`; const filePath = `${dirPath}${url}`; @@ -122,13 +125,13 @@ describe("check if every variant's sprite are correctly set", () => { errors.push(`index: ${index} - ${filePath}`); } } else if (elm === 2) { - url = `${key}_${parseInt(index, 10) + 1}.png`; + url = `${key}_${Number.parseInt(index, 10) + 1}.png`; let filePath = `${dirPath}${url}`; if (!fs.existsSync(filePath)) { errors.push(filePath); } - url = `${key}_${parseInt(index, 10) + 1}.json`; + url = `${key}_${Number.parseInt(index, 10) + 1}.json`; filePath = `${dirPath}${url}`; if (!fs.existsSync(filePath)) { errors.push(filePath); @@ -243,7 +246,7 @@ describe("check if every variant's sprite are correctly set", () => { it("look over every file in variant back male and check if present in masterlist", () => { const dirPath = `${rootDir}back${path.sep}`; const backMaleVariant = deepCopy(backVariant); - const errors = getMissingMasterlist(backMaleVariant, dirPath, [ "female" ]); + const errors = getMissingMasterlist(backMaleVariant, dirPath, ["female"]); if (errors.length) { console.log("errors for ", dirPath, errors); } @@ -261,7 +264,7 @@ describe("check if every variant's sprite are correctly set", () => { it("look over every file in variant exp back male and check if present in masterlist", () => { const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingMasterlist(expVariant.back, dirPath, [ "female" ]); + const errors = getMissingMasterlist(expVariant.back, dirPath, ["female"]); if (errors.length) { console.log("errors for ", dirPath, errors); } @@ -279,7 +282,7 @@ describe("check if every variant's sprite are correctly set", () => { it("look over every file in variant exp male and check if present in masterlist", () => { const dirPath = `${rootDir}exp${path.sep}`; - const errors = getMissingMasterlist(expVariant, dirPath, [ "back", "female" ]); + const errors = getMissingMasterlist(expVariant, dirPath, ["back", "female"]); if (errors.length) { console.log("errors for ", dirPath, errors); } @@ -288,7 +291,7 @@ describe("check if every variant's sprite are correctly set", () => { it("look over every file in variant root and check if present in masterlist", () => { const dirPath = `${rootDir}`; - const errors = getMissingMasterlist(masterlist, dirPath, [ "back", "female", "exp", "icons" ]); + const errors = getMissingMasterlist(masterlist, dirPath, ["back", "female", "exp", "icons"]); if (errors.length) { console.log("errors for ", dirPath, errors); } diff --git a/test/sprites/spritesUtils.ts b/test/sprites/spritesUtils.ts index f3ee634cd76..0c4bcd875fb 100644 --- a/test/sprites/spritesUtils.ts +++ b/test/sprites/spritesUtils.ts @@ -1,7 +1,7 @@ -const fs = require("fs"); -const path = require("path"); +const fs = require("node:fs"); +const path = require("node:path"); -export function getAppRootDir () { +export function getAppRootDir() { let currentDir = __dirname; while (!fs.existsSync(path.join(currentDir, "package.json"))) { currentDir = path.join(currentDir, ".."); diff --git a/test/system/game_data.test.ts b/test/system/game_data.test.ts index f7940567746..93e615711c4 100644 --- a/test/system/game_data.test.ts +++ b/test/system/game_data.test.ts @@ -21,7 +21,7 @@ describe("System - Game Data", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH); @@ -35,7 +35,7 @@ describe("System - Game Data", () => { beforeEach(() => { vi.spyOn(BattleScene, "bypassLogin", "get").mockReturnValue(false); vi.spyOn(game.scene.gameData, "getSessionSaveData").mockReturnValue({} as SessionSaveData); - vi.spyOn(account, "updateUserInfo").mockImplementation(async () => [ true, 1 ]); + vi.spyOn(account, "updateUserInfo").mockImplementation(async () => [true, 1]); }); it("should return [true, true] if bypassLogin is true", async () => { @@ -43,33 +43,39 @@ describe("System - Game Data", () => { const result = await game.scene.gameData.tryClearSession(0); - expect(result).toEqual([ true, true ]); + expect(result).toEqual([true, true]); }); it("should return [true, true] if successful", async () => { - vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ success: true }); + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + success: true, + }); const result = await game.scene.gameData.tryClearSession(0); - expect(result).toEqual([ true, true ]); + expect(result).toEqual([true, true]); expect(account.updateUserInfo).toHaveBeenCalled(); }); it("should return [true, false] if not successful", async () => { - vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ success: false }); + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + success: false, + }); const result = await game.scene.gameData.tryClearSession(0); - expect(result).toEqual([ true, false ]); + expect(result).toEqual([true, false]); expect(account.updateUserInfo).toHaveBeenCalled(); }); it("should return [false, false] session is out of date", async () => { - vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ error: "session out of date" }); + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + error: "session out of date", + }); const result = await game.scene.gameData.tryClearSession(0); - expect(result).toEqual([ false, false ]); + expect(result).toEqual([false, false]); expect(account.updateUserInfo).toHaveBeenCalled(); }); }); diff --git a/test/testUtils/TextInterceptor.ts b/test/testUtils/TextInterceptor.ts index 089d8967c61..4aaed458e44 100644 --- a/test/testUtils/TextInterceptor.ts +++ b/test/testUtils/TextInterceptor.ts @@ -9,12 +9,26 @@ export default class TextInterceptor { scene.messageWrapper = this; } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { + showText( + text: string, + _delay?: number, + _callback?: Function, + _callbackDelay?: number, + _prompt?: boolean, + _promptDelay?: number, + ): void { console.log(text); this.logs.push(text); } - showDialogue(text: string, name: string, delay?: number, callback?: Function, callbackDelay?: number, promptDelay?: number): void { + showDialogue( + text: string, + name: string, + _delay?: number, + _callback?: Function, + _callbackDelay?: number, + _promptDelay?: number, + ): void { console.log(name, text); this.logs.push(name, text); } diff --git a/test/testUtils/errorInterceptor.ts b/test/testUtils/errorInterceptor.ts index 7f06c47fd39..a8fb3284b78 100644 --- a/test/testUtils/errorInterceptor.ts +++ b/test/testUtils/errorInterceptor.ts @@ -29,8 +29,7 @@ export default class ErrorInterceptor { } } - -process.on("uncaughtException", (error) => { +process.on("uncaughtException", error => { console.log(error); const toStop = ErrorInterceptor.getInstance().running; for (const elm of toStop) { @@ -40,7 +39,7 @@ process.on("uncaughtException", (error) => { }); // Global error handler for unhandled promise rejections -process.on("unhandledRejection", (reason, promise) => { +process.on("unhandledRejection", (reason, _promise) => { console.log(reason); const toStop = ErrorInterceptor.getInstance().running; for (const elm of toStop) { diff --git a/test/testUtils/gameManager.ts b/test/testUtils/gameManager.ts index d245a74d11e..0ebc83cae31 100644 --- a/test/testUtils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -53,7 +53,7 @@ import { SettingsHelper } from "#test/testUtils/helpers/settingsHelper"; import PhaseInterceptor from "#test/testUtils/phaseInterceptor"; import TextInterceptor from "#test/testUtils/TextInterceptor"; import { AES, enc } from "crypto-js"; -import fs from "fs"; +import fs from "node:fs"; import { expect, vi } from "vitest"; /** @@ -79,10 +79,10 @@ export default class GameManager { * @param phaserGame - The Phaser game instance. * @param bypassLogin - Whether to bypass the login phase. */ - constructor(phaserGame: Phaser.Game, bypassLogin: boolean = true) { + constructor(phaserGame: Phaser.Game, bypassLogin = true) { localStorage.clear(); ErrorInterceptor.getInstance().clear(); - BattleScene.prototype.randBattleSeedInt = (range, min: number = 0) => min + range - 1; // This simulates a max roll + BattleScene.prototype.randBattleSeedInt = (range, min = 0) => min + range - 1; // This simulates a max roll this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); this.scene = new BattleScene(); this.phaseInterceptor = new PhaseInterceptor(this.scene); @@ -115,7 +115,7 @@ export default class GameManager { * @returns A promise that resolves when the mode is set. */ waitMode(mode: Mode): Promise { - return new Promise(async (resolve) => { + return new Promise(async resolve => { await waitUntil(() => this.scene.ui?.getMode() === mode); return resolve(); }); @@ -136,7 +136,13 @@ export default class GameManager { * @param callback - The callback function to execute on next prompt. * @param expireFn - Optional function to determine if the prompt has expired. */ - onNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { + onNextPrompt( + phaseTarget: string, + mode: Mode, + callback: () => void, + expireFn?: () => void, + awaitingActionInput = false, + ) { this.phaseInterceptor.addToNextPrompt(phaseTarget, mode, callback, expireFn, awaitingActionInput); } @@ -205,18 +211,29 @@ export default class GameManager { await this.runToTitle(); - this.onNextPrompt("TitlePhase", Mode.TITLE, () => { - this.scene.gameMode = getGameMode(GameModes.CLASSIC); - const starters = generateStarter(this.scene, species); - const selectStarterPhase = new SelectStarterPhase(); - this.scene.pushPhase(new EncounterPhase(false)); - selectStarterPhase.initBattle(starters); - }, () => this.isCurrentPhase(EncounterPhase)); + this.onNextPrompt( + "TitlePhase", + Mode.TITLE, + () => { + this.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(this.scene, species); + const selectStarterPhase = new SelectStarterPhase(); + this.scene.pushPhase(new EncounterPhase(false)); + selectStarterPhase.initBattle(starters); + }, + () => this.isCurrentPhase(EncounterPhase), + ); - this.onNextPrompt("EncounterPhase", Mode.MESSAGE, () => { - const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(MysteryEncounterPhase), true); + this.onNextPrompt( + "EncounterPhase", + Mode.MESSAGE, + () => { + const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; + handler.processInput(Button.ACTION); + }, + () => this.isCurrentPhase(MysteryEncounterPhase), + true, + ); await this.phaseInterceptor.run(EncounterPhase); if (!isNullOrUndefined(encounterType)) { @@ -235,15 +252,25 @@ export default class GameManager { await this.classicMode.runToSummon(species); if (this.scene.battleStyle === BattleStyle.SWITCH) { - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase), + ); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase), + ); } await this.phaseInterceptor.to(CommandPhase); @@ -257,17 +284,29 @@ export default class GameManager { * @param movePosition The index of the move in the pokemon's moveset array */ selectTarget(movePosition: number, targetIndex?: BattlerIndex) { - this.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; - const move = (this.scene.getCurrentPhase() as SelectTargetPhase).getPokemon().getMoveset()[movePosition]!.getMove(); // TODO: is the bang correct? - if (!move.isMultiTarget()) { - handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); - } - if (move.isMultiTarget() && targetIndex !== undefined) { - throw new Error(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); - } - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(MovePhase) || this.isCurrentPhase(TurnStartPhase) || this.isCurrentPhase(TurnEndPhase)); + this.onNextPrompt( + "SelectTargetPhase", + Mode.TARGET_SELECT, + () => { + const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; + const move = (this.scene.getCurrentPhase() as SelectTargetPhase) + .getPokemon() + .getMoveset() + [movePosition]!.getMove(); // TODO: is the bang correct? + if (!move.isMultiTarget()) { + handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); + } + if (move.isMultiTarget() && targetIndex !== undefined) { + throw new Error(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); + } + handler.processInput(Button.ACTION); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(MovePhase) || + this.isCurrentPhase(TurnStartPhase) || + this.isCurrentPhase(TurnEndPhase), + ); } /** Faint all opponents currently on the field */ @@ -280,15 +319,32 @@ export default class GameManager { /** Emulate selecting a modifier (item) */ doSelectModifier() { - this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - handler.processInput(Button.CANCEL); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase), true); + this.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.CANCEL); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(NewBattlePhase) || + this.isCurrentPhase(CheckSwitchPhase), + true, + ); - this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => { - const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase)); + this.onNextPrompt( + "SelectModifierPhase", + Mode.CONFIRM, + () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.ACTION); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(NewBattlePhase) || + this.isCurrentPhase(CheckSwitchPhase), + ); } /** @@ -305,9 +361,10 @@ export default class GameManager { vi.spyOn(enemy, "getNextMove").mockReturnValueOnce({ move: moveId, - targets: (target !== undefined && !legalTargets.multiple && legalTargets.targets.includes(target)) - ? [ target ] - : enemy.getNextTargets(moveId) + targets: + target !== undefined && !legalTargets.multiple && legalTargets.targets.includes(target) + ? [target] + : enemy.getNextTargets(moveId), }); /** @@ -322,7 +379,10 @@ export default class GameManager { const originalMatchupScore = Trainer.prototype.getPartyMemberMatchupScores; Trainer.prototype.getPartyMemberMatchupScores = () => { Trainer.prototype.getPartyMemberMatchupScores = originalMatchupScore; - return [[ 1, 100 ], [ 1, 100 ]]; + return [ + [1, 100], + [1, 100], + ]; }; } @@ -335,10 +395,15 @@ export default class GameManager { async toNextWave() { this.doSelectModifier(); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(TurnInitPhase), + ); await this.toNextTurn(); } @@ -376,7 +441,7 @@ export default class GameManager { */ exportSaveToTest(): Promise { const saveKey = "x0i2O7WRiANTqPmZ"; - return new Promise(async (resolve) => { + return new Promise(async resolve => { const sessionSaveData = this.scene.gameData.getSessionSaveData(); const encryptedSaveData = AES.encrypt(JSON.stringify(sessionSaveData), saveKey).toString(); resolve(encryptedSaveData); @@ -411,7 +476,7 @@ export default class GameManager { return new Promise(async (resolve, reject) => { pokemon.hp = 0; this.scene.pushPhase(new FaintPhase(pokemon.getBattlerIndex(), true)); - await this.phaseInterceptor.to(FaintPhase).catch((e) => reject(e)); + await this.phaseInterceptor.to(FaintPhase).catch(e => reject(e)); resolve(); }); } diff --git a/test/testUtils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts index 757874f0c17..ae6c11f5efa 100644 --- a/test/testUtils/gameManagerUtils.ts +++ b/test/testUtils/gameManagerUtils.ts @@ -27,7 +27,6 @@ export function blobToString(blob) { }); } - export function holdOn(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -39,12 +38,21 @@ export function generateStarter(scene: BattleScene, species?: Species[]): Starte for (const starter of starters) { const starterProps = scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - const starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - const starterPokemon = scene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); + const starterGender = + starter.species.malePercent !== null ? (!starterProps.female ? Gender.MALE : Gender.FEMALE) : Gender.GENDERLESS; + const starterPokemon = scene.addPlayerPokemon( + starter.species, + startingLevel, + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + undefined, + starter.nature, + ); const moveset: Moves[] = []; - starterPokemon.moveset.forEach((move) => { + starterPokemon.moveset.forEach(move => { moveset.push(move!.getMove().id); }); starter.moveset = moveset as StarterMoveset; @@ -69,7 +77,7 @@ function getTestRunStarters(seed: string, species?: Species[]): Starter[] { abilityIndex: pokemon.abilityIndex, passive: false, nature: pokemon.getNature(), - pokerus: pokemon.pokerus + pokerus: pokemon.pokerus, }; starters.push(starter); } @@ -91,7 +99,7 @@ export function waitUntil(truth): Promise { export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: Moves): number { const playerPokemon = scene.getPlayerField()[pokemonIndex]; const moveSet = playerPokemon.getMoveset(); - const index = moveSet.findIndex((m) => m?.moveId === move && m?.ppUsed < m?.getMovePp()); + const index = moveSet.findIndex(m => m?.moveId === move && m?.ppUsed < m?.getMovePp()); console.log(`Move position for ${Moves[move]} (=${move}):`, index); return index; } @@ -101,12 +109,22 @@ export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: M */ export function initSceneWithoutEncounterPhase(scene: BattleScene, species?: Species[]): void { const starters = generateStarter(scene, species); - starters.forEach((starter) => { + starters.forEach(starter => { const starterProps = scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); const starterGender = Gender.MALE; const starterIvs = scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); - const starterPokemon = scene.addPlayerPokemon(starter.species, scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + const starterPokemon = scene.addPlayerPokemon( + starter.species, + scene.gameMode.getStartingLevel(), + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + starterIvs, + starter.nature, + ); starter.moveset && starterPokemon.tryPopulateMoveset(starter.moveset); scene.getPlayerParty().push(starterPokemon); }); diff --git a/test/testUtils/gameWrapper.ts b/test/testUtils/gameWrapper.ts index c2614b2b61d..6af36f22d24 100644 --- a/test/testUtils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -12,7 +12,7 @@ import MockLoader from "#test/testUtils/mocks/mockLoader"; import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; -import fs from "fs"; +import fs from "node:fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -47,14 +47,12 @@ window.URL.createObjectURL = (blob: Blob) => { }; navigator.getGamepads = () => []; global.fetch = vi.fn(MockFetch); -Utils.setCookie(Utils.sessionIdKey, 'fake_token'); - +Utils.setCookie(Utils.sessionIdKey, "fake_token"); window.matchMedia = () => ({ matches: false, }); - /** * Sets this object's position relative to another object with a given offset * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of @@ -74,13 +72,12 @@ Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; - export default class GameWrapper { public game: Phaser.Game; public scene: BattleScene; constructor(phaserGame: Phaser.Game, bypassLogin: boolean) { - Phaser.Math.RND.sow([ 'test' ]); + Phaser.Math.RND.sow(["test"]); // vi.spyOn(Utils, "apiFetch", "get").mockReturnValue(fetch); if (bypassLogin) { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(true); @@ -92,21 +89,25 @@ export default class GameWrapper { Pokemon.prototype.enableMask = () => null; Pokemon.prototype.updateFusionPalette = () => null; Pokemon.prototype.cry = () => null; - Pokemon.prototype.faintCry = (cb) => { if (cb) cb(); }; + Pokemon.prototype.faintCry = cb => { + if (cb) { + cb(); + } + }; BattleScene.prototype.addPokemonIcon = () => new Phaser.GameObjects.Container(this.scene); } setScene(scene: BattleScene) { this.scene = scene; this.injectMandatory(); - this.scene.preload && this.scene.preload(); + this.scene.preload?.(); this.scene.create(); } injectMandatory() { this.game.config = { seed: ["test"], - gameVersion: version + gameVersion: version, }; this.scene.game = this.game; this.game.renderer = { @@ -129,7 +130,7 @@ export default class GameWrapper { pause: () => null, setRate: () => null, add: () => this.scene.sound, - get: () => ({...this.scene.sound, totalDuration: 0}), + get: () => ({ ...this.scene.sound, totalDuration: 0 }), getAllPlaying: () => [], manager: { game: this.game, @@ -138,7 +139,7 @@ export default class GameWrapper { setVolume: () => null, stop: () => null, stopByKey: () => null, - on: (evt, callback) => callback(), + on: (_evt, callback) => callback(), key: "", }; @@ -150,15 +151,15 @@ export default class GameWrapper { }; this.scene.tweens = { - add: (data) => { + add: data => { if (data.onComplete) { data.onComplete(); } }, - getTweensOf: () => ([]), - killTweensOf: () => ([]), + getTweensOf: () => [], + killTweensOf: () => [], chain: () => null, - addCounter: (data) => { + addCounter: data => { if (data.onComplete) { data.onComplete(); } @@ -185,14 +186,15 @@ export default class GameWrapper { game: this.game, textures: { addCanvas: () => ({ - get: () => ({ // this.frame in Text.js + get: () => ({ + // this.frame in Text.js source: {}, setSize: () => null, glTexture: () => ({ spectorMetadata: {}, }), }), - }) + }), }, cache: this.scene.load.cacheManager, scale: this.game.scale, @@ -203,29 +205,30 @@ export default class GameWrapper { events: new EventEmitter(), settings: { loader: { - key: 'battle', - } + key: "battle", + }, }, input: this.game.input, }; const mockTextureManager = new MockTextureManager(this.scene); this.scene.add = mockTextureManager.add; this.scene.textures = mockTextureManager; - this.scene.sys.displayList = this.scene.add.displayList; + this.scene.sys.displayList = this.scene.add.displayList; this.scene.sys.updateList = new UpdateList(this.scene); this.scene.systems = this.scene.sys; this.scene.input = this.game.input; this.scene.scene = this.scene; this.scene.input.keyboard = new KeyboardPlugin(this.scene); this.scene.input.gamepad = new GamepadPlugin(this.scene); - this.scene.cachedFetch = (url, init) => { - return new Promise((resolve) => { + this.scene.cachedFetch = (url, _init) => { + return new Promise(resolve => { // need to remove that if later we want to test battle-anims - const newUrl = url.includes('./battle-anims/') ? prependPath('./battle-anims/tackle.json') : prependPath(url); + const newUrl = url.includes("./battle-anims/") ? prependPath("./battle-anims/tackle.json") : prependPath(url); + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let raw; try { - raw = fs.readFileSync(newUrl, {encoding: "utf8", flag: "r"}); - } catch(e) { + raw = fs.readFileSync(newUrl, { encoding: "utf8", flag: "r" }); + } catch (_e) { return resolve(createFetchBadResponse({})); } const data = JSON.parse(raw); diff --git a/test/testUtils/helpers/challengeModeHelper.ts b/test/testUtils/helpers/challengeModeHelper.ts index 4b5a38e72dc..0b7826eda7e 100644 --- a/test/testUtils/helpers/challengeModeHelper.ts +++ b/test/testUtils/helpers/challengeModeHelper.ts @@ -16,7 +16,6 @@ import { copyChallenge } from "data/challenge"; * Helper to handle Challenge mode specifics */ export class ChallengeModeHelper extends GameManagerHelper { - challenges: Challenge[] = []; /** @@ -65,15 +64,25 @@ export class ChallengeModeHelper extends GameManagerHelper { await this.runToSummon(species); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/test/testUtils/helpers/classicModeHelper.ts b/test/testUtils/helpers/classicModeHelper.ts index 40c3d518f1c..5b6a38f5747 100644 --- a/test/testUtils/helpers/classicModeHelper.ts +++ b/test/testUtils/helpers/classicModeHelper.ts @@ -14,7 +14,6 @@ import { GameManagerHelper } from "./gameManagerHelper"; * Helper to handle classic mode specifics */ export class ClassicModeHelper extends GameManagerHelper { - /** * Runs the classic game to the summon phase. * @param species - Optional array of species to summon. @@ -50,15 +49,25 @@ export class ClassicModeHelper extends GameManagerHelper { await this.runToSummon(species); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/test/testUtils/helpers/dailyModeHelper.ts b/test/testUtils/helpers/dailyModeHelper.ts index bd8c6ebb920..0f5bc84df68 100644 --- a/test/testUtils/helpers/dailyModeHelper.ts +++ b/test/testUtils/helpers/dailyModeHelper.ts @@ -13,7 +13,6 @@ import { GameManagerHelper } from "./gameManagerHelper"; * Helper to handle daily mode specifics */ export class DailyModeHelper extends GameManagerHelper { - /** * Runs the daily game to the summon phase. * @returns A promise that resolves when the summon phase is reached. @@ -50,15 +49,25 @@ export class DailyModeHelper extends GameManagerHelper { await this.runToSummon(); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/test/testUtils/helpers/moveHelper.ts b/test/testUtils/helpers/moveHelper.ts index 535537b34a2..543f46b2026 100644 --- a/test/testUtils/helpers/moveHelper.ts +++ b/test/testUtils/helpers/moveHelper.ts @@ -33,7 +33,7 @@ export class MoveHelper extends GameManagerHelper { * Used to force a move to miss. * @param firstTargetOnly - Whether the move should force miss on the first target only, in the case of multi-target moves. */ - public async forceMiss(firstTargetOnly: boolean = false): Promise { + public async forceMiss(firstTargetOnly = false): Promise { await this.game.phaseInterceptor.to(MoveEffectPhase, false); const hitCheck = vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck"); @@ -84,25 +84,25 @@ export class MoveHelper extends GameManagerHelper { */ public changeMoveset(pokemon: Pokemon, moveset: Moves | Moves[]): void { if (!Array.isArray(moveset)) { - moveset = [ moveset ]; + moveset = [moveset]; } pokemon.moveset = []; - moveset.forEach((move) => { + moveset.forEach(move => { pokemon.moveset.push(new PokemonMove(move)); }); - const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + const movesetStr = moveset.map(moveId => Moves[moveId]).join(", "); console.log(`Pokemon ${pokemon.species.name}'s moveset manually set to ${movesetStr} (=[${moveset.join(", ")}])!`); } /** - * Simulates learning a move for a player pokemon. - * @param move The {@linkcode Moves} being learnt - * @param partyIndex The party position of the {@linkcode PlayerPokemon} learning the move (defaults to 0) - * @param moveSlotIndex The INDEX (0-4) of the move slot to replace if existent move slots are full; - * defaults to 0 (first slot) and 4 aborts the procedure - * @returns a promise that resolves once the move has been successfully learnt - */ - public async learnMove(move: Moves | number, partyIndex: number = 0, moveSlotIndex: number = 0) { + * Simulates learning a move for a player pokemon. + * @param move The {@linkcode Moves} being learnt + * @param partyIndex The party position of the {@linkcode PlayerPokemon} learning the move (defaults to 0) + * @param moveSlotIndex The INDEX (0-4) of the move slot to replace if existent move slots are full; + * defaults to 0 (first slot) and 4 aborts the procedure + * @returns a promise that resolves once the move has been successfully learnt + */ + public async learnMove(move: Moves | number, partyIndex = 0, moveSlotIndex = 0) { return new Promise(async (resolve, reject) => { this.game.scene.pushPhase(new LearnMovePhase(partyIndex, move)); @@ -128,5 +128,4 @@ export class MoveHelper extends GameManagerHelper { resolve(); }); } - } diff --git a/test/testUtils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts index 47358738048..e69e05bce45 100644 --- a/test/testUtils/helpers/overridesHelper.ts +++ b/test/testUtils/helpers/overridesHelper.ts @@ -23,9 +23,9 @@ import { GameManagerHelper } from "./gameManagerHelper"; */ export class OverridesHelper extends GameManagerHelper { /** If `true`, removes the starting items from enemies at the start of each test; default `true` */ - public removeEnemyStartingItems: boolean = true; + public removeEnemyStartingItems = true; /** If `true`, sets the shiny overrides to disable shinies at the start of each test; default `true` */ - public disableShinies: boolean = true; + public disableShinies = true; /** * Override the starting biome @@ -142,7 +142,7 @@ export class OverridesHelper extends GameManagerHelper { public starterForms(forms: Partial>): this { vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue(forms); const formsStr = Object.entries(forms) - .map(([ speciesId, formIndex ]) => `${Species[speciesId]}=${formIndex}`) + .map(([speciesId, formIndex]) => `${Species[speciesId]}=${formIndex}`) .join(", "); this.log(`Player Pokemon form set to: ${formsStr}!`); return this; @@ -203,9 +203,9 @@ export class OverridesHelper extends GameManagerHelper { public moveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { - moveset = [ moveset ]; + moveset = [moveset]; } - const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + const movesetStr = moveset.map(moveId => Moves[moveId]).join(", "); this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; } @@ -265,7 +265,7 @@ export class OverridesHelper extends GameManagerHelper { public seed(seed: string): this { vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { this.game.scene.waveSeed = seed; - Phaser.Math.RND.sow([ seed ]); + Phaser.Math.RND.sow([seed]); this.game.scene.rngCounter = 0; }); this.game.scene.resetSeed(); @@ -362,9 +362,9 @@ export class OverridesHelper extends GameManagerHelper { public enemyMoveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { - moveset = [ moveset ]; + moveset = [moveset]; } - const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + const movesetStr = moveset.map(moveId => Moves[moveId]).join(", "); this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; } diff --git a/test/testUtils/helpers/reloadHelper.ts b/test/testUtils/helpers/reloadHelper.ts index 5f516584873..842cd88b95c 100644 --- a/test/testUtils/helpers/reloadHelper.ts +++ b/test/testUtils/helpers/reloadHelper.ts @@ -19,7 +19,7 @@ export class ReloadHelper extends GameManagerHelper { // Whenever the game saves the session, save it to the reloadHelper instead vi.spyOn(game.scene.gameData, "saveAll").mockImplementation(() => { - return new Promise((resolve, reject) => { + return new Promise((resolve, _reject) => { this.sessionData = game.scene.gameData.getSessionSaveData(); resolve(true); }); @@ -31,7 +31,7 @@ export class ReloadHelper extends GameManagerHelper { * beginning of the first turn (equivalent to running `startBattle()`) for * the reloaded session. */ - async reloadSession() : Promise { + async reloadSession(): Promise { const scene = this.game.scene; const titlePhase = new TitlePhase(); @@ -39,9 +39,9 @@ export class ReloadHelper extends GameManagerHelper { // Set the last saved session to the desired session data vi.spyOn(scene.gameData, "getSession").mockReturnValue( - new Promise((resolve, reject) => { + new Promise((resolve, _reject) => { resolve(this.sessionData); - }) + }), ); scene.unshiftPhase(titlePhase); this.game.endPhase(); // End the currently ongoing battle @@ -51,15 +51,25 @@ export class ReloadHelper extends GameManagerHelper { // Run through prompts for switching Pokemon, copied from classicModeHelper.ts if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/test/testUtils/helpers/settingsHelper.ts b/test/testUtils/helpers/settingsHelper.ts index 83baa329cec..d5a60e6496a 100644 --- a/test/testUtils/helpers/settingsHelper.ts +++ b/test/testUtils/helpers/settingsHelper.ts @@ -27,7 +27,7 @@ export class SettingsHelper extends GameManagerHelper { */ typeHints(enable: boolean): void { this.game.scene.typeHints = enable; - this.log(`Type Hints ${enable ? "enabled" : "disabled"}` ); + this.log(`Type Hints ${enable ? "enabled" : "disabled"}`); } /** @@ -36,7 +36,7 @@ export class SettingsHelper extends GameManagerHelper { */ playerGender(gender: PlayerGender) { this.game.scene.gameData.gender = gender; - this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})` ); + this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})`); } /** @@ -45,7 +45,7 @@ export class SettingsHelper extends GameManagerHelper { */ expGainsSpeed(speed: ExpGainsSpeed) { this.game.scene.expGainsSpeed = speed; - this.log(`Exp Gains Speed set to: ${ExpGainsSpeed[speed]} (=${speed})` ); + this.log(`Exp Gains Speed set to: ${ExpGainsSpeed[speed]} (=${speed})`); } private log(...params: any[]) { diff --git a/test/testUtils/inputsHandler.ts b/test/testUtils/inputsHandler.ts index c526300a75a..6e9dd453541 100644 --- a/test/testUtils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -3,7 +3,7 @@ import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import type { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; import { holdOn } from "#test/testUtils/gameManagerUtils"; -import fs from "fs"; +import fs from "node:fs"; import { JSDOM } from "jsdom"; import Phaser from "phaser"; @@ -31,7 +31,7 @@ export default class InputsHandler { } pressTouch(button: string, duration: number): Promise { - return new Promise(async (resolve) => { + return new Promise(async resolve => { this.fakeMobile.touchDown(button); await holdOn(duration); this.fakeMobile.touchUp(button); @@ -40,7 +40,7 @@ export default class InputsHandler { } pressGamepadButton(button: number, duration: number): Promise { - return new Promise(async (resolve) => { + return new Promise(async resolve => { this.scene.input.gamepad?.emit("down", this.fakePad, { index: button }); await holdOn(duration); this.scene.input.gamepad?.emit("up", this.fakePad, { index: button }); @@ -49,7 +49,7 @@ export default class InputsHandler { } pressKeyboardKey(key: number, duration: number): Promise { - return new Promise(async (resolve) => { + return new Promise(async resolve => { this.scene.input.keyboard?.emit("keydown", { keyCode: key }); await holdOn(duration); this.scene.input.keyboard?.emit("keyup", { keyCode: key }); @@ -66,13 +66,21 @@ export default class InputsHandler { } listenInputs(): void { - this.events.on("input_down", (event) => { - this.log.push({ type: "input_down", button: event.button }); - }, this); + this.events.on( + "input_down", + event => { + this.log.push({ type: "input_down", button: event.button }); + }, + this, + ); - this.events.on("input_up", (event) => { - this.logUp.push({ type: "input_up", button: event.button }); - }, this); + this.events.on( + "input_up", + event => { + this.logUp.push({ type: "input_up", button: event.button }); + }, + this, + ); } } @@ -82,7 +90,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { constructor(pad) { //@ts-ignore - super(undefined, { ...pad, buttons: pad.deviceMapping, axes: []}); //TODO: resolve ts-ignore + super(undefined, { ...pad, buttons: pad.deviceMapping, axes: [] }); //TODO: resolve ts-ignore this.id = "xbox_360_fakepad"; this.index = 0; } diff --git a/test/testUtils/mocks/mockClock.ts b/test/testUtils/mocks/mockClock.ts index 7fad3651010..67f399ae41d 100644 --- a/test/testUtils/mocks/mockClock.ts +++ b/test/testUtils/mocks/mockClock.ts @@ -1,6 +1,5 @@ import Clock = Phaser.Time.Clock; - export class MockClock extends Clock { public overrideDelay: number | null = 1; constructor(scene) { diff --git a/test/testUtils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts index 9c3cbca6bb6..808b6ea4d4d 100644 --- a/test/testUtils/mocks/mockConsoleLog.ts +++ b/test/testUtils/mocks/mockConsoleLog.ts @@ -8,17 +8,17 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { const originalWarn = console.warn; const notified: any[] = []; - const blacklist = [ "Phaser", "variant icon does not exist", "Texture \"%s\" not found" ]; - const whitelist = [ "Phase" ]; + const blacklist = ["Phaser", "variant icon does not exist", 'Texture "%s" not found']; + const whitelist = ["Phase"]; - return ({ + return { log(...args) { const argsStr = this.getStr(args); logs.push(argsStr); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if ((phaseText && !whitelist.some((b) => argsStr.includes(b))) || blacklist.some((b) => argsStr.includes(b))) { + if ((phaseText && !whitelist.some(b => argsStr.includes(b))) || blacklist.some(b => argsStr.includes(b))) { return; } originalLog(args); @@ -31,10 +31,10 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { debug(...args) { const argsStr = this.getStr(args); logs.push(argsStr); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if (!whitelist.some((b) => argsStr.includes(b)) || blacklist.some((b) => argsStr.includes(b))) { + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { return; } originalDebug(args); @@ -42,10 +42,10 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { warn(...args) { const argsStr = this.getStr(args); logs.push(args); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if (!whitelist.some((b) => argsStr.includes(b)) || blacklist.some((b) => argsStr.includes(b))) { + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { return; } originalWarn(args); @@ -61,22 +61,22 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { logs = []; }, getStr(...args) { - return args.map(arg => { - if (typeof arg === "object" && arg !== null) { - // Handle objects including arrays - return JSON.stringify(arg, (key, value) => - typeof value === "bigint" ? value.toString() : value - ); - } else if (typeof arg === "bigint") { - // Handle BigInt values - return arg.toString(); - } else { + return args + .map(arg => { + if (typeof arg === "object" && arg !== null) { + // Handle objects including arrays + return JSON.stringify(arg, (_key, value) => (typeof value === "bigint" ? value.toString() : value)); + } + if (typeof arg === "bigint") { + // Handle BigInt values + return arg.toString(); + } // Handle all other types return arg.toString(); - } - }).join(";"); + }) + .join(";"); }, - }); + }; }; export default MockConsoleLog; diff --git a/test/testUtils/mocks/mockFetch.ts b/test/testUtils/mocks/mockFetch.ts index 2fa7cd198ce..195d4f65752 100644 --- a/test/testUtils/mocks/mockFetch.ts +++ b/test/testUtils/mocks/mockFetch.ts @@ -1,24 +1,25 @@ -export const MockFetch = (input, init) => { +export const MockFetch = (input, _init) => { const url = typeof input === "string" ? input : input.url; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let responseHandler; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let responseText; const handlers = { - "account/info": { "username":"greenlamp", "lastSessionSlot":0 }, + "account/info": { username: "greenlamp", lastSessionSlot: 0 }, "savedata/session": {}, "savedata/system": {}, "savedata/updateall": "", "daily/rankingpagecount": { data: 0 }, - "game/titlestats": { "playerCount":0, "battleCount":5 }, + "game/titlestats": { playerCount: 0, battleCount: 5 }, "daily/rankings": [], }; - for (const key of Object.keys(handlers)) { if (url.includes(key)) { - responseHandler = async() => handlers[key]; - responseText = async() => handlers[key] ? JSON.stringify(handlers[key]) : handlers[key]; + responseHandler = async () => handlers[key]; + responseText = async () => (handlers[key] ? JSON.stringify(handlers[key]) : handlers[key]); break; } } diff --git a/test/testUtils/mocks/mockLoader.ts b/test/testUtils/mocks/mockLoader.ts index 661eb72f2c2..7452f85a317 100644 --- a/test/testUtils/mocks/mockLoader.ts +++ b/test/testUtils/mocks/mockLoader.ts @@ -1,17 +1,16 @@ import CacheManager = Phaser.Cache.CacheManager; - export default class MockLoader { public cacheManager; constructor(scene) { this.cacheManager = new CacheManager(scene); } - once(event, callback) { + once(_event, callback) { callback(); } - setBaseURL(url) { + setBaseURL(_url) { return null; } @@ -19,24 +18,17 @@ export default class MockLoader { return null; } - spritesheet(key, url, frameConfig) { - } + spritesheet(_key, _url, _frameConfig) {} - audio(key, url) { - - } + audio(_key, _url) {} isLoading() { return false; } - start() { - } + start() {} - image() { + image() {} - } - - atlas(key, textureUrl, atlasUrl) { - } + atlas(_key, _textureUrl, _atlasUrl) {} } diff --git a/test/testUtils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts index bb4ea4e890d..235aa76f664 100644 --- a/test/testUtils/mocks/mockLocalStorage.ts +++ b/test/testUtils/mocks/mockLocalStorage.ts @@ -1,4 +1,4 @@ -const mockLocalStorage = (() => { +const mockLocalStorage = () => { let store = {} as Storage; return { @@ -22,6 +22,6 @@ const mockLocalStorage = (() => { store = {} as Storage; }, }; -}); +}; export default mockLocalStorage; diff --git a/test/testUtils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts index 44d33cf8910..fe249c5a5f7 100644 --- a/test/testUtils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -51,7 +51,7 @@ export default class MockTextureManager { return sprite; } - existing(obj) { + existing(_obj) { // const whitelist = ["ArenaBase", "PlayerPokemon", "EnemyPokemon"]; // const key = obj.constructor.name; // if (whitelist.includes(key) || obj.texture?.key?.includes("trainer_")) { @@ -74,7 +74,19 @@ export default class MockTextureManager { } nineslice(x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight) { - const nineSlice = new MockNineslice(this, x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight); + const nineSlice = new MockNineslice( + this, + x, + y, + texture, + frame, + width, + height, + leftWidth, + rightWidth, + topHeight, + bottomHeight, + ); this.list.push(nineSlice); return nineSlice; } diff --git a/test/testUtils/mocks/mockVideoGameObject.ts b/test/testUtils/mocks/mockVideoGameObject.ts index 74b05626616..65a5c37b244 100644 --- a/test/testUtils/mocks/mockVideoGameObject.ts +++ b/test/testUtils/mocks/mockVideoGameObject.ts @@ -4,8 +4,6 @@ import type { MockGameObject } from "./mockGameObject"; export class MockVideoGameObject implements MockGameObject { public name: string; - constructor() {} - public play = () => null; public stop = () => this; public setOrigin = () => null; diff --git a/test/testUtils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts index 6c03ff7460d..0a792c6fc79 100644 --- a/test/testUtils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -25,17 +25,15 @@ export default class MockContainer implements MockGameObject { this.visible = visible; } - once(event, callback, source) { - } + once(_event, _callback, _source) {} - off(event, callback, source) { - } + off(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy } - removeBetween(startIndex, endIndex, destroyChild) { + removeBetween(_startIndex, _endIndex, _destroyChild) { // Removes multiple children across an index range } @@ -43,7 +41,7 @@ export default class MockContainer implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setSize(width, height) { + setSize(_width, _height) { // Sets the size of this Game Object. } @@ -51,7 +49,7 @@ export default class MockContainer implements MockGameObject { /// Sets the mask that this Game Object will use to render with. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -66,11 +64,11 @@ export default class MockContainer implements MockGameObject { this.alpha = alpha; } - setFrame(frame, updateSize?: boolean, updateOrigin?: boolean) { + setFrame(_frame, _updateSize?: boolean, _updateOrigin?: boolean) { // Sets the frame this Game Object will use to render with. } - setScale(scale) { + setScale(_scale) { // Sets the scale of this Game Object. } @@ -91,59 +89,59 @@ export default class MockContainer implements MockGameObject { this.list = []; } - setShadow(shadowXpos, shadowYpos, shadowColor) { + setShadow(_shadowXpos, _shadowYpos, _shadowColor) { // Sets the shadow settings for this Game Object. } - setLineSpacing(lineSpacing) { + setLineSpacing(_lineSpacing) { // Sets the line spacing value of this Game Object. } - setText(text) { + setText(_text) { // Sets the text this Game Object will display. } - setAngle(angle) { + setAngle(_angle) { // Sets the angle of this Game Object. } - setShadowOffset(offsetX, offsetY) { + setShadowOffset(_offsetX, _offsetY) { // Sets the shadow offset values. } - setWordWrapWidth(width) { + setWordWrapWidth(_width) { // Sets the width (in pixels) to use for wrapping lines. } - setFontSize(fontSize) { + setFontSize(_fontSize) { // Sets the font size of this Game Object. } getBounds() { return { width: this.width, height: this.height }; } - setColor(color) { + setColor(_color) { // Sets the tint of this Game Object. } - setShadowColor(color) { + setShadowColor(_color) { // Sets the shadow color. } - setTint(color) { + setTint(_color) { // Sets the tint of this Game Object. } - setStrokeStyle(thickness, color) { + setStrokeStyle(_thickness, _color) { // Sets the stroke style for the graphics. return this; } - setDepth(depth) { + setDepth(_depth) { // Sets the depth of this Game Object. } - setTexture(texture) { + setTexture(_texture) { // Sets the texture this Game Object will use to render with. } @@ -155,15 +153,15 @@ export default class MockContainer implements MockGameObject { // Sends this Game Object to the back of its parent's display list. } - moveTo(obj) { + moveTo(_obj) { // Moves this Game Object to the given index in the list. } - moveAbove(obj) { + moveAbove(_obj) { // Moves this Game Object to be above the given Game Object in the display list. } - moveBelow(obj) { + moveBelow(_obj) { // Moves this Game Object to be below the given Game Object in the display list. } @@ -171,12 +169,11 @@ export default class MockContainer implements MockGameObject { this.name = name; } - bringToTop(obj) { + bringToTop(_obj) { // Brings this Game Object to the top of its parents display list. } - on(event, callback, source) { - } + on(_event, _callback, _source) {} add(obj) { // Adds a child to this Game Object. diff --git a/test/testUtils/mocks/mocksContainer/mockGraphics.ts b/test/testUtils/mocks/mocksContainer/mockGraphics.ts index 2b4a33b5e4c..ebf84e935e3 100644 --- a/test/testUtils/mocks/mocksContainer/mockGraphics.ts +++ b/test/testUtils/mocks/mocksContainer/mockGraphics.ts @@ -4,11 +4,11 @@ export default class MockGraphics implements MockGameObject { private scene; public list: MockGameObject[] = []; public name: string; - constructor(textureManager, config) { + constructor(textureManager, _config) { this.scene = textureManager.scene; } - fillStyle(color) { + fillStyle(_color) { // Sets the fill style to be used by the fill methods. } @@ -16,7 +16,7 @@ export default class MockGraphics implements MockGameObject { // Starts a new path by emptying the list of sub-paths. Call this method when you want to create a new path. } - fillRect(x, y, width, height) { + fillRect(_x, _y, _width, _height) { // Adds a rectangle shape to the path which is filled when you call fill(). } @@ -24,20 +24,15 @@ export default class MockGraphics implements MockGameObject { // Creates a geometry mask. } - setOrigin(x, y) { - } + setOrigin(_x, _y) {} - setAlpha(alpha) { - } + setAlpha(_alpha) {} - setVisible(visible) { - } + setVisible(_visible) {} - setName(name) { - } + setName(_name) {} - once(event, callback, source) { - } + once(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy @@ -47,7 +42,7 @@ export default class MockGraphics implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -55,12 +50,11 @@ export default class MockGraphics implements MockGameObject { this.list = []; } - setScale(scale) { + setScale(_scale) { // Sets the scale of this Game Object. } - off(event, callback, source) { - } + off(_event, _callback, _source) {} add(obj) { // Adds a child to this Game Object. diff --git a/test/testUtils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts index 3badde4f8ab..768fcfeb765 100644 --- a/test/testUtils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,6 +1,5 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; - export default class MockImage extends MockContainer { private texture; diff --git a/test/testUtils/mocks/mocksContainer/mockNineslice.ts b/test/testUtils/mocks/mocksContainer/mockNineslice.ts index 4f6b8a5d21d..90c0e13e725 100644 --- a/test/testUtils/mocks/mocksContainer/mockNineslice.ts +++ b/test/testUtils/mocks/mocksContainer/mockNineslice.ts @@ -1,6 +1,5 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; - export default class MockNineslice extends MockContainer { private texture; private leftWidth; @@ -8,7 +7,7 @@ export default class MockNineslice extends MockContainer { private topHeight; private bottomHeight; - constructor(textureManager, x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight) { + constructor(textureManager, x, y, texture, frame, _width, _height, leftWidth, rightWidth, topHeight, bottomHeight) { super(textureManager, x, y); this.texture = texture; this.frame = frame; diff --git a/test/testUtils/mocks/mocksContainer/mockPolygon.ts b/test/testUtils/mocks/mocksContainer/mockPolygon.ts index 43e9c5460d0..4a7f3baec78 100644 --- a/test/testUtils/mocks/mocksContainer/mockPolygon.ts +++ b/test/testUtils/mocks/mocksContainer/mockPolygon.ts @@ -1,9 +1,7 @@ import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; - export default class MockPolygon extends MockContainer { - constructor(textureManager, x, y, content, fillColor, fillAlpha) { + constructor(textureManager, x, y, _content, _fillColor, _fillAlpha) { super(textureManager, x, y); } } - diff --git a/test/testUtils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts index e4bca76b8fc..eec431d8ada 100644 --- a/test/testUtils/mocks/mocksContainer/mockRectangle.ts +++ b/test/testUtils/mocks/mocksContainer/mockRectangle.ts @@ -6,23 +6,18 @@ export default class MockRectangle implements MockGameObject { public list: MockGameObject[] = []; public name: string; - constructor(textureManager, x, y, width, height, fillColor) { + constructor(textureManager, _x, _y, _width, _height, fillColor) { this.fillColor = fillColor; this.scene = textureManager.scene; } - setOrigin(x, y) { - } + setOrigin(_x, _y) {} - setAlpha(alpha) { - } - setVisible(visible) { - } + setAlpha(_alpha) {} + setVisible(_visible) {} - setName(name) { - } + setName(_name) {} - once(event, callback, source) { - } + once(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy @@ -32,7 +27,7 @@ export default class MockRectangle implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -74,7 +69,7 @@ export default class MockRectangle implements MockGameObject { getAll() { return this.list; } - setScale(scale) { + setScale(_scale) { // return this.phaserText.setScale(scale); } } diff --git a/test/testUtils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts index 6d851330a5e..dcc3588f127 100644 --- a/test/testUtils/mocks/mocksContainer/mockSprite.ts +++ b/test/testUtils/mocks/mocksContainer/mockSprite.ts @@ -3,7 +3,6 @@ import type { MockGameObject } from "../mockGameObject"; import Sprite = Phaser.GameObjects.Sprite; import Frame = Phaser.Textures.Frame; - export default class MockSprite implements MockGameObject { private phaserSprite; public pipelineData; @@ -38,11 +37,11 @@ export default class MockSprite implements MockGameObject { }; } - setTexture(key: string, frame?: string | number) { + setTexture(_key: string, _frame?: string | number) { return this; } - setSizeToFrame(frame?: boolean | Frame): Sprite { + setSizeToFrame(_frame?: boolean | Frame): Sprite { return {} as Sprite; } @@ -51,8 +50,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setPipeline(obj); } - off(event, callback, source) { - } + off(_event, _callback, _source) {} setTintFill(color) { // Sets the tint fill color. @@ -117,7 +115,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setTint(color); } - setFrame(frame, updateSize?: boolean, updateOrigin?: boolean) { + setFrame(frame, _updateSize?: boolean, _updateOrigin?: boolean) { // Sets the frame this Game Object will use to render with. this.frame = frame; return frame; @@ -172,9 +170,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setAngle(angle); } - setMask() { - - } + setMask() {} add(obj) { // Adds a child to this Game Object. @@ -210,6 +206,4 @@ export default class MockSprite implements MockGameObject { getAll() { return this.list; } - - } diff --git a/test/testUtils/mocks/mocksContainer/mockText.ts b/test/testUtils/mocks/mocksContainer/mockText.ts index 5550e801386..552f8ff3ff8 100644 --- a/test/testUtils/mocks/mocksContainer/mockText.ts +++ b/test/testUtils/mocks/mocksContainer/mockText.ts @@ -13,7 +13,7 @@ export default class MockText implements MockGameObject { public name: string; public color?: string; - constructor(textureManager, x, y, content, styleOptions) { + constructor(textureManager, _x, _y, _content, _styleOptions) { this.scene = textureManager.scene; this.textureManager = textureManager; this.style = {}; @@ -85,7 +85,7 @@ export default class MockText implements MockGameObject { callback?: Function | null, callbackDelay?: number | null, prompt?: boolean | null, - promptDelay?: number | null + promptDelay?: number | null, ) { this.scene.messageWrapper.showText(text, delay, callback, callbackDelay, prompt, promptDelay); if (callback) { @@ -93,42 +93,49 @@ export default class MockText implements MockGameObject { } } - showDialogue(keyOrText: string, name: string | undefined, delay: number | null = 0, callback: Function, callbackDelay?: number, promptDelay?: number) { + showDialogue( + keyOrText: string, + name: string | undefined, + delay: number | null = 0, + callback: Function, + callbackDelay?: number, + promptDelay?: number, + ) { this.scene.messageWrapper.showDialogue(keyOrText, name, delay, callback, callbackDelay, promptDelay); if (callback) { callback(); } } - setScale(scale) { + setScale(_scale) { // return this.phaserText.setScale(scale); } - setShadow(shadowXpos, shadowYpos, shadowColor) { + setShadow(_shadowXpos, _shadowYpos, _shadowColor) { // Sets the shadow settings for this Game Object. // return this.phaserText.setShadow(shadowXpos, shadowYpos, shadowColor); } - setLineSpacing(lineSpacing) { + setLineSpacing(_lineSpacing) { // Sets the line spacing value of this Game Object. // return this.phaserText.setLineSpacing(lineSpacing); } - setOrigin(x, y) { + setOrigin(_x, _y) { // return this.phaserText.setOrigin(x, y); } - once(event, callback, source) { + once(_event, _callback, _source) { // return this.phaserText.once(event, callback, source); } - off(event, callback, obj) {} + off(_event, _callback, _obj) {} removedFromScene() {} addToDisplayList() {} - setStroke(color, thickness) { + setStroke(_color, _thickness) { // Sets the stroke color and thickness. // return this.phaserText.setStroke(color, thickness); } @@ -143,15 +150,15 @@ export default class MockText implements MockGameObject { // return this.phaserText.addedToScene(); } - setVisible(visible) { + setVisible(_visible) { // return this.phaserText.setVisible(visible); } - setY(y) { + setY(_y) { // return this.phaserText.setY(y); } - setX(x) { + setX(_x) { // return this.phaserText.setX(x); } @@ -162,7 +169,7 @@ export default class MockText implements MockGameObject { * @param z The z position of this Game Object. Default 0. * @param w The w position of this Game Object. Default 0. */ - setPosition(x?: number, y?: number, z?: number, w?: number) {} + setPosition(_x?: number, _y?: number, _z?: number, _w?: number) {} setText(text) { // Sets the text this Game Object will display. @@ -170,17 +177,17 @@ export default class MockText implements MockGameObject { this.text = text; } - setAngle(angle) { + setAngle(_angle) { // Sets the angle of this Game Object. // return this.phaserText.setAngle(angle); } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. // return this.phaserText.setPositionRelative(source, x, y); } - setShadowOffset(offsetX, offsetY) { + setShadowOffset(_offsetX, _offsetY) { // Sets the shadow offset values. // return this.phaserText.setShadowOffset(offsetX, offsetY); } @@ -190,7 +197,7 @@ export default class MockText implements MockGameObject { this.wordWrapWidth = width; } - setFontSize(fontSize) { + setFontSize(_fontSize) { // Sets the font size of this Game Object. // return this.phaserText.setFontSize(fontSize); } @@ -208,17 +215,17 @@ export default class MockText implements MockGameObject { setInteractive = () => null; - setShadowColor(color) { + setShadowColor(_color) { // Sets the shadow color. // return this.phaserText.setShadowColor(color); } - setTint(color) { + setTint(_color) { // Sets the tint of this Game Object. // return this.phaserText.setTint(color); } - setStrokeStyle(thickness, color) { + setStrokeStyle(_thickness, _color) { // Sets the stroke style for the graphics. // return this.phaserText.setStrokeStyle(thickness, color); } @@ -228,7 +235,7 @@ export default class MockText implements MockGameObject { this.list = []; } - setAlpha(alpha) { + setAlpha(_alpha) { // return this.phaserText.setAlpha(alpha); } @@ -236,7 +243,7 @@ export default class MockText implements MockGameObject { this.name = name; } - setAlign(align) { + setAlign(_align) { // return this.phaserText.setAlign(align); } diff --git a/test/testUtils/mocks/mocksContainer/mockTexture.ts b/test/testUtils/mocks/mocksContainer/mockTexture.ts index a9186783d46..eb8b70902fa 100644 --- a/test/testUtils/mocks/mocksContainer/mockTexture.ts +++ b/test/testUtils/mocks/mocksContainer/mockTexture.ts @@ -1,7 +1,6 @@ import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; - /** * Stub for Phaser.Textures.Texture object * Just mocks the function calls and data required for use in tests @@ -23,7 +22,7 @@ export default class MockTexture implements MockGameObject { width: 100, height: 100, cutX: 0, - cutY: 0 + cutY: 0, }; this.frames = { firstFrame: mockFrame, @@ -31,7 +30,7 @@ export default class MockTexture implements MockGameObject { 1: mockFrame, 2: mockFrame, 3: mockFrame, - 4: mockFrame + 4: mockFrame, }; this.firstFrame = "firstFrame"; } diff --git a/test/testUtils/phaseInterceptor.ts b/test/testUtils/phaseInterceptor.ts index fe0fbf82e29..742a6bc8441 100644 --- a/test/testUtils/phaseInterceptor.ts +++ b/test/testUtils/phaseInterceptor.ts @@ -50,7 +50,7 @@ import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase, - PostMysteryEncounterPhase + PostMysteryEncounterPhase, } from "#app/phases/mystery-encounter-phases"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; @@ -215,68 +215,73 @@ export default class PhaseInterceptor { * `initPhases()` so that its subclasses can use `super.start()` properly. */ private PHASES = [ - [ LoginPhase, this.startPhase ], - [ TitlePhase, this.startPhase ], - [ SelectGenderPhase, this.startPhase ], - [ NewBiomeEncounterPhase, this.startPhase ], - [ SelectStarterPhase, this.startPhase ], - [ PostSummonPhase, this.startPhase ], - [ SummonPhase, this.startPhase ], - [ ToggleDoublePositionPhase, this.startPhase ], - [ CheckSwitchPhase, this.startPhase ], - [ ShowAbilityPhase, this.startPhase ], - [ MessagePhase, this.startPhase ], - [ TurnInitPhase, this.startPhase ], - [ CommandPhase, this.startPhase ], - [ EnemyCommandPhase, this.startPhase ], - [ TurnStartPhase, this.startPhase ], - [ MovePhase, this.startPhase ], - [ MoveEffectPhase, this.startPhase ], - [ DamageAnimPhase, this.startPhase ], - [ FaintPhase, this.startPhase ], - [ BerryPhase, this.startPhase ], - [ TurnEndPhase, this.startPhase ], - [ BattleEndPhase, this.startPhase ], - [ EggLapsePhase, this.startPhase ], - [ SelectModifierPhase, this.startPhase ], - [ NextEncounterPhase, this.startPhase ], - [ NewBattlePhase, this.startPhase ], - [ VictoryPhase, this.startPhase ], - [ LearnMovePhase, this.startPhase ], - [ MoveEndPhase, this.startPhase ], - [ StatStageChangePhase, this.startPhase ], - [ ShinySparklePhase, this.startPhase ], - [ SelectTargetPhase, this.startPhase ], - [ UnavailablePhase, this.startPhase ], - [ QuietFormChangePhase, this.startPhase ], - [ SwitchPhase, this.startPhase ], - [ SwitchSummonPhase, this.startPhase ], - [ PartyHealPhase, this.startPhase ], - [ FormChangePhase, this.startPhase ], - [ EvolutionPhase, this.startPhase ], - [ EndEvolutionPhase, this.startPhase ], - [ LevelCapPhase, this.startPhase ], - [ AttemptRunPhase, this.startPhase ], - [ SelectBiomePhase, this.startPhase ], - [ MysteryEncounterPhase, this.startPhase ], - [ MysteryEncounterOptionSelectedPhase, this.startPhase ], - [ MysteryEncounterBattlePhase, this.startPhase ], - [ MysteryEncounterRewardsPhase, this.startPhase ], - [ PostMysteryEncounterPhase, this.startPhase ], - [ RibbonModifierRewardPhase, this.startPhase ], - [ GameOverModifierRewardPhase, this.startPhase ], - [ ModifierRewardPhase, this.startPhase ], - [ PartyExpPhase, this.startPhase ], - [ ExpPhase, this.startPhase ], - [ EncounterPhase, this.startPhase ], - [ GameOverPhase, this.startPhase ], - [ UnlockPhase, this.startPhase ], - [ PostGameOverPhase, this.startPhase ], - [ RevivalBlessingPhase, this.startPhase ], + [LoginPhase, this.startPhase], + [TitlePhase, this.startPhase], + [SelectGenderPhase, this.startPhase], + [NewBiomeEncounterPhase, this.startPhase], + [SelectStarterPhase, this.startPhase], + [PostSummonPhase, this.startPhase], + [SummonPhase, this.startPhase], + [ToggleDoublePositionPhase, this.startPhase], + [CheckSwitchPhase, this.startPhase], + [ShowAbilityPhase, this.startPhase], + [MessagePhase, this.startPhase], + [TurnInitPhase, this.startPhase], + [CommandPhase, this.startPhase], + [EnemyCommandPhase, this.startPhase], + [TurnStartPhase, this.startPhase], + [MovePhase, this.startPhase], + [MoveEffectPhase, this.startPhase], + [DamageAnimPhase, this.startPhase], + [FaintPhase, this.startPhase], + [BerryPhase, this.startPhase], + [TurnEndPhase, this.startPhase], + [BattleEndPhase, this.startPhase], + [EggLapsePhase, this.startPhase], + [SelectModifierPhase, this.startPhase], + [NextEncounterPhase, this.startPhase], + [NewBattlePhase, this.startPhase], + [VictoryPhase, this.startPhase], + [LearnMovePhase, this.startPhase], + [MoveEndPhase, this.startPhase], + [StatStageChangePhase, this.startPhase], + [ShinySparklePhase, this.startPhase], + [SelectTargetPhase, this.startPhase], + [UnavailablePhase, this.startPhase], + [QuietFormChangePhase, this.startPhase], + [SwitchPhase, this.startPhase], + [SwitchSummonPhase, this.startPhase], + [PartyHealPhase, this.startPhase], + [FormChangePhase, this.startPhase], + [EvolutionPhase, this.startPhase], + [EndEvolutionPhase, this.startPhase], + [LevelCapPhase, this.startPhase], + [AttemptRunPhase, this.startPhase], + [SelectBiomePhase, this.startPhase], + [MysteryEncounterPhase, this.startPhase], + [MysteryEncounterOptionSelectedPhase, this.startPhase], + [MysteryEncounterBattlePhase, this.startPhase], + [MysteryEncounterRewardsPhase, this.startPhase], + [PostMysteryEncounterPhase, this.startPhase], + [RibbonModifierRewardPhase, this.startPhase], + [GameOverModifierRewardPhase, this.startPhase], + [ModifierRewardPhase, this.startPhase], + [PartyExpPhase, this.startPhase], + [ExpPhase, this.startPhase], + [EncounterPhase, this.startPhase], + [GameOverPhase, this.startPhase], + [UnlockPhase, this.startPhase], + [PostGameOverPhase, this.startPhase], + [RevivalBlessingPhase, this.startPhase], ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase, MysteryEncounterPhase, PostMysteryEncounterPhase + TitlePhase, + SelectGenderPhase, + CommandPhase, + SelectModifierPhase, + MysteryEncounterPhase, + PostMysteryEncounterPhase, ]; /** @@ -324,29 +329,29 @@ export default class PhaseInterceptor { * @param runTarget - Whether or not to run the target phase. * @returns A promise that resolves when the transition is complete. */ - async to(phaseTo: PhaseInterceptorPhase, runTarget: boolean = true): Promise { + async to(phaseTo: PhaseInterceptorPhase, runTarget = true): Promise { return new Promise(async (resolve, reject) => { ErrorInterceptor.getInstance().add(this); if (this.phaseFrom) { - await this.run(this.phaseFrom).catch((e) => reject(e)); + await this.run(this.phaseFrom).catch(e => reject(e)); this.phaseFrom = null; } const targetName = typeof phaseTo === "string" ? phaseTo : phaseTo.name; - this.intervalRun = setInterval(async() => { + this.intervalRun = setInterval(async () => { const currentPhase = this.onHold?.length && this.onHold[0]; if (currentPhase && currentPhase.name === targetName) { clearInterval(this.intervalRun); if (!runTarget) { return resolve(); } - await this.run(currentPhase).catch((e) => { + await this.run(currentPhase).catch(e => { clearInterval(this.intervalRun); return reject(e); }); return resolve(); } if (currentPhase && currentPhase.name !== targetName) { - await this.run(currentPhase).catch((e) => { + await this.run(currentPhase).catch(e => { clearInterval(this.intervalRun); return reject(e); }); @@ -371,7 +376,7 @@ export default class PhaseInterceptor { if (currentPhase) { if (currentPhase.name !== targetName) { clearInterval(interval); - const skip = skipFn && skipFn(currentPhase.name); + const skip = skipFn?.(currentPhase.name); if (skip) { this.onHold.unshift(currentPhase); ErrorInterceptor.getInstance().remove(this); @@ -387,7 +392,7 @@ export default class PhaseInterceptor { ErrorInterceptor.getInstance().remove(this); resolve(); }, - onError: (error) => reject(error), + onError: error => reject(error), }; currentPhase.call(); } @@ -395,10 +400,10 @@ export default class PhaseInterceptor { }); } - whenAboutToRun(phaseTarget: PhaseInterceptorPhase, skipFn?: (className: PhaseClass) => boolean): Promise { + whenAboutToRun(phaseTarget: PhaseInterceptorPhase, _skipFn?: (className: PhaseClass) => boolean): Promise { const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name; this.scene.moveAnimations = null; // Mandatory to avoid crash - return new Promise(async (resolve, reject) => { + return new Promise(async (resolve, _reject) => { ErrorInterceptor.getInstance().add(this); const interval = setInterval(async () => { const currentPhase = this.onHold[0]; @@ -424,7 +429,7 @@ export default class PhaseInterceptor { * * @param shouldRun Whether or not the current scene should also be run. */ - shift(shouldRun: boolean = false) : void { + shift(shouldRun = false): void { this.onHold.shift(); if (shouldRun) { this.scene.shiftPhase(); @@ -439,11 +444,11 @@ export default class PhaseInterceptor { this.originalSuperEnd = Phase.prototype.end; UI.prototype.setMode = (mode, ...args) => this.setMode.call(this, mode, ...args); Phase.prototype.end = () => this.superEndPhase.call(this); - for (const [ phase, methodStart ] of this.PHASES) { + for (const [phase, methodStart] of this.PHASES) { const originalStart = phase.prototype.start; this.phases[phase.name] = { start: originalStart, - endBySetMode: this.endBySetMode.some((elm) => elm.name === phase.name), + endBySetMode: this.endBySetMode.some(elm => elm.name === phase.name), }; phase.prototype.start = () => methodStart.call(this, phase); } @@ -460,7 +465,7 @@ export default class PhaseInterceptor { name: phase.name, call: () => { this.phases[phase.name].start.apply(instance); - } + }, }); } @@ -489,10 +494,11 @@ export default class PhaseInterceptor { const currentPhase = this.scene.getCurrentPhase(); const instance = this.scene.ui; console.log("setMode", `${Mode[mode]} (=${mode})`, args); - const ret = this.originalSetMode.apply(instance, [ mode, ...args ]); + const ret = this.originalSetMode.apply(instance, [mode, ...args]); if (!this.phases[currentPhase.constructor.name]) { - throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptor PHASES list --- Add it to PHASES inside of /test/utils/phaseInterceptor.ts`); - + throw new Error( + `missing ${currentPhase.constructor.name} in phaseInterceptor PHASES list --- Add it to PHASES inside of /test/utils/phaseInterceptor.ts`, + ); } if (this.phases[currentPhase.constructor.name].endBySetMode) { this.inProgress?.callback(); @@ -508,7 +514,7 @@ export default class PhaseInterceptor { this.promptInterval = setInterval(() => { if (this.prompts.length) { const actionForNextPrompt = this.prompts[0]; - const expireFn = actionForNextPrompt.expireFn && actionForNextPrompt.expireFn(); + const expireFn = actionForNextPrompt.expireFn?.(); const currentMode = this.scene.ui.getMode(); const currentPhase = this.scene.getCurrentPhase()?.constructor.name; const currentHandler = this.scene.ui.getHandler(); @@ -538,13 +544,19 @@ export default class PhaseInterceptor { * @param expireFn - The function to determine if the prompt has expired. * @param awaitingActionInput */ - addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { + addToNextPrompt( + phaseTarget: string, + mode: Mode, + callback: () => void, + expireFn?: () => void, + awaitingActionInput = false, + ) { this.prompts.push({ phaseTarget, mode, callback, expireFn, - awaitingActionInput + awaitingActionInput, }); } @@ -555,7 +567,7 @@ export default class PhaseInterceptor { * function stored in `this.phases`. Additionally, it clears the `promptInterval` and `interval`. */ restoreOg() { - for (const [ phase ] of this.PHASES) { + for (const [phase] of this.PHASES) { phase.prototype.start = this.phases[phase.name].start; } UI.prototype.setMode = this.originalSetMode; diff --git a/test/ui/battle_info.test.ts b/test/ui/battle_info.test.ts index 6209312c451..4c6274d5efb 100644 --- a/test/ui/battle_info.test.ts +++ b/test/ui/battle_info.test.ts @@ -7,6 +7,7 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +// biome-ignore lint/correctness/noEmptyPattern: TODO: Examine why this is here vi.mock("../data/exp", ({}) => { return { getLevelRelExp: vi.fn(() => 1), //consistent levelRelExp @@ -30,26 +31,26 @@ describe("UI - Battle Info", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.GUILLOTINE, Moves.SPLASH ]) + .moveset([Moves.GUILLOTINE, Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.CATERPIE); }); - it.each([ ExpGainsSpeed.FAST, ExpGainsSpeed.FASTER, ExpGainsSpeed.SKIP ])( + it.each([ExpGainsSpeed.FAST, ExpGainsSpeed.FASTER, ExpGainsSpeed.SKIP])( "should increase exp gains animation by 2^%i", - async (expGainsSpeed) => { + async expGainsSpeed => { game.settings.expGainsSpeed(expGainsSpeed); vi.spyOn(Math, "pow"); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(ExpPhase, true); expect(Math.pow).not.toHaveBeenCalledWith(2, expGainsSpeed); - } + }, ); }); diff --git a/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts index 685debf098d..1d523c3bbd5 100644 --- a/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -18,7 +18,6 @@ import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("UI - Starter select", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,9 +36,9 @@ describe("UI - Starter select", () => { game = new GameManager(phaserGame); }); - it("Bulbasaur - shiny - variant 2 male", async() => { + it("Bulbasaur - shiny - variant 2 male", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -60,7 +59,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -74,7 +73,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -97,9 +96,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].gender).toBe(Gender.MALE); }, 20000); - it("Bulbasaur - shiny - variant 2 female hardy overgrow", async() => { + it("Bulbasaur - shiny - variant 2 female hardy overgrow", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -121,7 +120,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -135,7 +134,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -159,9 +158,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].getAbility().id).toBe(Abilities.OVERGROW); }, 20000); - it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => { + it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -185,7 +184,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -199,7 +198,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -224,9 +223,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].getAbility().id).toBe(Abilities.CHLOROPHYLL); }, 20000); - it("Bulbasaur - shiny - variant 2 female", async() => { + it("Bulbasaur - shiny - variant 2 female", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -248,7 +247,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -262,7 +261,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -285,9 +284,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].gender).toBe(Gender.FEMALE); }, 20000); - it("Bulbasaur - not shiny", async() => { + it("Bulbasaur - not shiny", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -309,7 +308,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -323,7 +322,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -345,9 +344,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].variant).toBe(0); }, 20000); - it("Bulbasaur - shiny - variant 1", async() => { + it("Bulbasaur - shiny - variant 1", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -371,7 +370,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -385,7 +384,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -407,9 +406,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].variant).toBe(1); }, 20000); - it("Bulbasaur - shiny - variant 0", async() => { + it("Bulbasaur - shiny - variant 0", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -432,7 +431,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -446,7 +445,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -468,9 +467,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].variant).toBe(0); }, 20000); - it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => { + it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -492,7 +491,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -507,7 +506,7 @@ describe("UI - Starter select", () => { optionSelectUiHandler?.processInput(Button.ACTION); let starterSelectUiHandler: StarterSelectUiHandler; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { starterSelectUiHandler = game.scene.ui.getHandler() as StarterSelectUiHandler; starterSelectUiHandler.processInput(Button.SUBMIT); @@ -532,9 +531,9 @@ describe("UI - Starter select", () => { expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.CATERPIE); }, 20000); - it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async() => { + it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async () => { await game.importData("./test/testUtils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -557,7 +556,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -572,7 +571,7 @@ describe("UI - Starter select", () => { optionSelectUiHandler?.processInput(Button.ACTION); let starterSelectUiHandler: StarterSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { starterSelectUiHandler = game.scene.ui.getHandler() as StarterSelectUiHandler; starterSelectUiHandler.processInput(Button.SUBMIT); diff --git a/test/ui/transfer-item.test.ts b/test/ui/transfer-item.test.ts index 83c2eb2ef79..476f0744436 100644 --- a/test/ui/transfer-item.test.ts +++ b/test/ui/transfer-item.test.ts @@ -34,11 +34,11 @@ describe("UI - Transfer Items", () => { { name: "BERRY", count: 2, type: BerryType.APICOT }, { name: "BERRY", count: 2, type: BerryType.LUM }, ]); - game.override.moveset([ Moves.DRAGON_CLAW ]); + game.override.moveset([Moves.DRAGON_CLAW]); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); - await game.classicMode.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); + await game.classicMode.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); game.move.select(Moves.DRAGON_CLAW); @@ -62,9 +62,15 @@ describe("UI - Transfer Items", () => { const handler = game.scene.ui.getHandler() as PartyUiHandler; handler.processInput(Button.ACTION); - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Sitrus Berry"))).toBe(true); - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Apicot Berry (2)"))).toBe(true); - expect(handler.optionsContainer.list.some((option) => RegExp(/Lum Berry\[color.*(2)/).exec((option as BBCodeText).text))).toBe(true); + expect(handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Sitrus Berry"))).toBe( + true, + ); + expect( + handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Apicot Berry (2)")), + ).toBe(true); + expect( + handler.optionsContainer.list.some(option => RegExp(/Lum Berry\[color.*(2)/).exec((option as BBCodeText).text)), + ).toBe(true); game.phaseInterceptor.unlock(); }); @@ -83,7 +89,9 @@ describe("UI - Transfer Items", () => { handler.setCursor(1); // move to other Pokemon handler.processInput(Button.ACTION); // select Pokemon - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Transfer"))).toBe(true); + expect(handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Transfer"))).toBe( + true, + ); game.phaseInterceptor.unlock(); }); diff --git a/test/ui/type-hints.test.ts b/test/ui/type-hints.test.ts index 0838ab01f51..fa7532fb674 100644 --- a/test/ui/type-hints.test.ts +++ b/test/ui/type-hints.test.ts @@ -37,10 +37,10 @@ describe("UI - Type Hints", () => { .startingWave(1) .enemySpecies(Species.FLORGES) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.DRAGON_CLAW ]); + .moveset([Moves.DRAGON_CLAW]); game.settings.typeHints(true); //activate type hints - await game.startBattle([ Species.RAYQUAZA ]); + await game.startBattle([Species.RAYQUAZA]); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { const { ui } = game.scene; @@ -54,7 +54,7 @@ describe("UI - Type Hints", () => { const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); const dragonClawText = movesContainer .getAll() - .find((text) => text.text === i18next.t("move:dragonClaw.name"))! as unknown as MockText; + .find(text => text.text === i18next.t("move:dragonClaw.name"))! as unknown as MockText; expect.soft(dragonClawText.color).toBe("#929292"); ui.getHandler().processInput(Button.ACTION); @@ -63,9 +63,9 @@ describe("UI - Type Hints", () => { }); it("check status move color", async () => { - game.override.enemySpecies(Species.FLORGES).moveset([ Moves.GROWL ]); + game.override.enemySpecies(Species.FLORGES).moveset([Moves.GROWL]); - await game.startBattle([ Species.RAYQUAZA ]); + await game.startBattle([Species.RAYQUAZA]); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { const { ui } = game.scene; @@ -79,7 +79,7 @@ describe("UI - Type Hints", () => { const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); const growlText = movesContainer .getAll() - .find((text) => text.text === i18next.t("move:growl.name"))! as unknown as MockText; + .find(text => text.text === i18next.t("move:growl.name"))! as unknown as MockText; expect.soft(growlText.color).toBe(undefined); ui.getHandler().processInput(Button.ACTION); diff --git a/test/vitest.setup.ts b/test/vitest.setup.ts index 5dc5a69ce73..44175049042 100644 --- a/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -18,14 +18,14 @@ import { afterAll, beforeAll, vi } from "vitest"; process.env.TZ = "UTC"; /** Mock the override import to always return default values, ignoring any custom overrides. */ -vi.mock("#app/overrides", async (importOriginal) => { +vi.mock("#app/overrides", async importOriginal => { // eslint-disable-next-line @typescript-eslint/consistent-type-imports const { defaultOverrides } = await importOriginal(); return { default: defaultOverrides, defaultOverrides, - // eslint-disable-next-line @typescript-eslint/consistent-type-imports + // eslint-disable-next-line @typescript-eslint/consistent-type-imports } satisfies typeof import("#app/overrides"); }); @@ -35,13 +35,13 @@ vi.mock("#app/overrides", async (importOriginal) => { * This is necessary because how our code is structured. * Do NOT try to put any of this code into external functions, it won't work as it's elevated during runtime. */ -vi.mock("i18next", async (importOriginal) => { +vi.mock("i18next", async importOriginal => { console.log("Mocking i18next"); const { setupServer } = await import("msw/node"); const { http, HttpResponse } = await import("msw"); global.server = setupServer( - http.get("/locales/en/*", async (req) => { + http.get("/locales/en/*", async req => { const filename = req.params[0]; try { diff --git a/tsconfig.json b/tsconfig.json index 6bb0ae51c1b..30e208745b9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,34 +1,28 @@ { - "compilerOptions": { - "target": "ES2020", - "module": "ES2020", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "esModuleInterop": true, - "strictNullChecks": true, - "sourceMap": false, - "strict": false, - "rootDir": ".", - "baseUrl": "./src", - "paths": { - "#enums/*": ["./enums/*.ts"], - "#app/*": ["*.ts"], - "#test/*": ["../test/*.ts"] - }, - "outDir": "./build", - "noEmit": true - }, - "typedocOptions": { - "entryPoints": ["./src"], - "entryPointStrategy": "expand", - "exclude": "**/*+.test.ts", - "out": "typedoc" - }, - "exclude": [ - "node_modules", - "dist", - "vite.config.ts", - "vitest.config.ts", - "vitest.workspace.ts", - ] + "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "esModuleInterop": true, + "strictNullChecks": true, + "sourceMap": false, + "strict": false, + "rootDir": ".", + "baseUrl": "./src", + "paths": { + "#enums/*": ["./enums/*.ts"], + "#app/*": ["*.ts"], + "#test/*": ["../test/*.ts"] + }, + "outDir": "./build", + "noEmit": true + }, + "typedocOptions": { + "entryPoints": ["./src"], + "entryPointStrategy": "expand", + "exclude": "**/*+.test.ts", + "out": "typedoc" + }, + "exclude": ["node_modules", "dist", "vite.config.ts", "vitest.config.ts", "vitest.workspace.ts"] } diff --git a/vite.config.ts b/vite.config.ts index 946315c4b7b..4b6ad687a0a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,43 +1,39 @@ -import { defineConfig, loadEnv, Rollup, UserConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig, loadEnv, type Rollup, type UserConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; import { minifyJsonPlugin } from "./src/plugins/vite/vite-minify-json-plugin"; -export const defaultConfig: UserConfig = { - plugins: [ - tsconfigPaths(), - minifyJsonPlugin(["images", "battle-anims"], true) - ], - clearScreen: false, - appType: "mpa", - build: { - chunkSizeWarningLimit: 10000, - minify: 'esbuild', - sourcemap: false, - rollupOptions: { - onwarn(warning: Rollup.RollupLog, defaultHandler: (warning: string | Rollup.RollupLog) => void) { - // Suppress "Module level directives cause errors when bundled" warnings - if (warning.code === "MODULE_LEVEL_DIRECTIVE") { - return; - } - defaultHandler(warning); - }, - }, - }, +export const defaultConfig: UserConfig = { + plugins: [tsconfigPaths(), minifyJsonPlugin(["images", "battle-anims"], true)], + clearScreen: false, + appType: "mpa", + build: { + chunkSizeWarningLimit: 10000, + minify: "esbuild", + sourcemap: false, + rollupOptions: { + onwarn(warning: Rollup.RollupLog, defaultHandler: (warning: string | Rollup.RollupLog) => void) { + // Suppress "Module level directives cause errors when bundled" warnings + if (warning.code === "MODULE_LEVEL_DIRECTIVE") { + return; + } + defaultHandler(warning); + }, + }, + }, }; +export default defineConfig(({ mode }) => { + const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); -export default defineConfig(({mode}) => { - const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); - - return ({ - ...defaultConfig, - base: '', - esbuild: { - pure: mode === 'production' ? ['console.log'] : [], - keepNames: true, - }, - server: { - port: !isNaN(envPort) ? envPort : 8000, - } - }); + return { + ...defaultConfig, + base: "", + esbuild: { + pure: mode === "production" ? ["console.log"] : [], + keepNames: true, + }, + server: { + port: !Number.isNaN(envPort) ? envPort : 8000, + }, + }; }); From 7f226df8d6d7aecf85605392164bad52e384166d Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 9 Mar 2025 17:15:24 -0500 Subject: [PATCH 160/171] [GitHub] Automatically add issue-type in issue templates (#5499) --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index eb270dc8f80..81d8427b5db 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,7 @@ name: Bug Report description: Create a report to help us improve title: "[Bug] " +type: bug labels: ["Bug", "Triage"] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 29a79b38158..08d720aea7b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,7 @@ name: Feature Request description: Suggest an idea for this project title: "[Feature] " +type: 'feature' labels: ["Enhancement", "Triage"] body: - type: markdown From 572556b7b9f89fce606abeabc04088886373dcac Mon Sep 17 00:00:00 2001 From: MascaChapas27 <127435083+MascaChapas27@users.noreply.github.com> Date: Mon, 10 Mar 2025 12:59:19 +0100 Subject: [PATCH 161/171] [UI/UX] Changed wrong colors in german type icons (#5494) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ángel Co-authored-by: damocleas --- public/images/types_de.png | Bin 2409 -> 2624 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 public/images/types_de.png diff --git a/public/images/types_de.png b/public/images/types_de.png old mode 100644 new mode 100755 index 62ad3a332bc9855661b829836f686d8e1a7442c4..a033554029cda867d0e68f5056f7b0eaf4d83bbc GIT binary patch delta 2161 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 DW!1hX delta 1944 zcmV;J2WR-e6zLL>ngdrY9+8?Mk-oYF2rAwMlY9Yvf5QL(4#NS*Z>VGd00&M7>q$t6vaWEj7}opBM}5an2DOi{{Md=dskII&gFKK zS=n^&uCD&N>YRJlLZWnq<5OLobPmGTQ>Q|hs4Xc2VPYcSFPUct07fy-R=@<)#XMU- z1CMHRe^r1ci@63B2Ii_OFkQ@50pleVJWdl5@md{4iKn}Ya(c3>)8fJ8WSHVOCI$3t zYHD(7DnQv3FTmul!ql(HO(j#p0jr^_@};8z3^k*Li)BD7gx_$*qa;(p0j;j4TeBL# zNQN!T4*-3`WZbHlcAzIA)zOqhFW3;i=9#Xdf1LTMt25$3QyB=;7|AM)06hNx07E>b z`o#bl0st+a0p8^qi?GZw;H&BBX-qCIOBbLa89dQ(O-uBG4dH8^?JCOIue&-c9yBFi z}R;BGqjd(04+nZah%2+TkV=%z9v7Fi43cppz XO>F{rLq17j_}MU_V7wACJh ze@8+k9eGV#hA00}+NiA=iC(KAe9d!RMLGA|uFi=EO&P#fo(;1(;{PW-$iOUQfJS40 zq49ql^H6Rv>t`DAAD|x8Em8$W$19As0KrmFZh>bnrvG$nfRA2@|7E!rpd(SNtyzg$ zv?+Ye^Ib(b|GTcviw8{=fWN?nVxFyme+y7C&klfrB@J3!s4QvNqOzo4(n8NzUd@s< zpk?{|CQH^pLsIt}qYDzfWJCCx7rTmb@%LR_6c3tGAY9Vn%O(5_+|g?wT*A<_MVFug z^K)0|3yp2WeHE=gp`f41;7 zFLxE?@;6;w77v6v*2Qpky)vzE$FX zY@rzzox`l&CjqEPV`ZO|r4{H&NOg2Yq8DrkU-N2LQLg@>tE=KcQx5Re=fgasc^w*4 z37CfpfNdf&P?^>mt-zW!kb6`ue+IzGEyepL?dqC%(3ArqEMUSp({6z$284wLoGnlq`lx|#aYqxpj9uDhAXV4X6i_2A zEYIC2fMFSip3ox$Sd=ZSkM4#5it@o+y5n~BdA+MBf7k!m)phZp zsRG~^SfqtTtVI>Dh!YqWPf<01p=T`s#TTtlvjxx8JVgy!)Rr_B&_=ETpmsJkauuK< z$>?}3O4Nc);cMRLD$0#Nb#+5LXi5RR_Z)rBBK{6@T#Wz1JimHpoI%y zTl%m?2GC&?C}(DVDFcA@f3dVW&Cvw#snso_*_wc!gj7d!61`wU_?kDnigNSMUELH9 znkoR_eu)#&lINfbSfb!MJUIm1F_y*xTA8Pv7FOrP7AaN@TG(5##W+A;f@0)3r~nN~ z1&`B`M625pzUHm2qTIUO)h+R$DY+e%b?Efix62NMW&UL&=Gy^)e+zEa)&N}cj2G5u zEKpsx$bpg`H3u+QQvmSxtMt|TVU?zV4on4Bk$201!dw;5 z-Tj1UU?~i5ft)9?XsQNqd|$8GP!6L4ct_VXie-Q;G@*f>SqcCf(6x^RX%5P2TeH;!WyQzMr)Q&Kv-J~_=7a!f6zRXfQPupBqI+^2|!UT z%s{cEkroeeAE#pg7GXB{Mjw_kfQ8vY-JW3xpfDfKom*QW2ig+jnp%^nm7BuXeAHEx zN8fezNIYoDfDqO()i60=CI!Me5_yaTzFYU3b~XyEv$CGDkJ$jgeZ7W(AoVd>3%l+k znJKpz1=uG8e`tXXrVcl*8R$q-uZGqodbx)1H6M2sI@2WBz;3QsvR z5T0TTj0;8q%rvKlQp{z5_24-57H)$U=%PjzsMzO5fu!UaHl{abS5&#tAGyD2P zjR{);oFHMhj-E>Nat+~Yeoy_y^@HizvuDqrKmQSmfAalbRev+RP;G2%Y;JCDQ9sH{ z0}_(Y^%#;mF+zR0>CQQPsS2|vY*RS6gu)Vbv-o6cQ!}fOA z2JrF~N^qc0c=KWd*S5m;X4nZk@4}AkhOoQ0XKi3_HhB1s{dPFt$=>cR2p#X=?}y!k z58?3Oejx1NzM6!+{eS}<`vmvH(T4*-;m}&V4}mu^pr0_&GaLZ|KuY%C;~ciP`xCXh zi%y3>|9te}=;-M1;1GanZ||R~Jqr7eA3uIj9mpp=_HzSj; Date: Mon, 10 Mar 2025 20:02:51 -0700 Subject: [PATCH 162/171] [Bug] Fix #5358 Abilities that Redirect Moves Consider Move-Typings before Ability Modifiers (#5464) --- src/data/ability.ts | 18 ++++- src/phases/move-phase.ts | 2 +- test/abilities/lightningrod.test.ts | 115 ++++++++++++++++++++++++++++ test/abilities/storm_drain.test.ts | 115 ++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+), 5 deletions(-) create mode 100644 test/abilities/lightningrod.test.ts create mode 100644 test/abilities/storm_drain.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 0b4e5ddb2c4..25ffa797140 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -4571,9 +4571,19 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { } } +/** + * Redirects a move to the pokemon with this ability if it meets the conditions + */ export class RedirectMoveAbAttr extends AbAttr { + /** + * @param pokemon - The Pokemon with the redirection ability + * @param args - The args passed to the `AbAttr`: + * - `[0]` - The id of the {@linkcode Move} used + * - `[1]` - The target's battler index (before redirection) + * - `[2]` - The Pokemon that used the move being redirected + */ apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.canRedirect(args[0] as Moves)) { + if (this.canRedirect(args[0] as Moves, args[2] as Pokemon)) { const target = args[1] as Utils.NumberHolder; const newTarget = pokemon.getBattlerIndex(); if (target.value !== newTarget) { @@ -4585,7 +4595,7 @@ export class RedirectMoveAbAttr extends AbAttr { return false; } - canRedirect(moveId: Moves): boolean { + canRedirect(moveId: Moves, user: Pokemon): boolean { const move = allMoves[moveId]; return !![ MoveTarget.NEAR_OTHER, MoveTarget.OTHER ].find(t => move.moveTarget === t); } @@ -4599,8 +4609,8 @@ export class RedirectTypeMoveAbAttr extends RedirectMoveAbAttr { this.type = type; } - canRedirect(moveId: Moves): boolean { - return super.canRedirect(moveId) && allMoves[moveId].type === this.type; + canRedirect(moveId: Moves, user: Pokemon): boolean { + return super.canRedirect(moveId, user) && user.getMoveType(allMoves[moveId]) === this.type; } } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 16802f8e0ff..f8edaa56981 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -504,7 +504,7 @@ export class MovePhase extends BattlePhase { globalScene .getField(true) .filter(p => p !== this.pokemon) - .forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget)); + .forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget, this.pokemon)); /** `true` if an Ability is responsible for redirecting the move to another target; `false` otherwise */ let redirectedByAbility = currentTarget !== redirectTarget.value; diff --git a/test/abilities/lightningrod.test.ts b/test/abilities/lightningrod.test.ts new file mode 100644 index 00000000000..1ca6c6b1e89 --- /dev/null +++ b/test/abilities/lightningrod.test.ts @@ -0,0 +1,115 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Lightningrod", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.SHOCK_WAVE ]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should redirect electric type moves", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + }); + + it("should not redirect non-electric type moves", async () => { + game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.AERIAL_ACE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should boost the user's spatk without damaging", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy2.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); + + it("should not redirect moves changed from electric type via ability", async () => { + game.override.ability(Abilities.NORMALIZE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should redirect moves changed to electric type via ability", async () => { + game.override.ability(Abilities.GALVANIZE) + .moveset(Moves.TACKLE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.TACKLE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); +}); diff --git a/test/abilities/storm_drain.test.ts b/test/abilities/storm_drain.test.ts new file mode 100644 index 00000000000..e2a7b3e212e --- /dev/null +++ b/test/abilities/storm_drain.test.ts @@ -0,0 +1,115 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Storm Drain", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.WATER_GUN ]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should redirect water type moves", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + }); + + it("should not redirect non-water type moves", async () => { + game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.AERIAL_ACE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should boost the user's spatk without damaging", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy2.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); + + it("should not redirect moves changed from water type via ability", async () => { + game.override.ability(Abilities.NORMALIZE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should redirect moves changed to water type via ability", async () => { + game.override.ability(Abilities.LIQUID_VOICE) + .moveset(Moves.PSYCHIC_NOISE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.PSYCHIC_NOISE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); +}); From b2981381574498d734756c4b87bb7b8832bef59a Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Mon, 10 Mar 2025 20:20:00 -0700 Subject: [PATCH 163/171] [Bug] Fix NG crash when ability is reactivated for a Pokemon off the field (#5478) --- src/data/arena-tag.ts | 4 ++-- test/abilities/neutralizing_gas.test.ts | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 4219b9a3ba2..276cfa035b8 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1433,7 +1433,7 @@ export class SuppressAbilitiesTag extends ArenaTag { }), ); - for (const fieldPokemon of globalScene.getField()) { + for (const fieldPokemon of globalScene.getField(true)) { if (fieldPokemon && fieldPokemon.id !== pokemon.id) { [true, false].forEach(passive => applyOnLoseAbAttrs(fieldPokemon, passive)); } @@ -1466,7 +1466,7 @@ export class SuppressAbilitiesTag extends ArenaTag { globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); } - for (const pokemon of globalScene.getField()) { + for (const pokemon of globalScene.getField(true)) { // There is only one pokemon with this attr on the field on removal, so its abilities are already active if (pokemon && !pokemon.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false)) { [true, false].forEach(passive => applyOnGainAbAttrs(pokemon, passive)); diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index 2bba5b83987..08ab884d806 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -1,4 +1,5 @@ import { BattlerIndex } from "#app/battle"; +import { PostSummonWeatherChangeAbAttr } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; @@ -7,7 +8,7 @@ import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Neutralizing Gas", () => { let phaserGame: Phaser.Game; @@ -155,4 +156,25 @@ describe("Abilities - Neutralizing Gas", () => { expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); }); + + it("should not activate abilities of pokemon no longer on the field", async () => { + game.override + .battleType("single") + .ability(Abilities.NEUTRALIZING_GAS) + .enemyAbility(Abilities.DELTA_STREAM); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const enemy = game.scene.getEnemyPokemon()!; + const weatherChangeAttr = enemy.getAbilityAttrs(PostSummonWeatherChangeAbAttr, false)[0]; + vi.spyOn(weatherChangeAttr, "applyPostSummon"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + game.move.select(Moves.SPLASH); + await game.killPokemon(enemy); + await game.killPokemon(game.scene.getPlayerPokemon()!); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + expect(weatherChangeAttr.applyPostSummon).not.toHaveBeenCalled(); + }); }); From f3f43f4a44c193c3d26db61f0e0d54bcb39c4f9b Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Wed, 12 Mar 2025 00:00:33 -0500 Subject: [PATCH 164/171] [Enhancement] Add form changes for Solgaleo, Lunala, & Marshadow cosmetic forms (#5344) --- .../pokemon/icons/7/791-radiant-sun.png | Bin 0 -> 491 bytes .../pokemon/icons/7/791s-radiant-sun.png | Bin 0 -> 508 bytes .../images/pokemon/icons/7/792-full-moon.png | Bin 0 -> 461 bytes .../images/pokemon/icons/7/792s-full-moon.png | Bin 0 -> 470 bytes public/images/pokemon_icons_7.json | 7524 +++++++++-------- public/images/pokemon_icons_7.png | Bin 51451 -> 52044 bytes src/data/pokemon-forms.ts | 12 + src/data/pokemon-species.ts | 14 +- 8 files changed, 3827 insertions(+), 3723 deletions(-) create mode 100644 public/images/pokemon/icons/7/791-radiant-sun.png create mode 100644 public/images/pokemon/icons/7/791s-radiant-sun.png create mode 100644 public/images/pokemon/icons/7/792-full-moon.png create mode 100644 public/images/pokemon/icons/7/792s-full-moon.png diff --git a/public/images/pokemon/icons/7/791-radiant-sun.png b/public/images/pokemon/icons/7/791-radiant-sun.png new file mode 100644 index 0000000000000000000000000000000000000000..ac53b40b0e637f33a74f5474bc35f8ac55b7ecb5 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{174DbnYRZvj)`EkOJA3s*Lo8H+Tf9UuzS@rgyps1)dZ-7d4Opav(DXx+r zzu^Bcz_96z&Uv6HXMsm#F#`kNK@eu#F){ls&_V}K7sn6_|D}^T`&tZmSc)G={QLiK z?KwxGgr!rrnKH47zb#{W_-pY$?zRs)dmIE6kKEweyr(hA!KrIyOkk)6PrI2!8R(ILV$xpK-j;z`$yJV-pp_=AD-f<_V@twZI?LVRP z`Nn{1`6$5-iTt!7ie}0^BXM6nLS(8__o8F6#kX3I#;A0-O=1tU^|3FnTH-2mc zQrsm$e!>6YfWgb3@e@#(v%n*=n1O-sFbFdq&tH)OwA9zr#WBRff9d4Lyu$_@E(aSj zfB%=?W1XX3ILmW#S=Qw%dk!?p{`?d8pVjqUqyB`Jj#nIW9`dR%yUe=9koxI@=#fn` zR<54eTl#TZgKUZM@#{KbFZMUCFW!ZM&afv+b-C zDYuP3Mp{i+f4kdFTXlKoPW^Wbfro#+zA7$qq-cu%T=VzaOWl?;&3Gzk=eVpT?P9{Q zo~xWCJ3lM5eH5AHvEv+D>CWu9-9cv$$nJ<}XSQ;jP+V?trlV#0@-zjXUTcZQM=lA^ zB#+piR%*A-Je&T2FX`P&n`a3>Ki}YK)lD}&*%Dq-zK0`TA+1^TiBsIXk30F^KIl4l uSGRz@y{z2X|3O~fE6c}MV_ts#$ym>zaB|sxx5>cJX7F_Nb6Mw<&;$TCN#RWZ literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/7/792-full-moon.png b/public/images/pokemon/icons/7/792-full-moon.png new file mode 100644 index 0000000000000000000000000000000000000000..6e77f626e94687596e0a4031512b52b96724ddd2 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`)dPG&Ton`)etw*=s@?STv2&4|kF9zA;orZ1cecm3UU;CwpA^X3_g}3a zs5VcNZx@i_EeY}q{*MG0Y+op~0VOyKJR*x382Ao?FyoGi*>8cCi+Q>@hFJLbUgi{P zR^Va1z>rwD^MB><$sA6Ox6hPpc_zrDF}MC0@5@@B)02wVZ&G`BFO_|-ydv+}nD37c zO_yF?(Q?aMUHXg8hS|M)-aqA4R*5`hp?bnJ<+vdKiPTD;PV2}-wv_3XS zl00rq<61mlamj%Vxxe@AgfkA4V%;cVJOJbuY%t_`lTl@K} zt%Iht_p#mIITVExbk+%+GBtOOnFW{JG?bD5GqV@sYg8 t?LPtqReNhw(=Nn{1`bpw1tTt!7ie}0^>s@>FA+wxpf!KXdjs@>8orIem5opxt?yb6C(AaCD) zwf_JAJ^^(oFKbl*Qv4-Be!>4y0K=6#GZq4+I14-?iy0XB4ude`@%$AjKu3ssx;Tbd z`1f9BoYbtq!+ODCLc^|m|9AWrX4$wPH%%t`GY8|8KKaK@U+k8pp4=H8Il18drsjM1 z74OcntY7_@zkL29!6^N?ITzSl@8&$I)z{zQ5acQ1Cs@SSJh_Ga$tJsH5>}CkY&?42 zo7jBp4o(S}Ancyw-P$d$xWp;$dTw-Vo6d$)W)6vBY`!`&FfVW2nsVpgx4Uy~ z-D1zN2zmC*w$#oLE$w)En%8mKlUs?J7R|0kPDf%KF7VtsIZ;8PedT983Cm`wBTdCm zjMjcWdp1$PaqpCm?`)k;Fzis7&hd1X^ul%SM;1#-y}6`(WLD5Ox!YC$^bH;UF8LzL zxc8}B$K7MCKY|2RxqqMN33&N;^0pZVJ!OvDZ@Z#DMI&hGMPRrwc)I$ztaD0e0ss_R B#w7p% literal 0 HcmV?d00001 diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index 03eeba88a70..d5faa4e8b02 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_7.png", "format": "RGBA8888", "size": { - "w": 502, - "h": 325 + "w": 250, + "h": 672 }, "scale": 1, "frames": [ @@ -345,6 +345,132 @@ "h": 29 } }, + { + "filename": "795", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 322, + "w": 28, + "h": 30 + } + }, + { + "filename": "795s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 352, + "w": 28, + "h": 30 + } + }, + { + "filename": "800", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 382, + "w": 28, + "h": 30 + } + }, + { + "filename": "800s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 412, + "w": 28, + "h": 30 + } + }, + { + "filename": "805", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 442, + "w": 28, + "h": 30 + } + }, + { + "filename": "805s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 472, + "w": 28, + "h": 30 + } + }, { "filename": "809-gigantamax", "rotated": false, @@ -388,7 +514,7 @@ } }, { - "filename": "791", + "filename": "791-radiant-sun", "rotated": false, "trimmed": true, "sourceSize": { @@ -409,7 +535,7 @@ } }, { - "filename": "791s", + "filename": "791", "rotated": false, "trimmed": true, "sourceSize": { @@ -430,7 +556,49 @@ } }, { - "filename": "784", + "filename": "791s-radiant-sun", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 171, + "y": 0, + "w": 29, + "h": 28 + } + }, + { + "filename": "791s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 29, + "h": 28 + } + }, + { + "filename": "773-bug", "rotated": false, "trimmed": true, "sourceSize": { @@ -439,19 +607,124 @@ }, "spriteSourceSize": { "x": 7, - "y": 3, - "w": 29, - "h": 27 + "y": 0, + "w": 26, + "h": 30 }, "frame": { - "x": 171, - "y": 0, - "w": 29, - "h": 27 + "x": 0, + "y": 502, + "w": 26, + "h": 30 } }, { - "filename": "784s", + "filename": "773-dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 532, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 562, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 592, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 622, + "w": 26, + "h": 30 + } + }, + { + "filename": "789", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 0, + "y": 652, + "w": 23, + "h": 20 + } + }, + { + "filename": "784", "rotated": false, "trimmed": true, "sourceSize": { @@ -472,7 +745,7 @@ } }, { - "filename": "730", + "filename": "2103", "rotated": false, "trimmed": true, "sourceSize": { @@ -480,435 +753,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 + "x": 10, + "y": 0, + "w": 21, + "h": 30 }, "frame": { "x": 229, "y": 0, - "w": 28, - "h": 27 - } - }, - { - "filename": "730s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 257, - "y": 0, - "w": 28, - "h": 27 - } - }, - { - "filename": "740", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 32, - "h": 23 - }, - "frame": { - "x": 285, - "y": 0, - "w": 32, - "h": 23 - } - }, - { - "filename": "740s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 32, - "h": 23 - }, - "frame": { - "x": 317, - "y": 0, - "w": 32, - "h": 23 - } - }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 34, - "y": 85, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 34, - "y": 115, - "w": 28, - "h": 30 - } - }, - { - "filename": "800", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 32, - "y": 145, - "w": 28, - "h": 30 - } - }, - { - "filename": "800s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 32, - "y": 175, - "w": 28, - "h": 30 - } - }, - { - "filename": "805", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 31, - "y": 205, - "w": 28, - "h": 30 - } - }, - { - "filename": "805s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 31, - "y": 235, - "w": 28, - "h": 30 - } - }, - { - "filename": "773-bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 265, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 295, - "w": 26, - "h": 30 - } - }, - { - "filename": "2038", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 30, - "h": 25 - }, - "frame": { - "x": 349, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "2038s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 30, - "h": 25 - }, - "frame": { - "x": 379, - "y": 0, - "w": 30, - "h": 25 - } - }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 409, - "y": 0, - "w": 28, - "h": 26 - } - }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 437, - "y": 0, - "w": 28, - "h": 26 - } - }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 465, - "y": 0, - "w": 28, - "h": 28 - } - }, - { - "filename": "792s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 70, - "y": 57, - "w": 28, - "h": 28 - } - }, - { - "filename": "773-dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 62, - "y": 85, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 62, - "y": 115, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 60, - "y": 145, - "w": 26, + "w": 21, "h": 30 } }, @@ -927,8 +780,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 175, + "x": 34, + "y": 85, "w": 26, "h": 30 } @@ -948,8 +801,8 @@ "h": 30 }, "frame": { - "x": 59, - "y": 205, + "x": 34, + "y": 115, "w": 26, "h": 30 } @@ -969,8 +822,8 @@ "h": 30 }, "frame": { - "x": 59, - "y": 235, + "x": 32, + "y": 145, "w": 26, "h": 30 } @@ -990,8 +843,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 265, + "x": 32, + "y": 175, "w": 26, "h": 30 } @@ -1011,12 +864,369 @@ "h": 30 }, "frame": { - "x": 57, - "y": 295, + "x": 31, + "y": 205, "w": 26, "h": 30 } }, + { + "filename": "773-ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 235, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 265, + "w": 26, + "h": 30 + } + }, + { + "filename": "730", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 31, + "y": 295, + "w": 28, + "h": 27 + } + }, + { + "filename": "773-poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 322, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 352, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 382, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 412, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 442, + "w": 26, + "h": 30 + } + }, + { + "filename": "773", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 472, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 502, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 532, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 562, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 592, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 622, + "w": 26, + "h": 30 + } + }, + { + "filename": "789s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 23, + "y": 652, + "w": 23, + "h": 20 + } + }, + { + "filename": "784s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 29, + "h": 27 + }, + "frame": { + "x": 70, + "y": 57, + "w": 29, + "h": 27 + } + }, + { + "filename": "747", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 46, + "y": 652, + "w": 22, + "h": 20 + } + }, { "filename": "764", "rotated": false, @@ -1032,7 +1242,7 @@ "h": 30 }, "frame": { - "x": 88, + "x": 60, "y": 85, "w": 25, "h": 30 @@ -1053,306 +1263,12 @@ "h": 30 }, "frame": { - "x": 88, + "x": 60, "y": 115, "w": 25, "h": 30 } }, - { - "filename": "773-ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 86, - "y": 145, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 86, - "y": 175, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 85, - "y": 205, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 85, - "y": 235, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 265, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 295, - "w": 26, - "h": 30 - } - }, - { - "filename": "772", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 98, - "y": 57, - "w": 25, - "h": 28 - } - }, - { - "filename": "773-water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 123, - "y": 56, - "w": 26, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 149, - "y": 56, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 113, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 139, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 113, - "y": 116, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 139, - "y": 116, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 112, - "y": 146, - "w": 26, - "h": 30 - } - }, { "filename": "773s-fighting", "rotated": false, @@ -1368,8 +1284,8 @@ "h": 30 }, "frame": { - "x": 138, - "y": 146, + "x": 58, + "y": 145, "w": 26, "h": 30 } @@ -1389,8 +1305,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 176, + "x": 58, + "y": 175, "w": 26, "h": 30 } @@ -1410,8 +1326,8 @@ "h": 30 }, "frame": { - "x": 138, - "y": 176, + "x": 57, + "y": 205, "w": 26, "h": 30 } @@ -1431,8 +1347,8 @@ "h": 30 }, "frame": { - "x": 111, - "y": 206, + "x": 57, + "y": 235, "w": 26, "h": 30 } @@ -1452,12 +1368,33 @@ "h": 30 }, "frame": { - "x": 137, - "y": 206, + "x": 57, + "y": 265, "w": 26, "h": 30 } }, + { + "filename": "730s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 59, + "y": 295, + "w": 28, + "h": 27 + } + }, { "filename": "773s-ground", "rotated": false, @@ -1473,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 111, - "y": 236, + "x": 54, + "y": 322, "w": 26, "h": 30 } @@ -1494,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 137, - "y": 236, + "x": 54, + "y": 352, "w": 26, "h": 30 } @@ -1515,33 +1452,12 @@ "h": 30 }, "frame": { - "x": 109, - "y": 266, + "x": 54, + "y": 382, "w": 26, "h": 30 } }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 109, - "y": 296, - "w": 25, - "h": 29 - } - }, { "filename": "773s-psychic", "rotated": false, @@ -1557,54 +1473,12 @@ "h": 30 }, "frame": { - "x": 135, - "y": 266, + "x": 54, + "y": 412, "w": 26, "h": 30 } }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 134, - "y": 296, - "w": 25, - "h": 29 - } - }, - { - "filename": "796", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 - }, - "frame": { - "x": 159, - "y": 296, - "w": 18, - "h": 29 - } - }, { "filename": "773s-rock", "rotated": false, @@ -1620,54 +1494,12 @@ "h": 30 }, "frame": { - "x": 161, - "y": 266, + "x": 54, + "y": 442, "w": 26, "h": 30 } }, - { - "filename": "796s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 - }, - "frame": { - "x": 177, - "y": 296, - "w": 18, - "h": 29 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 167, - "y": 28, - "w": 25, - "h": 28 - } - }, { "filename": "773s-steel", "rotated": false, @@ -1683,8 +1515,8 @@ "h": 30 }, "frame": { - "x": 192, - "y": 27, + "x": 54, + "y": 472, "w": 26, "h": 30 } @@ -1704,8 +1536,8 @@ "h": 30 }, "frame": { - "x": 218, - "y": 27, + "x": 52, + "y": 502, "w": 26, "h": 30 } @@ -1725,14 +1557,98 @@ "h": 30 }, "frame": { - "x": 244, - "y": 27, + "x": 52, + "y": 532, "w": 26, "h": 30 } }, { - "filename": "2103", + "filename": "792-full-moon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 52, + "y": 562, + "w": 28, + "h": 28 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 52, + "y": 590, + "w": 28, + "h": 28 + } + }, + { + "filename": "792s-full-moon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 52, + "y": 618, + "w": 28, + "h": 28 + } + }, + { + "filename": "785", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 68, + "y": 646, + "w": 28, + "h": 26 + } + }, + { + "filename": "2103s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1746,14 +1662,14 @@ "h": 30 }, "frame": { - "x": 270, - "y": 27, + "x": 85, + "y": 84, "w": 21, "h": 30 } }, { - "filename": "2026", + "filename": "794", "rotated": false, "trimmed": true, "sourceSize": { @@ -1761,20 +1677,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 8, "y": 1, - "w": 26, - "h": 28 + "w": 25, + "h": 29 }, "frame": { - "x": 291, - "y": 23, - "w": 26, - "h": 28 + "x": 85, + "y": 114, + "w": 25, + "h": 29 } }, { - "filename": "2026s", + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -1782,20 +1698,83 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 99, + "y": 57, + "w": 21, + "h": 27 + } + }, + { + "filename": "792s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, "y": 1, - "w": 26, + "w": 28, "h": 28 }, "frame": { - "x": 317, - "y": 23, - "w": 26, + "x": 120, + "y": 56, + "w": 28, "h": 28 } }, { - "filename": "2075", + "filename": "740", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 32, + "h": 23 + }, + "frame": { + "x": 106, + "y": 84, + "w": 32, + "h": 23 + } + }, + { + "filename": "740s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 32, + "h": 23 + }, + "frame": { + "x": 148, + "y": 56, + "w": 32, + "h": 23 + } + }, + { + "filename": "785s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1804,19 +1783,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 4, - "w": 29, - "h": 24 + "y": 3, + "w": 28, + "h": 26 }, "frame": { - "x": 343, - "y": 25, - "w": 29, - "h": 24 + "x": 110, + "y": 107, + "w": 28, + "h": 26 } }, { - "filename": "2075s", + "filename": "724", "rotated": false, "trimmed": true, "sourceSize": { @@ -1824,16 +1803,58 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 11, "y": 4, - "w": 29, - "h": 24 + "w": 19, + "h": 25 }, "frame": { - "x": 372, - "y": 25, - "w": 29, - "h": 24 + "x": 180, + "y": 56, + "w": 19, + "h": 25 + } + }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 138, + "y": 84, + "w": 25, + "h": 29 + } + }, + { + "filename": "725", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 138, + "y": 113, + "w": 25, + "h": 21 } }, { @@ -1851,12 +1872,117 @@ "h": 22 }, "frame": { - "x": 401, - "y": 26, + "x": 110, + "y": 133, "w": 28, "h": 22 } }, + { + "filename": "725s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 138, + "y": 134, + "w": 25, + "h": 21 + } + }, + { + "filename": "734", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 85, + "y": 143, + "w": 25, + "h": 16 + } + }, + { + "filename": "2026", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 84, + "y": 159, + "w": 26, + "h": 28 + } + }, + { + "filename": "2038", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 30, + "h": 25 + }, + "frame": { + "x": 110, + "y": 155, + "w": 30, + "h": 25 + } + }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 140, + "y": 155, + "w": 25, + "h": 25 + } + }, { "filename": "746s-school", "rotated": false, @@ -1872,12 +1998,138 @@ "h": 22 }, "frame": { - "x": 429, - "y": 26, + "x": 84, + "y": 187, "w": 28, "h": 22 } }, + { + "filename": "2026s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 83, + "y": 209, + "w": 26, + "h": 28 + } + }, + { + "filename": "772", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 83, + "y": 237, + "w": 25, + "h": 28 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 83, + "y": 265, + "w": 25, + "h": 28 + } + }, + { + "filename": "2038s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 30, + "h": 25 + }, + "frame": { + "x": 112, + "y": 180, + "w": 30, + "h": 25 + } + }, + { + "filename": "745s-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 142, + "y": 180, + "w": 25, + "h": 25 + } + }, + { + "filename": "783s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 87, + "y": 293, + "w": 21, + "h": 27 + } + }, { "filename": "760", "rotated": false, @@ -1893,12 +2145,54 @@ "h": 24 }, "frame": { - "x": 175, - "y": 56, + "x": 163, + "y": 79, "w": 17, "h": 24 } }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 163, + "y": 103, + "w": 18, + "h": 29 + } + }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 163, + "y": 132, + "w": 25, + "h": 23 + } + }, { "filename": "748", "rotated": false, @@ -1914,8 +2208,8 @@ "h": 25 }, "frame": { - "x": 192, - "y": 57, + "x": 165, + "y": 155, "w": 26, "h": 25 } @@ -1935,14 +2229,14 @@ "h": 25 }, "frame": { - "x": 218, - "y": 57, + "x": 167, + "y": 180, "w": 26, "h": 25 } }, { - "filename": "2089", + "filename": "732", "rotated": false, "trimmed": true, "sourceSize": { @@ -1950,20 +2244,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 + "x": 10, + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 244, - "y": 57, - "w": 26, - "h": 25 + "x": 180, + "y": 81, + "w": 19, + "h": 22 } }, { - "filename": "745-dusk", + "filename": "796s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1971,57 +2265,57 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 181, + "y": 103, + "w": 18, + "h": 29 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 188, + "y": 132, + "w": 17, + "h": 23 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 4, - "w": 25, + "w": 19, "h": 25 }, "frame": { - "x": 270, - "y": 57, - "w": 25, - "h": 25 - } - }, - { - "filename": "2089s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 295, - "y": 51, - "w": 26, - "h": 25 - } - }, - { - "filename": "745s-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 321, - "y": 51, - "w": 25, + "x": 191, + "y": 155, + "w": 19, "h": 25 } }, @@ -2040,705 +2334,12 @@ "h": 26 }, "frame": { - "x": 346, - "y": 49, + "x": 193, + "y": 180, "w": 24, "h": 26 } }, - { - "filename": "766s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 26 - }, - "frame": { - "x": 370, - "y": 49, - "w": 24, - "h": 26 - } - }, - { - "filename": "765", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 457, - "y": 28, - "w": 28, - "h": 21 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 485, - "y": 28, - "w": 17, - "h": 24 - } - }, - { - "filename": "2103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, - "frame": { - "x": 165, - "y": 86, - "w": 21, - "h": 30 - } - }, - { - "filename": "783", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 21, - "h": 27 - }, - "frame": { - "x": 165, - "y": 116, - "w": 21, - "h": 27 - } - }, - { - "filename": "750", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 186, - "y": 82, - "w": 25, - "h": 24 - } - }, - { - "filename": "750s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 211, - "y": 82, - "w": 25, - "h": 24 - } - }, - { - "filename": "765s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 186, - "y": 106, - "w": 28, - "h": 21 - } - }, - { - "filename": "2028", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 236, - "y": 82, - "w": 25, - "h": 24 - } - }, - { - "filename": "2028s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 261, - "y": 82, - "w": 25, - "h": 24 - } - }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 214, - "y": 106, - "w": 25, - "h": 21 - } - }, - { - "filename": "725s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 239, - "y": 106, - "w": 25, - "h": 21 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 264, - "y": 106, - "w": 23, - "h": 24 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 186, - "y": 127, - "w": 27, - "h": 19 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 213, - "y": 127, - "w": 27, - "h": 19 - } - }, - { - "filename": "758", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 240, - "y": 127, - "w": 24, - "h": 22 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 264, - "y": 130, - "w": 23, - "h": 24 - } - }, - { - "filename": "727", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 286, - "y": 82, - "w": 23, - "h": 24 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 287, - "y": 106, - "w": 23, - "h": 26 - } - }, - { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 287, - "y": 132, - "w": 23, - "h": 24 - } - }, - { - "filename": "776s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 309, - "y": 76, - "w": 23, - "h": 26 - } - }, - { - "filename": "783s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 21, - "h": 27 - }, - "frame": { - "x": 310, - "y": 102, - "w": 21, - "h": 27 - } - }, - { - "filename": "787", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 310, - "y": 129, - "w": 22, - "h": 26 - } - }, - { - "filename": "787s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 332, - "y": 76, - "w": 22, - "h": 26 - } - }, - { - "filename": "788", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 331, - "y": 102, - "w": 22, - "h": 26 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 354, - "y": 75, - "w": 25, - "h": 23 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 332, - "y": 128, - "w": 22, - "h": 26 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 379, - "y": 75, - "w": 19, - "h": 25 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 394, - "y": 49, - "w": 19, - "h": 25 - } - }, - { - "filename": "745s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 413, - "y": 48, - "w": 25, - "h": 23 - } - }, - { - "filename": "781", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 438, - "y": 48, - "w": 19, - "h": 25 - } - }, - { - "filename": "729", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 457, - "y": 49, - "w": 23, - "h": 24 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 480, - "y": 52, - "w": 22, - "h": 25 - } - }, { "filename": "801-original", "rotated": false, @@ -2754,8 +2355,8 @@ "h": 28 }, "frame": { - "x": 398, - "y": 74, + "x": 80, + "y": 322, "w": 20, "h": 28 } @@ -2775,159 +2376,12 @@ "h": 28 }, "frame": { - "x": 418, - "y": 71, + "x": 80, + "y": 350, "w": 20, "h": 28 } }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 438, - "y": 73, - "w": 23, - "h": 25 - } - }, - { - "filename": "781s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 461, - "y": 73, - "w": 19, - "h": 25 - } - }, - { - "filename": "806s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 480, - "y": 77, - "w": 22, - "h": 25 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 354, - "y": 98, - "w": 25, - "h": 16 - } - }, - { - "filename": "767", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 353, - "y": 114, - "w": 24, - "h": 14 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 354, - "y": 128, - "w": 23, - "h": 25 - } - }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 379, - "y": 100, - "w": 19, - "h": 22 - } - }, { "filename": "801s-original", "rotated": false, @@ -2943,54 +2397,12 @@ "h": 28 }, "frame": { - "x": 377, - "y": 122, + "x": 80, + "y": 378, "w": 20, "h": 28 } }, - { - "filename": "729s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 398, - "y": 102, - "w": 23, - "h": 24 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 397, - "y": 126, - "w": 24, - "h": 23 - } - }, { "filename": "801s", "rotated": false, @@ -3006,14 +2418,35 @@ "h": 28 }, "frame": { - "x": 421, - "y": 99, + "x": 80, + "y": 406, "w": 20, "h": 28 } }, { - "filename": "768s", + "filename": "766s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 24, + "h": 26 + }, + "frame": { + "x": 80, + "y": 434, + "w": 24, + "h": 26 + } + }, + { + "filename": "776", "rotated": false, "trimmed": true, "sourceSize": { @@ -3022,187 +2455,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 441, - "y": 98, - "w": 24, - "h": 23 - } - }, - { - "filename": "735", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 421, - "y": 127, - "w": 20, - "h": 24 - } - }, - { - "filename": "770", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, "y": 4, "w": 23, - "h": 24 + "h": 26 }, "frame": { - "x": 441, - "y": 121, + "x": 80, + "y": 460, "w": 23, - "h": 24 + "h": 26 } }, { - "filename": "2050", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 465, - "y": 98, - "w": 15, - "h": 18 - } - }, - { - "filename": "756", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 480, - "y": 102, - "w": 22, - "h": 24 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 465, - "y": 116, - "w": 15, - "h": 18 - } - }, - { - "filename": "756s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 480, - "y": 126, - "w": 22, - "h": 24 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 464, - "y": 134, - "w": 16, - "h": 19 - } - }, - { - "filename": "802-zenith", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 480, - "y": 150, - "w": 22, - "h": 24 - } - }, - { - "filename": "733", + "filename": "726", "rotated": false, "trimmed": true, "sourceSize": { @@ -3211,19 +2476,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 7, + "y": 4, "w": 23, - "h": 21 + "h": 24 }, "frame": { - "x": 441, - "y": 145, + "x": 80, + "y": 486, "w": 23, - "h": 21 + "h": 24 } }, { - "filename": "761s", + "filename": "2089", "rotated": false, "trimmed": true, "sourceSize": { @@ -3231,16 +2496,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 + "x": 8, + "y": 3, + "w": 26, + "h": 25 }, "frame": { - "x": 464, - "y": 153, - "w": 16, - "h": 19 + "x": 78, + "y": 510, + "w": 26, + "h": 25 + } + }, + { + "filename": "2089s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 78, + "y": 535, + "w": 26, + "h": 25 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 80, + "y": 560, + "w": 23, + "h": 26 + } + }, + { + "filename": "787", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 80, + "y": 586, + "w": 22, + "h": 26 + } + }, + { + "filename": "787s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 80, + "y": 612, + "w": 22, + "h": 26 + } + }, + { + "filename": "2075", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 200, + "y": 27, + "w": 29, + "h": 24 } }, { @@ -3258,12 +2628,159 @@ "h": 24 }, "frame": { - "x": 165, - "y": 143, + "x": 229, + "y": 30, "w": 21, "h": 24 } }, + { + "filename": "2075s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 199, + "y": 51, + "w": 29, + "h": 24 + } + }, + { + "filename": "788", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 228, + "y": 54, + "w": 22, + "h": 26 + } + }, + { + "filename": "750", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 199, + "y": 75, + "w": 25, + "h": 24 + } + }, + { + "filename": "750s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 199, + "y": 99, + "w": 25, + "h": 24 + } + }, + { + "filename": "2028", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 224, + "y": 80, + "w": 25, + "h": 24 + } + }, + { + "filename": "745s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 224, + "y": 104, + "w": 25, + "h": 23 + } + }, + { + "filename": "781", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 205, + "y": 123, + "w": 19, + "h": 25 + } + }, { "filename": "2020", "rotated": false, @@ -3279,12 +2796,54 @@ "h": 22 }, "frame": { - "x": 186, - "y": 146, + "x": 224, + "y": 127, "w": 25, "h": 22 } }, + { + "filename": "765", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 112, + "y": 205, + "w": 28, + "h": 21 + } + }, + { + "filename": "765s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 140, + "y": 205, + "w": 28, + "h": 21 + } + }, { "filename": "2020s", "rotated": false, @@ -3300,140 +2859,14 @@ "h": 22 }, "frame": { - "x": 211, - "y": 146, + "x": 168, + "y": 205, "w": 25, "h": 22 } }, { - "filename": "802", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 164, - "y": 167, - "w": 22, - "h": 24 - } - }, - { - "filename": "2105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 186, - "y": 168, - "w": 24, - "h": 23 - } - }, - { - "filename": "2105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 210, - "y": 168, - "w": 24, - "h": 23 - } - }, - { - "filename": "734s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 164, - "y": 191, - "w": 25, - "h": 16 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 163, - "y": 207, - "w": 23, - "h": 24 - } - }, - { - "filename": "2051", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 163, - "y": 231, - "w": 23, - "h": 24 - } - }, - { - "filename": "758s", + "filename": "758", "rotated": false, "trimmed": true, "sourceSize": { @@ -3447,56 +2880,14 @@ "h": 22 }, "frame": { - "x": 189, - "y": 191, + "x": 193, + "y": 206, "w": 24, "h": 22 } }, { - "filename": "2051s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 186, - "y": 213, - "w": 23, - "h": 24 - } - }, - { - "filename": "745s-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 213, - "y": 191, - "w": 21, - "h": 24 - } - }, - { - "filename": "2053", + "filename": "780", "rotated": false, "trimmed": true, "sourceSize": { @@ -3505,229 +2896,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 209, - "y": 215, - "w": 24, - "h": 22 - } - }, - { - "filename": "2053s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 186, - "y": 237, - "w": 24, - "h": 22 - } - }, - { - "filename": "769", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 210, - "y": 237, - "w": 23, - "h": 22 - } - }, - { - "filename": "802s-zenith", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 187, - "y": 259, - "w": 22, - "h": 24 - } - }, - { - "filename": "802s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 209, - "y": 259, - "w": 22, - "h": 24 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 187, - "y": 283, - "w": 18, - "h": 13 - } - }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, "y": 7, - "w": 23, - "h": 21 + "w": 27, + "h": 19 }, "frame": { - "x": 236, - "y": 149, - "w": 23, - "h": 21 + "x": 109, + "y": 226, + "w": 27, + "h": 19 } }, { - "filename": "807", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 234, - "y": 170, - "w": 22, - "h": 24 - } - }, - { - "filename": "738", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 234, - "y": 194, - "w": 22, - "h": 21 - } - }, - { - "filename": "807s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 233, - "y": 215, - "w": 22, - "h": 24 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 233, - "y": 239, - "w": 22, - "h": 21 - } - }, - { - "filename": "769s", + "filename": "2028s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3736,19 +2917,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 23, - "h": 22 + "y": 4, + "w": 25, + "h": 24 }, "frame": { - "x": 231, - "y": 260, - "w": 23, - "h": 22 + "x": 108, + "y": 245, + "w": 25, + "h": 24 } }, { - "filename": "767s", + "filename": "788s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3756,20 +2937,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 + "x": 9, + "y": 2, + "w": 22, + "h": 26 }, "frame": { - "x": 205, - "y": 283, - "w": 24, - "h": 14 + "x": 108, + "y": 269, + "w": 22, + "h": 26 } }, { - "filename": "763", + "filename": "803", "rotated": false, "trimmed": true, "sourceSize": { @@ -3778,19 +2959,61 @@ }, "spriteSourceSize": { "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 108, + "y": 295, + "w": 23, + "h": 25 + } + }, + { + "filename": "780s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 27, + "h": 19 + }, + "frame": { + "x": 136, + "y": 226, + "w": 27, + "h": 19 + } + }, + { + "filename": "726s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 4, - "w": 21, + "w": 23, "h": 24 }, "frame": { - "x": 195, - "y": 297, - "w": 21, + "x": 133, + "y": 245, + "w": 23, "h": 24 } }, { - "filename": "735s", + "filename": "803s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3799,14 +3022,119 @@ }, "spriteSourceSize": { "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 130, + "y": 269, + "w": 23, + "h": 25 + } + }, + { + "filename": "806", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 131, + "y": 294, + "w": 22, + "h": 25 + } + }, + { + "filename": "727", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 4, - "w": 20, + "w": 23, "h": 24 }, "frame": { - "x": 216, - "y": 297, - "w": 20, + "x": 100, + "y": 320, + "w": 23, + "h": 24 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 100, + "y": 344, + "w": 23, + "h": 24 + } + }, + { + "filename": "729", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 100, + "y": 368, + "w": 23, + "h": 24 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 100, + "y": 392, + "w": 23, "h": 24 } }, @@ -3825,14 +3153,14 @@ "h": 18 }, "frame": { - "x": 259, - "y": 154, + "x": 100, + "y": 416, "w": 23, "h": 18 } }, { - "filename": "763s", + "filename": "781s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3841,19 +3169,103 @@ }, "spriteSourceSize": { "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 104, + "y": 434, + "w": 19, + "h": 25 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 163, + "y": 227, + "w": 24, + "h": 22 + } + }, + { + "filename": "768", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 187, + "y": 228, + "w": 24, + "h": 23 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 156, + "y": 249, + "w": 24, + "h": 23 + } + }, + { + "filename": "770", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 4, - "w": 21, + "w": 23, "h": 24 }, "frame": { - "x": 256, - "y": 172, - "w": 21, + "x": 153, + "y": 272, + "w": 23, "h": 24 } }, { - "filename": "747", + "filename": "770s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3861,20 +3273,62 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 + "x": 9, + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 256, - "y": 196, - "w": 22, - "h": 20 + "x": 153, + "y": 296, + "w": 23, + "h": 24 } }, { - "filename": "782", + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 180, + "y": 251, + "w": 24, + "h": 22 + } + }, + { + "filename": "806s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 176, + "y": 273, + "w": 22, + "h": 25 + } + }, + { + "filename": "756", "rotated": false, "trimmed": true, "sourceSize": { @@ -3885,118 +3339,13 @@ "x": 9, "y": 5, "w": 22, - "h": 23 + "h": 24 }, "frame": { - "x": 255, - "y": 216, + "x": 176, + "y": 298, "w": 22, - "h": 23 - } - }, - { - "filename": "782s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 255, - "y": 239, - "w": 22, - "h": 23 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 254, - "y": 262, - "w": 23, - "h": 20 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 282, - "y": 156, - "w": 23, - "h": 18 - } - }, - { - "filename": "743", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 277, - "y": 174, - "w": 20, - "h": 22 - } - }, - { - "filename": "732s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 278, - "y": 196, - "w": 19, - "h": 22 + "h": 24 } }, { @@ -4014,8 +3363,8 @@ "h": 25 }, "frame": { - "x": 277, - "y": 218, + "x": 123, + "y": 320, "w": 20, "h": 25 } @@ -4035,14 +3384,14 @@ "h": 25 }, "frame": { - "x": 277, - "y": 243, + "x": 123, + "y": 345, "w": 20, "h": 25 } }, { - "filename": "739", + "filename": "735", "rotated": false, "trimmed": true, "sourceSize": { @@ -4051,17 +3400,332 @@ }, "spriteSourceSize": { "x": 11, - "y": 6, + "y": 4, "w": 20, + "h": 24 + }, + "frame": { + "x": 123, + "y": 370, + "w": 20, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 123, + "y": 394, + "w": 20, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 123, + "y": 418, + "w": 21, + "h": 24 + } + }, + { + "filename": "733", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, "h": 21 }, "frame": { - "x": 277, - "y": 268, - "w": 20, + "x": 123, + "y": 442, + "w": 23, "h": 21 } }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 143, + "y": 320, + "w": 23, + "h": 24 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 143, + "y": 344, + "w": 23, + "h": 24 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 143, + "y": 368, + "w": 22, + "h": 24 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 143, + "y": 392, + "w": 22, + "h": 24 + } + }, + { + "filename": "763", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 144, + "y": 416, + "w": 21, + "h": 24 + } + }, + { + "filename": "749", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 146, + "y": 440, + "w": 21, + "h": 23 + } + }, + { + "filename": "2105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 166, + "y": 322, + "w": 24, + "h": 23 + } + }, + { + "filename": "2105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 166, + "y": 345, + "w": 24, + "h": 23 + } + }, + { + "filename": "802", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 165, + "y": 368, + "w": 22, + "h": 24 + } + }, + { + "filename": "802s-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 165, + "y": 392, + "w": 22, + "h": 24 + } + }, + { + "filename": "802s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 165, + "y": 416, + "w": 22, + "h": 24 + } + }, + { + "filename": "749s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 167, + "y": 440, + "w": 21, + "h": 23 + } + }, { "filename": "755", "rotated": false, @@ -4077,14 +3741,14 @@ "h": 24 }, "frame": { - "x": 297, - "y": 174, + "x": 190, + "y": 322, "w": 13, "h": 24 } }, { - "filename": "755s", + "filename": "723", "rotated": false, "trimmed": true, "sourceSize": { @@ -4092,15 +3756,36 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 190, + "y": 346, + "w": 17, + "h": 22 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 4, - "w": 13, + "w": 21, "h": 24 }, "frame": { - "x": 297, - "y": 198, - "w": 13, + "x": 187, + "y": 368, + "w": 21, "h": 24 } }, @@ -4119,8 +3804,8 @@ "h": 24 }, "frame": { - "x": 297, - "y": 222, + "x": 187, + "y": 392, "w": 21, "h": 24 } @@ -4140,14 +3825,14 @@ "h": 24 }, "frame": { - "x": 297, - "y": 246, + "x": 187, + "y": 416, "w": 21, "h": 24 } }, { - "filename": "747s", + "filename": "782", "rotated": false, "trimmed": true, "sourceSize": { @@ -4155,20 +3840,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 7, + "x": 9, + "y": 5, "w": 22, - "h": 20 + "h": 23 }, "frame": { - "x": 297, - "y": 270, + "x": 188, + "y": 440, "w": 22, - "h": 20 + "h": 23 } }, { - "filename": "2074", + "filename": "755s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,20 +3861,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 13, + "x": 14, + "y": 4, + "w": 13, + "h": 24 + }, + "frame": { + "x": 210, + "y": 148, + "w": 13, + "h": 24 + } + }, + { + "filename": "2053s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, "w": 24, - "h": 15 + "h": 22 }, "frame": { - "x": 231, - "y": 282, + "x": 223, + "y": 149, "w": 24, - "h": 15 + "h": 22 } }, { - "filename": "2037", + "filename": "760s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4197,20 +3903,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 + "x": 13, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 255, - "y": 282, - "w": 22, - "h": 21 + "x": 198, + "y": 273, + "w": 17, + "h": 24 } }, { - "filename": "744", + "filename": "807", "rotated": false, "trimmed": true, "sourceSize": { @@ -4219,14 +3925,182 @@ }, "spriteSourceSize": { "x": 11, - "y": 6, - "w": 19, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 198, + "y": 297, + "w": 22, + "h": 24 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, "h": 22 }, "frame": { - "x": 236, - "y": 297, - "w": 19, + "x": 204, + "y": 251, + "w": 17, + "h": 22 + } + }, + { + "filename": "807s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 203, + "y": 321, + "w": 22, + "h": 24 + } + }, + { + "filename": "762", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 207, + "y": 345, + "w": 18, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 208, + "y": 368, + "w": 17, + "h": 23 + } + }, + { + "filename": "762s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 208, + "y": 391, + "w": 18, + "h": 23 + } + }, + { + "filename": "782s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 208, + "y": 414, + "w": 22, + "h": 23 + } + }, + { + "filename": "2076", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 210, + "y": 437, + "w": 21, + "h": 23 + } + }, + { + "filename": "743", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 230, + "y": 171, + "w": 20, "h": 22 } }, @@ -4245,8 +4119,8 @@ "h": 22 }, "frame": { - "x": 255, - "y": 303, + "x": 230, + "y": 193, "w": 20, "h": 22 } @@ -4266,201 +4140,12 @@ "h": 22 }, "frame": { - "x": 275, - "y": 303, + "x": 230, + "y": 215, "w": 20, "h": 22 } }, - { - "filename": "746s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 277, - "y": 290, - "w": 18, - "h": 13 - } - }, - { - "filename": "749", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 295, - "y": 290, - "w": 21, - "h": 23 - } - }, - { - "filename": "722", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 305, - "y": 156, - "w": 17, - "h": 18 - } - }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 310, - "y": 174, - "w": 17, - "h": 23 - } - }, - { - "filename": "741s-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 310, - "y": 197, - "w": 17, - "h": 23 - } - }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 322, - "y": 155, - "w": 18, - "h": 19 - } - }, - { - "filename": "749s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 327, - "y": 174, - "w": 21, - "h": 23 - } - }, - { - "filename": "2076", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 327, - "y": 197, - "w": 21, - "h": 23 - } - }, - { - "filename": "2076s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 318, - "y": 220, - "w": 21, - "h": 23 - } - }, { "filename": "754s", "rotated": false, @@ -4476,14 +4161,14 @@ "h": 22 }, "frame": { - "x": 318, - "y": 243, + "x": 230, + "y": 237, "w": 20, "h": 22 } }, { - "filename": "728", + "filename": "732s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4491,16 +4176,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 + "x": 10, + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 340, - "y": 154, - "w": 17, - "h": 20 + "x": 211, + "y": 228, + "w": 19, + "h": 22 + } + }, + { + "filename": "739", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 230, + "y": 259, + "w": 20, + "h": 21 } }, { @@ -4518,14 +4224,14 @@ "h": 21 }, "frame": { - "x": 357, - "y": 153, + "x": 230, + "y": 280, "w": 20, "h": 21 } }, { - "filename": "789s", + "filename": "2050", "rotated": false, "trimmed": true, "sourceSize": { @@ -4533,41 +4239,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 + "x": 13, + "y": 10, + "w": 15, + "h": 18 }, "frame": { - "x": 348, - "y": 174, - "w": 23, - "h": 20 + "x": 215, + "y": 273, + "w": 15, + "h": 18 } }, { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 348, - "y": 194, - "w": 22, - "h": 21 - } - }, - { - "filename": "744s", + "filename": "744", "rotated": false, "trimmed": true, "sourceSize": { @@ -4581,14 +4266,14 @@ "h": 22 }, "frame": { - "x": 377, - "y": 150, + "x": 231, + "y": 301, "w": 19, "h": 22 } }, { - "filename": "762", + "filename": "734s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4596,20 +4281,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 + "x": 9, + "y": 10, + "w": 25, + "h": 16 }, "frame": { - "x": 319, - "y": 265, - "w": 18, - "h": 23 + "x": 225, + "y": 323, + "w": 25, + "h": 16 } }, { - "filename": "762s", + "filename": "769", "rotated": false, "trimmed": true, "sourceSize": { @@ -4617,41 +4302,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 339, - "y": 220, - "w": 18, - "h": 23 - } - }, - { - "filename": "741-pau", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, + "x": 8, "y": 6, - "w": 18, + "w": 23, "h": 22 }, "frame": { - "x": 338, - "y": 243, - "w": 18, + "x": 225, + "y": 339, + "w": 23, "h": 22 } }, { - "filename": "741s-pau", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4659,20 +4323,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, + "x": 8, "y": 6, - "w": 18, + "w": 23, "h": 22 }, "frame": { - "x": 337, - "y": 265, - "w": 18, + "x": 225, + "y": 361, + "w": 23, "h": 22 } }, { - "filename": "723", + "filename": "2074", "rotated": false, "trimmed": true, "sourceSize": { @@ -4680,16 +4344,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 + "x": 8, + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 357, - "y": 215, - "w": 17, - "h": 22 + "x": 226, + "y": 383, + "w": 24, + "h": 15 } }, { @@ -4707,8 +4371,8 @@ "h": 15 }, "frame": { - "x": 397, - "y": 149, + "x": 226, + "y": 398, "w": 24, "h": 15 } @@ -4728,12 +4392,54 @@ "h": 20 }, "frame": { - "x": 421, - "y": 151, + "x": 230, + "y": 413, "w": 20, "h": 20 } }, + { + "filename": "744s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 231, + "y": 433, + "w": 19, + "h": 22 + } + }, + { + "filename": "742", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 231, + "y": 455, + "w": 19, + "h": 20 + } + }, { "filename": "775", "rotated": false, @@ -4749,369 +4455,12 @@ "h": 20 }, "frame": { - "x": 396, - "y": 164, + "x": 210, + "y": 460, "w": 21, "h": 20 } }, - { - "filename": "742", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 377, - "y": 172, - "w": 19, - "h": 20 - } - }, - { - "filename": "775s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 417, - "y": 171, - "w": 21, - "h": 20 - } - }, - { - "filename": "778-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 396, - "y": 184, - "w": 21, - "h": 16 - } - }, - { - "filename": "778s-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 417, - "y": 191, - "w": 21, - "h": 16 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 441, - "y": 166, - "w": 21, - "h": 20 - } - }, - { - "filename": "2019", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 21 - }, - "frame": { - "x": 438, - "y": 186, - "w": 21, - "h": 21 - } - }, - { - "filename": "737s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 462, - "y": 172, - "w": 18, - "h": 19 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 480, - "y": 174, - "w": 21, - "h": 20 - } - }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 459, - "y": 191, - "w": 21, - "h": 19 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 480, - "y": 194, - "w": 21, - "h": 19 - } - }, - { - "filename": "2019s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 21 - }, - "frame": { - "x": 370, - "y": 194, - "w": 21, - "h": 21 - } - }, - { - "filename": "723s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 374, - "y": 215, - "w": 17, - "h": 22 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 391, - "y": 200, - "w": 21, - "h": 21 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 391, - "y": 221, - "w": 21, - "h": 18 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 412, - "y": 207, - "w": 21, - "h": 21 - } - }, - { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 433, - "y": 207, - "w": 20, - "h": 20 - } - }, - { - "filename": "2027s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 412, - "y": 228, - "w": 21, - "h": 18 - } - }, { "filename": "742s", "rotated": false, @@ -5127,14 +4476,14 @@ "h": 20 }, "frame": { - "x": 433, - "y": 227, + "x": 231, + "y": 475, "w": 19, "h": 20 } }, { - "filename": "2088", + "filename": "733s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,20 +4491,83 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 + "x": 8, + "y": 7, + "w": 23, + "h": 21 }, "frame": { - "x": 453, - "y": 210, - "w": 21, - "h": 18 + "x": 103, + "y": 463, + "w": 23, + "h": 21 } }, { - "filename": "2088s", + "filename": "2076s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 103, + "y": 484, + "w": 21, + "h": 23 + } + }, + { + "filename": "738", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 126, + "y": 463, + "w": 22, + "h": 21 + } + }, + { + "filename": "738s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 124, + "y": 484, + "w": 22, + "h": 21 + } + }, + { + "filename": "2037", "rotated": false, "trimmed": true, "sourceSize": { @@ -5164,15 +4576,99 @@ }, "spriteSourceSize": { "x": 10, - "y": 10, - "w": 21, - "h": 18 + "y": 7, + "w": 22, + "h": 21 }, "frame": { - "x": 452, - "y": 228, + "x": 148, + "y": 463, + "w": 22, + "h": 21 + } + }, + { + "filename": "2037s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 146, + "y": 484, + "w": 22, + "h": 21 + } + }, + { + "filename": "747s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 170, + "y": 463, + "w": 22, + "h": 20 + } + }, + { + "filename": "741-pau", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 192, + "y": 463, + "w": 18, + "h": 22 + } + }, + { + "filename": "775s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, "w": 21, - "h": 18 + "h": 20 + }, + "frame": { + "x": 210, + "y": 480, + "w": 21, + "h": 20 } }, { @@ -5190,14 +4686,56 @@ "h": 18 }, "frame": { - "x": 474, - "y": 213, + "x": 231, + "y": 495, "w": 19, "h": 18 } }, { - "filename": "757s", + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 104, + "y": 507, + "w": 21, + "h": 21 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 104, + "y": 528, + "w": 21, + "h": 21 + } + }, + { + "filename": "2052", "rotated": false, "trimmed": true, "sourceSize": { @@ -5206,17 +4744,143 @@ }, "spriteSourceSize": { "x": 11, - "y": 9, - "w": 19, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 125, + "y": 505, + "w": 21, + "h": 21 + } + }, + { + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 125, + "y": 526, + "w": 21, + "h": 21 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 146, + "y": 505, + "w": 21, + "h": 20 + } + }, + { + "filename": "779s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 146, + "y": 525, + "w": 21, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, "h": 18 }, "frame": { - "x": 473, - "y": 231, - "w": 19, + "x": 104, + "y": 549, + "w": 23, "h": 18 } }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 103, + "y": 567, + "w": 21, + "h": 19 + } + }, + { + "filename": "741s-pau", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 102, + "y": 586, + "w": 18, + "h": 22 + } + }, { "filename": "731", "rotated": false, @@ -5232,14 +4896,14 @@ "h": 22 }, "frame": { - "x": 316, - "y": 290, + "x": 102, + "y": 608, "w": 17, "h": 22 } }, { - "filename": "771", + "filename": "741s-pompom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5247,16 +4911,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 + "x": 10, + "y": 7, + "w": 20, + "h": 20 }, "frame": { - "x": 316, - "y": 312, - "w": 18, - "h": 13 + "x": 127, + "y": 547, + "w": 20, + "h": 20 + } + }, + { + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 124, + "y": 567, + "w": 21, + "h": 19 } }, { @@ -5274,33 +4959,12 @@ "h": 22 }, "frame": { - "x": 333, - "y": 288, + "x": 120, + "y": 586, "w": 17, "h": 22 } }, - { - "filename": "736", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 334, - "y": 310, - "w": 17, - "h": 13 - } - }, { "filename": "778-disguised", "rotated": false, @@ -5316,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 350, - "y": 287, + "x": 119, + "y": 608, "w": 17, "h": 22 } @@ -5337,14 +5001,182 @@ "h": 22 }, "frame": { - "x": 355, - "y": 265, + "x": 147, + "y": 545, "w": 17, "h": 22 } }, { - "filename": "741", + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 145, + "y": 567, + "w": 18, + "h": 19 + } + }, + { + "filename": "2027", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 137, + "y": 586, + "w": 21, + "h": 18 + } + }, + { + "filename": "767", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 102, + "y": 630, + "w": 24, + "h": 14 + } + }, + { + "filename": "2027s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 96, + "y": 644, + "w": 21, + "h": 18 + } + }, + { + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 117, + "y": 644, + "w": 17, + "h": 18 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 126, + "y": 630, + "w": 24, + "h": 14 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 134, + "y": 644, + "w": 17, + "h": 18 + } + }, + { + "filename": "778-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 137, + "y": 604, + "w": 21, + "h": 16 + } + }, + { + "filename": "728", "rotated": false, "trimmed": true, "sourceSize": { @@ -5355,12 +5187,33 @@ "x": 13, "y": 8, "w": 17, + "h": 20 + }, + "frame": { + "x": 158, + "y": 586, + "w": 17, + "h": 20 + } + }, + { + "filename": "737s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, "h": 19 }, "frame": { - "x": 356, - "y": 246, - "w": 17, + "x": 163, + "y": 567, + "w": 18, "h": 19 } }, @@ -5379,14 +5232,14 @@ "h": 20 }, "frame": { - "x": 373, - "y": 237, + "x": 158, + "y": 606, "w": 17, "h": 20 } }, { - "filename": "722s", + "filename": "2088", "rotated": false, "trimmed": true, "sourceSize": { @@ -5394,20 +5247,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, + "x": 10, + "y": 10, + "w": 21, "h": 18 }, "frame": { - "x": 390, - "y": 239, - "w": 17, + "x": 150, + "y": 626, + "w": 21, "h": 18 } }, { - "filename": "736s", + "filename": "2088s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5415,225 +5268,15 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 351, - "y": 309, - "w": 17, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 373, - "y": 257, - "w": 18, - "h": 13 - } - }, - { - "filename": "741s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 372, - "y": 270, - "w": 17, - "h": 19 - } - }, - { - "filename": "759", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 19 - }, - "frame": { - "x": 367, - "y": 289, - "w": 17, - "h": 19 - } - }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 368, - "y": 308, - "w": 17, - "h": 17 - } - }, - { - "filename": "759s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 17, - "h": 19 - }, - "frame": { - "x": 391, - "y": 257, - "w": 17, - "h": 19 - } - }, - { - "filename": "774-blue", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, + "x": 10, + "y": 10, + "w": 21, "h": 18 }, "frame": { - "x": 389, - "y": 276, - "w": 17, - "h": 18 - } - }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 408, - "y": 246, - "w": 17, - "h": 19 - } - }, - { - "filename": "774-green", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 408, - "y": 265, - "w": 17, - "h": 18 - } - }, - { - "filename": "777s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 425, - "y": 247, - "w": 17, - "h": 19 - } - }, - { - "filename": "774-indigo", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 425, - "y": 266, - "w": 17, + "x": 151, + "y": 644, + "w": 21, "h": 18 } }, @@ -5652,12 +5295,432 @@ "h": 20 }, "frame": { - "x": 442, - "y": 247, + "x": 175, + "y": 586, "w": 14, "h": 20 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 175, + "y": 606, + "w": 14, + "h": 20 + } + }, + { + "filename": "757s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 18 + }, + "frame": { + "x": 171, + "y": 626, + "w": 19, + "h": 18 + } + }, + { + "filename": "741", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 172, + "y": 644, + "w": 17, + "h": 19 + } + }, + { + "filename": "778s-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 189, + "y": 485, + "w": 21, + "h": 16 + } + }, + { + "filename": "741s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 164, + "y": 545, + "w": 17, + "h": 19 + } + }, + { + "filename": "753", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 168, + "y": 484, + "w": 14, + "h": 19 + } + }, + { + "filename": "753s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 189, + "y": 644, + "w": 14, + "h": 19 + } + }, + { + "filename": "759", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 19 + }, + "frame": { + "x": 167, + "y": 505, + "w": 17, + "h": 19 + } + }, + { + "filename": "759s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 17, + "h": 19 + }, + "frame": { + "x": 167, + "y": 524, + "w": 17, + "h": 19 + } + }, + { + "filename": "777", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 184, + "y": 501, + "w": 17, + "h": 19 + } + }, + { + "filename": "777s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 184, + "y": 520, + "w": 17, + "h": 19 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 201, + "y": 501, + "w": 16, + "h": 19 + } + }, + { + "filename": "761s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 201, + "y": 520, + "w": 16, + "h": 19 + } + }, + { + "filename": "746", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 184, + "y": 539, + "w": 18, + "h": 13 + } + }, + { + "filename": "774-blue", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 181, + "y": 552, + "w": 17, + "h": 18 + } + }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 181, + "y": 570, + "w": 17, + "h": 13 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 202, + "y": 539, + "w": 17, + "h": 13 + } + }, + { + "filename": "774-green", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 198, + "y": 552, + "w": 17, + "h": 18 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 198, + "y": 570, + "w": 18, + "h": 13 + } + }, + { + "filename": "774-indigo", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 189, + "y": 583, + "w": 17, + "h": 18 + } + }, { "filename": "774-orange", "rotated": false, @@ -5673,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 456, - "y": 246, + "x": 189, + "y": 601, "w": 17, "h": 18 } @@ -5694,33 +5757,12 @@ "h": 18 }, "frame": { - "x": 473, - "y": 249, + "x": 206, + "y": 583, "w": 17, "h": 18 } }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 442, - "y": 267, - "w": 14, - "h": 20 - } - }, { "filename": "774-violet", "rotated": false, @@ -5736,8 +5778,8 @@ "h": 18 }, "frame": { - "x": 456, - "y": 264, + "x": 206, + "y": 601, "w": 17, "h": 18 } @@ -5757,8 +5799,8 @@ "h": 18 }, "frame": { - "x": 473, - "y": 267, + "x": 190, + "y": 619, "w": 17, "h": 18 } @@ -5778,8 +5820,8 @@ "h": 18 }, "frame": { - "x": 406, - "y": 283, + "x": 207, + "y": 619, "w": 17, "h": 18 } @@ -5799,12 +5841,33 @@ "h": 18 }, "frame": { - "x": 423, - "y": 284, + "x": 203, + "y": 637, "w": 17, "h": 18 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 203, + "y": 655, + "w": 17, + "h": 17 + } + }, { "filename": "774s-green", "rotated": false, @@ -5820,14 +5883,14 @@ "h": 18 }, "frame": { - "x": 440, - "y": 287, + "x": 215, + "y": 552, "w": 17, "h": 18 } }, { - "filename": "753", + "filename": "771", "rotated": false, "trimmed": true, "sourceSize": { @@ -5835,16 +5898,58 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 + "x": 13, + "y": 11, + "w": 18, + "h": 13 }, "frame": { - "x": 457, - "y": 282, - "w": 14, - "h": 19 + "x": 216, + "y": 570, + "w": 18, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 232, + "y": 513, + "w": 18, + "h": 13 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 217, + "y": 513, + "w": 15, + "h": 18 } }, { @@ -5862,33 +5967,12 @@ "h": 18 }, "frame": { - "x": 471, - "y": 285, + "x": 223, + "y": 583, "w": 17, "h": 18 } }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 488, - "y": 285, - "w": 14, - "h": 19 - } - }, { "filename": "774s-orange", "rotated": false, @@ -5904,8 +5988,8 @@ "h": 18 }, "frame": { - "x": 385, - "y": 294, + "x": 223, + "y": 601, "w": 17, "h": 18 } @@ -5925,8 +6009,8 @@ "h": 18 }, "frame": { - "x": 402, - "y": 301, + "x": 224, + "y": 619, "w": 17, "h": 18 } @@ -5946,50 +6030,8 @@ "h": 18 }, "frame": { - "x": 419, - "y": 302, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s-yellow", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 436, - "y": 305, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 453, - "y": 305, + "x": 220, + "y": 637, "w": 17, "h": 18 } @@ -6009,11 +6051,53 @@ "h": 17 }, "frame": { - "x": 470, - "y": 303, + "x": 220, + "y": 655, "w": 17, "h": 17 } + }, + { + "filename": "774s-yellow", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 219, + "y": 531, + "w": 17, + "h": 18 + } + }, + { + "filename": "774s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 232, + "y": 549, + "w": 17, + "h": 18 + } } ] } @@ -6021,6 +6105,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:be37a6c6f866e26c7e4deba1514c5a68:cb56f7bd9b13cc1604b5814449582c05:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index 5e6421360fdbbcfce36acf687bd3395ea46656c1..8c8311b1d0b9269c18570345f54b5b734b6b3612 100644 GIT binary patch literal 52044 zcmV*EKx@B=P)O8)@y8r+HbairBT4INYgS3ZZR#QguR8{xyrLyDg zTg;;&At8ZaI`_GGGelzK&M|gV2=KDo%sjtSqqdY`dfv)p; zlwpC3L19zZyl1b7;)TKDyh}AbbjX2sUi|p7v)5T3TA?*F(vGgflxk&XibET2f%Gopn}0O0|Lg z%}|b%*8I%VzoJ2xigBN7R;;$l?WnTdqB^RAeA(ycX2|S_bHMRwQQ7tVrOe*>pOSn$ zKRtr4Ia7pcYiW#Kxg|}0*ld^6wwL$q5t(<)SdZo3;{Kr6?$z>^*kDdWy4&i}z?PJe zs@HRhZKhqN;dGG3oPiRfqlE5UcJGX=!rSfss8sQmN4NI(c%!9%kgxmlUvQvi{_fVl zvy{NG_moar``+DfTMk#P`24*{%(m zeD2|LHKF;t;LL4dyP{KY_}?#CblCaf_?oor(wyFe+x|*gcipFu^xe7{IogY|jsJMl z*xA^(q6?-~rqs3zGkQ1df<{S<$m+oHnqD1lr$w1+x@yvPi8s#c>wOhaZ^PQmi&GFqW`l)P%eCPK9C zpZ0pi?CD|Y*@w`uadS|CREa#Uz;}!0r2WU66d!}WgsIT|9u!qprdA#v)8Ly@g>00001bW%=J06^y0 zW&i*H32;bRa{vGi!~g&e!~vBn4jTXfAOJ~3K~#9!yuA%@mDRQX9|*^_AL2=J&IA)6 z2?TiwA_NjhNhkthP$X~#1b+dM0#V)-n-mL(K`Ri(0kpgbR&N;*sn)9e#p;h@>A+PP zncI=7Rd45ZuD8}1Z?)reuG3pPxAXt5wfFNp`*}M_(D^-iR6DGvJDqSG@H-63w|MqW`NZudUx>$4?+t{e6 zOX2I*9O$6#JuD^YaqRpK0ZpR{M`?5_^q-2U0X=DE;UcT3bRjZVWdH15{1N-+^sYG^aY^0#@W1dH#DPO+F-K1fe-o1N+T&`h8^{qc=>QRNG zN8vJWfAmcEX#hHD)271Fg_|~QGD06cbCO3sVFK9AAH7ZHAqEEV1+@zF_<7+1MdV#s zIgrWM@popA>GRBP_{k^&1-qqS6Q%RPPWky!*=zEm7P-JaY*;2BePZg-LSE{kkM_|= zZ`w2(Uz;{{y6B@P`RWez)C8X$kCd0=hk<9&<16x(23A%U6%Ax^CpD1K)b_1DLd=M59`qL#7$?Tl^7q>55de7n~(I)jfMU8?m4 zPdM7#1VJBNSP1$~>G0_GlSZ4HKnoU3z-P*1PZ7Y&_1n6j1rKl)QF)M87NrC|CFo3! zd*Ml2BaQ`QqiUBMAn!_x-EGgK>zN(s*I&>0ar!RksopLB{ofEeqf4iE*@?8SkH!z; z4$roZN;Uf=MlYNR`q7(!y{V9G-K0*<4s=|p32&#guG9Qfd3nnH2VKzM5IaY8zHYkx1nDI{WeLs^Mc8WpIWT5U2-vg`H zOTR9JwwD43q@eR!*HaAsHlx#^Pdt6U zKtT&MaJ-w@LKKVSEF4@+qUaP>ie$%ISXCi@%@1p8)nd1 z(S7vZ!{on0+J&s~TJ-4dTHK5dDNCcs9KWEuYjIoX&~|iopwoo6A#(hd(&V3f!kW%v z4=Lin@#E3`Kt6Yjf~Zm{h#e0UrSkI!8ZwPeYOHXx=rz2H-pGBN1r2tHeE)NRH@*LQ z{_yFCr5Ihywf3=%a*Z7;-QKls zd^d^2s9&E3dHZwwJ*n@%%Tj(uPYp}8jKv#EwX`t0T*I^}2is?#jTXW4Rr-~u?~|;? zLTT)5w)GwNZ$2&-J9~HB>bKu!cKLfI|HS!36@KzbVGRW>Tx$G4ps! zFJ?ne<~#7!S8Pmi115Dw8aFjJvxzrWE>k{V4BGk^F!tC zFCb^B*YKY%_t6KkY=v-OYTddq9LV+`11-oC|K>S&22^9Gg56xE%LjVAs5o7p#s$_i zD}-z6$%M8By|?M(`Zl;;9dX=ePd@pXi(Sg#UwvgdJmNU7kz*PLZ*K0KS<;w?=MK0_EwfqG=#pKczSn$4YS86K5%T=f0$0|$aV&w9~ zuj`P8#L^pTQNCeDyN5|AE6l@sr+T|$fAYyupN;abQh<;8%8h59d~(xgoBXR2;G3GQ z5T44R@Ds#>@=c#V-%@R`f1+yCC!f?<>j9x_ z`1BQ5u-wtty)lj7(S3AJ{u%Qa|IeADC6W_MhF<;^E4>%N&m7(9HKLa{v(meL9nK8q zjSTtx2^1zrWHZP%?ndZQ^iJr3w4&Ld*FnNAIoMt2*67(1cd!PHht$#4)2?TC$8g-O zJ@jGbw~RJjaOJDVr5${PcZKF&RBzLxm}&&(%DT|#%U za|4aO=d;4=9>D()ov1Wnjj&JE=tkWe1L%6h3e^2V4)!!8Pkua)4sHZI3<4kKq1#b> z9_ct1D$mg90v>uEyg0|Pot;p5hDH}KUL6rTzd9>ANAcw>_jswZCm@499v#{xA1^wt zwP0Z7c#*p8-o~x~( z;YkeNXgfQ#sae={FP}7X=4h9k2j=B$<2j(CXs(I|iPSNKBgs|_WU+dd4Cv$KT{@cG zpbzv1?Nm2b=;gCc+2p<*hnUm*)9l}fu6N@)m)&G!Lg?-Q#zZz>jV5jD(e{2c~9RZvKvYeoykjw{(*a-tTGG;DilWTUz(PB^O7&qV}>c)DW-5RTpBr=cl7n77al%|q{<@k2Te=AU$E`31T|ACPdah(onRKUvl|A8a;>$!*T7j|s}$VNvm z=fPUWF`Ye?DN6Z5pD7tB)^zEYL7~r-j1=TOn&WprBP~#G>yi3`R1t;Jh7da3`k+CI zs77h@JUi_!>;uK_=}y4?VPI^6T$I1DF%}&botZhRAkCk29;;NMMH5X}Tb)DXISQLZ|~z{(=mnI~6b+$3evvxw*u z&~@nreW`bH0VdqZ^FnGrb5dRpYD5^YszFM6d+yT7z?{TE#m`ZBqEOu=^q;$^JoU8f zL|wjB7WyE{jXm&^%V|XaFY0Y^jikD)2txFZ%2jhaefo4NCp*ne{Bt@d5zPZ%zutE8 zWNf`Hu@N$5cnV1&Wae{M8xP=W8JJV1iRhYKqsPBWH|lNRqT0KiyY*9@q)6jicUMIk z>4_&ay#H45NM7K99L7zCsRs_IR3f`T)7-gnWb9WSxTu9L=;zK6^|amwFvq!D)jE#j zCb`#<)mT+^w|c9pswo_J!;dJB~QZR-Jz967QwfnL|#K;FXNTViT%f{kI>T(HyJ zxgpupMS9?zVs@kNWWk%CrruU7S6sdAq;edkxDr+G()mM#ld7sp;j5}@VYrdjuUBf$ zob?CXe?NhLDXj@^e^B%1tC1t);C0Q7$(__dMi127_^)4pT<4}=m@{|ooH-G4W3$=}amcA(Fh!}!r4PSDeoeqgKnejeb9 z{CnZn+iDjqsEw_+0iDV50|d@VHfK~{Pi|uslj8>(t90W+kDW>9tX~gkmbH3fj=<|1 zF;ZVF_>s~2i(7L$z%{p)1EHE5zcQHdTKN6~lNFfhrr;tmI!10{mhw5!m z_n3N{T6a>Z+IqmT(%07BEzsnU*Z9^#X{^FMxLcs9%1^p7IYj@&`t{t+@ymfH)^nc# zd1WP&Uw56zJ;?6X+)nG7+ksR|xaP)M&QgD&733^*?K)ntEC-`!vllIN8R3+idw{xC zZ-cZ?vc`+(Vd-3PJFLZ3(kL>23$m{=;`Y(G!z&@@PyEUHCtBAVsjHEi{5sb8`6DT& z=63q@?{&=$Vh`5b=CYu{4w1j`9N_iqzA%SBd@Fh}JLLh8Z%vbpUSgr=sJB6!@_BL{ zx_fPXeZ6bx7~N_F`ND;+qTA?f+*r$%YCQmE+<^7k5Nd@7`ev5Jx z^vae{&5gvU&q;&4{ka!BslRZyrTjooPXYN9Eq3}4V|Iau*zI~-?Ey}B*VYE>ZNm1` zpF+5*R{pA9dHQZQz9o$dRY>1O<5MZk{zU76^@_!By87giBPT00S#7>v;=Ez+Oy4N^f_YRH7*G`9x&{JzI93(K2FG8c(=FfdK-c!bmdUJtzNDB=}&)p z@4XDU?xa?Ij!mhaty!e8N;fXFJbB7dDJc9CxBW4n zw0B2jqeZ`v8>{@rD!D9jR(A*Z44#7A`EvW=v+$vso1jN)ZX`x7PyD(LX-F)+ zp*F$27&(vwJ>C1~*|ZmLX!I`YZO%^}|ElM>&U^b$K3VnCD*sx@ab3tm6YDy(-oXt> ztyk+kRh&E-LKw-__xTEn?@GO!H8(+rC)1t%1@7E5M~C!*INp#ya4!Ax-dWF|=Lvh4 z^)^QfS_iT$bye?p&rqcWtpiz>x>{Hj9F{4q=J0K)RO|XV7CMQM2lsqfd1b6zH*0Pj zva@4n@>YDziI&sM%k+k}r_Y_6auKmj_MC5o9-yx4ZHfiW{!97yz`uDcXleBCK@fet z7%C27=NvfTlWTN^Fiz~8OP-_VHhZ>Jb0cld=FCaAwzAyk+T}DWriFWhWrKfvAbs&- z_FUGldr>#)ZR?aoa>kO?D^_|hf?uZ=T8#@8EB!(WDZJug4BT3)ukLPDgdpybU{{l= zi<;Z)K+TQZ!5TCkQb$)$yPn-1!_n3>hchtj=?@=(zGuq=srN4HZR<=#$Nsy%9tO+t z1~1%LpS9dRBS_v;lP8x|zkU5YTO=p48mTK%E2G7la(_Qcknuc|jMK zju9Io+9?lYd-t|-@7=1maU5G)%LcAqhHdqh-Y`3YIW}+$W!SbbV&{11I_C+Ht2yC( z!hATm%|M6JQ(pILZpMyF)Y2;GY3}wqoVUeJTek{&c1n86MUba$v3IB5<|tv;y_|3p z>~~+KgkAS?!cB-|kubz!eq6EW7|L)c@0j9Cw`y)4+Y2ytY4&gYG6vipyz6ej=xGQY z*51kubgSN0&tV#m+Z_Jk1XX$=H}bfxihop5Yz+eMOwCad^7%5tA4zoGNas>&Zj_$G zQH>tOX=s`o&DflKAe)^sC0kOG%>q7VmTY3ZO^J@<$K4o@uk$ldrg7oIq{c4Nk9uYe zai#))U)uAU8xPl^Q&995gk9SJiX<*LS&+>twH3i^lss3xZJi!#!N5i9ZEhnBTuftE znP`sUNQN#{s(M~?;{iG|b5vuO(_+$9fCu@{V=|N7s<+kFQeyrcy_|ZUh8K08Pf5w* zu4`^`w`H78U8Lq&>wf<8-Vvd9tKJsw<$=bSUf!)Vd>4g{?$q2w^j)Is;4Vh&-Ke+a z=*O{*)Y1}8!{ZS<4c}e(u4+$RmeZ`qe@;oIr*E+AM5?9b*m*k*kAH{tKpJ-c;0M&5 zH{SDVTKDRn-F?m6H^FbB^XHX1cI^CWH?(TOzm(R5;Gg{92f>Ui<=1xkKIkRsJ2%oL zP{uU|XDH|Rvp@YQ!7x#;UY35JKL$B_X?V`L;46-NUVywdKfkN>Ynoi6CkcWkPRt>p z;M5i>EbIY0wYIiWl)M)OG+rG$e;&{*Yt?d0;Dc{9LN4=MWOb1x{E)4r-Mh8W1^vvK z*y{bZZ4=`b*vT(%Pk1{pqY3DjUryapZTb^~M@_X&E+!u25Pi$}^W4qx%j%Z%6i{yh z`Mk(21iRrkZZ+S3^R%1NyWeAWqwi$F`~7X(#ED=xf3}UxL+0OO-yZ9{O#$*uqzA;S z0mXr@Qm-quDrm6ID*($C&+KN3Y1>8zT}tkC%KZ>_W^Ma|HR+C#OPY+ z(tJk4li&HF?m$mX^x5&q!w;L4fO6$RmmW|U8^%O+T~@8F3N6}VA!>c?fa8>7FJeu>gIzU2PhjeL=RFL;&NM0}<^_7nm9 zVRxnB*tg#v8_@U51>F|P<(J2>6S_Kg_P}GjR*}J1T?o!CNToD;OY7?Mip8&?A!}l% zrmvMN-7>9No>H5y7(TyUiyx0`ah2*`0I8>60{Izo$?v=GzB7XFqw_MeiQ7_I*J(oP z;fGWDA3TX~f~-R#w+|Iw{t?*CLS3VI&gBtwY6UpHY{AnFt1hf^uTUDE7mIQlzD1p9 za_^=<)m`?LPA0<6@TH|j^Od{GN(+DYd+(*wyDjwl_&RgOQg^e!4mz)OJ;mVLwwXVe zFkwQfk_O0xMxMbc=$GTWtXr-KlxeG*fK)<{Y-!mS240;}IR2w%sPOH;uvp3(M)D1U;7HFb#pVw*l zW2sb%eOqX}3;2~QGtNq9_e!@f>#5xBwR#F~ZLM_sQg{7YsgM5BnKN4KtOW0A_#2I~ z%8D{sU^kJ4&g3a(ccnfcHDG|A!bq~vy6*Dd{SHFUe3aozx{LnN<%MLMU)tzw+_+Jx zjrL%MZn&ZOhSzV9-X3sWtm|$X{=7OL)F0UPrIO->+~=8Y#=RPL9VV`px!aW%znC|2 zg`Y=){?eH=8+s;p;dO7P#~yoZ0xLDd&fXpGeA_l=cgcZ1(5bA{YeR|WSza#anaeN# z2*7o9WY7z>IdGf-Jh@;aUyiep|7o#9=C8l5#MoJ#U8^~KTPoFh{@D3&)NltaW%!l5 zT|)P@QKm6nsy_|(^-1&J)-wS?7I1}hbM?(Tj1JwqK93t z3UXW??H?jL;=Mc1{60gf6l&e=F_9K#31u5M6IJ@u4Y74UCx>wIwtdu;XU zFge=)l`=(lkXo6^_~?*v?bO;@cm0~_@^+7R$+?<#-;Gu^4e%z)NkNMrX7q_(|9;r} zV;1^=0WSIg554Y(0RN$nE*ekx@4~7EIOA|_aGY`cfEPqvxB#hZzaFshEo|4B{(P&7 zlB+d}(eF?yV=Z0)>r{r9>q{jTp0yw#a}oN_fgY@;-RFv(7uX?&fp>e%IJAfTcQv4L zKxL&NuhiB~i{1Ii`QZ->O<#A|&`B~9@T7%5ZUe4yP=NsqZ}jQ)*Dv66)vAEX69#MN zS?LkbM$l>AJg^rP{VTrPZb8@?9>7}j;o#WX+3vxR-*_Ka(=31Pvp)=lM@)lmPvPMT z*eg?JMfHG6gHCk0<9sCKB6N{@9nnoU-6VaRoa4v;*DXE{P|^jA@qHa#U5UmA+#4(V zv12VDSI464YecEntg-(@44b=tP0;g2>_HnT)im_(-RbO&+53En8jW|@olTrrG(i^F z!Q?$0a4wap$_W#SV7rX)!On0Qx2J2N3;OYm8*duGX3qKF<8uA4=mA19rMo<&4tUi| zHeU#svSY`{%n=BogM6N1U0=iKSP0vCXH4sCOu?u5E z;;pT{C?*YmOdV6vh!`=Q7CP>N8Nbn&JbA@hzgAi*&aE`?-Vwu_YTA1@Lf0j{-s;Qeqk>twXD7hW#puJ~?JG~oD65c&Y_=;|izBQcWWwG2-wI5^eIMejQ6 z!9v%)J;0vNYF?|?uZeGCaurJ7z4VfxXV0Y1>;}1AO#}JE5}vbj-^Stl1V3Tpl5-@R z3a!90=q&n=epiQ)Y+WctLdRkBj&m>Pe+hXWFWdn)DVBOKVW(=HnxdTOtnj-tWGe;# z{$;Ju%jcIWLhdED89fc5+toBC2Ri(EN^Bj5Cw{Jq$ywc{ZkdWMyvsO1|LAvxze99O zb#cjK=@=WyO61TDAkU+xMB|yAs;dccADv3hV$u)T%w<$u!QjhU&$F}SOXE`}_uZJy zo;j0+sq?F8zR(fCNg&G!8VU=&5@!DG=yFT8bC=i2_A@!87MatpCq}onD$Ne?>grRQ zs&NmJQouj>!R~|-jS>BqCZsD($dn<3&1TY09?9g>Ha$|0SzzZW z|AdV(r63;6Tz+{S<)o$!;df4U{Y=T-~m%G$K$%QxgGBQg4^9O$%XTDQ=8c2xbmq!+B((Sjq76sU+PRX}8bfP`&d%E5#ud80sMKz6jT%Vz?UXDsRt^qs+ z#;yRr-52^Pha8QL4+<9EY0sW5TlVmsix+*5%W0I`9_QN2F|phb|G!It4fy5uu${pJ z=!c!dM&kqQG>e2B=&tBP%tRHrQMwRKsKnDu#7l6f`M`l#K@S-cTfy?ys)Wc{-#0jM z*UUnHB#g*gU1l|^@=4RDg zOFRQA-jy;tJ^%dkVWamP`8U9Sbc5Q!^Z|9hJ(U8w?(LBIsXOlk_sW&V)}3Piu5aTk zH4W(Ou_1dEjO7G9n@(r5793Tiy~0`V%PzaD&(Wi!bC7fJTWUfQ;=oWfBQR{{pUutj z>;njAy3=8cc05HyW+Awefm&xt^A&Q?qT`om%4wp{?9=Ep&iua@Kva6`me{{OD~*AAkJu+p^}p zXS3M~(32t8Vo%a|Vs6FX{^0tWW-WMtt5}tXwo`)oM1>BGa-32HwWk32?Wt5CWCZ)2 zg3i$cH5;i>Ole6ge;0D;_>D$1JFI?FY5p-EuSxHG6V#i(S)0*K4Gyu_MrK11x;l6EIH^Z&705U64P;B_ksgHZKk1}WsbHM}YR}x&Y~qap zoF>;SwFlsP+SL|iclD#UJ$@UM9rW3f>}~jqijuOjiV9YEy@v~3cEuG}h{DJEI@fJOpod^)%3#{OD~UhvpwWdK=g)D$*71pD*rnMIW$76`p7(F7H0l_cgk= zmm`Zk=5`I);j z8-*NWeNJ`k*}^Ix=<1O4Z65hiz6li-70`7r7s2REA5nM)SBmLP2~~aH_~pdC9QEJr zQoD9J&hyUmA$9@pr=I(wUj&^mrP<-oI$5-vHwS|N63Zgd#KvkL9WuXx7Zz+$v)IyE z&zvr)$lhki+0qF)L|$S2pUW06?$hTAijp(93s0YZ3iOk?_Hs1cZ-kGw>1m;5=xmMG&o;nex1RD%9gt3KJQW-p(twfyIwd+l!OgMoXWT~ zWNW(_zoe|OTkL3?2I%7EELEad;ehU!Ubtuf-*iP*V}ByxHaYYiS8sqLs52A**C}8J zdcx>^IX)rrZYQnv=t{9a*nu7 zT*5uwCAWPQwLHmASn!~wsmhv3m zwW}dVB@O86eRk{z1)rV+`}@AwafQ*@!cBF_7v;>uv!!HoSUD?{)7(bYKlwzo{qazp z5%dV>F6$%gEc2rV9oLUo>D@5|&^OwP-Y(iV;`s4hIV)*j$VM0Hxr5Iw==z#C;1al1C(js+yY4VDAbT)Kg|3CjHMFp_%9Lynt z`&8|u1agr&!b`HV6}plJqZg{A8RssR?h8flzYp@jEZ*q6-UxfgqD3+6l;iHDA@tis zuXLkl8OmlRbW`Aqe><{Ed_`A%6lwR5NIz5>Hd$o!&+otjlMB~;ROQ81a#VU7CY z3%E7mx5sorP>MtEh()K#W_hC7>LfVYLlm7N{z5aUlmO{YDEkp><==OAOnocx5f4a54EAj{dyQ4$CMbUXB^JLPQY*J-q zVRjy_AI*Y29g~b9BXbPdxwC6mwy_lY{i%np?y;>1gbufU@gfxAoQg${8OI}vCoy#I zzaOw+)2A!hn{#?TB|JhKJ1}O@==cc0?Gtoa5l)Fkyi>YSZxr%} zKSanmmXoj8XJqi!*47atM%Zss3>#!0sxYx|^YahckP+5#)dU0OTJm(t>AK#~E3O+yOa%DM4qU2MwL1Co7Ipj#$7IdvN*WNyp)x z|H9<1=o9vG6!zq*a_Ggyq)m77-TH6LBO5>1NCff^{;D;e5ZZDyL5k6xcNEKB$(|=s z^e&5PSKn}T+-8=t`B_5!F!3p=HJ&};fAcurvCq~}D4zTj#k~>ucy#XR`G*d9em(MteiUlY+>6-68&ws%{!SUtWjZ`} zf-(wKS_{6xN^3&Vlx`um?fmja>cQorvfPADg`a6UJlS;Hx9LX;LMMmO2a4H)d3bk6 zCoy)aOf}i)VCE!dwjf)btJ1m{SB`rVIlwHYXiC}aEp$s(sVvC#Kn=cK-w}h(v%gAD zMdr+?=}IXJogcwCB7_bV2f3Yx*U?*98G|>8g;Vw}LK;0=U7gL&m|;Cy9jvr2Ui{;3 zR$3E_ro=lLWF34mIR{s_NL+JE_7*p(%CiE(=x$;%FkcxXs5jmyh@iW9_(dD7+f=65 z$^jhBO@Y7QG~0|B48GPwhZba;3c6ouZEI`uE3HXIQ%GGw=-KQYGy*~I9YPLnd>Qmp zRaMQWN>80~XMg%JyUt2lfy(qZa232^J<`0$&BMdD1#daz-lWRl+M1fm0{4$-?b;a& zW~^Pic7auCEvODwT9Y-Nm|O9;0D81&N?PdIJJbku2hg*(++yhU%QgdCE;2^%lxr_Y zC*i%29glz;*L1%ZG%t$D!|QmCRUHbCflMHjE2v%oW_;nwHt7>P_U~_Ms)pDL{7UQM zM2)95Q)z7rc=wp1DM#)s^(-s=9pwB2)c;_y`$Df0dV_xIlvGi8oK~bY-Ws{Rp*21b zly+?F*ccavH$mx}nwltJ-hn=2!P*5-cF<>=vOM*xplSd9f&y0fZdF>_yh>}ETWL)w znzGzk>acWd=Khh@(i&BG;>88?B9+#pqA9ohgAIHZHvk?MQqPX~ zhpX*Cop9<@f9l`gpr7*Rzp>CIS?wJyz(Oy`=WLN}=94@y%UbJtAP#_}7kK0|_$J^9 zq3hM*N^3;n^{NV)ULLHpT1C_A`i15Rz^%)cHCpQYDd?QUsycP5s()4g{>=v6CqIbL zl?xEwdK`WP3J(pxfp7`ahiPKeC=JwsuA!U3&qkJJpq-@BSk` z`yJ}C02N1ar>_6je_7Kx~tuxmM#1H-xYN^9&GZ-Me1@b zSR1aiE{?6V3LjTmKT)jiJe^`0MT(}Iuk(whZgCFk-b#*&nJTL1b`w!(f-`3#ZwrRX z7{LS|$s=B|HI;Ar9e$6e@5Ebu?%Dshx*)5umkYQ}o=|Dkb2(&fAd~x*R?+uB(RA~3 zo6+~Z%At(bA#`e`xHJYeSD!MoT|=&+s3;VpiG>e``crwCBEavka@jTCu@;wjp14WK zv)Q%gTF&6rT~=Bb>&5R)vKBC0X(ide(Jq>94x{s)Bh(t#A-StFdN>w6SadLidGL*c z;l8qLnfkk6<9f+Y+5?@+-J|X3wE0<}xs9qXUoP6dwyR3(;>F&&f2I#tTA4jiGzEH~ zXlm|Mba@`UyG-pp)s1bl;_|#C0>5Lbx@p-Aqv@S+p2ReLuQ`4+@kxFZ%XuA12yJ(s-9TvOYR8rZD)Rk8T z50oRlIQ8!@>4i|mHK*zHX%H7X<;CVSc7J*mtGbgFRV^5nncA1-|l1i=D=h_HOLi)fkfb*QZaPe!iTXW~aEgxTZ!+ z{j`;qKpZP7zhHkgv>+n&gi7l?c_nXIaK1f8m9U0SU*MwYb>Z>bgVpV^S<599AA`r1 z&FD&^HUIq2S6*qO;~gQUVQn8H|L1gZarx=u)88pB#yu$3bDFGK*@Q06?A+IhH`nP& zrPU(;K81^>f=-c%vef?IgA~*0by{*s)O_t*e}7Ebj5lFev*w@Og$*=D)83&4Ge!%z z++k=IKBR6m{GDdHS*eynP zniR`EP&Q-oYq*YR3>{5fdB+$IY4Clj*?5PZFBkIXzoXH=!wan<9jai#g6bYuT9+*= zEnUXh*tmLQUR2xJtvv{#w=;fq`@QIFX*XP_5=l$?=u4Jlh)=EpIW_HZG`n9mqifb& z<6Lv)8aFze3a2jI9Mw#9yY=(W7eD_z$WIG9I($v|5JM`MQ81(DmDXkX`3M-}E3I+S z*Ms-sgS)z1)%V_;t|l{7p{*0DWS(|~uoD!(Dx2*o1A3rrMmOKA*0AKQscBOo_?0Ue zT(c9eFM6JUd>Xev*rP(f)Jp3z4wbuJB26CpwIF}+S|j)Nd&w&dW=bZMlyF+opfAZ# zpll|_PL=Vl_mXB@e)Dp+?m#Dd)GFZ|-v$5N0`zX!I1zjCcc{n9T6+$ws!B?9TGF5g%4Q6{-Y%Qb%}U78+pqD>mh87NH5eIDji|X8y0|fq zPVD!v&YG(wIIOsJ-K`}4yt?|qYaM62qs3lr?_uhtC3R4@Btv%DjD4Gw&DOgWm}`_K z_f%dUbf7RCZ5~hrn3%MO-oWt5>i1wXQ_B-g>LOb)5b;2|2p9<6JA< zy_zE9wq`>f4C`3(uy19&zT z&r|s2)xVt1iO=bF4xU`{pvF_5zT}cemj1z}F|nXCcyWyhIv#8nk>eXIeD#CvQFvcYLE3do~PGmBA9u4LBXwz{ErcV#p-S|2yxAf`@ z*+*NL+#x|0T_5BcR$^woiO98Z=-dI?9}MkD)h|=kkK?)Ulg5?JXgP1)u^hJknrkcv zmw*oP^72>q247E3@T9A!51q~$Z=?Hl)~Jc6p?&)H0eeK@fj)@zS?|nVJjgo(n%JWW zxtRTXBjnA^V29YdTQ(E&V059$W7t{fuav(+F+x{YUw!rTSahb3G4ViW`l!Osm@%kk zP-$h2zKRFgBPEGs+%emOpr^2V%OuZ7n;hl2dHKzugnba*?j9hgy{}LVdM2ad#2#N~ z<(6JUhxS3Ak2<%~%F@bW9YUd-2i$3JvxvOz^1X(#p-Y(SUR<+oU9oiYp6$evyrB$VH-$6cAja0g~Tc`IX)mg>H!>>c?ec}<|&$z=U4i=KO z$FUZB2I)pnV)owOCZCUmxLcFE=v>*m3YTu*yEljqX%CfMCx?c`E_K!yqjgphI>OjK zh-%^|bjbfH9u&J%)im+~;Yw251(AA+RG;JE~)#$qajT%Lx z0%r}D@od6yt-(d75v}1FF~PGDXxXwdjBFoUw(Jv$&t7q!1UkrB`0Uv8LP9s>jE-NF zr}6Q1RyOw1B7WU{VFqudu8flGnjs1Nz4CL~v{9q%vj!1cO;*k$B6)AY0{!`W-}~O9 z{Ho79O1|#P6E>*DN;L!mJfJJt&33QK-~Hqpuk79pX0?}{+bcnRH$n&bP}caV)BUI> zw$A#ZmWT%DF-)((T37dp$HuI9nWm;q#8fF%J|w++cfMkF{ub!!Lx-}^K|FNi(BDqgVz)Iu zQfD=>4fWOZz4{0{%lv2%eQXpRynA;Dxm+T6s{}DwQqB9c*aJ&+NTd#l;^#9yIhX~! z;V&L~+59C-@Tr!F)L+Se<&}IA^t})~U*6qheOC}H)8i~e6-H$hINb!xih=H z*3~DE?jy;9-ocBPci^X?$DevCPdqAB`#Pgbbb$WMGx!E_YtleR!(STQ%NKiD*^;vP zWpaKSv5Ct!Lf7O5oreB$sIY_lw^OJ7_Lmx61>^W|oz)BMNCH{7c6+U>hdyB}g}g2? zv6`m#svY{0y;IQJ-QLxC;J^XZiSOYhI?~ynQS!~Yy$u~e|BGn6UvyMU{Dd~#xbEUw z=mKwI9H8TagnT5UGy7DcD0-;QYN4~C3%3Zm3*?`BLOb^Eoi^J?7kIZwNu8YzpH$8G zktI3=iK{;|`JZjua8rj;9n9Zg?U4`cB}+VYG2|?C$N=Q7*sr$GryH@8SOCghXZ2E4 zedIITBD?=f;AkKD0*&7>ZMKMg?+*TCHSop7=+3_=k$rfH4x^)|t3TuN{-UGfrjErO z(%Y?WfWO)4&wwUR+ewEsF8b7~uO6z1$*2F)peu4iyc~5_uSKj}ObcF;qbiUq<=H!$ zw!@jdgZIJ$_g)dZSUm}UIy)7}>0jP=G<#r)4x4z^cSir&&wO^seDPu>#?EFB%>9-b z+8UYmdNB zjq+;^@0S5RyhMkdQI9gZdi2qs{rS;np7G3Lhn$Vj5b$rI(+p)Ai5tKM!p*6i!UXy+ zjo4Y-+64IMF?Cjho?`U4mb+c_fVzu?2kqV++TQLUm_C4WKH^FsqM2i>y1)mKKmdex4 z`8&fop1tLJ69k**Tue3+&sC z5R`qJ)EYXydj>&2+Smy8vr43nFLyhe#pvovG~Qb3@2#ruUKT)4aQv+<+GrDyyUv=U z1?X(#oHqnNsC^op6<~+b@qB2(LK*BG*BUxIeJc%NH!}NKqw!FAy-ha2@!4wyF6wG* zpFC?zmnXe?Em7BX*2ESq_BWvJVRT{N%N<@mBj}y1>Ybq_I_T+)-l!DVMdK08@@qG& zSka67`ii2WUX-)gN#?w&F9_pVCZ-FZrx*t(sy=t zTD1lYSU}62iN>i$pTNQs4R(_jP=I zD>8}KkWW*ic0~76Eki)tY1JBN#0Uu5EHTj<{|ry5Cm{zrpAoR4S59Nm;g-%?CIW=u%z=;*L2aOO%I_q;A@4OS+T*v5;Kj3)6DR0uM^{?gVk)g+jrS|9(Y3DnScM4_6nFPAx~o$+7UFa(<(@~$^PG|_ zv2t8=koUFGc^xvkX4{FYPqgvU+_q??_0_P(dzIGMwXTpj$ba=K5&CfUOJifwRo_?< zA~ba-x<#2YmXo~Dc#!w)8xT6s5xBSUgM`+x{U=c!EFKBc*EiUez4u%8 zZHtKgk}9o1_`rx~yV}0}@L{~l;q4&bUQcR!H;WJ{M(0~VG;u^|>&6ROMHoE(jSL>l z^kczpzZtRbZCq(}l@aU$Orq3E zB}U@IC22BN4IduVcSze*TEk+OO6#kMmDa_{mDX4v%-UXG&qauO{514r#g?WBQ4mvv zIDUNGIO45Ht<&Ook4D+N`BQyrLP98xui@mD zrwWZ+Sm=hF(Yey<3n8}B`gvldwbLelu_L;!iRup@-hS3c7kIA-QBdFjoxkFW5XXd8ARC{Q5hB7|lS6(N9q z{J5Yry=6dKUDGvON|E9Y#VN(z-CJnU;)Nguin}`$FBErohv4oMw?J@r2^u80eYu|d z{qiqA&SdsEJ2SJ_tTpHH3#!?WYek=0*dji*Ndd&sqb>%gFMAV?hT^spZo-Y){U8Q5 z$WEb~si*op-qhzTptnm6HJ`%S>)oiT=dy*UTVD6$n+GxObErUo~2kGSd%jvjuRO^i~cR4v%xv(_wH+G?VXHjA% z=^FclkHLm@p}7ox*My6c#h;JvrUlSv6%BMew*r@lL)*gPu&3g>+rQi~U@{I=jRn{< zh~nB0bn-OG>N^cXs}M+xAgf`}%<=(4eQ>0Eb;# zkpNb$##HlnkTyMuUCl1Eb&m@meK0oyDLfRRDfVOJ(HMb@G!`5OQvx!=89)pjornm_{wfR zC8Avkz5#l>p2T;O+pd^bt{eXm^f0IxG+ zjU_$qS(XJD+TrUehXU(*qZUJRfU3-}bwZ#750m(aUr;-aFEh<6q>J=n4zf2Hz=qLu zL85TX!}0&03()3r7q~R%I3{(R1h~w#U^vym4V+9?%h@+bJzO1kCn2Q*4g1w6X;C(M zESv;dy}SI@K5lVStrJY`JpCQZMS#}ZnUQv-ldnvyv|;-1>D(NSP*?9i?e0ZNlvhk5 zno@Kp7TOi^;bApz?*;Rpw-(=60#laiD=KiiG$;2@nP{GFh`qg}U2L3cQCT-E_u1n@ z>w{9Cypoz5=nm(}MFwF4L2EqbKd}K`3YhFgQ=}99gLZShawdniX8B_K6Jp-H-VR4p zQ-?#p&?sS*xAdMyf7>FQ+?UJ-x=zjZvZQ1VT~PJCBt=5d{>!fDz}m5PXA)+2VzQyH zYpSPd@zTlX7;fAv-f-xu-rv-}}ATu)GvQGq*IH z9U@)r5WaPmhAxtdizf-Kp_okVI2tNWNs6KZ{`Qrd{S1p08E;m%{Z9xeeq4T6OKDH$ zE}FV~H$-uftW&o^S<53T260zT-fj7X!CkU>Nnq`vYs7(NnOmkXm3uY0B-!qmlO};8 z+n8y{w3g37J?x~On%&J$@5zJ)&d(d3xviMiE^1$Aqiq3J}TR3o=C+B)&-_t^&?g_;K9WX}QeX)*yC0TR$oOI2$v8W$eCQRs<@i z-aUkA%ByO#3n%6o!)!#l%oXYmD{By+P3=`wo2N)kww3bu47My?kF6puNdCFcexcfw zUo+p>$;WmmVz-?nB7VJF+BO#;Cf=bW*eKh3Cg>sT2`^>2{3@HwJpH?Bxa*`)ftfi~ zzX0mLBygFcWkIJ6d3O&eS0QHC`!4?QX2^4SV8&Mb;kUrX(`rL)oe0Lnzp&Y;K?w!p zZAK=JBpx;$Rn?2S7_1TJ5@MIhVMF7*BrR)&R$u42Y9yK5ev@pZo<|w&((`xy+`i0njTmD&R zf4vfH=rv-ouX!{%wB~!ql!db#m&xyXwf#G4ax{F0kcXsGI;ZfVPIe(=UNbyoo;U#w zn4SsNM#&zgz$vX+eB3wA$DU2G~cp@KVhghtbBt8yFzs#CNMfaSQm2_x4UF`TP zTmOn>z-SB|9goYfkCs9a%CS$PlVk0WjbZygUqM)Cz8HzVt}WAFu*G0gGd4>hYg_HP z9lZq0;^t%QC-#^6oOM2Eg##*LNSEdzop(hkqIoeQemoq(qkyJk-O6H#qudbNX8YzkVGn+6&Hx*Zn;~Q; z`ZX=2YEGXHL`GiD+bY&(0bl>DE<|UT+@#ed9P1!Ib`g-v<8%$A%$b(4Tp>_%qA=Kk$kD#^*Tg`XTEvfWrVF`xV|ER z-&TD3mIzD@=)!WL+33!Bj7(c1WNK(L(r=iu3UU4T-?7LM^1$~2`vuS&E*H3a$KQtU z7j;-v;T`kuUjRiMCfSh76KuecQGg0a#L9>n%Fn}WHqQ91q(0iCDWy!Tb?PXjAx^r2 zaM3b}7{-;Dy0mQ~k0Sbc&6YO#G0R<++t zP&yc%BvqP;Qp+7Cf9f+q^R%A}ZSQ})CrTQ5~6BufEJX5nQc8BA{7Vx^iGf1Nd`>{II7ttLS>CCJs z$d6LHfs{0ZCq1Cxc&$#<{6@ZokEpUaUW_lO+P`z`F?qS}hSzEFgOZruzg*p{j4-?+ zC0tQBG$S%FgH0%PBOC!=+?c)$!o&=x(ZYjPSp!M>k_E^|>W52qSe)*1v~Fqc>abaZ zhY!tZ@gwkdqx2Zx`L)xzfXq0BIx>i-JuXq)`StNG=u_$nlfEFARlt4tDEP})(|qh}-L=h1xd%Vp1-}XHa%1-VeUkfNOCi4<)Nyj~S6pXlv=dEO7NJF1o7CnW`fP8dYp+WuqZ zZme8Eh|#B(0+iP(EDhxI=InJ&4g4@%E@_I%CNB$RW@v6MT3qCSP3gK}k|%B9KR2lD z^BIMvlJN4hwUEK!$IKP=GbL%5T}Ehp-PX3^ea=OvluSTHi;G$P6W%t)yh=GXvRLwpoC+ zfAx11?43#mufS`NnVlqh?XW?zoWSBEtF^)r&0~*^wePdl35UC^uDB10_=6Lcmn(>& z0+l-?4lXC?&=g8IS;F!Iyn7s_b3!`2iR5-6{tm?%g6;q2QD$f8sWx)rs(1L$Ys$VN$VN0>ix261}#0r+&U+}q}I>p;t`uVwi!}JnpCGZP$V&-1v z|9V?*Zn;z!!$?p2C`UzcVuVq=v`~kv2 z$-c}K7(u^8>8QQs51~P=I`L9M3(WuE_5~~#a8;uudlTc|FeUIi z>t-owo|f-X7%e>=ey~M*q~1pM%8Bo>kW)Iq{CS=tNoK!#=Yb!I)#^VS`?!<-)W7o; zc(yz}qlM%q7G~h9{g(8{Ba_1(ef7j<3M_7yMfnWzp!_@S$}}V&96T^!oKC3kb)(c0>Zb>&S6)?_kVCgf4@5Br*#G_3frBb z_7T%qE(+JR&ovG|sf4&Ed`BqMX0)z0^qq(v2qtSeoEL%ZyDjzpy3}1-}2xj5JB~f=TsSWp$BrWd8pj+I7`H5YEy=-EJ z@S(U)6Z%7?Esy=+2lhUdG(3{-LPctYB3D;lf>nRVQ0|U)k`hEntU!*=GVYh|V0o5n zuH7I!^MJE(8}e}$g3_kHFjGYW4t_~*BaihQR>X=Cxi_SGnEMLIWke zj2rR0gmuccbR-uo(P4w7F=6h;iADu|7ypEOa?hc=05fh+3V8ClyRJT!_@T;)=t}{S z?lMBW5FQVfuOOTM!UCjhWB)e$)z2W<&RFID=@`b?9B_l9S$O1Ggy*cRRnY06cf6CL zTOB(yT;exX?Pr&Ex!%8QFoey2rID|*#U>@O2&%m#+u&}r)e20v-)P8e%* zUE$3`$}tv;s;%>`%GRVoZBTJ_+fy}EiUmgh82TV(l}UAUPtt#CghBuH9@}9EP#+g7 z89h5Hh{xSRpj~|e*-Fin^^bj$mbsJ1bOqhV8gCY+_sKsq%qEuWLPm68-o<5X*(<|~Sg7Nzwq*;2s` zfvp1Pf_584+PX?w-N9kD<7Wb~nbYDG-%b(kvfUa7V4M560G z^2#eQa#z;Kc4uRjEQz2gSOeQwgiDAqM}AQtEEnh}J7&h9hVXWg?KDDejaS_yEyE*{ zws)k#n^T%un4rHjT~9c^AB4wWcVI*_`^4aeEa z)DNP+2R)t_T+iC2-f0h>un1d(EPBGOqN_D6`J@lx(BFErzZ=^frD^n+I1#DnI6R8= za&9aA^B{o!P^wxGIdy2cHllO%5muyPEkG;oy{JNuo$b#$x(uQp=Wnq+} z^965SD7FuVCr(!A_d2xi_$}HlyuOG@^TEjJh9AQSYIe8wf7~evo54yf5!>_A z2zy3F>bmOTxkskH_vMlWM`-T8u_TsNfyT>`0kQbUIkF!ff|;!VWP-g^Gmker{)72uUzDnawKSYyWg zFnx6|l%i)DRq2|g@)1U_`PL;293)WJk}`bBK|&KVQ)0^%DsRW!cYRtP6uNmYaM&8ZzyL}A2f`;jir_~WXrTnX$#=vhU| z%l(#l)=stuZ?L?iUj5$rew`+psBO8OW(FqKj4{MWlTc`}2X^rmJd-Zb@KqvTeamb8P{Si(0U40=P(^^=-%c-P@p1)C7czFzY4@)ipWN~n3{gD4 zs=5?i!=+I2r455Xw=5xNdhk!m)`>Ly#kt9HQQD)3R+Gj?$Kxj{jLVX(-O4_FJzEBf zX%ZQ2Ob0#YHcVnZMyD>h3*(K4hhsqB{FWL&HuC*=?{6X)N!dZ_CCMvwA?PW9jmhQV z-(s_$a4{D)k5{5z;3IUPc1A0AD8afGg>SvOL6$H3>+pxp$;{qaU;B7xHx3auYsxtB z`98v?lnO~fIY(~?aFu@h-D0YBV5`vc!sd&Zg1F!dchbD~KT@csuJ(ZC)28^ifqDX~ z>*%@@I$hdwaL3NH18{KWYD)jDU$775u+${O&|P|cqr@>r;`43VhRgx&P$;ZpdX%rZ zR|tHV4ETtjHqsjDl?d06hze3^u|*RKpNFiW<Z>ws>;WeX&7pod>*poNbI^RH$;|@Nro{<=2<*9y;I&0a}h9mQh?6 z#nYs!9_{-?EHG*z2Cu_DYz_lO$r38J4QhI&4@WF=G^fjRxew*miO}6t0!Z4+Gmr5B zr(M$$oK|!yJAt`N;^AL-8H!^?S?L}Xj=c_3b0y zS+8W(A`kn$a7M>a(mZ_n!;;PXl|l*N8|Habsn^=%lAIA6zYpDMZveoJP84qE@1rWcwJZ$6|CClSD%&?uIv0_xUNh? zmCWjzEc}y$=|0vtF*|?P++fFg;q`~Nb@J#_e>ZZ|DVg!MTRa9|eFgG1C|hnlQGC;G z&o7z-*YoF)MQ|;=x1kA^w^p3M-0bchlbY{WRx&gT5tU}zAJh)tN&Kut0ax+nAyVG8 z+tgnDj4CnHB@6Tla#8PV4JFL#Y98}73RCe%zL?+W8?-;AdLsbe5O^%WihOuCD}6;V zK{Bws{X|DhmzwRO=n15dEIR^_izLBa_6T>?FZ44@p>zAW!}Ma66njA*s_w%24Oy(f z{rys#tM%)`*0Swma>@_OXFua2&FXuM`BmzxG#+5qR-Nv?4ukcS!g**OtOW%@fuR|5 z6-eVoB=fL^SX_}Kq9E2jTa$K1S`R$7Q(ylS;lu zwhRCA+ut=87q)K0tIfFOG&yxZ&w5Fuoy-5d-tGTKv}zhongGjJ5YFSi)p=L%oIfDg z7Lgd7B{~9Gs5@A{Z3m#)bo@F_u=(q*>#_1vip#2dd`Z2?3>kU z%hsCY!diAn)wLMDASs=mW#_@;wT|AtE@%FexVdZWqjqK%qh`h01kG1WHTj3O``euOC82KtD$U8J-3tok z4bt!wjuB0?GfO%EaX*)RdKkc&7)R``FgxSneE0*`Zd9lwt8|uOeR^3kKNBD(n7UEJ zFV|qb-0BO0ruylvN%a89PKHArYN6OyshHd$j^(J{eaP?<%$`1cBNb%GJ>?j(=umE`( z1|UHuqb^tbz_{OD6QmN!`VU)SHhZ6FYc&ow{(N53ZlgEwb2@p^aRYxmT`&ZEHUs<= zT9x0tJ~ZI0>qy}3(JUH?*s-s zoZcryzi_bjCl0Z-ra3xwJT$w%!+uHnZMOw@iS=8aR1#QTRXJOq>{3JUVnj=uEBA9QxC__BQWP%q8s z>~!8a2-knD^u-W97Tv`>0~$0xaMQ3I(uXnHy>4Y|={mD{6D)uNa}MI`yF~m$2GLvG zra!s`bvXqeUI*03Haue#9OwPH1Y?RctS{5@Y3ojFJ;f%q!#m=ab#g>-WiU~Dv_(g= zr|L_lBfz?2UHl*AEt>G_(|G*_O>G!`zWfAtX7b5L0S`-SUFXc*GLHtVX1mFB0I9I% z)L*MzD+*i;bIa4TFMnMK6x@PsrcAte+4MSM4;bIg#Os^CvfCE3i`WsQREpu4Epr5a~$VfXG9h1GL3yeiI8j=W9E&0l$y-*KD& zlEFD$c&x?I9P~M)OTk?3M6n>u@6331<7M|`DQ7XX8cXGQ(InB^oYsU^)Ws^1)-Lyi z>X-O$&=4R!-s^7`soNrr{s>%eVV8AGrO3;5jpfUVAWj96Nh#Wjo6JOjkIqV8oui79 zieVP*@pp1N0M$!eY?W1E?Z&9qZSFiEHB#&c8HkJAAt6@`RcV#}k-lWaU?+fNUM{T@pHPuiIb8hj+LN{6c-mKYXh`65te--#=KHTkS;C|R6 zhTX1vLD_0bW_I4X5()R~KdWMar9}u-RlC3AW{vc+ri>}O0+yRmJ>73K*y>rizXoJm zT95hMG+iIY{{BzSHM#^1nqPDxAOqDTKpCXN=Qcm@p#`l81OHu8V0a0 zvQ?J@(cnH5w8KldUxX^KPigsYM6#}j_a1fX!1&DxjXVnF<0|nawdQ)4eKchXhO12h z)wamKC<6^2T#QhJs+fthPP3BlyzRH-yWMrB>M5t~d{e%#*Jsr~KUq31n`S?UyK_D2 zbd^!tn@6b-2rG5H`ejM%T&X?YcvGlsi6hE|cEjoXhG2J^!qZ-QtNZ%5qNWQ* z%5GhVJy)APm3Sf>Gq-8X#{|oF!sukrq9NE_=z~nvV#n`aSe@(t)elw-)nO%g12V%l z7pmo8ey`8}UjBFmcQ~2AKP$aKDDd^kxlnA+zA_|?@P03@H5!VR)n+H`$Ds9UmFHQjW3{=U}2<%5^wbWe)Nen_mt}wu0H@eg#Kg zx8~&;$(anU>wxUrujc^=FN0+FxbHx_R3&5K?Fj@-3d*n z&!0{|jZTVDR!PTTg0lHc-chiaE8H_;TrZknFARid-Mm>baswHOU!v;l4GuOn4f5x? zFUvpWXEZCBIXcqMlqPW3xV%VN*{wLOAuAlL5o)mQ96obiy59lXbPyevq8)WPFeZ~g(LWQ`BMDB-}-kVPp?0ib(d9-== zYZBex1$j+qceJCFYT;93r-_VxRx^?Z;Sb@0BgyQ}2m#^hzdbYOTYV@S8x039*FPCD zRn$b$A{&rg92%vBrc1EmWS>%SQimK@&M%JB<=E@{V7IGR^5gyia&SPZ40QDj3} z(M8vk?A=DEY55;nX1>bKw?rtKPc8>wR)=^lQ+EAYIbKd0Ju;Qt!cq|k^7UQvYI6N} z-{Q2>jJPLDQ_aE1$heN~Bs+wikGUI96(GU7{^q}L&9?bAukWsq^;L8%nTZ|&c%NZc zw*NmD0L0ZgcR-sadpT84pN}5TQCp%F#8g092&$CbCzSERnh zB=r|tc}}4<8K0da*?%v^Ea0~bI(fa}UZSZ_J)7-^H+2Qy@lcyPu-ROi`#TnM)pRVI zvL6wnny2}k#?x6Rb(e>`l7sb{?4pysFhn9(Xnk&upSd8#t0c`C5vdKvB`vtz93BN8 zWCIOsVdJkiPL7{GprB}*Ub|9&J^VHmH-9Hi@ncffDL|EEbsvv(eaf>Y0m9gm$-d(* zP7zYtF@L%ebi2iOb+PDE$o9G<=^~0Yh~HJ<*k!;Ty9e%)!ZkIMNxS6`#wfk;x9CWI z?Ep-aes_=ZubUhk#=mphnLXTsJpRBo8wg58^)hb7b@+gPNwg5=WbC#QclRW$BQ4;X z-0amLn)~(R-Or^1O}FD}ywk!SoP`zJ1EUB`(=SU*9rSdqtEJwo8UA5jv&osxlgA^3 z?YCu1d+eXOD#+#8(SQHQXz90#NN6Cf{NxxXUDae)7}1_#jm1}ex|O`lTKLE0SSzlm z1cgl&>h;904m)diw0co_g{ioFYvyKHIp3N+jhHS1LjP*F*gLn7PxMs#++Ga_z4GR@ z2>ugyDSZ*=J!~55q?ki&T~3bLp1)oD!{X;_ctTl`8QaCDOGox}3R60?4+C57jZV@U zm-sVN@>+aPeeQla?hb8xa`POkIG?KiYHuO4cH#wD#TFts)*pZ9BC~&b#hbq!IH_e8 zdNCQYqZ6qaq5WQBPx^FfkKRsKl7#cnPUDvT27a#|w_cyBUw_@zj02B|o{zMtslK!# zP4Z7mP%qrtU@vK%O;1+pwVbDF&^Evhg+DrMxU4B{D3^F9^k;O$#!PZW)*$*u=A!JL z=ZuRd8VB1=Nx>)U78QK_E7J#knR_%S5{2sR4%^l&+`@?&h8rn`7wDdPKF3^azHMi1 z$I}99F8D3?k4k1ANIPLN19D3U&#xS3`nm1pRlcu!UNfyXeBI}??}H^#Jq3;5qu?Mg z1<55M7IrYb|3QfJ4@_W>^PMs9w{hX6nt@#DcTWnzOGXz0W&?IC6b; zh>`+bD%;cUQ^>2xfvz{S(eN88%#GomPN!ScFGuVk-MUI>A)Up69%neqsP7}`D?-() zTAtM92z-=whL+PTz|)QG8p6p z8{a~TusDGdmAkwA;)_G{(1dJGn}5>u*mZ`_0p(AmI_f(ZYK{<1O@g=PTHI&9-5K;e z&3`pmg;WDVh<-Hej?1SX)_km3lUL%c=HdJGm1_PPN`yheiFGT5o;~{@l1RQ#V$lgr zF52th$9-57_qBzP3SJaQ*;cR;(c3Vfi~{v>AbphKBs-dX1Fij0LDQRJzTUZ@q6;^+>o}@f4H68nkPO)%t5Uoz&`{Mxi%Dvkr z+Y|%OYgRYZ!ZSmu9`)TEvRgElX+=dmroL^~letjD-DxY8&?io_L-#3)4$GJdeve z$(w^%kwkY5jxg<5-NaFUpz90BKqxST7w4cYpJ|5M-OU^oR8($1tPBCZR#3xY#2u4V13FPXs z$fb~zvL#O3qjN zjYH&5O`ccD7w!TYYv;LFtIk3~Low~blaRW@$YT`lmTnH|0xC86loVGD7KIZwk^1=A zxanztg3d{_l=;{?|A2lrn-6o*_4BzGyTNbtpj9LB_UOeyp}sc!T~IZy89Q*KI+>9k z<4GT6| zQU)5q0k$N_O)yULx2~a!CGi*Q-<|`3dh6rWns1+p4b`c(4j3wK66St!SY{?9IQKb{ zwC&7xb!s2cb~AP}W)a!BT)Ch=e>mF>!=m`;HRxHK^tbBvHtOr@hP(4qS`x2b5_j9B z{2ZPGlWCwLtItADv)eBv7U4GM)B{e9#O#Ow%)u)jC#?F1#h{2l7avQcpBFX#r(c|4uv;r{0jQZ9=v=Gk#%KWm4eP;2;aEv((07WK_J z#8#xir^5T>l_+9uyXIDFkIGHvmc@$1Sg&1A*}c~f<##yvmf~JZ-)t|@>g(#QzYp;M z1r1SkY=verOEpYG`X5=#oDVF1qLEH!6#Y<)JhSpSdFjFpe|&U_np68-(Yo1tu<74s zXN&-;ZjYuAVY^v4))k@X!JLqIYKzHM-U*0uyoJq{=^jCjlRP!v=doN9)4TH!TGi>L zKY4&KvH#8PX&i3z$161b(>^4DVLJgbE+mBZ$?Ci2f(*v0ZP+;txPJ=m>Oy&|h9<=eq_K&ERrnMhDDxp>7k`20aD6 zZZr7jy<8F#wR3-CX)?zqn+VlLBwOG+@F+_5N)+QI_?Go#t{58E{>XDPMY*&gkWXXj zpHo&lsxawZ&!A0;BT@*O(Ja1keROGsDz|VRD`NL%S3=V-x%c%r2>X|dc}&34 zTDK8LRNfBBl2co{YL+x)tENC!`|T?Rw&SFrDokN%Lk|C%5bPl~h!Q=5=)DH@V<6Le zJ0W>M#;FMqqA0oh4Zd%B-s6zJbz6u!kGi?Fr+(W`7Fk_9NLy8S0IB=?Mp~Oj;wAp} z7MH+px_=FyaG2JcZF3$837jXh2Bp60<4UUPwYyeUvde~rfRaUj2&An}M;KkUcu^Vn zhxH%!ITJYTaJc$Ym3@;ps-u*lBz`if6<}z&4|pD5=-{EEtnw2~C2%aq3%qFXlm3jC zf5|<$`%Tef+Hd6XaoEU(2_ir7p3-nM`wv9FcT()h!5OU_e?UW62tKqTW8mz&EY9;Z zOPMea!$jo#Js{a(RmLYIEmhFRhf~KJtS_bV2K#`&vT94p+mWfu6<98Yv+RyZAh=?Z(Nz|xg?1}hv2lb# z^{I|9z#fT*ihPmeA!&Jo7}R?2=pj?RbKY1_hZNV>cu@J^?)y-9>)+UYw&p-CPEUgQ zvzfI`wgjaWrIcs)+C4D-_B3OD6*sDTI!$X?Tc2XQ)o9=8qh?$_^o4iN!_gyMpDZJA z^Sh0H7OJleelKLsPX{(vp1EsKgIu|fJ)vx~G@}O#=#?>MIHnph)9vmd%(09D){dS$ zmLm!YydM=R%Xxv7Fo|GQn|U++S?cm<&0Ab+`R8~iuPG$PfD>tOn({>eQu#uib5i%W z${H>^FhAyS%N<~E_a%N(JSH}LVx^fORX3TdQ2+s#6U1Q@)fY`G%Q}u8f7X{hN*s-t| zFD}=XC&h{k=Zf_q;xs{@b~gwlK=8>%vqBxGe(q!mawl*o_;lvJvwaTBf-=(WYH^a@ zn(W9j;Y<(;z00CZ74^If8No(vPi^lS9Hy8xz!V>rb6+}L`Dw1(M+!C9-Qmrixn4!A zNLoH1y4(FtuANlBef|-Kg-mgR=ByOnXQCL>zXfmML3?^s+=IYD$hEIu_eSYb^srw= zVkJ25dw%iknv-NL$b$4JZC4AjET2EZxjMzJewl-hLd}{FhJTdo7m6v`;GX-D8(_`H z5xnc?_|ob^{!+2_uJwxIeEVFO&g2N6T{6AAc8;qNz2G`DUOk|)#$aViDg z{ghoHcHBS;SRt^_)J(Ux!+wLAv?UPR<2 z!hsdjWv7M%fhgNX6G!el+BQ=zuL*WgL}r6_*Z)0UIuSjlL{`Q8(jcb9ar1EwCB5iY zyfqk_D*V4HO>71}b;^DN`1s=_K+SkT2|h;VRPaejG6$$ZqQ8Ca@M~l3bZ`s!lb0iw zxa_zG$5$u1nd7+*!h7Enf=*2D94lM^_992l68LxCCro$ZXKyc6tm$O;mgG8MK*!kLsJK!0)Wn4lRja>$i_6GW9Y;vO(?~-Ai({7_3yM1Ld9^>EWbw8Re(EMw-RQ0|xd)oXF)*MjJ<-h&-pP{pH`4*_~LFgnw z+9#x)bJiPjR3EoDV(eH{XtDt51$y3^{4jP=9F-S6a$y_t5=#d})|)%Uczap*;rU_lO^-b1Pe{|hi* z#~VQI&UTOGt{`CBp`fUp8&-w4?F>SU>??+90`5|i?W>AiW_Y!7R6rV8Lb+K~Se!eb zc)TTFmy%-f91CxR5inh>)fb_bp(>9kPCbDOC;v|J$5V_NhUd!a_j^QK4zrmuE|bA? zhPo*eZeSIFc%oq$;)BGOy}aM7gt|Szr^LdML*ycfcAuG(Dz8u&8WKsm)JWFppOZnx z_Dr4ORiXZ{eP&>beHsUkU*7TDz~Vt>sV#<66T3#0B|zieuD#+$DH8&?!Ez5z`aN1e)a@x+Eo@vIH2)WeKR>r>Sa_A%M%x%Hq=->^BOJ-n6o~ zq9u>)2`c|OeB$k*zP7}c5RG~Z2>}+Edi;a91NRKDq^Yp z50f-Tj9?C+sGB2AVDc=I=s0NiXY!ay$$UhwW^N(6?Laf2wS2Y%=vL>Pu-sr-!KVaf z2x+j*B9m%<5c#BhJotS$sv9O>u6$jnnU_h1sWkRRPm72KyGFfLjy~IG~lp$V5#qY3dS~4 z5v>XJu2KAVAhp}!m8Ln!+vrJx6wAH1iF*5#I7>`+%Unz{ModVSvR8>~I&l(WXQqWb zs@NMt5X7fA%ZQ_at%T^l#%TP^)t%n|{mCe#eOPx&XK!irK<(2^x*8J*DN;wyj>E#U zcrKd^@fl&r$km-S?^tY)jNBY;aYW5S<$Q0PO5}DCW15N zS$ACU#YXL}j*{E%x`m=UZ$?S6x%dVno?n~e@!X0vL6?}NtLPnc?E=$pP?41Q!1}Dxtd6D4+!6sb&Dq|D zx+=`m>Mc8+NqdcY6yBxCxt)qNVn#1Oz`x4nFl~N(oSfx=USfDNp#B?@Sd_s0{dpqc zxf=qW*=shlhS8MG`7)8^B+q45!pJG?ysyjvN6FY5=gXDy?w8J!s+>(nk zK}$3eBv}=e_jZ&K1k~W53`jdP7le2pViXBN6gdl;WPi$NqHIY>SIp1IUJn;`jTmV- zTh>gBwTxOiJ%T!qsWQ)8-i7U>d+DU%yO`#k?;TQmmcDskTs}%MGt!*_IW&~TX- z#;ipnaZ}^y>_4IIRtH4T)Bj~HS8jH#TY^8(s1s-B5G-2gXK>!>o>T_vB`ATx{RS-- zXHv`4VW;P}uYl#r5XoX9YZtZl$#!NyRt2>EpyP;^2u7B3K*65%?JiH5s6EFL)4Bs* zc+K2F#06+J#vpIpr)4@v4M;mXGE4YtZVV9OLENS7Uj!F3W(GE*9ye2v5ruaW&fc6s z7vjr1ccMl55kB5Roa9HybmY<=kFt+uN6c=yf$ea-$W&LZ{}dX1;=BVCkhy;PQcx0h zw8)i}u!LR(PtwttF~}^h9;5VSd z4z1~Fx`k9RU)^LBEw9Yd<>@b$gThXP(BQjF_yB;7(d!WnI|RHcjY1gg%SbP_-+`od zw*$??wv}(tpPWg2#OzUpwPfy+?8_05XBK1WnP-^>Y<#pd+?@wli$=A2u%FD;I`KZL zTwM6EE`ZWhPZWSk=`j_9;_U(}D+AW1P$5uk{v|#R(j32MuKIR6Cq_7oo2qCX87`1E z{{tUxz>L)1d3tLF<>$@8TYQp940kNzL^c}=_bxs#l9i7R9~-jBzS$e)B3`d-S%DMX zwQuEUKf34R6|FsT0LHw_f?xL3Nrha2hnm|;Y)!=-1D+5cNfjdlKQi$4O5q~GUYbh& z*=#r?2cclsxfV?n_xY+Q4YX~Tzob8aWe=zFqSIAW^Y5E$8UF-kEYqg`gfKF<$B%~8gf|U z2D!y&HD!L4Tc_}WFi_=cQmQ2duCrOuiSrom4n z)+0dgh6hLq9O@Y%jv0T6}!prB5htPJZ&CX;3uM6 z=i~&@qhUVWz!6LCnfq+L$1%#U#mgvrLRb~;-X-?qTEtfJzUuh*n$$0L%`SKhp~7OW zWVgZk7&QKE0pOVkN5!_eftiuJnlD1^s zPDf9kjL1`QAqS~_YNg#ndnQ*H54N7u3n6P1m&V+{!RGLh1}}hk-gyGIGdJNdFca_q z5`iktWbu1V+TZ+gScw@!+IVAz!RYS8LXlN18P&!9Wc8vt4+G*QEqI0lXMfa@8bse1 zzZ0SJ298jj(xz#_0S7Z(v1VncGop8Kz9iZ?NCaD_6;8}Sla=Z6L2&AMLnc;5xC?(r z9HNutkA({qf-Vs>9cRVtpeu0^qb-_Y)W)2RHi}6u?AiRt?vs*Y9 z7YOe|d{AcaJ)l{MLh@q7${F)Xzl=s`>Kba8RyE6!czI*Eb3axfi6X=i^>VjUYbPGT zpUy{YHXQ+lxfCaSsH8TN!AhCWq*?s;-@eU=?yGMT33z9rNG|T)6U3_fLh|$2TaTsQ zJqv26A5-_QAVs1F_ox;dRpddmz^;KFxPF`Ui+4sWQ`mB#xnjS0cYGA?6#N;y`@f{r zBItAWdvBaUx(U3a8=}wjhf?5ox1g0-{<}*Q&c6&)VuF^}jlUK3K&!tA>Q}1I<9UD| zwtVdxropmjpyKWG)-e=L$1?!o3u{|^#5X)%|z9$HUY+r->$lL;sH0Q-@`YvAl) zqD2RHXHExd$KNUj!4GVc4QB6dTTNTE&OlSVFuozic^~9+oDOX1Q--Oyl zWumkUI$4UlrN|yLvUMW4{7y-+UmYG=j(s7>eEF(K#N)M+VXITjCz|syRN@oM)mw;V z2a+*ZvDK%C0#O>IXT$Pt6k>fY=ofW7Gc`nYHEn@kKaGo9V=|4lsUcs`-56(F$FV$J za>>pzLnmW}n0QDWlyi#x{zu$xcKIoMVdX>j!janQh%Y5A&Cn z7q6oENbPku3_Ms&kSX`#{6%3B+d9CWF5exE>e}tlTh~-X>q~ZASL|yD7~!lC+q0`s zcEQo(hxaJkINL19t1}r`8T!ZG)Wwnh$G%n9WpjQ%dz6`5SLp>(X-b-9l2zD{6bRr_ z2!E+3)$|o{RJQo9?Q=2Hn}4+yzw1wEG$T!xE4lKupm$pC=)NCnH`MbYxhIJe$z#P4KuHXl^+xW7g_}R}++X zo%<47Pxl_3G(Fa`^W`BGpM`FQw0q@Ruq8>jDq4H7-OqUE9C29tV&#Zu zj+AqU9s#+GQXMcWwZSx`ddT4ye(y1Epi4(xem>rLtT$cbCoC$Nltt2H#+(R+jYttv zV#w2Lu~GqvYe~rmUsc{2(s>Vw8Pb9amyT`U9&O1Jc|P+3A3>~~#CP_;#C!^*IBv@V zii(Of9*!!i)il=ZbsC2MOZ5w3eCuNkez+wUg?7M7pPXAmN(o9mpe+#3cJ-;B)hVSv z?Ubpd+q(*SzIE^?T^8kD%BMq^&Es8t$=O}Y-X%BC z3_-{K|7iNku&BE4Z3O`(l@yQ?5hSG>q?PU-K)OM?Q%V}78HSMVZbrHpnxSiep@(jG z$LIfhxvs;vb7s#zv)5jGtvggd{4Q%6kg>#>MRfRfiY$$e`k!6Q-7L#orQpscCks@f zEPn-tT9e-GiJT|v<)$I^%#d3;`^T(Pb-KLL&E)r*8c9hSR_A~B;H-caLNuVHXW9we zGrstFVEW*)0Cv=)K%PZQkFeo!F^-{v0?YX_K2l`baM{j@ZR#K0xPUtsaZR7($%qGQ zh^Ix@GPB@n)`Fy)e4Lpnks}e!t<`liWLhb(dGHD`b|fP8wYr9_J9#di09<@!OMD=G zEE;Nw8)F8#dk^%DHsr25!J}+UQ?fNP*KSe!*S4kJI%x?*G}kRd;Xv(efQJR4Nb`)Q zX646E^)(BOpI$iSGnz(xF)*N>;`TW;HQ&KA!2pv|v#D9!wlmBVQ%eJx>zMvFt_ zS|}wc;m{l<&qT4)-j_7>ef1=S-fa>l``!4_Eot`*C5DN&v85%l^_fY1^KW&slT4>1 zEt(*_IHkKB6zM|bU?p$7VWM!OSn%!XcDsg_8@ z^qM;zZ8ai@hUyGJsmP*1gV*PiORq~9qi{9B?@Z66k}g4aZ(klI5(SaBPFgbnpXxKR zujahVz|-Hu_N${-Bahu3Ev08E2jz&9s&ZgNOkTd?HoV8GvLhWonu-sh5vSy>kyo26 zvC%kU0w~n$N}Js$;4C-n(Znl|^}Qj3tTAbRSu@j+E%lyR%<4jYAZNa^PNBebGOA&A zy24~FvL*JAGH|58fzm&XgFh-wi90-GthR0QP0kI*)iUuSW(W`NI)hO?i`z-pdM4la zGD^pQf8TY^vWZMBu(D5CkI95~X{mEG5~{?<+x6l(mOH*10DMy_WP~;a0$Q*~Mk!M7 zqB~dP9*qZ zZ^EIxVL2EVy5Ra>+GDC)sWejOw@ylz)eh5vIpbAm(_oAn2b3m!2Tow%zTlUT*n98J z3*ZkNey*f!LCK{G$xgIgt<^9vfY$2XNSLEv4<-3Em(Qi%bBhR^@aCv#s21Pf6G|er zu7e-Xm3Q~Mj&MEM(=<01drWnOS3}QxqIb$G#z`NjDgPuUPGUIVzI%D<5O7Vv;&wF$ zflD26G_;c8d4km6oMQ*&Z01>LRb-MPUh6gb9oEaoS%fA_gJp{se!Iuola{o+?Fs-e3RN=_kr`{n!Pq&Noz4#JjNXW-j?fGbd2p6NiaIFlf1G?GH#1wPTGU~c)^>!?v^>=zRe(sg&q*{#RM@0*smfw>jOU&mw9^f*0n<`Cv zgkqRsKd<&dvm?A?z5NtbRdje-b)&_~^PuaDNE?q$E+IU!q_|@*>|g*LbG=dVSCg9e zFHP>`)B_d?)D>H~5)A(oSa(}g*g5IIsh8~gA(iOoN90Iz&bw+;`2BO6SFgDY?y5U4 z5au2tNF9@^Kv8|tk!_W>g3Y-_nMlhx$|Wd}!izLblN>l3?FXlcj#-hXi?@@D!iB^D zJn60C1sCP>3)ylm5T~|=t`!cB0NoF`Ur}XZrf0wI4K^wb)SWgdMj{iiTL8#sxkWUV z$I$(`X9{aODjPW^4mgWdGPw1+cd$Eh=|UFLbb$y`9Fi`CC$L}A{1tKfGYR`~(6`qO z1S5lRhwn)%EaA@lTQPoG+5Cj(55ovrA`byj0!g!)l!26Z6p-nwZoL^(jXZtza6~E2 z1K}CdbFFW1B?6X~OyupJD!d#`a{@ndRSB9i&=vR1*kVlgx-brS5*V%OtXn9ChlYmU z|6o3Vvs~>Ly3CV!YuqDu0AG}O(e=2sM}bPwus3}GbP)bn3g$DPtuA}lR93y z_a3RcE7Pd2yUMK3u>4f<1y8qClWgY&S!H`N;)fl=!F6cE29R83(Y%NNp*C=;CQp_y zcslhp-K1$gGjtyPA&ub?2b5f+BbaGoZI5mJKG0-`U0212L}j%weXVmtJOo?CM2}71 z<`zL~YaFq%??MxPMT$MVTjaM32wIwQ0Q-8m&~Xd3=E+<*wOJN$w=5?8s^nimgZC!R z5s7lOw8xGG3;fMF2gEF@(zlgtY~YGjTM(15z09j@_eZRujY^Op6oHbDUPdg)0}$O}Ue%Wm zW>NgeHrB@Eq0X0x*Wo|5_S)-Ho_AWZeg5*-akPc6zEM@RP|`MGJ$-+3kgWv{AjAa{uirhq%|+-6gQv1)5uyI{^o z;3q#lxIiESyr75LAJ5g?jCV=A!Um$uPOeQk<$K=NwkWk1cU`9AVKf7NaI4`cmqE6s z%yiv*Erm#mGlfWN{7-U3yWJ;WOank3nz^o%?;>1IVS`Vvn<2o~dHRr$*5MyVnAMOp z&i)_UFQ8HfBF)JHkD?jwEGMqLQ3moy`zTE;uGx(Q+=ke@8LVt@mf<@5KL*$vB;dPc z63>?}^Y)MT&fU8V^bcI1wt1C5T?;?o%4)l(6X1KB@74?X8*bH98sCkEQp}|?S7d8N zv0=C9(%&kUfSA6fivZLqyhH&etE{*77XMh^$N)z~dD_=6f!AInEKoi;?Q0w%=p5XE zC7^eoNFNy~7X){ila0TX6~s|=*8DY%8jX08FX&~sXFTjQ7e47BShF}~zZMu?dhj#S z6pA<*=PaV|2*f>E6#-n6gq30-p+AXMI7~v(q`|w6cN-IVR2w>2Vp{_g^Wh(p?&Zme`S!qJ7ihbF7Bw+r|)K8i$=hS&gn%%w4U6F%Dcdy_wF*_0#;;i=$cS z1j#S8FgBy3K`BEfMT(9l(EKN`tKTDI|3n4`;IynPO&<52{rx$;xj==M#6piw-WA&- zi$Plx#Z)l)dE=d`!(f)C0#eg3TT8Jgn{|n9JKS2#T}j)?gYRr!3x6p+1nYQGtAJRL zOsvB#rsK%HcWjPv36CKll2zQ@d`yy!DwurTfzCon1S;%5k4sAqcX;~c&ChZ21{JsDyMo6@`<_2D^2wwqU1aqRrwpFxS3g& z=4jDJxM|~^Z%{;t$<#K!ifggWbV_7^{5c{Mwbl*J@}{|76JtEHIhmysz_>B*)^a8; z8PJxA?ZKCBg?J%az8&AeW^kykOgHJ3lakFi_+mPwzn*@ng0eMKj;SqDv7>8Wet!bl zQbHDanTFf=9)-NJ8gAL;o(`gMDN>go=|*u`44V+z;S|v}bCk4#Qz&wvrIdoV&_KMX=&B+#g=IUAw8V2(nHIaIjC6xc^o0_5Ja~_g)<$g;yV(Ie{v+ET6aU zG9nJ)YN50=b*W16GPa1wE0mauY&H*#RJ@6|UmR1ruKY=k=`g1ay|?1m!CN?wL2bYZx6NBvDXbu48Y&cKJ=x^ zW3jhCmf)-ikr#&fJJ9l5of~#RmvLRn5mW6R%6wCMEv^&trN^@>Q&J$?Q}XM~Z|QQ$ zYj63~WVFkl2?XRtFE7cOK5CP(A2S-BtFPo^*x*qh*AtFiKh#UB!KGsu`V{KR1I2-?zb*Phv4c+L( zvvfTn-VI{n%BXZ$XRuaZ>Y#F_bWrwHpXA$SR^s3%JYRWCLH3Fe@I%T%*YL}^jlE6- zpZXzMQe{r%@a9#0ADd;N;YlreLynR3E`KE!ojPGzky3> z2WIMcJe>6?@m^wLuh7Kfy7M>|$oYBtIlI2((jaK~xvA&8^JGIs>5VdC$#nbh^^gdvg zS=kr!wg?SY`6-_06Qd={*MZ}9Ez!M$vdtnV@@4!=9#8a#(%lptVd%?_KiNGBoDL9uf$J)9tt?l2cieF=)z$y^jc5ux)mrqV5zrl4Qb_w84ErQYtN ze&w{l2i?2MdGIEa5Owu|8e8~s#?gvw2v zZU_At=;6R3Sn|kuM}!F9o0!Y**r38+L|eu%^s&`k3+en*XTXABy|SO4{wr5`VpBFT zng0c>B{p|81_G17!Q5WOW=B28Vkd+hX*bhGs;UZYLlaCAO69vD8Q1&CCbcl8`H#svabJTVS>dyjvPn-vYAI1!I~wlkQ0)1qP=@>}&C zVhAX6(yd(ar#jf516R(1PNQ~^JV9W0_dOU2WD}#egFTq(Nlp)Vu8j^A@+4RtP6V$F ze%U}1DBjB@310q59j50CP7}XIrUI;aRhU1xuj!woFiZ}5x{eaVF z&?c-^R+ie}FRx3x%jJdb`3HY}ED0^Fb*c*fvVr46*=6$dZb?`p>fG=M3yBE04Rr(0 z^#6c4v}8(A*r)gt-gwJcVyDtXf-hd>ILn)TE_x7$E;aLa;JRKxtY|e|C?|;I0A6iz zklz#K<^}lCS6;1`TcKl(SQMdm+Y9xAlE~D`8L}Rz;opxdIJNilU-8UHp?vj9 zxMxyIvpH}XSIqjfGnhBA-8)uTr5A?lX)*ok=1%|DLhad~_GYpI5P$8$o+JidUv8MO zbCjR>^u5{FRTob&ha3L#$(f659_Np}q13CM{lbiduzemiZ3fuoS&D&^J8Hm%Z+*7& z4qE!dgPIc`k$3gI0RTXun^nvEl`?wNY@DewyhP&IZ~`hQxq2vXGu_jgHv5)<4X_+_ zNDxG%(f%4Hc>MLHYN9hq?2FW%0d}vozf)+^n}HQLe`SwrCN@*(LyVo5Tu|D+gk8J0 zy}xG*`&W@$F-20`A&NL`@7T%k$U$#|V1t;4%kPf4+y3|v>@X230f@)F-ZV>B&aUO8 z0yvRRI6WPP1U?dpVO$L(Gapr9sH>S=T_9dum_*#4!A*+Zl;5TMovS-(kwkO^E?Ete z`F-0TUi)t#U3En|&)3i&Vp7;>r>uWxVYpLHo5%-J1pO>bdl&IbES5Y&YYYZtn|86q z-3%bg;Do=O|ALHkM_cDLVJkKArG=LSMT2SLd2jB_L(iU5{U{_bb~eI0pu`U$xur<3 zy7-rXC>j@B+(P9`#qdJbisLu3M)71nD)7_dysG9O5Qb-mceTP{Ol@Oz0?5AAz6r8n zSNYLCzu{_0cobU}|6w@!?d8(a*OP=lQ2m!c17!Yy>*MDsLz^~RNpG&Zs6(F4AWzw- zswc|3pS6uf_swn|zdK8hKih7RwV70*XWRPS?g4jT*C@SE$dhbS4nh#w3;8!9uj4ZO zwu61+vHp4kq!bIrYrm^$FDo)QfJmu}e0K8%eQPhIK7Z>bcC4zc zty7G}HL+ibD$L4LXhvBy%K``gtX_PM%oZv?Ae&eg)X15dIMY+x6Ud!~?Fa-j)$a!% z)E+hOP~ys_qhNZ+Sh@)^d^;{Ktwa~R4i?B8{Be@(`KkBv7X5L?yk{F464n*WosE#* zLLzC#<`Vz)u(YxZr2#1%VS^jERm3l}tQXr}n_ zbt_TTXyUMr(|SSXY1uGJmCI0cGeV=-aEgN_M^uI{22i&zG#@~ER@lP)Gf^upwlUC% zA1wDVhSpeYwEDvkE3|9ZPb2_byH}Od6^2X)=XW|}q_H8_;>dT9DLfQcN-J|&wUpn; z$t(A;_l!T|YN)G=wK>F~S|OX4o(Dr3XvNJM?U=WoROwd7HzoTTiCo*PlmJ)al_4M3 zIvf6QMb?hEGTtsjj*a3sm+_7|ZsMi@vHI1}bK5nYRlCM){%Zb(>TXUHddd0rG+Q~& z@-GTVdkR?(ATVXF%5x6Ca6>y54G+VoR|R_XOS%M~odA;at*{N;pW`Md z>ZC2Q(m}Y_n5&cWOs~8crO?peXJx1&Enf`=3Yh_Wm_Q|mbTn&G2G0*X46jnq5pi4I zmnW|ZlBWW)NtDQWKI9Vg_HP=V5Vf17X@2!3Tx<+d35p41F-vAr`tGz=NtD9|e6Pz4 zt2KY<*v&S5^ggbRH_@}G?G7P2LUdBcLo-)S#ufu_o?;?Lh=fBNkeGf`-%AGKTLw*U zyX`>aF{nUZjLk5TJVy}GFaLOQobl%O2)(QP@(}zv+fsf^si0N=_Ia|qqs^(ts2I3M zzSL$@=1rnA2s|dUleC~#!-w9a&bCSDbhM#>PG<%<0Jtxg;N!!Z6(l)R@1Lz{w2fCv z7R=c3d=x>8w9qVO1LhX83RSQqRg5JPwd`Dt;>u34%ZvSnmnqk?dnJ%ka1E%{p z@pdgq3pFagYpqxF(=ZF;%N8%B#4^T}3M^(n5cvg{g4rs*C?{yDgyEw3nGH!+?`Ks^ zGopCX)PK%cfPX5l=!%_O*3WE~*0i=zt{or{JYm$Q(DV#^n6V(6@OYRi{hW3+SPu>M zI-qdc(Ev9P>EyH?;6fGD!-(AB>&mnj7(_!6S zhi1ro_|uC{4j?U@jZxBDa(12pkri?`H`yQzxd;`8uuxLPFx=NU`=B4+r9bH~Hc~6X z)r&MgWwfKsPxskiw04iW&Pl~QMc*_#)YIV(Mp(T4@^k|^eBU>AF#pGV^F8Ory7`xh z6C*7tZM$Dp($fZWHE&!(wQ_8&r{h}xO$a`bi22*xwmR^{;KiR^Bq_JJ!4B*y6eVIg z4p|m^%NuBIb0KMeX`9tI7g8cw9Wc2~=GQ(3q4FpPzm!VP8``2>FnH-6SqwFWfQr-S>F$FbCEIQ#OB-pM&uJ2oX|-%pQDnp=mVMz;HJj&c?`@ z5%#_`T?c)8yU`Ou?@zp%TdPd~I%(pyEh@(WrYs~1_(bl&8k0v^cb zK8|zp8ywlDvmmS+;z;6t{`g$wiWsNzSPR6UGP;Hl0KTCatFsIg@MKveWoftO%#yZ$ zm!N(NqECtyeCbKw@!XnNuH9}?XBAU3*gWTn=dKZ~>4W-Lu|6oq{Y}Rk0Uy#T_s=3- zsCW$d6W*$4nIXxhY8gYdNYB{`YK!v;Lh7&qK}(kb%1V$qP;ky|wyeR<^|teFUIF}Q zcbR=4mN8BLMaIzL`(`0`OG@sWb0<7N1+^DLvD|Yd*_vWJdUG|ZnBjsUPMO5BGJNKM z@lMeN13R`91_l8Ux#jh>Ru3Hk^y7{Kg$zHSFnlLixSEA`f(7&?oR*DZ}~a zxpF_uj>54nNd!Jay?kyX9oFKXaEK$>=2pT3PVR+>E*h*YHX6?K1I%IZcbaADNnRFz zL8AVTp8ArI*1$@r?cQF`zlBH}{QQk^x&NgOm2dHMuS@K6_By21o;|E=4aw`h!ViyV#Un7YcWix}FSQeI^IQaf_-N(|k1%E2E9JiNap z2pjaL46mD>{nRUkSJY0Zt8%ENbLW*$=K0q=j?Ed}|M-UAIaTH;UvR`=!AH?e zyKA4zd4D1|d=p+Tm%vY#qtdKEgOWT#${Xe?tY&jgSW`{sm^hVHZ)%IXmg}jq#jlbe zk+&S1OG(R!qt@f2S^wL%08utLM9r9I#&sq4-&$I->wu)&3|mg_f5eg|FI{*gEsS>n zJZF!;eWBrIve+W6=$A&*?WFs6RQM zEYfADVt*2tFt_sazJK|cLzvVFZ}~Bgg+G$}63On|nxBZfUL{P7)hs(9Ut&yzxqL00 zv+}F4AkICv-GSXHo$4%A9X93K9JRO~Qvy4VobtFjP3FKzXn>4+9kTSH=Rs_9PHIde zF@oIWu{2sc&vttDBv#Lo3s5lx9PM@+a<8-KcVL3bo&o(psu|$~v1%0cK-!{jhpXU4 zsr~@;VwnNG1_$nKQZm4r0rL-T-B8;7UKeA|6rN&|;lY|%H2frb*%;ig4~mP8ch4EI zfYYtA-wfvtApHYvAw)r&SrZ5TCQ>r)T8>r$M{Lh?xS&(O_w+t!1Btj@zphf7&*v`z z1_48&PFcSQBYm!pmP@{hmUnhPwW8f=Zi3>g=f2zKGg{9B$=l83!~zcwn+kn+>yvp? zqrYJ)AFBQtrVFpRlNp=Z*f7p_JIntS$zY%Ff>l!-EhItSfSBisEx~De9%Z1X_xv>S zl0`0zQSf8<*|7r;Y4$>g?;I=Jm--nICj(4{;`cB88darwdw&Zhwx0WzRzn;^)ii`| zEkhQRhs7(Kv`^R+rNn5rB$_SlY$u>#@Xgh;+bGgM=4&-5>dG!c(C3WD1DlTv}!G$<$4~9Y3Utu)`*#UIYETG^0-|dBSd}&nTwk~z;W*cKRq0~*&ZqR zPpYJma<)B7irbvBvNROiNjQ zZj19xiyi3TdlxQdB;my0eOa&L)j7Q~WcMvE(71Ae8aw6-9l$USFUTvG8(5S!ljw1V1Z-2;ms7-RN}=pGEMKj}b^v$QHM z7qt2SF*cY#zDrvqqWsy+<>6w+OJ(jDe>%?co{c_=wQqV=0)z8*SP%~Gg&t#-|BnS& zMXB21xFf@r6QN)_N1Mm;`*V#R0Mv#KvBTX0Fk#VXMc4F&+_N+6dLjJGzaWJ}zZ#$x z##b#Z?97*}!AeBh8hC`SFF6-(# zzU5n~minKno0vt`|<(*|%UhE$n24=~jq8hE@1qqjpCws5zsk=b*Yp zEoW%z4w1Vmt^GKRP^Etk+%=JJ8!YTg^*EEyjkr>MjUiOb_ETjQ-Hmca-=)|7fNXBy zo0g1Bf52s!=sgYj0anq;v!t-y!|6XyJ^4FMQ}3ijf1n(&RkB38!YW+~W@N?Q@j3oI zKENX3XvIFVh^{8UGm7@o<)T~$W<170HbU+2`nS8DGu~s$bPtrmv*(H#19#BkqWn;D zL7KOx3omH>r8vtaF|a>#zvCNULosH}VI6%d zgqZOJ+$!0s`h!wqxf7AZ{C2+<>S$tprcv@IzHcbK6d-(*3>shW`)ICkdZRl~*!{b`d=qzcTtH95L=hE61+EgPh13fRpI*lK!zicpq_?3re@C91Pjq) zFoK-Y%f84-4r)+@A8EEz5V4fINpX}X1X(W5%8B`?pM-;gvKjfk0OKs{-E(X#uF21R z)1r?snu|j_1zo+s1l;VOxn{oz@9iCR=oPo_QvJ5FV@4Cht{6(TJS|~#zb-B=4(V7F zXJdw;CWJ2(ZiW6D5u=oyjpr26_umS33BH~DL9 zC5P84cSwwoGOo?(z+xfRVr!usruVOT_ss|2JG3bGOcE4AD!#GaFWuJQK(Ciq%fi>3 z52#3J;om>hWYD%W!k?>CY5K*V)GQ^Fj?O;s7pJRR6^rpsU25!J9+r}>E)tEw`CC`R zhPHh|a~pP$jL($LYuuOP3Cm44+E%0wP21m)wRqgg+Y|sgb;X zRSgYRuQ~NSqq*RG<1O}%6QDlYkHTh`kj9$C`5Tj~JKbHY$2>L!aa3LfbT?Xwtz$HW zev5ad?RppK0dun}MS!M4+^pu#PZUG|q9Nuz`of1M=0nJjWuUPRY!%)$LOvSv(s%7k z^$7q&HoMvPuFJ*MdnsK&4H)O7TC6^H7b+A?se$s?H6b&Kbff-nS>NC}vbZC0 zVY>u_^L9w zURLXPPQeTwuFt&P;G0imMHqQN&2-P~z=9@otsh{c}F){hQ}^GA%+N78>FTLJ$=f9)^7Ois)if+&f>q__1?mqo6=K59q9Nqb_x zN9R!aszZ0W6QBNmhbxH^UGmlh9DNoTc~=XjX%%T|s4OWpITx_@6hXQl+kCmR5X&x= z*rtA3xhm<&Ab*qji#bodJT2?*K>nf)EeYREQ9(oBGSfLqo+#!-Y*@a9FL(eB5j=OIE;xm~E zW@8GbNt-2NI+7bGlm_KM`F?0`%U3{xjDYl%kdmG*nQ_kZ%o*49Ps?zzbuULjMmY6c z9ywCv6Vpk!Wg-KFDS)+l7W5L~>S~}}NS8KyaIiKZ@Pj9-4%%Kz{q-Hv+O?EbRazYg zP~s_HzLIoF^SjSL^(bm|XmQ!Vey<_tu* zZ{=Sg?TXwyFqi}@G`Z6=}Wm*|?`<=a+Bm zUxmJ)Hp&3@bR6d+J=oj*AaPSb1jSkR2g* z*hdhV%C)_jQK2nU`d39>Dqz^z)bfbV>#P>%_n(*qTeXUgCCPgg2_N^g#E%=XbvpFn zDh;b3@y57r-s7Ca6pTl|S%Kp$$UQ)`f_^x3M? z$(64rq@gbraBf+^lg=;li^W8(Z@Mf+_%ofhi!d$@zI})+F5){`ij^C!L-B=uec7&{ zLw>J-*Iq_GJSKpJLVQ%Gg&Xo54IiW*%h141ebyx|-DoCa8ZNeT%Vw|0{o9F^8!pV5 z|Jk)*e$pL{qnzvALDb52vfkr$zg|rk9(}MqRH@ZM%;ij)C$;9_K|H-T8=b&*TtC{Ic#X3i?cg&m~cfaM+j;e3wcZfV7_90Q8UR0DF`9A+$A3;OL$GmNZ zbmN>L!T_9Nf7d4 z5c$;fUUS_$WHOO2ANZ#AOlAk@UZY^>4jqqoCzj-$@TLM@2s3#XCi_$x7~|LKtV%@t z>|^3QfZw|0hrYcHK?fpT&c^5=1N$rs1|{aqjJ-dn|6~pld72~tR2AQU{5Kzztnjx)Brg@Sn>m? zaoUKgS&tYPJu&ZdaIpGR+ftseK-m;X)f0_hnk@i zn5%ESkVz406if}t34$)JB@i4m7j9xjD^AXgLj4v5v4T=>X3JUxG#!Ft`XI!9ebKgu z*a9yjPm|8NuqazrH*yFHR_8{GN;%(1V+&YcBi5zd_2{_;p+6k@Le2 z^s4){jPWKPlqYkkmbxVkd3}OuSGl!9hBN3Zac5uqoK_vsIZQ^I zPijN3k9j7+onB&nxrmy9ReK#c6^M1qs@$h0s>OYA)do=@&d7o+r{&echoy1* z5){wY#*kXrI3YC`4Cah+&C#IwXs*rGaOzFctD{MJICcUkk?7N0b+AjWo^ z&)RKGFTYaC9R~AB9V&$xYO@LJ?9L3Q7l)8@Pk;w2SW6wybXjQ{m(<_Zhgeh({Yv(G zKaHxpZ}d@D*0{1-^#`VX3fL#;PyqtM-m~^9;ysWs?7LQ ztZ+#S+fBEbJX#qMYuN@|qWEo-g{@S06z5-k@7*;4-c|*FL3P4P5WTMw4VVB3NPs(LbJvZV~ z-b@Y;c~4%wTrPQqH94Hf`#^VnH?MnX{aC@+Fgy8d^H;Y@5GeYMU~z0m%y_!Z@TnVk@CPk5wSxb}Qofvuk{Rv60hN$#W?t zw0W~1&)iAq$ltO}Vsy0dqwv(%vFM?#XL}#(G3sA2!4Rv^)vnY zVe*YCg*3$~T14W&y|2)D;JF|O?E4m$M%Muad2GDei5MiLJGL5c&P#L#zkHDHYnou! z(0B%fxZxh7w-0@NV3Y>q05e=R0**JV;3Y2n+@qi|GYkgWboqa`Y5G1%v@lgN;a!e#?M1b0DfG>Ngd~$J_SpcL546hYovF2Xs*q1i zDdlXQ)A{%=S${J>LaR|=Eayx2hkkwqBn*5MiP{*g7SyVT0wu<7FXjs>1#RJ`9hz+O z5hLBn1WG|;Q?qe=1&TO*&o*!=U5%s97Ar27?xEasLgsq+60{BW6yJF>vpB6L-^mWt z*(;9J*~gT=!FI`IUeco>$%&lyzR6#u@iwFAP~^h)^?fT_Xv?7ONP7U3q$0&c5z1u;<;bmxGmXB39>p&Otm^RAx8T;HhQ?L3r7b$!3jBJ zl&+t38yk})d0@rGQrJ)lEvVbZ@Gw3H-&99$(~YU2_*wP{HM&)#pUoak6)Hjal|~2u z8(Rx%Tb1*eLV@Gb)JaGzZh57}aal)ku2-jaes(Mib0*iIKwcC&(ymi2*x1Bb-0w`9 z)|~?uw*6mp_w~Cvnqqdh=9sb;N=-$=Ll@&j0tr`yc9uMT(>7BfvB{N?vPwLqIC4=E ziNwwHpK>1{1^1tPdwaLxX&LncX+S#)7QsJKV+XeT@WsN_paFM~#bx+EA~fJH67CP1 zt>$Io=WRIBA$%X}Y-1`sw@C|D z7-AuR!3!<6q-v1FelyF|^Fs#-SSw`nq?~^>CVlv8fvYnJ2}Qk%iXF=pxC2_>+$6@#hbN059s5Eg7&T<-HH|DKw-WulT2}7P*dF=@=E!JoqT;F=F z2z@sU4gH3j2NK1*oO1Bhn@Ad}a~i{ehoPI{y$^3A;eNB1M?(TS$mW zd9Vx}4{tb9*xop&wYvGuv(~f;Uh(s}zsSfBFGwNuR?Gqwa%+#Xhum}qew>2HJ|Jkb4+VI5gL)saVGmK8 zLa6`$s5%_L`jOIveC6HFVq!=8oe-c?o{1KB5ACwdvGDQ7QmkU##3zdPRDwqM-8(Tj zQTsiZPwFCz{B7jtj4ZA^C$X;t1}@;z%r4o%OVcSrqB7$-h@D+bb6vXam_d0>O-p-= zhP)8ucGzw!rwngqc1Ueniu&AYvF>VX-)x(zS0UZ>|0A*OMh;?Wrd|z|0MG5C|2`LT zB&B0`SD3J2Zh;Ufhk>vc)Xo5(`W-aF-|U``m$#o0p`+t{#gA*86823jJ2Rd<@`S(X|sH6X9XEfU&o_o z7hy5x0}xg}B5wUESLIPGZhihA>om-TW@rESmmZqn+}ajQ)dZGg>2?k}B%?wy6jm6GmK zr!mQG<~zh9fC4JGe9Z*>*@Q}7&k{+3Pwt9|+$6lQegP=%>d1H%r%*XzeK318{%FiylU5S^{hfV$<(E&PS&0X5Vn|L3q zruJdu4*9t?E#{X8-+xyb#l@`sLbe~WB68*M5cAG14!pUA&}*hp*Q3K(>BA36iQk16 zJY`bl0U)n=@!em-s^OBFbMmR5zeCsG3Jum#@;m7v8PKQlPY3q(QTAy!k2R1{6XfPf z6us}(p&cx}bLFdT%;5gr+h#R+8ho17S?7T` z8iMn^bfo0Re+kMpX|zGc!<-58EwXBW);?=iIFi9(=&Mn~#*cD5@5%Hygf23ABu@Z~ zo>egOt(-$9t}@2PIpQDc9uPli78`JO2M;=Je`i<;=v3HI2__fc4Qy(M{d+H$mxs)!Sss~xOKn)$ zrZCS<`l-*^VtsE&(YZ<53o;_J=F!g;3oN~;K}NlX^M9`tcspFuMrgjjaXBuUvJK0* zJAZRojrvJ7{6#le-tb;J4M9VgjYHc1K%Z4zco>3t{<}xc`wru2%flUii*uwmDx=xv zlfT7z%W5N{gnTzF(E(wV`=sr7k{}#8NO7zq4ZaS5^QYF_$co6iBXr3tUm|CW`aFRY!XcenIndFs09Ad=~;*9TQ$^+u$d?bzf?O&5%Ny#~IR zh10SWUtXCA@|?&Bw%0CkHs@by@cms!f4=m>D#0MH_P^{OtXY)1y|u7~x5Z}};FuYP zXZa-jF|dc`A}A>xG0YVp_MVzz2og4@!)uGXIK97!0OGcLB>C#UN*hVxN8SI%WGXJX zs;4ac7XEPebWsZ#5#c3n`Rd!WGkyQoI(BaF4uQG0_l5`xrQZDfcc#fv@C_kwX8A|M z`L6TH2664lH-VN2NO)iOy)W2Yk3~W$#XH@Uv$qpSrL#DlsNKpRPjop$K`ug z`wCa;HLQ1~@1?U}e{*qFpq}#jz>d5gxir5&;UjegO2T;bA6Ssf2znTZqw25v0Hc?E z_}TmPp|qn;VlS`l@<*QbMReAAJSGqgO|PMdMOCB!+$F!|^}rdj9KRoIp6~831Kmr9 z$=hTg;cTs%aSwBk{=FA;`nt21>5opLK9`8Mw|`WXN@OT+B5uE_`{eFJ$M%?;6Y+?#Vg7w?$TxI1IL>FupsbgI}_=CGu-Ili1JQvAG?nE+@ zVR+aNd;!g>C*E7!D6Cpa(p1P%t*kgkSq0S(!;B2*jRJMl|~P*ZhWr-SHD(>MO$8PCeW=ZnLFqd5JBNEA8x6v^~lSss%OtI zfZrs=)a}=4t?j*?(nSXUzVZY^M8UCJilIKr-BeFaKew`s$aPx^XV8vU34fpvb1%ew zR;R-;;CkxtyYhYHU+Wxeh>2mg(&n%nry@@k?wqanQDWNnFBk$=&%TKfL{`Tdw2kNxIyvCUIQjzHvpY`|l~h$GIG&9pYH zqp_P7d9Yo1Okds(zn{FMFZ;%ugH-&6l9G~Cup&Inzh=j<#^^9}uy*~p*ybsR(P8Fb z?HZ1#E1hYL{3$7&YY8)E)1p3pn^(!KblKg8pSbKYe{)Y#A&b1BBsiJc;-TNi==~u2 z@6VU5Ftmix8zA~qM-DAna)tM_M*bAQyLaz?^5jWZm~opHGvJswPFp^P&#?Oqh8@&T zk|PJms003a58Fz%Ioq~*om;(!kCoFk`>3~Fd3IMl*D zts(N01t*!?9~|R1E%K?0Z55*$biYB+i51-ee?x=gs0Jf;s;SvlLfafy<>@_j_0?c^ zM}F!zSI}AE^}lKuA?QaM4mHpf$+RZ^jgu!exZTy`HZ2-b(&)zm4cgWnXgHuC_$Qy_ zFwFrIrm3k(rJ?fM`~?&0z4xwG%>UliQcoEp`g|cbTfdHAL_czbyZVwVlWA?7J!pSp zH!T8Z<3^FOi|(jfZ`BRj(h|n=*8=x)SefM$I zkbbT!OQ)7Bk%H|bsM%?qCJGZK4b|Oa*l!$3_m2#0TBH|Wbd)|=c%>fUKL6Zp_=#)e z!7lIzQ~}5ZJ(berB|bZIv(&Hl@~#T-a{~)$06!x31dW|L_cy=U^GOTn5!nLxXDI={;>@c6_*tOGq&}u3i)j z$lMo>(8TCF?R0kT+)2%Bc9Wb6b1FNxU%-bXbE#ZcP9-pGCc?-$s#2(j~JM)uD5 zz0c(`Bl~+=>J27L)6f7j&nmCcOHyg5yzc#tX9>5LxlLZ*- z+j5wOwO*?{vu_iz>pevueyBdgE%VVk%4NOUNQ2L@-$*y)gT*&%nU5Iph`f1=@>G4j z>g=dj9VTa|wLtuug8Bk?)1v6SwSSG-UwpB1XVtm0pbPuwpTEau%SYE?nub%S4j7GR zKX%);Z7D-8>>pnJ`PCn~V(54t*R|(;)Q((>@UiRS*+Iz$HQQb1YE&t{nO9}Y4hwye zD|H2-zpCz_lggnx^a*zL-ckpSER76pS|pW^ODRL{HyCom&S9DZ4W}Bk(4{#A_!KVE z7G41!e_#Jn$LwoymHX@+OL>#P?gVy7ct7puN=TY{zp-yg&FWNH8L075rpjD)Rqrsm zItlzcsNS6JRd4F3MmH_e%{NoNu)5@!uj_{QTt*B@Fez-}4p`(=n@ZIJz66$z@}VY5 ziLK*b>)5qxdB={-UanEmu)AYNX5XF2&SePp@82&T$4;L;+6}UIEmcc+U{jY*s+W3= z(RsyG$MaotK`87UwYKX9W=}%zmCb|YY!P zcP?l~4xl+d68;(gU1vX%N>~+A2Y7iwbKT!dydtqW)6%g#yPStHd_J$ycbD$&s6Ss9 zkA6rO^khi;ZYDH~w5gy>I{RMSh`nSi9g}xI*DhfUJ0R}JlP$iyKHmI_-C+Ro6Vy4 z8ZfGtvgi}~&d&^ERuDa=S;+Uw;f$`GCoeG|pV-2mba+SSKY<*mvZlVMcgGClyha+r z=<5NvGwWwRqiFMNyP3@!?NuWld1QoU-+PLzcrfw6-W_vq`saW%>ha!1xN*&%AGS%%UPM&p4Vbo{$R=+vFmKZ_fny^nY8db}t%_kt^Rx8ctTa~R47 zVazBS->i7*GJ?wXhLX3`y}KL^|4$P+9M__v-d(%)E^;{|4KeV&dQr2RaWi=4lH`zp z{hufGjzwLM_qI4A4b51J&_sHRF8y!)zk&~OCQaA>e_6~za80b6x&QzG07*qoM6N<$ Ef{{h_p#T5? literal 51451 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 Date: Wed, 12 Mar 2025 01:34:34 -0500 Subject: [PATCH 165/171] [Bug] [Balance] Fix Locked Reroll not using Luck Score (#5502) --- src/modifier/modifier-type.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 7ceba13440d..3d2e67b0dc3 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -3566,10 +3566,10 @@ function getNewModifierTypeOption( } else if (upgradeCount === undefined && player) { upgradeCount = 0; if (tier < ModifierTier.MASTER && allowLuckUpgrades) { - const partyShinyCount = party.filter(p => p.isShiny() && !p.isFainted()).length; - const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2)); + const partyLuckValue = getPartyLuckValue(party); + const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4)); while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) { - if (!randSeedInt(upgradeOdds)) { + if (randSeedInt(upgradeOdds) < 4) { upgradeCount++; } else { break; From dc46cf6d05807650501500fadfe203891c649166 Mon Sep 17 00:00:00 2001 From: Scooom <97370685+Scoooom@users.noreply.github.com> Date: Wed, 12 Mar 2025 02:03:12 -0500 Subject: [PATCH 166/171] [BUG] Add Multi Attack, Revelation Dance, and Terrain Pulse to Normalize Exceptions (#5503) --- src/data/ability.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 25ffa797140..5d8b7ce681a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6330,7 +6330,7 @@ export function initAbilities() { .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5), new Ability(Abilities.NORMALIZE, 4) .attr(MoveTypeChangeAbAttr, PokemonType.NORMAL, 1.2, (user, target, move) => { - return ![ Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id); + return ![ Moves.MULTI_ATTACK, Moves.REVELATION_DANCE, Moves.TERRAIN_PULSE, Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id); }), new Ability(Abilities.SNIPER, 4) .attr(MultCritAbAttr, 1.5), From 4e1ee9e50b315f4275d87d1079f28b98cfe9d64d Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:32:35 -0700 Subject: [PATCH 167/171] Revert "[Enhancement] Add form changes for Solgaleo, Lunala, & Marshadow cosmetic forms" (#5512) --- .../pokemon/icons/7/791-radiant-sun.png | Bin 491 -> 0 bytes .../pokemon/icons/7/791s-radiant-sun.png | Bin 508 -> 0 bytes .../images/pokemon/icons/7/792-full-moon.png | Bin 461 -> 0 bytes .../images/pokemon/icons/7/792s-full-moon.png | Bin 470 -> 0 bytes public/images/pokemon_icons_7.json | 7080 ++++++++--------- public/images/pokemon_icons_7.png | Bin 52044 -> 51451 bytes src/data/pokemon-forms.ts | 12 - src/data/pokemon-species.ts | 14 +- 8 files changed, 3501 insertions(+), 3605 deletions(-) delete mode 100644 public/images/pokemon/icons/7/791-radiant-sun.png delete mode 100644 public/images/pokemon/icons/7/791s-radiant-sun.png delete mode 100644 public/images/pokemon/icons/7/792-full-moon.png delete mode 100644 public/images/pokemon/icons/7/792s-full-moon.png diff --git a/public/images/pokemon/icons/7/791-radiant-sun.png b/public/images/pokemon/icons/7/791-radiant-sun.png deleted file mode 100644 index ac53b40b0e637f33a74f5474bc35f8ac55b7ecb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{174DbnYRZvj)`EkOJA3s*Lo8H+Tf9UuzS@rgyps1)dZ-7d4Opav(DXx+r zzu^Bcz_96z&Uv6HXMsm#F#`kNK@eu#F){ls&_V}K7sn6_|D}^T`&tZmSc)G={QLiK z?KwxGgr!rrnKH47zb#{W_-pY$?zRs)dmIE6kKEweyr(hA!KrIyOkk)6PrI2!8R(ILV$xpK-j;z`$yJV-pp_=AD-f<_V@twZI?LVRP z`Nn{1`6$5-iTt!7ie}0^BXM6nLS(8__o8F6#kX3I#;A0-O=1tU^|3FnTH-2mc zQrsm$e!>6YfWgb3@e@#(v%n*=n1O-sFbFdq&tH)OwA9zr#WBRff9d4Lyu$_@E(aSj zfB%=?W1XX3ILmW#S=Qw%dk!?p{`?d8pVjqUqyB`Jj#nIW9`dR%yUe=9koxI@=#fn` zR<54eTl#TZgKUZM@#{KbFZMUCFW!ZM&afv+b-C zDYuP3Mp{i+f4kdFTXlKoPW^Wbfro#+zA7$qq-cu%T=VzaOWl?;&3Gzk=eVpT?P9{Q zo~xWCJ3lM5eH5AHvEv+D>CWu9-9cv$$nJ<}XSQ;jP+V?trlV#0@-zjXUTcZQM=lA^ zB#+piR%*A-Je&T2FX`P&n`a3>Ki}YK)lD}&*%Dq-zK0`TA+1^TiBsIXk30F^KIl4l uSGRz@y{z2X|3O~fE6c}MV_ts#$ym>zaB|sxx5>cJX7F_Nb6Mw<&;$TCN#RWZ diff --git a/public/images/pokemon/icons/7/792-full-moon.png b/public/images/pokemon/icons/7/792-full-moon.png deleted file mode 100644 index 6e77f626e94687596e0a4031512b52b96724ddd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`)dPG&Ton`)etw*=s@?STv2&4|kF9zA;orZ1cecm3UU;CwpA^X3_g}3a zs5VcNZx@i_EeY}q{*MG0Y+op~0VOyKJR*x382Ao?FyoGi*>8cCi+Q>@hFJLbUgi{P zR^Va1z>rwD^MB><$sA6Ox6hPpc_zrDF}MC0@5@@B)02wVZ&G`BFO_|-ydv+}nD37c zO_yF?(Q?aMUHXg8hS|M)-aqA4R*5`hp?bnJ<+vdKiPTD;PV2}-wv_3XS zl00rq<61mlamj%Vxxe@AgfkA4V%;cVJOJbuY%t_`lTl@K} zt%Iht_p#mIITVExbk+%+GBtOOnFW{JG?bD5GqV@sYg8 t?LPtqReNhw(=Nn{1`bpw1tTt!7ie}0^>s@>FA+wxpf!KXdjs@>8orIem5opxt?yb6C(AaCD) zwf_JAJ^^(oFKbl*Qv4-Be!>4y0K=6#GZq4+I14-?iy0XB4ude`@%$AjKu3ssx;Tbd z`1f9BoYbtq!+ODCLc^|m|9AWrX4$wPH%%t`GY8|8KKaK@U+k8pp4=H8Il18drsjM1 z74OcntY7_@zkL29!6^N?ITzSl@8&$I)z{zQ5acQ1Cs@SSJh_Ga$tJsH5>}CkY&?42 zo7jBp4o(S}Ancyw-P$d$xWp;$dTw-Vo6d$)W)6vBY`!`&FfVW2nsVpgx4Uy~ z-D1zN2zmC*w$#oLE$w)En%8mKlUs?J7R|0kPDf%KF7VtsIZ;8PedT983Cm`wBTdCm zjMjcWdp1$PaqpCm?`)k;Fzis7&hd1X^ul%SM;1#-y}6`(WLD5Ox!YC$^bH;UF8LzL zxc8}B$K7MCKY|2RxqqMN33&N;^0pZVJ!OvDZ@Z#DMI&hGMPRrwc)I$ztaD0e0ss_R B#w7p% diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index d5faa4e8b02..03eeba88a70 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -4,8 +4,8 @@ "image": "pokemon_icons_7.png", "format": "RGBA8888", "size": { - "w": 250, - "h": 672 + "w": 502, + "h": 325 }, "scale": 1, "frames": [ @@ -345,132 +345,6 @@ "h": 29 } }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 322, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 352, - "w": 28, - "h": 30 - } - }, - { - "filename": "800", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 382, - "w": 28, - "h": 30 - } - }, - { - "filename": "800s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 412, - "w": 28, - "h": 30 - } - }, - { - "filename": "805", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 442, - "w": 28, - "h": 30 - } - }, - { - "filename": "805s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 472, - "w": 28, - "h": 30 - } - }, { "filename": "809-gigantamax", "rotated": false, @@ -513,27 +387,6 @@ "h": 28 } }, - { - "filename": "791-radiant-sun", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 142, - "y": 0, - "w": 29, - "h": 28 - } - }, { "filename": "791", "rotated": false, @@ -549,28 +402,7 @@ "h": 28 }, "frame": { - "x": 138, - "y": 28, - "w": 29, - "h": 28 - } - }, - { - "filename": "791s-radiant-sun", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 171, + "x": 142, "y": 0, "w": 29, "h": 28 @@ -591,138 +423,12 @@ "h": 28 }, "frame": { - "x": 167, + "x": 138, "y": 28, "w": 29, "h": 28 } }, - { - "filename": "773-bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 502, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 532, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 562, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 592, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 622, - "w": 26, - "h": 30 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 0, - "y": 652, - "w": 23, - "h": 20 - } - }, { "filename": "784", "rotated": false, @@ -737,6 +443,27 @@ "w": 29, "h": 27 }, + "frame": { + "x": 171, + "y": 0, + "w": 29, + "h": 27 + } + }, + { + "filename": "784s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 29, + "h": 27 + }, "frame": { "x": 200, "y": 0, @@ -745,7 +472,7 @@ } }, { - "filename": "2103", + "filename": "730", "rotated": false, "trimmed": true, "sourceSize": { @@ -753,20 +480,83 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 + "x": 6, + "y": 2, + "w": 28, + "h": 27 }, "frame": { "x": 229, "y": 0, - "w": 21, - "h": 30 + "w": 28, + "h": 27 } }, { - "filename": "773-fighting", + "filename": "730s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 257, + "y": 0, + "w": 28, + "h": 27 + } + }, + { + "filename": "740", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 32, + "h": 23 + }, + "frame": { + "x": 285, + "y": 0, + "w": 32, + "h": 23 + } + }, + { + "filename": "740s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 32, + "h": 23 + }, + "frame": { + "x": 317, + "y": 0, + "w": 32, + "h": 23 + } + }, + { + "filename": "795", "rotated": false, "trimmed": true, "sourceSize": { @@ -776,18 +566,18 @@ "spriteSourceSize": { "x": 7, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 34, "y": 85, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-fire", + "filename": "795s", "rotated": false, "trimmed": true, "sourceSize": { @@ -797,18 +587,18 @@ "spriteSourceSize": { "x": 7, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 34, "y": 115, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-flying", + "filename": "800", "rotated": false, "trimmed": true, "sourceSize": { @@ -818,18 +608,18 @@ "spriteSourceSize": { "x": 7, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 32, "y": 145, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-ghost", + "filename": "800s", "rotated": false, "trimmed": true, "sourceSize": { @@ -839,18 +629,18 @@ "spriteSourceSize": { "x": 7, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 32, "y": 175, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-grass", + "filename": "805", "rotated": false, "trimmed": true, "sourceSize": { @@ -858,20 +648,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 31, "y": 205, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-ground", + "filename": "805s", "rotated": false, "trimmed": true, "sourceSize": { @@ -879,20 +669,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 0, - "w": 26, + "w": 28, "h": 30 }, "frame": { "x": 31, "y": 235, - "w": 26, + "w": 28, "h": 30 } }, { - "filename": "773-ice", + "filename": "773-bug", "rotated": false, "trimmed": true, "sourceSize": { @@ -913,7 +703,7 @@ } }, { - "filename": "730", + "filename": "773-dark", "rotated": false, "trimmed": true, "sourceSize": { @@ -921,20 +711,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 + "x": 7, + "y": 0, + "w": 26, + "h": 30 }, "frame": { "x": 31, "y": 295, - "w": 28, - "h": 27 + "w": 26, + "h": 30 } }, { - "filename": "773-poison", + "filename": "2038", "rotated": false, "trimmed": true, "sourceSize": { @@ -942,20 +732,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 8, + "y": 4, + "w": 30, + "h": 25 + }, + "frame": { + "x": 349, "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 322, - "w": 26, - "h": 30 + "w": 30, + "h": 25 } }, { - "filename": "773-psychic", + "filename": "2038s", "rotated": false, "trimmed": true, "sourceSize": { @@ -963,230 +753,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 7, + "x": 8, + "y": 4, + "w": 30, + "h": 25 + }, + "frame": { + "x": 379, "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 352, - "w": 26, - "h": 30 + "w": 30, + "h": 25 } }, { - "filename": "773-rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 382, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 412, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 442, - "w": 26, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 472, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 502, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 532, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 562, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 592, - "w": 26, - "h": 30 - } - }, - { - "filename": "773s-fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 622, - "w": 26, - "h": 30 - } - }, - { - "filename": "789s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 23, - "y": 652, - "w": 23, - "h": 20 - } - }, - { - "filename": "784s", + "filename": "785", "rotated": false, "trimmed": true, "sourceSize": { @@ -1196,18 +776,18 @@ "spriteSourceSize": { "x": 7, "y": 3, - "w": 29, - "h": 27 + "w": 28, + "h": 26 }, "frame": { - "x": 70, - "y": 57, - "w": 29, - "h": 27 + "x": 409, + "y": 0, + "w": 28, + "h": 26 } }, { - "filename": "747", + "filename": "785s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,16 +795,226 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 + "x": 7, + "y": 3, + "w": 28, + "h": 26 }, "frame": { - "x": 46, - "y": 652, - "w": 22, - "h": 20 + "x": 437, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 465, + "y": 0, + "w": 28, + "h": 28 + } + }, + { + "filename": "792s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 70, + "y": 57, + "w": 28, + "h": 28 + } + }, + { + "filename": "773-dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 62, + "y": 85, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 62, + "y": 115, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 60, + "y": 145, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 60, + "y": 175, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 59, + "y": 205, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 59, + "y": 235, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 265, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 295, + "w": 26, + "h": 30 } }, { @@ -1242,7 +1032,7 @@ "h": 30 }, "frame": { - "x": 60, + "x": 88, "y": 85, "w": 25, "h": 30 @@ -1263,12 +1053,306 @@ "h": 30 }, "frame": { - "x": 60, + "x": 88, "y": 115, "w": 25, "h": 30 } }, + { + "filename": "773-ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 86, + "y": 145, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 86, + "y": 175, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 85, + "y": 205, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 85, + "y": 235, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 265, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 295, + "w": 26, + "h": 30 + } + }, + { + "filename": "772", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 98, + "y": 57, + "w": 25, + "h": 28 + } + }, + { + "filename": "773-water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 123, + "y": 56, + "w": 26, + "h": 30 + } + }, + { + "filename": "773", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 149, + "y": 56, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 113, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 139, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 113, + "y": 116, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 139, + "y": 116, + "w": 26, + "h": 30 + } + }, + { + "filename": "773s-fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 112, + "y": 146, + "w": 26, + "h": 30 + } + }, { "filename": "773s-fighting", "rotated": false, @@ -1284,8 +1368,8 @@ "h": 30 }, "frame": { - "x": 58, - "y": 145, + "x": 138, + "y": 146, "w": 26, "h": 30 } @@ -1305,8 +1389,8 @@ "h": 30 }, "frame": { - "x": 58, - "y": 175, + "x": 112, + "y": 176, "w": 26, "h": 30 } @@ -1326,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 205, + "x": 138, + "y": 176, "w": 26, "h": 30 } @@ -1347,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 235, + "x": 111, + "y": 206, "w": 26, "h": 30 } @@ -1368,33 +1452,12 @@ "h": 30 }, "frame": { - "x": 57, - "y": 265, + "x": 137, + "y": 206, "w": 26, "h": 30 } }, - { - "filename": "730s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 59, - "y": 295, - "w": 28, - "h": 27 - } - }, { "filename": "773s-ground", "rotated": false, @@ -1410,8 +1473,8 @@ "h": 30 }, "frame": { - "x": 54, - "y": 322, + "x": 111, + "y": 236, "w": 26, "h": 30 } @@ -1431,8 +1494,8 @@ "h": 30 }, "frame": { - "x": 54, - "y": 352, + "x": 137, + "y": 236, "w": 26, "h": 30 } @@ -1452,12 +1515,33 @@ "h": 30 }, "frame": { - "x": 54, - "y": 382, + "x": 109, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 109, + "y": 296, + "w": 25, + "h": 29 + } + }, { "filename": "773s-psychic", "rotated": false, @@ -1473,12 +1557,54 @@ "h": 30 }, "frame": { - "x": 54, - "y": 412, + "x": 135, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 134, + "y": 296, + "w": 25, + "h": 29 + } + }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 159, + "y": 296, + "w": 18, + "h": 29 + } + }, { "filename": "773s-rock", "rotated": false, @@ -1494,12 +1620,54 @@ "h": 30 }, "frame": { - "x": 54, - "y": 442, + "x": 161, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "796s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 177, + "y": 296, + "w": 18, + "h": 29 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 25, + "h": 28 + } + }, { "filename": "773s-steel", "rotated": false, @@ -1515,8 +1683,8 @@ "h": 30 }, "frame": { - "x": 54, - "y": 472, + "x": 192, + "y": 27, "w": 26, "h": 30 } @@ -1536,8 +1704,8 @@ "h": 30 }, "frame": { - "x": 52, - "y": 502, + "x": 218, + "y": 27, "w": 26, "h": 30 } @@ -1557,98 +1725,14 @@ "h": 30 }, "frame": { - "x": 52, - "y": 532, + "x": 244, + "y": 27, "w": 26, "h": 30 } }, { - "filename": "792-full-moon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 52, - "y": 562, - "w": 28, - "h": 28 - } - }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 52, - "y": 590, - "w": 28, - "h": 28 - } - }, - { - "filename": "792s-full-moon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 52, - "y": 618, - "w": 28, - "h": 28 - } - }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 68, - "y": 646, - "w": 28, - "h": 26 - } - }, - { - "filename": "2103s", + "filename": "2103", "rotated": false, "trimmed": true, "sourceSize": { @@ -1662,264 +1746,12 @@ "h": 30 }, "frame": { - "x": 85, - "y": 84, + "x": 270, + "y": 27, "w": 21, "h": 30 } }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 85, - "y": 114, - "w": 25, - "h": 29 - } - }, - { - "filename": "783", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 21, - "h": 27 - }, - "frame": { - "x": 99, - "y": 57, - "w": 21, - "h": 27 - } - }, - { - "filename": "792s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 120, - "y": 56, - "w": 28, - "h": 28 - } - }, - { - "filename": "740", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 32, - "h": 23 - }, - "frame": { - "x": 106, - "y": 84, - "w": 32, - "h": 23 - } - }, - { - "filename": "740s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 32, - "h": 23 - }, - "frame": { - "x": 148, - "y": 56, - "w": 32, - "h": 23 - } - }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 110, - "y": 107, - "w": 28, - "h": 26 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 180, - "y": 56, - "w": 19, - "h": 25 - } - }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 84, - "w": 25, - "h": 29 - } - }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 138, - "y": 113, - "w": 25, - "h": 21 - } - }, - { - "filename": "746-school", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 22 - }, - "frame": { - "x": 110, - "y": 133, - "w": 28, - "h": 22 - } - }, - { - "filename": "725s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 138, - "y": 134, - "w": 25, - "h": 21 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 85, - "y": 143, - "w": 25, - "h": 16 - } - }, { "filename": "2026", "rotated": false, @@ -1935,75 +1767,12 @@ "h": 28 }, "frame": { - "x": 84, - "y": 159, + "x": 291, + "y": 23, "w": 26, "h": 28 } }, - { - "filename": "2038", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 30, - "h": 25 - }, - "frame": { - "x": 110, - "y": 155, - "w": 30, - "h": 25 - } - }, - { - "filename": "745-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 140, - "y": 155, - "w": 25, - "h": 25 - } - }, - { - "filename": "746s-school", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 28, - "h": 22 - }, - "frame": { - "x": 84, - "y": 187, - "w": 28, - "h": 22 - } - }, { "filename": "2026s", "rotated": false, @@ -2019,14 +1788,14 @@ "h": 28 }, "frame": { - "x": 83, - "y": 209, + "x": 317, + "y": 23, "w": 26, "h": 28 } }, { - "filename": "772", + "filename": "2075", "rotated": false, "trimmed": true, "sourceSize": { @@ -2034,62 +1803,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 83, - "y": 237, - "w": 25, - "h": 28 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 83, - "y": 265, - "w": 25, - "h": 28 - } - }, - { - "filename": "2038s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 4, - "w": 30, - "h": 25 + "w": 29, + "h": 24 }, "frame": { - "x": 112, - "y": 180, - "w": 30, - "h": 25 + "x": 343, + "y": 25, + "w": 29, + "h": 24 } }, { - "filename": "745s-dusk", + "filename": "2075s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2097,20 +1824,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, + "x": 7, "y": 4, - "w": 25, - "h": 25 + "w": 29, + "h": 24 }, "frame": { - "x": 142, - "y": 180, - "w": 25, - "h": 25 + "x": 372, + "y": 25, + "w": 29, + "h": 24 } }, { - "filename": "783s", + "filename": "746-school", "rotated": false, "trimmed": true, "sourceSize": { @@ -2118,16 +1845,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 21, - "h": 27 + "x": 7, + "y": 5, + "w": 28, + "h": 22 }, "frame": { - "x": 87, - "y": 293, - "w": 21, - "h": 27 + "x": 401, + "y": 26, + "w": 28, + "h": 22 + } + }, + { + "filename": "746s-school", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 28, + "h": 22 + }, + "frame": { + "x": 429, + "y": 26, + "w": 28, + "h": 22 } }, { @@ -2145,54 +1893,12 @@ "h": 24 }, "frame": { - "x": 163, - "y": 79, + "x": 175, + "y": 56, "w": 17, "h": 24 } }, - { - "filename": "796", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 - }, - "frame": { - "x": 163, - "y": 103, - "w": 18, - "h": 29 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 163, - "y": 132, - "w": 25, - "h": 23 - } - }, { "filename": "748", "rotated": false, @@ -2208,8 +1914,8 @@ "h": 25 }, "frame": { - "x": 165, - "y": 155, + "x": 192, + "y": 57, "w": 26, "h": 25 } @@ -2229,264 +1935,12 @@ "h": 25 }, "frame": { - "x": 167, - "y": 180, + "x": 218, + "y": 57, "w": 26, "h": 25 } }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 180, - "y": 81, - "w": 19, - "h": 22 - } - }, - { - "filename": "796s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 - }, - "frame": { - "x": 181, - "y": 103, - "w": 18, - "h": 29 - } - }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 188, - "y": 132, - "w": 17, - "h": 23 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 191, - "y": 155, - "w": 19, - "h": 25 - } - }, - { - "filename": "766", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 26 - }, - "frame": { - "x": 193, - "y": 180, - "w": 24, - "h": 26 - } - }, - { - "filename": "801-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 80, - "y": 322, - "w": 20, - "h": 28 - } - }, - { - "filename": "801", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 80, - "y": 350, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 80, - "y": 378, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 80, - "y": 406, - "w": 20, - "h": 28 - } - }, - { - "filename": "766s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 24, - "h": 26 - }, - "frame": { - "x": 80, - "y": 434, - "w": 24, - "h": 26 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 80, - "y": 460, - "w": 23, - "h": 26 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 80, - "y": 486, - "w": 23, - "h": 24 - } - }, { "filename": "2089", "rotated": false, @@ -2502,12 +1956,33 @@ "h": 25 }, "frame": { - "x": 78, - "y": 510, + "x": 244, + "y": 57, "w": 26, "h": 25 } }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 270, + "y": 57, + "w": 25, + "h": 25 + } + }, { "filename": "2089s", "rotated": false, @@ -2523,14 +1998,14 @@ "h": 25 }, "frame": { - "x": 78, - "y": 535, + "x": 295, + "y": 51, "w": 26, "h": 25 } }, { - "filename": "776s", + "filename": "745s-dusk", "rotated": false, "trimmed": true, "sourceSize": { @@ -2540,123 +2015,123 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 23, - "h": 26 + "w": 25, + "h": 25 }, "frame": { - "x": 80, - "y": 560, - "w": 23, - "h": 26 - } - }, - { - "filename": "787", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 80, - "y": 586, - "w": 22, - "h": 26 - } - }, - { - "filename": "787s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 80, - "y": 612, - "w": 22, - "h": 26 - } - }, - { - "filename": "2075", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 200, - "y": 27, - "w": 29, - "h": 24 - } - }, - { - "filename": "745-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 229, - "y": 30, - "w": 21, - "h": 24 - } - }, - { - "filename": "2075s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 199, + "x": 321, "y": 51, - "w": 29, + "w": 25, + "h": 25 + } + }, + { + "filename": "766", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 24, + "h": 26 + }, + "frame": { + "x": 346, + "y": 49, + "w": 24, + "h": 26 + } + }, + { + "filename": "766s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 24, + "h": 26 + }, + "frame": { + "x": 370, + "y": 49, + "w": 24, + "h": 26 + } + }, + { + "filename": "765", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 457, + "y": 28, + "w": 28, + "h": 21 + } + }, + { + "filename": "760s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 485, + "y": 28, + "w": 17, "h": 24 } }, { - "filename": "788", + "filename": "2103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 21, + "h": 30 + }, + "frame": { + "x": 165, + "y": 86, + "w": 21, + "h": 30 + } + }, + { + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -2665,15 +2140,15 @@ }, "spriteSourceSize": { "x": 9, - "y": 2, - "w": 22, - "h": 26 + "y": 3, + "w": 21, + "h": 27 }, "frame": { - "x": 228, - "y": 54, - "w": 22, - "h": 26 + "x": 165, + "y": 116, + "w": 21, + "h": 27 } }, { @@ -2691,8 +2166,8 @@ "h": 24 }, "frame": { - "x": 199, - "y": 75, + "x": 186, + "y": 82, "w": 25, "h": 24 } @@ -2712,12 +2187,33 @@ "h": 24 }, "frame": { - "x": 199, - "y": 99, + "x": 211, + "y": 82, "w": 25, "h": 24 } }, + { + "filename": "765s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 28, + "h": 21 + }, + "frame": { + "x": 186, + "y": 106, + "w": 28, + "h": 21 + } + }, { "filename": "2028", "rotated": false, @@ -2733,12 +2229,432 @@ "h": 24 }, "frame": { - "x": 224, - "y": 80, + "x": 236, + "y": 82, "w": 25, "h": 24 } }, + { + "filename": "2028s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 261, + "y": 82, + "w": 25, + "h": 24 + } + }, + { + "filename": "725", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 214, + "y": 106, + "w": 25, + "h": 21 + } + }, + { + "filename": "725s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 25, + "h": 21 + }, + "frame": { + "x": 239, + "y": 106, + "w": 25, + "h": 21 + } + }, + { + "filename": "726", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 264, + "y": 106, + "w": 23, + "h": 24 + } + }, + { + "filename": "780", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 27, + "h": 19 + }, + "frame": { + "x": 186, + "y": 127, + "w": 27, + "h": 19 + } + }, + { + "filename": "780s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 27, + "h": 19 + }, + "frame": { + "x": 213, + "y": 127, + "w": 27, + "h": 19 + } + }, + { + "filename": "758", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 240, + "y": 127, + "w": 24, + "h": 22 + } + }, + { + "filename": "726s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 264, + "y": 130, + "w": 23, + "h": 24 + } + }, + { + "filename": "727", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 286, + "y": 82, + "w": 23, + "h": 24 + } + }, + { + "filename": "776", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 287, + "y": 106, + "w": 23, + "h": 26 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 287, + "y": 132, + "w": 23, + "h": 24 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 309, + "y": 76, + "w": 23, + "h": 26 + } + }, + { + "filename": "783s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 310, + "y": 102, + "w": 21, + "h": 27 + } + }, + { + "filename": "787", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 310, + "y": 129, + "w": 22, + "h": 26 + } + }, + { + "filename": "787s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 76, + "w": 22, + "h": 26 + } + }, + { + "filename": "788", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 331, + "y": 102, + "w": 22, + "h": 26 + } + }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 354, + "y": 75, + "w": 25, + "h": 23 + } + }, + { + "filename": "788s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 128, + "w": 22, + "h": 26 + } + }, + { + "filename": "724", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 379, + "y": 75, + "w": 19, + "h": 25 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 394, + "y": 49, + "w": 19, + "h": 25 + } + }, { "filename": "745s", "rotated": false, @@ -2754,8 +2670,8 @@ "h": 23 }, "frame": { - "x": 224, - "y": 104, + "x": 413, + "y": 48, "w": 25, "h": 23 } @@ -2775,327 +2691,12 @@ "h": 25 }, "frame": { - "x": 205, - "y": 123, + "x": 438, + "y": 48, "w": 19, "h": 25 } }, - { - "filename": "2020", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 224, - "y": 127, - "w": 25, - "h": 22 - } - }, - { - "filename": "765", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 112, - "y": 205, - "w": 28, - "h": 21 - } - }, - { - "filename": "765s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 28, - "h": 21 - }, - "frame": { - "x": 140, - "y": 205, - "w": 28, - "h": 21 - } - }, - { - "filename": "2020s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 168, - "y": 205, - "w": 25, - "h": 22 - } - }, - { - "filename": "758", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 193, - "y": 206, - "w": 24, - "h": 22 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 109, - "y": 226, - "w": 27, - "h": 19 - } - }, - { - "filename": "2028s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 108, - "y": 245, - "w": 25, - "h": 24 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 22, - "h": 26 - }, - "frame": { - "x": 108, - "y": 269, - "w": 22, - "h": 26 - } - }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 108, - "y": 295, - "w": 23, - "h": 25 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 136, - "y": 226, - "w": 27, - "h": 19 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 133, - "y": 245, - "w": 23, - "h": 24 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 130, - "y": 269, - "w": 23, - "h": 25 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 131, - "y": 294, - "w": 22, - "h": 25 - } - }, - { - "filename": "727", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 100, - "y": 320, - "w": 23, - "h": 24 - } - }, - { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 100, - "y": 344, - "w": 23, - "h": 24 - } - }, { "filename": "729", "rotated": false, @@ -3111,14 +2712,14 @@ "h": 24 }, "frame": { - "x": 100, - "y": 368, + "x": 457, + "y": 49, "w": 23, "h": 24 } }, { - "filename": "729s", + "filename": "806", "rotated": false, "trimmed": true, "sourceSize": { @@ -3126,20 +2727,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 + "x": 9, + "y": 3, + "w": 22, + "h": 25 }, "frame": { - "x": 100, - "y": 392, - "w": 23, - "h": 24 + "x": 480, + "y": 52, + "w": 22, + "h": 25 } }, { - "filename": "752", + "filename": "801-original", "rotated": false, "trimmed": true, "sourceSize": { @@ -3148,15 +2749,57 @@ }, "spriteSourceSize": { "x": 10, - "y": 8, - "w": 23, - "h": 18 + "y": 2, + "w": 20, + "h": 28 }, "frame": { - "x": 100, - "y": 416, + "x": 398, + "y": 74, + "w": 20, + "h": 28 + } + }, + { + "filename": "801", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 418, + "y": 71, + "w": 20, + "h": 28 + } + }, + { + "filename": "803", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, "w": 23, - "h": 18 + "h": 25 + }, + "frame": { + "x": 438, + "y": 73, + "w": 23, + "h": 25 } }, { @@ -3174,138 +2817,12 @@ "h": 25 }, "frame": { - "x": 104, - "y": 434, + "x": 461, + "y": 73, "w": 19, "h": 25 } }, - { - "filename": "758s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 163, - "y": 227, - "w": 24, - "h": 22 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 187, - "y": 228, - "w": 24, - "h": 23 - } - }, - { - "filename": "768s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 156, - "y": 249, - "w": 24, - "h": 23 - } - }, - { - "filename": "770", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 153, - "y": 272, - "w": 23, - "h": 24 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 153, - "y": 296, - "w": 23, - "h": 24 - } - }, - { - "filename": "2053", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 180, - "y": 251, - "w": 24, - "h": 22 - } - }, { "filename": "806s", "rotated": false, @@ -3321,14 +2838,14 @@ "h": 25 }, "frame": { - "x": 176, - "y": 273, + "x": 480, + "y": 77, "w": 22, "h": 25 } }, { - "filename": "756", + "filename": "734", "rotated": false, "trimmed": true, "sourceSize": { @@ -3337,19 +2854,124 @@ }, "spriteSourceSize": { "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 354, + "y": 98, + "w": 25, + "h": 16 + } + }, + { + "filename": "767", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 353, + "y": 114, + "w": 24, + "h": 14 + } + }, + { + "filename": "803s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 354, + "y": 128, + "w": 23, + "h": 25 + } + }, + { + "filename": "732", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 379, + "y": 100, + "w": 19, + "h": 22 + } + }, + { + "filename": "801s-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 377, + "y": 122, + "w": 20, + "h": 28 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 5, - "w": 22, + "w": 23, "h": 24 }, "frame": { - "x": 176, - "y": 298, - "w": 22, + "x": 398, + "y": 102, + "w": 23, "h": 24 } }, { - "filename": "786", + "filename": "768", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,20 +2979,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 + "x": 8, + "y": 5, + "w": 24, + "h": 23 }, "frame": { - "x": 123, - "y": 320, - "w": 20, - "h": 25 + "x": 397, + "y": 126, + "w": 24, + "h": 23 } }, { - "filename": "786s", + "filename": "801s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3378,16 +3000,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, + "x": 10, + "y": 2, "w": 20, - "h": 25 + "h": 28 }, "frame": { - "x": 123, - "y": 345, + "x": 421, + "y": 99, "w": 20, - "h": 25 + "h": 28 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 441, + "y": 98, + "w": 24, + "h": 23 } }, { @@ -3405,14 +3048,14 @@ "h": 24 }, "frame": { - "x": 123, - "y": 370, + "x": 421, + "y": 127, "w": 20, "h": 24 } }, { - "filename": "735s", + "filename": "770", "rotated": false, "trimmed": true, "sourceSize": { @@ -3420,20 +3063,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, + "x": 9, "y": 4, - "w": 20, + "w": 23, "h": 24 }, "frame": { - "x": 123, - "y": 394, - "w": 20, + "x": 441, + "y": 121, + "w": 23, "h": 24 } }, { - "filename": "745s-midnight", + "filename": "2050", "rotated": false, "trimmed": true, "sourceSize": { @@ -3441,15 +3084,120 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 98, + "w": 15, + "h": 18 + } + }, + { + "filename": "756", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, "h": 24 }, "frame": { - "x": 123, - "y": 418, - "w": 21, + "x": 480, + "y": 102, + "w": 22, + "h": 24 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 116, + "w": 15, + "h": 18 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 126, + "w": 22, + "h": 24 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 134, + "w": 16, + "h": 19 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 150, + "w": 22, "h": 24 } }, @@ -3468,14 +3216,14 @@ "h": 21 }, "frame": { - "x": 123, - "y": 442, + "x": 441, + "y": 145, "w": 23, "h": 21 } }, { - "filename": "2051", + "filename": "761s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3483,20 +3231,41 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 153, + "w": 16, + "h": 19 + } + }, + { + "filename": "745-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, "y": 4, - "w": 23, + "w": 21, "h": 24 }, "frame": { - "x": 143, - "y": 320, - "w": 23, + "x": 165, + "y": 143, + "w": 21, "h": 24 } }, { - "filename": "2051s", + "filename": "2020", "rotated": false, "trimmed": true, "sourceSize": { @@ -3504,20 +3273,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 + "x": 8, + "y": 6, + "w": 25, + "h": 22 }, "frame": { - "x": 143, - "y": 344, - "w": 23, - "h": 24 + "x": 186, + "y": 146, + "w": 25, + "h": 22 } }, { - "filename": "756s", + "filename": "2020s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3525,20 +3294,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 + "x": 8, + "y": 6, + "w": 25, + "h": 22 }, "frame": { - "x": 143, - "y": 368, - "w": 22, - "h": 24 + "x": 211, + "y": 146, + "w": 25, + "h": 22 } }, { - "filename": "802-zenith", + "filename": "802", "rotated": false, "trimmed": true, "sourceSize": { @@ -3552,54 +3321,12 @@ "h": 24 }, "frame": { - "x": 143, - "y": 392, + "x": 164, + "y": 167, "w": 22, "h": 24 } }, - { - "filename": "763", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 144, - "y": 416, - "w": 21, - "h": 24 - } - }, - { - "filename": "749", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 146, - "y": 440, - "w": 21, - "h": 23 - } - }, { "filename": "2105", "rotated": false, @@ -3615,8 +3342,8 @@ "h": 23 }, "frame": { - "x": 166, - "y": 322, + "x": 186, + "y": 168, "w": 24, "h": 23 } @@ -3636,14 +3363,14 @@ "h": 23 }, "frame": { - "x": 166, - "y": 345, + "x": 210, + "y": 168, "w": 24, "h": 23 } }, { - "filename": "802", + "filename": "734s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3651,18 +3378,186 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 164, + "y": 191, + "w": 25, + "h": 16 + } + }, + { + "filename": "770s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 4, - "w": 22, + "w": 23, "h": 24 }, "frame": { - "x": 165, - "y": 368, - "w": 22, + "x": 163, + "y": 207, + "w": 23, "h": 24 } }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 231, + "w": 23, + "h": 24 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 189, + "y": 191, + "w": 24, + "h": 22 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 186, + "y": 213, + "w": 23, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 213, + "y": 191, + "w": 21, + "h": 24 + } + }, + { + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 215, + "w": 24, + "h": 22 + } + }, + { + "filename": "2053s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 186, + "y": 237, + "w": 24, + "h": 22 + } + }, + { + "filename": "769", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 210, + "y": 237, + "w": 23, + "h": 22 + } + }, { "filename": "802s-zenith", "rotated": false, @@ -3678,8 +3573,8 @@ "h": 24 }, "frame": { - "x": 165, - "y": 392, + "x": 187, + "y": 259, "w": 22, "h": 24 } @@ -3699,14 +3594,14 @@ "h": 24 }, "frame": { - "x": 165, - "y": 416, + "x": 209, + "y": 259, "w": 22, "h": 24 } }, { - "filename": "749s", + "filename": "746", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,83 +3609,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 167, - "y": 440, - "w": 21, - "h": 23 - } - }, - { - "filename": "755", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 190, - "y": 322, - "w": 13, - "h": 24 - } - }, - { - "filename": "723", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 190, - "y": 346, - "w": 17, - "h": 22 - } - }, - { - "filename": "763s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 + "x": 12, + "y": 11, + "w": 18, + "h": 13 }, "frame": { "x": 187, - "y": 368, - "w": 21, - "h": 24 + "y": 283, + "w": 18, + "h": 13 } }, { - "filename": "793", + "filename": "733s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,121 +3630,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 + "x": 8, + "y": 7, + "w": 23, + "h": 21 }, "frame": { - "x": 187, - "y": 392, - "w": 21, - "h": 24 - } - }, - { - "filename": "793s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 187, - "y": 416, - "w": 21, - "h": 24 - } - }, - { - "filename": "782", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 188, - "y": 440, - "w": 22, - "h": 23 - } - }, - { - "filename": "755s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 210, - "y": 148, - "w": 13, - "h": 24 - } - }, - { - "filename": "2053s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 223, + "x": 236, "y": 149, - "w": 24, - "h": 22 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 198, - "y": 273, - "w": 17, - "h": 24 + "w": 23, + "h": 21 } }, { @@ -3930,14 +3657,14 @@ "h": 24 }, "frame": { - "x": 198, - "y": 297, + "x": 234, + "y": 170, "w": 22, "h": 24 } }, { - "filename": "723s", + "filename": "738", "rotated": false, "trimmed": true, "sourceSize": { @@ -3945,16 +3672,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 + "x": 9, + "y": 6, + "w": 22, + "h": 21 }, "frame": { - "x": 204, - "y": 251, - "w": 17, - "h": 22 + "x": 234, + "y": 194, + "w": 22, + "h": 21 } }, { @@ -3972,14 +3699,14 @@ "h": 24 }, "frame": { - "x": 203, - "y": 321, + "x": 233, + "y": 215, "w": 22, "h": 24 } }, { - "filename": "762", + "filename": "738s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3987,20 +3714,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 + "x": 9, + "y": 6, + "w": 22, + "h": 21 }, "frame": { - "x": 207, - "y": 345, - "w": 18, - "h": 23 + "x": 233, + "y": 239, + "w": 22, + "h": 21 } }, { - "filename": "741s-sensu", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4008,36 +3735,162 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, + "x": 8, + "y": 6, + "w": 23, + "h": 22 + }, + "frame": { + "x": 231, + "y": 260, + "w": 23, + "h": 22 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 205, + "y": 283, + "w": 24, + "h": 14 + } + }, + { + "filename": "763", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 195, + "y": 297, + "w": 21, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 216, + "y": 297, + "w": 20, + "h": 24 + } + }, + { + "filename": "752", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 259, + "y": 154, + "w": 23, + "h": 18 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 256, + "y": 172, + "w": 21, + "h": 24 + } + }, + { + "filename": "747", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 256, + "y": 196, + "w": 22, + "h": 20 + } + }, + { + "filename": "782", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, "y": 5, - "w": 17, + "w": 22, "h": 23 }, "frame": { - "x": 208, - "y": 368, - "w": 17, - "h": 23 - } - }, - { - "filename": "762s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 208, - "y": 391, - "w": 18, + "x": 255, + "y": 216, + "w": 22, "h": 23 } }, @@ -4056,14 +3909,14 @@ "h": 23 }, "frame": { - "x": 208, - "y": 414, + "x": 255, + "y": 239, "w": 22, "h": 23 } }, { - "filename": "2076", + "filename": "789", "rotated": false, "trimmed": true, "sourceSize": { @@ -4071,16 +3924,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 21, - "h": 23 + "x": 10, + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 210, - "y": 437, - "w": 21, - "h": 23 + "x": 254, + "y": 262, + "w": 23, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 282, + "y": 156, + "w": 23, + "h": 18 } }, { @@ -4098,71 +3972,8 @@ "h": 22 }, "frame": { - "x": 230, - "y": 171, - "w": 20, - "h": 22 - } - }, - { - "filename": "743s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 230, - "y": 193, - "w": 20, - "h": 22 - } - }, - { - "filename": "754", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 230, - "y": 215, - "w": 20, - "h": 22 - } - }, - { - "filename": "754s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 230, - "y": 237, + "x": 277, + "y": 174, "w": 20, "h": 22 } @@ -4182,12 +3993,54 @@ "h": 22 }, "frame": { - "x": 211, - "y": 228, + "x": 278, + "y": 196, "w": 19, "h": 22 } }, + { + "filename": "786", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 218, + "w": 20, + "h": 25 + } + }, + { + "filename": "786s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 243, + "w": 20, + "h": 25 + } + }, { "filename": "739", "rotated": false, @@ -4203,14 +4056,14 @@ "h": 21 }, "frame": { - "x": 230, - "y": 259, + "x": 277, + "y": 268, "w": 20, "h": 21 } }, { - "filename": "739s", + "filename": "755", "rotated": false, "trimmed": true, "sourceSize": { @@ -4218,20 +4071,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 20, - "h": 21 + "x": 14, + "y": 4, + "w": 13, + "h": 24 }, "frame": { - "x": 230, - "y": 280, - "w": 20, - "h": 21 + "x": 297, + "y": 174, + "w": 13, + "h": 24 } }, { - "filename": "2050", + "filename": "755s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4239,20 +4092,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 + "x": 14, + "y": 4, + "w": 13, + "h": 24 }, "frame": { - "x": 215, - "y": 273, - "w": 15, - "h": 18 + "x": 297, + "y": 198, + "w": 13, + "h": 24 } }, { - "filename": "744", + "filename": "793", "rotated": false, "trimmed": true, "sourceSize": { @@ -4260,20 +4113,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 + "x": 10, + "y": 4, + "w": 21, + "h": 24 }, "frame": { - "x": 231, - "y": 301, - "w": 19, - "h": 22 + "x": 297, + "y": 222, + "w": 21, + "h": 24 } }, { - "filename": "734s", + "filename": "793s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4281,20 +4134,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 + "x": 10, + "y": 4, + "w": 21, + "h": 24 }, "frame": { - "x": 225, - "y": 323, - "w": 25, - "h": 16 + "x": 297, + "y": 246, + "w": 21, + "h": 24 } }, { - "filename": "769", + "filename": "747s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4302,37 +4155,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 + "x": 10, + "y": 7, + "w": 22, + "h": 20 }, "frame": { - "x": 225, - "y": 339, - "w": 23, - "h": 22 - } - }, - { - "filename": "769s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 225, - "y": 361, - "w": 23, - "h": 22 + "x": 297, + "y": 270, + "w": 22, + "h": 20 } }, { @@ -4350,12 +4182,516 @@ "h": 15 }, "frame": { - "x": 226, - "y": 383, + "x": 231, + "y": 282, "w": 24, "h": 15 } }, + { + "filename": "2037", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 255, + "y": 282, + "w": 22, + "h": 21 + } + }, + { + "filename": "744", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 236, + "y": 297, + "w": 19, + "h": 22 + } + }, + { + "filename": "743s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 255, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "754", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 275, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 277, + "y": 290, + "w": 18, + "h": 13 + } + }, + { + "filename": "749", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 295, + "y": 290, + "w": 21, + "h": 23 + } + }, + { + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 305, + "y": 156, + "w": 17, + "h": 18 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 174, + "w": 17, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 197, + "w": 17, + "h": 23 + } + }, + { + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 322, + "y": 155, + "w": 18, + "h": 19 + } + }, + { + "filename": "749s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 327, + "y": 174, + "w": 21, + "h": 23 + } + }, + { + "filename": "2076", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 327, + "y": 197, + "w": 21, + "h": 23 + } + }, + { + "filename": "2076s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 318, + "y": 220, + "w": 21, + "h": 23 + } + }, + { + "filename": "754s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 318, + "y": 243, + "w": 20, + "h": 22 + } + }, + { + "filename": "728", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 340, + "y": 154, + "w": 17, + "h": 20 + } + }, + { + "filename": "739s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 357, + "y": 153, + "w": 20, + "h": 21 + } + }, + { + "filename": "789s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 348, + "y": 174, + "w": 23, + "h": 20 + } + }, + { + "filename": "2037s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 348, + "y": 194, + "w": 22, + "h": 21 + } + }, + { + "filename": "744s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 377, + "y": 150, + "w": 19, + "h": 22 + } + }, + { + "filename": "762", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 319, + "y": 265, + "w": 18, + "h": 23 + } + }, + { + "filename": "762s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 339, + "y": 220, + "w": 18, + "h": 23 + } + }, + { + "filename": "741-pau", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 338, + "y": 243, + "w": 18, + "h": 22 + } + }, + { + "filename": "741s-pau", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 6, + "w": 18, + "h": 22 + }, + "frame": { + "x": 337, + "y": 265, + "w": 18, + "h": 22 + } + }, + { + "filename": "723", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 357, + "y": 215, + "w": 17, + "h": 22 + } + }, { "filename": "2074s", "rotated": false, @@ -4371,8 +4707,8 @@ "h": 15 }, "frame": { - "x": 226, - "y": 398, + "x": 397, + "y": 149, "w": 24, "h": 15 } @@ -4392,54 +4728,12 @@ "h": 20 }, "frame": { - "x": 230, - "y": 413, + "x": 421, + "y": 151, "w": 20, "h": 20 } }, - { - "filename": "744s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 231, - "y": 433, - "w": 19, - "h": 22 - } - }, - { - "filename": "742", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 231, - "y": 455, - "w": 19, - "h": 20 - } - }, { "filename": "775", "rotated": false, @@ -4455,14 +4749,14 @@ "h": 20 }, "frame": { - "x": 210, - "y": 460, + "x": 396, + "y": 164, "w": 21, "h": 20 } }, { - "filename": "742s", + "filename": "742", "rotated": false, "trimmed": true, "sourceSize": { @@ -4476,180 +4770,12 @@ "h": 20 }, "frame": { - "x": 231, - "y": 475, + "x": 377, + "y": 172, "w": 19, "h": 20 } }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 103, - "y": 463, - "w": 23, - "h": 21 - } - }, - { - "filename": "2076s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 103, - "y": 484, - "w": 21, - "h": 23 - } - }, - { - "filename": "738", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 126, - "y": 463, - "w": 22, - "h": 21 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 124, - "y": 484, - "w": 22, - "h": 21 - } - }, - { - "filename": "2037", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 148, - "y": 463, - "w": 22, - "h": 21 - } - }, - { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 146, - "y": 484, - "w": 22, - "h": 21 - } - }, - { - "filename": "747s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 170, - "y": 463, - "w": 22, - "h": 20 - } - }, - { - "filename": "741-pau", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 192, - "y": 463, - "w": 18, - "h": 22 - } - }, { "filename": "775s", "rotated": false, @@ -4665,495 +4791,12 @@ "h": 20 }, "frame": { - "x": 210, - "y": 480, + "x": 417, + "y": 171, "w": 21, "h": 20 } }, - { - "filename": "757", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 18 - }, - "frame": { - "x": 231, - "y": 495, - "w": 19, - "h": 18 - } - }, - { - "filename": "2019", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 21 - }, - "frame": { - "x": 104, - "y": 507, - "w": 21, - "h": 21 - } - }, - { - "filename": "2019s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 21 - }, - "frame": { - "x": 104, - "y": 528, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 125, - "y": 505, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 125, - "y": 526, - "w": 21, - "h": 21 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 146, - "y": 505, - "w": 21, - "h": 20 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 146, - "y": 525, - "w": 21, - "h": 20 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 104, - "y": 549, - "w": 23, - "h": 18 - } - }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 103, - "y": 567, - "w": 21, - "h": 19 - } - }, - { - "filename": "741s-pau", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 6, - "w": 18, - "h": 22 - }, - "frame": { - "x": 102, - "y": 586, - "w": 18, - "h": 22 - } - }, - { - "filename": "731", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 102, - "y": 608, - "w": 17, - "h": 22 - } - }, - { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 127, - "y": 547, - "w": 20, - "h": 20 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 124, - "y": 567, - "w": 21, - "h": 19 - } - }, - { - "filename": "731s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 17, - "h": 22 - }, - "frame": { - "x": 120, - "y": 586, - "w": 17, - "h": 22 - } - }, - { - "filename": "778-disguised", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 119, - "y": 608, - "w": 17, - "h": 22 - } - }, - { - "filename": "778s-disguised", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 147, - "y": 545, - "w": 17, - "h": 22 - } - }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 145, - "y": 567, - "w": 18, - "h": 19 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 137, - "y": 586, - "w": 21, - "h": 18 - } - }, - { - "filename": "767", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 102, - "y": 630, - "w": 24, - "h": 14 - } - }, - { - "filename": "2027s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 96, - "y": 644, - "w": 21, - "h": 18 - } - }, - { - "filename": "722", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 117, - "y": 644, - "w": 17, - "h": 18 - } - }, - { - "filename": "767s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 126, - "y": 630, - "w": 24, - "h": 14 - } - }, - { - "filename": "722s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 134, - "y": 644, - "w": 17, - "h": 18 - } - }, { "filename": "778-busted", "rotated": false, @@ -5169,14 +4812,14 @@ "h": 16 }, "frame": { - "x": 137, - "y": 604, + "x": 396, + "y": 184, "w": 21, "h": 16 } }, { - "filename": "728", + "filename": "778s-busted", "rotated": false, "trimmed": true, "sourceSize": { @@ -5184,18 +4827,60 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 417, + "y": 191, + "w": 21, + "h": 16 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, "h": 20 }, "frame": { - "x": 158, - "y": 586, - "w": 17, + "x": 441, + "y": 166, + "w": 21, "h": 20 } }, + { + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 438, + "y": 186, + "w": 21, + "h": 21 + } + }, { "filename": "737s", "rotated": false, @@ -5211,14 +4896,14 @@ "h": 19 }, "frame": { - "x": 163, - "y": 567, + "x": 462, + "y": 172, "w": 18, "h": 19 } }, { - "filename": "728s", + "filename": "779s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5226,15 +4911,225 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, + "x": 10, + "y": 7, + "w": 21, "h": 20 }, "frame": { - "x": 158, - "y": 606, + "x": 480, + "y": 174, + "w": 21, + "h": 20 + } + }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 459, + "y": 191, + "w": 21, + "h": 19 + } + }, + { + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 480, + "y": 194, + "w": 21, + "h": 19 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 370, + "y": 194, + "w": 21, + "h": 21 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, "w": 17, + "h": 22 + }, + "frame": { + "x": 374, + "y": 215, + "w": 17, + "h": 22 + } + }, + { + "filename": "2052", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 391, + "y": 200, + "w": 21, + "h": 21 + } + }, + { + "filename": "2027", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 391, + "y": 221, + "w": 21, + "h": 18 + } + }, + { + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 412, + "y": 207, + "w": 21, + "h": 21 + } + }, + { + "filename": "741s-pompom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 433, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "2027s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 412, + "y": 228, + "w": 21, + "h": 18 + } + }, + { + "filename": "742s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 433, + "y": 227, + "w": 19, "h": 20 } }, @@ -5253,8 +5148,8 @@ "h": 18 }, "frame": { - "x": 150, - "y": 626, + "x": 453, + "y": 210, "w": 21, "h": 18 } @@ -5274,14 +5169,14 @@ "h": 18 }, "frame": { - "x": 151, - "y": 644, + "x": 452, + "y": 228, "w": 21, "h": 18 } }, { - "filename": "751", + "filename": "757", "rotated": false, "trimmed": true, "sourceSize": { @@ -5289,37 +5184,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 + "x": 11, + "y": 9, + "w": 19, + "h": 18 }, "frame": { - "x": 175, - "y": 586, - "w": 14, - "h": 20 - } - }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 175, - "y": 606, - "w": 14, - "h": 20 + "x": 474, + "y": 213, + "w": 19, + "h": 18 } }, { @@ -5337,12 +5211,138 @@ "h": 18 }, "frame": { - "x": 171, - "y": 626, + "x": 473, + "y": 231, "w": 19, "h": 18 } }, + { + "filename": "731", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 316, + "y": 290, + "w": 17, + "h": 22 + } + }, + { + "filename": "771", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 316, + "y": 312, + "w": 18, + "h": 13 + } + }, + { + "filename": "731s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 333, + "y": 288, + "w": 17, + "h": 22 + } + }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 334, + "y": 310, + "w": 17, + "h": 13 + } + }, + { + "filename": "778-disguised", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 350, + "y": 287, + "w": 17, + "h": 22 + } + }, + { + "filename": "778s-disguised", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 355, + "y": 265, + "w": 17, + "h": 22 + } + }, { "filename": "741", "rotated": false, @@ -5358,14 +5358,14 @@ "h": 19 }, "frame": { - "x": 172, - "y": 644, + "x": 356, + "y": 246, "w": 17, "h": 19 } }, { - "filename": "778s-busted", + "filename": "728s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5373,16 +5373,79 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 + "x": 13, + "y": 8, + "w": 17, + "h": 20 }, "frame": { - "x": 189, - "y": 485, - "w": 21, - "h": 16 + "x": 373, + "y": 237, + "w": 17, + "h": 20 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 390, + "y": 239, + "w": 17, + "h": 18 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 351, + "y": 309, + "w": 17, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 373, + "y": 257, + "w": 18, + "h": 13 } }, { @@ -5400,54 +5463,12 @@ "h": 19 }, "frame": { - "x": 164, - "y": 545, + "x": 372, + "y": 270, "w": 17, "h": 19 } }, - { - "filename": "753", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 168, - "y": 484, - "w": 14, - "h": 19 - } - }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 189, - "y": 644, - "w": 14, - "h": 19 - } - }, { "filename": "759", "rotated": false, @@ -5463,12 +5484,33 @@ "h": 19 }, "frame": { - "x": 167, - "y": 505, + "x": 367, + "y": 289, "w": 17, "h": 19 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 368, + "y": 308, + "w": 17, + "h": 17 + } + }, { "filename": "759s", "rotated": false, @@ -5484,117 +5526,12 @@ "h": 19 }, "frame": { - "x": 167, - "y": 524, + "x": 391, + "y": 257, "w": 17, "h": 19 } }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 184, - "y": 501, - "w": 17, - "h": 19 - } - }, - { - "filename": "777s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 184, - "y": 520, - "w": 17, - "h": 19 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 501, - "w": 16, - "h": 19 - } - }, - { - "filename": "761s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 201, - "y": 520, - "w": 16, - "h": 19 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 184, - "y": 539, - "w": 18, - "h": 13 - } - }, { "filename": "774-blue", "rotated": false, @@ -5610,14 +5547,14 @@ "h": 18 }, "frame": { - "x": 181, - "y": 552, + "x": 389, + "y": 276, "w": 17, "h": 18 } }, { - "filename": "736", + "filename": "777", "rotated": false, "trimmed": true, "sourceSize": { @@ -5625,37 +5562,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, + "x": 13, + "y": 8, "w": 17, - "h": 13 + "h": 19 }, "frame": { - "x": 181, - "y": 570, + "x": 408, + "y": 246, "w": 17, - "h": 13 - } - }, - { - "filename": "736s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 202, - "y": 539, - "w": 17, - "h": 13 + "h": 19 } }, { @@ -5673,14 +5589,14 @@ "h": 18 }, "frame": { - "x": 198, - "y": 552, + "x": 408, + "y": 265, "w": 17, "h": 18 } }, { - "filename": "746s", + "filename": "777s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5688,16 +5604,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 + "x": 13, + "y": 8, + "w": 17, + "h": 19 }, "frame": { - "x": 198, - "y": 570, - "w": 18, - "h": 13 + "x": 425, + "y": 247, + "w": 17, + "h": 19 } }, { @@ -5715,12 +5631,33 @@ "h": 18 }, "frame": { - "x": 189, - "y": 583, + "x": 425, + "y": 266, "w": 17, "h": 18 } }, + { + "filename": "751", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 247, + "w": 14, + "h": 20 + } + }, { "filename": "774-orange", "rotated": false, @@ -5736,8 +5673,8 @@ "h": 18 }, "frame": { - "x": 189, - "y": 601, + "x": 456, + "y": 246, "w": 17, "h": 18 } @@ -5757,12 +5694,33 @@ "h": 18 }, "frame": { - "x": 206, - "y": 583, + "x": 473, + "y": 249, "w": 17, "h": 18 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 267, + "w": 14, + "h": 20 + } + }, { "filename": "774-violet", "rotated": false, @@ -5778,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 206, - "y": 601, + "x": 456, + "y": 264, "w": 17, "h": 18 } @@ -5799,8 +5757,8 @@ "h": 18 }, "frame": { - "x": 190, - "y": 619, + "x": 473, + "y": 267, "w": 17, "h": 18 } @@ -5820,8 +5778,8 @@ "h": 18 }, "frame": { - "x": 207, - "y": 619, + "x": 406, + "y": 283, "w": 17, "h": 18 } @@ -5841,33 +5799,12 @@ "h": 18 }, "frame": { - "x": 203, - "y": 637, + "x": 423, + "y": 284, "w": 17, "h": 18 } }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 203, - "y": 655, - "w": 17, - "h": 17 - } - }, { "filename": "774s-green", "rotated": false, @@ -5883,14 +5820,14 @@ "h": 18 }, "frame": { - "x": 215, - "y": 552, + "x": 440, + "y": 287, "w": 17, "h": 18 } }, { - "filename": "771", + "filename": "753", "rotated": false, "trimmed": true, "sourceSize": { @@ -5898,58 +5835,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 + "x": 14, + "y": 8, + "w": 14, + "h": 19 }, "frame": { - "x": 216, - "y": 570, - "w": 18, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 232, - "y": 513, - "w": 18, - "h": 13 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 217, - "y": 513, - "w": 15, - "h": 18 + "x": 457, + "y": 282, + "w": 14, + "h": 19 } }, { @@ -5967,12 +5862,33 @@ "h": 18 }, "frame": { - "x": 223, - "y": 583, + "x": 471, + "y": 285, "w": 17, "h": 18 } }, + { + "filename": "753s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 488, + "y": 285, + "w": 14, + "h": 19 + } + }, { "filename": "774s-orange", "rotated": false, @@ -5988,8 +5904,8 @@ "h": 18 }, "frame": { - "x": 223, - "y": 601, + "x": 385, + "y": 294, "w": 17, "h": 18 } @@ -6009,8 +5925,8 @@ "h": 18 }, "frame": { - "x": 224, - "y": 619, + "x": 402, + "y": 301, "w": 17, "h": 18 } @@ -6030,33 +5946,12 @@ "h": 18 }, "frame": { - "x": 220, - "y": 637, + "x": 419, + "y": 302, "w": 17, "h": 18 } }, - { - "filename": "808s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 220, - "y": 655, - "w": 17, - "h": 17 - } - }, { "filename": "774s-yellow", "rotated": false, @@ -6072,8 +5967,8 @@ "h": 18 }, "frame": { - "x": 219, - "y": 531, + "x": 436, + "y": 305, "w": 17, "h": 18 } @@ -6093,11 +5988,32 @@ "h": 18 }, "frame": { - "x": 232, - "y": 549, + "x": 453, + "y": 305, "w": 17, "h": 18 } + }, + { + "filename": "808s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 470, + "y": 303, + "w": 17, + "h": 17 + } } ] } @@ -6105,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:be37a6c6f866e26c7e4deba1514c5a68:cb56f7bd9b13cc1604b5814449582c05:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index 8c8311b1d0b9269c18570345f54b5b734b6b3612..5e6421360fdbbcfce36acf687bd3395ea46656c1 100644 GIT binary patch literal 51451 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 Ef{{h_p#T5? diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 1a3e463de3f..4636e68d6d6 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -912,24 +912,12 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.MIMIKYU, "disguised", "busted", new SpeciesFormChangeAbilityTrigger(), true), new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeAbilityTrigger(), true) ], - [Species.SOLGALEO]: [ - new SpeciesFormChange(Species.SOLGALEO, "", "radiant-sun", new SpeciesFormChangePreMoveTrigger(Moves.SUNSTEEL_STRIKE), true), - new SpeciesFormChange(Species.SOLGALEO, "radiant-sun", "", new SpeciesFormChangeActiveTrigger(false), true) - ], - [Species.LUNALA]: [ - new SpeciesFormChange(Species.LUNALA, "", "full-moon", new SpeciesFormChangePreMoveTrigger(Moves.MOONGEIST_BEAM), true), - new SpeciesFormChange(Species.LUNALA, "full-moon", "", new SpeciesFormChangeActiveTrigger(false), true) - ], [Species.NECROZMA]: [ new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER), false, getSpeciesDependentFormChangeCondition(Species.LUNALA)), new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER), false, getSpeciesDependentFormChangeCondition(Species.SOLGALEO)), new SpeciesFormChange(Species.NECROZMA, "dawn-wings", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z)), new SpeciesFormChange(Species.NECROZMA, "dusk-mane", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z)) ], - [Species.MARSHADOW]: [ - new SpeciesFormChange(Species.MARSHADOW, "", "zenith", new SpeciesFormChangePreMoveTrigger(Moves.SPECTRAL_THIEF), true), - new SpeciesFormChange(Species.MARSHADOW, "zenith", "", new SpeciesFormChangeActiveTrigger(false), true) - ], [Species.MELMETAL]: [ new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index fee2bc5c9da..1bf97209613 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -63,8 +63,6 @@ export const normalForm: Species[] = [ Species.FROGADIER, Species.GRENINJA, Species.ROCKRUFF, - Species.SOLGALEO, - Species.LUNALA, Species.NECROZMA, Species.MAGEARNA, Species.MARSHADOW, @@ -2678,14 +2676,8 @@ export function initSpecies() { new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, false, null, true), - new PokemonForm("Radiant Sun", "radiant-sun", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340), - ), - new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, false, null, true), - new PokemonForm("Full Moon", "full-moon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340), - ), + new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), @@ -2705,7 +2697,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.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, Abilities.TECHNICIAN, Abilities.NONE, Abilities.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, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300), + new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) ), new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), From e8e0041ed0865d1aeb3dee17826d5480239fe9c6 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:48:53 -0700 Subject: [PATCH 168/171] [Misc] `OPP_FORM_OVERRIDES` now accepts 0 as a valid form index (#5514) --- src/field/pokemon.ts | 4 ++-- src/overrides.ts | 2 -- src/phases/select-starter-phase.ts | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 3cd25e4d10a..890c6bab0d6 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -6916,10 +6916,10 @@ export class EnemyPokemon extends Pokemon { if ( speciesId in Overrides.OPP_FORM_OVERRIDES && - Overrides.OPP_FORM_OVERRIDES[speciesId] && + !isNullOrUndefined(Overrides.OPP_FORM_OVERRIDES[speciesId]) && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] ) { - this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; + this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId]; } if (!dataSource) { diff --git a/src/overrides.ts b/src/overrides.ts index dc04f72049a..882a634ff90 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/consistent-type-imports */ import { type PokeballCounts } from "#app/battle-scene"; import { EvolutionItem } from "#app/data/balance/pokemon-evolutions"; import { Gender } from "#app/data/gender"; diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index 103174a4c83..0f4360b0af6 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -53,6 +53,7 @@ export class SelectStarterPhase extends Phase { let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); if ( starter.species.speciesId in Overrides.STARTER_FORM_OVERRIDES && + !Utils.isNullOrUndefined(Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]) && starter.species.forms[Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!] ) { starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!; From 7aa5649aa8f303a158725b9ff4b0b27668e35b50 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:06:19 -0400 Subject: [PATCH 169/171] [Refactor] Move signature species to separate file (#5519) --- src/data/balance/signature-species.ts | 162 ++++++++++++++++++++++++++ src/data/trainer-config.ts | 143 +---------------------- src/field/trainer.ts | 2 +- 3 files changed, 164 insertions(+), 143 deletions(-) create mode 100644 src/data/balance/signature-species.ts diff --git a/src/data/balance/signature-species.ts b/src/data/balance/signature-species.ts new file mode 100644 index 00000000000..a1b73af40cd --- /dev/null +++ b/src/data/balance/signature-species.ts @@ -0,0 +1,162 @@ +import { Species } from "#enums/species"; + +export type SignatureSpecies = { + [key in string]: (Species | Species[])[]; +}; + +/* + * The signature species for each Gym Leader, Elite Four member, and Champion. + * The key is the trainer type, and the value is an array of Species or Species arrays. + * This is in a separate const so it can be accessed from other places and not just the trainerConfigs + */ +export const signatureSpecies: SignatureSpecies = { + // Gym Leaders- Kanto + BROCK: [Species.GEODUDE, Species.ONIX], + MISTY: [Species.STARYU, Species.PSYDUCK], + LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ], + ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP], + JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT], + SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON], + BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR], + GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F], + // Gym Leaders- Johto + FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO], + BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR], + WHITNEY: [Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG], + MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE], + CHUCK: [Species.POLIWRATH, Species.MANKEY], + JASMINE: [Species.MAGNEMITE, Species.STEELIX], + PRYCE: [Species.SEEL, Species.SWINUB], + CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS], + // Gym Leaders- Hoenn + ROXANNE: [Species.GEODUDE, Species.NOSEPASS], + BRAWLY: [Species.MACHOP, Species.MAKUHITA], + WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE], + FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL], + NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON], + WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY], + TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE], + LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR], + JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH], + // Gym Leaders- Sinnoh + ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE], + GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG], + MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR], + CRASHER_WAKE: [Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP], + FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB], + BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON], + CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT], + VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM], + // Gym Leaders- Unova + CILAN: [Species.PANSAGE, Species.FOONGUS, Species.PETILIL], + CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL], + CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE], + CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE], + LENORA: [Species.PATRAT, Species.DEERLING, Species.AUDINO], + ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI], + BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST], + ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK], + CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT], + SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET], + BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO], + DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO], + MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA], + // Gym Leaders- Kalos + VIOLA: [Species.SURSKIT, Species.SCATTERBUG], + GRANT: [Species.AMAURA, Species.TYRUNT], + KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO], + RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT], + CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA], + VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME], + OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING], + WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL], + // Gym Leaders- Galar + MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET], + NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD], + KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL], + BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS], + ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY], + OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING], + BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR], + GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE], + MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME], + PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY], + MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO], + RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY], + // Gym Leaders- Paldea; First slot is Tera + KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa + BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo + IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus + KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler + LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly + RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel + TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe + GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu + + // Elite Four- Kanto + LORELEI: [ + Species.JYNX, + [Species.SLOWBRO, Species.GALAR_SLOWBRO], + Species.LAPRAS, + [Species.CLOYSTER, Species.ALOLA_SANDSLASH], + ], + BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]], + AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK], + LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR], + // Elite Four- Johto (Bruno included) + WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR], + KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL], + KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE], + // Elite Four- Hoenn + SIDNEY: [ + [Species.SHIFTRY, Species.CACTURNE], + [Species.SHARPEDO, Species.CRAWDAUNT], + Species.ABSOL, + Species.MIGHTYENA, + ], + PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]], + GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW], + DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA], + // Elite Four- Sinnoh + AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION], + BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR], + FLINT: [ + [Species.RAPIDASH, Species.FLAREON], + Species.MAGMORTAR, + [Species.STEELIX, Species.LOPUNNY], + Species.INFERNAPE, + ], // Tera Fire Steelix or Lopunny + LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]], + // Elite Four- Unova + SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT], + MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK], + GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE], + CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS], + // Elite Four- Kalos + MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME], + SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE], + WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH], + DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN], + // Elite Four- Alola + HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]], + MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO], + OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC], + ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND], + KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON], + // Elite Four- Galar + MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL], + NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW], + BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP], + ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR], + RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON], + // Elite Four- Paldea + RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire + POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton + LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio + HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur + // Elite Four- BBL + CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom + AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross + LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill + DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon +}; diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 693338c145e..3884aa05b13 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -22,6 +22,7 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { Gender } from "#app/data/gender"; +import { signatureSpecies } from "./balance/signature-species"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; @@ -1744,148 +1745,6 @@ function getSpeciesFilterRandomPartyMemberFunc( }; } -type SignatureSpecies = { - [key in string]: (Species | Species[])[]; -}; - -/* - * The signature species for each Gym Leader, Elite Four member, and Champion. - * The key is the trainer type, and the value is an array of Species or Species arrays. - * This is in a separate const so it can be accessed from other places and not just the trainerConfigs - */ -export const signatureSpecies: SignatureSpecies = { - BROCK: [Species.GEODUDE, Species.ONIX], - MISTY: [Species.STARYU, Species.PSYDUCK], - LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ], - ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP], - JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT], - SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON], - BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR], - GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F], - FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO], - BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR], - WHITNEY: [Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG], - MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE], - CHUCK: [Species.POLIWRATH, Species.MANKEY], - JASMINE: [Species.MAGNEMITE, Species.STEELIX], - PRYCE: [Species.SEEL, Species.SWINUB], - CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS], - ROXANNE: [Species.GEODUDE, Species.NOSEPASS], - BRAWLY: [Species.MACHOP, Species.MAKUHITA], - WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE], - FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL], - NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON], - WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY], - TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE], - LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR], - JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH], - ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE], - GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG], - MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR], - CRASHER_WAKE: [Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP], - FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB], - BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON], - CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT], - VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM], - CILAN: [Species.PANSAGE, Species.FOONGUS, Species.PETILIL], - CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL], - CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE], - CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE], - LENORA: [Species.PATRAT, Species.DEERLING, Species.AUDINO], - ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI], - BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST], - ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK], - CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT], - SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET], - BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO], - DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO], - MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA], - VIOLA: [Species.SURSKIT, Species.SCATTERBUG], - GRANT: [Species.AMAURA, Species.TYRUNT], - KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO], - RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT], - CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA], - VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME], - OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING], - WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL], - MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET], - NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD], - KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL], - BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS], - ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY], - OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING], - BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR], - GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE], - MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME], - PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY], - MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO], - RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY], - KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa - BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo - IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus - KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler - LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly - RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel - TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe - GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu - LORELEI: [ - Species.JYNX, - [Species.SLOWBRO, Species.GALAR_SLOWBRO], - Species.LAPRAS, - [Species.CLOYSTER, Species.ALOLA_SANDSLASH], - ], - BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]], - AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK], - LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR], - WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR], - KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL], - KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE], - SIDNEY: [ - [Species.SHIFTRY, Species.CACTURNE], - [Species.SHARPEDO, Species.CRAWDAUNT], - Species.ABSOL, - Species.MIGHTYENA, - ], - PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]], - GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW], - DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA], - AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION], - BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR], - FLINT: [ - [Species.RAPIDASH, Species.FLAREON], - Species.MAGMORTAR, - [Species.STEELIX, Species.LOPUNNY], - Species.INFERNAPE, - ], // Tera Fire Steelix or Lopunny - LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]], - SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT], - MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK], - GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE], - CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS], - MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME], - SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE], - WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH], - DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN], - HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]], - MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO], - OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC], - ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND], - KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON], - MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL], - NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW], - BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP], - ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR], - RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON], - RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire - POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton - LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio - HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur - CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom - AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross - LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill - DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon -}; - export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), [TrainerType.ACE_TRAINER]: new TrainerConfig(++t) diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 4325b54a783..98919ebfa93 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -9,7 +9,6 @@ import { TrainerSlot, trainerConfigs, trainerPartyTemplates, - signatureSpecies, TeraAIMode, } from "#app/data/trainer-config"; import type { EnemyPokemon } from "#app/field/pokemon"; @@ -22,6 +21,7 @@ import i18next from "i18next"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { signatureSpecies } from "#app/data/balance/signature-species"; export enum TrainerVariant { DEFAULT, From 1d7f916240c351bdb376a7c8bc7bdb33dff5c163 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sat, 15 Mar 2025 19:51:02 -0700 Subject: [PATCH 170/171] [Refactor] Align ability display with mainline (#5267) * Stop ShowAbilityPhase from ending until the bar has popped out * Remove ability bar hiding from messagePhase * Remove abilityBar reference from base Phase class * Add HideAbilityPhase to hide ability bar after effects * Add willSucceed to ability attrs * Update AbAttrs and PostInitAbAttrs * Update PreDefendAbAttrs * Update postDefend, postMoveUsed, StatStage, postSetStatus, and PostDamage * Update preAttack and fieldStat * Partially implement postAttack * Finish PostAttack * Update PostSummon * Update PreSwitchOut * Update preStatStageChange * Update PostStatStageChange, PreSetStatus, PreApplyBattlerTag * Update postTurn and preWeatherEffect * Update postWeatherChange * Update postWeatherChange * Update PostTerrainChange * Update CheckTrapped and PostBattle * Update postFaint * Update PostItemLost * Bug fixes from test cases * Fix intimidate display * Stop trace from displaying itself * Rename to canApply * Fix ability displays using getTriggerMessage * Ensure abilities which are mistakenly shown are still hidden * Fix ability bar showing the wrong ability with imposter * Add canApply for imposter * Update abilities using promises and `trySet...` functions * Committing overrides changes is bad * Document apply and canApply * Update PreLeaveFieldAbAttr * Remove boolean return type apply functions * Remove redundant assignment * Remove ability display from abilities that shouldn't have it * Move queueAbilityDisplay to battlescene * Remove unused shown variable * Minor changes * Fix using id instead of battlerindex in queueAbilityDisplay * Fix PostBattleInitFormChangeAbAttr displaying * Prevent crashes in case an ability for a pokemon not on the field is shown * Stop more abilities from displaying * Move enemy ability bar to the right side * Automatically reload bar if shown while already out, fix specific abilities * Remove duplicate call to clearPhaseQueueSplice * Remove ShowAbilityPhase import from ability.ts * Update PostDefendTypeChangeAbAttr to use PokemonType * Update PostSummonAddArenaTagAbAttr * Minor changes --- src/battle-scene.ts | 57 + src/data/ability.ts | 2996 +++++++++++++------------ src/field/arena.ts | 14 +- src/loading-scene.ts | 1 + src/phase.ts | 6 +- src/phases/hide-ability-phase.ts | 27 + src/phases/message-phase.ts | 8 - src/phases/pokemon-transform-phase.ts | 9 + src/phases/show-ability-phase.ts | 46 +- src/ui/ability-bar.ts | 134 +- test/moves/secret_power.test.ts | 6 +- 11 files changed, 1729 insertions(+), 1575 deletions(-) create mode 100644 src/phases/hide-ability-phase.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 1712cf9236f..a6c986d3d0f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -168,6 +168,8 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#app/data/balance/starters"; import { StatusEffect } from "#enums/status-effect"; import { initGlobalScene } from "#app/global-scene"; +import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; +import { HideAbilityPhase } from "#app/phases/hide-ability-phase"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -2904,6 +2906,21 @@ export default class BattleScene extends SceneBase { } } + /** + * Queues an ability bar flyout phase + * @param pokemon The pokemon who has the ability + * @param passive Whether the ability is a passive + * @param show Whether to show or hide the bar + */ + public queueAbilityDisplay(pokemon: Pokemon, passive: boolean, show: boolean): void { + this.unshiftPhase( + show + ? new ShowAbilityPhase(pokemon.getBattlerIndex(), passive) + : new HideAbilityPhase(pokemon.getBattlerIndex(), passive), + ); + this.clearPhaseQueueSplice(); + } + /** * Moves everything from nextCommandPhaseQueue to phaseQueue (keeping order) */ @@ -3133,6 +3150,41 @@ export default class BattleScene extends SceneBase { return false; } + canTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferQuantity = 1): boolean { + const mod = itemModifier.clone() as PokemonHeldItemModifier; + const source = mod.pokemonId ? mod.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const matchingModifier = this.findModifier( + m => m instanceof PokemonHeldItemModifier && m.matchType(mod) && m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min(transferQuantity, mod.stackCount, maxStackCount - matchingModifier.stackCount); + mod.stackCount -= countTaken; + } else { + const countTaken = Math.min(transferQuantity, mod.stackCount); + mod.stackCount -= countTaken; + } + + const removeOld = mod.stackCount === 0; + + return !removeOld || !source || this.hasModifier(itemModifier, !source.isPlayer()); + } + removePartyMemberModifiers(partyMemberIndex: number): Promise { return new Promise(resolve => { const pokemonId = this.getPlayerParty()[partyMemberIndex].id; @@ -3290,6 +3342,11 @@ export default class BattleScene extends SceneBase { }); } + hasModifier(modifier: PersistentModifier, enemy = false): boolean { + const modifiers = !enemy ? this.modifiers : this.enemyModifiers; + return modifiers.indexOf(modifier) > -1; + } + /** * Removes a currently owned item. If the item is stacked, the entire item stack * gets removed. This function does NOT apply in-battle effects, such as Unburden. diff --git a/src/data/ability.ts b/src/data/ability.ts index 5d8b7ce681a..0b5b3624c73 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -35,7 +35,6 @@ import { Species } from "#enums/species"; import { Stat, type BattleStat, type EffectiveStat, BATTLE_STATS, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat"; import { MovePhase } from "#app/phases/move-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { globalScene } from "#app/global-scene"; import { SwitchType } from "#app/enums/switch-type"; @@ -147,7 +146,8 @@ export class Ability implements Localizable { } } -type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean; +type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => void; +type AbAttrSuccessFunc = (attr: TAttr, passive: boolean) => boolean; type AbAttrCondition = (pokemon: Pokemon) => boolean; // TODO: Can this be improved? @@ -163,9 +163,15 @@ export abstract class AbAttr { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { - return false; - } + /** + * Applies ability effects without checking conditions + * @param pokemon - The pokemon to apply this ability to + * @param passive - Whether or not the ability is a passive + * @param simulated - Whether the call is simulated + * @param args - Extra args passed to the function. Handled by child classes. + * @see {@linkcode canApply} + */ + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): void {} getTriggerMessage(_pokemon: Pokemon, _abilityName: string, ..._args: any[]): string | null { return null; @@ -179,13 +185,28 @@ export abstract class AbAttr { this.extraCondition = condition; return this; } + + /** + * Returns a boolean describing whether the ability can be applied under current conditions + * @param pokemon - The pokemon to apply this ability to + * @param passive - Whether or not the ability is a passive + * @param simulated - Whether the call is simulated + * @param args - Extra args passed to the function. Handled by child classes. + * @returns `true` if the ability can be applied, `false` otherwise + * @see {@linkcode apply} + */ + canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } } export class BlockRecoilDamageAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - cancelled.value = true; + constructor() { + super(false); + } - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { @@ -196,7 +217,7 @@ export class BlockRecoilDamageAttr extends AbAttr { /** * Attribute for abilities that increase the chance of a double battle * occurring. - * @see apply + * @see {@linkcode apply} */ export class DoubleBattleChanceAbAttr extends AbAttr { constructor() { @@ -206,40 +227,39 @@ export class DoubleBattleChanceAbAttr extends AbAttr { /** * Increases the chance of a double battle occurring * @param args [0] {@linkcode Utils.NumberHolder} for double battle chance - * @returns true if the ability was applied */ - apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { const doubleBattleChance = args[0] as Utils.NumberHolder; // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt // A double battle will initiate if the generated number is 0 doubleBattleChance.value = doubleBattleChance.value / 4; - - return true; } } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { private formFunc: (p: Pokemon) => number; constructor(formFunc: ((p: Pokemon) => number)) { - super(true); + super(false); this.formFunc = formFunc; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex && !simulated) { - return globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); - } + return formIndex !== pokemon.formIndex && !simulated; + } - return false; + override applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } } @@ -254,7 +274,7 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): void { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { @@ -264,8 +284,6 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { globalScene.unshiftPhase(statStageChangePhase); } } - - return true; } } @@ -284,11 +302,14 @@ export class ClearWeatherAbAttr extends AbAttr { this.weather = weather; } - apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + public override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetWeather(WeatherType.NONE); + } + + public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { globalScene.arena.trySetWeather(WeatherType.NONE, true); } - return true; } } @@ -307,17 +328,31 @@ export class ClearTerrainAbAttr extends AbAttr { this.terrain = terrain; } - apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + public override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(TerrainType.NONE); + } + + public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); } - return true; } } type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { + canApplyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[]): boolean { + return true; + } + applyPreDefend( pokemon: Pokemon, passive: boolean, @@ -326,28 +361,26 @@ export class PreDefendAbAttr extends AbAttr { move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[], - ): boolean { - return false; - } + ): void {} } export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.isFullHp() - && pokemon.getMaxHp() > 1 //Checks if pokemon has wonder_guard (which forces 1hp) - && (args[0] as Utils.NumberHolder).value >= pokemon.hp) { //Damage >= hp - return simulated || pokemon.addTag(BattlerTagType.STURDY, 1); - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return pokemon.isFullHp() + && pokemon.getMaxHp() > 1 //Checks if pokemon has wonder_guard (which forces 1hp) + && (args[0] as Utils.NumberHolder).value >= pokemon.hp; //Damage >= hp + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + pokemon.addTag(BattlerTagType.STURDY, 1); + } } } export class BlockItemTheftAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { @@ -359,13 +392,16 @@ export class BlockItemTheftAbAttr extends AbAttr { } export class StabBoostAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if ((args[0] as Utils.NumberHolder).value > 1) { - (args[0] as Utils.NumberHolder).value += 0.5; - return true; - } + constructor() { + super(false); + } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return (args[0] as Utils.NumberHolder).value > 1; + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value += 0.5; } } @@ -373,21 +409,19 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { protected condition: PokemonDefendCondition; private damageMultiplier: number; - constructor(condition: PokemonDefendCondition, damageMultiplier: number) { - super(); + constructor(condition: PokemonDefendCondition, damageMultiplier: number, showAbility: boolean = false) { + super(showAbility); this.condition = condition; this.damageMultiplier = damageMultiplier; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move); + } - return true; - } - - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.damageMultiplier); } } @@ -408,16 +442,15 @@ export class AlliedFieldDamageReductionAbAttr extends PreDefendAbAttr { * @param args * - `[0]` {@linkcode Utils.NumberHolder} - The damage being dealt */ - override applyPreDefend(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _attacker: Pokemon, _move: Move, _cancelled: Utils.BooleanHolder, args: any[]): boolean { + override applyPreDefend(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _attacker: Pokemon, _move: Move, _cancelled: Utils.BooleanHolder, args: any[]): void { const damage = args[0] as Utils.NumberHolder; damage.value = Utils.toDmgValue(damage.value * this.damageMultiplier); - return true; } } export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { constructor(moveType: PokemonType, damageMultiplier: number) { - super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier); + super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier, false); } } @@ -432,12 +465,16 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { private condition: AbAttrCondition | null; constructor(immuneType: PokemonType | null, condition?: AbAttrCondition) { - super(); + super(true); this.immuneType = immuneType; this.condition = condition ?? null; } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return ![ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget) && attacker !== pokemon && attacker.getMoveType(move) === this.immuneType; + } + /** * Applies immunity if this ability grants immunity to the type of the given move. * @param pokemon {@linkcode Pokemon} The defending Pokemon. @@ -448,16 +485,8 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { * @param args [0] {@linkcode Utils.NumberHolder} gets set to 0 if move is immuned by an ability. * @param args [1] - Whether the move is simulated. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - // Field moves should ignore immunity - if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { - return false; - } - if (attacker !== pokemon && attacker.getMoveType(move) === this.immuneType) { - (args[0] as Utils.NumberHolder).value = 0; - return true; - } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = 0; } getImmuneType(): PokemonType | null { @@ -474,17 +503,19 @@ export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { super(immuneType, condition); } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr) + && super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } + /** * Applies immunity if the move used is not a status move. * Type immunity abilities that do not give additional benefits (HP recovery, stat boosts, etc) are not immune to status moves of the type * Example: Levitate */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { // this is a hacky way to fix the Levitate/Thousand Arrows interaction, but it works for now... - if (move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr)) { - return super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); - } - return false; + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); } } @@ -493,20 +524,18 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { super(immuneType); } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - if (!pokemon.isFullHp() && !simulated) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - cancelled.value = true; // Suppresses "No Effect" message - } - return true; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + if (!pokemon.isFullHp() && !simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + cancelled.value = true; // Suppresses "No Effect" message } - - return false; } } @@ -521,17 +550,16 @@ class TypeImmunityStatStageChangeAbAttr extends TypeImmunityAbAttr { this.stages = stages; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - cancelled.value = true; // Suppresses "No Effect" message - if (!simulated) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); - } + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + cancelled.value = true; // Suppresses "No Effect" message + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } - - return ret; } } @@ -546,17 +574,16 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { this.turnCount = turnCount; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - cancelled.value = true; // Suppresses "No Effect" message - if (!simulated) { - pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); - } + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + cancelled.value = true; // Suppresses "No Effect" message + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); } - - return ret; } } @@ -565,18 +592,16 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { super(null, condition); } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { const modifierValue = args.length > 0 ? (args[0] as Utils.NumberHolder).value : pokemon.getAttackTypeEffectiveness(attacker.getMoveType(move), attacker, undefined, undefined, move); + return move instanceof AttackMove && modifierValue < 2; + } - if (move instanceof AttackMove && modifierValue < 2) { - cancelled.value = true; // Suppresses "No Effect" message - (args[0] as Utils.NumberHolder).value = 0; - return true; - } - - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; // Suppresses "No Effect" message + (args[0] as Utils.NumberHolder).value = 0; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -593,6 +618,12 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { * @extends PreDefendAbAttr */ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + const typeMultiplier = args[0]; + return (typeMultiplier && typeMultiplier instanceof Utils.NumberHolder) && !(move && move.hasAttr(FixedDamageAttr)) && pokemon.isFullHp() && typeMultiplier.value > 0.5; + } + /** * Reduces a type multiplier to 0.5 if the source is at full HP. * @param pokemon {@linkcode Pokemon} the Pokemon with this ability @@ -602,7 +633,6 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { * @param move {@linkcode Move} the move being used on the source * @param cancelled n/a * @param args `[0]` a container for the move's current type effectiveness multiplier - * @returns `true` if the move's effectiveness is reduced; `false` otherwise */ override applyPreDefend( pokemon: Pokemon, @@ -611,23 +641,10 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, - args: any[], - ): boolean { + args: any[]): void { const typeMultiplier = args[0]; - if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) { - return false; - } - - if (move && move.hasAttr(FixedDamageAttr)) { - return false; - } - - if (pokemon.isFullHp() && typeMultiplier.value > 0.5) { - typeMultiplier.value = 0.5; - pokemon.turnData.moveEffectiveness = 0.5; - return true; - } - return false; + typeMultiplier.value = 0.5; + pokemon.turnData.moveEffectiveness = 0.5; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -638,6 +655,17 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { } export class PostDefendAbAttr extends AbAttr { + canApplyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { + return true; + } + applyPostDefend( pokemon: Pokemon, passive: boolean, @@ -646,37 +674,39 @@ export class PostDefendAbAttr extends AbAttr { move: Move, hitResult: HitResult | null, args: any[], - ): boolean { - return false; - } + ): void {} } export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (move.moveTarget === MoveTarget.USER || move.moveTarget === MoveTarget.NEAR_ALLY) { - return false; - } - if (move.getPriority(attacker) > 0 && !move.isMultiTarget()) { - cancelled.value = true; - return true; - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return !(move.moveTarget === MoveTarget.USER || move.moveTarget === MoveTarget.NEAR_ALLY) && move.getPriority(attacker) > 0 && !move.isMultiTarget(); + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } export class PostStatStageChangeAbAttr extends AbAttr { + canApplyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: number, + selfTarget: boolean, + args: any[]): boolean { + return true; + } + applyPostStatStageChange( pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], - stagesChanged: integer, + stagesChanged: number, selfTarget: boolean, args: any[], - ): boolean { - return false; - } + ): void {} } export class MoveImmunityAbAttr extends PreDefendAbAttr { @@ -688,13 +718,12 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { this.immuneCondition = immuneCondition; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.immuneCondition(pokemon, attacker, move)) { - cancelled.value = true; - return true; - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.immuneCondition(pokemon, attacker, move); + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -709,14 +738,19 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { * @extends PreDefendAbAttr */ export class WonderSkinAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const moveAccuracy = args[0] as Utils.NumberHolder; - if (move.category === MoveCategory.STATUS && moveAccuracy.value >= 50) { - moveAccuracy.value = 50; - return true; - } - return false; + constructor() { + super(false); + } + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + const moveAccuracy = args[0] as Utils.NumberHolder; + return move.category === MoveCategory.STATUS && moveAccuracy.value >= 50; + } + + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + const moveAccuracy = args[0] as Utils.NumberHolder; + moveAccuracy.value = 50; } } @@ -730,13 +764,13 @@ export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr { this.stages = stages; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); - if (ret && !simulated) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return !simulated && super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - return ret; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } } /** @@ -745,6 +779,11 @@ export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr { * @see {@linkcode applyPostDefend} */ export class ReverseDrainAbAttr extends PostDefendAbAttr { + + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.hasAttr(HitHealAttr) && !move.hitsSubstitute(attacker, pokemon); + } + /** * Determines if a damage and draining move was used to check if this ability should stop the healing. * Examples include: Absorb, Draining Kiss, Bitter Blade, etc. @@ -755,16 +794,11 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr { * @param move {@linkcode PokemonMove} that is being used * @param _hitResult N/A * @param _args N/A - * @returns true if healing should be reversed on a healing move, false otherwise. */ - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.hasAttr(HitHealAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - globalScene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); - } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); } - return false; } } @@ -785,24 +819,23 @@ export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr { this.allOthers = allOthers; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } - if (this.allOthers) { - const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); - for (const other of otherPokemon) { - globalScene.unshiftPhase(new StatStageChangePhase((other).getBattlerIndex(), false, [ this.stat ], this.stages)); - } - return true; - } - globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.stages)); - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (simulated) { + return; } - return false; + if (this.allOthers) { + const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); + for (const other of otherPokemon) { + globalScene.unshiftPhase(new StatStageChangePhase((other).getBattlerIndex(), false, [ this.stat ], this.stages)); + } + } else { + globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.stages)); + } } } @@ -823,19 +856,17 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr { this.selfTarget = selfTarget; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { const hpGateFlat: number = Math.ceil(pokemon.getMaxHp() * this.hpGate); const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]; const damageReceived = lastAttackReceived?.damage || 0; + return this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat) && !move.hitsSubstitute(attacker, pokemon); + } - if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages)); - } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages)); } - - return false; } } @@ -850,17 +881,16 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - const tag = globalScene.arena.getTag(this.tagType) as ArenaTrapTag; - if (!globalScene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers) { - if (!simulated) { - globalScene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + const tag = globalScene.arena.getTag(this.tagType) as ArenaTrapTag; + return (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) + && (!globalScene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); } - return false; } } @@ -874,40 +904,37 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (!pokemon.getTag(this.tagType) && !simulated) { - pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); - globalScene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); - } - return true; + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!pokemon.getTag(this.tagType) && !simulated) { + pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); + globalScene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); } - return false; } } export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean { - if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return true; - } - const type = attacker.getMoveType(move); - const pokemonTypes = pokemon.getTypes(true); - if (pokemonTypes.length !== 1 || pokemonTypes[0] !== type) { - pokemon.summonData.types = [ type ]; - return true; - } - } + private type: PokemonType; - return false; + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + this.type = attacker.getMoveType(move); + const pokemonTypes = pokemon.getTypes(true); + return hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon) && (simulated || pokemonTypes.length !== 1 || pokemonTypes[0] !== this.type); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): void { + const type = attacker.getMoveType(move); + pokemon.summonData.types = [ type ]; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { return i18next.t("abilityTriggers:postDefendTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName, - typeName: i18next.t(`pokemonInfo:Type.${PokemonType[pokemon.getTypes(true)[0]]}`) + typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); } } @@ -921,16 +948,14 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr { this.terrainType = terrainType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean { - if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return globalScene.arena.terrain?.terrainType !== (this.terrainType || undefined); - } else { - return globalScene.arena.trySetTerrain(this.terrainType, true); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + return hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon) && globalScene.arena.canSetTerrain(this.terrainType); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); + } } } @@ -939,24 +964,22 @@ export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr { private effects: StatusEffect[]; constructor(chance: number, ...effects: StatusEffect[]) { - super(); + super(true); this.chance = chance; this.effects = effects; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status - && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !move.hitsSubstitute(attacker, pokemon)) { - const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - if (simulated) { - return attacker.canSetStatus(effect, true, false, pokemon); - } else { - return attacker.trySetStatus(effect, true, pokemon); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status + && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !move.hitsSubstitute(attacker, pokemon) + && attacker.canSetStatus(effect, true, false, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.trySetStatus(effect, true, pokemon); } } @@ -965,11 +988,13 @@ export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr super(10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP); } - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(PokemonType.GRASS)) { - return false; - } - return super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !(attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(PokemonType.GRASS)) + && super.canApplyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); + } + + override applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); } } @@ -986,16 +1011,15 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { this.turnCount = turnCount; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return attacker.canAddTag(this.tagType); - } else { - return attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance + && !move.hitsSubstitute(attacker, pokemon) && attacker.canAddTag(this.tagType); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); + } } } @@ -1010,16 +1034,14 @@ export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr { this.stages = stages; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.hitsSubstitute(attacker, pokemon)) { - return false; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !move.hitsSubstitute(attacker, pokemon); + } + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } - - return true; } override getCondition(): AbAttrCondition { @@ -1036,15 +1058,14 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { this.damageRatio = damageRatio; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (!simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) - && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) + && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -1070,19 +1091,16 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { this.turns = turns; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) { - if (attacker.getTag(BattlerTagType.PERISH_SONG)) { - return false; - } else { - if (!simulated) { - attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); - pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) + && !attacker.getTag(BattlerTagType.PERISH_SONG); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); + pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); } - return false; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -1101,18 +1119,15 @@ export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition && !this.condition(pokemon, attacker, move) || move.hitsSubstitute(attacker, pokemon)) { - return false; - } - if (!globalScene.arena.weather?.isImmutable()) { - if (simulated) { - return globalScene.arena.weather?.weatherType !== this.weatherType; - } - return globalScene.arena.trySetWeather(this.weatherType, true); - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return (!(this.condition && !this.condition(pokemon, attacker, move) || move.hitsSubstitute(attacker, pokemon)) + && !globalScene.arena.weather?.isImmutable() && globalScene.arena.canSetWeather(this.weatherType)); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -1121,18 +1136,17 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { super(); } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) - && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - const tempAbility = attacker.getAbility(); - attacker.setTempAbility(pokemon.getAbility()); - pokemon.setTempAbility(tempAbility); - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) + && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, args: any[]): void { + if (!simulated) { + const tempAbility = attacker.getAbility(); + attacker.setTempAbility(pokemon.getAbility()); + pokemon.setTempAbility(tempAbility); + } } override getTriggerMessage(pokemon: Pokemon, _abilityName: string, ..._args: any[]): string { @@ -1148,17 +1162,15 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { this.ability = ability; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) - && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - attacker.setTempAbility(allAbilities[this.ability]); - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) + && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.setTempAbility(allAbilities[this.ability]); } - - return false; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -1180,20 +1192,17 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { this.chance = chance; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (attacker.getTag(BattlerTagType.DISABLED) === null && !move.hitsSubstitute(attacker, pokemon)) { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) { - if (simulated) { - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return attacker.getTag(BattlerTagType.DISABLED) === null && !move.hitsSubstitute(attacker, pokemon) + && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance); + } - this.attacker = attacker; - this.move = move; - this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id); - return true; - } + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + this.attacker = attacker; + this.move = move; + this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id); } - return false; } } @@ -1210,19 +1219,28 @@ export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChang this.stages = stages; } - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean { - if (this.condition(pokemon, statStagesChanged, stagesChanged) && !selfTarget) { - if (!simulated) { - globalScene.unshiftPhase(new StatStageChangePhase((pokemon).getBattlerIndex(), true, this.statsToChange, this.stages)); - } - return true; - } + override canApplyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: integer, selfTarget: boolean, args: any[]): boolean { + return this.condition(pokemon, statStagesChanged, stagesChanged) && !selfTarget; + } - return false; + override applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): void { + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase((pokemon).getBattlerIndex(), true, this.statsToChange, this.stages)); + } } } export class PreAttackAbAttr extends AbAttr { + canApplyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[]): boolean { + return true; + } + applyPreAttack( pokemon: Pokemon, passive: boolean, @@ -1230,9 +1248,7 @@ export class PreAttackAbAttr extends AbAttr { defender: Pokemon | null, move: Move, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -1244,26 +1260,22 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { private chanceMultiplier: number; constructor(chanceMultiplier: number) { - super(true); + super(false); this.chanceMultiplier = chanceMultiplier; } + + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const exceptMoves = [ Moves.ORDER_UP, Moves.ELECTRO_SHOT ]; + return !((args[0] as Utils.NumberHolder).value <= 0 || exceptMoves.includes((args[1] as Move).id)); + } + /** * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. Has to be higher than or equal to 0. * [1]: {@linkcode Moves } Move used by the ability user. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - // Disable showAbility during getTargetBenefitScore - this.showAbility = args[4]; - - const exceptMoves = [ Moves.ORDER_UP, Moves.ELECTRO_SHOT ]; - if ((args[0] as Utils.NumberHolder).value <= 0 || exceptMoves.includes((args[1] as Move).id)) { - return false; - } - + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= this.chanceMultiplier; (args[0] as Utils.NumberHolder).value = Math.min((args[0] as Utils.NumberHolder).value, 100); - return true; - } } @@ -1273,25 +1285,22 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * @see {@linkcode applyPreDefend} */ export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return (args[0] as Utils.NumberHolder).value > 0; + } + /** * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - - if ((args[0] as Utils.NumberHolder).value <= 0) { - return false; - } - + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value = 0; - return true; - } } export class VariableMovePowerAbAttr extends PreAttackAbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - //const power = args[0] as Utils.NumberHolder; - return false; + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + return true; } } @@ -1302,9 +1311,8 @@ export class FieldPreventExplosiveMovesAbAttr extends AbAttr { simulated: boolean, cancelled: Utils.BooleanHolder, args: any[], - ): boolean { + ): void { cancelled.value = true; - return true; } } @@ -1328,6 +1336,11 @@ export class FieldMultiplyStatAbAttr extends AbAttr { this.canStack = canStack; } + canApplyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean { + return this.canStack || !hasApplied.value + && this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyStatAbAttr).every(attr => (attr as FieldMultiplyStatAbAttr).stat !== stat); + } + /** * applyFieldStat: Tries to multiply a Pokemon's Stat * @param pokemon {@linkcode Pokemon} the Pokemon using this ability @@ -1337,19 +1350,10 @@ export class FieldMultiplyStatAbAttr extends AbAttr { * @param checkedPokemon {@linkcode Pokemon} the Pokemon this ability is targeting * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not another multiplier has been applied to this stat * @param args {any[]} unused - * @returns true if this changed the checked stat, false otherwise. */ - applyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean { - if (!this.canStack && hasApplied.value) { - return false; - } - - if (this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyStatAbAttr).every(attr => (attr as FieldMultiplyStatAbAttr).stat !== stat)) { - statValue.value *= this.multiplier; - hasApplied.value = true; - return true; - } - return false; + applyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): void { + statValue.value *= this.multiplier; + hasApplied.value = true; } } @@ -1360,22 +1364,21 @@ export class MoveTypeChangeAbAttr extends PreAttackAbAttr { private powerMultiplier: number, private condition?: PokemonAttackCondition ) { - super(true); + super(false); + } + + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return (this.condition && this.condition(pokemon, defender, move)) ?? false; } // TODO: Decouple this into two attributes (type change / power boost) - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition && this.condition(pokemon, defender, move)) { - if (args[0] && args[0] instanceof Utils.NumberHolder) { - args[0].value = this.newType; - } - if (args[1] && args[1] instanceof Utils.NumberHolder) { - args[1].value *= this.powerMultiplier; - } - return true; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + if (args[0] && args[0] instanceof Utils.NumberHolder) { + args[0].value = this.newType; + } + if (args[1] && args[1] instanceof Utils.NumberHolder) { + args[1].value *= this.powerMultiplier; } - - return false; } } @@ -1387,37 +1390,37 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { super(true); } - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if ( - !pokemon.isTerastallized && - move.id !== Moves.STRUGGLE && - /** - * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute - * @see {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_call_other_moves} - */ - !move.findAttr((attr) => - attr instanceof RandomMovesetMoveAttr || - attr instanceof RandomMoveAttr || - attr instanceof NaturePowerAttr || - attr instanceof CopyMoveAttr - ) - ) { + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + if (!pokemon.isTerastallized && + move.id !== Moves.STRUGGLE && + /** + * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_call_other_moves} + */ + !move.findAttr((attr) => + attr instanceof RandomMovesetMoveAttr || + attr instanceof RandomMoveAttr || + attr instanceof NaturePowerAttr || + attr instanceof CopyMoveAttr)) { const moveType = pokemon.getMoveType(move); - if (pokemon.getTypes().some((t) => t !== moveType)) { - if (!simulated) { - this.moveType = moveType; - pokemon.summonData.types = [ moveType ]; - pokemon.updateInfo(); - } - + this.moveType = moveType; return true; } } - return false; } + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const moveType = pokemon.getMoveType(move); + + if (!simulated) { + this.moveType = moveType; + pokemon.summonData.types = [ moveType ]; + pokemon.updateInfo(); + } + } + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), @@ -1439,6 +1442,10 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { this.damageMultiplier = damageMultiplier; } + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return move.canBeMultiStrikeEnhanced(pokemon, true); + } + /** * If conditions are met, this doubles the move's hit count (via args[1]) * or multiplies the damage of secondary strikes (via args[2]) @@ -1449,24 +1456,17 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { * @param args Additional arguments: * - `[0]` the number of strikes this move currently has ({@linkcode Utils.NumberHolder}) * - `[1]` the damage multiplier for the current strike ({@linkcode Utils.NumberHolder}) - * @returns */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { const hitCount = args[0] as Utils.NumberHolder; const multiplier = args[1] as Utils.NumberHolder; - - if (move.canBeMultiStrikeEnhanced(pokemon, true)) { - this.showAbility = !!hitCount?.value; - if (hitCount?.value) { - hitCount.value += 1; - } - - if (multiplier?.value && pokemon.turnData.hitsLeft === 1) { - multiplier.value = this.damageMultiplier; - } - return true; + if (hitCount?.value) { + hitCount.value += 1; + } + + if (multiplier?.value && pokemon.turnData.hitsLeft === 1) { + multiplier.value = this.damageMultiplier; } - return false; } } @@ -1481,11 +1481,15 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { private condition: PokemonAttackCondition; constructor(damageMultiplier: number, condition: PokemonAttackCondition) { - super(true); + super(false); this.damageMultiplier = damageMultiplier; this.condition = condition; } + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return this.condition(pokemon, defender, move); + } + /** * * @param pokemon the attacker pokemon @@ -1493,16 +1497,10 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { * @param defender the target pokemon * @param move the move used by the attacker pokemon * @param args Utils.NumberHolder as damage - * @returns true if the function succeeds */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition(pokemon, defender, move)) { - const power = args[0] as Utils.NumberHolder; - power.value = Utils.toDmgValue(power.value * this.damageMultiplier); - return true; - } - - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const power = args[0] as Utils.NumberHolder; + power.value = Utils.toDmgValue(power.value * this.damageMultiplier); } } @@ -1510,26 +1508,24 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { private condition: PokemonAttackCondition; private powerMultiplier: number; - constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility = true) { + constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = false) { super(showAbility); this.condition = condition; this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition(pokemon, defender, move)) { - (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return this.condition(pokemon, defender, move); + } - return true; - } - - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; } } export class MoveTypePowerBoostAbAttr extends MovePowerBoostAbAttr { constructor(boostedType: PokemonType, powerMultiplier?: number) { - super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); + super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5, false); } } @@ -1560,17 +1556,13 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { this.mult = mult; } - /** - * @override - */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move, args: any[]): boolean { - const multiplier = this.mult(pokemon, defender, move); - if (multiplier !== 1) { - (args[0] as Utils.NumberHolder).value *= multiplier; - return true; - } + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + return this.mult(pokemon, defender, move) !== 1; + } - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const multiplier = this.mult(pokemon, defender, move); + (args[0] as Utils.NumberHolder).value *= multiplier; } } @@ -1579,6 +1571,7 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { * @extends AbAttr */ export class FieldMovePowerBoostAbAttr extends AbAttr { + // TODO: Refactor this class? It extends from base AbAttr but has preAttack methods and gets called directly instead of going through applyAbAttrsInternal private condition: PokemonAttackCondition; private powerMultiplier: number; @@ -1592,14 +1585,14 @@ export class FieldMovePowerBoostAbAttr extends AbAttr { this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + canApplyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return true; // logic for this attr is handled in move.ts instead of normally + } + + applyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): void { if (this.condition(pokemon, defender, move)) { (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; - - return true; } - - return false; } } @@ -1656,21 +1649,25 @@ export class StatMultiplierAbAttr extends AbAttr { this.condition = condition ?? null; } + canApplyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[]): boolean { + const move = (args[0] as Move); + return stat === this.stat && (!this.condition || this.condition(pokemon, null, move)); + } + applyStatStage( pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, - args: any[], - ): boolean { - const move = args[0] as Move; - if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) { - statValue.value *= this.multiplier; - return true; - } - - return false; + args: any[]): void { + statValue.value *= this.multiplier; } } @@ -1685,10 +1682,23 @@ export class PostAttackAbAttr extends AbAttr { } /** - * Please override {@link applyPostAttackAfterMoveTypeCheck} instead of this method. By default, this method checks that the move used is a damaging attack before + * By default, this method checks that the move used is a damaging attack before * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} * for an example of an effect that does not require a damaging move. */ + canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { + // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. + // If attackRequired is false, we always defer to the secondary requirements. + return this.attackCondition(pokemon, defender, move); + } + applyPostAttack( pokemon: Pokemon, passive: boolean, @@ -1696,31 +1706,7 @@ export class PostAttackAbAttr extends AbAttr { defender: Pokemon, move: Move, hitResult: HitResult | null, - args: any[], - ): boolean { - // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. - // If attackRequired is false, we always defer to the secondary requirements. - if (this.attackCondition(pokemon, defender, move)) { - return this.applyPostAttackAfterMoveTypeCheck(pokemon, passive, simulated, defender, move, hitResult, args); - } else { - return false; - } - } - - /** - * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. - */ - applyPostAttackAfterMoveTypeCheck( - pokemon: Pokemon, - passive: boolean, - simulated: boolean, - defender: Pokemon, - move: Move, - hitResult: HitResult | null, - args: any[], - ): boolean { - return false; - } + args: any[]): void {} } /** @@ -1732,6 +1718,18 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { super((user, target, move) => true, false); } + override canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { + return super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) + && simulated || !pokemon.getTag(BattlerTagType.GORILLA_TACTICS); + } + /** * * @param {Pokemon} pokemon the {@linkcode Pokemon} with this ability @@ -1741,32 +1739,24 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { * @param move n/a * @param hitResult n/a * @param args n/a - * @returns `true` if the ability is applied */ - override applyPostAttackAfterMoveTypeCheck( + override applyPostAttack( pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, - args: any[], - ): boolean { - if (simulated) { - return simulated; + args: any[]): void { + if (!simulated) { + pokemon.addTag(BattlerTagType.GORILLA_TACTICS); } - - if (pokemon.getTag(BattlerTagType.GORILLA_TACTICS)) { - return false; - } - - pokemon.addTag(BattlerTagType.GORILLA_TACTICS); - return true; } } export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { private stealCondition: PokemonAttackCondition | null; + private stolenItem?: PokemonHeldItemModifier; constructor(stealCondition?: PokemonAttackCondition) { super(); @@ -1774,7 +1764,34 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { this.stealCondition = stealCondition ?? null; } - override applyPostAttackAfterMoveTypeCheck( + override canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[]): boolean { + if ( + super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) && + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.stealCondition || this.stealCondition(pokemon, defender, move)) + ) { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (heldItems.length) { + // Ensure that the stolen item in testing is the same as when the effect is applied + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.canTransferHeldItemModifier(this.stolenItem, pokemon)) { + return true; + } + } + } + this.stolenItem = undefined; + return false; + } + + override applyPostAttack( pokemon: Pokemon, passive: boolean, simulated: boolean, @@ -1782,28 +1799,21 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { move: Move, hitResult: HitResult, args: any[], - ): boolean { - if ( - !simulated && - hitResult < HitResult.NO_EFFECT && - (!this.stealCondition || this.stealCondition(pokemon, defender, move)) - ) { - const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { - globalScene.queueMessage( - i18next.t("abilityTriggers:postAttackStealHeldItem", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - defenderName: defender.name, - stolenItemType: stolenItem.type.name, - }), - ); - return true; - } - } + ): void { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (!this.stolenItem) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; } - return false; + if (globalScene.tryTransferHeldItemModifier(this.stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postAttackStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + defenderName: defender.name, + stolenItemType: this.stolenItem.type.name, + }), + ); + } + this.stolenItem = undefined; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1825,18 +1835,23 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (pokemon !== attacker && move.hitsSubstitute(attacker, pokemon)) { - return false; - } - - /**Status inflicted by abilities post attacking are also considered additional effects.*/ - if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !simulated && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + if ( + super.canApplyPostAttack(pokemon, passive, simulated, attacker, move, hitResult, args) + && !(pokemon !== attacker && move.hitsSubstitute(attacker, pokemon)) + && (simulated || !attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker + && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) + ) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return attacker.trySetStatus(effect, true, pokemon); + return simulated || attacker.canSetStatus(effect, true, false, pokemon); } - return simulated; + return false; + } + + applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.trySetStatus(effect, true, pokemon); } } @@ -1853,26 +1868,32 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { constructor(contactRequired: boolean, chance: (user: Pokemon, target: Pokemon, move: Move) => number, ...effects: BattlerTagType[]) { - super(); + super(undefined, false); this.contactRequired = contactRequired; this.chance = chance; this.effects = effects; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { /**Battler tags inflicted by abilities post attacking are also considered additional effects.*/ - if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { - const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return simulated || attacker.addTag(effect); - } + return super.canApplyPostAttack(pokemon, passive, simulated, attacker, move, hitResult, args) && + !attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && + (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && + pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status; + } - return false; + override applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + if (!simulated) { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.addTag(effect); + } } } export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { private condition?: PokemonDefendCondition; + private stolenItem?: PokemonHeldItemModifier; constructor(condition?: PokemonDefendCondition) { super(); @@ -1880,6 +1901,24 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { this.condition = condition; } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.condition || this.condition(pokemon, attacker, move)) && + !move.hitsSubstitute(attacker, pokemon) + ) { + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (heldItems.length) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.canTransferHeldItemModifier(this.stolenItem, pokemon)) { + return true; + } + } + } + return false; + } + override applyPostDefend( pokemon: Pokemon, _passive: boolean, @@ -1888,29 +1927,22 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { move: Move, hitResult: HitResult, _args: any[], - ): boolean { - if ( - !simulated && - hitResult < HitResult.NO_EFFECT && - (!this.condition || this.condition(pokemon, attacker, move)) && - !move.hitsSubstitute(attacker, pokemon) - ) { - const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { - globalScene.queueMessage( - i18next.t("abilityTriggers:postDefendStealHeldItem", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - attackerName: attacker.name, - stolenItemType: stolenItem.type.name, - }), - ); - return true; - } - } + ): void { + + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (!this.stolenItem) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; } - return false; + if (globalScene.tryTransferHeldItemModifier(this.stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postDefendStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + attackerName: attacker.name, + stolenItemType: this.stolenItem.type.name, + }), + ); + } + this.stolenItem = undefined; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1924,6 +1956,16 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { * @see {@linkcode applyPostSetStatus()}. */ export class PostSetStatusAbAttr extends AbAttr { + canApplyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + rgs: any[]): boolean { + return true; + } + /** * Does nothing after a status condition is set. * @param pokemon {@linkcode Pokemon} that status condition was set on. @@ -1931,7 +1973,6 @@ export class PostSetStatusAbAttr extends AbAttr { * @param passive Whether this ability is a passive. * @param effect {@linkcode StatusEffect} that was set. * @param args Set of unique arguments needed by this attribute. - * @returns `true` if application of the ability succeeds. */ applyPostSetStatus( pokemon: Pokemon, @@ -1940,9 +1981,7 @@ export class PostSetStatusAbAttr extends AbAttr { effect: StatusEffect, simulated: boolean, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -1951,17 +1990,7 @@ export class PostSetStatusAbAttr extends AbAttr { * ability attribute. For Synchronize ability. */ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { - /** - * If the `StatusEffect` that was set is Burn, Paralysis, Poison, or Toxic, and the status - * was set by a source Pokemon, set the source Pokemon's status to the same `StatusEffect`. - * @param pokemon {@linkcode Pokemon} that status condition was set on. - * @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is null if status was not set by a Pokemon. - * @param passive Whether this ability is a passive. - * @param effect {@linkcode StatusEffect} that was set. - * @param args Set of unique arguments needed by this attribute. - * @returns `true` if application of the ability succeeds. - */ - override applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): boolean { + override canApplyPostSetStatus(pokemon: Pokemon, sourcePokemon: (Pokemon | null) | undefined, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): boolean { /** Synchronizable statuses */ const syncStatuses = new Set([ StatusEffect.BURN, @@ -1970,21 +1999,32 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { StatusEffect.TOXIC ]); - if (sourcePokemon && syncStatuses.has(effect)) { - if (!simulated) { - sourcePokemon.trySetStatus(effect, true, pokemon); - } - return true; - } + // synchronize does not need to check canSetStatus because the ability shows even if it fails to set the status + return ((sourcePokemon ?? false) && syncStatuses.has(effect)); + } - return false; + /** + * If the `StatusEffect` that was set is Burn, Paralysis, Poison, or Toxic, and the status + * was set by a source Pokemon, set the source Pokemon's status to the same `StatusEffect`. + * @param pokemon {@linkcode Pokemon} that status condition was set on. + * @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is null if status was not set by a Pokemon. + * @param passive Whether this ability is a passive. + * @param effect {@linkcode StatusEffect} that was set. + * @param args Set of unique arguments needed by this attribute. + */ + override applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): void { + if (!simulated && sourcePokemon) { + sourcePokemon.trySetStatus(effect, true, pokemon); + } } } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { @@ -1998,12 +2038,11 @@ class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { this.stages = stages; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } - return true; } } @@ -2016,23 +2055,24 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); - } - return true; - } + return formIndex !== pokemon.formIndex; + } - return false; + override applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); + } } } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { - return false; + canApplyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + return true; } + + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void {} } export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { @@ -2046,12 +2086,11 @@ export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { this.stages = stages; } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + override applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void { const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } - return true; } } @@ -2060,16 +2099,15 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { - if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { - if (!simulated) { - globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); - pokemon.setTempAbility(knockedOut.getAbility()); - } - return true; - } + override canApplyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + return pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr); + } - return false; + override applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void { + if (!simulated) { + pokemon.setTempAbility(knockedOut.getAbility()); + globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); + } } } @@ -2086,6 +2124,10 @@ export class IgnoreOpponentStatStagesAbAttr extends AbAttr { this.stats = stats ?? BATTLE_STATS; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.stats.includes(args[0]); + } + /** * Modifies a BooleanHolder and returns the result to see if a stat is ignored or not * @param _pokemon n/a @@ -2093,14 +2135,9 @@ export class IgnoreOpponentStatStagesAbAttr extends AbAttr { * @param simulated n/a * @param _cancelled n/a * @param args A BooleanHolder that represents whether or not to ignore a stat's stat changes - * @returns true if the stat is ignored, false otherwise */ - apply(_pokemon: Pokemon, _passive: boolean, simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]) { - if (this.stats.includes(args[0])) { - (args[1] as Utils.BooleanHolder).value = true; - return true; - } - return false; + override apply(_pokemon: Pokemon, _passive: boolean, simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { + (args[1] as Utils.BooleanHolder).value = true; } } @@ -2109,9 +2146,8 @@ export class IntimidateImmunityAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2134,12 +2170,11 @@ export class PostIntimidateStatStageChangeAbAttr extends AbAttr { this.overwrites = !!overwrites; } - apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { globalScene.pushPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, this.stats, this.stages)); } cancelled.value = this.overwrites; - return true; } } @@ -2163,16 +2198,17 @@ export class PostSummonAbAttr extends AbAttr { return this.activateOnGain; } + canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } + /** * Applies ability post summon (after switching in) * @param pokemon {@linkcode Pokemon} with this ability * @param passive Whether this ability is a passive * @param args Set of unique arguments needed by this attribute - * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; - } + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } /** @@ -2190,13 +2226,16 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.tags.some(tag => this.arenaTags.includes(tag.tagType)); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { for (const arenaTag of this.arenaTags) { globalScene.arena.removeTag(arenaTag); } } - return true; } } @@ -2211,20 +2250,19 @@ export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr { private sourceId: number; - constructor(tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) { - super(false); + constructor(showAbility: boolean, tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) { + super(showAbility); this.tagType = tagType; this.turnCount = turnCount; this.side = side; this.quiet = quiet; } - public override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + public override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { this.sourceId = pokemon.id; if (!simulated) { globalScene.arena.addTag(this.tagType, this.turnCount, undefined, this.sourceId, this.side, this.quiet); } - return true; } } @@ -2237,12 +2275,10 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr { this.messageFunc = messageFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { globalScene.queueMessage(this.messageFunc(pokemon)); } - - return true; } } @@ -2256,12 +2292,10 @@ export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { this.message = message; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { globalScene.queueMessage(this.message); } - - return true; } } @@ -2276,11 +2310,13 @@ export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr { this.turnCount = turnCount; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.canAddTag(this.tagType); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } @@ -2292,7 +2328,7 @@ export class PostSummonStatStageChangeAbAttr extends PostSummonAbAttr { private intimidate: boolean; constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, intimidate?: boolean) { - super(false); + super(true); this.stats = stats; this.stages = stages; @@ -2300,33 +2336,31 @@ export class PostSummonStatStageChangeAbAttr extends PostSummonAbAttr { this.intimidate = !!intimidate; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (simulated) { - return true; + return; } - queueShowAbility(pokemon, passive); // TODO: Better solution than manually showing the ability here if (this.selfTarget) { // we unshift the StatStageChangePhase to put it right after the showAbility and not at the end of the // phase list (which could be after CommandPhase for example) globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); - return true; - } - for (const opponent of pokemon.getOpponents()) { - const cancelled = new Utils.BooleanHolder(false); - if (this.intimidate) { - applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled, simulated); - applyAbAttrs(PostIntimidateStatStageChangeAbAttr, opponent, cancelled, simulated); + } else { + for (const opponent of pokemon.getOpponents()) { + const cancelled = new Utils.BooleanHolder(false); + if (this.intimidate) { + applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled, simulated); + applyAbAttrs(PostIntimidateStatStageChangeAbAttr, opponent, cancelled, simulated); - if (opponent.getTag(BattlerTagType.SUBSTITUTE)) { - cancelled.value = true; + if (opponent.getTag(BattlerTagType.SUBSTITUTE)) { + cancelled.value = true; + } + } + if (!cancelled.value) { + globalScene.unshiftPhase(new StatStageChangePhase(opponent.getBattlerIndex(), false, this.stats, this.stages)); } } - if (!cancelled.value) { - globalScene.unshiftPhase(new StatStageChangePhase(opponent.getBattlerIndex(), false, this.stats, this.stages)); - } } - return true; } } @@ -2341,18 +2375,16 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { this.showAnim = showAnim; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getAlly()?.isActive(true); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const target = pokemon.getAlly(); - if (target?.isActive(true)) { - if (!simulated) { - globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / this.healRatio), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); - } - - return true; + if (!simulated) { + globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / this.healRatio), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); } - - return false; } } @@ -2369,21 +2401,19 @@ export class PostSummonClearAllyStatStagesAbAttr extends PostSummonAbAttr { super(); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const target = pokemon.getAlly(); - if (target?.isActive(true)) { - if (!simulated) { - for (const s of BATTLE_STATS) { - target.setStatStage(s, 0); - } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getAlly()?.isActive(true); + } - globalScene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const target = pokemon.getAlly(); + if (!simulated) { + for (const s of BATTLE_STATS) { + target.setStatStage(s, 0); } - return true; + globalScene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); } - - return false; } } @@ -2400,15 +2430,7 @@ export class DownloadAbAttr extends PostSummonAbAttr { private enemyCountTally: number; private stats: BattleStat[]; - /** - * Checks to see if it is the opening turn (starting a new game), if so, Download won't work. This is because Download takes into account - * vitamins and items, so it needs to use the Stat and the stat alone. - * @param {Pokemon} pokemon Pokemon that is using the move, as well as seeing the opposing pokemon. - * @param {boolean} passive N/A - * @param {any[]} args N/A - * @returns Returns true if ability is used successful, false if not. - */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { this.enemyDef = 0; this.enemySpDef = 0; this.enemyCountTally = 0; @@ -2420,21 +2442,26 @@ export class DownloadAbAttr extends PostSummonAbAttr { } this.enemyDef = Math.round(this.enemyDef / this.enemyCountTally); this.enemySpDef = Math.round(this.enemySpDef / this.enemyCountTally); + return this.enemyDef > 0 && this.enemySpDef > 0; + } + /** + * Checks to see if it is the opening turn (starting a new game), if so, Download won't work. This is because Download takes into account + * vitamins and items, so it needs to use the Stat and the stat alone. + * @param {Pokemon} pokemon Pokemon that is using the move, as well as seeing the opposing pokemon. + * @param {boolean} passive N/A + * @param {any[]} args N/A + */ + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (this.enemyDef < this.enemySpDef) { this.stats = [ Stat.ATK ]; } else { this.stats = [ Stat.SPATK ]; } - if (this.enemyDef > 0 && this.enemySpDef > 0) { // only activate if there's actually an enemy to download from - if (!simulated) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, this.stats, 1)); - } - return true; + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, this.stats, 1)); } - - return false; } } @@ -2447,18 +2474,17 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr { this.weatherType = weatherType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if ((this.weatherType === WeatherType.HEAVY_RAIN || + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherReplaceable = (this.weatherType === WeatherType.HEAVY_RAIN || this.weatherType === WeatherType.HARSH_SUN || - this.weatherType === WeatherType.STRONG_WINDS) || !globalScene.arena.weather?.isImmutable()) { - if (simulated) { - return globalScene.arena.weather?.weatherType !== this.weatherType; - } else { - return globalScene.arena.trySetWeather(this.weatherType, true); - } - } + this.weatherType === WeatherType.STRONG_WINDS) || !globalScene.arena.weather?.isImmutable(); + return weatherReplaceable && globalScene.arena.canSetWeather(this.weatherType); + } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -2471,11 +2497,13 @@ export class PostSummonTerrainChangeAbAttr extends PostSummonAbAttr { this.terrainType = terrainType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return globalScene.arena.terrain?.terrainType !== this.terrainType; - } else { - return globalScene.arena.trySetTerrain(this.terrainType, true); + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(this.terrainType); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); } } } @@ -2489,13 +2517,14 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { this.formFunc = formFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - return simulated || globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); - } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); + } } } @@ -2504,7 +2533,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { private target: Pokemon; private targetAbilityName: string; - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { return false; @@ -2525,15 +2554,17 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { return false; } + this.target = target!; + this.targetAbilityName = allAbilities[target!.getAbility().id].name; + return true; + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - this.target = target!; - this.targetAbilityName = allAbilities[target!.getAbility().id].name; - pokemon.setTempAbility(target!.getAbility()); - setAbilityRevealed(target!); + pokemon.setTempAbility(this.target!.getAbility()); + setAbilityRevealed(this.target!); pokemon.updateInfo(); } - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2560,22 +2591,22 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt this.statusEffect = statusEffect; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); + return party.filter(p => p.isAllowedInBattle()).length > 0; + } + /** * Removes supplied status effect from the user's field when user of the ability is summoned. * * @param pokemon - The Pokémon that triggered the ability. * @param passive - n/a * @param args - n/a - * @returns A boolean that resolves to a boolean indicating the result of the ability application. */ - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); const allowedParty = party.filter(p => p.isAllowedInBattle()); - if (allowedParty.length < 1) { - return false; - } - if (!simulated) { for (const pokemon of allowedParty) { if (pokemon.status && this.statusEffect.includes(pokemon.status.effect)) { @@ -2585,14 +2616,13 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt } } } - return true; } } /** Attempt to copy the stat changes on an ally pokemon */ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!globalScene.currentBattle.double) { return false; } @@ -2602,14 +2632,17 @@ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { return false; } + return true; + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const ally = pokemon.getAlly(); if (!simulated) { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, ally.getStatStage(s)); } pokemon.updateInfo(); } - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2628,12 +2661,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true, false); } - override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): boolean { - const targets = pokemon.getOpponents(); - if (simulated || !targets.length) { - return simulated; - } - + private getTarget(targets: Pokemon[]): Pokemon { let target: Pokemon; if (targets.length > 1) { globalScene.executeWithSeedOffset(() => { @@ -2653,21 +2681,28 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { } target = target!; + return target; + } + + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const targets = pokemon.getOpponents(); + if (simulated || !targets.length) { + return simulated; + } + // transforming from or into fusion pokemon causes various problems (including crashes and save corruption) - if (target.fusionSpecies || pokemon.fusionSpecies) { + if (this.getTarget(targets).fusionSpecies || pokemon.fusionSpecies) { return false; } + return true; + } + + override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): void { + const target = this.getTarget(pokemon.getOpponents()); + globalScene.unshiftPhase(new PokemonTransformPhase(pokemon.getBattlerIndex(), target.getBattlerIndex(), true)); - globalScene.queueMessage( - i18next.t("abilityTriggers:postSummonTransform", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - targetName: target.name, - }), - ); - - return true; } } @@ -2677,25 +2712,20 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { * @extends PostSummonAbAttr */ export class PostSummonWeatherSuppressedFormChangeAbAttr extends PostSummonAbAttr { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return getPokemonWithWeatherBasedForms().length > 0; + } + /** * Triggers {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} * @param {Pokemon} pokemon the Pokemon with this ability * @param passive n/a * @param args n/a - * @returns whether a Pokemon was reverted to its normal form */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]) { - const pokemonToTransform = getPokemonWithWeatherBasedForms(); - - if (pokemonToTransform.length < 1) { - return false; - } - + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { globalScene.arena.triggerWeatherBasedFormChangesToNormal(); } - - return true; } } @@ -2713,6 +2743,12 @@ export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr { this.ability = ability; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); + const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); + return isCastformWithForecast || isCherrimWithFlowerGift; + } + /** * Calls the {@linkcode BattleScene.triggerPokemonFormChange | triggerPokemonFormChange} for both * {@linkcode SpeciesFormChange.SpeciesFormChangeWeatherTrigger | SpeciesFormChangeWeatherTrigger} and @@ -2721,23 +2757,13 @@ export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr { * @param {Pokemon} pokemon the Pokemon with this ability * @param passive n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); - const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); - - if (isCastformWithForecast || isCherrimWithFlowerGift) { - if (simulated) { - return simulated; - } - + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeWeatherTrigger); globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeRevertWeatherFormTrigger); - queueShowAbility(pokemon, passive); - return true; + globalScene.queueAbilityDisplay(pokemon, passive, true); } - return false; } } @@ -2752,53 +2778,55 @@ export class CommanderAbAttr extends AbAttr { super(true); } - override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): boolean { - // TODO: Should this work with X + Dondozo fusions? - if (globalScene.currentBattle?.double && pokemon.getAlly()?.species.speciesId === Species.DONDOZO) { - // If the ally Dondozo is fainted or was previously "commanded" by - // another Pokemon, this effect cannot apply. - if (pokemon.getAlly().isFainted() || pokemon.getAlly().getTag(BattlerTagType.COMMANDED)) { - return false; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + // If the ally Dondozo is fainted or was previously "commanded" by + // another Pokemon, this effect cannot apply. - if (!simulated) { - // Lapse the source's semi-invulnerable tags (to avoid visual inconsistencies) - pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - // Play an animation of the source jumping into the ally Dondozo's mouth - globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.COMMANDER_APPLY); - // Apply boosts from this effect to the ally Dondozo - pokemon.getAlly().addTag(BattlerTagType.COMMANDED, 0, Moves.NONE, pokemon.id); - // Cancel the source Pokemon's next move (if a move is queued) - globalScene.tryRemovePhase((phase) => phase instanceof MovePhase && phase.pokemon === pokemon); - } - return true; + // TODO: Should this work with X + Dondozo fusions? + return !(pokemon.getAlly().isFainted() || pokemon.getAlly().getTag(BattlerTagType.COMMANDED)) + && globalScene.currentBattle?.double && pokemon.getAlly()?.species.speciesId === Species.DONDOZO; + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): void { + if (!simulated) { + // Lapse the source's semi-invulnerable tags (to avoid visual inconsistencies) + pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + // Play an animation of the source jumping into the ally Dondozo's mouth + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.COMMANDER_APPLY); + // Apply boosts from this effect to the ally Dondozo + pokemon.getAlly().addTag(BattlerTagType.COMMANDED, 0, Moves.NONE, pokemon.id); + // Cancel the source Pokemon's next move (if a move is queued) + globalScene.tryRemovePhase((phase) => phase instanceof MovePhase && phase.pokemon === pokemon); } - return false; } } export class PreSwitchOutAbAttr extends AbAttr { - constructor() { - super(true); + constructor(showAbility: boolean = true) { + super(showAbility); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (pokemon.status) { - if (!simulated) { - pokemon.resetStatus(); - pokemon.updateInfo(); - } + constructor() { + super(false); + } - return true; + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !Utils.isNullOrUndefined(pokemon.status); + } + + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + pokemon.resetStatus(); + pokemon.updateInfo(); } - - return false; } } @@ -2867,18 +2895,16 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { } export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!pokemon.isFullHp()) { - if (!simulated) { - const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); - pokemon.heal(healAmount); - pokemon.updateInfo(); - } + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return true; + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); + pokemon.heal(healAmount); + pokemon.updateInfo(); } - - return false; } } @@ -2896,80 +2922,73 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { this.formFunc = formFunc; } + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } + /** * On switch out, trigger the form change to the one defined in the ability * @param pokemon The pokemon switching out and changing form {@linkcode Pokemon} * @param passive N/A * @param args N/A - * @returns true if the form change was successful */ - override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); - } - return true; + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } - - return false; } } export class PreLeaveFieldAbAttr extends AbAttr { - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } /** * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. */ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { - /** - * @param pokemon The {@linkcode Pokemon} with the ability - * @param passive N/A - * @param args N/A - * @returns Returns `true` if the weather clears, otherwise `false`. - */ - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const weatherType = globalScene.arena.weather?.weatherType; - let turnOffWeather = false; + override canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; // Clear weather only if user's ability matches the weather and no other pokemon has the ability. switch (weatherType) { case (WeatherType.HARSH_SUN): if (pokemon.hasAbility(Abilities.DESOLATE_LAND) && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { - turnOffWeather = true; + return true; } break; case (WeatherType.HEAVY_RAIN): if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { - turnOffWeather = true; + return true; } break; case (WeatherType.STRONG_WINDS): if (pokemon.hasAbility(Abilities.DELTA_STREAM) && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { - turnOffWeather = true; + return true; } break; } - - if (simulated) { - return turnOffWeather; - } - - if (turnOffWeather) { - globalScene.arena.trySetWeather(WeatherType.NONE, false); - return true; - } - return false; } + + /** + * @param pokemon The {@linkcode Pokemon} with the ability + * @param passive N/A + * @param args N/A + */ + override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + } + } } /** @@ -2980,19 +2999,27 @@ export class PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr extends PreLeaveFi super(false); } - public override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated) { - const suppressTag = globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; - if (suppressTag) { - suppressTag.onSourceLeave(globalScene.arena); - return true; - } - } - return simulated; + public override canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !!globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS); + } + + public override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const suppressTag = globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + suppressTag.onSourceLeave(globalScene.arena); } } export class PreStatStageChangeAbAttr extends AbAttr { + canApplyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; + } + applyPreStatStageChange( pokemon: Pokemon | null, passive: boolean, @@ -3000,9 +3027,7 @@ export class PreStatStageChangeAbAttr extends AbAttr { stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -3021,9 +3046,8 @@ export class ReflectStatStageChangeAbAttr extends PreStatStageChangeAbAttr { * @param stat the {@linkcode BattleStat} being affected * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true due to reflection * @param args - * @returns true because it reflects any stat being lowered */ - applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): void { const attacker: Pokemon = args[0]; const stages = args[1]; this.reflectedStat = stat; @@ -3031,7 +3055,6 @@ export class ReflectStatStageChangeAbAttr extends PreStatStageChangeAbAttr { globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [ stat ], stages, true, false, true, null, true)); } cancelled.value = true; - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -3056,6 +3079,10 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { this.protectedStat = protectedStat; } + override canApplyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat; + } + /** * Apply the {@linkcode ProtectedStatAbAttr} to an interaction * @param _pokemon @@ -3064,15 +3091,9 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { * @param stat the {@linkcode BattleStat} being affected * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true if the stat is protected * @param _args - * @returns true if the stat is protected, false otherwise */ - applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean { - if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) { - cancelled.value = true; - return true; - } - - return false; + override applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -3100,6 +3121,13 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { super((user, target, move) => true); this.effects = effects; } + + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) + && this.effects.indexOf(args[0]) > -1 && !defender.isFainted() && defender.canAddTag(BattlerTagType.CONFUSED); + } + + /** * Applies confusion to the target pokemon. * @param pokemon {@link Pokemon} attacking @@ -3108,21 +3136,25 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { * @param move {@link Move} used to apply status effect and confusion * @param hitResult N/A * @param args [0] {@linkcode StatusEffect} applied by move - * @returns true if defender is confused */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { - if (simulated) { - return defender.canAddTag(BattlerTagType.CONFUSED); - } else { - return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); - } + override applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + if (!simulated) { + defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); } - return false; } } export class PreSetStatusAbAttr extends AbAttr { + canApplyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; + } + applyPreSetStatus( pokemon: Pokemon, passive: boolean, @@ -3130,9 +3162,7 @@ export class PreSetStatusAbAttr extends AbAttr { effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -3150,6 +3180,10 @@ export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { this.immuneEffects = immuneEffects; } + override canApplyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return effect !== StatusEffect.FAINT && this.immuneEffects.length < 1 || this.immuneEffects.includes(effect); + } + /** * Applies immunity to supplied status effects. * @@ -3158,15 +3192,9 @@ export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { * @param effect - The status effect being applied. * @param cancelled - A holder for a boolean value indicating if the status application was cancelled. * @param args - n/a - * @returns A boolean indicating the result of the status application. */ - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (effect !== StatusEffect.FAINT && this.immuneEffects.length < 1 || this.immuneEffects.includes(effect)) { - cancelled.value = true; - return true; - } - - return false; + override applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -3196,7 +3224,7 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag( + canApplyPreApplyBattlerTag( pokemon: Pokemon, passive: boolean, simulated: boolean, @@ -3204,8 +3232,17 @@ export class PreApplyBattlerTagAbAttr extends AbAttr { cancelled: Utils.BooleanHolder, args: any[], ): boolean { - return false; + return true; } + + applyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): void {} } /** @@ -3216,21 +3253,19 @@ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { private battlerTag: BattlerTag; constructor(immuneTagTypes: BattlerTagType | BattlerTagType[]) { - super(); + super(true); this.immuneTagTypes = Array.isArray(immuneTagTypes) ? immuneTagTypes : [ immuneTagTypes ]; } - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.immuneTagTypes.includes(tag.tagType)) { - cancelled.value = true; - if (!simulated) { - this.battlerTag = tag; - } - return true; - } + override canApplyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { + this.battlerTag = tag; - return false; + return this.immuneTagTypes.includes(tag.tagType); + } + + override applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -3255,16 +3290,21 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { export class UserFieldBattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } export class BlockCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } export class BonusCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } @@ -3272,19 +3312,19 @@ export class MultCritAbAttr extends AbAttr { public multAmount: number; constructor(multAmount: number) { - super(true); + super(false); this.multAmount = multAmount; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const critMult = args[0] as Utils.NumberHolder; - if (critMult.value > 1) { - critMult.value *= this.multAmount; - return true; - } + return critMult.value > 1; + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + const critMult = args[0] as Utils.NumberHolder; + critMult.value *= this.multAmount; } } @@ -3297,33 +3337,35 @@ export class ConditionalCritAbAttr extends AbAttr { private condition: PokemonAttackCondition; constructor(condition: PokemonAttackCondition, checkUser?: boolean) { - super(); + super(false); this.condition = condition; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const target = (args[1] as Pokemon); + const move = (args[2] as Move); + return this.condition(pokemon, target, move); + } + /** * @param pokemon {@linkcode Pokemon} user. * @param args [0] {@linkcode Utils.BooleanHolder} If true critical hit is guaranteed. * [1] {@linkcode Pokemon} Target. * [2] {@linkcode Move} used by ability user. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const target = (args[1] as Pokemon); - const move = (args[2] as Move); - if (!this.condition(pokemon, target, move)) { - return false; - } - + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } export class BlockNonDirectDamageAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -3342,26 +3384,27 @@ export class BlockStatusDamageAbAttr extends AbAttr { this.effects = effects; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (pokemon.status && this.effects.includes(pokemon.status.effect)) { + return true; + } + return false; + } + /** * @param {Pokemon} pokemon The pokemon with the ability * @param {boolean} passive N/A * @param {Utils.BooleanHolder} cancelled Whether to cancel the status damage * @param {any[]} args N/A - * @returns Returns true if status damage is blocked */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - cancelled.value = true; - return true; - } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } export class BlockOneHitKOAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -3379,25 +3422,34 @@ export class ChangeMovePriorityAbAttr extends AbAttr { * @param {number} changeAmount the amount of priority added or subtracted */ constructor(moveFunc: (pokemon: Pokemon, move: Move) => boolean, changeAmount: number) { - super(true); + super(false); this.moveFunc = moveFunc; this.changeAmount = changeAmount; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.moveFunc(pokemon, args[0] as Move)) { - return false; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.moveFunc(pokemon, args[0] as Move); + } + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[1] as Utils.NumberHolder).value += this.changeAmount; - return true; } } export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { + canApplyPreWeatherEffect( + pokemon: Pokemon, + passive: Boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; + } + applyPreWeatherEffect( pokemon: Pokemon, passive: boolean, @@ -3405,9 +3457,7 @@ export class PreWeatherEffectAbAttr extends AbAttr { weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[], - ): boolean { - return false; - } + ): void {} } export class PreWeatherDamageAbAttr extends PreWeatherEffectAbAttr { } @@ -3416,17 +3466,17 @@ export class BlockWeatherDamageAttr extends PreWeatherDamageAbAttr { private weatherTypes: WeatherType[]; constructor(...weatherTypes: WeatherType[]) { - super(); + super(false); this.weatherTypes = weatherTypes; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1) { - cancelled.value = true; - } + override canApplyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return !this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1; + } - return true; + override applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -3434,18 +3484,17 @@ export class SuppressWeatherEffectAbAttr extends PreWeatherEffectAbAttr { public affectsImmutable: boolean; constructor(affectsImmutable?: boolean) { - super(); + super(true); this.affectsImmutable = !!affectsImmutable; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.affectsImmutable || weather.isImmutable()) { - cancelled.value = true; - return true; - } + override canApplyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return this.affectsImmutable || weather.isImmutable(); + } - return false; + override applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -3550,7 +3599,7 @@ export class ForewarnAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { let maxPowerSeen = 0; let maxMove = ""; let movePower = 0; @@ -3577,7 +3626,6 @@ export class ForewarnAbAttr extends PostSummonAbAttr { if (!simulated) { globalScene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); } - return true; } } @@ -3586,21 +3634,22 @@ export class FriskAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { for (const opponent of pokemon.getOpponents()) { globalScene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); setAbilityRevealed(opponent); } } - return true; } } export class PostWeatherChangeAbAttr extends AbAttr { - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - return false; + canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + return true; } + + applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void {} } /** @@ -3619,6 +3668,13 @@ export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr { this.formRevertingWeathers = formRevertingWeathers; } + override canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); + const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); + + return isCastformWithForecast || isCherrimWithFlowerGift; + } + /** * Calls {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} when the * weather changed to form-reverting weather, otherwise calls {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges} @@ -3626,27 +3682,19 @@ export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr { * @param passive n/a * @param weather n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); - const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); - - if (isCastformWithForecast || isCherrimWithFlowerGift) { - if (simulated) { - return simulated; - } - - const weatherType = globalScene.arena.weather?.weatherType; - - if (weatherType && this.formRevertingWeathers.includes(weatherType)) { - globalScene.arena.triggerWeatherBasedFormChangesToNormal(); - } else { - globalScene.arena.triggerWeatherBasedFormChanges(); - } - return true; + override applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void { + if (simulated) { + return; + } + + const weatherType = globalScene.arena.weather?.weatherType; + + if (weatherType && this.formRevertingWeathers.includes(weatherType)) { + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); + } else { + globalScene.arena.triggerWeatherBasedFormChanges(); } - return false; } } @@ -3663,16 +3711,13 @@ export class PostWeatherChangeAddBattlerTagAttr extends PostWeatherChangeAbAttr this.weatherTypes = weatherTypes; } - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - console.log(this.weatherTypes.find(w => weather === w), WeatherType[weather]); - if (!this.weatherTypes.find(w => weather === w)) { - return false; - } + override canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + return !!this.weatherTypes.find(w => weather === w) && pokemon.canAddTag(this.tagType); + } - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } @@ -3686,15 +3731,22 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } + canApplyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[]): boolean { + return true; + } + applyPostWeatherLapse( pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[], - ): boolean { - return false; - } + ): void {} getCondition(): AbAttrCondition { return getWeatherCondition(...this.weatherTypes); @@ -3710,17 +3762,16 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { this.healFactor = healFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { - if (!pokemon.isFullHp()) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - if (!simulated) { - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.healFactor)), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } - return true; - } + override canApplyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return false; + override applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): void { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + if (!simulated) { + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.healFactor)), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + } } } @@ -3733,25 +3784,25 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { this.damageFactor = damageFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - return false; - } + override canApplyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean { + return !pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr); + } + override applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): void { if (!simulated) { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; globalScene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); } - - return true; } } export class PostTerrainChangeAbAttr extends AbAttr { - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { - return false; + canApplyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { + return true; } + + applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): void {} } export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr { @@ -3767,15 +3818,13 @@ export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr this.terrainTypes = terrainTypes; } - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { - if (!this.terrainTypes.find(t => t === terrain)) { - return false; - } + override canApplyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { + return !!this.terrainTypes.find(t => t === terrain) && pokemon.canAddTag(this.tagType); + } - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } @@ -3788,9 +3837,11 @@ function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } /** @@ -3808,24 +3859,21 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { this.effects = effects; } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return (pokemon.status !== null) && this.effects.includes(pokemon.status.effect) && !pokemon.isFullHp(); + } + /** * @param {Pokemon} pokemon The pokemon with the ability that will receive the healing * @param {Boolean} passive N/A * @param {any[]} args N/A - * @returns Returns true if healed from status, false if not */ - override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - if (!pokemon.isFullHp()) { - if (!simulated) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 8), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } - return true; - } + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 8), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); } - return false; } } @@ -3842,23 +3890,21 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { this.allyTarget = allyTarget; } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (this.allyTarget) { this.target = pokemon.getAlly(); } else { this.target = pokemon; } - if (this.target?.status) { - if (!simulated) { - globalScene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); - this.target.resetStatus(false); - this.target.updateInfo(); - } + return !Utils.isNullOrUndefined(this.target.status); + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated && this.target.status) { + globalScene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); + this.target.resetStatus(false); + this.target.updateInfo(); } - - return false; } } @@ -3879,18 +3925,14 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { super(); } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const pass = Phaser.Math.RND.realInRange(0, 1); + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { // Clamp procChance to [0, 1]. Skip if didn't proc (less than pass) - if (Math.max(Math.min(this.procChance(pokemon), 1), 0) < pass) { - return false; - } + const pass = Phaser.Math.RND.realInRange(0, 1); + return !(Math.max(Math.min(this.procChance(pokemon), 1), 0) < pass) && this.itemType === "EATEN_BERRIES" && !!pokemon.battleData.berriesEaten; + } - if (this.itemType === "EATEN_BERRIES") { - return this.createEatenBerry(pokemon, simulated); - } else { - return false; - } + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + this.createEatenBerry(pokemon, simulated); } /** @@ -3951,13 +3993,12 @@ export class MoodyAbAttr extends PostTurnAbAttr { * @param passive N/A * @param simulated true if applying in a simulated call. * @param args N/A - * @returns true * * Any stat stages at +6 or -6 are excluded from being increased or decreased, respectively * If the pokemon already has all stat stages raised to 6, it will only decrease one stat stage by 1 * If the pokemon already has all stat stages lowered to -6, it will only increase one stat stage by 2 */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const canRaise = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) < 6); let canLower = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) > -6); @@ -3972,8 +4013,6 @@ export class MoodyAbAttr extends PostTurnAbAttr { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ loweredStat ], -1)); } } - - return true; } } @@ -3983,31 +4022,26 @@ export class SpeedBoostAbAttr extends PostTurnAbAttr { super(true); } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated) { - if (!pokemon.turnData.switchedInThisTurn && !pokemon.turnData.failedRunAway) { - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPD ], 1)); - } else { - return false; - } - } - return true; + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return simulated || (!pokemon.turnData.switchedInThisTurn && !pokemon.turnData.failedRunAway); + } + + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPD ], 1)); } } export class PostTurnHealAbAttr extends PostTurnAbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!pokemon.isFullHp()) { - if (!simulated) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 16), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 16), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); } - - return false; } } @@ -4020,17 +4054,14 @@ export class PostTurnFormChangeAbAttr extends PostTurnAbAttr { this.formFunc = formFunc; } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); - } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } - - return false; } } @@ -4039,28 +4070,25 @@ export class PostTurnFormChangeAbAttr extends PostTurnAbAttr { * Attribute used for abilities (Bad Dreams) that damages the opponents for being asleep */ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { - + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getOpponents().some(opp => (opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus); + } /** * Deals damage to all sleeping opponents equal to 1/8 of their max hp (min 1) * @param pokemon Pokemon that has this ability * @param passive N/A * @param simulated `true` if applying in a simulated call. * @param args N/A - * @returns `true` if any opponents are sleeping */ - override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - let hadEffect = false; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { if (!simulated) { opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER); globalScene.queueMessage(i18next.t("abilityTriggers:badDreams", { pokemonName: getPokemonNameWithAffix(opp) })); } - hadEffect = true; } - } - return hadEffect; } } @@ -4073,25 +4101,22 @@ export class FetchBallAbAttr extends PostTurnAbAttr { constructor() { super(); } + + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !simulated && globalScene.currentBattle.lastUsedPokeball !== null && !!pokemon.isPlayer; + } + /** * Adds the last used Pokeball back into the player's inventory * @param pokemon {@linkcode Pokemon} with this ability * @param passive N/A * @param args N/A - * @returns true if player has used a pokeball and this pokemon is owned by the player */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return false; - } + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const lastUsed = globalScene.currentBattle.lastUsedPokeball; - if (lastUsed !== null && !!pokemon.isPlayer) { - globalScene.pokeballCounts[lastUsed]++; - globalScene.currentBattle.lastUsedPokeball = null; - globalScene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed) })); - return true; - } - return false; + globalScene.pokeballCounts[lastUsed!]++; + globalScene.currentBattle.lastUsedPokeball = null; + globalScene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed!) })); } } @@ -4106,16 +4131,14 @@ export class PostBiomeChangeWeatherChangeAbAttr extends PostBiomeChangeAbAttr { this.weatherType = weatherType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!globalScene.arena.weather?.isImmutable()) { - if (simulated) { - return globalScene.arena.weather?.weatherType !== this.weatherType; - } else { - return globalScene.arena.trySetWeather(this.weatherType, true); - } - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return ((globalScene.arena.weather?.isImmutable() ?? false) && globalScene.arena.canSetWeather(this.weatherType)); + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -4128,11 +4151,13 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { this.terrainType = terrainType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (simulated) { - return globalScene.arena.terrain?.terrainType !== this.terrainType; - } else { - return globalScene.arena.trySetTerrain(this.terrainType, true); + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(this.terrainType); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); } } } @@ -4142,6 +4167,16 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { + canApplyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[]): boolean { + return true; + } + applyPostMoveUsed( pokemon: Pokemon, move: PokemonMove, @@ -4149,9 +4184,7 @@ export class PostMoveUsedAbAttr extends AbAttr { targets: BattlerIndex[], simulated: boolean, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -4159,6 +4192,15 @@ export class PostMoveUsedAbAttr extends AbAttr { * @extends PostMoveUsedAbAttr */ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { + override canApplyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean { + // List of tags that prevent the Dancer from replicating the move + const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, + BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; + // The move to replicate cannot come from the Dancer + return source.getBattlerIndex() !== dancer.getBattlerIndex() + && !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType)); + } + /** * Resolves the Dancer ability by replicating the move used by the source of the dance * either on the source itself or on the target of the dance @@ -4167,8 +4209,6 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @param source {@linkcode Pokemon} that used the dancing move * @param targets {@linkcode BattlerIndex}Targets of the dancing move * @param args N/A - * - * @return true if the Dancer ability was resolved */ override applyPostMoveUsed( dancer: Pokemon, @@ -4176,27 +4216,17 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { source: Pokemon, targets: BattlerIndex[], simulated: boolean, - args: any[], - ): boolean { - // List of tags that prevent the Dancer from replicating the move - const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, - BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; - // The move to replicate cannot come from the Dancer - if (source.getBattlerIndex() !== dancer.getBattlerIndex() - && !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) { - if (!simulated) { - // If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance - if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) { - const target = this.getTarget(dancer, source, targets); - globalScene.unshiftPhase(new MovePhase(dancer, target, move, true, true)); - } else if (move.getMove() instanceof SelfStatusMove) { - // If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself - globalScene.unshiftPhase(new MovePhase(dancer, [ dancer.getBattlerIndex() ], move, true, true)); - } + args: any[]): void { + if (!simulated) { + // If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance + if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) { + const target = this.getTarget(dancer, source, targets); + globalScene.unshiftPhase(new MovePhase(dancer, target, move, true, true)); + } else if (move.getMove() instanceof SelfStatusMove) { + // If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself + globalScene.unshiftPhase(new MovePhase(dancer, [ dancer.getBattlerIndex() ], move, true, true)); } - return true; } - return false; } /** @@ -4219,9 +4249,11 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @extends AbAttr */ export class PostItemLostAbAttr extends AbAttr { - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): void {} } /** @@ -4231,21 +4263,21 @@ export class PostItemLostAbAttr extends AbAttr { export class PostItemLostApplyBattlerTagAbAttr extends PostItemLostAbAttr { private tagType: BattlerTagType; constructor(tagType: BattlerTagType) { - super(true); + super(false); this.tagType = tagType; } + + override canApplyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { + return !pokemon.getTag(this.tagType) && !simulated; + } + /** * Adds the last used Pokeball back into the player's inventory * @param pokemon {@linkcode Pokemon} with this ability * @param args N/A - * @returns true if BattlerTag was applied */ - override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { - if (!pokemon.getTag(this.tagType) && !simulated) { - pokemon.addTag(this.tagType); - return true; - } - return false; + override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): void { + pokemon.addTag(this.tagType); } } @@ -4253,15 +4285,13 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { private multiplier: number; constructor(multiplier: number) { - super(true); + super(false); this.multiplier = multiplier; } - override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= this.multiplier; - - return true; } } @@ -4272,11 +4302,10 @@ export class StatStageChangeCopyAbAttr extends AbAttr { simulated: boolean, cancelled: Utils.BooleanHolder, args: any[], - ): boolean { + ): void { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); } - return true; } } @@ -4285,10 +4314,8 @@ export class BypassBurnDamageReductionAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } } @@ -4307,28 +4334,21 @@ export class ReduceBurnDamageAbAttr extends AbAttr { * @param passive N/A * @param cancelled N/A * @param args `[0]` {@linkcode Utils.NumberHolder} The damage value being modified - * @returns `true` */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.multiplier); - - return true; } } export class DoubleBerryEffectAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= 2; - - return true; } } export class PreventBerryUseAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } } @@ -4348,7 +4368,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { this.healPercent = Math.max(Math.min(healPercent, 1), 0); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, ...args: [Utils.BooleanHolder, any[]]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, ...args: [Utils.BooleanHolder, any[]]): void { const { name: abilityName } = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (!simulated) { globalScene.unshiftPhase( @@ -4360,15 +4380,12 @@ export class HealFromBerryUseAbAttr extends AbAttr { ) ); } - return true; } } export class RunSuccessAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value = 256; - - return true; } } @@ -4388,6 +4405,16 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } + canApplyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[]): boolean { + return true; + } + applyCheckTrapped( pokemon: Pokemon, passive: boolean, @@ -4395,9 +4422,7 @@ export class CheckTrappedAbAttr extends AbAttr { trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[], - ): boolean { - return false; - } + ): void {} } /** @@ -4407,6 +4432,12 @@ export class CheckTrappedAbAttr extends AbAttr { * @see {@linkcode applyCheckTrapped} */ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { + override canApplyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { + return this.arenaTrapCondition(pokemon, otherPokemon) + && !(otherPokemon.getTypes(true).includes(PokemonType.GHOST) || (otherPokemon.getTypes(true).includes(PokemonType.STELLAR) && otherPokemon.getTypes().includes(PokemonType.GHOST))) + && !otherPokemon.hasAbility(Abilities.RUN_AWAY); + } + /** * Checks if enemy Pokemon is trapped by an Arena Trap-esque ability * If the enemy is a Ghost type, it is not trapped @@ -4418,22 +4449,9 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { * @param trapped {@link Utils.BooleanHolder} indicating whether the other Pokemon is trapped or not * @param otherPokemon The {@link Pokemon} that is affected by an Arena Trap ability * @param args N/A - * @returns if enemy Pokemon is trapped or not */ - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { - if (this.arenaTrapCondition(pokemon, otherPokemon)) { - if (otherPokemon.getTypes(true).includes(PokemonType.GHOST) || (otherPokemon.getTypes(true).includes(PokemonType.STELLAR) && otherPokemon.getTypes().includes(PokemonType.GHOST))) { - trapped.value = false; - return false; - } else if (otherPokemon.hasAbility(Abilities.RUN_AWAY)) { - trapped.value = false; - return false; - } - trapped.value = true; - return true; - } - trapped.value = false; - return false; + override applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): void { + trapped.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4442,10 +4460,12 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } export class MaxMultiHitAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.NumberHolder).value = 0; + constructor() { + super(false); + } - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = 0; } } @@ -4454,36 +4474,48 @@ export class PostBattleAbAttr extends AbAttr { super(true); } - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } export class PostBattleLootAbAttr extends PostBattleAbAttr { - /** - * @param args - `[0]`: boolean for if the battle ended in a victory - * @returns `true` if successful - */ - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + private randItem?: PokemonHeldItemModifier; + + override canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const postBattleLoot = globalScene.currentBattle.postBattleLoot; if (!simulated && postBattleLoot.length && args[0]) { - const randItem = Utils.randSeedItem(postBattleLoot); - //@ts-ignore - TODO see below - if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { - postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); - globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); - return true; - } + this.randItem = Utils.randSeedItem(postBattleLoot); + return globalScene.canTransferHeldItemModifier(this.randItem, pokemon, 1); + } + return false; + } + + /** + * @param args - `[0]`: boolean for if the battle ended in a victory + */ + override applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const postBattleLoot = globalScene.currentBattle.postBattleLoot; + if (!this.randItem) { + this.randItem = Utils.randSeedItem(postBattleLoot); } - return false; + if (globalScene.tryTransferHeldItemModifier(this.randItem, pokemon, true, 1, true, undefined, false)) { + postBattleLoot.splice(postBattleLoot.indexOf(this.randItem), 1); + globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: this.randItem.type.name })); + } + this.randItem = undefined; } } export class PostFaintAbAttr extends AbAttr { - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { - return false; + canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + return true; } + + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void {} } /** @@ -4492,6 +4524,10 @@ export class PostFaintAbAttr extends AbAttr { * @extends PostFaintAbAttr */ export class PostFaintUnsuppressedWeatherFormChangeAbAttr extends PostFaintAbAttr { + override canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + return getPokemonWithWeatherBasedForms().length > 0; + } + /** * Triggers {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges} * when the user of the ability faints @@ -4501,20 +4537,11 @@ export class PostFaintUnsuppressedWeatherFormChangeAbAttr extends PostFaintAbAtt * @param move n/a * @param hitResult n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - const pokemonToTransform = getPokemonWithWeatherBasedForms(); - - if (pokemonToTransform.length < 1) { - return false; - } - + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { if (!simulated) { globalScene.arena.triggerWeatherBasedFormChanges(); } - - return true; } } @@ -4522,26 +4549,27 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { private damageRatio: number; constructor(damageRatio: number) { - super(); + super(true); this.damageRatio = damageRatio; } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { - if (move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { //If the mon didn't die to indirect damage - const cancelled = new Utils.BooleanHolder(false); - globalScene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); - if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - return false; - } - if (!simulated) { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); - } - return true; + override canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + const diedToDirectDamage = move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon); + const cancelled = new Utils.BooleanHolder(false); + globalScene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); + if (!diedToDirectDamage || cancelled.value || attacker!.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + return false; } - return false; + return true; + } + + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { + if (!simulated) { + attacker!.damageAndUpdate(Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker!.turnData.damageTaken += Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)); + } } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4557,13 +4585,12 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { super (); } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage const damage = pokemon.turnData.attacksReceived[0].damage; attacker.damageAndUpdate((damage), HitResult.OTHER); attacker.turnData.damageTaken += damage; } - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4582,17 +4609,20 @@ export class RedirectMoveAbAttr extends AbAttr { * - `[1]` - The target's battler index (before redirection) * - `[2]` - The Pokemon that used the move being redirected */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.canRedirect(args[0] as Moves, args[2] as Pokemon)) { - const target = args[1] as Utils.NumberHolder; - const newTarget = pokemon.getBattlerIndex(); - if (target.value !== newTarget) { - target.value = newTarget; - return true; - } - } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!this.canRedirect(args[0] as Moves, args[2] as Pokemon)) { + return false; + } + const target = args[1] as Utils.NumberHolder; + const newTarget = pokemon.getBattlerIndex(); + return target.value !== newTarget; + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + const target = args[1] as Utils.NumberHolder; + const newTarget = pokemon.getBattlerIndex(); + target.value = newTarget; } canRedirect(moveId: Moves, user: Pokemon): boolean { @@ -4625,28 +4655,23 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { private statusEffect: StatusEffect; constructor(statusEffect: StatusEffect) { - super(true); + super(false); this.statusEffect = statusEffect; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return args[1] instanceof Utils.NumberHolder && args[0] === this.statusEffect; + } + /** * Reduces the number of sleep turns remaining by an extra 1 when applied * @param args - The args passed to the `AbAttr`: * - `[0]` - The {@linkcode StatusEffect} of the Pokemon * - `[1]` - The number of turns remaining until the status is healed - * @returns `true` if the ability was applied */ - apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!(args[1] instanceof Utils.NumberHolder)) { - return false; - } - if (args[0] === this.statusEffect) { - args[1].value -= 1; - return true; - } - - return false; + override apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { + args[1].value -= 1; } } @@ -4669,20 +4694,18 @@ export class FlinchStatStageChangeAbAttr extends FlinchEffectAbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); } - return true; } } export class IncreasePpAbAttr extends AbAttr { } export class ForceSwitchOutImmunityAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -4691,15 +4714,13 @@ export class ReduceBerryUseThresholdAbAttr extends AbAttr { super(); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const hpRatio = pokemon.getHpRatio(); + return args[0].value < hpRatio; + } - if (args[0].value < hpRatio) { - args[0].value *= 2; - return args[0].value >= hpRatio; - } - - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + args[0].value *= 2; } } @@ -4711,15 +4732,13 @@ export class WeightMultiplierAbAttr extends AbAttr { private multiplier: number; constructor(multiplier: number) { - super(); + super(false); this.multiplier = multiplier; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= this.multiplier; - - return true; } } @@ -4728,10 +4747,8 @@ export class SyncEncounterNatureAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Pokemon).setNature(pokemon.getNature()); - - return true; } } @@ -4744,12 +4761,12 @@ export class MoveAbilityBypassAbAttr extends AbAttr { this.moveIgnoreFunc = moveIgnoreFunc || ((pokemon, move) => true); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.moveIgnoreFunc(pokemon, (args[0] as Move))) { - cancelled.value = true; - return true; - } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.moveIgnoreFunc(pokemon, (args[0] as Move)); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4763,6 +4780,14 @@ export class IgnoreProtectOnContactAbAttr extends AbAttr { } * Allows the source's moves to bypass the effects of opposing Light Screen, Reflect, Aurora Veil, Safeguard, Mist, and Substitute. */ export class InfiltratorAbAttr extends AbAttr { + constructor() { + super(false); + } + + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return args[0] instanceof Utils.BooleanHolder; + } + /** * Sets a flag to bypass screens, Substitute, Safeguard, and Mist * @param pokemon n/a @@ -4770,15 +4795,10 @@ export class InfiltratorAbAttr extends AbAttr { * @param simulated n/a * @param cancelled n/a * @param args `[0]` a {@linkcode Utils.BooleanHolder | BooleanHolder} containing the flag - * @returns `true` if the bypass flag was successfully set; `false` otherwise. */ - override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): void { const bypassed = args[0]; - if (args[0] instanceof Utils.BooleanHolder) { - bypassed.value = true; - return true; - } - return false; + bypassed.value = true; } } @@ -4824,17 +4844,17 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr { private allowedMoveTypes: PokemonType[]; constructor(defenderType: PokemonType, allowedMoveTypes: PokemonType[]) { - super(true); + super(false); this.defenderType = defenderType; this.allowedMoveTypes = allowedMoveTypes; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.defenderType === (args[1] as PokemonType) && this.allowedMoveTypes.includes(args[0] as PokemonType)) { - cancelled.value = true; - return true; - } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.defenderType === (args[1] as PokemonType) && this.allowedMoveTypes.includes(args[0] as PokemonType); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4846,19 +4866,18 @@ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { private defenderType: PokemonType[]; constructor(statusEffect: StatusEffect[], defenderType: PokemonType[]) { - super(true); + super(false); this.statusEffect = statusEffect; this.defenderType = defenderType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as PokemonType)) { - cancelled.value = true; - return true; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as PokemonType); + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4873,18 +4892,17 @@ export class MoneyAbAttr extends PostBattleAbAttr { super(); } + override canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !simulated && args[0]; + } + /** * @param pokemon {@linkcode Pokemon} that is the user of this ability. * @param passive N/A * @param args - `[0]`: boolean for if the battle ended in a victory - * @returns `true` if successful */ - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated && args[0]) { - globalScene.currentBattle.moneyScattered += globalScene.getWaveMoneyAmount(0.2); - return true; - } - return false; + override applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.currentBattle.moneyScattered += globalScene.getWaveMoneyAmount(0.2); } } @@ -4912,6 +4930,12 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC this.tagType = tagType; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const side = pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + return (globalScene.arena.getTagOnSide(this.tagType, side) ?? false) + && super.canApplyPostSummon(pokemon, passive, simulated, args); + } + /** * Applies the post-summon stat change if the specified arena tag is present on pokemon's side. * This is used in Wind Rider ability. @@ -4919,15 +4943,9 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC * @param {Pokemon} pokemon - The Pokémon being summoned. * @param {boolean} passive - Whether the effect is passive. * @param {any[]} args - Additional arguments. - * @returns {boolean} - Returns true if the stat change was applied, otherwise false. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const side = pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - - if (globalScene.arena.getTagOnSide(this.tagType, side)) { - return super.applyPostSummon(pokemon, passive, simulated, args); - } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + super.applyPostSummon(pokemon, passive, simulated, args); } } @@ -4951,6 +4969,10 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { this.triggerMessageFunc = triggerMessageFunc; } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } + /** * Applies the pre-defense ability to the Pokémon. * Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form. @@ -4961,21 +4983,15 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { * @param move The move being used. * @param _cancelled n/a * @param args Additional arguments. - * @returns `true` if the immunity was applied. */ - override applyPreDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - (args[0] as Utils.NumberHolder).value = this.multiplier; - pokemon.removeTag(this.tagType); - if (this.recoilDamageFunc) { - pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); - } + override applyPreDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + (args[0] as Utils.NumberHolder).value = this.multiplier; + pokemon.removeTag(this.tagType); + if (this.recoilDamageFunc) { + pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); } - return true; } - - return false; } /** @@ -5006,34 +5022,25 @@ export class BypassSpeedChanceAbAttr extends AbAttr { this.chance = chance; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; + const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; + return !simulated && !bypassSpeed.value && pokemon.randSeedInt(100) < this.chance && isCommandFight && isDamageMove; + } + /** * bypass move order in their priority bracket when pokemon choose damaging move * @param {Pokemon} pokemon {@linkcode Pokemon} the Pokemon applying this ability * @param {boolean} passive N/A * @param {Utils.BooleanHolder} cancelled N/A * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated - * @returns {boolean} - whether the ability was activated. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (simulated) { - return false; - } + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { const bypassSpeed = args[0] as Utils.BooleanHolder; - - if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { - const turnCommand = - globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; - const isCommandFight = turnCommand?.command === Command.FIGHT; - const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; - - if (isCommandFight && isDamageMove) { - bypassSpeed.value = true; - return true; - } - } - - return false; + bypassSpeed.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -5056,23 +5063,22 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr { this.condition = condition; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; + return isCommandFight && this.condition(pokemon, move!); + } + /** * @argument {boolean} bypassSpeed - determines if a Pokemon is able to bypass speed at the moment * @argument {boolean} canCheckHeldItems - determines if a Pokemon has access to Quick Claw's effects or not */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { const bypassSpeed = args[0] as Utils.BooleanHolder; const canCheckHeldItems = args[1] as Utils.BooleanHolder; - - const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; - const isCommandFight = turnCommand?.command === Command.FIGHT; - const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - if (isCommandFight && this.condition(pokemon, move!)) { - bypassSpeed.value = false; - canCheckHeldItems.value = false; - return false; - } - return true; + bypassSpeed.value = false; + canCheckHeldItems.value = false; } } @@ -5085,10 +5091,11 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { super(true); } - override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): boolean { - if (pokemon.isTerastallized) { - return false; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isTerastallized; + } + + override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): void { const currentTerrain = globalScene.arena.getTerrainType(); const typeChange: PokemonType[] = this.determineTypeChange(pokemon, currentTerrain); if (typeChange.length !== 0) { @@ -5098,7 +5105,6 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { pokemon.summonData.types = typeChange; pokemon.updateInfo(); } - return true; } /** @@ -5131,15 +5137,16 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { return typeChange; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.getTerrainType() !== TerrainType.NONE && + this.canApply(pokemon, passive, simulated, args); + } + /** * Checks if the Pokemon should change types if summoned into an active terrain - * @returns `true` if there is an active terrain requiring a type change | `false` if not */ - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (globalScene.arena.getTerrainType() !== TerrainType.NONE) { - return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); - } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { @@ -5159,10 +5166,10 @@ function applySingleAbAttrs( passive: boolean, attrType: Constructor, applyFunc: AbAttrApplyFunc, + successFunc: AbAttrSuccessFunc, args: any[], - gainedMidTurn = false, - simulated = false, - showAbilityInstant = false, + gainedMidTurn: boolean = false, + simulated: boolean = false, messages: string[] = [] ) { if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { @@ -5176,33 +5183,39 @@ function applySingleAbAttrs( for (const attr of ability.getAttrs(attrType)) { const condition = attr.getCondition(); - if (condition && !condition(pokemon)) { + let abShown = false; + if (condition && !condition(pokemon) || !successFunc(attr, passive)) { continue; } globalScene.setPhaseQueueSplice(); - if (applyFunc(attr, passive)) { - if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { - pokemon.summonData.abilitiesApplied.push(ability.id); - } - if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { - pokemon.battleData.abilitiesApplied.push(ability.id); - } - if (attr.showAbility && !simulated) { - if (showAbilityInstant) { - globalScene.abilityBar.showAbility(pokemon, passive); - } else { - queueShowAbility(pokemon, passive); - } - } - const message = attr.getTriggerMessage(pokemon, ability.name, args); - if (message) { - if (!simulated) { - globalScene.queueMessage(message); - } - } - messages.push(message!); + + if (attr.showAbility && !simulated) { + globalScene.queueAbilityDisplay(pokemon, passive, true); + abShown = true; } + const message = attr.getTriggerMessage(pokemon, ability.name, args); + if (message) { + if (!simulated) { + globalScene.queueMessage(message); + } + messages.push(message); + } + + applyFunc(attr, passive); + + if (abShown) { + globalScene.queueAbilityDisplay(pokemon, passive, false); + } + + if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { + pokemon.summonData.abilitiesApplied.push(ability.id); + } + if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { + pokemon.battleData.abilitiesApplied.push(ability.id); + } + + globalScene.clearPhaseQueueSplice(); } } @@ -5346,6 +5359,16 @@ function calculateShellBellRecovery(pokemon: Pokemon): number { * @extends AbAttr */ export class PostDamageAbAttr extends AbAttr { + public canApplyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon): boolean { + return true; + } + public applyPostDamage( pokemon: Pokemon, damage: number, @@ -5353,9 +5376,7 @@ export class PostDamageAbAttr extends AbAttr { simulated: boolean, args: any[], source?: Pokemon, - ): boolean { - return false; - } + ): void {} } /** @@ -5377,27 +5398,13 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { this.hpRatio = hpRatio; } - /** - * Applies the switch-out logic after the Pokémon takes damage. - * Checks various conditions based on the moves used by the Pokémon, the opponents' moves, and - * the Pokémon's health after damage to determine whether the switch-out should occur. - * - * @param pokemon The Pokémon that took damage. - * @param damage The amount of damage taken by the Pokémon. - * @param passive N/A - * @param simulated Whether the ability is being simulated. - * @param args N/A - * @param source The Pokemon that dealt damage - * @returns `true` if the switch-out logic was successfully applied - */ - public override applyPostDamage( + public override canApplyPostDamage( pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], - source?: Pokemon, - ): boolean { + source?: Pokemon): boolean { const moveHistory = pokemon.getMoveHistory(); // Will not activate when the Pokémon's HP is lowered by cutting its own HP const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; @@ -5431,7 +5438,6 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { } if (pokemon.hp + damage >= pokemon.getMaxHp() * this.hpRatio) { - // Activates if it falls below half and recovers back above half from a Shell Bell const shellBellHeal = calculateShellBellRecovery(pokemon); if (pokemon.hp - shellBellHeal < pokemon.getMaxHp() * this.hpRatio) { for (const opponent of pokemon.getOpponents()) { @@ -5439,31 +5445,42 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { return false; } } - return this.helper.switchOutLogic(pokemon); - } else { - return false; + return true; } - } else { - return false; } + + return false; } - public getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - return this.helper.getFailedText(target); + + /** + * Applies the switch-out logic after the Pokémon takes damage. + * Checks various conditions based on the moves used by the Pokémon, the opponents' moves, and + * the Pokémon's health after damage to determine whether the switch-out should occur. + * + * @param pokemon The Pokémon that took damage. + * @param damage N/A + * @param passive N/A + * @param simulated Whether the ability is being simulated. + * @param args N/A + * @param source N/A + */ + public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): void { + this.helper.switchOutLogic(pokemon); } } function applyAbAttrsInternal( attrType: Constructor, pokemon: Pokemon | null, applyFunc: AbAttrApplyFunc, + successFunc: AbAttrSuccessFunc, args: any[], - showAbilityInstant = false, - simulated = false, + simulated: boolean = false, messages: string[] = [], gainedMidTurn = false ) { for (const passive of [ false, true ]) { if (pokemon) { - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, successFunc, args, gainedMidTurn, simulated, messages); globalScene.clearPhaseQueueSplice(); } } @@ -5480,8 +5497,8 @@ export function applyAbAttrs( attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), + (attr, passive) => attr.canApply(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5496,8 +5513,8 @@ export function applyPostBattleInitAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostBattleInit(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5515,8 +5532,8 @@ export function applyPreDefendAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + (attr, passive) => attr.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, - false, simulated, ); } @@ -5534,8 +5551,7 @@ export function applyPostDefendAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), - args, - false, + (attr, passive) => attr.canApplyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, simulated, ); } @@ -5553,8 +5569,8 @@ export function applyPostMoveUsedAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), + (attr, passive) => attr.canApplyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, - false, simulated, ); } @@ -5571,6 +5587,7 @@ export function applyStatMultiplierAbAttrs( attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), + (attr, passive) => attr.canApplyStatStage(pokemon, passive, simulated, stat, statValue, args), args, ); } @@ -5586,8 +5603,7 @@ export function applyPostSetStatusAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), - args, - false, + (attr, passive) => attr.canApplyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, simulated, ); } @@ -5605,6 +5621,7 @@ export function applyPostDamageAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), + (attr, passive) => attr.canApplyPostDamage(pokemon, damage, passive, simulated, args, source), args, ); } @@ -5632,9 +5649,8 @@ export function applyFieldStatMultiplierAbAttrs( applyAbAttrsInternal( attrType, pokemon, - (attr, passive) => - attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), - args, + (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), + (attr, passive) => attr.canApplyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args, ); } @@ -5650,8 +5666,8 @@ export function applyPreAttackAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), + (attr, passive) => attr.canApplyPreAttack(pokemon, passive, simulated, defender, move, args), args, - false, simulated, ); } @@ -5669,8 +5685,7 @@ export function applyPostAttackAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), - args, - false, + (attr, passive) => attr.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, simulated, ); } @@ -5686,8 +5701,8 @@ export function applyPostKnockOutAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + (attr, passive) => attr.canApplyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, - false, simulated, ); } @@ -5702,8 +5717,8 @@ export function applyPostVictoryAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostVictory(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5718,8 +5733,8 @@ export function applyPostSummonAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostSummon(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5734,8 +5749,8 @@ export function applyPreSwitchOutAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPreSwitchOut(pokemon, passive, simulated, args), args, - true, simulated, ); } @@ -5751,8 +5766,8 @@ export function applyPreLeaveFieldAbAttrs( pokemon, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPreLeaveField(pokemon, passive, simulated, args), args, - true, simulated ); } @@ -5769,8 +5784,7 @@ export function applyPreStatStageChangeAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), - args, - false, + (attr, passive) => attr.canApplyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, simulated, ); } @@ -5788,8 +5802,7 @@ export function applyPostStatStageChangeAbAttrs( attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), - args, - false, + (attr, _passive) => attr.canApplyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, simulated, ); } @@ -5806,8 +5819,8 @@ export function applyPreSetStatusAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + (attr, passive) => attr.canApplyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, - false, simulated, ); } @@ -5824,8 +5837,7 @@ export function applyPreApplyBattlerTagAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), - args, - false, + (attr, passive) => attr.canApplyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, simulated, ); } @@ -5842,8 +5854,7 @@ export function applyPreWeatherEffectAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), - args, - true, + (attr, passive) => attr.canApplyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, simulated, ); } @@ -5858,8 +5869,8 @@ export function applyPostTurnAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostTurn(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5875,8 +5886,8 @@ export function applyPostWeatherChangeAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), + (attr, passive) => attr.canApplyPostWeatherChange(pokemon, passive, simulated, weather, args), args, - false, simulated, ); } @@ -5892,8 +5903,8 @@ export function applyPostWeatherLapseAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), + (attr, passive) => attr.canApplyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, - false, simulated, ); } @@ -5909,8 +5920,8 @@ export function applyPostTerrainChangeAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), + (attr, passive) => attr.canApplyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, - false, simulated, ); } @@ -5928,8 +5939,7 @@ export function applyCheckTrappedAbAttrs( attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), - args, - false, + (attr, passive) => attr.canApplyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, simulated, messages, ); @@ -5945,8 +5955,8 @@ export function applyPostBattleAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostBattle(pokemon, passive, simulated, args), args, - false, simulated, ); } @@ -5964,8 +5974,8 @@ export function applyPostFaintAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + (attr, passive) => attr.canApplyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, - false, simulated, ); } @@ -5980,6 +5990,7 @@ export function applyPostItemLostAbAttrs( attrType, pokemon, (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), + (attr, passive) => attr.canApplyPostItemLost(pokemon, simulated, args), args, ); } @@ -5989,19 +6000,36 @@ export function applyPostItemLostAbAttrs( * * Ignores passives as they don't change and shouldn't be reapplied when main abilities change */ -export function applyOnGainAbAttrs(pokemon: Pokemon, passive = false, simulated = false, ...args: any[]): void { - applySingleAbAttrs(pokemon, passive, PostSummonAbAttr, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, true, simulated); +export function applyOnGainAbAttrs( + pokemon: Pokemon, + passive: boolean = false, + simulated: boolean = false, + ...args: any[]): void { + applySingleAbAttrs( + pokemon, + passive, + PostSummonAbAttr, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostSummon(pokemon, passive, simulated, args), + args, + true, + simulated, + ); } /** * Clears primal weather/neutralizing gas during the turn if {@linkcode pokemon}'s ability corresponds to one */ export function applyOnLoseAbAttrs(pokemon: Pokemon, passive = false, simulated = false, ...args: any[]): void { - applySingleAbAttrs(pokemon, passive, PreLeaveFieldAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); -} -function queueShowAbility(pokemon: Pokemon, passive: boolean): void { - globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); - globalScene.clearPhaseQueueSplice(); + applySingleAbAttrs( + pokemon, + passive, + PreLeaveFieldAbAttr, + (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), + (attr, passive) => attr.canApplyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), + args, + true, + simulated); } /** @@ -6888,7 +6916,7 @@ export function initAbilities() { new Ability(Abilities.GORILLA_TACTICS, 8) .attr(GorillaTacticsAbAttr), new Ability(Abilities.NEUTRALIZING_GAS, 8) - .attr(PostSummonAddArenaTagAbAttr, ArenaTagType.NEUTRALIZING_GAS, 0) + .attr(PostSummonAddArenaTagAbAttr, true, ArenaTagType.NEUTRALIZING_GAS, 0) .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/field/arena.ts b/src/field/arena.ts index 2ed94e0e3e3..997b80b3237 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -303,6 +303,11 @@ export class Arena { return true; } + /** Returns weather or not the weather can be changed to {@linkcode weather} */ + canSetWeather(weather: WeatherType): boolean { + return !(this.weather?.weatherType === (weather || undefined)); + } + /** * Attempts to set a new weather to the battle * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set @@ -314,7 +319,7 @@ export class Arena { return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE); } - if (this.weather?.weatherType === (weather || undefined)) { + if (!this.canSetWeather(weather)) { return false; } @@ -388,8 +393,13 @@ export class Arena { }); } + /** Returns whether or not the terrain can be set to {@linkcode terrain} */ + canSetTerrain(terrain: TerrainType): boolean { + return !(this.terrain?.terrainType === (terrain || undefined)); + } + trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim = false): boolean { - if (this.terrain?.terrainType === (terrain || undefined)) { + if (!this.canSetTerrain(terrain)) { return false; } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 1e98c175487..295dc318db4 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -79,6 +79,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_owned", "ui"); this.loadImage("icon_egg_move", "ui"); this.loadImage("ability_bar_left", "ui"); + this.loadImage("ability_bar_right", "ui"); this.loadImage("bgm_bar", "ui"); this.loadImage("party_exp_bar", "ui"); this.loadImage("achv_bar", "ui"); diff --git a/src/phase.ts b/src/phase.ts index 8da00d78b61..20cc7cc4063 100644 --- a/src/phase.ts +++ b/src/phase.ts @@ -1,11 +1,7 @@ import { globalScene } from "#app/global-scene"; export class Phase { - start() { - if (globalScene.abilityBar.shown) { - globalScene.abilityBar.resetAutoHideTimer(); - } - } + start() {} end() { globalScene.shiftPhase(); diff --git a/src/phases/hide-ability-phase.ts b/src/phases/hide-ability-phase.ts new file mode 100644 index 00000000000..0745b3f832a --- /dev/null +++ b/src/phases/hide-ability-phase.ts @@ -0,0 +1,27 @@ +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { PokemonPhase } from "./pokemon-phase"; + +export class HideAbilityPhase extends PokemonPhase { + private passive: boolean; + + constructor(battlerIndex: BattlerIndex, passive = false) { + super(battlerIndex); + + this.passive = passive; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + + if (pokemon) { + globalScene.abilityBar.hide().then(() => { + this.end(); + }); + } else { + this.end(); + } + } +} diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index af4e63c6916..f671307d86a 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -61,12 +61,4 @@ export class MessagePhase extends Phase { ); } } - - end() { - if (globalScene.abilityBar.shown) { - globalScene.abilityBar.hide(); - } - - super.end(); - } } diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts index 70b390dc6de..b33689321b5 100644 --- a/src/phases/pokemon-transform-phase.ts +++ b/src/phases/pokemon-transform-phase.ts @@ -5,6 +5,8 @@ import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat"; import { PokemonMove } from "#app/field/pokemon"; import { globalScene } from "#app/global-scene"; import { PokemonPhase } from "./pokemon-phase"; +import { getPokemonNameWithAffix } from "#app/messages"; +import i18next from "i18next"; /** * Transforms a Pokemon into another Pokemon on the field. @@ -62,6 +64,13 @@ export class PokemonTransformPhase extends PokemonPhase { globalScene.playSound("battle_anims/PRSFX- Transform"); } + globalScene.queueMessage( + i18next.t("abilityTriggers:postSummonTransform", { + pokemonNameWithAffix: getPokemonNameWithAffix(user), + targetName: target.name, + }), + ); + promises.push( user.loadAssets(false).then(() => { user.playAnim(); diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts index 326b3a55ce3..1b3c6dde568 100644 --- a/src/phases/show-ability-phase.ts +++ b/src/phases/show-ability-phase.ts @@ -1,36 +1,60 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; import { PokemonPhase } from "./pokemon-phase"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { HideAbilityPhase } from "#app/phases/hide-ability-phase"; export class ShowAbilityPhase extends PokemonPhase { private passive: boolean; + private pokemonName: string; + private abilityName: string; + private pokemonOnField: boolean; constructor(battlerIndex: BattlerIndex, passive = false) { super(battlerIndex); this.passive = passive; + + const pokemon = this.getPokemon(); + if (pokemon) { + // Set these now as the pokemon object may change before the queued phase is run + this.pokemonName = getPokemonNameWithAffix(pokemon); + this.abilityName = (passive ? this.getPokemon().getPassiveAbility() : this.getPokemon().getAbility()).name; + this.pokemonOnField = true; + } else { + this.pokemonOnField = false; + } } start() { super.start(); + if (!this.pokemonOnField || !this.getPokemon()) { + return this.end(); + } + + // If the bar is already out, hide it before showing the new one + if (globalScene.abilityBar.isVisible()) { + globalScene.unshiftPhase(new HideAbilityPhase(this.battlerIndex, this.passive)); + globalScene.unshiftPhase(new ShowAbilityPhase(this.battlerIndex, this.passive)); + return this.end(); + } + const pokemon = this.getPokemon(); - if (pokemon) { - if (!pokemon.isPlayer()) { - /** If its an enemy pokemon, list it as last enemy to use ability or move */ - globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2; - } else { - globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2; - } - - globalScene.abilityBar.showAbility(pokemon, this.passive); + if (!pokemon.isPlayer()) { + /** If its an enemy pokemon, list it as last enemy to use ability or move */ + globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2; + } else { + globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2; + } + globalScene.abilityBar.showAbility(this.pokemonName, this.abilityName, this.passive, this.player).then(() => { if (pokemon?.battleData) { pokemon.battleData.abilityRevealed = true; } - } - this.end(); + this.end(); + }); } } diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 7fe9c0d8052..5481791de64 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,31 +1,33 @@ -import { getPokemonNameWithAffix } from "#app/messages"; import { globalScene } from "#app/global-scene"; -import type Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; import i18next from "i18next"; -const hiddenX = -118; -const shownX = 0; +const barWidth = 118; +const screenLeft = 0; const baseY = -116; export default class AbilityBar extends Phaser.GameObjects.Container { - private bg: Phaser.GameObjects.Image; + private abilityBars: Phaser.GameObjects.Image[]; private abilityBarText: Phaser.GameObjects.Text; - - private tween: Phaser.Tweens.Tween | null; - private autoHideTimer: NodeJS.Timeout | null; - - public shown: boolean; + private player: boolean; + private screenRight: number; // hold screenRight in case size changes between show and hide + private shown: boolean; constructor() { - super(globalScene, hiddenX, baseY); + super(globalScene, barWidth, baseY); + this.abilityBars = []; + this.player = true; + this.shown = false; } setup(): void { - this.bg = globalScene.add.image(0, 0, "ability_bar_left"); - this.bg.setOrigin(0, 0); - - this.add(this.bg); + for (const key of ["ability_bar_right", "ability_bar_left"]) { + const bar = globalScene.add.image(0, 0, key); + bar.setOrigin(0, 0); + bar.setVisible(false); + this.add(bar); + this.abilityBars.push(bar); + } this.abilityBarText = addTextObject(15, 3, "", TextStyle.MESSAGE, { fontSize: "72px", @@ -33,72 +35,80 @@ export default class AbilityBar extends Phaser.GameObjects.Container { this.abilityBarText.setOrigin(0, 0); this.abilityBarText.setWordWrapWidth(600, true); this.add(this.abilityBarText); + this.bringToTop(this.abilityBarText); this.setVisible(false); - this.shown = false; + this.setX(-barWidth); // start hidden (right edge of bar at x=0) } - showAbility(pokemon: Pokemon, passive = false): void { - this.abilityBarText.setText( - `${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`, - ); + public override setVisible(value: boolean): this { + this.abilityBars[+this.player].setVisible(value); + this.shown = value; + return this; + } - if (this.shown) { - return; + public async startTween(config: any, text?: string): Promise { + this.setVisible(true); + if (text) { + this.abilityBarText.setText(text); } + return new Promise(resolve => { + globalScene.tweens.add({ + ...config, + onComplete: () => { + if (config.onComplete) { + config.onComplete(); + } + resolve(); + }, + }); + }); + } + public async showAbility(pokemonName: string, abilityName: string, passive = false, player = true): Promise { + const text = `${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: pokemonName, passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: abilityName })}`; + this.screenRight = globalScene.scaledCanvas.width; + if (player !== this.player) { + // Move the bar if it has changed from the player to enemy side (or vice versa) + this.setX(player ? -barWidth : this.screenRight); + this.player = player; + } globalScene.fieldUI.bringToTop(this); - this.y = baseY + (globalScene.currentBattle.double ? 14 : 0); - this.tween = globalScene.tweens.add({ - targets: this, - x: shownX, - duration: 500, - ease: "Sine.easeOut", - onComplete: () => { - this.tween = null; - this.resetAutoHideTimer(); - }, - }); + let y = baseY; + if (this.player) { + y += globalScene.currentBattle.double ? 14 : 0; + } else { + y -= globalScene.currentBattle.double ? 28 : 14; + } - this.setVisible(true); - this.shown = true; + this.setY(y); + + return this.startTween( + { + targets: this, + x: this.player ? screenLeft : this.screenRight - barWidth, + duration: 500, + ease: "Sine.easeOut", + hold: 1000, + }, + text, + ); } - hide(): void { - if (!this.shown) { - return; - } - - if (this.autoHideTimer) { - clearInterval(this.autoHideTimer); - } - - if (this.tween) { - this.tween.stop(); - } - - this.tween = globalScene.tweens.add({ + public async hide(): Promise { + return this.startTween({ targets: this, - x: -91, - duration: 500, + x: this.player ? -barWidth : this.screenRight, + duration: 200, ease: "Sine.easeIn", onComplete: () => { - this.tween = null; this.setVisible(false); }, }); - - this.shown = false; } - resetAutoHideTimer(): void { - if (this.autoHideTimer) { - clearInterval(this.autoHideTimer); - } - this.autoHideTimer = setTimeout(() => { - this.hide(); - this.autoHideTimer = null; - }, 2500); + public isVisible(): boolean { + return this.shown; } } diff --git a/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts index 28dc7efc434..37f1664251b 100644 --- a/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -68,7 +68,7 @@ describe("Moves - Secret Power", () => { await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0]; - vi.spyOn(sereneGraceAttr, "apply"); + vi.spyOn(sereneGraceAttr, "canApply"); game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); @@ -86,8 +86,8 @@ describe("Moves - Secret Power", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(sereneGraceAttr.apply).toHaveBeenCalledOnce(); - expect(sereneGraceAttr.apply).toHaveLastReturnedWith(true); + expect(sereneGraceAttr.canApply).toHaveBeenCalledOnce(); + expect(sereneGraceAttr.canApply).toHaveLastReturnedWith(true); expect(rainbowEffect.apply).toHaveBeenCalledTimes(0); }); From 02ae7952ad26f3df133c99f6b7f02024af4d4d6c Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 16 Mar 2025 04:44:48 -0700 Subject: [PATCH 171/171] [Bug] Fix Commander crash after 5267 (#5524) Fix reversed commander checks --- src/data/ability.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 0b5b3624c73..ab78d1dd06c 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2783,8 +2783,8 @@ export class CommanderAbAttr extends AbAttr { // another Pokemon, this effect cannot apply. // TODO: Should this work with X + Dondozo fusions? - return !(pokemon.getAlly().isFainted() || pokemon.getAlly().getTag(BattlerTagType.COMMANDED)) - && globalScene.currentBattle?.double && pokemon.getAlly()?.species.speciesId === Species.DONDOZO; + return globalScene.currentBattle?.double && pokemon.getAlly()?.species.speciesId === Species.DONDOZO + && !(pokemon.getAlly().isFainted() || pokemon.getAlly().getTag(BattlerTagType.COMMANDED)); } override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): void {

    pQV^%q_uz*6hwsyb{y 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 N1fH&bF6*2UngAqSKzslI literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/shiny/484-origin.json b/public/images/pokemon/exp/shiny/484-origin.json index 97d6a0b5f49..e77754c3b3f 100644 --- a/public/images/pokemon/exp/shiny/484-origin.json +++ b/public/images/pokemon/exp/shiny/484-origin.json @@ -4,8 +4,8 @@ "image": "484-origin.png", "format": "RGBA8888", "size": { - "w": 426, - "h": 426 + "w": 274, + "h": 274 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -35,20 +35,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -56,20 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -77,20 +77,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -98,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -119,146 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, "w": 91, - "h": 97 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 97 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 + "h": 95 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 + "h": 95 }, "frame": { "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 - }, - "frame": { - "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 + "h": 95 } }, { @@ -266,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -287,20 +161,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -308,20 +182,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -329,20 +203,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -350,20 +224,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -371,20 +245,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -392,20 +266,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -413,20 +287,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -434,20 +308,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -455,20 +329,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -476,20 +350,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -497,272 +371,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, + "w": 91, "h": 95 }, - "frame": { + "spriteSourceSize": { "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, - "h": 95 - }, - "frame": { - "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, "y": 1, - "w": 89, - "h": 95 + "w": 90, + "h": 94 }, "frame": { "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 89, - "h": 95 - }, - "frame": { - "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 + "y": 95, + "w": 90, + "h": 94 } }, { @@ -770,20 +392,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -791,20 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -812,20 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -833,20 +455,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -854,20 +476,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -875,20 +497,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -896,20 +518,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -917,20 +539,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -938,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -959,20 +581,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -980,20 +602,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -1001,272 +623,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, "w": 91, - "h": 92 + "h": 95 }, - "frame": { - "x": 275, - "y": 92, + "spriteSourceSize": { + "x": 0, + "y": 4, "w": 91, - "h": 92 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 + "h": 91 }, "frame": { "x": 90, - "y": 97, - "w": 89, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 90, - "y": 97, - "w": 89, - "h": 93 + "y": 0, + "w": 91, + "h": 91 } }, { @@ -1274,20 +644,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1295,20 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1316,20 +686,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1337,20 +707,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1358,20 +728,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1379,20 +749,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1400,20 +770,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1421,20 +791,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1442,20 +812,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1463,20 +833,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1484,20 +854,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1505,19 +875,229 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, + "h": 91 + }, + "frame": { + "x": 181, + "y": 0, + "w": 90, + "h": 91 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, "h": 92 }, "frame": { "x": 90, - "y": 190, - "w": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, "h": 92 } }, @@ -1526,20 +1106,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1547,20 +1127,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1568,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1589,20 +1169,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1610,20 +1190,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1631,20 +1211,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1652,20 +1232,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1673,20 +1253,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1694,20 +1274,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1715,20 +1295,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1736,20 +1316,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1757,62 +1337,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, + "w": 89, + "h": 91 + }, + "frame": { + "x": 90, + "y": 183, + "w": 89, + "h": 91 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, "w": 89, "h": 92 }, "frame": { - "x": 180, - "y": 182, + "x": 179, + "y": 91, "w": 89, "h": 92 } }, { - "filename": "0077.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 + "x": 2, + "y": 3, + "w": 89, + "h": 92 }, "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 - }, - "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 + "x": 179, + "y": 91, + "w": 89, + "h": 92 } }, { @@ -1820,20 +1400,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1841,20 +1421,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1862,20 +1442,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1883,20 +1463,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1904,20 +1484,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1925,608 +1505,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 79, - "h": 83 - }, - "frame": { - "x": 347, - "y": 274, - "w": 79, - "h": 83 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 0, - "y": 384, - "w": 27, - "h": 33 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 371, - "y": 54, - "w": 27, - "h": 33 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } } ] @@ -2535,6 +1527,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5fbe4aec02bf780bf0fca7dc7138bf7a:5d077386c518cf06786203ad5e3a3aba:5ea3e660bc9c2624f846675d5196db82$" + "smartupdate": "$TexturePacker:SmartUpdate:71a487dde0de6f6a7eb1b6e04018892f:49ee3dfe044ad986679a7ce34c28280d:5ea3e660bc9c2624f846675d5196db82$" } } diff --git a/public/images/pokemon/exp/shiny/484-origin.png b/public/images/pokemon/exp/shiny/484-origin.png index 69e95afe58059dd621fe53108ae2c8e74f61dc21..bea804ed6776cad03bfa7bea00ddafb6062c4c54 100644 GIT binary patch literal 8255 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/shiny/815-gigantamax.json b/public/images/pokemon/exp/shiny/815-gigantamax.json new file mode 100644 index 00000000000..d8fb9d62e57 --- /dev/null +++ b/public/images/pokemon/exp/shiny/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 258, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 267, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 268, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 426, "y": 389, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 82, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 341, "y": 389, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 84, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 167, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 195, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 265, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 1, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 353, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 510, "y": 389, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 169, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 355, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 443, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 174, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 388, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 335, "y": 483, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/815-gigantamax.png b/public/images/pokemon/exp/shiny/815-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..a299119e06ff46488baec30679c533e710f1d3f4 GIT binary patch literal 32612 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%0A-DdjIP?Zv@{h*yZ*KAQVV> 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 literal 0 HcmV?d00001 diff --git a/public/images/pokemon/exp/shiny/839-gigantamax.json b/public/images/pokemon/exp/shiny/839-gigantamax.json new file mode 100644 index 00000000000..15a7c122f5d --- /dev/null +++ b/public/images/pokemon/exp/shiny/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 454, "y": 470, "w": 86, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 379, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 573, "y": 285, "w": 91, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 91, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 93, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 390, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 585, "y": 96, "w": 94, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 94, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 293, "y": 95, "w": 97, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 97, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 484, "y": 190, "w": 96, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 96, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 92, "y": 286, "w": 92, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 92, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 177, "y": 471, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 89, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 379, "w": 91, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 91, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 184, "y": 286, "w": 91, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 91, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 480, "y": 282, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 281, "y": 281, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 293, "y": 188, "w": 95, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 587, "y": 0, "w": 95, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 95, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 491, "y": 95, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 190, "w": 93, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 93, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 388, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 285, "w": 92, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 92, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 374, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 374, "y": 286, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 365, "y": 380, "w": 89, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 89, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 553, "y": 380, "w": 89, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 89, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 540, "y": 473, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 268, "y": 468, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 87, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 355, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 475, "w": 85, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 85, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 692, "h": 664 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/839-gigantamax.png b/public/images/pokemon/exp/shiny/839-gigantamax.png new file mode 100644 index 0000000000000000000000000000000000000000..f52de9357b108f4d9e9529aa447c412cdd73f04d GIT binary patch literal 65284 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%0AOdMtk#fe0VOC^|N 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 Date: Wed, 5 Mar 2025 18:18:24 -0800 Subject: [PATCH 150/171] [Misc] `getPokemonSpecies()` no longer accepts `undefined` (#5477) --- src/data/pokemon-species.ts | 8 +++----- .../encounters/uncommon-breed-encounter.test.ts | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index c0ca9bf4b62..c9d49f29440 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -68,10 +68,7 @@ export const normalForm: Species[] = [ * @param species The species to fetch * @returns The associated {@linkcode PokemonSpecies} object */ -export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies { - if (!species) { - throw new Error("`species` must not be undefined in `getPokemonSpecies()`"); - } +export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies { // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block if (Array.isArray(species)) { // Pick a random species from the list @@ -914,7 +911,8 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { - return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); + // TODO: this entire function is dumb and should be changed, adding a `!` here for now until then + return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); } } diff --git a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index ab50666ab3d..1bdc45348d6 100644 --- a/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -116,7 +116,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); const config = game.scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId!; await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -143,7 +143,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); const config = game.scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId!; await runMysteryEncounterToEnd(game, 1, undefined, true); From ba617ad91b541f660d8046e3fea9670967744ead Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Wed, 5 Mar 2025 23:39:02 -0600 Subject: [PATCH 151/171] [Misc] Add a script to help verify correctness of variant sprite masterlist (#5325) Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> --- .gitignore | 4 + scripts/find_sprite_variant_mismatches.py | 98 +++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 scripts/find_sprite_variant_mismatches.py diff --git a/.gitignore b/.gitignore index c22d0b2ce4c..9d96ed04a15 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ coverage /dependency-graph.svg /.vs + + +# Script outputs +./*.csv \ No newline at end of file diff --git a/scripts/find_sprite_variant_mismatches.py b/scripts/find_sprite_variant_mismatches.py new file mode 100644 index 00000000000..483695fdb66 --- /dev/null +++ b/scripts/find_sprite_variant_mismatches.py @@ -0,0 +1,98 @@ +""" +Validates the contents of the variant's masterlist file and identifies +any mismatched entries for the sprite of the same key between front, back, exp, exp back, and female. + +This will create a csv file that contains all of the entries with mismatches. + +An empty entry means that there was not a mismatch for that version of the sprite (meaning it matches front). +""" + +import sys + +if sys.version_info < (3, 7): + msg = "This script requires Python 3.7+" + raise RuntimeError(msg) + +import json +import os +import csv +from dataclasses import dataclass, field +from typing import Literal as L + +MASTERLIST_PATH = os.path.join( + os.path.dirname(os.path.dirname(__file__)), "public", "images", "pokemon", "variant", "_masterlist.json" +) +DEFAULT_OUTPUT_PATH = "sprite-mismatches.csv" + + +@dataclass(order=True) +class Sprite: + key: str = field(compare=False) + front: list[int] = field(default_factory=list, compare=False) + back: list[int] = field(default_factory=list, compare=False) + female: list[int] = field(default_factory=list, compare=False) + exp: list[int] = field(default_factory=list, compare=False) + expback: list[int] = field(default_factory=list, compare=False) + sortedKey: tuple[int] | tuple[int, str] = field(init=False, repr=False, compare=True) + + def as_row(self) -> tuple[str, list[int] | L[""], list[int] | L[""], list[int] | L[""], list[int] | L[""], list[int] | L[""]]: + """return sprite information as a tuple for csv writing""" + return (self.key, self.front or "", self.back or "", self.exp or "", self.expback or "", self.female or "") + + def is_mismatch(self) -> bool: + """return True if the female, back, or exp sprites do not match the front""" + for val in [self.back, self.exp, self.expback, self.female]: + if val != [] and val != self.front: + return True + return False + + def __post_init__(self): + split = self.key.split("-", maxsplit=1) + self.sortedKey = (int(split[0]), split[1]) if len(split) == 2 else (int(split[0]),) + + +def make_mismatch_sprite_list(path): + with open(path, "r") as f: + masterlist: dict = json.load(f) + + # Go through the keys in "front" and "back" and make sure they match the masterlist + back_data: dict[str, list[int]] = masterlist.pop("back", {}) + exp_data: dict[str, list[int]] = masterlist.pop("exp", {}) + exp_back_data: dict[str, list[int]] = exp_data.get("back", []) + female_data: dict[str, list[int]] = masterlist.pop("female", {}) + + sprites: list[Sprite] = [] + + for key, item in masterlist.items(): + sprite = Sprite( + key, front=item, back=back_data.get(key, []), exp=exp_data.get(key, []), expback=exp_back_data.get(key, []), female=female_data.get(key, []) + ) + if sprite.is_mismatch(): + sprites.append(sprite) + + return sprites + + +def write_mismatch_csv(filename: str, mismatches: list[Sprite]): + with open(filename, "w", newline="") as csvfile: + writer = csv.writer(csvfile) + writer.writerow(["key", "front", "back", "exp", "expback", "female"]) + for sprite in sorted(mismatches): + writer.writerow(sprite.as_row()) + + +if __name__ == "__main__": + import argparse + + p = argparse.ArgumentParser("find_sprite_variant_mismatches", description=__doc__) + + p.add_argument( + "-o", + "--output", + default=DEFAULT_OUTPUT_PATH, + help=f"The path to a file to save the output file. If not specified, will write to {DEFAULT_OUTPUT_PATH}.", + ) + p.add_argument("--masterlist", default=MASTERLIST_PATH, help=f"The path to the masterlist file to validate. Defaults to {MASTERLIST_PATH}.") + args = p.parse_args() + mismatches = make_mismatch_sprite_list(args.masterlist) + write_mismatch_csv(args.output, mismatches) From 7a9b1e50333623fb9ec062131fc887d3c8f9eaa7 Mon Sep 17 00:00:00 2001 From: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Date: Thu, 6 Mar 2025 04:14:22 -0500 Subject: [PATCH 152/171] [Bug] Fix critical hits not bypassing screens (#5470) --- src/field/pokemon.ts | 6 ++++- test/moves/aurora_veil.test.ts | 41 +++++++++++++++++++++++++++------ test/moves/light_screen.test.ts | 27 +++++++++++++++++----- test/moves/reflect.test.ts | 24 +++++++++++++++---- 4 files changed, 79 insertions(+), 19 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 53d4b6c54d2..d8e22898d42 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2886,7 +2886,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** Reduces damage if this Pokemon has a relevant screen (e.g. Light Screen for special attacks) */ const screenMultiplier = new Utils.NumberHolder(1); - globalScene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, source, moveCategory, screenMultiplier); + + // Critical hits should bypass screens + if (!isCritical) { + globalScene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, source, moveCategory, screenMultiplier); + } /** * For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if: diff --git a/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts index c8da3e03db5..21b46c4be79 100644 --- a/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; import type Move from "#app/data/move"; -import { allMoves } from "#app/data/move"; +import { allMoves, CritOnlyAttr } from "#app/data/move"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; @@ -12,7 +12,7 @@ import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; let globalScene: BattleScene; @@ -47,7 +47,7 @@ describe("Moves - Aurora Veil", () => { it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -61,7 +61,7 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); game.move.select(moveToUse); game.move.select(moveToUse, 1); @@ -74,7 +74,7 @@ describe("Moves - Aurora Veil", () => { it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -89,7 +89,7 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); game.move.select(moveToUse); game.move.select(moveToUse, 1); @@ -99,6 +99,31 @@ describe("Moves - Aurora Veil", () => { expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); + + it("does not affect physical critical hits", async () => { + game.override.moveset([ Moves.WICKED_BLOW ]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); + + it("does not affect critical hits", async () => { + game.override.moveset([ Moves.FROST_BREATH ]); + const moveToUse = Moves.FROST_BREATH; + vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -115,7 +140,9 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; if (globalScene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { - globalScene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, false, attacker, move.category, multiplierHolder); + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, false, attacker, move.category, multiplierHolder); + } } return move.power * multiplierHolder.value; diff --git a/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts index 8eee58c8e17..1f9e4f9b97f 100644 --- a/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; import type Move from "#app/data/move"; -import { allMoves } from "#app/data/move"; +import { allMoves, CritOnlyAttr } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; @@ -11,7 +11,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; let globalScene: BattleScene; @@ -45,7 +45,7 @@ describe("Moves - Light Screen", () => { it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -60,7 +60,7 @@ describe("Moves - Light Screen", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); game.move.select(moveToUse); game.move.select(moveToUse, 1); @@ -73,7 +73,7 @@ describe("Moves - Light Screen", () => { it("does not affect physical attacks", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -82,6 +82,19 @@ describe("Moves - Light Screen", () => { expect(mockedDmg).toBe(allMoves[moveToUse].power); }); + + it("does not affect critical hits", async () => { + game.override.moveset([ Moves.FROST_BREATH ]); + const moveToUse = Moves.FROST_BREATH; + vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -98,7 +111,9 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; if (globalScene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { - globalScene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, false, attacker, move.category, multiplierHolder); + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, false, attacker, move.category, multiplierHolder); + } } return move.power * multiplierHolder.value; diff --git a/test/moves/reflect.test.ts b/test/moves/reflect.test.ts index edc3f1ab8aa..a0376aa24b4 100644 --- a/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; import type Move from "#app/data/move"; -import { allMoves } from "#app/data/move"; +import { allMoves, CritOnlyAttr } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; @@ -45,7 +45,7 @@ describe("Moves - Reflect", () => { it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -59,7 +59,7 @@ describe("Moves - Reflect", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); game.move.select(moveToUse); game.move.select(moveToUse, 1); @@ -72,7 +72,7 @@ describe("Moves - Reflect", () => { it("does not affect special attacks", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); game.move.select(moveToUse); @@ -82,6 +82,18 @@ describe("Moves - Reflect", () => { expect(mockedDmg).toBe(allMoves[moveToUse].power); }); + + it("does not affect critical hits", async () => { + game.override.moveset([ Moves.WICKED_BLOW ]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -98,7 +110,9 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; if (globalScene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { - globalScene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder); + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder); + } } return move.power * multiplierHolder.value; From fdc5e7daea73d34a4cb9d6cea0b5f7e258ed39e7 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 6 Mar 2025 14:05:08 -0500 Subject: [PATCH 153/171] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 0e5c6096ba2..6b3f37cb351 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b +Subproject commit 6b3f37cb351552721232f4dabefa17bddb5b9004 From da68cf15c6d7de2704ff9b74604af5d09a5dbd2b Mon Sep 17 00:00:00 2001 From: Fuad Ali Date: Fri, 7 Mar 2025 00:03:01 +0000 Subject: [PATCH 154/171] [Bug] Harsh Sun, Heavy Rain, and Delta Stream messages now display when their effects are triggered (#5489) --- src/data/weather.ts | 10 ++++++++++ src/field/arena.ts | 4 ++++ src/phases/move-phase.ts | 7 +++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index 0c90f381130..7de4d93b398 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -205,6 +205,16 @@ export function getWeatherClearMessage(weatherType: WeatherType): string | null return null; } +export function getWeatherBlockMessage(weatherType: WeatherType): string { + switch (weatherType) { + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunEffectMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainEffectMessage"); + } + return i18next.t("weather:defaultEffectMessage"); +} + export function getTerrainStartMessage(terrainType: TerrainType): string | null { switch (terrainType) { case TerrainType.MISTY: diff --git a/src/field/arena.ts b/src/field/arena.ts index 752eef81596..fe3e205bd2d 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -358,6 +358,10 @@ export class Arena { return !!this.terrain && this.terrain.isMoveTerrainCancelled(user, targets, move); } + public getWeatherType(): WeatherType { + return this.weather?.weatherType ?? WeatherType.NONE; + } + public getTerrainType(): TerrainType { return this.terrain?.terrainType ?? TerrainType.NONE; } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index d58c052812f..3804ea78a3c 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -30,7 +30,7 @@ import { import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; import { Type } from "#enums/type"; -import { getTerrainBlockMessage } from "#app/data/weather"; +import { getTerrainBlockMessage, getWeatherBlockMessage } from "#app/data/weather"; import { MoveUsedEvent } from "#app/events/battle-scene"; import type { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; @@ -342,9 +342,10 @@ export class MovePhase extends BattlePhase { * TODO: is this sustainable? */ let failedDueToTerrain: boolean = false; + let failedDueToWeather: boolean = false; if (success) { const passesConditions = move.applyConditions(this.pokemon, targets[0], move); - const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); + failedDueToWeather = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); failedDueToTerrain = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); success = passesConditions && !failedDueToWeather && !failedDueToTerrain; } @@ -381,6 +382,8 @@ export class MovePhase extends BattlePhase { failedText = failureMessage; } else if (failedDueToTerrain) { failedText = getTerrainBlockMessage(targets[0], globalScene.arena.getTerrainType()); + } else if (failedDueToWeather) { + failedText = getWeatherBlockMessage(globalScene.arena.getWeatherType()); } this.showFailedText(failedText); From e73dbe98615588af8778a7a12a2eb259e6b9df99 Mon Sep 17 00:00:00 2001 From: Mikhail Shueb Date: Fri, 7 Mar 2025 17:31:34 +0000 Subject: [PATCH 155/171] [Bug] Chilly Reception no longer replaces Legendary Weather (Primordial Sea, Desolate Land, Delta Stream) (#5484) Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/weather.ts | 12 ++++++++++++ src/field/arena.ts | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index 7de4d93b398..587d46f0772 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -205,6 +205,18 @@ export function getWeatherClearMessage(weatherType: WeatherType): string | null return null; } +export function getLegendaryWeatherContinuesMessage(weatherType: WeatherType): string | null { + switch (weatherType) { + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunContinueMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainContinueMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsContinueMessage"); + } + return null; +} + export function getWeatherBlockMessage(weatherType: WeatherType): string { switch (weatherType) { case WeatherType.HARSH_SUN: diff --git a/src/field/arena.ts b/src/field/arena.ts index fe3e205bd2d..08ba3542fc2 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -5,7 +5,7 @@ import type { Constructor } from "#app/utils"; import * as Utils from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, Weather } from "#app/data/weather"; +import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, getLegendaryWeatherContinuesMessage, Weather } from "#app/data/weather"; import { CommonAnim } from "#app/data/battle-anims"; import type { Type } from "#enums/type"; import type Move from "#app/data/move"; @@ -274,6 +274,12 @@ export class Arena { const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; + if (this.weather?.isImmutable() && ![ WeatherType.HARSH_SUN, WeatherType.HEAVY_RAIN, WeatherType.STRONG_WINDS, WeatherType.NONE ].includes(weather)) { + globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (oldWeatherType - 1), true)); + globalScene.queueMessage(getLegendaryWeatherContinuesMessage(oldWeatherType)!); + return false; + } + this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!)); // TODO: is this bang correct? From 60a4db705934dfa92e6b2dc329938636fad7c446 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:10:29 -0600 Subject: [PATCH 156/171] [Refactor] Refactor moves.ts part 1 (#5420) --- src/battle-scene.ts | 38 +- src/data/ability.ts | 191 +- src/data/arena-tag.ts | 32 +- src/data/balance/biomes.ts | 2166 +++++----- src/data/balance/egg-moves.ts | 2 +- src/data/balance/pokemon-evolutions.ts | 30 +- src/data/battle-anims.ts | 4 +- src/data/battler-tags.ts | 84 +- src/data/challenge.ts | 12 +- src/data/custom-pokemon-data.ts | 4 +- src/data/moves/invalid-moves.ts | 281 ++ src/data/{ => moves}/move.ts | 2511 +++++------- .../encounters/bug-type-superfan-encounter.ts | 20 +- .../encounters/clowning-around-encounter.ts | 10 +- .../encounters/dark-deal-encounter.ts | 6 +- .../encounters/field-trip-encounter.ts | 2 +- .../encounters/fiery-fallout-encounter.ts | 8 +- .../teleporting-hijinks-encounter.ts | 8 +- .../the-expert-pokemon-breeder-encounter.ts | 4 +- .../the-winstrate-challenge-encounter.ts | 6 +- .../encounters/uncommon-breed-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 8 +- .../mystery-encounter-option.ts | 4 +- .../mystery-encounter-requirements.ts | 12 +- .../utils/encounter-phase-utils.ts | 6 +- .../utils/encounter-pokemon-utils.ts | 4 +- src/data/pokemon-forms.ts | 3 +- src/data/pokemon-species.ts | 3554 ++++++++--------- src/data/terrain.ts | 14 +- src/data/trainer-config.ts | 306 +- src/data/type.ts | 324 +- src/data/weather.ts | 26 +- src/enums/MoveCategory.ts | 5 + src/enums/MoveEffectTrigger.ts | 7 + src/enums/MoveFlags.ts | 46 + src/enums/MoveTarget.ts | 29 + src/enums/MultiHitType.ts | 7 + src/enums/{type.ts => pokemon-type.ts} | 2 +- src/events/battle-scene.ts | 2 +- src/field/arena.ts | 6 +- src/field/pokemon.ts | 126 +- src/loading-scene.ts | 2 +- src/modifier/modifier-type.ts | 44 +- src/modifier/modifier.ts | 20 +- src/phases/command-phase.ts | 4 +- src/phases/faint-phase.ts | 2 +- src/phases/learn-move-phase.ts | 4 +- src/phases/move-anim-test-phase.ts | 2 +- src/phases/move-charge-phase.ts | 2 +- src/phases/move-effect-phase.ts | 16 +- src/phases/move-header-phase.ts | 2 +- src/phases/move-phase.ts | 8 +- src/phases/select-target-phase.ts | 2 +- src/phases/switch-summon-phase.ts | 2 +- src/phases/tera-phase.ts | 6 +- src/phases/turn-start-phase.ts | 2 +- src/system/game-data.ts | 6 +- src/system/pokemon-data.ts | 12 +- src/ui/battle-flyout.ts | 2 +- src/ui/battle-info.ts | 24 +- src/ui/command-ui-handler.ts | 6 +- src/ui/fight-ui-handler.ts | 6 +- src/ui/modifier-select-ui-handler.ts | 2 +- src/ui/move-info-overlay.ts | 8 +- src/ui/party-ui-handler.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 10 +- src/ui/pokedex-scan-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 12 +- src/ui/pokemon-hatch-info-container.ts | 6 +- src/ui/pokemon-info-container.ts | 4 +- src/ui/run-info-ui-handler.ts | 6 +- src/ui/starter-select-ui-handler.ts | 34 +- src/ui/summary-ui-handler.ts | 16 +- src/ui/target-select-ui-handler.ts | 2 +- test/abilities/aura_break.test.ts | 2 +- test/abilities/battery.test.ts | 2 +- test/abilities/battle_bond.test.ts | 3 +- test/abilities/friend_guard.test.ts | 3 +- test/abilities/galvanize.test.ts | 12 +- test/abilities/hustle.test.ts | 2 +- test/abilities/infiltrator.test.ts | 2 +- test/abilities/libero.test.ts | 20 +- test/abilities/magic_bounce.test.ts | 2 +- test/abilities/mimicry.test.ts | 14 +- test/abilities/parental_bond.test.ts | 6 +- test/abilities/power_spot.test.ts | 2 +- test/abilities/protean.test.ts | 20 +- test/abilities/sap_sipper.test.ts | 2 +- test/abilities/serene_grace.test.ts | 4 +- test/abilities/sheer_force.test.ts | 6 +- test/abilities/steely_spirit.test.ts | 2 +- test/abilities/supreme_overlord.test.ts | 2 +- test/abilities/unburden.test.ts | 2 +- test/abilities/wimp_out.test.ts | 2 +- test/abilities/wonder_skin.test.ts | 2 +- test/arena/arena_gravity.test.ts | 2 +- test/arena/grassy_terrain.test.ts | 2 +- test/arena/weather_fog.test.ts | 2 +- test/arena/weather_strong_winds.test.ts | 2 +- test/battle/damage_calculation.test.ts | 2 +- test/battle/inverse_battle.test.ts | 4 +- test/battlerTags/substitute.test.ts | 2 +- test/enemy_command.test.ts | 3 +- test/field/pokemon.test.ts | 84 +- test/moves/astonish.test.ts | 2 +- test/moves/aurora_veil.test.ts | 4 +- test/moves/burning_jealousy.test.ts | 2 +- test/moves/camouflage.test.ts | 4 +- test/moves/ceaseless_edge.test.ts | 2 +- test/moves/copycat.test.ts | 2 +- test/moves/destiny_bond.test.ts | 2 +- test/moves/diamond_storm.test.ts | 2 +- test/moves/dig.test.ts | 2 +- test/moves/dragon_cheer.test.ts | 6 +- test/moves/dragon_rage.test.ts | 8 +- test/moves/dragon_tail.test.ts | 6 +- test/moves/dynamax_cannon.test.ts | 2 +- test/moves/effectiveness.test.ts | 12 +- test/moves/electrify.test.ts | 6 +- test/moves/fell_stinger.test.ts | 2 +- test/moves/flower_shield.test.ts | 4 +- test/moves/fly.test.ts | 2 +- test/moves/forests_curse.test.ts | 6 +- test/moves/freeze_dry.test.ts | 6 +- test/moves/freezy_frost.test.ts | 2 +- test/moves/fusion_flare_bolt.test.ts | 2 +- test/moves/glaive_rush.test.ts | 2 +- test/moves/hard_press.test.ts | 2 +- test/moves/hyper_beam.test.ts | 2 +- test/moves/lash_out.test.ts | 2 +- test/moves/last_respects.test.ts | 2 +- test/moves/light_screen.test.ts | 4 +- test/moves/magic_coat.test.ts | 2 +- test/moves/metronome.test.ts | 2 +- test/moves/moongeist_beam.test.ts | 2 +- test/moves/plasma_fists.test.ts | 8 +- test/moves/pledge_moves.test.ts | 16 +- test/moves/powder.test.ts | 4 +- test/moves/protect.test.ts | 2 +- test/moves/rage_fist.test.ts | 2 +- test/moves/reflect.test.ts | 4 +- test/moves/reflect_type.test.ts | 10 +- test/moves/relic_song.test.ts | 4 +- test/moves/retaliate.test.ts | 2 +- test/moves/rollout.test.ts | 2 +- test/moves/roost.test.ts | 46 +- test/moves/round.test.ts | 2 +- test/moves/scale_shot.test.ts | 2 +- test/moves/secret_power.test.ts | 2 +- test/moves/shell_side_arm.test.ts | 2 +- test/moves/shell_trap.test.ts | 2 +- test/moves/sketch.test.ts | 2 +- test/moves/solar_beam.test.ts | 2 +- test/moves/sparkly_swirl.test.ts | 2 +- test/moves/spectral_thief.test.ts | 2 +- test/moves/spit_up.test.ts | 2 +- test/moves/steamroller.test.ts | 2 +- test/moves/substitute.test.ts | 2 +- test/moves/tar_shot.test.ts | 6 +- test/moves/telekinesis.test.ts | 2 +- test/moves/tera_blast.test.ts | 12 +- test/moves/tera_starstorm.test.ts | 6 +- test/moves/toxic.test.ts | 2 +- test/moves/trick_or_treat.test.ts | 6 +- test/moves/triple_arrows.test.ts | 2 +- test/moves/whirlwind.test.ts | 4 +- .../clowning-around-encounter.test.ts | 16 +- .../fiery-fallout-encounter.test.ts | 6 +- .../mystery-encounter-utils.test.ts | 4 +- test/phases/form-change-phase.test.ts | 6 +- test/testUtils/gameManager.ts | 2 +- test/vitest.setup.ts | 2 +- 172 files changed, 5363 insertions(+), 5348 deletions(-) create mode 100644 src/data/moves/invalid-moves.ts rename src/data/{ => moves}/move.ts (79%) create mode 100644 src/enums/MoveCategory.ts create mode 100644 src/enums/MoveEffectTrigger.ts create mode 100644 src/enums/MoveFlags.ts create mode 100644 src/enums/MoveTarget.ts create mode 100644 src/enums/MultiHitType.ts rename src/enums/{type.ts => pokemon-type.ts} (88%) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 996c3b0de87..208c3368038 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -44,7 +44,7 @@ import { initGameSpeed } from "#app/system/game-speed"; import { Arena, ArenaBase } from "#app/field/arena"; import { GameData } from "#app/system/game-data"; import { addTextObject, getTextColor, TextStyle } from "#app/ui/text"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MusicPreference } from "#app/system/settings/settings"; import { getDefaultModifierTypeForTier, @@ -105,7 +105,7 @@ import { } from "#app/data/pokemon-forms"; import { FormChangePhase } from "#app/phases/form-change-phase"; import { getTypeRgb } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import PokemonSpriteSparkleHandler from "#app/field/pokemon-sprite-sparkle-handler"; import CharSprite from "#app/ui/char-sprite"; import DamageNumberHandler from "#app/field/damage-number-handler"; @@ -1872,44 +1872,44 @@ export default class BattleScene extends SceneBase { ) { if (species.speciesId === Species.WORMADAM) { switch (this.currentBattle.trainer.config.specialtyType) { - case Type.GROUND: + case PokemonType.GROUND: return 1; // Sandy Cloak - case Type.STEEL: + case PokemonType.STEEL: return 2; // Trash Cloak - case Type.GRASS: + case PokemonType.GRASS: return 0; // Plant Cloak } } else if (species.speciesId === Species.ROTOM) { switch (this.currentBattle.trainer.config.specialtyType) { - case Type.FLYING: + case PokemonType.FLYING: return 4; // Fan Rotom - case Type.GHOST: + case PokemonType.GHOST: return 0; // Lightbulb Rotom - case Type.FIRE: + case PokemonType.FIRE: return 1; // Heat Rotom - case Type.GRASS: + case PokemonType.GRASS: return 5; // Mow Rotom - case Type.WATER: + case PokemonType.WATER: return 2; // Wash Rotom - case Type.ICE: + case PokemonType.ICE: return 3; // Frost Rotom } } else if (species.speciesId === Species.ORICORIO) { switch (this.currentBattle.trainer.config.specialtyType) { - case Type.GHOST: + case PokemonType.GHOST: return 3; // Sensu Style - case Type.FIRE: + case PokemonType.FIRE: return 0; // Baile Style - case Type.ELECTRIC: + case PokemonType.ELECTRIC: return 1; // Pom-Pom Style - case Type.PSYCHIC: + case PokemonType.PSYCHIC: return 2; // Pa'u Style } } else if (species.speciesId === Species.PALDEA_TAUROS) { switch (this.currentBattle.trainer.config.specialtyType) { - case Type.FIRE: + case PokemonType.FIRE: return 1; // Blaze Breed - case Type.WATER: + case PokemonType.WATER: return 2; // Aqua Breed } } else if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { // Would probably never happen, but might as well @@ -3948,8 +3948,8 @@ export default class BattleScene extends SceneBase { return { name: p.name, form: p.getFormKey(), - types: p.getTypes().map((type) => Type[type]), - teraType: Type[p.getTeraType()], + types: p.getTypes().map((type) => PokemonType[type]), + teraType: PokemonType[p.getTeraType()], isTerastallized: p.isTerastallized, level: p.level, currentHP: p.hp, diff --git a/src/data/ability.ts b/src/data/ability.ts index 37b97ffb5e6..de3ec840805 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,7 +1,7 @@ import type { EnemyPokemon, PokemonMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; import { HitResult, MoveResult, PlayerPokemon } from "../field/pokemon"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { getPokemonNameWithAffix } from "../messages"; @@ -10,8 +10,11 @@ import type { BattlerTag } from "./battler-tags"; import { BattlerTagLapseType, GroundedTag } from "./battler-tags"; import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "#app/data/status-effect"; import { Gender } from "./gender"; -import type Move from "./move"; -import { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; +import type Move from "./moves/move"; +import { AttackMove, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import type { ArenaTrapTag, SuppressAbilitiesTag } from "./arena-tag"; import { ArenaTagSide } from "./arena-tag"; import { BerryModifier, HitHealModifier, PokemonHeldItemModifier } from "../modifier/modifier"; @@ -413,7 +416,7 @@ export class AlliedFieldDamageReductionAbAttr extends PreDefendAbAttr { } export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { - constructor(moveType: Type, damageMultiplier: number) { + constructor(moveType: PokemonType, damageMultiplier: number) { super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier); } } @@ -425,10 +428,10 @@ export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultip * @see {@linkcode getCondition} */ export class TypeImmunityAbAttr extends PreDefendAbAttr { - private immuneType: Type | null; + private immuneType: PokemonType | null; private condition: AbAttrCondition | null; - constructor(immuneType: Type | null, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType | null, condition?: AbAttrCondition) { super(); this.immuneType = immuneType; @@ -457,7 +460,7 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { return false; } - getImmuneType(): Type | null { + getImmuneType(): PokemonType | null { return this.immuneType; } @@ -467,7 +470,7 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { } export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { - constructor(immuneType: Type, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, condition?: AbAttrCondition) { super(immuneType, condition); } @@ -486,7 +489,7 @@ export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { } export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { - constructor(immuneType: Type) { + constructor(immuneType: PokemonType) { super(immuneType); } @@ -511,7 +514,7 @@ class TypeImmunityStatStageChangeAbAttr extends TypeImmunityAbAttr { private stat: BattleStat; private stages: number; - constructor(immuneType: Type, stat: BattleStat, stages: number, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, stat: BattleStat, stages: number, condition?: AbAttrCondition) { super(immuneType, condition); this.stat = stat; @@ -536,7 +539,7 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { private tagType: BattlerTagType; private turnCount: number; - constructor(immuneType: Type, tagType: BattlerTagType, turnCount: number, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, tagType: BattlerTagType, turnCount: number, condition?: AbAttrCondition) { super(immuneType, condition); this.tagType = tagType; @@ -904,7 +907,7 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { return i18next.t("abilityTriggers:postDefendTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName, - typeName: i18next.t(`pokemonInfo:Type.${Type[pokemon.getTypes(true)[0]]}`) + typeName: i18next.t(`pokemonInfo:Type.${PokemonType[pokemon.getTypes(true)[0]]}`) }); } } @@ -963,7 +966,7 @@ export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr } applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(Type.GRASS)) { + if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(PokemonType.GRASS)) { return false; } return super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); @@ -1353,7 +1356,7 @@ export class FieldMultiplyStatAbAttr extends AbAttr { export class MoveTypeChangeAbAttr extends PreAttackAbAttr { constructor( - private newType: Type, + private newType: PokemonType, private powerMultiplier: number, private condition?: PokemonAttackCondition ) { @@ -1378,7 +1381,7 @@ export class MoveTypeChangeAbAttr extends PreAttackAbAttr { /** Ability attribute for changing a pokemon's type before using a move */ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { - private moveType: Type; + private moveType: PokemonType; constructor() { super(true); @@ -1418,7 +1421,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`), + moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), }); } } @@ -1525,13 +1528,13 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { } export class MoveTypePowerBoostAbAttr extends MovePowerBoostAbAttr { - constructor(boostedType: Type, powerMultiplier?: number) { + constructor(boostedType: PokemonType, powerMultiplier?: number) { super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); } } export class LowHpMoveTypePowerBoostAbAttr extends MoveTypePowerBoostAbAttr { - constructor(boostedType: Type) { + constructor(boostedType: PokemonType) { super(boostedType); } @@ -1609,7 +1612,7 @@ export class PreAttackFieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostA * @param boostedType - The type of move that will receive the power boost. * @param powerMultiplier - The multiplier to apply to the move's power, defaults to 1.5 if not provided. */ - constructor(boostedType: Type, powerMultiplier?: number) { + constructor(boostedType: PokemonType, powerMultiplier?: number) { super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); } } @@ -3514,10 +3517,10 @@ function getAnticipationCondition(): AbAttrCondition { + (opponent.ivs[Stat.SPDEF] & 1) * 32) * 15 / 63); const type = [ - Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, - Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, - Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, - Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK ][iv_val]; + PokemonType.FIGHTING, PokemonType.FLYING, PokemonType.POISON, PokemonType.GROUND, + PokemonType.ROCK, PokemonType.BUG, PokemonType.GHOST, PokemonType.STEEL, + PokemonType.FIRE, PokemonType.WATER, PokemonType.GRASS, PokemonType.ELECTRIC, + PokemonType.PSYCHIC, PokemonType.ICE, PokemonType.DRAGON, PokemonType.DARK ][iv_val]; if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) { return true; @@ -4419,7 +4422,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { */ applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { if (this.arenaTrapCondition(pokemon, otherPokemon)) { - if (otherPokemon.getTypes(true).includes(Type.GHOST) || (otherPokemon.getTypes(true).includes(Type.STELLAR) && otherPokemon.getTypes().includes(Type.GHOST))) { + if (otherPokemon.getTypes(true).includes(PokemonType.GHOST) || (otherPokemon.getTypes(true).includes(PokemonType.STELLAR) && otherPokemon.getTypes().includes(PokemonType.GHOST))) { trapped.value = false; return false; } else if (otherPokemon.hasAbility(Abilities.RUN_AWAY)) { @@ -4589,9 +4592,9 @@ export class RedirectMoveAbAttr extends AbAttr { } export class RedirectTypeMoveAbAttr extends RedirectMoveAbAttr { - public type: Type; + public type: PokemonType; - constructor(type: Type) { + constructor(type: PokemonType) { super(); this.type = type; } @@ -4807,17 +4810,17 @@ export class NoFusionAbilityAbAttr extends AbAttr { } export class IgnoreTypeImmunityAbAttr extends AbAttr { - private defenderType: Type; - private allowedMoveTypes: Type[]; + private defenderType: PokemonType; + private allowedMoveTypes: PokemonType[]; - constructor(defenderType: Type, allowedMoveTypes: Type[]) { + constructor(defenderType: PokemonType, allowedMoveTypes: PokemonType[]) { super(true); this.defenderType = defenderType; this.allowedMoveTypes = allowedMoveTypes; } apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.defenderType === (args[1] as Type) && this.allowedMoveTypes.includes(args[0] as Type)) { + if (this.defenderType === (args[1] as PokemonType) && this.allowedMoveTypes.includes(args[0] as PokemonType)) { cancelled.value = true; return true; } @@ -4830,9 +4833,9 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr { */ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { private statusEffect: StatusEffect[]; - private defenderType: Type[]; + private defenderType: PokemonType[]; - constructor(statusEffect: StatusEffect[], defenderType: Type[]) { + constructor(statusEffect: StatusEffect[], defenderType: PokemonType[]) { super(true); this.statusEffect = statusEffect; @@ -4840,7 +4843,7 @@ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { } apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as Type)) { + if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as PokemonType)) { cancelled.value = true; return true; } @@ -5077,7 +5080,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { return false; } const currentTerrain = globalScene.arena.getTerrainType(); - const typeChange: Type[] = this.determineTypeChange(pokemon, currentTerrain); + const typeChange: PokemonType[] = this.determineTypeChange(pokemon, currentTerrain); if (typeChange.length !== 0) { if (pokemon.summonData.addedType && typeChange.includes(pokemon.summonData.addedType)) { pokemon.summonData.addedType = null; @@ -5094,20 +5097,20 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { * @param currentTerrain {@linkcode TerrainType} * @returns a list of type(s) */ - private determineTypeChange(pokemon: Pokemon, currentTerrain: TerrainType): Type[] { - const typeChange: Type[] = []; + private determineTypeChange(pokemon: Pokemon, currentTerrain: TerrainType): PokemonType[] { + const typeChange: PokemonType[] = []; switch (currentTerrain) { case TerrainType.ELECTRIC: - typeChange.push(Type.ELECTRIC); + typeChange.push(PokemonType.ELECTRIC); break; case TerrainType.MISTY: - typeChange.push(Type.FAIRY); + typeChange.push(PokemonType.FAIRY); break; case TerrainType.GRASSY: - typeChange.push(Type.GRASS); + typeChange.push(PokemonType.GRASS); break; case TerrainType.PSYCHIC: - typeChange.push(Type.PSYCHIC); + typeChange.push(PokemonType.PSYCHIC); break; default: pokemon.getTypes(false, false, true).forEach(t => { @@ -5135,7 +5138,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { if (currentTerrain === TerrainType.NONE) { return i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix }); } else { - const moveType = i18next.t(`pokemonInfo:Type.${Type[this.determineTypeChange(pokemon, currentTerrain)[0]]}`); + const moveType = i18next.t(`pokemonInfo:Type.${PokemonType[this.determineTypeChange(pokemon, currentTerrain)[0]]}`); return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix, moveType }); } } @@ -6045,10 +6048,10 @@ export function initAbilities() { .attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.PARALYSIS) .bypassFaint(), new Ability(Abilities.VOLT_ABSORB, 3) - .attr(TypeImmunityHealAbAttr, Type.ELECTRIC) + .attr(TypeImmunityHealAbAttr, PokemonType.ELECTRIC) .ignorable(), new Ability(Abilities.WATER_ABSORB, 3) - .attr(TypeImmunityHealAbAttr, Type.WATER) + .attr(TypeImmunityHealAbAttr, PokemonType.WATER) .ignorable(), new Ability(Abilities.OBLIVIOUS, 3) .attr(BattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT ]) @@ -6073,7 +6076,7 @@ export function initAbilities() { .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), new Ability(Abilities.FLASH_FIRE, 3) - .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1) + .attr(TypeImmunityAddBattlerTagAbAttr, PokemonType.FIRE, BattlerTagType.FIRE_BOOST, 1) .ignorable(), new Ability(Abilities.SHIELD_DUST, 3) .attr(IgnoreMoveEffectsAbAttr) @@ -6103,7 +6106,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(AttackTypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !globalScene.arena.getTag(ArenaTagType.GRAVITY)) + .attr(AttackTypeImmunityAbAttr, PokemonType.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !globalScene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), @@ -6116,8 +6119,8 @@ export function initAbilities() { new Ability(Abilities.NATURAL_CURE, 3) .attr(PreSwitchOutResetStatusAbAttr), new Ability(Abilities.LIGHTNING_ROD, 3) - .attr(RedirectTypeMoveAbAttr, Type.ELECTRIC) - .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPATK, 1) + .attr(RedirectTypeMoveAbAttr, PokemonType.ELECTRIC) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.ELECTRIC, Stat.SPATK, 1) .ignorable(), new Ability(Abilities.SERENE_GRACE, 3) .attr(MoveEffectChanceMultiplierAbAttr, 2), @@ -6152,7 +6155,7 @@ export function initAbilities() { .ignorable(), new Ability(Abilities.MAGNET_PULL, 3) .attr(ArenaTrapAbAttr, (user, target) => { - if (target.getTypes(true).includes(Type.STEEL) || (target.getTypes(true).includes(Type.STELLAR) && target.getTypes().includes(Type.STEEL))) { + if (target.getTypes(true).includes(PokemonType.STEEL) || (target.getTypes(true).includes(PokemonType.STELLAR) && target.getTypes().includes(PokemonType.STEEL))) { return true; } return false; @@ -6169,8 +6172,8 @@ export function initAbilities() { .attr(IncreasePpAbAttr) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonPressure", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.THICK_FAT, 3) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.ICE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.ICE, 0.5) .ignorable(), new Ability(Abilities.EARLY_BIRD, 3) .attr(ReduceStatusEffectDurationAbAttr, StatusEffect.SLEEP), @@ -6219,13 +6222,13 @@ export function initAbilities() { new Ability(Abilities.LIQUID_OOZE, 3) .attr(ReverseDrainAbAttr), new Ability(Abilities.OVERGROW, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.GRASS), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.GRASS), new Ability(Abilities.BLAZE, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.FIRE), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.FIRE), new Ability(Abilities.TORRENT, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.WATER), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.WATER), new Ability(Abilities.SWARM, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.BUG), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.BUG), new Ability(Abilities.ROCK_HEAD, 3) .attr(BlockRecoilDamageAttr), new Ability(Abilities.DROUGHT, 3) @@ -6261,7 +6264,7 @@ export function initAbilities() { .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), StatMultiplierAbAttr, Stat.EVA, 2) .ignorable(), new Ability(Abilities.MOTOR_DRIVE, 4) - .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPD, 1) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.ELECTRIC, Stat.SPD, 1) .ignorable(), new Ability(Abilities.RIVALRY, 4) .attr(MovePowerBoostAbAttr, (user, target, move) => user?.gender !== Gender.GENDERLESS && target?.gender !== Gender.GENDERLESS && user?.gender === target?.gender, 1.25, true) @@ -6282,7 +6285,7 @@ export function initAbilities() { .bypassFaint() // Allows reviver seed to activate Unburden .edgeCase(), // Should not restore Unburden boost if Pokemon loses then regains Unburden ability new Ability(Abilities.HEATPROOF, 4) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) .attr(ReduceBurnDamageAbAttr, 0.5) .ignorable(), new Ability(Abilities.SIMPLE, 4) @@ -6291,8 +6294,8 @@ export function initAbilities() { new Ability(Abilities.DRY_SKIN, 4) .attr(PostWeatherLapseDamageAbAttr, 2, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(PostWeatherLapseHealAbAttr, 2, WeatherType.RAIN, WeatherType.HEAVY_RAIN) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 1.25) - .attr(TypeImmunityHealAbAttr, Type.WATER) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 1.25) + .attr(TypeImmunityHealAbAttr, PokemonType.WATER) .ignorable(), new Ability(Abilities.DOWNLOAD, 4) .attr(DownloadAbAttr), @@ -6316,7 +6319,7 @@ export function initAbilities() { .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, StatMultiplierAbAttr, Stat.SPD, 2) .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5), new Ability(Abilities.NORMALIZE, 4) - .attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => { + .attr(MoveTypeChangeAbAttr, PokemonType.NORMAL, 1.2, (user, target, move) => { return ![ Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id); }), new Ability(Abilities.SNIPER, 4) @@ -6363,11 +6366,11 @@ export function initAbilities() { new Ability(Abilities.SLOW_START, 4) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5), new Ability(Abilities.SCRAPPY, 4) - .attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]) + .attr(IgnoreTypeImmunityAbAttr, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]) .attr(IntimidateImmunityAbAttr), new Ability(Abilities.STORM_DRAIN, 4) - .attr(RedirectTypeMoveAbAttr, Type.WATER) - .attr(TypeImmunityStatStageChangeAbAttr, Type.WATER, Stat.SPATK, 1) + .attr(RedirectTypeMoveAbAttr, PokemonType.WATER) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.WATER, Stat.SPATK, 1) .ignorable(), new Ability(Abilities.ICE_BODY, 4) .attr(BlockWeatherDamageAttr, WeatherType.HAIL) @@ -6494,12 +6497,12 @@ export function initAbilities() { new Ability(Abilities.MOXIE, 5) .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1), new Ability(Abilities.JUSTIFIED, 5) - .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.DARK && move.category !== MoveCategory.STATUS, Stat.ATK, 1), + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.DARK && move.category !== MoveCategory.STATUS, Stat.ATK, 1), new Ability(Abilities.RATTLED, 5) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => { const moveType = user.getMoveType(move); return move.category !== MoveCategory.STATUS - && (moveType === Type.DARK || moveType === Type.BUG || moveType === Type.GHOST); + && (moveType === PokemonType.DARK || moveType === PokemonType.BUG || moveType === PokemonType.GHOST); }, Stat.SPD, 1) .attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1), new Ability(Abilities.MAGIC_BOUNCE, 5) @@ -6509,14 +6512,14 @@ export function initAbilities() { // rely on move history .edgeCase(), new Ability(Abilities.SAP_SIPPER, 5) - .attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.GRASS, Stat.ATK, 1) .ignorable(), new Ability(Abilities.PRANKSTER, 5) .attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS, 1), new Ability(Abilities.SAND_FORCE, 5) - .attr(MoveTypePowerBoostAbAttr, Type.ROCK, 1.3) - .attr(MoveTypePowerBoostAbAttr, Type.GROUND, 1.3) - .attr(MoveTypePowerBoostAbAttr, Type.STEEL, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.ROCK, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.GROUND, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.STEEL, 1.3) .attr(BlockWeatherDamageAttr, WeatherType.SANDSTORM) .condition(getWeatherCondition(WeatherType.SANDSTORM)), new Ability(Abilities.IRON_BARBS, 5) @@ -6564,7 +6567,7 @@ export function initAbilities() { new Ability(Abilities.STRONG_JAW, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5), new Ability(Abilities.REFRIGERATE, 6) - .attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.ICE, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SWEET_VEIL, 6) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) @@ -6576,7 +6579,7 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.GALE_WINGS, 6) - .attr(ChangeMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && pokemon.getMoveType(move) === Type.FLYING, 1), + .attr(ChangeMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && pokemon.getMoveType(move) === PokemonType.FLYING, 1), new Ability(Abilities.MEGA_LAUNCHER, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PULSE_MOVE), 1.5), new Ability(Abilities.GRASS_PELT, 6) @@ -6587,23 +6590,23 @@ export function initAbilities() { new Ability(Abilities.TOUGH_CLAWS, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 1.3), new Ability(Abilities.PIXILATE, 6) - .attr(MoveTypeChangeAbAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.FAIRY, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.GOOEY, 6) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), Stat.SPD, -1, false), new Ability(Abilities.AERILATE, 6) - .attr(MoveTypeChangeAbAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.FLYING, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.PARENTAL_BOND, 6) .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonDarkAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), + .attr(FieldMoveTypePowerBoostAbAttr, PokemonType.DARK, 4 / 3), new Ability(Abilities.FAIRY_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonFairyAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), + .attr(FieldMoveTypePowerBoostAbAttr, PokemonType.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) - .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16) + .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, PokemonType.DARK, 9 / 16) + .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, PokemonType.FAIRY, 9 / 16) .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)), PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAuraBreak", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.PRIMORDIAL_SEA, 6) @@ -6630,7 +6633,7 @@ export function initAbilities() { .attr(PostDamageForceSwitchAbAttr) .edgeCase(), // Should not trigger when hurting itself in confusion, causes Fake Out to fail turn 1 and succeed turn 2 if pokemon is switched out before battle start via playing in Switch Mode new Ability(Abilities.WATER_COMPACTION, 7) - .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2), + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2), new Ability(Abilities.MERCILESS, 7) .attr(ConditionalCritAbAttr, (user, target, move) => target?.status?.effect === StatusEffect.TOXIC || target?.status?.effect === StatusEffect.POISON), new Ability(Abilities.SHIELDS_DOWN, 7) @@ -6648,12 +6651,12 @@ export function initAbilities() { new Ability(Abilities.STAKEOUT, 7) .attr(MovePowerBoostAbAttr, (user, target, move) => !!target?.turnData.switchedInThisTurn, 2), new Ability(Abilities.WATER_BUBBLE, 7) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) - .attr(MoveTypePowerBoostAbAttr, Type.WATER, 2) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) + .attr(MoveTypePowerBoostAbAttr, PokemonType.WATER, 2) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .ignorable(), new Ability(Abilities.STEELWORKER, 7) - .attr(MoveTypePowerBoostAbAttr, Type.STEEL), + .attr(MoveTypePowerBoostAbAttr, PokemonType.STEEL), new Ability(Abilities.BERSERK, 7) .attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ Stat.SPATK ], 1) .condition(getSheerForceHitDisableAbCondition()), @@ -6663,11 +6666,11 @@ export function initAbilities() { new Ability(Abilities.LONG_REACH, 7) .attr(IgnoreContactAbAttr), new Ability(Abilities.LIQUID_VOICE, 7) - .attr(MoveTypeChangeAbAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), + .attr(MoveTypeChangeAbAttr, PokemonType.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), new Ability(Abilities.TRIAGE, 7) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.hasFlag(MoveFlags.TRIAGE_MOVE), 3), new Ability(Abilities.GALVANIZE, 7) - .attr(MoveTypeChangeAbAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.ELECTRIC, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SURGE_SURFER, 7) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), StatMultiplierAbAttr, Stat.SPD, 2), new Ability(Abilities.SCHOOLING, 7) @@ -6715,7 +6718,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), new Ability(Abilities.CORROSION, 7) - .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ]) + .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ PokemonType.STEEL, PokemonType.POISON ]) .edgeCase(), // Should poison itself with toxic orb. new Ability(Abilities.COMATOSE, 7) .attr(UncopiableAbilityAbAttr) @@ -6735,7 +6738,7 @@ export function initAbilities() { .attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL ], 1.3), new Ability(Abilities.FLUFFY, 7) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5) - .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE, 2) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.FIRE, 2) .ignorable(), new Ability(Abilities.DAZZLING, 7) .attr(FieldPriorityMoveImmunityAbAttr) @@ -6825,7 +6828,7 @@ export function initAbilities() { .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => { const moveType = user.getMoveType(move); return move.category !== MoveCategory.STATUS - && (moveType === Type.FIRE || moveType === Type.WATER); + && (moveType === PokemonType.FIRE || moveType === PokemonType.WATER); }, Stat.SPD, 6), new Ability(Abilities.PUNK_ROCK, 8) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED), 1.3) @@ -6864,7 +6867,7 @@ export function initAbilities() { new Ability(Abilities.SCREEN_CLEANER, 8) .attr(PostSummonRemoveArenaTagAbAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT ]), new Ability(Abilities.STEELY_SPIRIT, 8) - .attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL), + .attr(UserFieldMoveTypePowerBoostAbAttr, PokemonType.STEEL), new Ability(Abilities.PERISH_BODY, 8) .attr(PostDefendPerishSongAbAttr, 4) .bypassFaint(), @@ -6900,9 +6903,9 @@ export function initAbilities() { new Ability(Abilities.CURIOUS_MEDICINE, 8) .attr(PostSummonClearAllyStatStagesAbAttr), new Ability(Abilities.TRANSISTOR, 8) - .attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC), + .attr(MoveTypePowerBoostAbAttr, PokemonType.ELECTRIC), new Ability(Abilities.DRAGONS_MAW, 8) - .attr(MoveTypePowerBoostAbAttr, Type.DRAGON), + .attr(MoveTypePowerBoostAbAttr, PokemonType.DRAGON), new Ability(Abilities.CHILLING_NEIGH, 8) .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1), new Ability(Abilities.GRIM_NEIGH, 8) @@ -6928,7 +6931,7 @@ export function initAbilities() { .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY) .bypassFaint(), new Ability(Abilities.THERMAL_EXCHANGE, 9) - .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .ignorable(), new Ability(Abilities.ANGER_SHELL, 9) @@ -6937,10 +6940,10 @@ export function initAbilities() { .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.PURIFYING_SALT, 9) .attr(StatusEffectImmunityAbAttr) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.GHOST, 0.5) .ignorable(), new Ability(Abilities.WELL_BAKED_BODY, 9) - .attr(TypeImmunityStatStageChangeAbAttr, Type.FIRE, Stat.DEF, 2) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.FIRE, Stat.DEF, 2) .ignorable(), new Ability(Abilities.WIND_RIDER, 9) .attr(MoveImmunityStatStageChangeAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.WIND_MOVE) && move.category !== MoveCategory.STATUS, Stat.ATK, 1) @@ -6951,7 +6954,7 @@ export function initAbilities() { .attr(ForceSwitchOutImmunityAbAttr) .ignorable(), new Ability(Abilities.ROCKY_PAYLOAD, 9) - .attr(MoveTypePowerBoostAbAttr, Type.ROCK), + .attr(MoveTypePowerBoostAbAttr, PokemonType.ROCK), new Ability(Abilities.WIND_POWER, 9) .attr(PostDefendApplyBattlerTagAbAttr, (target, user, move) => move.hasFlag(MoveFlags.WIND_MOVE), BattlerTagType.CHARGED), new Ability(Abilities.ZERO_TO_HERO, 9) @@ -7026,14 +7029,14 @@ export function initAbilities() { .attr(FieldPriorityMoveImmunityAbAttr) .ignorable(), new Ability(Abilities.EARTH_EATER, 9) - .attr(TypeImmunityHealAbAttr, Type.GROUND) + .attr(TypeImmunityHealAbAttr, PokemonType.GROUND) .ignorable(), new Ability(Abilities.MYCELIUM_MIGHT, 9) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS, -0.2) .attr(PreventBypassSpeedChanceAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS) .attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS), new Ability(Abilities.MINDS_EYE, 9) - .attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]) + .attr(IgnoreTypeImmunityAbAttr, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]) .attr(ProtectStatAbAttr, Stat.ACC) .attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ]) .ignorable(), diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 580ede9596c..4e54c728f09 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,8 +1,10 @@ import { globalScene } from "#app/global-scene"; import type { Arena } from "#app/field/arena"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BooleanHolder, NumberHolder, toDmgValue } from "#app/utils"; -import { MoveCategory, allMoves, MoveTarget } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import { getPokemonNameWithAffix } from "#app/messages"; import type Pokemon from "#app/field/pokemon"; import { HitResult, PokemonMove } from "#app/field/pokemon"; @@ -501,7 +503,7 @@ class WishTag extends ArenaTag { * Abstract class to implement weakened moves of a specific type. */ export class WeakenMoveTypeTag extends ArenaTag { - private weakenedType: Type; + private weakenedType: PokemonType; /** * Creates a new instance of the WeakenMoveTypeTag class. @@ -512,7 +514,7 @@ export class WeakenMoveTypeTag extends ArenaTag { * @param sourceMove - The move that created the tag. * @param sourceId - The ID of the source of the tag. */ - constructor(tagType: ArenaTagType, turnCount: number, type: Type, sourceMove: Moves, sourceId: number) { + constructor(tagType: ArenaTagType, turnCount: number, type: PokemonType, sourceMove: Moves, sourceId: number) { super(tagType, turnCount, sourceMove, sourceId); this.weakenedType = type; @@ -522,11 +524,11 @@ export class WeakenMoveTypeTag extends ArenaTag { * Reduces an attack's power by 0.33x if it matches this tag's weakened type. * @param arena n/a * @param simulated n/a - * @param type the attack's {@linkcode Type} + * @param type the attack's {@linkcode PokemonType} * @param power a {@linkcode NumberHolder} containing the attack's power * @returns `true` if the attack's power was reduced; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, type: Type, power: NumberHolder): boolean { + override apply(arena: Arena, simulated: boolean, type: PokemonType, power: NumberHolder): boolean { if (type === this.weakenedType) { power.value *= 0.33; return true; @@ -541,7 +543,7 @@ export class WeakenMoveTypeTag extends ArenaTag { */ class MudSportTag extends WeakenMoveTypeTag { constructor(turnCount: number, sourceId: number) { - super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId); + super(ArenaTagType.MUD_SPORT, turnCount, PokemonType.ELECTRIC, Moves.MUD_SPORT, sourceId); } onAdd(arena: Arena): void { @@ -559,7 +561,7 @@ class MudSportTag extends WeakenMoveTypeTag { */ class WaterSportTag extends WeakenMoveTypeTag { constructor(turnCount: number, sourceId: number) { - super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId); + super(ArenaTagType.WATER_SPORT, turnCount, PokemonType.FIRE, Moves.WATER_SPORT, sourceId); } onAdd(arena: Arena): void { @@ -592,12 +594,12 @@ export class IonDelugeTag extends ArenaTag { * Converts Normal-type moves to Electric type * @param arena n/a * @param simulated n/a - * @param moveType a {@linkcode NumberHolder} containing a move's {@linkcode Type} + * @param moveType a {@linkcode NumberHolder} containing a move's {@linkcode PokemonType} * @returns `true` if the given move type changed; `false` otherwise. */ override apply(arena: Arena, simulated: boolean, moveType: NumberHolder): boolean { - if (moveType.value === Type.NORMAL) { - moveType.value = Type.ELECTRIC; + if (moveType.value === PokemonType.NORMAL) { + moveType.value = PokemonType.ELECTRIC; return true; } return false; @@ -744,7 +746,7 @@ class ToxicSpikesTag extends ArenaTrapTag { if (simulated) { return true; } - if (pokemon.isOfType(Type.POISON)) { + if (pokemon.isOfType(PokemonType.POISON)) { this.neutralized = true; if (globalScene.arena.removeTag(this.tagType)) { globalScene.queueMessage(i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); @@ -765,7 +767,7 @@ class ToxicSpikesTag extends ArenaTrapTag { if (pokemon.isGrounded() || !pokemon.canSetStatus(StatusEffect.POISON, true)) { return 1; } - if (pokemon.isOfType(Type.POISON)) { + if (pokemon.isOfType(PokemonType.POISON)) { return 1.25; } return super.getMatchupScoreMultiplier(pokemon); @@ -820,7 +822,7 @@ class StealthRockTag extends ArenaTrapTag { } getDamageHpRatio(pokemon: Pokemon): number { - const effectiveness = pokemon.getAttackTypeEffectiveness(Type.ROCK, undefined, true); + const effectiveness = pokemon.getAttackTypeEffectiveness(PokemonType.ROCK, undefined, true); let damageHpRatio: number = 0; @@ -1143,7 +1145,7 @@ class FireGrassPledgeTag extends ArenaTag { ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.filter(pokemon => !pokemon.isOfType(Type.FIRE) && !pokemon.switchOutStatus).forEach(pokemon => { + field.filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus).forEach(pokemon => { // "{pokemonNameWithAffix} was hurt by the sea of fire!" globalScene.queueMessage(i18next.t("arenaTag:fireGrassPledgeLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); // TODO: Replace this with a proper animation diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 5b5e69b4042..8feaa5beb5e 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1,4 +1,4 @@ -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; import type { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; @@ -2024,448 +2024,448 @@ export const biomeTrainerPools: BiomeTrainerPools = { export function initBiomes() { const pokemonBiomes = [ - [ Species.BULBASAUR, Type.GRASS, Type.POISON, [ + [ Species.BULBASAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.IVYSAUR, Type.GRASS, Type.POISON, [ + [ Species.IVYSAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.VENUSAUR, Type.GRASS, Type.POISON, [ + [ Species.VENUSAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CHARMANDER, Type.FIRE, -1, [ + [ Species.CHARMANDER, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CHARMELEON, Type.FIRE, -1, [ + [ Species.CHARMELEON, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CHARIZARD, Type.FIRE, Type.FLYING, [ + [ Species.CHARIZARD, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SQUIRTLE, Type.WATER, -1, [ + [ Species.SQUIRTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.WARTORTLE, Type.WATER, -1, [ + [ Species.WARTORTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.BLASTOISE, Type.WATER, -1, [ + [ Species.BLASTOISE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CATERPIE, Type.BUG, -1, [ + [ Species.CATERPIE, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.METAPOD, Type.BUG, -1, [ + [ Species.METAPOD, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BUTTERFREE, Type.BUG, Type.FLYING, [ + [ Species.BUTTERFREE, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WEEDLE, Type.BUG, Type.POISON, [ + [ Species.WEEDLE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KAKUNA, Type.BUG, Type.POISON, [ + [ Species.KAKUNA, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BEEDRILL, Type.BUG, Type.POISON, [ + [ Species.BEEDRILL, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PIDGEY, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.PIDGEOTTO, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEOTTO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.PIDGEOT, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.RATTATA, Type.NORMAL, -1, [ + [ Species.RATTATA, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.RATICATE, Type.NORMAL, -1, [ + [ Species.RATICATE, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.SPEAROW, Type.NORMAL, Type.FLYING, [ + [ Species.SPEAROW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.FEAROW, Type.NORMAL, Type.FLYING, [ + [ Species.FEAROW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.EKANS, Type.POISON, -1, [ + [ Species.EKANS, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ARBOK, Type.POISON, -1, [ + [ Species.ARBOK, PokemonType.POISON, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PIKACHU, Type.ELECTRIC, -1, [ + [ Species.PIKACHU, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.RAICHU, Type.ELECTRIC, -1, [ + [ Species.RAICHU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.SANDSHREW, Type.GROUND, -1, [ + [ Species.SANDSHREW, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ] ] ], - [ Species.SANDSLASH, Type.GROUND, -1, [ + [ Species.SANDSLASH, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.NIDORAN_F, Type.POISON, -1, [ + [ Species.NIDORAN_F, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDORINA, Type.POISON, -1, [ + [ Species.NIDORINA, PokemonType.POISON, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDOQUEEN, Type.POISON, Type.GROUND, [ + [ Species.NIDOQUEEN, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.NIDORAN_M, Type.POISON, -1, [ + [ Species.NIDORAN_M, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDORINO, Type.POISON, -1, [ + [ Species.NIDORINO, PokemonType.POISON, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDOKING, Type.POISON, Type.GROUND, [ + [ Species.NIDOKING, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.CLEFAIRY, Type.FAIRY, -1, [ + [ Species.CLEFAIRY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ] ] ], - [ Species.CLEFABLE, Type.FAIRY, -1, [ + [ Species.CLEFABLE, PokemonType.FAIRY, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.VULPIX, Type.FIRE, -1, [ + [ Species.VULPIX, PokemonType.FIRE, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.NINETALES, Type.FIRE, -1, [ + [ Species.NINETALES, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.JIGGLYPUFF, Type.NORMAL, Type.FAIRY, [ + [ Species.JIGGLYPUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.WIGGLYTUFF, Type.NORMAL, Type.FAIRY, [ + [ Species.WIGGLYTUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ZUBAT, Type.POISON, Type.FLYING, [ + [ Species.ZUBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLBAT, Type.POISON, Type.FLYING, [ + [ Species.GOLBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.ODDISH, Type.GRASS, Type.POISON, [ + [ Species.ODDISH, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GLOOM, Type.GRASS, Type.POISON, [ + [ Species.GLOOM, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.VILEPLUME, Type.GRASS, Type.POISON, [ + [ Species.VILEPLUME, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PARAS, Type.BUG, Type.GRASS, [ + [ Species.PARAS, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.PARASECT, Type.BUG, Type.GRASS, [ + [ Species.PARASECT, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.VENONAT, Type.BUG, Type.POISON, [ + [ Species.VENONAT, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.VENOMOTH, Type.BUG, Type.POISON, [ + [ Species.VENOMOTH, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.DIGLETT, Type.GROUND, -1, [ + [ Species.DIGLETT, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ Species.DUGTRIO, Type.GROUND, -1, [ + [ Species.DUGTRIO, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.MEOWTH, Type.NORMAL, -1, [ + [ Species.MEOWTH, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PERSIAN, Type.NORMAL, -1, [ + [ Species.PERSIAN, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PSYDUCK, Type.WATER, -1, [ + [ Species.PSYDUCK, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLDUCK, Type.WATER, -1, [ + [ Species.GOLDUCK, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MANKEY, Type.FIGHTING, -1, [ + [ Species.MANKEY, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.PRIMEAPE, Type.FIGHTING, -1, [ + [ Species.PRIMEAPE, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.GROWLITHE, Type.FIRE, -1, [ + [ Species.GROWLITHE, PokemonType.FIRE, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.ARCANINE, Type.FIRE, -1, [ + [ Species.ARCANINE, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.POLIWAG, Type.WATER, -1, [ + [ Species.POLIWAG, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.POLIWHIRL, Type.WATER, -1, [ + [ Species.POLIWHIRL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.POLIWRATH, Type.WATER, Type.FIGHTING, [ + [ Species.POLIWRATH, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.ABRA, Type.PSYCHIC, -1, [ + [ Species.ABRA, PokemonType.PSYCHIC, -1, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KADABRA, Type.PSYCHIC, -1, [ + [ Species.KADABRA, PokemonType.PSYCHIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ALAKAZAM, Type.PSYCHIC, -1, [ + [ Species.ALAKAZAM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.MACHOP, Type.FIGHTING, -1, [ + [ Species.MACHOP, PokemonType.FIGHTING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.MACHOKE, Type.FIGHTING, -1, [ + [ Species.MACHOKE, PokemonType.FIGHTING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.MACHAMP, Type.FIGHTING, -1, [ + [ Species.MACHAMP, PokemonType.FIGHTING, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] ] ], - [ Species.BELLSPROUT, Type.GRASS, Type.POISON, [ + [ Species.BELLSPROUT, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WEEPINBELL, Type.GRASS, Type.POISON, [ + [ Species.WEEPINBELL, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VICTREEBEL, Type.GRASS, Type.POISON, [ + [ Species.VICTREEBEL, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TENTACOOL, Type.WATER, Type.POISON, [ + [ Species.TENTACOOL, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TENTACRUEL, Type.WATER, Type.POISON, [ + [ Species.TENTACRUEL, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.BOSS ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GEODUDE, Type.ROCK, Type.GROUND, [ + [ Species.GEODUDE, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GRAVELER, Type.ROCK, Type.GROUND, [ + [ Species.GRAVELER, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLEM, Type.ROCK, Type.GROUND, [ + [ Species.GOLEM, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.PONYTA, Type.FIRE, -1, [ + [ Species.PONYTA, PokemonType.FIRE, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.RAPIDASH, Type.FIRE, -1, [ + [ Species.RAPIDASH, PokemonType.FIRE, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SLOWPOKE, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWPOKE, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SLOWBRO, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWBRO, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MAGNEMITE, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNEMITE, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.MAGNETON, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNETON, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.FARFETCHD, Type.NORMAL, Type.FLYING, [ + [ Species.FARFETCHD, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DODUO, Type.NORMAL, Type.FLYING, [ + [ Species.DODUO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DODRIO, Type.NORMAL, Type.FLYING, [ + [ Species.DODRIO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SEEL, Type.WATER, -1, [ + [ Species.SEEL, PokemonType.WATER, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.DEWGONG, Type.WATER, Type.ICE, [ + [ Species.DEWGONG, PokemonType.WATER, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.GRIMER, Type.POISON, -1, [ + [ Species.GRIMER, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.MUK, Type.POISON, -1, [ + [ Species.MUK, PokemonType.POISON, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ], @@ -2473,84 +2473,84 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.SHELLDER, Type.WATER, -1, [ + [ Species.SHELLDER, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLOYSTER, Type.WATER, Type.ICE, [ + [ Species.CLOYSTER, PokemonType.WATER, PokemonType.ICE, [ [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GASTLY, Type.GHOST, Type.POISON, [ + [ Species.GASTLY, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.HAUNTER, Type.GHOST, Type.POISON, [ + [ Species.HAUNTER, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.GENGAR, Type.GHOST, Type.POISON, [ + [ Species.GENGAR, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.ONIX, Type.ROCK, Type.GROUND, [ + [ Species.ONIX, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.DROWZEE, Type.PSYCHIC, -1, [ + [ Species.DROWZEE, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.HYPNO, Type.PSYCHIC, -1, [ + [ Species.HYPNO, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.KRABBY, Type.WATER, -1, [ + [ Species.KRABBY, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.KINGLER, Type.WATER, -1, [ + [ Species.KINGLER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.VOLTORB, Type.ELECTRIC, -1, [ + [ Species.VOLTORB, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.ELECTRODE, Type.ELECTRIC, -1, [ + [ Species.ELECTRODE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.EXEGGCUTE, Type.GRASS, Type.PSYCHIC, [ + [ Species.EXEGGCUTE, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.EXEGGUTOR, Type.GRASS, Type.PSYCHIC, [ + [ Species.EXEGGUTOR, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CUBONE, Type.GROUND, -1, [ + [ Species.CUBONE, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MAROWAK, Type.GROUND, -1, [ + [ Species.MAROWAK, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], @@ -2558,143 +2558,143 @@ export function initBiomes() { [ Biome.GRAVEYARD, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY, TimeOfDay.DUSK ]] ] ], - [ Species.HITMONLEE, Type.FIGHTING, -1, [ + [ Species.HITMONLEE, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.HITMONCHAN, Type.FIGHTING, -1, [ + [ Species.HITMONCHAN, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.LICKITUNG, Type.NORMAL, -1, [ + [ Species.LICKITUNG, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.KOFFING, Type.POISON, -1, [ + [ Species.KOFFING, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WEEZING, Type.POISON, -1, [ + [ Species.WEEZING, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.RHYHORN, Type.GROUND, Type.ROCK, [ + [ Species.RHYHORN, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.RHYDON, Type.GROUND, Type.ROCK, [ + [ Species.RHYDON, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CHANSEY, Type.NORMAL, -1, [ + [ Species.CHANSEY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TANGELA, Type.GRASS, -1, [ + [ Species.TANGELA, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KANGASKHAN, Type.NORMAL, -1, [ + [ Species.KANGASKHAN, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HORSEA, Type.WATER, -1, [ + [ Species.HORSEA, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEADRA, Type.WATER, -1, [ + [ Species.SEADRA, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLDEEN, Type.WATER, -1, [ + [ Species.GOLDEEN, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEAKING, Type.WATER, -1, [ + [ Species.SEAKING, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ], [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.STARYU, Type.WATER, -1, [ + [ Species.STARYU, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARMIE, Type.WATER, Type.PSYCHIC, [ + [ Species.STARMIE, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MR_MIME, Type.PSYCHIC, Type.FAIRY, [ + [ Species.MR_MIME, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SCYTHER, Type.BUG, Type.FLYING, [ + [ Species.SCYTHER, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.JYNX, Type.ICE, Type.PSYCHIC, [ + [ Species.JYNX, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ELECTABUZZ, Type.ELECTRIC, -1, [ + [ Species.ELECTABUZZ, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MAGMAR, Type.FIRE, -1, [ + [ Species.MAGMAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PINSIR, Type.BUG, -1, [ + [ Species.PINSIR, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TAUROS, Type.NORMAL, -1, [ + [ Species.TAUROS, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.MAGIKARP, Type.WATER, -1, [ + [ Species.MAGIKARP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.GYARADOS, Type.WATER, Type.FLYING, [ + [ Species.GYARADOS, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.LAPRAS, Type.WATER, Type.ICE, [ + [ Species.LAPRAS, PokemonType.WATER, PokemonType.ICE, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DITTO, Type.NORMAL, -1, [ + [ Species.DITTO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], @@ -2702,164 +2702,164 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.EEVEE, Type.NORMAL, -1, [ + [ Species.EEVEE, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.VAPOREON, Type.WATER, -1, [ + [ Species.VAPOREON, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.JOLTEON, Type.ELECTRIC, -1, [ + [ Species.JOLTEON, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FLAREON, Type.FIRE, -1, [ + [ Species.FLAREON, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PORYGON, Type.NORMAL, -1, [ + [ Species.PORYGON, PokemonType.NORMAL, -1, [ [ Biome.FACTORY, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.OMANYTE, Type.ROCK, Type.WATER, [ + [ Species.OMANYTE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.OMASTAR, Type.ROCK, Type.WATER, [ + [ Species.OMASTAR, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KABUTO, Type.ROCK, Type.WATER, [ + [ Species.KABUTO, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.KABUTOPS, Type.ROCK, Type.WATER, [ + [ Species.KABUTOPS, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.AERODACTYL, Type.ROCK, Type.FLYING, [ + [ Species.AERODACTYL, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNORLAX, Type.NORMAL, -1, [ + [ Species.SNORLAX, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARTICUNO, Type.ICE, Type.FLYING, [ + [ Species.ARTICUNO, PokemonType.ICE, PokemonType.FLYING, [ [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZAPDOS, Type.ELECTRIC, Type.FLYING, [ + [ Species.ZAPDOS, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MOLTRES, Type.FIRE, Type.FLYING, [ + [ Species.MOLTRES, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DRATINI, Type.DRAGON, -1, [ + [ Species.DRATINI, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.DRAGONAIR, Type.DRAGON, -1, [ + [ Species.DRAGONAIR, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.DRAGONITE, Type.DRAGON, Type.FLYING, [ + [ Species.DRAGONITE, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.MEWTWO, Type.PSYCHIC, -1, [ + [ Species.MEWTWO, PokemonType.PSYCHIC, -1, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MEW, Type.PSYCHIC, -1, [ ] + [ Species.MEW, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.CHIKORITA, Type.GRASS, -1, [ + [ Species.CHIKORITA, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.BAYLEEF, Type.GRASS, -1, [ + [ Species.BAYLEEF, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.MEGANIUM, Type.GRASS, -1, [ + [ Species.MEGANIUM, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CYNDAQUIL, Type.FIRE, -1, [ + [ Species.CYNDAQUIL, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.QUILAVA, Type.FIRE, -1, [ + [ Species.QUILAVA, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.TYPHLOSION, Type.FIRE, -1, [ + [ Species.TYPHLOSION, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TOTODILE, Type.WATER, -1, [ + [ Species.TOTODILE, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.CROCONAW, Type.WATER, -1, [ + [ Species.CROCONAW, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.FERALIGATR, Type.WATER, -1, [ + [ Species.FERALIGATR, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SENTRET, Type.NORMAL, -1, [ + [ Species.SENTRET, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FURRET, Type.NORMAL, -1, [ + [ Species.FURRET, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HOOTHOOT, Type.NORMAL, Type.FLYING, [ + [ Species.HOOTHOOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ] ] ], - [ Species.NOCTOWL, Type.NORMAL, Type.FLYING, [ + [ Species.NOCTOWL, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.LEDYBA, Type.BUG, Type.FLYING, [ + [ Species.LEDYBA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAWN ], [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ] ] ], - [ Species.LEDIAN, Type.BUG, Type.FLYING, [ + [ Species.LEDIAN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ], [ Biome.MEADOW, BiomePoolTier.BOSS, TimeOfDay.DAWN ] ] ], - [ Species.SPINARAK, Type.BUG, Type.POISON, [ + [ Species.SPINARAK, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], @@ -2869,7 +2869,7 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.ARIADOS, Type.BUG, Type.POISON, [ + [ Species.ARIADOS, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], @@ -2878,227 +2878,227 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.CROBAT, Type.POISON, Type.FLYING, [ + [ Species.CROBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CHINCHOU, Type.WATER, Type.ELECTRIC, [ + [ Species.CHINCHOU, PokemonType.WATER, PokemonType.ELECTRIC, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.LANTURN, Type.WATER, Type.ELECTRIC, [ + [ Species.LANTURN, PokemonType.WATER, PokemonType.ELECTRIC, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.PICHU, Type.ELECTRIC, -1, [ ] + [ Species.PICHU, PokemonType.ELECTRIC, -1, [ ] ], - [ Species.CLEFFA, Type.FAIRY, -1, [ ] + [ Species.CLEFFA, PokemonType.FAIRY, -1, [ ] ], - [ Species.IGGLYBUFF, Type.NORMAL, Type.FAIRY, [ ] + [ Species.IGGLYBUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ ] ], - [ Species.TOGEPI, Type.FAIRY, -1, [ ] + [ Species.TOGEPI, PokemonType.FAIRY, -1, [ ] ], - [ Species.TOGETIC, Type.FAIRY, Type.FLYING, [ + [ Species.TOGETIC, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.NATU, Type.PSYCHIC, Type.FLYING, [ + [ Species.NATU, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.XATU, Type.PSYCHIC, Type.FLYING, [ + [ Species.XATU, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.MAREEP, Type.ELECTRIC, -1, [ + [ Species.MAREEP, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.RARE ] ] ], - [ Species.FLAAFFY, Type.ELECTRIC, -1, [ + [ Species.FLAAFFY, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.RARE ] ] ], - [ Species.AMPHAROS, Type.ELECTRIC, -1, [ + [ Species.AMPHAROS, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BELLOSSOM, Type.GRASS, -1, [ + [ Species.BELLOSSOM, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MARILL, Type.WATER, Type.FAIRY, [ + [ Species.MARILL, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AZUMARILL, Type.WATER, Type.FAIRY, [ + [ Species.AZUMARILL, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SUDOWOODO, Type.ROCK, -1, [ + [ Species.SUDOWOODO, PokemonType.ROCK, -1, [ [ Biome.GRASS, BiomePoolTier.SUPER_RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POLITOED, Type.WATER, -1, [ + [ Species.POLITOED, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HOPPIP, Type.GRASS, Type.FLYING, [ + [ Species.HOPPIP, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SKIPLOOM, Type.GRASS, Type.FLYING, [ + [ Species.SKIPLOOM, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.JUMPLUFF, Type.GRASS, Type.FLYING, [ + [ Species.JUMPLUFF, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.AIPOM, Type.NORMAL, -1, [ + [ Species.AIPOM, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.SUNKERN, Type.GRASS, -1, [ + [ Species.SUNKERN, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SUNFLORA, Type.GRASS, -1, [ + [ Species.SUNFLORA, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.YANMA, Type.BUG, Type.FLYING, [ + [ Species.YANMA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.WOOPER, Type.WATER, Type.GROUND, [ + [ Species.WOOPER, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.QUAGSIRE, Type.WATER, Type.GROUND, [ + [ Species.QUAGSIRE, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ESPEON, Type.PSYCHIC, -1, [ + [ Species.ESPEON, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, TimeOfDay.DAY ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ] ] ], - [ Species.UMBREON, Type.DARK, -1, [ + [ Species.UMBREON, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.SUPER_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MURKROW, Type.DARK, Type.FLYING, [ + [ Species.MURKROW, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.SLOWKING, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWKING, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MISDREAVUS, Type.GHOST, -1, [ + [ Species.MISDREAVUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.UNOWN, Type.PSYCHIC, -1, [ + [ Species.UNOWN, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.WOBBUFFET, Type.PSYCHIC, -1, [ + [ Species.WOBBUFFET, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GIRAFARIG, Type.NORMAL, Type.PSYCHIC, [ + [ Species.GIRAFARIG, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.PINECO, Type.BUG, -1, [ + [ Species.PINECO, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FORRETRESS, Type.BUG, Type.STEEL, [ + [ Species.FORRETRESS, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DUNSPARCE, Type.NORMAL, -1, [ + [ Species.DUNSPARCE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GLIGAR, Type.GROUND, Type.FLYING, [ + [ Species.GLIGAR, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.RARE ] ] ], - [ Species.STEELIX, Type.STEEL, Type.GROUND, [ + [ Species.STEELIX, PokemonType.STEEL, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNUBBULL, Type.FAIRY, -1, [ + [ Species.SNUBBULL, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GRANBULL, Type.FAIRY, -1, [ + [ Species.GRANBULL, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.QWILFISH, Type.WATER, Type.POISON, [ + [ Species.QWILFISH, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.SCIZOR, Type.BUG, Type.STEEL, [ + [ Species.SCIZOR, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SHUCKLE, Type.BUG, Type.ROCK, [ + [ Species.SHUCKLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HERACROSS, Type.BUG, Type.FIGHTING, [ + [ Species.HERACROSS, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNEASEL, Type.DARK, Type.ICE, [ + [ Species.SNEASEL, PokemonType.DARK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TEDDIURSA, Type.NORMAL, -1, [ + [ Species.TEDDIURSA, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.URSARING, Type.NORMAL, -1, [ + [ Species.URSARING, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ], @@ -3106,926 +3106,926 @@ export function initBiomes() { [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SLUGMA, Type.FIRE, -1, [ + [ Species.SLUGMA, PokemonType.FIRE, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.MAGCARGO, Type.FIRE, Type.ROCK, [ + [ Species.MAGCARGO, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SWINUB, Type.ICE, Type.GROUND, [ + [ Species.SWINUB, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.PILOSWINE, Type.ICE, Type.GROUND, [ + [ Species.PILOSWINE, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.CORSOLA, Type.WATER, Type.ROCK, [ + [ Species.CORSOLA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.REMORAID, Type.WATER, -1, [ + [ Species.REMORAID, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.OCTILLERY, Type.WATER, -1, [ + [ Species.OCTILLERY, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.DELIBIRD, Type.ICE, Type.FLYING, [ + [ Species.DELIBIRD, PokemonType.ICE, PokemonType.FLYING, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.MANTINE, Type.WATER, Type.FLYING, [ + [ Species.MANTINE, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.SKARMORY, Type.STEEL, Type.FLYING, [ + [ Species.SKARMORY, PokemonType.STEEL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.HOUNDOUR, Type.DARK, Type.FIRE, [ + [ Species.HOUNDOUR, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.HOUNDOOM, Type.DARK, Type.FIRE, [ + [ Species.HOUNDOOM, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.KINGDRA, Type.WATER, Type.DRAGON, [ + [ Species.KINGDRA, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PHANPY, Type.GROUND, -1, [ + [ Species.PHANPY, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DONPHAN, Type.GROUND, -1, [ + [ Species.DONPHAN, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PORYGON2, Type.NORMAL, -1, [ + [ Species.PORYGON2, PokemonType.NORMAL, -1, [ [ Biome.FACTORY, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.STANTLER, Type.NORMAL, -1, [ + [ Species.STANTLER, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SMEARGLE, Type.NORMAL, -1, [ + [ Species.SMEARGLE, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TYROGUE, Type.FIGHTING, -1, [ ] + [ Species.TYROGUE, PokemonType.FIGHTING, -1, [ ] ], - [ Species.HITMONTOP, Type.FIGHTING, -1, [ + [ Species.HITMONTOP, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.SMOOCHUM, Type.ICE, Type.PSYCHIC, [ ] + [ Species.SMOOCHUM, PokemonType.ICE, PokemonType.PSYCHIC, [ ] ], - [ Species.ELEKID, Type.ELECTRIC, -1, [ ] + [ Species.ELEKID, PokemonType.ELECTRIC, -1, [ ] ], - [ Species.MAGBY, Type.FIRE, -1, [ ] + [ Species.MAGBY, PokemonType.FIRE, -1, [ ] ], - [ Species.MILTANK, Type.NORMAL, -1, [ + [ Species.MILTANK, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.BLISSEY, Type.NORMAL, -1, [ + [ Species.BLISSEY, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RAIKOU, Type.ELECTRIC, -1, [ + [ Species.RAIKOU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ENTEI, Type.FIRE, -1, [ + [ Species.ENTEI, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SUICUNE, Type.WATER, -1, [ + [ Species.SUICUNE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LARVITAR, Type.ROCK, Type.GROUND, [ + [ Species.LARVITAR, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PUPITAR, Type.ROCK, Type.GROUND, [ + [ Species.PUPITAR, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.TYRANITAR, Type.ROCK, Type.DARK, [ + [ Species.TYRANITAR, PokemonType.ROCK, PokemonType.DARK, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LUGIA, Type.PSYCHIC, Type.FLYING, [ + [ Species.LUGIA, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.HO_OH, Type.FIRE, Type.FLYING, [ + [ Species.HO_OH, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.CELEBI, Type.PSYCHIC, Type.GRASS, [ ] + [ Species.CELEBI, PokemonType.PSYCHIC, PokemonType.GRASS, [ ] ], - [ Species.TREECKO, Type.GRASS, -1, [ + [ Species.TREECKO, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.GROVYLE, Type.GRASS, -1, [ + [ Species.GROVYLE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.SCEPTILE, Type.GRASS, -1, [ + [ Species.SCEPTILE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TORCHIC, Type.FIRE, -1, [ + [ Species.TORCHIC, PokemonType.FIRE, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.COMBUSKEN, Type.FIRE, Type.FIGHTING, [ + [ Species.COMBUSKEN, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.BLAZIKEN, Type.FIRE, Type.FIGHTING, [ + [ Species.BLAZIKEN, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MUDKIP, Type.WATER, -1, [ + [ Species.MUDKIP, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.MARSHTOMP, Type.WATER, Type.GROUND, [ + [ Species.MARSHTOMP, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.SWAMPERT, Type.WATER, Type.GROUND, [ + [ Species.SWAMPERT, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POOCHYENA, Type.DARK, -1, [ + [ Species.POOCHYENA, PokemonType.DARK, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MIGHTYENA, Type.DARK, -1, [ + [ Species.MIGHTYENA, PokemonType.DARK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ZIGZAGOON, Type.NORMAL, -1, [ + [ Species.ZIGZAGOON, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.LINOONE, Type.NORMAL, -1, [ + [ Species.LINOONE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.WURMPLE, Type.BUG, -1, [ + [ Species.WURMPLE, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ] ] ], - [ Species.SILCOON, Type.BUG, -1, [ + [ Species.SILCOON, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.BEAUTIFLY, Type.BUG, Type.FLYING, [ + [ Species.BEAUTIFLY, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.CASCOON, Type.BUG, -1, [ + [ Species.CASCOON, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.DUSTOX, Type.BUG, Type.POISON, [ + [ Species.DUSTOX, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.LOTAD, Type.WATER, Type.GRASS, [ + [ Species.LOTAD, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LOMBRE, Type.WATER, Type.GRASS, [ + [ Species.LOMBRE, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LUDICOLO, Type.WATER, Type.GRASS, [ + [ Species.LUDICOLO, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SEEDOT, Type.GRASS, -1, [ + [ Species.SEEDOT, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.NUZLEAF, Type.GRASS, Type.DARK, [ + [ Species.NUZLEAF, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHIFTRY, Type.GRASS, Type.DARK, [ + [ Species.SHIFTRY, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.TAILLOW, Type.NORMAL, Type.FLYING, [ + [ Species.TAILLOW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWELLOW, Type.NORMAL, Type.FLYING, [ + [ Species.SWELLOW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WINGULL, Type.WATER, Type.FLYING, [ + [ Species.WINGULL, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PELIPPER, Type.WATER, Type.FLYING, [ + [ Species.PELIPPER, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RALTS, Type.PSYCHIC, Type.FAIRY, [ + [ Species.RALTS, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KIRLIA, Type.PSYCHIC, Type.FAIRY, [ + [ Species.KIRLIA, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GARDEVOIR, Type.PSYCHIC, Type.FAIRY, [ + [ Species.GARDEVOIR, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SURSKIT, Type.BUG, Type.WATER, [ + [ Species.SURSKIT, PokemonType.BUG, PokemonType.WATER, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MASQUERAIN, Type.BUG, Type.FLYING, [ + [ Species.MASQUERAIN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.SHROOMISH, Type.GRASS, -1, [ + [ Species.SHROOMISH, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BRELOOM, Type.GRASS, Type.FIGHTING, [ + [ Species.BRELOOM, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SLAKOTH, Type.NORMAL, -1, [ + [ Species.SLAKOTH, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.VIGOROTH, Type.NORMAL, -1, [ + [ Species.VIGOROTH, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SLAKING, Type.NORMAL, -1, [ + [ Species.SLAKING, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.NINCADA, Type.BUG, Type.GROUND, [ + [ Species.NINCADA, PokemonType.BUG, PokemonType.GROUND, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON ] ] ], - [ Species.NINJASK, Type.BUG, Type.FLYING, [ + [ Species.NINJASK, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SHEDINJA, Type.BUG, Type.GHOST, [ + [ Species.SHEDINJA, PokemonType.BUG, PokemonType.GHOST, [ [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.WHISMUR, Type.NORMAL, -1, [ + [ Species.WHISMUR, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.LOUDRED, Type.NORMAL, -1, [ + [ Species.LOUDRED, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.EXPLOUD, Type.NORMAL, -1, [ + [ Species.EXPLOUD, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.MAKUHITA, Type.FIGHTING, -1, [ + [ Species.MAKUHITA, PokemonType.FIGHTING, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.HARIYAMA, Type.FIGHTING, -1, [ + [ Species.HARIYAMA, PokemonType.FIGHTING, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.AZURILL, Type.NORMAL, Type.FAIRY, [ ] + [ Species.AZURILL, PokemonType.NORMAL, PokemonType.FAIRY, [ ] ], - [ Species.NOSEPASS, Type.ROCK, -1, [ + [ Species.NOSEPASS, PokemonType.ROCK, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SKITTY, Type.NORMAL, -1, [ + [ Species.SKITTY, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DELCATTY, Type.NORMAL, -1, [ + [ Species.DELCATTY, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SABLEYE, Type.DARK, Type.GHOST, [ + [ Species.SABLEYE, PokemonType.DARK, PokemonType.GHOST, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.MAWILE, Type.STEEL, Type.FAIRY, [ + [ Species.MAWILE, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ARON, Type.STEEL, Type.ROCK, [ + [ Species.ARON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LAIRON, Type.STEEL, Type.ROCK, [ + [ Species.LAIRON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.AGGRON, Type.STEEL, Type.ROCK, [ + [ Species.AGGRON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.MEDITITE, Type.FIGHTING, Type.PSYCHIC, [ + [ Species.MEDITITE, PokemonType.FIGHTING, PokemonType.PSYCHIC, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.MEDICHAM, Type.FIGHTING, Type.PSYCHIC, [ + [ Species.MEDICHAM, PokemonType.FIGHTING, PokemonType.PSYCHIC, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.ELECTRIKE, Type.ELECTRIC, -1, [ + [ Species.ELECTRIKE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.MANECTRIC, Type.ELECTRIC, -1, [ + [ Species.MANECTRIC, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.PLUSLE, Type.ELECTRIC, -1, [ + [ Species.PLUSLE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MINUN, Type.ELECTRIC, -1, [ + [ Species.MINUN, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.VOLBEAT, Type.BUG, -1, [ + [ Species.VOLBEAT, PokemonType.BUG, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] ] ], - [ Species.ILLUMISE, Type.BUG, -1, [ + [ Species.ILLUMISE, PokemonType.BUG, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] ] ], - [ Species.ROSELIA, Type.GRASS, Type.POISON, [ + [ Species.ROSELIA, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GULPIN, Type.POISON, -1, [ + [ Species.GULPIN, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.SWALOT, Type.POISON, -1, [ + [ Species.SWALOT, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.CARVANHA, Type.WATER, Type.DARK, [ + [ Species.CARVANHA, PokemonType.WATER, PokemonType.DARK, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHARPEDO, Type.WATER, Type.DARK, [ + [ Species.SHARPEDO, PokemonType.WATER, PokemonType.DARK, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WAILMER, Type.WATER, -1, [ + [ Species.WAILMER, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WAILORD, Type.WATER, -1, [ + [ Species.WAILORD, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.NUMEL, Type.FIRE, Type.GROUND, [ + [ Species.NUMEL, PokemonType.FIRE, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.CAMERUPT, Type.FIRE, Type.GROUND, [ + [ Species.CAMERUPT, PokemonType.FIRE, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TORKOAL, Type.FIRE, -1, [ + [ Species.TORKOAL, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SPOINK, Type.PSYCHIC, -1, [ + [ Species.SPOINK, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.GRUMPIG, Type.PSYCHIC, -1, [ + [ Species.GRUMPIG, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.SPINDA, Type.NORMAL, -1, [ + [ Species.SPINDA, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.TRAPINCH, Type.GROUND, -1, [ + [ Species.TRAPINCH, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VIBRAVA, Type.GROUND, Type.DRAGON, [ + [ Species.VIBRAVA, PokemonType.GROUND, PokemonType.DRAGON, [ [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.FLYGON, Type.GROUND, Type.DRAGON, [ + [ Species.FLYGON, PokemonType.GROUND, PokemonType.DRAGON, [ [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.CACNEA, Type.GRASS, -1, [ + [ Species.CACNEA, PokemonType.GRASS, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.CACTURNE, Type.GRASS, Type.DARK, [ + [ Species.CACTURNE, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SWABLU, Type.NORMAL, Type.FLYING, [ + [ Species.SWABLU, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ALTARIA, Type.DRAGON, Type.FLYING, [ + [ Species.ALTARIA, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ZANGOOSE, Type.NORMAL, -1, [ + [ Species.ZANGOOSE, PokemonType.NORMAL, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SEVIPER, Type.POISON, -1, [ + [ Species.SEVIPER, PokemonType.POISON, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.LUNATONE, Type.ROCK, Type.PSYCHIC, [ + [ Species.LUNATONE, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.SOLROCK, Type.ROCK, Type.PSYCHIC, [ + [ Species.SOLROCK, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.DAY ], [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.BARBOACH, Type.WATER, Type.GROUND, [ + [ Species.BARBOACH, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WHISCASH, Type.WATER, Type.GROUND, [ + [ Species.WHISCASH, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.CORPHISH, Type.WATER, -1, [ + [ Species.CORPHISH, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.CRAWDAUNT, Type.WATER, Type.DARK, [ + [ Species.CRAWDAUNT, PokemonType.WATER, PokemonType.DARK, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.BALTOY, Type.GROUND, Type.PSYCHIC, [ + [ Species.BALTOY, PokemonType.GROUND, PokemonType.PSYCHIC, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLAYDOL, Type.GROUND, Type.PSYCHIC, [ + [ Species.CLAYDOL, PokemonType.GROUND, PokemonType.PSYCHIC, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LILEEP, Type.ROCK, Type.GRASS, [ + [ Species.LILEEP, PokemonType.ROCK, PokemonType.GRASS, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.CRADILY, Type.ROCK, Type.GRASS, [ + [ Species.CRADILY, PokemonType.ROCK, PokemonType.GRASS, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ANORITH, Type.ROCK, Type.BUG, [ + [ Species.ANORITH, PokemonType.ROCK, PokemonType.BUG, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.ARMALDO, Type.ROCK, Type.BUG, [ + [ Species.ARMALDO, PokemonType.ROCK, PokemonType.BUG, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FEEBAS, Type.WATER, -1, [ + [ Species.FEEBAS, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.MILOTIC, Type.WATER, -1, [ + [ Species.MILOTIC, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CASTFORM, Type.NORMAL, -1, [ + [ Species.CASTFORM, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.ULTRA_RARE ], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KECLEON, Type.NORMAL, -1, [ + [ Species.KECLEON, PokemonType.NORMAL, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SHUPPET, Type.GHOST, -1, [ + [ Species.SHUPPET, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.BANETTE, Type.GHOST, -1, [ + [ Species.BANETTE, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.DUSKULL, Type.GHOST, -1, [ + [ Species.DUSKULL, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.DUSCLOPS, Type.GHOST, -1, [ + [ Species.DUSCLOPS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.TROPIUS, Type.GRASS, Type.FLYING, [ + [ Species.TROPIUS, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CHIMECHO, Type.PSYCHIC, -1, [ + [ Species.CHIMECHO, PokemonType.PSYCHIC, -1, [ [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.ABSOL, Type.DARK, -1, [ + [ Species.ABSOL, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.WYNAUT, Type.PSYCHIC, -1, [ ] + [ Species.WYNAUT, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.SNORUNT, Type.ICE, -1, [ + [ Species.SNORUNT, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GLALIE, Type.ICE, -1, [ + [ Species.GLALIE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SPHEAL, Type.ICE, Type.WATER, [ + [ Species.SPHEAL, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEALEO, Type.ICE, Type.WATER, [ + [ Species.SEALEO, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WALREIN, Type.ICE, Type.WATER, [ + [ Species.WALREIN, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CLAMPERL, Type.WATER, -1, [ + [ Species.CLAMPERL, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.HUNTAIL, Type.WATER, -1, [ + [ Species.HUNTAIL, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.GOREBYSS, Type.WATER, -1, [ + [ Species.GOREBYSS, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.RELICANTH, Type.WATER, Type.ROCK, [ + [ Species.RELICANTH, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LUVDISC, Type.WATER, -1, [ + [ Species.LUVDISC, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.BAGON, Type.DRAGON, -1, [ + [ Species.BAGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SHELGON, Type.DRAGON, -1, [ + [ Species.SHELGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SALAMENCE, Type.DRAGON, Type.FLYING, [ + [ Species.SALAMENCE, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BELDUM, Type.STEEL, Type.PSYCHIC, [ + [ Species.BELDUM, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.METANG, Type.STEEL, Type.PSYCHIC, [ + [ Species.METANG, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.METAGROSS, Type.STEEL, Type.PSYCHIC, [ + [ Species.METAGROSS, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.REGIROCK, Type.ROCK, -1, [ + [ Species.REGIROCK, PokemonType.ROCK, -1, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGICE, Type.ICE, -1, [ + [ Species.REGICE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGISTEEL, Type.STEEL, -1, [ + [ Species.REGISTEEL, PokemonType.STEEL, -1, [ [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LATIAS, Type.DRAGON, Type.PSYCHIC, [ + [ Species.LATIAS, PokemonType.DRAGON, PokemonType.PSYCHIC, [ [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LATIOS, Type.DRAGON, Type.PSYCHIC, [ + [ Species.LATIOS, PokemonType.DRAGON, PokemonType.PSYCHIC, [ [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KYOGRE, Type.WATER, -1, [ + [ Species.KYOGRE, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GROUDON, Type.GROUND, -1, [ + [ Species.GROUDON, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.RAYQUAZA, Type.DRAGON, Type.FLYING, [ + [ Species.RAYQUAZA, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.JIRACHI, Type.STEEL, Type.PSYCHIC, [ ] + [ Species.JIRACHI, PokemonType.STEEL, PokemonType.PSYCHIC, [ ] ], - [ Species.DEOXYS, Type.PSYCHIC, -1, [ ] + [ Species.DEOXYS, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.TURTWIG, Type.GRASS, -1, [ + [ Species.TURTWIG, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.GROTLE, Type.GRASS, -1, [ + [ Species.GROTLE, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.TORTERRA, Type.GRASS, Type.GROUND, [ + [ Species.TORTERRA, PokemonType.GRASS, PokemonType.GROUND, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CHIMCHAR, Type.FIRE, -1, [ + [ Species.CHIMCHAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.MONFERNO, Type.FIRE, Type.FIGHTING, [ + [ Species.MONFERNO, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.INFERNAPE, Type.FIRE, Type.FIGHTING, [ + [ Species.INFERNAPE, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PIPLUP, Type.WATER, -1, [ + [ Species.PIPLUP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.PRINPLUP, Type.WATER, -1, [ + [ Species.PRINPLUP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.EMPOLEON, Type.WATER, Type.STEEL, [ + [ Species.EMPOLEON, PokemonType.WATER, PokemonType.STEEL, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.STARLY, Type.NORMAL, Type.FLYING, [ + [ Species.STARLY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARAVIA, Type.NORMAL, Type.FLYING, [ + [ Species.STARAVIA, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARAPTOR, Type.NORMAL, Type.FLYING, [ + [ Species.STARAPTOR, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BIDOOF, Type.NORMAL, -1, [ + [ Species.BIDOOF, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ] ] ], - [ Species.BIBAREL, Type.NORMAL, Type.WATER, [ + [ Species.BIBAREL, PokemonType.NORMAL, PokemonType.WATER, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.KRICKETOT, Type.BUG, -1, [ + [ Species.KRICKETOT, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KRICKETUNE, Type.BUG, -1, [ + [ Species.KRICKETUNE, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHINX, Type.ELECTRIC, -1, [ + [ Species.SHINX, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.LUXIO, Type.ELECTRIC, -1, [ + [ Species.LUXIO, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.LUXRAY, Type.ELECTRIC, -1, [ + [ Species.LUXRAY, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.BUDEW, Type.GRASS, Type.POISON, [ ] + [ Species.BUDEW, PokemonType.GRASS, PokemonType.POISON, [ ] ], - [ Species.ROSERADE, Type.GRASS, Type.POISON, [ + [ Species.ROSERADE, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CRANIDOS, Type.ROCK, -1, [ + [ Species.CRANIDOS, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.RAMPARDOS, Type.ROCK, -1, [ + [ Species.RAMPARDOS, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SHIELDON, Type.ROCK, Type.STEEL, [ + [ Species.SHIELDON, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.BASTIODON, Type.ROCK, Type.STEEL, [ + [ Species.BASTIODON, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BURMY, Type.BUG, -1, [ + [ Species.BURMY, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.SLUM, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WORMADAM, Type.BUG, Type.GRASS, [ + [ Species.WORMADAM, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ], [ Biome.BEACH, BiomePoolTier.UNCOMMON ], @@ -4034,122 +4034,122 @@ export function initBiomes() { [ Biome.SLUM, BiomePoolTier.BOSS ] ] ], - [ Species.MOTHIM, Type.BUG, Type.FLYING, [ + [ Species.MOTHIM, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.COMBEE, Type.BUG, Type.FLYING, [ + [ Species.COMBEE, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VESPIQUEN, Type.BUG, Type.FLYING, [ + [ Species.VESPIQUEN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PACHIRISU, Type.ELECTRIC, -1, [ + [ Species.PACHIRISU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BUIZEL, Type.WATER, -1, [ + [ Species.BUIZEL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ] ] ], - [ Species.FLOATZEL, Type.WATER, -1, [ + [ Species.FLOATZEL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.BOSS ] ] ], - [ Species.CHERUBI, Type.GRASS, -1, [ + [ Species.CHERUBI, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CHERRIM, Type.GRASS, -1, [ + [ Species.CHERRIM, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SHELLOS, Type.WATER, -1, [ + [ Species.SHELLOS, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GASTRODON, Type.WATER, Type.GROUND, [ + [ Species.GASTRODON, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.AMBIPOM, Type.NORMAL, -1, [ + [ Species.AMBIPOM, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.DRIFLOON, Type.GHOST, Type.FLYING, [ + [ Species.DRIFLOON, PokemonType.GHOST, PokemonType.FLYING, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.DRIFBLIM, Type.GHOST, Type.FLYING, [ + [ Species.DRIFBLIM, PokemonType.GHOST, PokemonType.FLYING, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BUNEARY, Type.NORMAL, -1, [ + [ Species.BUNEARY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ] ] ], - [ Species.LOPUNNY, Type.NORMAL, -1, [ + [ Species.LOPUNNY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.MISMAGIUS, Type.GHOST, -1, [ + [ Species.MISMAGIUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.HONCHKROW, Type.DARK, Type.FLYING, [ + [ Species.HONCHKROW, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GLAMEOW, Type.NORMAL, -1, [ + [ Species.GLAMEOW, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PURUGLY, Type.NORMAL, -1, [ + [ Species.PURUGLY, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.CHINGLING, Type.PSYCHIC, -1, [ + [ Species.CHINGLING, PokemonType.PSYCHIC, -1, [ [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.STUNKY, Type.POISON, Type.DARK, [ + [ Species.STUNKY, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SKUNTANK, Type.POISON, Type.DARK, [ + [ Species.SKUNTANK, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BRONZOR, Type.STEEL, Type.PSYCHIC, [ + [ Species.BRONZOR, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.BRONZONG, Type.STEEL, Type.PSYCHIC, [ + [ Species.BRONZONG, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ], @@ -4157,186 +4157,186 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.BONSLY, Type.ROCK, -1, [ ] + [ Species.BONSLY, PokemonType.ROCK, -1, [ ] ], - [ Species.MIME_JR, Type.PSYCHIC, Type.FAIRY, [ ] + [ Species.MIME_JR, PokemonType.PSYCHIC, PokemonType.FAIRY, [ ] ], - [ Species.HAPPINY, Type.NORMAL, -1, [ ] + [ Species.HAPPINY, PokemonType.NORMAL, -1, [ ] ], - [ Species.CHATOT, Type.NORMAL, Type.FLYING, [ + [ Species.CHATOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.SPIRITOMB, Type.GHOST, Type.DARK, [ + [ Species.SPIRITOMB, PokemonType.GHOST, PokemonType.DARK, [ [ Biome.GRAVEYARD, BiomePoolTier.SUPER_RARE ], [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GIBLE, Type.DRAGON, Type.GROUND, [ + [ Species.GIBLE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.GABITE, Type.DRAGON, Type.GROUND, [ + [ Species.GABITE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.GARCHOMP, Type.DRAGON, Type.GROUND, [ + [ Species.GARCHOMP, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.MUNCHLAX, Type.NORMAL, -1, [ ] + [ Species.MUNCHLAX, PokemonType.NORMAL, -1, [ ] ], - [ Species.RIOLU, Type.FIGHTING, -1, [ ] + [ Species.RIOLU, PokemonType.FIGHTING, -1, [ ] ], - [ Species.LUCARIO, Type.FIGHTING, Type.STEEL, [ + [ Species.LUCARIO, PokemonType.FIGHTING, PokemonType.STEEL, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.HIPPOPOTAS, Type.GROUND, -1, [ + [ Species.HIPPOPOTAS, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HIPPOWDON, Type.GROUND, -1, [ + [ Species.HIPPOWDON, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SKORUPI, Type.POISON, Type.BUG, [ + [ Species.SKORUPI, PokemonType.POISON, PokemonType.BUG, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DRAPION, Type.POISON, Type.DARK, [ + [ Species.DRAPION, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CROAGUNK, Type.POISON, Type.FIGHTING, [ + [ Species.CROAGUNK, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TOXICROAK, Type.POISON, Type.FIGHTING, [ + [ Species.TOXICROAK, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.CARNIVINE, Type.GRASS, -1, [ + [ Species.CARNIVINE, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FINNEON, Type.WATER, -1, [ + [ Species.FINNEON, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.LUMINEON, Type.WATER, -1, [ + [ Species.LUMINEON, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.SEA, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.MANTYKE, Type.WATER, Type.FLYING, [ + [ Species.MANTYKE, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.SNOVER, Type.GRASS, Type.ICE, [ + [ Species.SNOVER, PokemonType.GRASS, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.ABOMASNOW, Type.GRASS, Type.ICE, [ + [ Species.ABOMASNOW, PokemonType.GRASS, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.WEAVILE, Type.DARK, Type.ICE, [ + [ Species.WEAVILE, PokemonType.DARK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.MAGNEZONE, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNEZONE, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.LICKILICKY, Type.NORMAL, -1, [ + [ Species.LICKILICKY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RHYPERIOR, Type.GROUND, Type.ROCK, [ + [ Species.RHYPERIOR, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.TANGROWTH, Type.GRASS, -1, [ + [ Species.TANGROWTH, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ELECTIVIRE, Type.ELECTRIC, -1, [ + [ Species.ELECTIVIRE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.MAGMORTAR, Type.FIRE, -1, [ + [ Species.MAGMORTAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TOGEKISS, Type.FAIRY, Type.FLYING, [ + [ Species.TOGEKISS, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.YANMEGA, Type.BUG, Type.FLYING, [ + [ Species.YANMEGA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.LEAFEON, Type.GRASS, -1, [ + [ Species.LEAFEON, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GLACEON, Type.ICE, -1, [ + [ Species.GLACEON, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GLISCOR, Type.GROUND, Type.FLYING, [ + [ Species.GLISCOR, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.MAMOSWINE, Type.ICE, Type.GROUND, [ + [ Species.MAMOSWINE, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.PORYGON_Z, Type.NORMAL, -1, [ + [ Species.PORYGON_Z, PokemonType.NORMAL, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS_RARE ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.GALLADE, Type.PSYCHIC, Type.FIGHTING, [ + [ Species.GALLADE, PokemonType.PSYCHIC, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PROBOPASS, Type.ROCK, Type.STEEL, [ + [ Species.PROBOPASS, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DUSKNOIR, Type.GHOST, -1, [ + [ Species.DUSKNOIR, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.FROSLASS, Type.ICE, Type.GHOST, [ + [ Species.FROSLASS, PokemonType.ICE, PokemonType.GHOST, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ROTOM, Type.ELECTRIC, Type.GHOST, [ + [ Species.ROTOM, PokemonType.ELECTRIC, PokemonType.GHOST, [ [ Biome.LABORATORY, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], @@ -4351,104 +4351,104 @@ export function initBiomes() { [ Biome.TALL_GRASS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.UXIE, Type.PSYCHIC, -1, [ + [ Species.UXIE, PokemonType.PSYCHIC, -1, [ [ Biome.CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MESPRIT, Type.PSYCHIC, -1, [ + [ Species.MESPRIT, PokemonType.PSYCHIC, -1, [ [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.AZELF, Type.PSYCHIC, -1, [ + [ Species.AZELF, PokemonType.PSYCHIC, -1, [ [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DIALGA, Type.STEEL, Type.DRAGON, [ + [ Species.DIALGA, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.PALKIA, Type.WATER, Type.DRAGON, [ + [ Species.PALKIA, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.HEATRAN, Type.FIRE, Type.STEEL, [ + [ Species.HEATRAN, PokemonType.FIRE, PokemonType.STEEL, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIGIGAS, Type.NORMAL, -1, [ + [ Species.REGIGIGAS, PokemonType.NORMAL, -1, [ [ Biome.TEMPLE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GIRATINA, Type.GHOST, Type.DRAGON, [ + [ Species.GIRATINA, PokemonType.GHOST, PokemonType.DRAGON, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.CRESSELIA, Type.PSYCHIC, -1, [ + [ Species.CRESSELIA, PokemonType.PSYCHIC, -1, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.PHIONE, Type.WATER, -1, [ ] + [ Species.PHIONE, PokemonType.WATER, -1, [ ] ], - [ Species.MANAPHY, Type.WATER, -1, [ ] + [ Species.MANAPHY, PokemonType.WATER, -1, [ ] ], - [ Species.DARKRAI, Type.DARK, -1, [ + [ Species.DARKRAI, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SHAYMIN, Type.GRASS, -1, [ + [ Species.SHAYMIN, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ARCEUS, Type.NORMAL, -1, [ ] + [ Species.ARCEUS, PokemonType.NORMAL, -1, [ ] ], - [ Species.VICTINI, Type.PSYCHIC, Type.FIRE, [ ] + [ Species.VICTINI, PokemonType.PSYCHIC, PokemonType.FIRE, [ ] ], - [ Species.SNIVY, Type.GRASS, -1, [ + [ Species.SNIVY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SERVINE, Type.GRASS, -1, [ + [ Species.SERVINE, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SERPERIOR, Type.GRASS, -1, [ + [ Species.SERPERIOR, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TEPIG, Type.FIRE, -1, [ + [ Species.TEPIG, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.PIGNITE, Type.FIRE, Type.FIGHTING, [ + [ Species.PIGNITE, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.EMBOAR, Type.FIRE, Type.FIGHTING, [ + [ Species.EMBOAR, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.OSHAWOTT, Type.WATER, -1, [ + [ Species.OSHAWOTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.DEWOTT, Type.WATER, -1, [ + [ Species.DEWOTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.SAMUROTT, Type.WATER, -1, [ + [ Species.SAMUROTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PATRAT, Type.NORMAL, -1, [ + [ Species.PATRAT, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], @@ -4456,437 +4456,437 @@ export function initBiomes() { [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WATCHOG, Type.NORMAL, -1, [ + [ Species.WATCHOG, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LILLIPUP, Type.NORMAL, -1, [ + [ Species.LILLIPUP, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.HERDIER, Type.NORMAL, -1, [ + [ Species.HERDIER, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.STOUTLAND, Type.NORMAL, -1, [ + [ Species.STOUTLAND, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.PURRLOIN, Type.DARK, -1, [ + [ Species.PURRLOIN, PokemonType.DARK, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LIEPARD, Type.DARK, -1, [ + [ Species.LIEPARD, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PANSAGE, Type.GRASS, -1, [ + [ Species.PANSAGE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMISAGE, Type.GRASS, -1, [ + [ Species.SIMISAGE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PANSEAR, Type.FIRE, -1, [ + [ Species.PANSEAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMISEAR, Type.FIRE, -1, [ + [ Species.SIMISEAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PANPOUR, Type.WATER, -1, [ + [ Species.PANPOUR, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMIPOUR, Type.WATER, -1, [ + [ Species.SIMIPOUR, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEA, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MUNNA, Type.PSYCHIC, -1, [ + [ Species.MUNNA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.COMMON ] ] ], - [ Species.MUSHARNA, Type.PSYCHIC, -1, [ + [ Species.MUSHARNA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.PIDOVE, Type.NORMAL, Type.FLYING, [ + [ Species.PIDOVE, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TRANQUILL, Type.NORMAL, Type.FLYING, [ + [ Species.TRANQUILL, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.UNFEZANT, Type.NORMAL, Type.FLYING, [ + [ Species.UNFEZANT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BLITZLE, Type.ELECTRIC, -1, [ + [ Species.BLITZLE, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.ZEBSTRIKA, Type.ELECTRIC, -1, [ + [ Species.ZEBSTRIKA, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.ROGGENROLA, Type.ROCK, -1, [ + [ Species.ROGGENROLA, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.BOLDORE, Type.ROCK, -1, [ + [ Species.BOLDORE, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GIGALITH, Type.ROCK, -1, [ + [ Species.GIGALITH, PokemonType.ROCK, -1, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.WOOBAT, Type.PSYCHIC, Type.FLYING, [ + [ Species.WOOBAT, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SWOOBAT, Type.PSYCHIC, Type.FLYING, [ + [ Species.SWOOBAT, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DRILBUR, Type.GROUND, -1, [ + [ Species.DRILBUR, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.EXCADRILL, Type.GROUND, Type.STEEL, [ + [ Species.EXCADRILL, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.AUDINO, Type.NORMAL, -1, [ + [ Species.AUDINO, PokemonType.NORMAL, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.TIMBURR, Type.FIGHTING, -1, [ + [ Species.TIMBURR, PokemonType.FIGHTING, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.GURDURR, Type.FIGHTING, -1, [ + [ Species.GURDURR, PokemonType.FIGHTING, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.CONKELDURR, Type.FIGHTING, -1, [ + [ Species.CONKELDURR, PokemonType.FIGHTING, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] ] ], - [ Species.TYMPOLE, Type.WATER, -1, [ + [ Species.TYMPOLE, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.PALPITOAD, Type.WATER, Type.GROUND, [ + [ Species.PALPITOAD, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.SEISMITOAD, Type.WATER, Type.GROUND, [ + [ Species.SEISMITOAD, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.THROH, Type.FIGHTING, -1, [ + [ Species.THROH, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SAWK, Type.FIGHTING, -1, [ + [ Species.SAWK, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SEWADDLE, Type.BUG, Type.GRASS, [ + [ Species.SEWADDLE, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWADLOON, Type.BUG, Type.GRASS, [ + [ Species.SWADLOON, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LEAVANNY, Type.BUG, Type.GRASS, [ + [ Species.LEAVANNY, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VENIPEDE, Type.BUG, Type.POISON, [ + [ Species.VENIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WHIRLIPEDE, Type.BUG, Type.POISON, [ + [ Species.WHIRLIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SCOLIPEDE, Type.BUG, Type.POISON, [ + [ Species.SCOLIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.COTTONEE, Type.GRASS, Type.FAIRY, [ + [ Species.COTTONEE, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WHIMSICOTT, Type.GRASS, Type.FAIRY, [ + [ Species.WHIMSICOTT, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PETILIL, Type.GRASS, -1, [ + [ Species.PETILIL, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LILLIGANT, Type.GRASS, -1, [ + [ Species.LILLIGANT, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BASCULIN, Type.WATER, -1, [ + [ Species.BASCULIN, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.SANDILE, Type.GROUND, Type.DARK, [ + [ Species.SANDILE, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KROKOROK, Type.GROUND, Type.DARK, [ + [ Species.KROKOROK, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KROOKODILE, Type.GROUND, Type.DARK, [ + [ Species.KROOKODILE, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DARUMAKA, Type.FIRE, -1, [ + [ Species.DARUMAKA, PokemonType.FIRE, -1, [ [ Biome.DESERT, BiomePoolTier.RARE ] ] ], - [ Species.DARMANITAN, Type.FIRE, -1, [ + [ Species.DARMANITAN, PokemonType.FIRE, -1, [ [ Biome.DESERT, BiomePoolTier.RARE ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.MARACTUS, Type.GRASS, -1, [ + [ Species.MARACTUS, PokemonType.GRASS, -1, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.DWEBBLE, Type.BUG, Type.ROCK, [ + [ Species.DWEBBLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.CRUSTLE, Type.BUG, Type.ROCK, [ + [ Species.CRUSTLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.SCRAGGY, Type.DARK, Type.FIGHTING, [ + [ Species.SCRAGGY, PokemonType.DARK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SCRAFTY, Type.DARK, Type.FIGHTING, [ + [ Species.SCRAFTY, PokemonType.DARK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIGILYPH, Type.PSYCHIC, Type.FLYING, [ + [ Species.SIGILYPH, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.YAMASK, Type.GHOST, -1, [ + [ Species.YAMASK, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.COFAGRIGUS, Type.GHOST, -1, [ + [ Species.COFAGRIGUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.TIRTOUGA, Type.WATER, Type.ROCK, [ + [ Species.TIRTOUGA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.CARRACOSTA, Type.WATER, Type.ROCK, [ + [ Species.CARRACOSTA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCHEN, Type.ROCK, Type.FLYING, [ + [ Species.ARCHEN, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.ARCHEOPS, Type.ROCK, Type.FLYING, [ + [ Species.ARCHEOPS, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.RUINS, BiomePoolTier.SUPER_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TRUBBISH, Type.POISON, -1, [ + [ Species.TRUBBISH, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.GARBODOR, Type.POISON, -1, [ + [ Species.GARBODOR, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ] ] ], - [ Species.ZORUA, Type.DARK, -1, [ + [ Species.ZORUA, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.ZOROARK, Type.DARK, -1, [ + [ Species.ZOROARK, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.MINCCINO, Type.NORMAL, -1, [ + [ Species.MINCCINO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CINCCINO, Type.NORMAL, -1, [ + [ Species.CINCCINO, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GOTHITA, Type.PSYCHIC, -1, [ + [ Species.GOTHITA, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.GOTHORITA, Type.PSYCHIC, -1, [ + [ Species.GOTHORITA, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.GOTHITELLE, Type.PSYCHIC, -1, [ + [ Species.GOTHITELLE, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.SOLOSIS, Type.PSYCHIC, -1, [ + [ Species.SOLOSIS, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DUOSION, Type.PSYCHIC, -1, [ + [ Species.DUOSION, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] ] ], - [ Species.REUNICLUS, Type.PSYCHIC, -1, [ + [ Species.REUNICLUS, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.DUCKLETT, Type.WATER, Type.FLYING, [ + [ Species.DUCKLETT, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWANNA, Type.WATER, Type.FLYING, [ + [ Species.SWANNA, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VANILLITE, Type.ICE, -1, [ + [ Species.VANILLITE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.VANILLISH, Type.ICE, -1, [ + [ Species.VANILLISH, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.VANILLUXE, Type.ICE, -1, [ + [ Species.VANILLUXE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DEERLING, Type.NORMAL, Type.GRASS, [ + [ Species.DEERLING, PokemonType.NORMAL, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SAWSBUCK, Type.NORMAL, Type.GRASS, [ + [ Species.SAWSBUCK, PokemonType.NORMAL, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.EMOLGA, Type.ELECTRIC, Type.FLYING, [ + [ Species.EMOLGA, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KARRABLAST, Type.BUG, -1, [ + [ Species.KARRABLAST, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ESCAVALIER, Type.BUG, Type.STEEL, [ + [ Species.ESCAVALIER, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FOONGUS, Type.GRASS, Type.POISON, [ + [ Species.FOONGUS, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.AMOONGUSS, Type.GRASS, Type.POISON, [ + [ Species.AMOONGUSS, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], @@ -4894,712 +4894,712 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FRILLISH, Type.WATER, Type.GHOST, [ + [ Species.FRILLISH, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.JELLICENT, Type.WATER, Type.GHOST, [ + [ Species.JELLICENT, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.ALOMOMOLA, Type.WATER, -1, [ + [ Species.ALOMOMOLA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.JOLTIK, Type.BUG, Type.ELECTRIC, [ + [ Species.JOLTIK, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GALVANTULA, Type.BUG, Type.ELECTRIC, [ + [ Species.GALVANTULA, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FERROSEED, Type.GRASS, Type.STEEL, [ + [ Species.FERROSEED, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.RARE ] ] ], - [ Species.FERROTHORN, Type.GRASS, Type.STEEL, [ + [ Species.FERROTHORN, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KLINK, Type.STEEL, -1, [ + [ Species.KLINK, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.KLANG, Type.STEEL, -1, [ + [ Species.KLANG, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.KLINKLANG, Type.STEEL, -1, [ + [ Species.KLINKLANG, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.TYNAMO, Type.ELECTRIC, -1, [ + [ Species.TYNAMO, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.EELEKTRIK, Type.ELECTRIC, -1, [ + [ Species.EELEKTRIK, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.EELEKTROSS, Type.ELECTRIC, -1, [ + [ Species.EELEKTROSS, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ELGYEM, Type.PSYCHIC, -1, [ + [ Species.ELGYEM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BEHEEYEM, Type.PSYCHIC, -1, [ + [ Species.BEHEEYEM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LITWICK, Type.GHOST, Type.FIRE, [ + [ Species.LITWICK, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LAMPENT, Type.GHOST, Type.FIRE, [ + [ Species.LAMPENT, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CHANDELURE, Type.GHOST, Type.FIRE, [ + [ Species.CHANDELURE, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.AXEW, Type.DRAGON, -1, [ + [ Species.AXEW, PokemonType.DRAGON, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.FRAXURE, Type.DRAGON, -1, [ + [ Species.FRAXURE, PokemonType.DRAGON, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.HAXORUS, Type.DRAGON, -1, [ + [ Species.HAXORUS, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.CUBCHOO, Type.ICE, -1, [ + [ Species.CUBCHOO, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.BEARTIC, Type.ICE, -1, [ + [ Species.BEARTIC, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CRYOGONAL, Type.ICE, -1, [ + [ Species.CRYOGONAL, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SHELMET, Type.BUG, -1, [ + [ Species.SHELMET, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ACCELGOR, Type.BUG, -1, [ + [ Species.ACCELGOR, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.STUNFISK, Type.GROUND, Type.ELECTRIC, [ + [ Species.STUNFISK, PokemonType.GROUND, PokemonType.ELECTRIC, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.MIENFOO, Type.FIGHTING, -1, [ + [ Species.MIENFOO, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MIENSHAO, Type.FIGHTING, -1, [ + [ Species.MIENSHAO, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.DRUDDIGON, Type.DRAGON, -1, [ + [ Species.DRUDDIGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GOLETT, Type.GROUND, Type.GHOST, [ + [ Species.GOLETT, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLURK, Type.GROUND, Type.GHOST, [ + [ Species.GOLURK, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.PAWNIARD, Type.DARK, Type.STEEL, [ + [ Species.PAWNIARD, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.BISHARP, Type.DARK, Type.STEEL, [ + [ Species.BISHARP, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.BOUFFALANT, Type.NORMAL, -1, [ + [ Species.BOUFFALANT, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RUFFLET, Type.NORMAL, Type.FLYING, [ + [ Species.RUFFLET, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BRAVIARY, Type.NORMAL, Type.FLYING, [ + [ Species.BRAVIARY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VULLABY, Type.DARK, Type.FLYING, [ + [ Species.VULLABY, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MANDIBUZZ, Type.DARK, Type.FLYING, [ + [ Species.MANDIBUZZ, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HEATMOR, Type.FIRE, -1, [ + [ Species.HEATMOR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.DURANT, Type.BUG, Type.STEEL, [ + [ Species.DURANT, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DEINO, Type.DARK, Type.DRAGON, [ + [ Species.DEINO, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.ZWEILOUS, Type.DARK, Type.DRAGON, [ + [ Species.ZWEILOUS, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.HYDREIGON, Type.DARK, Type.DRAGON, [ + [ Species.HYDREIGON, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.LARVESTA, Type.BUG, Type.FIRE, [ + [ Species.LARVESTA, PokemonType.BUG, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.VOLCARONA, Type.BUG, Type.FIRE, [ + [ Species.VOLCARONA, PokemonType.BUG, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.COBALION, Type.STEEL, Type.FIGHTING, [ + [ Species.COBALION, PokemonType.STEEL, PokemonType.FIGHTING, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TERRAKION, Type.ROCK, Type.FIGHTING, [ + [ Species.TERRAKION, PokemonType.ROCK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.VIRIZION, Type.GRASS, Type.FIGHTING, [ + [ Species.VIRIZION, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.GRASS, BiomePoolTier.ULTRA_RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TORNADUS, Type.FLYING, -1, [ + [ Species.TORNADUS, PokemonType.FLYING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.THUNDURUS, Type.ELECTRIC, Type.FLYING, [ + [ Species.THUNDURUS, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.RESHIRAM, Type.DRAGON, Type.FIRE, [ + [ Species.RESHIRAM, PokemonType.DRAGON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZEKROM, Type.DRAGON, Type.ELECTRIC, [ + [ Species.ZEKROM, PokemonType.DRAGON, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.LANDORUS, Type.GROUND, Type.FLYING, [ + [ Species.LANDORUS, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KYUREM, Type.DRAGON, Type.ICE, [ + [ Species.KYUREM, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.KELDEO, Type.WATER, Type.FIGHTING, [ + [ Species.KELDEO, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MELOETTA, Type.NORMAL, Type.PSYCHIC, [ + [ Species.MELOETTA, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.MEADOW, BiomePoolTier.ULTRA_RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GENESECT, Type.BUG, Type.STEEL, [ + [ Species.GENESECT, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHESPIN, Type.GRASS, -1, [ + [ Species.CHESPIN, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.QUILLADIN, Type.GRASS, -1, [ + [ Species.QUILLADIN, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.CHESNAUGHT, Type.GRASS, Type.FIGHTING, [ + [ Species.CHESNAUGHT, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FENNEKIN, Type.FIRE, -1, [ + [ Species.FENNEKIN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.BRAIXEN, Type.FIRE, -1, [ + [ Species.BRAIXEN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.DELPHOX, Type.FIRE, Type.PSYCHIC, [ + [ Species.DELPHOX, PokemonType.FIRE, PokemonType.PSYCHIC, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FROAKIE, Type.WATER, -1, [ + [ Species.FROAKIE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.FROGADIER, Type.WATER, -1, [ + [ Species.FROGADIER, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.GRENINJA, Type.WATER, Type.DARK, [ + [ Species.GRENINJA, PokemonType.WATER, PokemonType.DARK, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BUNNELBY, Type.NORMAL, -1, [ + [ Species.BUNNELBY, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.DIGGERSBY, Type.NORMAL, Type.GROUND, [ + [ Species.DIGGERSBY, PokemonType.NORMAL, PokemonType.GROUND, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.FLETCHLING, Type.NORMAL, Type.FLYING, [ + [ Species.FLETCHLING, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FLETCHINDER, Type.FIRE, Type.FLYING, [ + [ Species.FLETCHINDER, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TALONFLAME, Type.FIRE, Type.FLYING, [ + [ Species.TALONFLAME, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SCATTERBUG, Type.BUG, -1, [ + [ Species.SCATTERBUG, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SPEWPA, Type.BUG, -1, [ + [ Species.SPEWPA, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VIVILLON, Type.BUG, Type.FLYING, [ + [ Species.VIVILLON, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LITLEO, Type.FIRE, Type.NORMAL, [ + [ Species.LITLEO, PokemonType.FIRE, PokemonType.NORMAL, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PYROAR, Type.FIRE, Type.NORMAL, [ + [ Species.PYROAR, PokemonType.FIRE, PokemonType.NORMAL, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FLABEBE, Type.FAIRY, -1, [ + [ Species.FLABEBE, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.FLOETTE, Type.FAIRY, -1, [ + [ Species.FLOETTE, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.FLORGES, Type.FAIRY, -1, [ + [ Species.FLORGES, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.SKIDDO, Type.GRASS, -1, [ + [ Species.SKIDDO, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.GOGOAT, Type.GRASS, -1, [ + [ Species.GOGOAT, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.PANCHAM, Type.FIGHTING, -1, [ + [ Species.PANCHAM, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PANGORO, Type.FIGHTING, Type.DARK, [ + [ Species.PANGORO, PokemonType.FIGHTING, PokemonType.DARK, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FURFROU, Type.NORMAL, -1, [ + [ Species.FURFROU, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.ESPURR, Type.PSYCHIC, -1, [ + [ Species.ESPURR, PokemonType.PSYCHIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MEOWSTIC, Type.PSYCHIC, -1, [ + [ Species.MEOWSTIC, PokemonType.PSYCHIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HONEDGE, Type.STEEL, Type.GHOST, [ + [ Species.HONEDGE, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.DOUBLADE, Type.STEEL, Type.GHOST, [ + [ Species.DOUBLADE, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.AEGISLASH, Type.STEEL, Type.GHOST, [ + [ Species.AEGISLASH, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.SPRITZEE, Type.FAIRY, -1, [ + [ Species.SPRITZEE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AROMATISSE, Type.FAIRY, -1, [ + [ Species.AROMATISSE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SWIRLIX, Type.FAIRY, -1, [ + [ Species.SWIRLIX, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SLURPUFF, Type.FAIRY, -1, [ + [ Species.SLURPUFF, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.INKAY, Type.DARK, Type.PSYCHIC, [ + [ Species.INKAY, PokemonType.DARK, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MALAMAR, Type.DARK, Type.PSYCHIC, [ + [ Species.MALAMAR, PokemonType.DARK, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BINACLE, Type.ROCK, Type.WATER, [ + [ Species.BINACLE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.BARBARACLE, Type.ROCK, Type.WATER, [ + [ Species.BARBARACLE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.SKRELP, Type.POISON, Type.WATER, [ + [ Species.SKRELP, PokemonType.POISON, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DRAGALGE, Type.POISON, Type.DRAGON, [ + [ Species.DRAGALGE, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.CLAUNCHER, Type.WATER, -1, [ + [ Species.CLAUNCHER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLAWITZER, Type.WATER, -1, [ + [ Species.CLAWITZER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.HELIOPTILE, Type.ELECTRIC, Type.NORMAL, [ + [ Species.HELIOPTILE, PokemonType.ELECTRIC, PokemonType.NORMAL, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HELIOLISK, Type.ELECTRIC, Type.NORMAL, [ + [ Species.HELIOLISK, PokemonType.ELECTRIC, PokemonType.NORMAL, [ [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TYRUNT, Type.ROCK, Type.DRAGON, [ + [ Species.TYRUNT, PokemonType.ROCK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TYRANTRUM, Type.ROCK, Type.DRAGON, [ + [ Species.TYRANTRUM, PokemonType.ROCK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.AMAURA, Type.ROCK, Type.ICE, [ + [ Species.AMAURA, PokemonType.ROCK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.AURORUS, Type.ROCK, Type.ICE, [ + [ Species.AURORUS, PokemonType.ROCK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SYLVEON, Type.FAIRY, -1, [ + [ Species.SYLVEON, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HAWLUCHA, Type.FIGHTING, Type.FLYING, [ + [ Species.HAWLUCHA, PokemonType.FIGHTING, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DEDENNE, Type.ELECTRIC, Type.FAIRY, [ + [ Species.DEDENNE, PokemonType.ELECTRIC, PokemonType.FAIRY, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.CARBINK, Type.ROCK, Type.FAIRY, [ + [ Species.CARBINK, PokemonType.ROCK, PokemonType.FAIRY, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.GOOMY, Type.DRAGON, -1, [ + [ Species.GOOMY, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SLIGGOO, Type.DRAGON, -1, [ + [ Species.SLIGGOO, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GOODRA, Type.DRAGON, -1, [ + [ Species.GOODRA, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KLEFKI, Type.STEEL, Type.FAIRY, [ + [ Species.KLEFKI, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.BOSS ] ] ], - [ Species.PHANTUMP, Type.GHOST, Type.GRASS, [ + [ Species.PHANTUMP, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.TREVENANT, Type.GHOST, Type.GRASS, [ + [ Species.TREVENANT, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.PUMPKABOO, Type.GHOST, Type.GRASS, [ + [ Species.PUMPKABOO, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.GOURGEIST, Type.GHOST, Type.GRASS, [ + [ Species.GOURGEIST, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BERGMITE, Type.ICE, -1, [ + [ Species.BERGMITE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AVALUGG, Type.ICE, -1, [ + [ Species.AVALUGG, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.NOIBAT, Type.FLYING, Type.DRAGON, [ + [ Species.NOIBAT, PokemonType.FLYING, PokemonType.DRAGON, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.NOIVERN, Type.FLYING, Type.DRAGON, [ + [ Species.NOIVERN, PokemonType.FLYING, PokemonType.DRAGON, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.XERNEAS, Type.FAIRY, -1, [ + [ Species.XERNEAS, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.YVELTAL, Type.DARK, Type.FLYING, [ + [ Species.YVELTAL, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZYGARDE, Type.DRAGON, Type.GROUND, [ + [ Species.ZYGARDE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DIANCIE, Type.ROCK, Type.FAIRY, [ + [ Species.DIANCIE, PokemonType.ROCK, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.HOOPA, Type.PSYCHIC, Type.GHOST, [ + [ Species.HOOPA, PokemonType.PSYCHIC, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.VOLCANION, Type.FIRE, Type.WATER, [ + [ Species.VOLCANION, PokemonType.FIRE, PokemonType.WATER, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ROWLET, Type.GRASS, Type.FLYING, [ + [ Species.ROWLET, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.DARTRIX, Type.GRASS, Type.FLYING, [ + [ Species.DARTRIX, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.DECIDUEYE, Type.GRASS, Type.GHOST, [ + [ Species.DECIDUEYE, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LITTEN, Type.FIRE, -1, [ + [ Species.LITTEN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.TORRACAT, Type.FIRE, -1, [ + [ Species.TORRACAT, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.INCINEROAR, Type.FIRE, Type.DARK, [ + [ Species.INCINEROAR, PokemonType.FIRE, PokemonType.DARK, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POPPLIO, Type.WATER, -1, [ + [ Species.POPPLIO, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.BRIONNE, Type.WATER, -1, [ + [ Species.BRIONNE, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.PRIMARINA, Type.WATER, Type.FAIRY, [ + [ Species.PRIMARINA, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PIKIPEK, Type.NORMAL, Type.FLYING, [ + [ Species.PIKIPEK, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.TRUMBEAK, Type.NORMAL, Type.FLYING, [ + [ Species.TRUMBEAK, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.TOUCANNON, Type.NORMAL, Type.FLYING, [ + [ Species.TOUCANNON, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.YUNGOOS, Type.NORMAL, -1, [ + [ Species.YUNGOOS, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GUMSHOOS, Type.NORMAL, -1, [ + [ Species.GUMSHOOS, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GRUBBIN, Type.BUG, -1, [ + [ Species.GRUBBIN, PokemonType.BUG, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.CHARJABUG, Type.BUG, Type.ELECTRIC, [ + [ Species.CHARJABUG, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.VIKAVOLT, Type.BUG, Type.ELECTRIC, [ + [ Species.VIKAVOLT, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.CRABRAWLER, Type.FIGHTING, -1, [ + [ Species.CRABRAWLER, PokemonType.FIGHTING, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.CRABOMINABLE, Type.FIGHTING, Type.ICE, [ + [ Species.CRABOMINABLE, PokemonType.FIGHTING, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ORICORIO, Type.FIRE, Type.FLYING, [ + [ Species.ORICORIO, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.CUTIEFLY, Type.BUG, Type.FAIRY, [ + [ Species.CUTIEFLY, PokemonType.BUG, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.RIBOMBEE, Type.BUG, Type.FAIRY, [ + [ Species.RIBOMBEE, PokemonType.BUG, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ROCKRUFF, Type.ROCK, -1, [ + [ Species.ROCKRUFF, PokemonType.ROCK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ] ] ], - [ Species.LYCANROC, Type.ROCK, -1, [ + [ Species.LYCANROC, PokemonType.ROCK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], @@ -5608,1529 +5608,1529 @@ export function initBiomes() { [ Biome.CAVE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] ] ], - [ Species.WISHIWASHI, Type.WATER, -1, [ + [ Species.WISHIWASHI, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MAREANIE, Type.POISON, Type.WATER, [ + [ Species.MAREANIE, PokemonType.POISON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TOXAPEX, Type.POISON, Type.WATER, [ + [ Species.TOXAPEX, PokemonType.POISON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.MUDBRAY, Type.GROUND, -1, [ + [ Species.MUDBRAY, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ Species.MUDSDALE, Type.GROUND, -1, [ + [ Species.MUDSDALE, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.DEWPIDER, Type.WATER, Type.BUG, [ + [ Species.DEWPIDER, PokemonType.WATER, PokemonType.BUG, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARAQUANID, Type.WATER, Type.BUG, [ + [ Species.ARAQUANID, PokemonType.WATER, PokemonType.BUG, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FOMANTIS, Type.GRASS, -1, [ + [ Species.FOMANTIS, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LURANTIS, Type.GRASS, -1, [ + [ Species.LURANTIS, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.MORELULL, Type.GRASS, Type.FAIRY, [ + [ Species.MORELULL, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SHIINOTIC, Type.GRASS, Type.FAIRY, [ + [ Species.SHIINOTIC, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SALANDIT, Type.POISON, Type.FIRE, [ + [ Species.SALANDIT, PokemonType.POISON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.SALAZZLE, Type.POISON, Type.FIRE, [ + [ Species.SALAZZLE, PokemonType.POISON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.STUFFUL, Type.NORMAL, Type.FIGHTING, [ + [ Species.STUFFUL, PokemonType.NORMAL, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.BEWEAR, Type.NORMAL, Type.FIGHTING, [ + [ Species.BEWEAR, PokemonType.NORMAL, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.BOUNSWEET, Type.GRASS, -1, [ + [ Species.BOUNSWEET, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STEENEE, Type.GRASS, -1, [ + [ Species.STEENEE, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TSAREENA, Type.GRASS, -1, [ + [ Species.TSAREENA, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.COMFEY, Type.FAIRY, -1, [ + [ Species.COMFEY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ORANGURU, Type.NORMAL, Type.PSYCHIC, [ + [ Species.ORANGURU, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PASSIMIAN, Type.FIGHTING, -1, [ + [ Species.PASSIMIAN, PokemonType.FIGHTING, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WIMPOD, Type.BUG, Type.WATER, [ + [ Species.WIMPOD, PokemonType.BUG, PokemonType.WATER, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLISOPOD, Type.BUG, Type.WATER, [ + [ Species.GOLISOPOD, PokemonType.BUG, PokemonType.WATER, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SANDYGAST, Type.GHOST, Type.GROUND, [ + [ Species.SANDYGAST, PokemonType.GHOST, PokemonType.GROUND, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PALOSSAND, Type.GHOST, Type.GROUND, [ + [ Species.PALOSSAND, PokemonType.GHOST, PokemonType.GROUND, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.PYUKUMUKU, Type.WATER, -1, [ + [ Species.PYUKUMUKU, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TYPE_NULL, Type.NORMAL, -1, [ + [ Species.TYPE_NULL, PokemonType.NORMAL, -1, [ [ Biome.LABORATORY, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.SILVALLY, Type.NORMAL, -1, [ + [ Species.SILVALLY, PokemonType.NORMAL, -1, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MINIOR, Type.ROCK, Type.FLYING, [ + [ Species.MINIOR, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.KOMALA, Type.NORMAL, -1, [ + [ Species.KOMALA, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TURTONATOR, Type.FIRE, Type.DRAGON, [ + [ Species.TURTONATOR, PokemonType.FIRE, PokemonType.DRAGON, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TOGEDEMARU, Type.ELECTRIC, Type.STEEL, [ + [ Species.TOGEDEMARU, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.MIMIKYU, Type.GHOST, Type.FAIRY, [ + [ Species.MIMIKYU, PokemonType.GHOST, PokemonType.FAIRY, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BRUXISH, Type.WATER, Type.PSYCHIC, [ + [ Species.BRUXISH, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.DRAMPA, Type.NORMAL, Type.DRAGON, [ + [ Species.DRAMPA, PokemonType.NORMAL, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.DHELMISE, Type.GHOST, Type.GRASS, [ + [ Species.DHELMISE, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.JANGMO_O, Type.DRAGON, -1, [ + [ Species.JANGMO_O, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HAKAMO_O, Type.DRAGON, Type.FIGHTING, [ + [ Species.HAKAMO_O, PokemonType.DRAGON, PokemonType.FIGHTING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KOMMO_O, Type.DRAGON, Type.FIGHTING, [ + [ Species.KOMMO_O, PokemonType.DRAGON, PokemonType.FIGHTING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TAPU_KOKO, Type.ELECTRIC, Type.FAIRY, [ + [ Species.TAPU_KOKO, PokemonType.ELECTRIC, PokemonType.FAIRY, [ [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_LELE, Type.PSYCHIC, Type.FAIRY, [ + [ Species.TAPU_LELE, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_BULU, Type.GRASS, Type.FAIRY, [ + [ Species.TAPU_BULU, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_FINI, Type.WATER, Type.FAIRY, [ + [ Species.TAPU_FINI, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.COSMOG, Type.PSYCHIC, -1, [ + [ Species.COSMOG, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.COSMOEM, Type.PSYCHIC, -1, [ + [ Species.COSMOEM, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.SOLGALEO, Type.PSYCHIC, Type.STEEL, [ + [ Species.SOLGALEO, PokemonType.PSYCHIC, PokemonType.STEEL, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.DAY ] ] ], - [ Species.LUNALA, Type.PSYCHIC, Type.GHOST, [ + [ Species.LUNALA, PokemonType.PSYCHIC, PokemonType.GHOST, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.NIGHT ] ] ], - [ Species.NIHILEGO, Type.ROCK, Type.POISON, [ + [ Species.NIHILEGO, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.BUZZWOLE, Type.BUG, Type.FIGHTING, [ + [ Species.BUZZWOLE, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.PHEROMOSA, Type.BUG, Type.FIGHTING, [ + [ Species.PHEROMOSA, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.XURKITREE, Type.ELECTRIC, -1, [ + [ Species.XURKITREE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CELESTEELA, Type.STEEL, Type.FLYING, [ + [ Species.CELESTEELA, PokemonType.STEEL, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ], [ Biome.SPACE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KARTANA, Type.GRASS, Type.STEEL, [ + [ Species.KARTANA, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GUZZLORD, Type.DARK, Type.DRAGON, [ + [ Species.GUZZLORD, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.SLUM, BiomePoolTier.ULTRA_RARE ], [ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.NECROZMA, Type.PSYCHIC, -1, [ + [ Species.NECROZMA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MAGEARNA, Type.STEEL, Type.FAIRY, [ + [ Species.MAGEARNA, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MARSHADOW, Type.FIGHTING, Type.GHOST, [ + [ Species.MARSHADOW, PokemonType.FIGHTING, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.POIPOLE, Type.POISON, -1, [ + [ Species.POIPOLE, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.NAGANADEL, Type.POISON, Type.DRAGON, [ + [ Species.NAGANADEL, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.STAKATAKA, Type.ROCK, Type.STEEL, [ + [ Species.STAKATAKA, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.BLACEPHALON, Type.FIRE, Type.GHOST, [ + [ Species.BLACEPHALON, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.ISLAND, BiomePoolTier.ULTRA_RARE ], [ Biome.ISLAND, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZERAORA, Type.ELECTRIC, -1, [ + [ Species.ZERAORA, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MELTAN, Type.STEEL, -1, [ ] + [ Species.MELTAN, PokemonType.STEEL, -1, [ ] ], - [ Species.MELMETAL, Type.STEEL, -1, [ ] + [ Species.MELMETAL, PokemonType.STEEL, -1, [ ] ], - [ Species.GROOKEY, Type.GRASS, -1, [ + [ Species.GROOKEY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.THWACKEY, Type.GRASS, -1, [ + [ Species.THWACKEY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.RILLABOOM, Type.GRASS, -1, [ + [ Species.RILLABOOM, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SCORBUNNY, Type.FIRE, -1, [ + [ Species.SCORBUNNY, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.RABOOT, Type.FIRE, -1, [ + [ Species.RABOOT, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CINDERACE, Type.FIRE, -1, [ + [ Species.CINDERACE, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SOBBLE, Type.WATER, -1, [ + [ Species.SOBBLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.DRIZZILE, Type.WATER, -1, [ + [ Species.DRIZZILE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.INTELEON, Type.WATER, -1, [ + [ Species.INTELEON, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SKWOVET, Type.NORMAL, -1, [ + [ Species.SKWOVET, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GREEDENT, Type.NORMAL, -1, [ + [ Species.GREEDENT, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ROOKIDEE, Type.FLYING, -1, [ + [ Species.ROOKIDEE, PokemonType.FLYING, -1, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CORVISQUIRE, Type.FLYING, -1, [ + [ Species.CORVISQUIRE, PokemonType.FLYING, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CORVIKNIGHT, Type.FLYING, Type.STEEL, [ + [ Species.CORVIKNIGHT, PokemonType.FLYING, PokemonType.STEEL, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BLIPBUG, Type.BUG, -1, [ + [ Species.BLIPBUG, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DOTTLER, Type.BUG, Type.PSYCHIC, [ + [ Species.DOTTLER, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ORBEETLE, Type.BUG, Type.PSYCHIC, [ + [ Species.ORBEETLE, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.NICKIT, Type.DARK, -1, [ + [ Species.NICKIT, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.THIEVUL, Type.DARK, -1, [ + [ Species.THIEVUL, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GOSSIFLEUR, Type.GRASS, -1, [ + [ Species.GOSSIFLEUR, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.ELDEGOSS, Type.GRASS, -1, [ + [ Species.ELDEGOSS, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.WOOLOO, Type.NORMAL, -1, [ + [ Species.WOOLOO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.DUBWOOL, Type.NORMAL, -1, [ + [ Species.DUBWOOL, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.CHEWTLE, Type.WATER, -1, [ + [ Species.CHEWTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.DREDNAW, Type.WATER, Type.ROCK, [ + [ Species.DREDNAW, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.YAMPER, Type.ELECTRIC, -1, [ + [ Species.YAMPER, PokemonType.ELECTRIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BOLTUND, Type.ELECTRIC, -1, [ + [ Species.BOLTUND, PokemonType.ELECTRIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ROLYCOLY, Type.ROCK, -1, [ + [ Species.ROLYCOLY, PokemonType.ROCK, -1, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.CARKOL, Type.ROCK, Type.FIRE, [ + [ Species.CARKOL, PokemonType.ROCK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.COALOSSAL, Type.ROCK, Type.FIRE, [ + [ Species.COALOSSAL, PokemonType.ROCK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.APPLIN, Type.GRASS, Type.DRAGON, [ + [ Species.APPLIN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.FLAPPLE, Type.GRASS, Type.DRAGON, [ + [ Species.FLAPPLE, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.APPLETUN, Type.GRASS, Type.DRAGON, [ + [ Species.APPLETUN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SILICOBRA, Type.GROUND, -1, [ + [ Species.SILICOBRA, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON ] ] ], - [ Species.SANDACONDA, Type.GROUND, -1, [ + [ Species.SANDACONDA, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.CRAMORANT, Type.FLYING, Type.WATER, [ + [ Species.CRAMORANT, PokemonType.FLYING, PokemonType.WATER, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARROKUDA, Type.WATER, -1, [ + [ Species.ARROKUDA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.BARRASKEWDA, Type.WATER, -1, [ + [ Species.BARRASKEWDA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.TOXEL, Type.ELECTRIC, Type.POISON, [ ] + [ Species.TOXEL, PokemonType.ELECTRIC, PokemonType.POISON, [ ] ], - [ Species.TOXTRICITY, Type.ELECTRIC, Type.POISON, [ + [ Species.TOXTRICITY, PokemonType.ELECTRIC, PokemonType.POISON, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SIZZLIPEDE, Type.FIRE, Type.BUG, [ + [ Species.SIZZLIPEDE, PokemonType.FIRE, PokemonType.BUG, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CENTISKORCH, Type.FIRE, Type.BUG, [ + [ Species.CENTISKORCH, PokemonType.FIRE, PokemonType.BUG, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CLOBBOPUS, Type.FIGHTING, -1, [ + [ Species.CLOBBOPUS, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.GRAPPLOCT, Type.FIGHTING, -1, [ + [ Species.GRAPPLOCT, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SINISTEA, Type.GHOST, -1, [ + [ Species.SINISTEA, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] ] ], - [ Species.POLTEAGEIST, Type.GHOST, -1, [ + [ Species.POLTEAGEIST, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.HATENNA, Type.PSYCHIC, -1, [ + [ Species.HATENNA, PokemonType.PSYCHIC, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.HATTREM, Type.PSYCHIC, -1, [ + [ Species.HATTREM, PokemonType.PSYCHIC, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.HATTERENE, Type.PSYCHIC, Type.FAIRY, [ + [ Species.HATTERENE, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.IMPIDIMP, Type.DARK, Type.FAIRY, [ + [ Species.IMPIDIMP, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.MORGREM, Type.DARK, Type.FAIRY, [ + [ Species.MORGREM, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.GRIMMSNARL, Type.DARK, Type.FAIRY, [ + [ Species.GRIMMSNARL, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.OBSTAGOON, Type.DARK, Type.NORMAL, [ + [ Species.OBSTAGOON, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PERRSERKER, Type.STEEL, -1, [ + [ Species.PERRSERKER, PokemonType.STEEL, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] ] ], - [ Species.CURSOLA, Type.GHOST, -1, [ + [ Species.CURSOLA, PokemonType.GHOST, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SIRFETCHD, Type.FIGHTING, -1, [ + [ Species.SIRFETCHD, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MR_RIME, Type.ICE, Type.PSYCHIC, [ + [ Species.MR_RIME, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RUNERIGUS, Type.GROUND, Type.GHOST, [ + [ Species.RUNERIGUS, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.RUINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MILCERY, Type.FAIRY, -1, [ + [ Species.MILCERY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.ALCREMIE, Type.FAIRY, -1, [ + [ Species.ALCREMIE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.FALINKS, Type.FIGHTING, -1, [ + [ Species.FALINKS, PokemonType.FIGHTING, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.PINCURCHIN, Type.ELECTRIC, -1, [ + [ Species.PINCURCHIN, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SNOM, Type.ICE, Type.BUG, [ + [ Species.SNOM, PokemonType.ICE, PokemonType.BUG, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FROSMOTH, Type.ICE, Type.BUG, [ + [ Species.FROSMOTH, PokemonType.ICE, PokemonType.BUG, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.STONJOURNER, Type.ROCK, -1, [ + [ Species.STONJOURNER, PokemonType.ROCK, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.EISCUE, Type.ICE, -1, [ + [ Species.EISCUE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.INDEEDEE, Type.PSYCHIC, Type.NORMAL, [ + [ Species.INDEEDEE, PokemonType.PSYCHIC, PokemonType.NORMAL, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MORPEKO, Type.ELECTRIC, Type.DARK, [ + [ Species.MORPEKO, PokemonType.ELECTRIC, PokemonType.DARK, [ [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.CUFANT, Type.STEEL, -1, [ + [ Species.CUFANT, PokemonType.STEEL, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.COPPERAJAH, Type.STEEL, -1, [ + [ Species.COPPERAJAH, PokemonType.STEEL, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.DRACOZOLT, Type.ELECTRIC, Type.DRAGON, [ + [ Species.DRACOZOLT, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCTOZOLT, Type.ELECTRIC, Type.ICE, [ + [ Species.ARCTOZOLT, PokemonType.ELECTRIC, PokemonType.ICE, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DRACOVISH, Type.WATER, Type.DRAGON, [ + [ Species.DRACOVISH, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCTOVISH, Type.WATER, Type.ICE, [ + [ Species.ARCTOVISH, PokemonType.WATER, PokemonType.ICE, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DURALUDON, Type.STEEL, Type.DRAGON, [ + [ Species.DURALUDON, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.DREEPY, Type.DRAGON, Type.GHOST, [ + [ Species.DREEPY, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DRAKLOAK, Type.DRAGON, Type.GHOST, [ + [ Species.DRAKLOAK, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DRAGAPULT, Type.DRAGON, Type.GHOST, [ + [ Species.DRAGAPULT, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ZACIAN, Type.FAIRY, -1, [ + [ Species.ZACIAN, PokemonType.FAIRY, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZAMAZENTA, Type.FIGHTING, -1, [ + [ Species.ZAMAZENTA, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ETERNATUS, Type.POISON, Type.DRAGON, [ + [ Species.ETERNATUS, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.BOSS ] ] ], - [ Species.KUBFU, Type.FIGHTING, -1, [ + [ Species.KUBFU, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.URSHIFU, Type.FIGHTING, Type.DARK, [ + [ Species.URSHIFU, PokemonType.FIGHTING, PokemonType.DARK, [ [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZARUDE, Type.DARK, Type.GRASS, [ + [ Species.ZARUDE, PokemonType.DARK, PokemonType.GRASS, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIELEKI, Type.ELECTRIC, -1, [ + [ Species.REGIELEKI, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIDRAGO, Type.DRAGON, -1, [ + [ Species.REGIDRAGO, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.ULTRA_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GLASTRIER, Type.ICE, -1, [ + [ Species.GLASTRIER, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SPECTRIER, Type.GHOST, -1, [ + [ Species.SPECTRIER, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CALYREX, Type.PSYCHIC, Type.GRASS, [ + [ Species.CALYREX, PokemonType.PSYCHIC, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.WYRDEER, Type.NORMAL, Type.PSYCHIC, [ + [ Species.WYRDEER, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KLEAVOR, Type.BUG, Type.ROCK, [ + [ Species.KLEAVOR, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.URSALUNA, Type.GROUND, Type.NORMAL, [ + [ Species.URSALUNA, PokemonType.GROUND, PokemonType.NORMAL, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.BASCULEGION, Type.WATER, Type.GHOST, [ + [ Species.BASCULEGION, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNEASLER, Type.FIGHTING, Type.POISON, [ + [ Species.SNEASLER, PokemonType.FIGHTING, PokemonType.POISON, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.OVERQWIL, Type.DARK, Type.POISON, [ + [ Species.OVERQWIL, PokemonType.DARK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ENAMORUS, Type.FAIRY, Type.FLYING, [ + [ Species.ENAMORUS, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SPRIGATITO, Type.GRASS, -1, [ + [ Species.SPRIGATITO, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.FLORAGATO, Type.GRASS, -1, [ + [ Species.FLORAGATO, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.MEOWSCARADA, Type.GRASS, Type.DARK, [ + [ Species.MEOWSCARADA, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FUECOCO, Type.FIRE, -1, [ + [ Species.FUECOCO, PokemonType.FIRE, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.CROCALOR, Type.FIRE, -1, [ + [ Species.CROCALOR, PokemonType.FIRE, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.SKELEDIRGE, Type.FIRE, Type.GHOST, [ + [ Species.SKELEDIRGE, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.QUAXLY, Type.WATER, -1, [ + [ Species.QUAXLY, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.QUAXWELL, Type.WATER, -1, [ + [ Species.QUAXWELL, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.QUAQUAVAL, Type.WATER, Type.FIGHTING, [ + [ Species.QUAQUAVAL, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.BEACH, BiomePoolTier.RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LECHONK, Type.NORMAL, -1, [ + [ Species.LECHONK, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ] ] ], - [ Species.OINKOLOGNE, Type.NORMAL, -1, [ + [ Species.OINKOLOGNE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.TAROUNTULA, Type.BUG, -1, [ + [ Species.TAROUNTULA, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.SPIDOPS, Type.BUG, -1, [ + [ Species.SPIDOPS, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.NYMBLE, Type.BUG, -1, [ + [ Species.NYMBLE, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.LOKIX, Type.BUG, Type.DARK, [ + [ Species.LOKIX, PokemonType.BUG, PokemonType.DARK, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.PAWMI, Type.ELECTRIC, -1, [ + [ Species.PAWMI, PokemonType.ELECTRIC, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.PAWMO, Type.ELECTRIC, Type.FIGHTING, [ + [ Species.PAWMO, PokemonType.ELECTRIC, PokemonType.FIGHTING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.PAWMOT, Type.ELECTRIC, Type.FIGHTING, [ + [ Species.PAWMOT, PokemonType.ELECTRIC, PokemonType.FIGHTING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.TANDEMAUS, Type.NORMAL, -1, [ + [ Species.TANDEMAUS, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MAUSHOLD, Type.NORMAL, -1, [ + [ Species.MAUSHOLD, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FIDOUGH, Type.FAIRY, -1, [ + [ Species.FIDOUGH, PokemonType.FAIRY, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DACHSBUN, Type.FAIRY, -1, [ + [ Species.DACHSBUN, PokemonType.FAIRY, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.SMOLIV, Type.GRASS, Type.NORMAL, [ + [ Species.SMOLIV, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DOLLIV, Type.GRASS, Type.NORMAL, [ + [ Species.DOLLIV, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARBOLIVA, Type.GRASS, Type.NORMAL, [ + [ Species.ARBOLIVA, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SQUAWKABILLY, Type.NORMAL, Type.FLYING, [ + [ Species.SQUAWKABILLY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.NACLI, Type.ROCK, -1, [ + [ Species.NACLI, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.NACLSTACK, Type.ROCK, -1, [ + [ Species.NACLSTACK, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GARGANACL, Type.ROCK, -1, [ + [ Species.GARGANACL, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CHARCADET, Type.FIRE, -1, [ + [ Species.CHARCADET, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.ARMAROUGE, Type.FIRE, Type.PSYCHIC, [ + [ Species.ARMAROUGE, PokemonType.FIRE, PokemonType.PSYCHIC, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CERULEDGE, Type.FIRE, Type.GHOST, [ + [ Species.CERULEDGE, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TADBULB, Type.ELECTRIC, -1, [ + [ Species.TADBULB, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.BELLIBOLT, Type.ELECTRIC, -1, [ + [ Species.BELLIBOLT, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.WATTREL, Type.ELECTRIC, Type.FLYING, [ + [ Species.WATTREL, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KILOWATTREL, Type.ELECTRIC, Type.FLYING, [ + [ Species.KILOWATTREL, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEA, BiomePoolTier.BOSS ] ] ], - [ Species.MASCHIFF, Type.DARK, -1, [ + [ Species.MASCHIFF, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.MABOSSTIFF, Type.DARK, -1, [ + [ Species.MABOSSTIFF, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.SHROODLE, Type.POISON, Type.NORMAL, [ + [ Species.SHROODLE, PokemonType.POISON, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.GRAFAIAI, Type.POISON, Type.NORMAL, [ + [ Species.GRAFAIAI, PokemonType.POISON, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.BRAMBLIN, Type.GRASS, Type.GHOST, [ + [ Species.BRAMBLIN, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BRAMBLEGHAST, Type.GRASS, Type.GHOST, [ + [ Species.BRAMBLEGHAST, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.TOEDSCOOL, Type.GROUND, Type.GRASS, [ + [ Species.TOEDSCOOL, PokemonType.GROUND, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.TOEDSCRUEL, Type.GROUND, Type.GRASS, [ + [ Species.TOEDSCRUEL, PokemonType.GROUND, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KLAWF, Type.ROCK, -1, [ + [ Species.KLAWF, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.CAPSAKID, Type.GRASS, -1, [ + [ Species.CAPSAKID, PokemonType.GRASS, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SCOVILLAIN, Type.GRASS, Type.FIRE, [ + [ Species.SCOVILLAIN, PokemonType.GRASS, PokemonType.FIRE, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RELLOR, Type.BUG, -1, [ + [ Species.RELLOR, PokemonType.BUG, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RABSCA, Type.BUG, Type.PSYCHIC, [ + [ Species.RABSCA, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FLITTLE, Type.PSYCHIC, -1, [ + [ Species.FLITTLE, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ESPATHRA, Type.PSYCHIC, -1, [ + [ Species.ESPATHRA, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TINKATINK, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATINK, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TINKATUFF, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATUFF, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TINKATON, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATON, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.WIGLETT, Type.WATER, -1, [ + [ Species.WIGLETT, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.WUGTRIO, Type.WATER, -1, [ + [ Species.WUGTRIO, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.BOMBIRDIER, Type.FLYING, Type.DARK, [ + [ Species.BOMBIRDIER, PokemonType.FLYING, PokemonType.DARK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FINIZEN, Type.WATER, -1, [ + [ Species.FINIZEN, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PALAFIN, Type.WATER, -1, [ + [ Species.PALAFIN, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VAROOM, Type.STEEL, Type.POISON, [ + [ Species.VAROOM, PokemonType.STEEL, PokemonType.POISON, [ [ Biome.METROPOLIS, BiomePoolTier.RARE ], [ Biome.SLUM, BiomePoolTier.RARE ] ] ], - [ Species.REVAVROOM, Type.STEEL, Type.POISON, [ + [ Species.REVAVROOM, PokemonType.STEEL, PokemonType.POISON, [ [ Biome.METROPOLIS, BiomePoolTier.RARE ], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ], [ Biome.SLUM, BiomePoolTier.RARE ], [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CYCLIZAR, Type.DRAGON, Type.NORMAL, [ + [ Species.CYCLIZAR, PokemonType.DRAGON, PokemonType.NORMAL, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ORTHWORM, Type.STEEL, -1, [ + [ Species.ORTHWORM, PokemonType.STEEL, -1, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GLIMMET, Type.ROCK, Type.POISON, [ + [ Species.GLIMMET, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.CAVE, BiomePoolTier.RARE ] ] ], - [ Species.GLIMMORA, Type.ROCK, Type.POISON, [ + [ Species.GLIMMORA, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GREAVARD, Type.GHOST, -1, [ + [ Species.GREAVARD, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.HOUNDSTONE, Type.GHOST, -1, [ + [ Species.HOUNDSTONE, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.FLAMIGO, Type.FLYING, Type.FIGHTING, [ + [ Species.FLAMIGO, PokemonType.FLYING, PokemonType.FIGHTING, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CETODDLE, Type.ICE, -1, [ + [ Species.CETODDLE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CETITAN, Type.ICE, -1, [ + [ Species.CETITAN, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.VELUZA, Type.WATER, Type.PSYCHIC, [ + [ Species.VELUZA, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.DONDOZO, Type.WATER, -1, [ + [ Species.DONDOZO, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.TATSUGIRI, Type.DRAGON, Type.WATER, [ + [ Species.TATSUGIRI, PokemonType.DRAGON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.ANNIHILAPE, Type.FIGHTING, Type.GHOST, [ + [ Species.ANNIHILAPE, PokemonType.FIGHTING, PokemonType.GHOST, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.CLODSIRE, Type.POISON, Type.GROUND, [ + [ Species.CLODSIRE, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FARIGIRAF, Type.NORMAL, Type.PSYCHIC, [ + [ Species.FARIGIRAF, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DUDUNSPARCE, Type.NORMAL, -1, [ + [ Species.DUDUNSPARCE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KINGAMBIT, Type.DARK, Type.STEEL, [ + [ Species.KINGAMBIT, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GREAT_TUSK, Type.GROUND, Type.FIGHTING, [ + [ Species.GREAT_TUSK, PokemonType.GROUND, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SCREAM_TAIL, Type.FAIRY, Type.PSYCHIC, [ + [ Species.SCREAM_TAIL, PokemonType.FAIRY, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.BRUTE_BONNET, Type.GRASS, Type.DARK, [ + [ Species.BRUTE_BONNET, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.FLUTTER_MANE, Type.GHOST, Type.FAIRY, [ + [ Species.FLUTTER_MANE, PokemonType.GHOST, PokemonType.FAIRY, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SLITHER_WING, Type.BUG, Type.FIGHTING, [ + [ Species.SLITHER_WING, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SANDY_SHOCKS, Type.ELECTRIC, Type.GROUND, [ + [ Species.SANDY_SHOCKS, PokemonType.ELECTRIC, PokemonType.GROUND, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_TREADS, Type.GROUND, Type.STEEL, [ + [ Species.IRON_TREADS, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_BUNDLE, Type.ICE, Type.WATER, [ + [ Species.IRON_BUNDLE, PokemonType.ICE, PokemonType.WATER, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_HANDS, Type.FIGHTING, Type.ELECTRIC, [ + [ Species.IRON_HANDS, PokemonType.FIGHTING, PokemonType.ELECTRIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_JUGULIS, Type.DARK, Type.FLYING, [ + [ Species.IRON_JUGULIS, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_MOTH, Type.FIRE, Type.POISON, [ + [ Species.IRON_MOTH, PokemonType.FIRE, PokemonType.POISON, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_THORNS, Type.ROCK, Type.ELECTRIC, [ + [ Species.IRON_THORNS, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.FRIGIBAX, Type.DRAGON, Type.ICE, [ + [ Species.FRIGIBAX, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.ARCTIBAX, Type.DRAGON, Type.ICE, [ + [ Species.ARCTIBAX, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.BAXCALIBUR, Type.DRAGON, Type.ICE, [ + [ Species.BAXCALIBUR, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.GIMMIGHOUL, Type.GHOST, -1, [ + [ Species.GIMMIGHOUL, PokemonType.GHOST, -1, [ [ Biome.TEMPLE, BiomePoolTier.RARE ] ] ], - [ Species.GHOLDENGO, Type.STEEL, Type.GHOST, [ + [ Species.GHOLDENGO, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.WO_CHIEN, Type.DARK, Type.GRASS, [ + [ Species.WO_CHIEN, PokemonType.DARK, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHIEN_PAO, Type.DARK, Type.ICE, [ + [ Species.CHIEN_PAO, PokemonType.DARK, PokemonType.ICE, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TING_LU, Type.DARK, Type.GROUND, [ + [ Species.TING_LU, PokemonType.DARK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHI_YU, Type.DARK, Type.FIRE, [ + [ Species.CHI_YU, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ROARING_MOON, Type.DRAGON, Type.DARK, [ + [ Species.ROARING_MOON, PokemonType.DRAGON, PokemonType.DARK, [ [ Biome.END, BiomePoolTier.UNCOMMON ] ] ], - [ Species.IRON_VALIANT, Type.FAIRY, Type.FIGHTING, [ + [ Species.IRON_VALIANT, PokemonType.FAIRY, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KORAIDON, Type.FIGHTING, Type.DRAGON, [ + [ Species.KORAIDON, PokemonType.FIGHTING, PokemonType.DRAGON, [ [ Biome.RUINS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MIRAIDON, Type.ELECTRIC, Type.DRAGON, [ + [ Species.MIRAIDON, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.WALKING_WAKE, Type.WATER, Type.DRAGON, [ + [ Species.WALKING_WAKE, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_LEAVES, Type.GRASS, Type.PSYCHIC, [ + [ Species.IRON_LEAVES, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.DIPPLIN, Type.GRASS, Type.DRAGON, [ + [ Species.DIPPLIN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.POLTCHAGEIST, Type.GRASS, Type.GHOST, [ + [ Species.POLTCHAGEIST, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.BADLANDS, BiomePoolTier.RARE ] ] ], - [ Species.SINISTCHA, Type.GRASS, Type.GHOST, [ + [ Species.SINISTCHA, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.BADLANDS, BiomePoolTier.RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.OKIDOGI, Type.POISON, Type.FIGHTING, [ + [ Species.OKIDOGI, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MUNKIDORI, Type.POISON, Type.PSYCHIC, [ + [ Species.MUNKIDORI, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.FEZANDIPITI, Type.POISON, Type.FAIRY, [ + [ Species.FEZANDIPITI, PokemonType.POISON, PokemonType.FAIRY, [ [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.OGERPON, Type.GRASS, -1, [ + [ Species.OGERPON, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ARCHALUDON, Type.STEEL, Type.DRAGON, [ + [ Species.ARCHALUDON, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HYDRAPPLE, Type.GRASS, Type.DRAGON, [ + [ Species.HYDRAPPLE, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GOUGING_FIRE, Type.FIRE, Type.DRAGON, [ + [ Species.GOUGING_FIRE, PokemonType.FIRE, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.RAGING_BOLT, Type.ELECTRIC, Type.DRAGON, [ + [ Species.RAGING_BOLT, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_BOULDER, Type.ROCK, Type.PSYCHIC, [ + [ Species.IRON_BOULDER, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_CROWN, Type.STEEL, Type.PSYCHIC, [ + [ Species.IRON_CROWN, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.TERAPAGOS, Type.NORMAL, -1, [ + [ Species.TERAPAGOS, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.PECHARUNT, Type.POISON, Type.GHOST, [ ] + [ Species.PECHARUNT, PokemonType.POISON, PokemonType.GHOST, [ ] ], - [ Species.ALOLA_RATTATA, Type.DARK, Type.NORMAL, [ + [ Species.ALOLA_RATTATA, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_RATICATE, Type.DARK, Type.NORMAL, [ + [ Species.ALOLA_RATICATE, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_RAICHU, Type.ELECTRIC, Type.PSYCHIC, [ + [ Species.ALOLA_RAICHU, PokemonType.ELECTRIC, PokemonType.PSYCHIC, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ALOLA_SANDSHREW, Type.ICE, Type.STEEL, [ + [ Species.ALOLA_SANDSHREW, PokemonType.ICE, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ALOLA_SANDSLASH, Type.ICE, Type.STEEL, [ + [ Species.ALOLA_SANDSLASH, PokemonType.ICE, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ALOLA_VULPIX, Type.ICE, -1, [ + [ Species.ALOLA_VULPIX, PokemonType.ICE, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ALOLA_NINETALES, Type.ICE, Type.FAIRY, [ + [ Species.ALOLA_NINETALES, PokemonType.ICE, PokemonType.FAIRY, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ALOLA_DIGLETT, Type.GROUND, Type.STEEL, [ + [ Species.ALOLA_DIGLETT, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_DUGTRIO, Type.GROUND, Type.STEEL, [ + [ Species.ALOLA_DUGTRIO, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_MEOWTH, Type.DARK, -1, [ + [ Species.ALOLA_MEOWTH, PokemonType.DARK, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_PERSIAN, Type.DARK, -1, [ + [ Species.ALOLA_PERSIAN, PokemonType.DARK, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_GEODUDE, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GEODUDE, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_GRAVELER, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GRAVELER, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_GOLEM, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GOLEM, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_GRIMER, Type.POISON, Type.DARK, [ + [ Species.ALOLA_GRIMER, PokemonType.POISON, PokemonType.DARK, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_MUK, Type.POISON, Type.DARK, [ + [ Species.ALOLA_MUK, PokemonType.POISON, PokemonType.DARK, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_EXEGGUTOR, Type.GRASS, Type.DRAGON, [ + [ Species.ALOLA_EXEGGUTOR, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ALOLA_MAROWAK, Type.FIRE, Type.GHOST, [ + [ Species.ALOLA_MAROWAK, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ETERNAL_FLOETTE, Type.FAIRY, -1, [ + [ Species.ETERNAL_FLOETTE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GALAR_MEOWTH, Type.STEEL, -1, [ + [ Species.GALAR_MEOWTH, PokemonType.STEEL, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ] ] ], - [ Species.GALAR_PONYTA, Type.PSYCHIC, -1, [ + [ Species.GALAR_PONYTA, PokemonType.PSYCHIC, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ] ] ], - [ Species.GALAR_RAPIDASH, Type.PSYCHIC, Type.FAIRY, [ + [ Species.GALAR_RAPIDASH, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, TimeOfDay.DAWN ] ] ], - [ Species.GALAR_SLOWPOKE, Type.PSYCHIC, -1, [ + [ Species.GALAR_SLOWPOKE, PokemonType.PSYCHIC, -1, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_SLOWBRO, Type.POISON, Type.PSYCHIC, [ + [ Species.GALAR_SLOWBRO, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_FARFETCHD, Type.FIGHTING, -1, [ + [ Species.GALAR_FARFETCHD, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_WEEZING, Type.POISON, Type.FAIRY, [ + [ Species.GALAR_WEEZING, PokemonType.POISON, PokemonType.FAIRY, [ [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GALAR_MR_MIME, Type.ICE, Type.PSYCHIC, [ + [ Species.GALAR_MR_MIME, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_ARTICUNO, Type.PSYCHIC, Type.FLYING, [ + [ Species.GALAR_ARTICUNO, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_ZAPDOS, Type.FIGHTING, Type.FLYING, [ + [ Species.GALAR_ZAPDOS, PokemonType.FIGHTING, PokemonType.FLYING, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_MOLTRES, Type.DARK, Type.FLYING, [ + [ Species.GALAR_MOLTRES, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_SLOWKING, Type.POISON, Type.PSYCHIC, [ + [ Species.GALAR_SLOWKING, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_CORSOLA, Type.GHOST, -1, [ + [ Species.GALAR_CORSOLA, PokemonType.GHOST, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_ZIGZAGOON, Type.DARK, Type.NORMAL, [ + [ Species.GALAR_ZIGZAGOON, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_LINOONE, Type.DARK, Type.NORMAL, [ + [ Species.GALAR_LINOONE, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_DARUMAKA, Type.ICE, -1, [ + [ Species.GALAR_DARUMAKA, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_DARMANITAN, Type.ICE, -1, [ + [ Species.GALAR_DARMANITAN, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_YAMASK, Type.GROUND, Type.GHOST, [ + [ Species.GALAR_YAMASK, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_STUNFISK, Type.GROUND, Type.STEEL, [ + [ Species.GALAR_STUNFISK, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_GROWLITHE, Type.FIRE, Type.ROCK, [ + [ Species.HISUI_GROWLITHE, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_ARCANINE, Type.FIRE, Type.ROCK, [ + [ Species.HISUI_ARCANINE, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_VOLTORB, Type.ELECTRIC, Type.GRASS, [ + [ Species.HISUI_VOLTORB, PokemonType.ELECTRIC, PokemonType.GRASS, [ [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_ELECTRODE, Type.ELECTRIC, Type.GRASS, [ + [ Species.HISUI_ELECTRODE, PokemonType.ELECTRIC, PokemonType.GRASS, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_TYPHLOSION, Type.FIRE, Type.GHOST, [ + [ Species.HISUI_TYPHLOSION, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_QWILFISH, Type.DARK, Type.POISON, [ + [ Species.HISUI_QWILFISH, PokemonType.DARK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_SNEASEL, Type.FIGHTING, Type.POISON, [ + [ Species.HISUI_SNEASEL, PokemonType.FIGHTING, PokemonType.POISON, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_SAMUROTT, Type.WATER, Type.DARK, [ + [ Species.HISUI_SAMUROTT, PokemonType.WATER, PokemonType.DARK, [ [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_LILLIGANT, Type.GRASS, Type.FIGHTING, [ + [ Species.HISUI_LILLIGANT, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_ZORUA, Type.NORMAL, Type.GHOST, [ + [ Species.HISUI_ZORUA, PokemonType.NORMAL, PokemonType.GHOST, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HISUI_ZOROARK, Type.NORMAL, Type.GHOST, [ + [ Species.HISUI_ZOROARK, PokemonType.NORMAL, PokemonType.GHOST, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HISUI_BRAVIARY, Type.PSYCHIC, Type.FLYING, [ + [ Species.HISUI_BRAVIARY, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_SLIGGOO, Type.STEEL, Type.DRAGON, [ + [ Species.HISUI_SLIGGOO, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_GOODRA, Type.STEEL, Type.DRAGON, [ + [ Species.HISUI_GOODRA, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_AVALUGG, Type.ICE, Type.ROCK, [ + [ Species.HISUI_AVALUGG, PokemonType.ICE, PokemonType.ROCK, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_DECIDUEYE, Type.GRASS, Type.FIGHTING, [ + [ Species.HISUI_DECIDUEYE, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PALDEA_TAUROS, Type.FIGHTING, -1, [ + [ Species.PALDEA_TAUROS, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PALDEA_WOOPER, Type.POISON, Type.GROUND, [ + [ Species.PALDEA_WOOPER, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BLOODMOON_URSALUNA, Type.GROUND, Type.NORMAL, [ + [ Species.BLOODMOON_URSALUNA, PokemonType.GROUND, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.SUPER_RARE, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ] ] diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index ae61acbd32e..1bac63e9560 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index 0e101c7155b..6cf79bb45f1 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -2,7 +2,7 @@ import { globalScene } from "#app/global-scene"; import { Gender } from "#app/data/gender"; import { PokeballType } from "#enums/pokeball"; import type Pokemon from "#app/field/pokemon"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; import { WeatherType } from "#enums/weather-type"; import { Nature } from "#enums/nature"; @@ -216,12 +216,12 @@ class FriendshipTimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { class FriendshipMoveTypeEvolutionCondition extends SpeciesEvolutionCondition { public amount: number; - public type: Type; - constructor(amount: number, type: Type) { + public type: PokemonType; + constructor(amount: number, type: PokemonType) { super(p => p.friendship >= amount && !!p.getMoveset().find(m => m?.getMove().type === type)); this.amount = amount; this.type = type; - this.description = i18next.t("pokemonEvolutions:friendshipMoveType", { type: i18next.t(`pokemonInfo:Type.${Type[this.type]}`) }); + this.description = i18next.t("pokemonEvolutions:friendshipMoveType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); } } @@ -233,11 +233,11 @@ class ShedinjaEvolutionCondition extends SpeciesEvolutionCondition { } class PartyTypeEvolutionCondition extends SpeciesEvolutionCondition { - public type: Type; - constructor(type: Type) { + public type: PokemonType; + constructor(type: PokemonType) { super(() => !!globalScene.getPlayerParty().find(p => p.getTypes(false, false, true).indexOf(type) > -1)); this.type = type; - this.description = i18next.t("pokemonEvolutions:partyType", { type: i18next.t(`pokemonInfo:Type.${Type[this.type]}`) }); + this.description = i18next.t("pokemonEvolutions:partyType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); } } @@ -260,11 +260,11 @@ class WeatherEvolutionCondition extends SpeciesEvolutionCondition { } class MoveTypeEvolutionCondition extends SpeciesEvolutionCondition { - public type: Type; - constructor(type: Type) { + public type: PokemonType; + constructor(type: PokemonType) { super(p => p.moveset.filter(m => m?.getMove().type === type).length > 0); this.type = type; - this.description = i18next.t("pokemonEvolutions:moveType", { type: i18next.t(`pokemonInfo:Type.${Type[this.type]}`) }); + this.description = i18next.t("pokemonEvolutions:moveType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); } } @@ -1103,7 +1103,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GOGOAT, 32, null, null) ], [Species.PANCHAM]: [ - new SpeciesEvolution(Species.PANGORO, 32, null, new PartyTypeEvolutionCondition(Type.DARK), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.PANGORO, 32, null, new PartyTypeEvolutionCondition(PokemonType.DARK), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.ESPURR]: [ new SpeciesFormEvolution(Species.MEOWSTIC, "", "female", 25, null, new GenderEvolutionCondition(Gender.FEMALE)), @@ -1519,8 +1519,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EEVEE]: [ - new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, Type.FAIRY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, Type.FAIRY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, PokemonType.FAIRY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, PokemonType.FAIRY), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "day"), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "day"), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "night"), SpeciesWildEvolutionDelay.LONG), @@ -1758,7 +1758,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GENGAR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ONIX]: [ - new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(Type.STEEL), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(PokemonType.STEEL), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.PROTECTOR, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1767,7 +1767,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KINGDRA, 1, EvolutionItem.DRAGON_SCALE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SCYTHER]: [ - new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(Type.STEEL), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(PokemonType.STEEL), SpeciesWildEvolutionDelay.VERY_LONG), new SpeciesEvolution(Species.KLEAVOR, 1, EvolutionItem.BLACK_AUGURITE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index a42779563f2..d3c9f393209 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -3,10 +3,10 @@ import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, - MoveFlags, SelfStatusMove, allMoves, -} from "./move"; +} from "./moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; import type Pokemon from "../field/pokemon"; import { type nil, diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 7b16c718f07..4a8c48d5e71 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -8,20 +8,20 @@ import { ReverseDrainAbAttr } from "#app/data/ability"; import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "#app/data/battle-anims"; -import type Move from "#app/data/move"; +import type Move from "#app/data/moves/move"; import { allMoves, applyMoveAttrs, ConsecutiveUseDoublePowerAttr, HealOnAllyAttr, - MoveCategory, - MoveFlags, StatusCategoryOnAllyAttr -} from "#app/data/move"; +} from "#app/data/moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveCategory } from "#enums/MoveCategory"; import { SpeciesFormChangeAbilityTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; import { TerrainType } from "#app/data/terrain"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type Pokemon from "#app/field/pokemon"; import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -514,7 +514,7 @@ export class TrappedTag extends BattlerTag { const source = globalScene.getPokemonById(this.sourceId!)!; const move = allMoves[this.sourceMove]; - const isGhost = pokemon.isOfType(Type.GHOST); + const isGhost = pokemon.isOfType(PokemonType.GHOST); const isTrapped = pokemon.getTag(TrappedTag); const hasSubstitute = move.hitsSubstitute(source, pokemon); @@ -819,7 +819,7 @@ export class SeedTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - return !pokemon.isOfType(Type.GRASS); + return !pokemon.isOfType(PokemonType.GRASS); } onAdd(pokemon: Pokemon): void { @@ -889,7 +889,7 @@ export class PowderTag extends BattlerTag { if (movePhase instanceof MovePhase) { const move = movePhase.move.getMove(); const weather = globalScene.arena.weather; - if (pokemon.getMoveType(move) === Type.FIRE && !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed())) { + if (pokemon.getMoveType(move) === PokemonType.FIRE && !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed())) { movePhase.fail(); movePhase.showMoveText(); @@ -1832,9 +1832,9 @@ export class SemiInvulnerableTag extends BattlerTag { } export class TypeImmuneTag extends BattlerTag { - public immuneType: Type; + public immuneType: PokemonType; - constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number = 1) { + constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: PokemonType, length: number = 1) { super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove, undefined, true); this.immuneType = immuneType; @@ -1846,7 +1846,7 @@ export class TypeImmuneTag extends BattlerTag { */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.immuneType = source.immuneType as Type; + this.immuneType = source.immuneType as PokemonType; } } @@ -1857,7 +1857,7 @@ export class TypeImmuneTag extends BattlerTag { */ export class FloatingTag extends TypeImmuneTag { constructor(tagType: BattlerTagType, sourceMove: Moves, turnCount: number) { - super(tagType, sourceMove, Type.GROUND, turnCount); + super(tagType, sourceMove, PokemonType.GROUND, turnCount); } onAdd(pokemon: Pokemon): void { @@ -1878,11 +1878,11 @@ export class FloatingTag extends TypeImmuneTag { } export class TypeBoostTag extends BattlerTag { - public boostedType: Type; + public boostedType: PokemonType; public boostValue: number; public oneUse: boolean; - constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: Type, boostValue: number, oneUse: boolean) { + constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: PokemonType, boostValue: number, oneUse: boolean) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove); this.boostedType = boostedType; @@ -1896,7 +1896,7 @@ export class TypeBoostTag extends BattlerTag { */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.boostedType = source.boostedType as Type; + this.boostedType = source.boostedType as PokemonType; this.boostValue = source.boostValue; this.oneUse = source.oneUse; } @@ -1934,7 +1934,7 @@ export class CritBoostTag extends BattlerTag { */ export class DragonCheerTag extends CritBoostTag { /** The types of the user's ally when the tag is added */ - public typesOnAdd: Type[]; + public typesOnAdd: PokemonType[]; constructor() { super(BattlerTagType.CRIT_BOOST, Moves.DRAGON_CHEER); @@ -1980,7 +1980,7 @@ export class SaltCuredTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); + const pokemonSteelOrWater = pokemon.isOfType(PokemonType.STEEL) || pokemon.isOfType(PokemonType.WATER); pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); globalScene.queueMessage( @@ -2071,21 +2071,21 @@ export class RoostedTag extends BattlerTag { const currentTypes = pokemon.getTypes(); const baseTypes = pokemon.getTypes(false, false, true); - const forestsCurseApplied: boolean = currentTypes.includes(Type.GRASS) && !baseTypes.includes(Type.GRASS); - const trickOrTreatApplied: boolean = currentTypes.includes(Type.GHOST) && !baseTypes.includes(Type.GHOST); + const forestsCurseApplied: boolean = currentTypes.includes(PokemonType.GRASS) && !baseTypes.includes(PokemonType.GRASS); + const trickOrTreatApplied: boolean = currentTypes.includes(PokemonType.GHOST) && !baseTypes.includes(PokemonType.GHOST); if (this.isBaseFlying) { - let modifiedTypes: Type[] = []; + let modifiedTypes: PokemonType[] = []; if (this.isBasePureFlying) { if (forestsCurseApplied || trickOrTreatApplied) { - modifiedTypes = currentTypes.filter(type => type !== Type.NORMAL); - modifiedTypes.push(Type.FLYING); + modifiedTypes = currentTypes.filter(type => type !== PokemonType.NORMAL); + modifiedTypes.push(PokemonType.FLYING); } else { - modifiedTypes = [ Type.FLYING ]; + modifiedTypes = [ PokemonType.FLYING ]; } } else { modifiedTypes = [ ...currentTypes ]; - modifiedTypes.push(Type.FLYING); + modifiedTypes.push(PokemonType.FLYING); } pokemon.summonData.types = modifiedTypes; pokemon.updateInfo(); @@ -2098,18 +2098,18 @@ export class RoostedTag extends BattlerTag { const isOriginallyDualType = baseTypes.length === 2; const isCurrentlyDualType = currentTypes.length === 2; - this.isBaseFlying = baseTypes.includes(Type.FLYING); - this.isBasePureFlying = baseTypes[0] === Type.FLYING && baseTypes.length === 1; + this.isBaseFlying = baseTypes.includes(PokemonType.FLYING); + this.isBasePureFlying = baseTypes[0] === PokemonType.FLYING && baseTypes.length === 1; if (this.isBaseFlying) { - let modifiedTypes: Type[]; + let modifiedTypes: PokemonType[]; if (this.isBasePureFlying && !isCurrentlyDualType) { - modifiedTypes = [ Type.NORMAL ]; + modifiedTypes = [ PokemonType.NORMAL ]; } else { if (!!pokemon.getTag(RemovedTypeTag) && isOriginallyDualType && !isCurrentlyDualType) { - modifiedTypes = [ Type.UNKNOWN ]; + modifiedTypes = [ PokemonType.UNKNOWN ]; } else { - modifiedTypes = currentTypes.filter(type => type !== Type.FLYING); + modifiedTypes = currentTypes.filter(type => type !== PokemonType.FLYING); } } pokemon.summonData.types = modifiedTypes; @@ -2374,10 +2374,10 @@ export class GulpMissileTag extends BattlerTag { * @see {@linkcode ignoreImmunity} */ export class ExposedTag extends BattlerTag { - private defenderType: Type; - private allowedTypes: Type[]; + private defenderType: PokemonType; + private allowedTypes: PokemonType[]; - constructor(tagType: BattlerTagType, sourceMove: Moves, defenderType: Type, allowedTypes: Type[]) { + constructor(tagType: BattlerTagType, sourceMove: Moves, defenderType: PokemonType, allowedTypes: PokemonType[]) { super(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove); this.defenderType = defenderType; this.allowedTypes = allowedTypes; @@ -2389,16 +2389,16 @@ export class ExposedTag extends BattlerTag { */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.defenderType = source.defenderType as Type; - this.allowedTypes = source.allowedTypes as Type[]; + this.defenderType = source.defenderType as PokemonType; + this.allowedTypes = source.allowedTypes as PokemonType[]; } /** - * @param types {@linkcode Type} of the defending Pokemon - * @param moveType {@linkcode Type} of the move targetting it + * @param types {@linkcode PokemonType} of the defending Pokemon + * @param moveType {@linkcode PokemonType} of the move targetting it * @returns `true` if the move should be allowed to target the defender. */ - ignoreImmunity(type: Type, moveType: Type): boolean { + ignoreImmunity(type: PokemonType, moveType: PokemonType): boolean { return type === this.defenderType && this.allowedTypes.includes(moveType); } } @@ -3103,7 +3103,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.HIDDEN: return new SemiInvulnerableTag(tagType, turnCount, sourceMove); case BattlerTagType.FIRE_BOOST: - return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); + return new TypeBoostTag(tagType, sourceMove, PokemonType.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: return new CritBoostTag(tagType, sourceMove); case BattlerTagType.DRAGON_CHEER: @@ -3129,7 +3129,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.CURSED: return new CursedTag(sourceId); case BattlerTagType.CHARGED: - return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); + return new TypeBoostTag(tagType, sourceMove, PokemonType.ELECTRIC, 2, true); case BattlerTagType.FLOATING: return new FloatingTag(tagType, sourceMove, turnCount); case BattlerTagType.MINIMIZED: @@ -3149,9 +3149,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.DISABLED: return new DisabledTag(sourceId); case BattlerTagType.IGNORE_GHOST: - return new ExposedTag(tagType, sourceMove, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]); + return new ExposedTag(tagType, sourceMove, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]); case BattlerTagType.IGNORE_DARK: - return new ExposedTag(tagType, sourceMove, Type.DARK, [ Type.PSYCHIC ]); + return new ExposedTag(tagType, sourceMove, PokemonType.DARK, [ PokemonType.PSYCHIC ]); case BattlerTagType.GULP_MISSILE_ARROKUDA: case BattlerTagType.GULP_MISSILE_PIKACHU: return new GulpMissileTag(tagType, sourceMove); diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 30c2c9a6ce4..49af78292c3 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -11,7 +11,7 @@ import type { FixedBattleConfig } from "#app/battle"; import { ClassicFixedBossWaves, BattleType, getRandomTrainerFunc } from "#app/battle"; import Trainer, { TrainerVariant } from "#app/field/trainer"; import type { GameMode } from "#app/game-mode"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; @@ -572,7 +572,7 @@ interface monotypeOverride { /** The species to override */ species: Species; /** The type to count as */ - type: Type; + type: PokemonType; /** If part of a fusion, should we check the fused species instead of the base species? */ fusion: boolean; } @@ -582,7 +582,7 @@ interface monotypeOverride { */ export class SingleTypeChallenge extends Challenge { private static TYPE_OVERRIDES: monotypeOverride[] = [ - { species: Species.CASTFORM, type: Type.NORMAL, fusion: false }, + { species: Species.CASTFORM, type: PokemonType.NORMAL, fusion: false }, ]; // TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy private static SPECIES_OVERRIDES: Species[] = [ Species.MELOETTA ]; @@ -647,7 +647,7 @@ export class SingleTypeChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return Type[this.value - 1].toLowerCase(); + return PokemonType[this.value - 1].toLowerCase(); } /** @@ -659,8 +659,8 @@ export class SingleTypeChallenge extends Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`); - const typeColor = `[color=${TypeColor[Type[this.value - 1]]}][shadow=${TypeShadow[Type[this.value - 1]]}]${type}[/shadow][/color]`; + 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]`; const defaultDesc = i18next.t("challenges:singleType.desc_default"); const typeDesc = i18next.t("challenges:singleType.desc", { type: typeColor }); return this.value === 0 ? defaultDesc : typeDesc; diff --git a/src/data/custom-pokemon-data.ts b/src/data/custom-pokemon-data.ts index 4a5eb89aeed..d95d9f77b83 100644 --- a/src/data/custom-pokemon-data.ts +++ b/src/data/custom-pokemon-data.ts @@ -1,5 +1,5 @@ import type { Abilities } from "#enums/abilities"; -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; import { isNullOrUndefined } from "#app/utils"; import type { Nature } from "#enums/nature"; @@ -13,7 +13,7 @@ export class CustomPokemonData { public ability: Abilities | -1; public passive: Abilities | -1; public nature: Nature | -1; - public types: Type[]; + public types: PokemonType[]; /** `hitsReceivedCount` aka `hitsRecCount` saves how often the pokemon got hit until a new arena encounter (used for Rage Fist) */ public hitsRecCount: number; diff --git a/src/data/moves/invalid-moves.ts b/src/data/moves/invalid-moves.ts new file mode 100644 index 00000000000..50f815b9e58 --- /dev/null +++ b/src/data/moves/invalid-moves.ts @@ -0,0 +1,281 @@ +import { Moves } from "#enums/moves"; + +/** Set of moves that cannot be called by {@linkcode Moves.METRONOME Metronome} */ +export const invalidMetronomeMoves: ReadonlySet = new Set([ + Moves.AFTER_YOU, + Moves.APPLE_ACID, + Moves.ARMOR_CANNON, + Moves.ASSIST, + Moves.ASTRAL_BARRAGE, + Moves.AURA_WHEEL, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BEHEMOTH_BASH, + Moves.BEHEMOTH_BLADE, + Moves.BELCH, + Moves.BESTOW, + Moves.BLAZING_TORQUE, + Moves.BODY_PRESS, + Moves.BRANCH_POKE, + Moves.BREAKING_SWIPE, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CHILLING_WATER, + Moves.CHILLY_RECEPTION, + Moves.CLANGOROUS_SOUL, + Moves.COLLISION_COURSE, + Moves.COMBAT_TORQUE, + Moves.COMEUPPANCE, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.CRAFTY_SHIELD, + Moves.DECORATE, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DIAMOND_STORM, + Moves.DOODLE, + Moves.DOUBLE_IRON_BASH, + Moves.DOUBLE_SHOCK, + Moves.DRAGON_ASCENT, + Moves.DRAGON_ENERGY, + Moves.DRUM_BEATING, + Moves.DYNAMAX_CANNON, + Moves.ELECTRO_DRIFT, + Moves.ENDURE, + Moves.ETERNABEAM, + Moves.FALSE_SURRENDER, + Moves.FEINT, + Moves.FIERY_WRATH, + Moves.FILLET_AWAY, + Moves.FLEUR_CANNON, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.FREEZE_SHOCK, + Moves.FREEZING_GLARE, + Moves.GLACIAL_LANCE, + Moves.GRAV_APPLE, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.HYPER_DRILL, + Moves.HYPERSPACE_FURY, + Moves.HYPERSPACE_HOLE, + Moves.ICE_BURN, + Moves.INSTRUCT, + Moves.JET_PUNCH, + Moves.JUNGLE_HEALING, + Moves.KINGS_SHIELD, + Moves.LIFE_DEW, + Moves.LIGHT_OF_RUIN, + Moves.MAKE_IT_RAIN, + Moves.MAGICAL_TORQUE, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METEOR_ASSAULT, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIND_BLOWN, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.MOONGEIST_BEAM, + Moves.NATURE_POWER, + Moves.NATURES_MADNESS, + Moves.NOXIOUS_TORQUE, + Moves.OBSTRUCT, + Moves.ORDER_UP, + Moves.ORIGIN_PULSE, + Moves.OVERDRIVE, + Moves.PHOTON_GEYSER, + Moves.PLASMA_FISTS, + Moves.POPULATION_BOMB, + Moves.POUNCE, + Moves.POWER_SHIFT, + Moves.PRECIPICE_BLADES, + Moves.PROTECT, + Moves.PYRO_BALL, + Moves.QUASH, + Moves.QUICK_GUARD, + Moves.RAGE_FIST, + Moves.RAGE_POWDER, + Moves.RAGING_BULL, + Moves.RAGING_FURY, + Moves.RELIC_SONG, + Moves.REVIVAL_BLESSING, + Moves.RUINATION, + Moves.SALT_CURE, + Moves.SECRET_SWORD, + Moves.SHED_TAIL, + Moves.SHELL_TRAP, + Moves.SILK_TRAP, + Moves.SKETCH, + Moves.SLEEP_TALK, + Moves.SNAP_TRAP, + Moves.SNARL, + Moves.SNATCH, + Moves.SNORE, + Moves.SNOWSCAPE, + Moves.SPECTRAL_THIEF, + Moves.SPICY_EXTRACT, + Moves.SPIKY_SHIELD, + Moves.SPIRIT_BREAK, + Moves.SPOTLIGHT, + Moves.STEAM_ERUPTION, + Moves.STEEL_BEAM, + Moves.STRANGE_STEAM, + Moves.STRUGGLE, + Moves.SUNSTEEL_STRIKE, + Moves.SURGING_STRIKES, + Moves.SWITCHEROO, + Moves.TECHNO_BLAST, + Moves.TERA_STARSTORM, + Moves.THIEF, + Moves.THOUSAND_ARROWS, + Moves.THOUSAND_WAVES, + Moves.THUNDER_CAGE, + Moves.THUNDEROUS_KICK, + Moves.TIDY_UP, + Moves.TRAILBLAZE, + Moves.TRANSFORM, + Moves.TRICK, + Moves.TWIN_BEAM, + Moves.V_CREATE, + Moves.WICKED_BLOW, + Moves.WICKED_TORQUE, + Moves.WIDE_GUARD, +]); + +/** Set of moves that cannot be called by {@linkcode Moves.ASSIST Assist} */ +export const invalidAssistMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BELCH, + Moves.BESTOW, + Moves.BOUNCE, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CIRCLE_THROW, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DIG, + Moves.DIVE, + Moves.DRAGON_TAIL, + Moves.ENDURE, + Moves.FEINT, + Moves.FLY, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.KINGS_SHIELD, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.NATURE_POWER, + Moves.PHANTOM_FORCE, + Moves.PROTECT, + Moves.RAGE_POWDER, + Moves.ROAR, + Moves.SHADOW_FORCE, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SKY_DROP, + Moves.SLEEP_TALK, + Moves.SNATCH, + Moves.SPIKY_SHIELD, + Moves.SPOTLIGHT, + Moves.STRUGGLE, + Moves.SWITCHEROO, + Moves.THIEF, + Moves.TRANSFORM, + Moves.TRICK, + Moves.WHIRLWIND, +]); + +/** Set of moves that cannot be called by {@linkcode Moves.SLEEP_TALK Sleep Talk} */ +export const invalidSleepTalkMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BELCH, + Moves.BEAK_BLAST, + Moves.BIDE, + Moves.BOUNCE, + Moves.COPYCAT, + Moves.DIG, + Moves.DIVE, + Moves.DYNAMAX_CANNON, + Moves.FREEZE_SHOCK, + Moves.FLY, + Moves.FOCUS_PUNCH, + Moves.GEOMANCY, + Moves.ICE_BURN, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIRROR_MOVE, + Moves.MIMIC, + Moves.PHANTOM_FORCE, + Moves.RAZOR_WIND, + Moves.SHADOW_FORCE, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SKULL_BASH, + Moves.SKY_ATTACK, + Moves.SKY_DROP, + Moves.SLEEP_TALK, + Moves.SOLAR_BLADE, + Moves.SOLAR_BEAM, + Moves.STRUGGLE, + Moves.UPROAR, +]); + +/** Set of moves that cannot be copied by {@linkcode Moves.COPYCAT Copycat} */ +export const invalidCopycatMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BEHEMOTH_BASH, + Moves.BEHEMOTH_BLADE, + Moves.BESTOW, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CIRCLE_THROW, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DRAGON_TAIL, + Moves.ENDURE, + Moves.FEINT, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.KINGS_SHIELD, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.PROTECT, + Moves.RAGE_POWDER, + Moves.ROAR, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SLEEP_TALK, + Moves.SNATCH, + Moves.SPIKY_SHIELD, + Moves.SPOTLIGHT, + Moves.STRUGGLE, + Moves.SWITCHEROO, + Moves.THIEF, + Moves.TRANSFORM, + Moves.TRICK, + Moves.WHIRLWIND, +]); diff --git a/src/data/move.ts b/src/data/moves/move.ts similarity index 79% rename from src/data/move.ts rename to src/data/moves/move.ts index 677ad9f0ebc..f2157ab65b7 100644 --- a/src/data/move.ts +++ b/src/data/moves/move.ts @@ -1,4 +1,4 @@ -import { ChargeAnim, MoveChargeAnim } from "./battle-anims"; +import { ChargeAnim, MoveChargeAnim } from "../battle-anims"; import { CommandedTag, EncoreTag, @@ -10,30 +10,30 @@ import { SubstituteTag, TrappedTag, TypeBoostTag, -} from "./battler-tags"; -import { getPokemonNameWithAffix } from "../messages"; -import type { AttackMoveResult, TurnMove } from "../field/pokemon"; -import type Pokemon from "../field/pokemon"; +} from "../battler-tags"; +import { getPokemonNameWithAffix } from "../../messages"; +import type { AttackMoveResult, TurnMove } from "../../field/pokemon"; +import type Pokemon from "../../field/pokemon"; import { EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, -} from "../field/pokemon"; +} from "../../field/pokemon"; import { getNonVolatileStatusEffects, getStatusEffectHealText, isNonVolatileStatusEffect, -} from "./status-effect"; -import { getTypeDamageMultiplier } from "./type"; -import { Type } from "#enums/type"; +} from "../status-effect"; +import { getTypeDamageMultiplier } from "../type"; +import { PokemonType } from "#enums/pokemon-type"; import type { Constructor } from "#app/utils"; import { NumberHolder } from "#app/utils"; -import * as Utils from "../utils"; +import * as Utils from "../../utils"; import { WeatherType } from "#enums/weather-type"; -import type { ArenaTrapTag } from "./arena-tag"; -import { ArenaTagSide, WeakenMoveTypeTag } from "./arena-tag"; +import type { ArenaTrapTag } from "../arena-tag"; +import { ArenaTagSide, WeakenMoveTypeTag } from "../arena-tag"; import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, @@ -69,7 +69,7 @@ import { UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr, -} from "./ability"; +} from "../ability"; import { AttackTypeBoosterModifier, BerryModifier, @@ -77,15 +77,15 @@ import { PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PreserveBerryModifier, -} from "../modifier/modifier"; -import type { BattlerIndex } from "../battle"; -import { BattleType } from "../battle"; -import { TerrainType } from "./terrain"; +} from "../../modifier/modifier"; +import type { BattlerIndex } from "../../battle"; +import { BattleType } from "../../battle"; +import { TerrainType } from "../terrain"; import { ModifierPoolType } from "#app/modifier/modifier-type"; -import { Command } from "../ui/command-ui-handler"; +import { Command } from "../../ui/command-ui-handler"; import i18next from "i18next"; import type { Localizable } from "#app/interfaces/locales"; -import { getBerryEffectFunc } from "./berry"; +import { getBerryEffectFunc } from "../berry"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -109,9 +109,9 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchPhase } from "#app/phases/switch-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { SpeciesFormChangeRevertWeatherFormTrigger } from "./pokemon-forms"; +import { SpeciesFormChangeRevertWeatherFormTrigger } from "../pokemon-forms"; import type { GameMode } from "#app/game-mode"; -import { applyChallenges, ChallengeType } from "./challenge"; +import { applyChallenges, ChallengeType } from "../challenge"; import { SwitchType } from "#enums/switch-type"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; @@ -120,89 +120,12 @@ import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; import { MoveAnimPhase } from "#app/phases/move-anim-phase"; import { loggedInUser } from "#app/account"; - -export enum MoveCategory { - PHYSICAL, - SPECIAL, - STATUS -} - -export enum MoveTarget { - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_the_user Moves that target the User} */ - USER, - OTHER, - ALL_OTHERS, - NEAR_OTHER, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_Pok%C3%A9mon Moves that target all adjacent Pokemon} */ - ALL_NEAR_OTHERS, - NEAR_ENEMY, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_foes Moves that target all adjacent foes} */ - ALL_NEAR_ENEMIES, - RANDOM_NEAR_ENEMY, - ALL_ENEMIES, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Counterattacks Counterattacks} */ - ATTACKER, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_one_adjacent_ally Moves that target one adjacent ally} */ - NEAR_ALLY, - ALLY, - USER_OR_NEAR_ALLY, - USER_AND_ALLIES, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_Pok%C3%A9mon Moves that target all Pokemon} */ - ALL, - USER_SIDE, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Entry_hazard-creating_moves Entry hazard-creating moves} */ - ENEMY_SIDE, - BOTH_SIDES, - PARTY, - CURSE -} - -export enum MoveFlags { - NONE = 0, - MAKES_CONTACT = 1 << 0, - IGNORE_PROTECT = 1 << 1, - /** - * Sound-based moves have the following effects: - * - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves. - * - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns. - * - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves. - * - Sound-based moves used by a Pokemon with {@linkcode Abilities.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 Moves.SUBSTITUTE Substitute}. - * - * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move - */ - SOUND_BASED = 1 << 2, - HIDE_USER = 1 << 3, - HIDE_TARGET = 1 << 4, - BITING_MOVE = 1 << 5, - PULSE_MOVE = 1 << 6, - PUNCHING_MOVE = 1 << 7, - SLICING_MOVE = 1 << 8, - /** - * Indicates a move should be affected by {@linkcode Abilities.RECKLESS} - * @see {@linkcode Move.recklessMove()} - */ - RECKLESS_MOVE = 1 << 9, - /** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */ - BALLBOMB_MOVE = 1 << 10, - /** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */ - POWDER_MOVE = 1 << 11, - /** Indicates a move should trigger {@linkcode Abilities.DANCER} */ - DANCE_MOVE = 1 << 12, - /** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */ - WIND_MOVE = 1 << 13, - /** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */ - TRIAGE_MOVE = 1 << 14, - IGNORE_ABILITIES = 1 << 15, - /** Enables all hits of a multi-hit move to be accuracy checked individually */ - CHECK_ALL_HITS = 1 << 16, - /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ - IGNORE_SUBSTITUTE = 1 << 17, - /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ - REDIRECT_COUNTER = 1 << 18, - /** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */ - REFLECTABLE = 1 << 19, -} +import { MoveCategory } from "#enums/MoveCategory"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; +import { MultiHitType } from "#enums/MultiHitType"; +import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidSleepTalkMoves } from "./invalid-moves"; type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; @@ -210,7 +133,7 @@ type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; export default class Move implements Localizable { public id: Moves; public name: string; - private _type: Type; + private _type: PokemonType; private _category: MoveCategory; public moveTarget: MoveTarget; public power: number; @@ -227,7 +150,7 @@ export default class Move implements Localizable { private flags: number = 0; private nameAppend: string = ""; - constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { + constructor(id: Moves, type: PokemonType, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { this.id = id; this._type = type; this._category = category; @@ -397,21 +320,21 @@ export default class Move implements Localizable { * Currently looks at cases of Grass types with powder moves and Dark types with moves affected by Prankster. * @param {Pokemon} user the source of this move * @param {Pokemon} target the target of this move - * @param {Type} type the type of the move's target + * @param {PokemonType} type the type of the move's target * @returns boolean */ - isTypeImmune(user: Pokemon, target: Pokemon, type: Type): boolean { + isTypeImmune(user: Pokemon, target: Pokemon, type: PokemonType): boolean { if (this.moveTarget === MoveTarget.USER) { return false; } switch (type) { - case Type.GRASS: + case PokemonType.GRASS: if (this.hasFlag(MoveFlags.POWDER_MOVE)) { return true; } break; - case Type.DARK: + case PokemonType.DARK: if (user.hasAbility(Abilities.PRANKSTER) && this.category === MoveCategory.STATUS && (user.isPlayer() !== target.isPlayer())) { return true; } @@ -999,14 +922,14 @@ export default class Move implements Localizable { } export class AttackMove extends Move { - constructor(id: Moves, type: Type, category: MoveCategory, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { + constructor(id: Moves, type: PokemonType, category: MoveCategory, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, category, MoveTarget.NEAR_OTHER, power, accuracy, pp, chance, priority, generation); /** * {@link https://bulbapedia.bulbagarden.net/wiki/Freeze_(status_condition)} * > All damaging Fire-type moves can now thaw a frozen target, regardless of whether or not they have a chance to burn; */ - if (this.type === Type.FIRE) { + if (this.type === PokemonType.FIRE) { this.addAttr(new HealStatusEffectAttr(false, StatusEffect.FREEZE)); } } @@ -1046,13 +969,13 @@ export class AttackMove extends Move { } export class StatusMove extends Move { - constructor(id: Moves, type: Type, accuracy: number, pp: number, chance: number, priority: number, generation: number) { + constructor(id: Moves, type: PokemonType, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, MoveCategory.STATUS, MoveTarget.NEAR_OTHER, -1, accuracy, pp, chance, priority, generation); } } export class SelfStatusMove extends Move { - constructor(id: Moves, type: Type, accuracy: number, pp: number, chance: number, priority: number, generation: number) { + constructor(id: Moves, type: PokemonType, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, MoveCategory.STATUS, MoveTarget.USER, -1, accuracy, pp, chance, priority, generation); } } @@ -1201,14 +1124,6 @@ export abstract class MoveAttr { } } -export enum MoveEffectTrigger { - PRE_APPLY, - POST_APPLY, - HIT, - /** Triggers one time after all target effects have applied */ - POST_TARGET, -} - interface MoveEffectAttrOptions { /** * Defines when this effect should trigger in the move's effect order @@ -1920,14 +1835,6 @@ export class AddSubstituteAttr extends MoveEffectAttr { } } -export enum MultiHitType { - _2, - _2_TO_5, - _3, - _10, - BEAT_UP, -} - /** * Heals the user or target by {@linkcode healRatio} depending on the value of {@linkcode selfTarget} * @extends MoveEffectAttr @@ -4764,7 +4671,7 @@ export class AlwaysHitMinimizeAttr extends VariableAccuracyAttr { export class ToxicAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isOfType(Type.POISON)) { + if (user.isOfType(PokemonType.POISON)) { const accuracy = args[0] as Utils.NumberHolder; accuracy.value = -1; return true; @@ -4847,7 +4754,7 @@ export class TeraBlastPowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user.isTerastallized && user.getTeraType() === Type.STELLAR) { + if (user.isTerastallized && user.getTeraType() === PokemonType.STELLAR) { power.value = 100; return true; } @@ -4915,7 +4822,7 @@ export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { if ([ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.ARCEUS) || [ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.SILVALLY)) { const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; - moveType.value = Type[Type[form]]; + moveType.value = PokemonType[PokemonType[form]]; return true; } @@ -4935,19 +4842,19 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Shock Drive - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; case 2: // Burn Drive - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 3: // Chill Drive - moveType.value = Type.ICE; + moveType.value = PokemonType.ICE; break; case 4: // Douse Drive - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; default: - moveType.value = Type.NORMAL; + moveType.value = PokemonType.NORMAL; break; } return true; @@ -4969,10 +4876,10 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Hangry Mode - moveType.value = Type.DARK; + moveType.value = PokemonType.DARK; break; default: // Full Belly Mode - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; } return true; @@ -4994,13 +4901,13 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Blaze breed - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 2: // Aqua breed - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; default: - moveType.value = Type.FIGHTING; + moveType.value = PokemonType.FIGHTING; break; } return true; @@ -5023,19 +4930,19 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Wellspring Mask case 5: // Wellspring Mask Tera - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; case 2: // Hearthflame Mask case 6: // Hearthflame Mask Tera - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 3: // Cornerstone Mask case 7: // Cornerstone Mask Tera - moveType.value = Type.ROCK; + moveType.value = PokemonType.ROCK; break; case 4: // Teal Mask Tera default: - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; break; } return true; @@ -5056,18 +4963,18 @@ export class WeatherBallTypeAttr extends VariableMoveTypeAttr { switch (globalScene.arena.weather?.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; case WeatherType.SANDSTORM: - moveType.value = Type.ROCK; + moveType.value = PokemonType.ROCK; break; case WeatherType.HAIL: case WeatherType.SNOW: - moveType.value = Type.ICE; + moveType.value = PokemonType.ICE; break; default: return false; @@ -5106,16 +5013,16 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { const currentTerrain = globalScene.arena.getTerrainType(); switch (currentTerrain) { case TerrainType.MISTY: - moveType.value = Type.FAIRY; + moveType.value = PokemonType.FAIRY; break; case TerrainType.ELECTRIC: - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; case TerrainType.GRASSY: - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; break; case TerrainType.PSYCHIC: - moveType.value = Type.PSYCHIC; + moveType.value = PokemonType.PSYCHIC; break; default: return false; @@ -5143,10 +5050,10 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { + (user.ivs[Stat.SPDEF] & 1) * 32) * 15 / 63); moveType.value = [ - Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, - Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, - Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, - Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK ][iv_val]; + PokemonType.FIGHTING, PokemonType.FLYING, PokemonType.POISON, PokemonType.GROUND, + PokemonType.ROCK, PokemonType.BUG, PokemonType.GHOST, PokemonType.STEEL, + PokemonType.FIRE, PokemonType.WATER, PokemonType.GRASS, PokemonType.ELECTRIC, + PokemonType.PSYCHIC, PokemonType.ICE, PokemonType.DRAGON, PokemonType.DARK ][iv_val]; return true; } @@ -5190,13 +5097,13 @@ export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { * @param target n/a * @param move n/a * @param args[0] {@linkcode Utils.NumberHolder} the move type - * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise + * @returns `true` if the move type is changed to {@linkcode PokemonType.STELLAR}, `false` otherwise */ override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.isTerastallized && user.hasSpecies(Species.TERAPAGOS)) { const moveType = args[0] as Utils.NumberHolder; - moveType.value = Type.STELLAR; + moveType.value = PokemonType.STELLAR; return true; } return false; @@ -5211,7 +5118,7 @@ export class MatchUserTypeAttr extends VariableMoveTypeAttr { } const userTypes = user.getTypes(true); - if (userTypes.includes(Type.STELLAR)) { // will not change to stellar type + if (userTypes.includes(PokemonType.STELLAR)) { // will not change to stellar type const nonTeraTypes = user.getTypes(); moveType.value = nonTeraTypes[0]; return true; @@ -5244,19 +5151,19 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { switch (move.id) { case Moves.FIRE_PLEDGE: if (combinedPledgeMove === Moves.WATER_PLEDGE) { - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; return true; } return false; case Moves.WATER_PLEDGE: if (combinedPledgeMove === Moves.GRASS_PLEDGE) { - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; return true; } return false; case Moves.GRASS_PLEDGE: if (combinedPledgeMove === Moves.FIRE_PLEDGE) { - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; return true; } return false; @@ -5277,7 +5184,7 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; //When a flying type is hit, the first hit is always 1x multiplier. - if (target.isOfType(Type.FLYING)) { + if (target.isOfType(PokemonType.FLYING)) { multiplier.value = 1; } return true; @@ -5298,7 +5205,7 @@ export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - if (target.isOfType(Type.ICE)) { + if (target.isOfType(PokemonType.ICE)) { multiplier.value = 0; return true; } @@ -5309,7 +5216,7 @@ export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - multiplier.value *= target.getAttackTypeEffectiveness(Type.FLYING, user); + multiplier.value *= target.getAttackTypeEffectiveness(PokemonType.FLYING, user); return true; } } @@ -5338,9 +5245,9 @@ export class VariableMoveTypeChartAttr extends MoveAttr { export class FreezeDryAttr extends VariableMoveTypeChartAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - const defType = args[1] as Type; + const defType = args[1] as PokemonType; - if (defType === Type.WATER) { + if (defType === PokemonType.WATER) { multiplier.value = 2; return true; } else { @@ -5377,7 +5284,7 @@ export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr { if (user.level < target.level) { accuracy.value = 0; } else { - const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20; + const baseAccuracy = user.isOfType(PokemonType.ICE) ? 30 : 20; accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100); } return true; @@ -5711,7 +5618,7 @@ export class JawLockAttr extends AddBattlerTagAttr { export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { - if (user.getTypes(true).includes(Type.GHOST)) { + if (user.getTypes(true).includes(PokemonType.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { globalScene.queueMessage(i18next.t("battle:attackFailed")); return false; @@ -6517,10 +6424,10 @@ export class ChillyReceptionAttr extends ForceSwitchOutAttr { } export class RemoveTypeAttr extends MoveEffectAttr { - private removedType: Type; + private removedType: PokemonType; private messageCallback: ((user: Pokemon) => void) | undefined; - constructor(removedType: Type, messageCallback?: (user: Pokemon) => void) { + constructor(removedType: PokemonType, messageCallback?: (user: Pokemon) => void) { super(true, { trigger: MoveEffectTrigger.POST_TARGET }); this.removedType = removedType; this.messageCallback = messageCallback; @@ -6539,7 +6446,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { const userTypes = user.getTypes(true); const modifiedTypes = userTypes.filter(type => type !== this.removedType); if (modifiedTypes.length === 0) { - modifiedTypes.push(Type.UNKNOWN); + modifiedTypes.push(PokemonType.UNKNOWN); } user.summonData.types = modifiedTypes; user.updateInfo(); @@ -6564,8 +6471,8 @@ export class CopyTypeAttr extends MoveEffectAttr { } const targetTypes = target.getTypes(true); - if (targetTypes.includes(Type.UNKNOWN) && targetTypes.indexOf(Type.UNKNOWN) > -1) { - targetTypes[targetTypes.indexOf(Type.UNKNOWN)] = Type.NORMAL; + if (targetTypes.includes(PokemonType.UNKNOWN) && targetTypes.indexOf(PokemonType.UNKNOWN) > -1) { + targetTypes[targetTypes.indexOf(PokemonType.UNKNOWN)] = PokemonType.NORMAL; } user.summonData.types = targetTypes; user.updateInfo(); @@ -6576,7 +6483,7 @@ export class CopyTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => target.getTypes()[0] !== Type.UNKNOWN || target.summonData.addedType !== null; + return (user, target, move) => target.getTypes()[0] !== PokemonType.UNKNOWN || target.summonData.addedType !== null; } } @@ -6591,7 +6498,7 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { } const terrainType = globalScene.arena.getTerrainType(); - let typeChange: Type; + let typeChange: PokemonType; if (terrainType !== TerrainType.NONE) { typeChange = this.getTypeForTerrain(globalScene.arena.getTerrainType()); } else { @@ -6601,7 +6508,7 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { user.summonData.types = [ typeChange ]; user.updateInfo(); - globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[typeChange]}`) })); + globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[typeChange]}`) })); return true; } @@ -6611,19 +6518,19 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { * @param terrainType {@linkcode TerrainType} * @returns {@linkcode Type} */ - private getTypeForTerrain(terrainType: TerrainType): Type { + private getTypeForTerrain(terrainType: TerrainType): PokemonType { switch (terrainType) { case TerrainType.ELECTRIC: - return Type.ELECTRIC; + return PokemonType.ELECTRIC; case TerrainType.MISTY: - return Type.FAIRY; + return PokemonType.FAIRY; case TerrainType.GRASSY: - return Type.GRASS; + return PokemonType.GRASS; case TerrainType.PSYCHIC: - return Type.PSYCHIC; + return PokemonType.PSYCHIC; case TerrainType.NONE: default: - return Type.UNKNOWN; + return PokemonType.UNKNOWN; } } @@ -6632,71 +6539,71 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { * @param biomeType {@linkcode Biome} * @returns {@linkcode Type} */ - private getTypeForBiome(biomeType: Biome): Type { + private getTypeForBiome(biomeType: Biome): PokemonType { switch (biomeType) { case Biome.TOWN: case Biome.PLAINS: case Biome.METROPOLIS: - return Type.NORMAL; + return PokemonType.NORMAL; case Biome.GRASS: case Biome.TALL_GRASS: - return Type.GRASS; + return PokemonType.GRASS; case Biome.FOREST: case Biome.JUNGLE: - return Type.BUG; + return PokemonType.BUG; case Biome.SLUM: case Biome.SWAMP: - return Type.POISON; + return PokemonType.POISON; case Biome.SEA: case Biome.BEACH: case Biome.LAKE: case Biome.SEABED: - return Type.WATER; + return PokemonType.WATER; case Biome.MOUNTAIN: - return Type.FLYING; + return PokemonType.FLYING; case Biome.BADLANDS: - return Type.GROUND; + return PokemonType.GROUND; case Biome.CAVE: case Biome.DESERT: - return Type.ROCK; + return PokemonType.ROCK; case Biome.ICE_CAVE: case Biome.SNOWY_FOREST: - return Type.ICE; + return PokemonType.ICE; case Biome.MEADOW: case Biome.FAIRY_CAVE: case Biome.ISLAND: - return Type.FAIRY; + return PokemonType.FAIRY; case Biome.POWER_PLANT: - return Type.ELECTRIC; + return PokemonType.ELECTRIC; case Biome.VOLCANO: - return Type.FIRE; + return PokemonType.FIRE; case Biome.GRAVEYARD: case Biome.TEMPLE: - return Type.GHOST; + return PokemonType.GHOST; case Biome.DOJO: case Biome.CONSTRUCTION_SITE: - return Type.FIGHTING; + return PokemonType.FIGHTING; case Biome.FACTORY: case Biome.LABORATORY: - return Type.STEEL; + return PokemonType.STEEL; case Biome.RUINS: case Biome.SPACE: - return Type.PSYCHIC; + return PokemonType.PSYCHIC; case Biome.WASTELAND: case Biome.END: - return Type.DRAGON; + return PokemonType.DRAGON; case Biome.ABYSS: - return Type.DARK; + return PokemonType.DARK; default: - return Type.UNKNOWN; + return PokemonType.UNKNOWN; } } } export class ChangeTypeAttr extends MoveEffectAttr { - private type: Type; + private type: PokemonType; - constructor(type: Type) { + constructor(type: PokemonType) { super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; @@ -6706,7 +6613,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [ this.type ]; target.updateInfo(); - globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`) })); + globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) })); return true; } @@ -6717,9 +6624,9 @@ export class ChangeTypeAttr extends MoveEffectAttr { } export class AddTypeAttr extends MoveEffectAttr { - private type: Type; + private type: PokemonType; - constructor(type: Type) { + constructor(type: PokemonType) { super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; @@ -6729,7 +6636,7 @@ export class AddTypeAttr extends MoveEffectAttr { target.summonData.addedType = this.type; target.updateInfo(); - globalScene.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); return true; } @@ -6751,7 +6658,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { const firstMoveType = target.getMoveset()[0]?.getMove().type!; // TODO: is this bang correct? user.summonData.types = [ firstMoveType ]; - globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${Type[firstMoveType]}`) })); + globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${PokemonType[firstMoveType]}`) })); return true; } @@ -6764,7 +6671,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { * @extends OverrideMoveEffectAttr */ class CallMoveAttr extends OverrideMoveEffectAttr { - protected invalidMoves: Moves[]; + protected invalidMoves: ReadonlySet; protected hasTarget: boolean; apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined; @@ -6789,7 +6696,7 @@ class CallMoveAttr extends OverrideMoveEffectAttr { * @extends CallMoveAttr to call a selected move */ export class RandomMoveAttr extends CallMoveAttr { - constructor(invalidMoves: Moves[]) { + constructor(invalidMoves: ReadonlySet) { super(); this.invalidMoves = invalidMoves; } @@ -6811,7 +6718,7 @@ export class RandomMoveAttr extends CallMoveAttr { * @param args Unused */ override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); + const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.has(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); let moveId: Moves = Moves.NONE; do { moveId = this.getMoveOverride() ?? moveIds[user.randSeedInt(moveIds.length)]; @@ -6834,7 +6741,7 @@ export class RandomMoveAttr extends CallMoveAttr { export class RandomMovesetMoveAttr extends CallMoveAttr { private includeParty: boolean; private moveId: number; - constructor(invalidMoves: Moves[], includeParty: boolean = false) { + constructor(invalidMoves: ReadonlySet, includeParty: boolean = false) { super(); this.includeParty = includeParty; this.invalidMoves = invalidMoves; @@ -6861,7 +6768,7 @@ export class RandomMovesetMoveAttr extends CallMoveAttr { allies = [ user ]; } const partyMoveset = allies.map(p => p.moveset).flat(); - const moves = partyMoveset.filter(m => !this.invalidMoves.includes(m!.moveId) && !m!.getMove().name.endsWith(" (N)")); + const moves = partyMoveset.filter(m => !this.invalidMoves.has(m!.moveId) && !m!.getMove().name.endsWith(" (N)")); if (moves.length === 0) { return false; } @@ -6872,282 +6779,6 @@ export class RandomMovesetMoveAttr extends CallMoveAttr { } } -const invalidMetronomeMoves: Moves[] = [ - Moves.AFTER_YOU, - Moves.APPLE_ACID, - Moves.ARMOR_CANNON, - Moves.ASSIST, - Moves.ASTRAL_BARRAGE, - Moves.AURA_WHEEL, - Moves.BANEFUL_BUNKER, - Moves.BEAK_BLAST, - Moves.BEHEMOTH_BASH, - Moves.BEHEMOTH_BLADE, - Moves.BELCH, - Moves.BESTOW, - Moves.BLAZING_TORQUE, - Moves.BODY_PRESS, - Moves.BRANCH_POKE, - Moves.BREAKING_SWIPE, - Moves.CELEBRATE, - Moves.CHATTER, - Moves.CHILLING_WATER, - Moves.CHILLY_RECEPTION, - Moves.CLANGOROUS_SOUL, - Moves.COLLISION_COURSE, - Moves.COMBAT_TORQUE, - Moves.COMEUPPANCE, - Moves.COPYCAT, - Moves.COUNTER, - Moves.COVET, - Moves.CRAFTY_SHIELD, - Moves.DECORATE, - Moves.DESTINY_BOND, - Moves.DETECT, - Moves.DIAMOND_STORM, - Moves.DOODLE, - Moves.DOUBLE_IRON_BASH, - Moves.DOUBLE_SHOCK, - Moves.DRAGON_ASCENT, - Moves.DRAGON_ENERGY, - Moves.DRUM_BEATING, - Moves.DYNAMAX_CANNON, - Moves.ELECTRO_DRIFT, - Moves.ENDURE, - Moves.ETERNABEAM, - Moves.FALSE_SURRENDER, - Moves.FEINT, - Moves.FIERY_WRATH, - Moves.FILLET_AWAY, - Moves.FLEUR_CANNON, - Moves.FOCUS_PUNCH, - Moves.FOLLOW_ME, - Moves.FREEZE_SHOCK, - Moves.FREEZING_GLARE, - Moves.GLACIAL_LANCE, - Moves.GRAV_APPLE, - Moves.HELPING_HAND, - Moves.HOLD_HANDS, - Moves.HYPER_DRILL, - Moves.HYPERSPACE_FURY, - Moves.HYPERSPACE_HOLE, - Moves.ICE_BURN, - Moves.INSTRUCT, - Moves.JET_PUNCH, - Moves.JUNGLE_HEALING, - Moves.KINGS_SHIELD, - Moves.LIFE_DEW, - Moves.LIGHT_OF_RUIN, - Moves.MAKE_IT_RAIN, - Moves.MAGICAL_TORQUE, - Moves.MAT_BLOCK, - Moves.ME_FIRST, - Moves.METEOR_ASSAULT, - Moves.METRONOME, - Moves.MIMIC, - Moves.MIND_BLOWN, - Moves.MIRROR_COAT, - Moves.MIRROR_MOVE, - Moves.MOONGEIST_BEAM, - Moves.NATURE_POWER, - Moves.NATURES_MADNESS, - Moves.NOXIOUS_TORQUE, - Moves.OBSTRUCT, - Moves.ORDER_UP, - Moves.ORIGIN_PULSE, - Moves.OVERDRIVE, - Moves.PHOTON_GEYSER, - Moves.PLASMA_FISTS, - Moves.POPULATION_BOMB, - Moves.POUNCE, - Moves.POWER_SHIFT, - Moves.PRECIPICE_BLADES, - Moves.PROTECT, - Moves.PYRO_BALL, - Moves.QUASH, - Moves.QUICK_GUARD, - Moves.RAGE_FIST, - Moves.RAGE_POWDER, - Moves.RAGING_BULL, - Moves.RAGING_FURY, - Moves.RELIC_SONG, - Moves.REVIVAL_BLESSING, - Moves.RUINATION, - Moves.SALT_CURE, - Moves.SECRET_SWORD, - Moves.SHED_TAIL, - Moves.SHELL_TRAP, - Moves.SILK_TRAP, - Moves.SKETCH, - Moves.SLEEP_TALK, - Moves.SNAP_TRAP, - Moves.SNARL, - Moves.SNATCH, - Moves.SNORE, - Moves.SNOWSCAPE, - Moves.SPECTRAL_THIEF, - Moves.SPICY_EXTRACT, - Moves.SPIKY_SHIELD, - Moves.SPIRIT_BREAK, - Moves.SPOTLIGHT, - Moves.STEAM_ERUPTION, - Moves.STEEL_BEAM, - Moves.STRANGE_STEAM, - Moves.STRUGGLE, - Moves.SUNSTEEL_STRIKE, - Moves.SURGING_STRIKES, - Moves.SWITCHEROO, - Moves.TECHNO_BLAST, - Moves.TERA_STARSTORM, - Moves.THIEF, - Moves.THOUSAND_ARROWS, - Moves.THOUSAND_WAVES, - Moves.THUNDER_CAGE, - Moves.THUNDEROUS_KICK, - Moves.TIDY_UP, - Moves.TRAILBLAZE, - Moves.TRANSFORM, - Moves.TRICK, - Moves.TWIN_BEAM, - Moves.V_CREATE, - Moves.WICKED_BLOW, - Moves.WICKED_TORQUE, - Moves.WIDE_GUARD, -]; - -const invalidAssistMoves: Moves[] = [ - Moves.ASSIST, - Moves.BANEFUL_BUNKER, - Moves.BEAK_BLAST, - Moves.BELCH, - Moves.BESTOW, - Moves.BOUNCE, - Moves.CELEBRATE, - Moves.CHATTER, - Moves.CIRCLE_THROW, - Moves.COPYCAT, - Moves.COUNTER, - Moves.COVET, - Moves.DESTINY_BOND, - Moves.DETECT, - Moves.DIG, - Moves.DIVE, - Moves.DRAGON_TAIL, - Moves.ENDURE, - Moves.FEINT, - Moves.FLY, - Moves.FOCUS_PUNCH, - Moves.FOLLOW_ME, - Moves.HELPING_HAND, - Moves.HOLD_HANDS, - Moves.KINGS_SHIELD, - Moves.MAT_BLOCK, - Moves.ME_FIRST, - Moves.METRONOME, - Moves.MIMIC, - Moves.MIRROR_COAT, - Moves.MIRROR_MOVE, - Moves.NATURE_POWER, - Moves.PHANTOM_FORCE, - Moves.PROTECT, - Moves.RAGE_POWDER, - Moves.ROAR, - Moves.SHADOW_FORCE, - Moves.SHELL_TRAP, - Moves.SKETCH, - Moves.SKY_DROP, - Moves.SLEEP_TALK, - Moves.SNATCH, - Moves.SPIKY_SHIELD, - Moves.SPOTLIGHT, - Moves.STRUGGLE, - Moves.SWITCHEROO, - Moves.THIEF, - Moves.TRANSFORM, - Moves.TRICK, - Moves.WHIRLWIND, -]; - -const invalidSleepTalkMoves: Moves[] = [ - Moves.ASSIST, - Moves.BELCH, - Moves.BEAK_BLAST, - Moves.BIDE, - Moves.BOUNCE, - Moves.COPYCAT, - Moves.DIG, - Moves.DIVE, - Moves.DYNAMAX_CANNON, - Moves.FREEZE_SHOCK, - Moves.FLY, - Moves.FOCUS_PUNCH, - Moves.GEOMANCY, - Moves.ICE_BURN, - Moves.ME_FIRST, - Moves.METRONOME, - Moves.MIRROR_MOVE, - Moves.MIMIC, - Moves.PHANTOM_FORCE, - Moves.RAZOR_WIND, - Moves.SHADOW_FORCE, - Moves.SHELL_TRAP, - Moves.SKETCH, - Moves.SKULL_BASH, - Moves.SKY_ATTACK, - Moves.SKY_DROP, - Moves.SLEEP_TALK, - Moves.SOLAR_BLADE, - Moves.SOLAR_BEAM, - Moves.STRUGGLE, - Moves.UPROAR, -]; - -const invalidCopycatMoves = [ - Moves.ASSIST, - Moves.BANEFUL_BUNKER, - Moves.BEAK_BLAST, - Moves.BEHEMOTH_BASH, - Moves.BEHEMOTH_BLADE, - Moves.BESTOW, - Moves.CELEBRATE, - Moves.CHATTER, - Moves.CIRCLE_THROW, - Moves.COPYCAT, - Moves.COUNTER, - Moves.COVET, - Moves.DESTINY_BOND, - Moves.DETECT, - Moves.DRAGON_TAIL, - Moves.ENDURE, - Moves.FEINT, - Moves.FOCUS_PUNCH, - Moves.FOLLOW_ME, - Moves.HELPING_HAND, - Moves.HOLD_HANDS, - Moves.KINGS_SHIELD, - Moves.MAT_BLOCK, - Moves.ME_FIRST, - Moves.METRONOME, - Moves.MIMIC, - Moves.MIRROR_COAT, - Moves.MIRROR_MOVE, - Moves.PROTECT, - Moves.RAGE_POWDER, - Moves.ROAR, - Moves.SHELL_TRAP, - Moves.SKETCH, - Moves.SLEEP_TALK, - Moves.SNATCH, - Moves.SPIKY_SHIELD, - Moves.SPOTLIGHT, - Moves.STRUGGLE, - Moves.SWITCHEROO, - Moves.THIEF, - Moves.TRANSFORM, - Moves.TRICK, - Moves.WHIRLWIND, -]; - export class NaturePowerAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { let moveId; @@ -7295,7 +6926,7 @@ export class NaturePowerAttr extends OverrideMoveEffectAttr { */ export class CopyMoveAttr extends CallMoveAttr { private mirrorMove: boolean; - constructor(mirrorMove: boolean, invalidMoves: Moves[] = []) { + constructor(mirrorMove: boolean, invalidMoves: ReadonlySet = new Set()) { super(); this.mirrorMove = mirrorMove; this.invalidMoves = invalidMoves; @@ -7313,7 +6944,7 @@ export class CopyMoveAttr extends CallMoveAttr { return target.getMoveHistory().length !== 0; } else { const lastMove = globalScene.currentBattle.lastMove; - return lastMove !== undefined && !this.invalidMoves.includes(lastMove); + return lastMove !== undefined && !this.invalidMoves.has(lastMove); } }; } @@ -8258,7 +7889,7 @@ const failIfLastInPartyCondition: MoveConditionFunc = (user: Pokemon, target: Po return party.some(pokemon => pokemon.isActive() && !pokemon.isOnField()); }; -const failIfGhostTypeCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => !target.isOfType(Type.GHOST); +const failIfGhostTypeCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => !target.isOfType(PokemonType.GHOST); const failIfNoTargetHeldItemsCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.getHeldItems().filter(i => i.isTransferable)?.length > 0; @@ -8414,7 +8045,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { } const moveData = allMoves[targetMove.move]; - if (moveData.type === Type.STELLAR || moveData.type === Type.UNKNOWN) { + if (moveData.type === PokemonType.STELLAR || moveData.type === PokemonType.UNKNOWN) { return false; } const userTypes = user.getTypes(); @@ -8424,7 +8055,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { } const type = validTypes[user.randSeedInt(validTypes.length)]; user.summonData.types = [ type ]; - globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[type]) })); + globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(PokemonType[type]) })); user.updateInfo(); return true; @@ -8434,10 +8065,10 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { * Retrieve the types resisting a given type. Used by Conversion 2 * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type) */ - getTypeResistances(gameMode: GameMode, type: number): Type[] { - const typeResistances: Type[] = []; + getTypeResistances(gameMode: GameMode, type: number): PokemonType[] { + const typeResistances: PokemonType[] = []; - for (let i = 0; i < Object.keys(Type).length; i++) { + for (let i = 0; i < Object.keys(PokemonType).length; i++) { const multiplier = new NumberHolder(1); multiplier.value = getTypeDamageMultiplier(type, i); applyChallenges(gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); @@ -8490,7 +8121,7 @@ export class ExposedMoveAttr extends AddBattlerTagAttr { } -const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN); +const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(PokemonType.UNKNOWN); export type MoveTargetSet = { targets: BattlerIndex[]; @@ -8556,7 +8187,7 @@ export function getMoveTargets(user: Pokemon, move: Moves, replaceTarget?: MoveT multiple = true; break; case MoveTarget.CURSE: - set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; + set = user.getTypes(true).includes(PokemonType.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; break; } @@ -8564,153 +8195,153 @@ export function getMoveTargets(user: Pokemon, move: Moves, replaceTarget?: MoveT } export const allMoves: Move[] = [ - new SelfStatusMove(Moves.NONE, Type.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), + new SelfStatusMove(Moves.NONE, PokemonType.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), ]; export const selfStatLowerMoves: Moves[] = []; export function initMoves() { allMoves.push( - new AttackMove(Moves.POUND, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.KARATE_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1) + new AttackMove(Moves.POUND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.KARATE_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1) .attr(HighCritAttr), - new AttackMove(Moves.DOUBLE_SLAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 10, -1, 0, 1) + new AttackMove(Moves.DOUBLE_SLAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 10, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.COMET_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 18, 85, 15, -1, 0, 1) + new AttackMove(Moves.COMET_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 18, 85, 15, -1, 0, 1) .attr(MultiHitAttr) .punchingMove(), - new AttackMove(Moves.MEGA_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 80, 85, 20, -1, 0, 1) + new AttackMove(Moves.MEGA_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 85, 20, -1, 0, 1) .punchingMove(), - new AttackMove(Moves.PAY_DAY, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 1) + new AttackMove(Moves.PAY_DAY, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 1) .attr(MoneyAttr) .makesContact(false), - new AttackMove(Moves.FIRE_PUNCH, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.FIRE_PUNCH, PokemonType.FIRE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN) .punchingMove(), - new AttackMove(Moves.ICE_PUNCH, Type.ICE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.ICE_PUNCH, PokemonType.ICE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE) .punchingMove(), - new AttackMove(Moves.THUNDER_PUNCH, Type.ELECTRIC, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.THUNDER_PUNCH, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .punchingMove(), - new AttackMove(Moves.SCRATCH, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.VISE_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1), - new AttackMove(Moves.GUILLOTINE, Type.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.SCRATCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.VISE_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1), + new AttackMove(Moves.GUILLOTINE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), - new ChargingAttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.RAZOR_WIND, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:whippedUpAWhirlwind", { pokemonName: "{USER}" })) .attr(HighCritAttr) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.SWORDS_DANCE, Type.NORMAL, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.SWORDS_DANCE, PokemonType.NORMAL, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 2, true) .danceMove(), - new AttackMove(Moves.CUT, Type.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1) + new AttackMove(Moves.CUT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1) .slicingMove(), - new AttackMove(Moves.GUST, Type.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1) + new AttackMove(Moves.GUST, PokemonType.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.FLYING) .windMove(), - new AttackMove(Moves.WING_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1), - new StatusMove(Moves.WHIRLWIND, Type.NORMAL, -1, 20, -1, -6, 1) + new AttackMove(Moves.WING_ATTACK, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1), + new StatusMove(Moves.WHIRLWIND, PokemonType.NORMAL, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .ignoresSubstitute() .hidesTarget() .windMove() .reflectable(), - new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) + new ChargingAttackMove(Moves.FLY, PokemonType.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .condition(failOnGravityCondition), - new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + new AttackMove(Moves.BIND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.BIND), - new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), - new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), - new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) + new AttackMove(Moves.SLAM, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), + new AttackMove(Moves.VINE_WHIP, PokemonType.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), + new AttackMove(Moves.STOMP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) + new AttackMove(Moves.DOUBLE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.MEGA_KICK, Type.NORMAL, MoveCategory.PHYSICAL, 120, 75, 5, -1, 0, 1), - new AttackMove(Moves.JUMP_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 1) + new AttackMove(Moves.MEGA_KICK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 75, 5, -1, 0, 1), + new AttackMove(Moves.JUMP_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 1) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .condition(failOnGravityCondition) .recklessMove(), - new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) + new AttackMove(Moves.ROLLING_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) .attr(FlinchAttr), - new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1) + new StatusMove(Moves.SAND_ATTACK, PokemonType.GROUND, 100, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .reflectable(), - new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) + new AttackMove(Moves.HEADBUTT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) .attr(FlinchAttr), - new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), - new AttackMove(Moves.FURY_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + new AttackMove(Moves.HORN_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), + new AttackMove(Moves.FURY_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.HORN_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.HORN_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), - new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) + new AttackMove(Moves.TACKLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.BODY_SLAM, PokemonType.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) + new AttackMove(Moves.WRAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.WRAP), - new AttackMove(Moves.TAKE_DOWN, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, -1, 0, 1) + new AttackMove(Moves.TAKE_DOWN, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, -1, 0, 1) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.THRASH, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 1) + new AttackMove(Moves.THRASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new AttackMove(Moves.DOUBLE_EDGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 1) + new AttackMove(Moves.DOUBLE_EDGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 1) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1) + new StatusMove(Moves.TAIL_WHIP, PokemonType.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) + new AttackMove(Moves.POISON_STING, PokemonType.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.TWINEEDLE, Type.BUG, MoveCategory.PHYSICAL, 25, 100, 20, 20, 0, 1) + new AttackMove(Moves.TWINEEDLE, PokemonType.BUG, MoveCategory.PHYSICAL, 25, 100, 20, 20, 0, 1) .attr(MultiHitAttr, MultiHitType._2) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.PIN_MISSILE, Type.BUG, MoveCategory.PHYSICAL, 25, 95, 20, -1, 0, 1) + new AttackMove(Moves.PIN_MISSILE, PokemonType.BUG, MoveCategory.PHYSICAL, 25, 95, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false), - new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1) + new StatusMove(Moves.LEER, PokemonType.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) + new AttackMove(Moves.BITE, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) .attr(FlinchAttr) .bitingMove(), - new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1) + new StatusMove(Moves.GROWL, PokemonType.NORMAL, 100, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1) + new StatusMove(Moves.ROAR, PokemonType.NORMAL, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .soundBased() .hidesTarget() .reflectable(), - new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1) + new StatusMove(Moves.SING, PokemonType.NORMAL, 55, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .soundBased() .reflectable(), - new StatusMove(Moves.SUPERSONIC, Type.NORMAL, 55, 20, -1, 0, 1) + new StatusMove(Moves.SUPERSONIC, PokemonType.NORMAL, 55, 20, -1, 0, 1) .attr(ConfuseAttr) .soundBased() .reflectable(), - new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) + new AttackMove(Moves.SONIC_BOOM, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) .attr(FixedDamageAttr, 20), - new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) + new StatusMove(Moves.DISABLE, PokemonType.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) .condition((user, target, move) => { const lastRealMove = target.getLastXMoves(-1).find(m => !m.virtual); @@ -8718,423 +8349,423 @@ export function initMoves() { }) .ignoresSubstitute() .reflectable(), - new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + new AttackMove(Moves.ACID, PokemonType.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.EMBER, Type.FIRE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 1) + new AttackMove(Moves.EMBER, PokemonType.FIRE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.FLAMETHROWER, Type.FIRE, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) + new AttackMove(Moves.FLAMETHROWER, PokemonType.FIRE, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.MIST, Type.ICE, -1, 30, -1, 0, 1) + new StatusMove(Moves.MIST, PokemonType.ICE, -1, 30, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.MIST, 5, true) .target(MoveTarget.USER_SIDE), - new AttackMove(Moves.WATER_GUN, Type.WATER, MoveCategory.SPECIAL, 40, 100, 25, -1, 0, 1), - new AttackMove(Moves.HYDRO_PUMP, Type.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), - new AttackMove(Moves.SURF, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) + new AttackMove(Moves.WATER_GUN, PokemonType.WATER, MoveCategory.SPECIAL, 40, 100, 25, -1, 0, 1), + new AttackMove(Moves.HYDRO_PUMP, PokemonType.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), + new AttackMove(Moves.SURF, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) .target(MoveTarget.ALL_NEAR_OTHERS) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERWATER) .attr(GulpMissileTagAttr), - new AttackMove(Moves.ICE_BEAM, Type.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) + new AttackMove(Moves.ICE_BEAM, PokemonType.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE), - new AttackMove(Moves.BLIZZARD, Type.ICE, MoveCategory.SPECIAL, 110, 70, 5, 10, 0, 1) + new AttackMove(Moves.BLIZZARD, PokemonType.ICE, MoveCategory.SPECIAL, 110, 70, 5, 10, 0, 1) .attr(BlizzardAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.FREEZE) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PSYBEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.PSYBEAM, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(ConfuseAttr), - new AttackMove(Moves.BUBBLE_BEAM, Type.WATER, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.BUBBLE_BEAM, PokemonType.WATER, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.AURORA_BEAM, Type.ICE, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.AURORA_BEAM, PokemonType.ICE, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.HYPER_BEAM, Type.NORMAL, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 1) + new AttackMove(Moves.HYPER_BEAM, PokemonType.NORMAL, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 1) .attr(RechargeAttr), - new AttackMove(Moves.PECK, Type.FLYING, MoveCategory.PHYSICAL, 35, 100, 35, -1, 0, 1), - new AttackMove(Moves.DRILL_PECK, Type.FLYING, MoveCategory.PHYSICAL, 80, 100, 20, -1, 0, 1), - new AttackMove(Moves.SUBMISSION, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 80, 20, -1, 0, 1) + new AttackMove(Moves.PECK, PokemonType.FLYING, MoveCategory.PHYSICAL, 35, 100, 35, -1, 0, 1), + new AttackMove(Moves.DRILL_PECK, PokemonType.FLYING, MoveCategory.PHYSICAL, 80, 100, 20, -1, 0, 1), + new AttackMove(Moves.SUBMISSION, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 80, 80, 20, -1, 0, 1) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.LOW_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) + new AttackMove(Moves.LOW_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) .attr(WeightPowerAttr), - new AttackMove(Moves.COUNTER, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, -5, 1) + new AttackMove(Moves.COUNTER, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, -5, 1) .attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.PHYSICAL, 2) .target(MoveTarget.ATTACKER), - new AttackMove(Moves.SEISMIC_TOSS, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) + new AttackMove(Moves.SEISMIC_TOSS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) .attr(LevelDamageAttr), - new AttackMove(Moves.STRENGTH, Type.NORMAL, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 1), - new AttackMove(Moves.ABSORB, Type.GRASS, MoveCategory.SPECIAL, 20, 100, 25, -1, 0, 1) + new AttackMove(Moves.STRENGTH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 1), + new AttackMove(Moves.ABSORB, PokemonType.GRASS, MoveCategory.SPECIAL, 20, 100, 25, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new AttackMove(Moves.MEGA_DRAIN, Type.GRASS, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 1) + new AttackMove(Moves.MEGA_DRAIN, PokemonType.GRASS, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new StatusMove(Moves.LEECH_SEED, Type.GRASS, 90, 10, -1, 0, 1) + new StatusMove(Moves.LEECH_SEED, PokemonType.GRASS, 90, 10, -1, 0, 1) .attr(LeechSeedAttr) - .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)) + .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(PokemonType.GRASS)) .reflectable(), - new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.GROWTH, PokemonType.NORMAL, -1, 20, -1, 0, 1) .attr(GrowthStatStageChangeAttr), - new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) + new AttackMove(Moves.RAZOR_LEAF, PokemonType.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) .attr(HighCritAttr) .makesContact(false) .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new ChargingAttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.SOLAR_BEAM, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:tookInSunlight", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) .attr(AntiSunlightPowerDecreaseAttr), - new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) + new StatusMove(Moves.POISON_POWDER, PokemonType.POISON, 75, 35, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .powderMove() .reflectable(), - new StatusMove(Moves.STUN_SPORE, Type.GRASS, 75, 30, -1, 0, 1) + new StatusMove(Moves.STUN_SPORE, PokemonType.GRASS, 75, 30, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .powderMove() .reflectable(), - new StatusMove(Moves.SLEEP_POWDER, Type.GRASS, 75, 15, -1, 0, 1) + new StatusMove(Moves.SLEEP_POWDER, PokemonType.GRASS, 75, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .powderMove() .reflectable(), - new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) + new AttackMove(Moves.PETAL_DANCE, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .makesContact() .danceMove() .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1) + new StatusMove(Moves.STRING_SHOT, PokemonType.BUG, 95, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) + new AttackMove(Moves.DRAGON_RAGE, PokemonType.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) .attr(FixedDamageAttr, 40), - new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) + new AttackMove(Moves.FIRE_SPIN, PokemonType.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.FIRE_SPIN), - new AttackMove(Moves.THUNDER_SHOCK, Type.ELECTRIC, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + new AttackMove(Moves.THUNDER_SHOCK, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.THUNDERBOLT, Type.ELECTRIC, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) + new AttackMove(Moves.THUNDERBOLT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) + new StatusMove(Moves.THUNDER_WAVE, PokemonType.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(RespectAttackTypeImmunityAttr) .reflectable(), - new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) + new AttackMove(Moves.THUNDER, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.FLYING), - new AttackMove(Moves.ROCK_THROW, Type.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1) + new AttackMove(Moves.ROCK_THROW, PokemonType.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1) .makesContact(false), - new AttackMove(Moves.EARTHQUAKE, Type.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) + new AttackMove(Moves.EARTHQUAKE, PokemonType.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERGROUND) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FISSURE, Type.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.FISSURE, PokemonType.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND) .makesContact(false), - new ChargingAttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.DIG, PokemonType.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:dugAHole", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND), - new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) + new StatusMove(Moves.TOXIC, PokemonType.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) .attr(ToxicAccuracyAttr) .reflectable(), - new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) + new AttackMove(Moves.CONFUSION, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) .attr(ConfuseAttr), - new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) + new AttackMove(Moves.PSYCHIC, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1) + new StatusMove(Moves.HYPNOSIS, PokemonType.PSYCHIC, 60, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .reflectable(), - new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.MEDITATE, PokemonType.PSYCHIC, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.AGILITY, PokemonType.PSYCHIC, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), - new AttackMove(Moves.QUICK_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 1), - new AttackMove(Moves.RAGE, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 20, -1, 0, 1) + new AttackMove(Moves.QUICK_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 1), + new AttackMove(Moves.RAGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 100, 20, -1, 0, 1) .partial(), // No effect implemented - new SelfStatusMove(Moves.TELEPORT, Type.PSYCHIC, -1, 20, -1, -6, 1) + new SelfStatusMove(Moves.TELEPORT, PokemonType.PSYCHIC, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, true) .hidesUser(), - new AttackMove(Moves.NIGHT_SHADE, Type.GHOST, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) + new AttackMove(Moves.NIGHT_SHADE, PokemonType.GHOST, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(LevelDamageAttr), - new StatusMove(Moves.MIMIC, Type.NORMAL, -1, 10, -1, 0, 1) + new StatusMove(Moves.MIMIC, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(MovesetCopyMoveAttr) .ignoresSubstitute(), - new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1) + new StatusMove(Moves.SCREECH, PokemonType.NORMAL, 85, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -2) .soundBased() .reflectable(), - new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1) + new SelfStatusMove(Moves.DOUBLE_TEAM, PokemonType.NORMAL, -1, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.EVA ], 1, true), - new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1) + new SelfStatusMove(Moves.RECOVER, PokemonType.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), - new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.HARDEN, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1) + new SelfStatusMove(Moves.MINIMIZE, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false) .attr(StatStageChangeAttr, [ Stat.EVA ], 2, true), - new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) + new StatusMove(Moves.SMOKESCREEN, PokemonType.NORMAL, 100, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .reflectable(), - new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1) + new StatusMove(Moves.CONFUSE_RAY, PokemonType.GHOST, 100, 10, -1, 0, 1) .attr(ConfuseAttr) .reflectable(), - new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.WITHDRAW, PokemonType.WATER, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.DEFENSE_CURL, PokemonType.NORMAL, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.BARRIER, Type.PSYCHIC, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.BARRIER, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new StatusMove(Moves.LIGHT_SCREEN, Type.PSYCHIC, -1, 30, -1, 0, 1) + new StatusMove(Moves.LIGHT_SCREEN, PokemonType.PSYCHIC, -1, 30, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, true) .target(MoveTarget.USER_SIDE), - new SelfStatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.HAZE, PokemonType.ICE, -1, 30, -1, 0, 1) .ignoresSubstitute() .attr(ResetStatsAttr, true), - new StatusMove(Moves.REFLECT, Type.PSYCHIC, -1, 20, -1, 0, 1) + new StatusMove(Moves.REFLECT, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true) .target(MoveTarget.USER_SIDE), - new SelfStatusMove(Moves.FOCUS_ENERGY, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.FOCUS_ENERGY, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, true, true), - new AttackMove(Moves.BIDE, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 10, -1, 1, 1) + new AttackMove(Moves.BIDE, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 10, -1, 1, 1) .target(MoveTarget.USER) .unimplemented(), - new SelfStatusMove(Moves.METRONOME, Type.NORMAL, -1, 10, -1, 0, 1) + new SelfStatusMove(Moves.METRONOME, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(RandomMoveAttr, invalidMetronomeMoves), - new StatusMove(Moves.MIRROR_MOVE, Type.FLYING, -1, 20, -1, 0, 1) + new StatusMove(Moves.MIRROR_MOVE, PokemonType.FLYING, -1, 20, -1, 0, 1) .attr(CopyMoveAttr, true), - new AttackMove(Moves.SELF_DESTRUCT, Type.NORMAL, MoveCategory.PHYSICAL, 200, 100, 5, -1, 0, 1) + new AttackMove(Moves.SELF_DESTRUCT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 100, 5, -1, 0, 1) .attr(SacrificialAttr) .makesContact(false) .condition(failIfDampCondition) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.EGG_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 100, 75, 10, -1, 0, 1) + new AttackMove(Moves.EGG_BOMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 100, 75, 10, -1, 0, 1) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.LICK, Type.GHOST, MoveCategory.PHYSICAL, 30, 100, 30, 30, 0, 1) + new AttackMove(Moves.LICK, PokemonType.GHOST, MoveCategory.PHYSICAL, 30, 100, 30, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.SMOG, Type.POISON, MoveCategory.SPECIAL, 30, 70, 20, 40, 0, 1) + new AttackMove(Moves.SMOG, PokemonType.POISON, MoveCategory.SPECIAL, 30, 70, 20, 40, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.SLUDGE, Type.POISON, MoveCategory.SPECIAL, 65, 100, 20, 30, 0, 1) + new AttackMove(Moves.SLUDGE, PokemonType.POISON, MoveCategory.SPECIAL, 65, 100, 20, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.BONE_CLUB, Type.GROUND, MoveCategory.PHYSICAL, 65, 85, 20, 10, 0, 1) + new AttackMove(Moves.BONE_CLUB, PokemonType.GROUND, MoveCategory.PHYSICAL, 65, 85, 20, 10, 0, 1) .attr(FlinchAttr) .makesContact(false), - new AttackMove(Moves.FIRE_BLAST, Type.FIRE, MoveCategory.SPECIAL, 110, 85, 5, 10, 0, 1) + new AttackMove(Moves.FIRE_BLAST, PokemonType.FIRE, MoveCategory.SPECIAL, 110, 85, 5, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.WATERFALL, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 1) + new AttackMove(Moves.WATERFALL, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 1) .attr(FlinchAttr), - new AttackMove(Moves.CLAMP, Type.WATER, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 1) + new AttackMove(Moves.CLAMP, PokemonType.WATER, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.CLAMP), - new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) + new AttackMove(Moves.SWIFT, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new ChargingAttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.SKULL_BASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:loweredItsHead", { pokemonName: "{USER}" })) .chargeAttr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) + new AttackMove(Moves.SPIKE_CANNON, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false), - new AttackMove(Moves.CONSTRICT, Type.NORMAL, MoveCategory.PHYSICAL, 10, 100, 35, 10, 0, 1) + new AttackMove(Moves.CONSTRICT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 10, 100, 35, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.AMNESIA, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true), - new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1) + new StatusMove(Moves.KINESIS, PokemonType.PSYCHIC, 80, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .reflectable(), - new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1) + new SelfStatusMove(Moves.SOFT_BOILED, PokemonType.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HIGH_JUMP_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 130, 90, 10, -1, 0, 1) + new AttackMove(Moves.HIGH_JUMP_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 130, 90, 10, -1, 0, 1) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .condition(failOnGravityCondition) .recklessMove(), - new StatusMove(Moves.GLARE, Type.NORMAL, 100, 30, -1, 0, 1) + new StatusMove(Moves.GLARE, PokemonType.NORMAL, 100, 30, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .reflectable(), - new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) + new AttackMove(Moves.DREAM_EATER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) .attr(HitHealAttr) .condition(targetSleptOrComatoseCondition) .triageMove(), - new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1) + new StatusMove(Moves.POISON_GAS, PokemonType.POISON, 90, 40, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.BARRAGE, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + new AttackMove(Moves.BARRAGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.LEECH_LIFE, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) + new AttackMove(Moves.LEECH_LIFE, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) + new StatusMove(Moves.LOVELY_KISS, PokemonType.NORMAL, 75, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .reflectable(), - new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) + new ChargingAttackMove(Moves.SKY_ATTACK, PokemonType.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .attr(HighCritAttr) .attr(FlinchAttr) .makesContact(false), - new StatusMove(Moves.TRANSFORM, Type.NORMAL, -1, 10, -1, 0, 1) + new StatusMove(Moves.TRANSFORM, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(TransformAttr) // transforming from or into fusion pokemon causes various problems (such as crashes) .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE) && !user.fusionSpecies && !target.fusionSpecies) .ignoresProtect(), - new AttackMove(Moves.BUBBLE, Type.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + new AttackMove(Moves.BUBBLE, PokemonType.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DIZZY_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, 20, 0, 1) + new AttackMove(Moves.DIZZY_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, 20, 0, 1) .attr(ConfuseAttr) .punchingMove(), - new StatusMove(Moves.SPORE, Type.GRASS, 100, 15, -1, 0, 1) + new StatusMove(Moves.SPORE, PokemonType.GRASS, 100, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .powderMove() .reflectable(), - new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1) + new StatusMove(Moves.FLASH, PokemonType.NORMAL, 100, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .reflectable(), - new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) + new AttackMove(Moves.PSYWAVE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), - new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.SPLASH, PokemonType.NORMAL, -1, 40, -1, 0, 1) .attr(SplashAttr) .condition(failOnGravityCondition), - new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.ACID_ARMOR, PokemonType.POISON, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new AttackMove(Moves.CRABHAMMER, Type.WATER, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 1) + new AttackMove(Moves.CRABHAMMER, PokemonType.WATER, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 1) .attr(HighCritAttr), - new AttackMove(Moves.EXPLOSION, Type.NORMAL, MoveCategory.PHYSICAL, 250, 100, 5, -1, 0, 1) + new AttackMove(Moves.EXPLOSION, PokemonType.NORMAL, MoveCategory.PHYSICAL, 250, 100, 5, -1, 0, 1) .condition(failIfDampCondition) .attr(SacrificialAttr) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FURY_SWIPES, Type.NORMAL, MoveCategory.PHYSICAL, 18, 80, 15, -1, 0, 1) + new AttackMove(Moves.FURY_SWIPES, PokemonType.NORMAL, MoveCategory.PHYSICAL, 18, 80, 15, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.BONEMERANG, Type.GROUND, MoveCategory.PHYSICAL, 50, 90, 10, -1, 0, 1) + new AttackMove(Moves.BONEMERANG, PokemonType.GROUND, MoveCategory.PHYSICAL, 50, 90, 10, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false), - new SelfStatusMove(Moves.REST, Type.PSYCHIC, -1, 5, -1, 0, 1) + new SelfStatusMove(Moves.REST, PokemonType.PSYCHIC, -1, 5, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP, true, 3, true) .attr(HealAttr, 1, true) .condition((user, target, move) => !user.isFullHp() && user.canSetStatus(StatusEffect.SLEEP, true, true)) .triageMove(), - new AttackMove(Moves.ROCK_SLIDE, Type.ROCK, MoveCategory.PHYSICAL, 75, 90, 10, 30, 0, 1) + new AttackMove(Moves.ROCK_SLIDE, PokemonType.ROCK, MoveCategory.PHYSICAL, 75, 90, 10, 30, 0, 1) .attr(FlinchAttr) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.HYPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, 80, 90, 15, 10, 0, 1) + new AttackMove(Moves.HYPER_FANG, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 90, 15, 10, 0, 1) .attr(FlinchAttr) .bitingMove(), - new SelfStatusMove(Moves.SHARPEN, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.SHARPEN, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.CONVERSION, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(FirstMoveTypeAttr), - new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) + new AttackMove(Moves.TRI_ATTACK, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) .attr(MultiStatusEffectAttr, [ StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS ]), - new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) + new AttackMove(Moves.SUPER_FANG, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) + new AttackMove(Moves.SLASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) .attr(HighCritAttr) .slicingMove(), - new SelfStatusMove(Moves.SUBSTITUTE, Type.NORMAL, -1, 10, -1, 0, 1) + new SelfStatusMove(Moves.SUBSTITUTE, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(AddSubstituteAttr, 0.25, false), - new AttackMove(Moves.STRUGGLE, Type.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) + new AttackMove(Moves.STRUGGLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) .attr(RecoilAttr, true, 0.25, true) .attr(TypelessAttr) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.SKETCH, Type.NORMAL, -1, 1, -1, 0, 2) + new StatusMove(Moves.SKETCH, PokemonType.NORMAL, -1, 1, -1, 0, 2) .ignoresSubstitute() .attr(SketchAttr), - new AttackMove(Moves.TRIPLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 10, 90, 10, -1, 0, 2) + new AttackMove(Moves.TRIPLE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 10, 90, 10, -1, 0, 2) .attr(MultiHitAttr, MultiHitType._3) .attr(MultiHitPowerIncrementAttr, 3) .checkAllHits(), - new AttackMove(Moves.THIEF, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 2) + new AttackMove(Moves.THIEF, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 2) .attr(StealHeldItemChanceAttr, 0.3), - new StatusMove(Moves.SPIDER_WEB, Type.BUG, -1, 10, -1, 0, 2) + new StatusMove(Moves.SPIDER_WEB, PokemonType.BUG, -1, 10, -1, 0, 2) .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) .reflectable(), - new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.MIND_READER, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), - new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2) + new StatusMove(Moves.NIGHTMARE, PokemonType.GHOST, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.NIGHTMARE) .condition(targetSleptOrComatoseCondition), - new AttackMove(Moves.FLAME_WHEEL, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 25, 10, 0, 2) + new AttackMove(Moves.FLAME_WHEEL, PokemonType.FIRE, MoveCategory.PHYSICAL, 60, 100, 25, 10, 0, 2) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.SNORE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 15, 30, 0, 2) + new AttackMove(Moves.SNORE, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 15, 30, 0, 2) .attr(BypassSleepAttr) .attr(FlinchAttr) .condition(userSleptOrComatoseCondition) .soundBased(), - new StatusMove(Moves.CURSE, Type.GHOST, -1, 10, -1, 0, 2) + new StatusMove(Moves.CURSE, PokemonType.GHOST, -1, 10, -1, 0, 2) .attr(CurseAttr) .ignoresSubstitute() .ignoresProtect() .target(MoveTarget.CURSE), - new AttackMove(Moves.FLAIL, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) + new AttackMove(Moves.FLAIL, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), - new StatusMove(Moves.CONVERSION_2, Type.NORMAL, -1, 30, -1, 0, 2) + new StatusMove(Moves.CONVERSION_2, PokemonType.NORMAL, -1, 30, -1, 0, 2) .attr(ResistLastMoveTypeAttr) .ignoresSubstitute() .partial(), // Checks the move's original typing and not if its type is changed through some other means - new AttackMove(Moves.AEROBLAST, Type.FLYING, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 2) + new AttackMove(Moves.AEROBLAST, PokemonType.FLYING, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 2) .windMove() .attr(HighCritAttr), - new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2) + new StatusMove(Moves.COTTON_SPORE, PokemonType.GRASS, 100, 40, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .powderMove() .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) + new AttackMove(Moves.REVERSAL, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), - new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2) + new StatusMove(Moves.SPITE, PokemonType.GHOST, 100, 10, -1, 0, 2) .ignoresSubstitute() .attr(ReducePpMoveAttr, 4) .reflectable(), - new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) + new AttackMove(Moves.POWDER_SNOW, PokemonType.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.PROTECT, Type.NORMAL, -1, 10, -1, 4, 2) + new SelfStatusMove(Moves.PROTECT, PokemonType.NORMAL, -1, 10, -1, 4, 2) .attr(ProtectAttr) .condition(failIfLastCondition), - new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) + new AttackMove(Moves.MACH_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) .punchingMove(), - new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2) + new StatusMove(Moves.SCARY_FACE, PokemonType.NORMAL, 100, 10, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .reflectable(), - new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), - new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2) + new AttackMove(Moves.FEINT_ATTACK, PokemonType.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), + new StatusMove(Moves.SWEET_KISS, PokemonType.FAIRY, 75, 10, -1, 0, 2) .attr(ConfuseAttr) .reflectable(), - new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2) + new SelfStatusMove(Moves.BELLY_DRUM, PokemonType.NORMAL, -1, 10, -1, 0, 2) .attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => { globalScene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })); }), - new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) + new AttackMove(Moves.SLUDGE_BOMB, PokemonType.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.POISON) .ballBombMove(), - new AttackMove(Moves.MUD_SLAP, Type.GROUND, MoveCategory.SPECIAL, 20, 100, 10, 100, 0, 2) + new AttackMove(Moves.MUD_SLAP, PokemonType.GROUND, MoveCategory.SPECIAL, 20, 100, 10, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.OCTAZOOKA, Type.WATER, MoveCategory.SPECIAL, 65, 85, 10, 50, 0, 2) + new AttackMove(Moves.OCTAZOOKA, PokemonType.WATER, MoveCategory.SPECIAL, 65, 85, 10, 50, 0, 2) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .ballBombMove(), - new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2) + new StatusMove(Moves.SPIKES, PokemonType.GROUND, -1, 20, -1, 0, 2) .attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES) .target(MoveTarget.ENEMY_SIDE) .reflectable(), - new AttackMove(Moves.ZAP_CANNON, Type.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) + new AttackMove(Moves.ZAP_CANNON, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .ballBombMove(), - new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2) + new StatusMove(Moves.FORESIGHT, PokemonType.NORMAL, -1, 40, -1, 0, 2) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) .ignoresSubstitute() .reflectable(), - new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.DESTINY_BOND, PokemonType.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() .attr(DestinyBondAttr) .condition((user, target, move) => { @@ -9146,120 +8777,120 @@ export function initMoves() { // - the previous move was unsuccessful return lastTurnMove.length === 0 || lastTurnMove[0].move !== move.id || lastTurnMove[0].result !== MoveResult.SUCCESS; }), - new StatusMove(Moves.PERISH_SONG, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.PERISH_SONG, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(FaintCountdownAttr) .ignoresProtect() .soundBased() .condition(failOnBossCondition) .target(MoveTarget.ALL), - new AttackMove(Moves.ICY_WIND, Type.ICE, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 2) + new AttackMove(Moves.ICY_WIND, PokemonType.ICE, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.DETECT, Type.FIGHTING, -1, 5, -1, 4, 2) + new SelfStatusMove(Moves.DETECT, PokemonType.FIGHTING, -1, 5, -1, 4, 2) .attr(ProtectAttr) .condition(failIfLastCondition), - new AttackMove(Moves.BONE_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2) + new AttackMove(Moves.BONE_RUSH, PokemonType.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2) .attr(MultiHitAttr) .makesContact(false), - new StatusMove(Moves.LOCK_ON, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.LOCK_ON, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), - new AttackMove(Moves.OUTRAGE, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2) + new AttackMove(Moves.OUTRAGE, PokemonType.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.SANDSTORM, Type.ROCK, -1, 10, -1, 0, 2) + new StatusMove(Moves.SANDSTORM, PokemonType.ROCK, -1, 10, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.SANDSTORM) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.GIGA_DRAIN, Type.GRASS, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 2) + new AttackMove(Moves.GIGA_DRAIN, PokemonType.GRASS, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 2) .attr(HitHealAttr) .triageMove(), - new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2) + new SelfStatusMove(Moves.ENDURE, PokemonType.NORMAL, -1, 10, -1, 4, 2) .attr(ProtectAttr, BattlerTagType.ENDURING) .condition(failIfLastCondition), - new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) + new StatusMove(Moves.CHARM, PokemonType.FAIRY, 100, 20, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], -2) .reflectable(), - new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) + new AttackMove(Moves.ROLLOUT, PokemonType.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) .partial() // Does not lock the user, also does not increase damage properly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), - new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2) + new AttackMove(Moves.FALSE_SWIPE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2) .attr(SurviveDamageAttr), - new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2) + new StatusMove(Moves.SWAGGER, PokemonType.NORMAL, 85, 15, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) .attr(ConfuseAttr) .reflectable(), - new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.MILK_DRINK, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.SPARK, Type.ELECTRIC, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 2) + new AttackMove(Moves.SPARK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.FURY_CUTTER, Type.BUG, MoveCategory.PHYSICAL, 40, 95, 20, -1, 0, 2) + new AttackMove(Moves.FURY_CUTTER, PokemonType.BUG, MoveCategory.PHYSICAL, 40, 95, 20, -1, 0, 2) .attr(ConsecutiveUseDoublePowerAttr, 3, true) .slicingMove(), - new AttackMove(Moves.STEEL_WING, Type.STEEL, MoveCategory.PHYSICAL, 70, 90, 25, 10, 0, 2) + new AttackMove(Moves.STEEL_WING, PokemonType.STEEL, MoveCategory.PHYSICAL, 70, 90, 25, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.MEAN_LOOK, PokemonType.NORMAL, -1, 5, -1, 0, 2) .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) .reflectable(), - new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2) + new StatusMove(Moves.ATTRACT, PokemonType.NORMAL, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.INFATUATED) .ignoresSubstitute() .condition((user, target, move) => user.isOppositeGender(target)) .reflectable(), - new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2) + new SelfStatusMove(Moves.SLEEP_TALK, PokemonType.NORMAL, -1, 10, -1, 0, 2) .attr(BypassSleepAttr) .attr(RandomMovesetMoveAttr, invalidSleepTalkMoves, false) .condition(userSleptOrComatoseCondition) .target(MoveTarget.NEAR_ENEMY), - new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.HEAL_BELL, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(PartyStatusCureAttr, i18next.t("moveTriggers:bellChimed"), Abilities.SOUNDPROOF) .soundBased() .target(MoveTarget.PARTY), - new AttackMove(Moves.RETURN, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) + new AttackMove(Moves.RETURN, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) .attr(FriendshipPowerAttr), - new AttackMove(Moves.PRESENT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 15, -1, 0, 2) + new AttackMove(Moves.PRESENT, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 90, 15, -1, 0, 2) .attr(PresentPowerAttr) .makesContact(false), - new AttackMove(Moves.FRUSTRATION, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) + new AttackMove(Moves.FRUSTRATION, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) .attr(FriendshipPowerAttr, true), - new StatusMove(Moves.SAFEGUARD, Type.NORMAL, -1, 25, -1, 0, 2) + new StatusMove(Moves.SAFEGUARD, PokemonType.NORMAL, -1, 25, -1, 0, 2) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.SAFEGUARD, 5, true, true), - new StatusMove(Moves.PAIN_SPLIT, Type.NORMAL, -1, 20, -1, 0, 2) + new StatusMove(Moves.PAIN_SPLIT, PokemonType.NORMAL, -1, 20, -1, 0, 2) .attr(HpSplitAttr) .condition(failOnBossCondition), - new AttackMove(Moves.SACRED_FIRE, Type.FIRE, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 2) + new AttackMove(Moves.SACRED_FIRE, PokemonType.FIRE, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 2) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .makesContact(false), - new AttackMove(Moves.MAGNITUDE, Type.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) + new AttackMove(Moves.MAGNITUDE, PokemonType.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) .attr(PreMoveMessageAttr, magnitudeMessageFunc) .attr(MagnitudePowerAttr) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERGROUND) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.DYNAMIC_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2) + new AttackMove(Moves.DYNAMIC_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2) .attr(ConfuseAttr) .punchingMove(), - new AttackMove(Moves.MEGAHORN, Type.BUG, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 2), - new AttackMove(Moves.DRAGON_BREATH, Type.DRAGON, MoveCategory.SPECIAL, 60, 100, 20, 30, 0, 2) + new AttackMove(Moves.MEGAHORN, PokemonType.BUG, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 2), + new AttackMove(Moves.DRAGON_BREATH, PokemonType.DRAGON, MoveCategory.SPECIAL, 60, 100, 20, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new SelfStatusMove(Moves.BATON_PASS, Type.NORMAL, -1, 40, -1, 0, 2) + new SelfStatusMove(Moves.BATON_PASS, PokemonType.NORMAL, -1, 40, -1, 0, 2) .attr(ForceSwitchOutAttr, true, SwitchType.BATON_PASS) .condition(failIfLastInPartyCondition) .hidesUser(), - new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) + new StatusMove(Moves.ENCORE, PokemonType.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) .ignoresSubstitute() .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)) .reflectable(), - new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) + new AttackMove(Moves.PURSUIT, PokemonType.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) .partial(), // No effect implemented - new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) + new AttackMove(Moves.RAPID_SPIN, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .attr(RemoveBattlerTagAttr, [ BattlerTagType.BIND, @@ -9275,445 +8906,445 @@ export function initMoves() { BattlerTagType.INFESTATION ], true) .attr(RemoveArenaTrapAttr), - new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2) + new StatusMove(Moves.SWEET_SCENT, PokemonType.NORMAL, 100, 20, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.EVA ], -2) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) + new AttackMove(Moves.IRON_TAIL, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) + new AttackMove(Moves.METAL_CLAW, PokemonType.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new AttackMove(Moves.VITAL_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 70, -1, 10, -1, -1, 2), - new SelfStatusMove(Moves.MORNING_SUN, Type.NORMAL, -1, 5, -1, 0, 2) + new AttackMove(Moves.VITAL_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 70, -1, 10, -1, -1, 2), + new SelfStatusMove(Moves.MORNING_SUN, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new SelfStatusMove(Moves.SYNTHESIS, Type.GRASS, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.SYNTHESIS, PokemonType.GRASS, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new SelfStatusMove(Moves.MOONLIGHT, Type.FAIRY, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.MOONLIGHT, PokemonType.FAIRY, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new AttackMove(Moves.HIDDEN_POWER, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 2) + new AttackMove(Moves.HIDDEN_POWER, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 2) .attr(HiddenPowerTypeAttr), - new AttackMove(Moves.CROSS_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2) + new AttackMove(Moves.CROSS_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2) .attr(HighCritAttr), - new AttackMove(Moves.TWISTER, Type.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2) + new AttackMove(Moves.TWISTER, PokemonType.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.FLYING) .attr(FlinchAttr) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.RAIN_DANCE, Type.WATER, -1, 5, -1, 0, 2) + new StatusMove(Moves.RAIN_DANCE, PokemonType.WATER, -1, 5, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.RAIN) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.SUNNY_DAY, Type.FIRE, -1, 5, -1, 0, 2) + new StatusMove(Moves.SUNNY_DAY, PokemonType.FIRE, -1, 5, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.SUNNY) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.CRUNCH, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 2) + new AttackMove(Moves.CRUNCH, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .bitingMove(), - new AttackMove(Moves.MIRROR_COAT, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 20, -1, -5, 2) + new AttackMove(Moves.MIRROR_COAT, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 20, -1, -5, 2) .attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.SPECIAL, 2) .target(MoveTarget.ATTACKER), - new StatusMove(Moves.PSYCH_UP, Type.NORMAL, -1, 10, -1, 0, 2) + new StatusMove(Moves.PSYCH_UP, PokemonType.NORMAL, -1, 10, -1, 0, 2) .ignoresSubstitute() .attr(CopyStatsAttr), - new AttackMove(Moves.EXTREME_SPEED, Type.NORMAL, MoveCategory.PHYSICAL, 80, 100, 5, -1, 2, 2), - new AttackMove(Moves.ANCIENT_POWER, Type.ROCK, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 2) + new AttackMove(Moves.EXTREME_SPEED, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 100, 5, -1, 2, 2), + new AttackMove(Moves.ANCIENT_POWER, PokemonType.ROCK, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true), - new AttackMove(Moves.SHADOW_BALL, Type.GHOST, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 2) + new AttackMove(Moves.SHADOW_BALL, PokemonType.GHOST, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) + new AttackMove(Moves.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 .ignoresProtect() .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, i18next.t("moveTriggers:foresawAnAttack", { pokemonName: "{USER}" })), - new AttackMove(Moves.ROCK_SMASH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) + new AttackMove(Moves.ROCK_SMASH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) + new AttackMove(Moves.WHIRLPOOL, PokemonType.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) .attr(TrapAttr, BattlerTagType.WHIRLPOOL) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERWATER), - new AttackMove(Moves.BEAT_UP, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) + new AttackMove(Moves.BEAT_UP, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) .attr(MultiHitAttr, MultiHitType.BEAT_UP) .attr(BeatUpAttr) .makesContact(false), - new AttackMove(Moves.FAKE_OUT, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 10, 100, 3, 3) + new AttackMove(Moves.FAKE_OUT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 10, 100, 3, 3) .attr(FlinchAttr) .condition(new FirstMoveCondition()), - new AttackMove(Moves.UPROAR, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) + new AttackMove(Moves.UPROAR, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) .soundBased() .target(MoveTarget.RANDOM_NEAR_ENEMY) .partial(), // Does not lock the user, does not stop Pokemon from sleeping - new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.STOCKPILE, PokemonType.NORMAL, -1, 20, -1, 0, 3) .condition(user => (user.getTag(StockpilingTag)?.stockpiledCount ?? 0) < 3) .attr(AddBattlerTagAttr, BattlerTagType.STOCKPILING, true), - new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) + new AttackMove(Moves.SPIT_UP, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) .condition(hasStockpileStacksCondition) .attr(SpitUpPowerAttr, 100) .attr(RemoveBattlerTagAttr, [ BattlerTagType.STOCKPILING ], true), - new SelfStatusMove(Moves.SWALLOW, Type.NORMAL, -1, 10, -1, 0, 3) + new SelfStatusMove(Moves.SWALLOW, PokemonType.NORMAL, -1, 10, -1, 0, 3) .condition(hasStockpileStacksCondition) .attr(SwallowHealAttr) .attr(RemoveBattlerTagAttr, [ BattlerTagType.STOCKPILING ], true) .triageMove(), - new AttackMove(Moves.HEAT_WAVE, Type.FIRE, MoveCategory.SPECIAL, 95, 90, 10, 10, 0, 3) + new AttackMove(Moves.HEAT_WAVE, PokemonType.FIRE, MoveCategory.SPECIAL, 95, 90, 10, 10, 0, 3) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.HAIL, Type.ICE, -1, 10, -1, 0, 3) + new StatusMove(Moves.HAIL, PokemonType.ICE, -1, 10, -1, 0, 3) .attr(WeatherChangeAttr, WeatherType.HAIL) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3) + new StatusMove(Moves.TORMENT, PokemonType.DARK, 100, 15, -1, 0, 3) .ignoresSubstitute() .edgeCase() // Incomplete implementation because of Uproar's partial implementation .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1) .reflectable(), - new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3) + new StatusMove(Moves.FLATTER, PokemonType.DARK, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1) .attr(ConfuseAttr) .reflectable(), - new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) + new StatusMove(Moves.WILL_O_WISP, PokemonType.FIRE, 85, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.BURN) .reflectable(), - new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) + new StatusMove(Moves.MEMENTO, PokemonType.DARK, 100, 10, -1, 0, 3) .attr(SacrificialAttrOnHit) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2), - new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) + new AttackMove(Moves.FACADE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => user.status && (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1) .attr(BypassBurnDamageReductionAttr), - new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) + new AttackMove(Moves.FOCUS_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) .attr(PreUseInterruptAttr, (user, target, move) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => !!user.turnData.attacksReceived.find(r => r.damage)) .punchingMove(), - new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) + new AttackMove(Moves.SMELLING_SALTS, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), - new SelfStatusMove(Moves.FOLLOW_ME, Type.NORMAL, -1, 20, -1, 2, 3) + new SelfStatusMove(Moves.FOLLOW_ME, PokemonType.NORMAL, -1, 20, -1, 2, 3) .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), - new StatusMove(Moves.NATURE_POWER, Type.NORMAL, -1, 20, -1, 0, 3) + new StatusMove(Moves.NATURE_POWER, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(NaturePowerAttr), - new SelfStatusMove(Moves.CHARGE, Type.ELECTRIC, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.CHARGE, PokemonType.ELECTRIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1, true) .attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false), - new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3) + new StatusMove(Moves.TAUNT, PokemonType.DARK, 100, 20, -1, 0, 3) .ignoresSubstitute() .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4) .reflectable(), - new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3) + new StatusMove(Moves.HELPING_HAND, PokemonType.NORMAL, -1, 20, -1, 5, 3) .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY) .condition(failIfSingleBattle), - new StatusMove(Moves.TRICK, Type.PSYCHIC, 100, 10, -1, 0, 3) + new StatusMove(Moves.TRICK, PokemonType.PSYCHIC, 100, 10, -1, 0, 3) .unimplemented(), - new StatusMove(Moves.ROLE_PLAY, Type.PSYCHIC, -1, 10, -1, 0, 3) + new StatusMove(Moves.ROLE_PLAY, PokemonType.PSYCHIC, -1, 10, -1, 0, 3) .ignoresSubstitute() .attr(AbilityCopyAttr), - new SelfStatusMove(Moves.WISH, Type.NORMAL, -1, 10, -1, 0, 3) + new SelfStatusMove(Moves.WISH, PokemonType.NORMAL, -1, 10, -1, 0, 3) .triageMove() .attr(AddArenaTagAttr, ArenaTagType.WISH, 2, true), - new SelfStatusMove(Moves.ASSIST, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.ASSIST, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(RandomMovesetMoveAttr, invalidAssistMoves, true), - new SelfStatusMove(Moves.INGRAIN, Type.GRASS, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.INGRAIN, PokemonType.GRASS, -1, 20, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.INGRAIN, true, true) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, true, true) .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLOATING ], true), - new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) + new AttackMove(Moves.SUPERPOWER, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true), - new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3) + new SelfStatusMove(Moves.MAGIC_COAT, PokemonType.PSYCHIC, -1, 15, -1, 4, 3) .attr(AddBattlerTagAttr, BattlerTagType.MAGIC_COAT, true, true, 0) .condition(failIfLastCondition) // Interactions with stomping tantrum, instruct, and other moves that // rely on move history // Also will not reflect roar / whirlwind if the target has ForceSwitchOutImmunityAbAttr .edgeCase(), - new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3) + new SelfStatusMove(Moves.RECYCLE, PokemonType.NORMAL, -1, 10, -1, 0, 3) .unimplemented(), - new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) + new AttackMove(Moves.REVENGE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) .attr(TurnDamagedDoublePowerAttr), - new AttackMove(Moves.BRICK_BREAK, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 15, -1, 0, 3) + new AttackMove(Moves.BRICK_BREAK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 15, -1, 0, 3) .attr(RemoveScreensAttr), - new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) + new StatusMove(Moves.YAWN, PokemonType.NORMAL, -1, 10, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) .condition((user, target, move) => !target.status && !target.isSafeguarded(user)) .reflectable(), - new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) + new AttackMove(Moves.KNOCK_OFF, PokemonType.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), - new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) + new AttackMove(Moves.ENDEAVOR, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) .attr(MatchHpAttr) .condition(failOnBossCondition), - new AttackMove(Moves.ERUPTION, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) + new AttackMove(Moves.ERUPTION, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.SKILL_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 3) + new StatusMove(Moves.SKILL_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 3) .ignoresSubstitute() .attr(SwitchAbilitiesAttr), - new StatusMove(Moves.IMPRISON, Type.PSYCHIC, 100, 10, -1, 0, 3) + new StatusMove(Moves.IMPRISON, PokemonType.PSYCHIC, 100, 10, -1, 0, 3) .ignoresSubstitute() .attr(AddArenaTagAttr, ArenaTagType.IMPRISON, 1, true, false) .target(MoveTarget.ENEMY_SIDE), - new SelfStatusMove(Moves.REFRESH, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.REFRESH, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(HealStatusEffectAttr, true, [ StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN ]) .condition((user, target, move) => !!user.status && (user.status.effect === StatusEffect.PARALYSIS || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.BURN)), - new SelfStatusMove(Moves.GRUDGE, Type.GHOST, -1, 5, -1, 0, 3) + new SelfStatusMove(Moves.GRUDGE, PokemonType.GHOST, -1, 5, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.GRUDGE, true, undefined, 1), - new SelfStatusMove(Moves.SNATCH, Type.DARK, -1, 10, -1, 4, 3) + new SelfStatusMove(Moves.SNATCH, PokemonType.DARK, -1, 10, -1, 4, 3) .unimplemented(), - new AttackMove(Moves.SECRET_POWER, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, 30, 0, 3) + new AttackMove(Moves.SECRET_POWER, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, 30, 0, 3) .makesContact(false) .attr(SecretPowerAttr), - new ChargingAttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) + new ChargingAttackMove(Moves.DIVE, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) .chargeText(i18next.t("moveTriggers:hidUnderwater", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERWATER) .chargeAttr(GulpMissileTagAttr), - new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) + new AttackMove(Moves.ARM_THRUST, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), - new SelfStatusMove(Moves.CAMOUFLAGE, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.CAMOUFLAGE, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(CopyBiomeTypeAttr), - new SelfStatusMove(Moves.TAIL_GLOW, Type.BUG, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.TAIL_GLOW, PokemonType.BUG, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 3, true), - new AttackMove(Moves.LUSTER_PURGE, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) + new AttackMove(Moves.LUSTER_PURGE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.MIST_BALL, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) + new AttackMove(Moves.MIST_BALL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .ballBombMove(), - new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3) + new StatusMove(Moves.FEATHER_DANCE, PokemonType.FLYING, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], -2) .danceMove() .reflectable(), - new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3) + new StatusMove(Moves.TEETER_DANCE, PokemonType.NORMAL, 100, 20, -1, 0, 3) .attr(ConfuseAttr) .danceMove() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.BLAZE_KICK, Type.FIRE, MoveCategory.PHYSICAL, 85, 90, 10, 10, 0, 3) + new AttackMove(Moves.BLAZE_KICK, PokemonType.FIRE, MoveCategory.PHYSICAL, 85, 90, 10, 10, 0, 3) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3) + new StatusMove(Moves.MUD_SPORT, PokemonType.GROUND, -1, 15, -1, 0, 3) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3) + new AttackMove(Moves.ICE_BALL, PokemonType.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3) .partial() // Does not lock the user properly, does not increase damage correctly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL) .ballBombMove(), - new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3) + new AttackMove(Moves.NEEDLE_ARM, PokemonType.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3) .attr(FlinchAttr), - new SelfStatusMove(Moves.SLACK_OFF, Type.NORMAL, -1, 5, -1, 0, 3) + new SelfStatusMove(Moves.SLACK_OFF, PokemonType.NORMAL, -1, 5, -1, 0, 3) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HYPER_VOICE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) + new AttackMove(Moves.HYPER_VOICE, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.POISON_FANG, Type.POISON, MoveCategory.PHYSICAL, 50, 100, 15, 50, 0, 3) + new AttackMove(Moves.POISON_FANG, PokemonType.POISON, MoveCategory.PHYSICAL, 50, 100, 15, 50, 0, 3) .attr(StatusEffectAttr, StatusEffect.TOXIC) .bitingMove(), - new AttackMove(Moves.CRUSH_CLAW, Type.NORMAL, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 3) + new AttackMove(Moves.CRUSH_CLAW, PokemonType.NORMAL, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.BLAST_BURN, Type.FIRE, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.BLAST_BURN, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new AttackMove(Moves.HYDRO_CANNON, Type.WATER, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.HYDRO_CANNON, PokemonType.WATER, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new AttackMove(Moves.METEOR_MASH, Type.STEEL, MoveCategory.PHYSICAL, 90, 90, 10, 20, 0, 3) + new AttackMove(Moves.METEOR_MASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 90, 90, 10, 20, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .punchingMove(), - new AttackMove(Moves.ASTONISH, Type.GHOST, MoveCategory.PHYSICAL, 30, 100, 15, 30, 0, 3) + new AttackMove(Moves.ASTONISH, PokemonType.GHOST, MoveCategory.PHYSICAL, 30, 100, 15, 30, 0, 3) .attr(FlinchAttr), - new AttackMove(Moves.WEATHER_BALL, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) + new AttackMove(Moves.WEATHER_BALL, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) .attr(WeatherBallTypeAttr) .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 2 : 1) // TODO: is this bang correct? .ballBombMove(), - new StatusMove(Moves.AROMATHERAPY, Type.GRASS, -1, 5, -1, 0, 3) + new StatusMove(Moves.AROMATHERAPY, PokemonType.GRASS, -1, 5, -1, 0, 3) .attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER) .target(MoveTarget.PARTY), - new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3) + new StatusMove(Moves.FAKE_TEARS, PokemonType.DARK, 100, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) .reflectable(), - new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) + new AttackMove(Moves.AIR_CUTTER, PokemonType.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) .attr(HighCritAttr) .slicingMove() .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.OVERHEAT, Type.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3) + new AttackMove(Moves.OVERHEAT, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE), - new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3) + new StatusMove(Moves.ODOR_SLEUTH, PokemonType.NORMAL, -1, 40, -1, 0, 3) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) .ignoresSubstitute() .reflectable(), - new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) + new AttackMove(Moves.ROCK_TOMB, PokemonType.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), - new AttackMove(Moves.SILVER_WIND, Type.BUG, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 3) + new AttackMove(Moves.SILVER_WIND, PokemonType.BUG, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .windMove(), - new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3) + new StatusMove(Moves.METAL_SOUND, PokemonType.STEEL, 85, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) .soundBased() .reflectable(), - new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3) + new StatusMove(Moves.GRASS_WHISTLE, PokemonType.GRASS, 55, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.SLEEP) .soundBased() .reflectable(), - new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3) + new StatusMove(Moves.TICKLE, PokemonType.NORMAL, 100, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1) .reflectable(), - new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.COSMIC_POWER, PokemonType.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), - new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) + new AttackMove(Moves.WATER_SPOUT, PokemonType.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SIGNAL_BEAM, Type.BUG, MoveCategory.SPECIAL, 75, 100, 15, 10, 0, 3) + new AttackMove(Moves.SIGNAL_BEAM, PokemonType.BUG, MoveCategory.SPECIAL, 75, 100, 15, 10, 0, 3) .attr(ConfuseAttr), - new AttackMove(Moves.SHADOW_PUNCH, Type.GHOST, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) + new AttackMove(Moves.SHADOW_PUNCH, PokemonType.GHOST, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) .punchingMove(), - new AttackMove(Moves.EXTRASENSORY, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3) + new AttackMove(Moves.EXTRASENSORY, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3) .attr(FlinchAttr), - new AttackMove(Moves.SKY_UPPERCUT, Type.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) + new AttackMove(Moves.SKY_UPPERCUT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) .attr(HitsTagAttr, BattlerTagType.FLYING) .punchingMove(), - new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) + new AttackMove(Moves.SAND_TOMB, PokemonType.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) .attr(TrapAttr, BattlerTagType.SAND_TOMB) .makesContact(false), - new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) + new AttackMove(Moves.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) .attr(IceNoEffectTypeAttr) .attr(OneHitKOAttr) .attr(SheerColdAccuracyAttr), - new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) + new AttackMove(Moves.MUDDY_WATER, PokemonType.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BULLET_SEED, Type.GRASS, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) + new AttackMove(Moves.BULLET_SEED, PokemonType.GRASS, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.AERIAL_ACE, Type.FLYING, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) + new AttackMove(Moves.AERIAL_ACE, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) .slicingMove(), - new AttackMove(Moves.ICICLE_SPEAR, Type.ICE, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) + new AttackMove(Moves.ICICLE_SPEAR, PokemonType.ICE, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false), - new SelfStatusMove(Moves.IRON_DEFENSE, Type.STEEL, -1, 15, -1, 0, 3) + new SelfStatusMove(Moves.IRON_DEFENSE, PokemonType.STEEL, -1, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3) + new StatusMove(Moves.BLOCK, PokemonType.NORMAL, -1, 5, -1, 0, 3) .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) .reflectable(), - new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3) + new StatusMove(Moves.HOWL, PokemonType.NORMAL, -1, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1) .soundBased() .target(MoveTarget.USER_AND_ALLIES), - new AttackMove(Moves.DRAGON_CLAW, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 3), - new AttackMove(Moves.FRENZY_PLANT, Type.GRASS, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.DRAGON_CLAW, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 3), + new AttackMove(Moves.FRENZY_PLANT, PokemonType.GRASS, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.BULK_UP, PokemonType.FIGHTING, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1, true), - new ChargingAttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) + new ChargingAttackMove(Moves.BOUNCE, PokemonType.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) .chargeText(i18next.t("moveTriggers:sprangUp", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .condition(failOnGravityCondition), - new AttackMove(Moves.MUD_SHOT, Type.GROUND, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 3) + new AttackMove(Moves.MUD_SHOT, PokemonType.GROUND, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.POISON_TAIL, Type.POISON, MoveCategory.PHYSICAL, 50, 100, 25, 10, 0, 3) + new AttackMove(Moves.POISON_TAIL, PokemonType.POISON, MoveCategory.PHYSICAL, 50, 100, 25, 10, 0, 3) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.COVET, Type.NORMAL, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 3) + new AttackMove(Moves.COVET, PokemonType.NORMAL, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 3) .attr(StealHeldItemChanceAttr, 0.3), - new AttackMove(Moves.VOLT_TACKLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 3) + new AttackMove(Moves.VOLT_TACKLE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 3) .attr(RecoilAttr, false, 0.33) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .recklessMove(), - new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), - new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3) + new AttackMove(Moves.MAGICAL_LEAF, PokemonType.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), + new StatusMove(Moves.WATER_SPORT, PokemonType.WATER, -1, 15, -1, 0, 3) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5) .target(MoveTarget.BOTH_SIDES), - new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.CALM_MIND, PokemonType.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true), - new AttackMove(Moves.LEAF_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 3) + new AttackMove(Moves.LEAF_BLADE, PokemonType.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 3) .attr(HighCritAttr) .slicingMove(), - new SelfStatusMove(Moves.DRAGON_DANCE, Type.DRAGON, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.DRAGON_DANCE, PokemonType.DRAGON, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.ROCK_BLAST, Type.ROCK, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 3) + new AttackMove(Moves.ROCK_BLAST, PokemonType.ROCK, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.SHOCK_WAVE, Type.ELECTRIC, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), - new AttackMove(Moves.WATER_PULSE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, 20, 0, 3) + new AttackMove(Moves.SHOCK_WAVE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), + new AttackMove(Moves.WATER_PULSE, PokemonType.WATER, MoveCategory.SPECIAL, 60, 100, 20, 20, 0, 3) .attr(ConfuseAttr) .pulseMove(), - new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) + new AttackMove(Moves.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 .ignoresProtect() .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, i18next.t("moveTriggers:choseDoomDesireAsDestiny", { pokemonName: "{USER}" })), - new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) + new AttackMove(Moves.PSYCHO_BOOST, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) + new SelfStatusMove(Moves.ROOST, PokemonType.FLYING, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false) .triageMove(), - new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) + new StatusMove(Moves.GRAVITY, PokemonType.PSYCHIC, -1, 5, -1, 0, 4) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) + new StatusMove(Moves.MIRACLE_EYE, PokemonType.PSYCHIC, -1, 40, -1, 0, 4) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK) .ignoresSubstitute() .reflectable(), - new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) + new AttackMove(Moves.WAKE_UP_SLAP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), - new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4) + new AttackMove(Moves.HAMMER_ARM, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true) .punchingMove(), - new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.GYRO_BALL, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(GyroBallPowerAttr) .ballBombMove(), - new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.HEALING_WISH, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore") .triageMove() .condition(failIfLastInPartyCondition), - new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) + new AttackMove(Moves.BRINE, PokemonType.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1), - new AttackMove(Moves.NATURAL_GIFT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) + new AttackMove(Moves.NATURAL_GIFT, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) .makesContact(false) .unimplemented(), - new AttackMove(Moves.FEINT, Type.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4) + new AttackMove(Moves.FEINT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4) .attr(RemoveBattlerTagAttr, [ BattlerTagType.PROTECTED ]) .attr(RemoveArenaTagsAttr, [ ArenaTagType.QUICK_GUARD, ArenaTagType.WIDE_GUARD, ArenaTagType.MAT_BLOCK, ArenaTagType.CRAFTY_SHIELD ], false) .makesContact(false) .ignoresProtect(), - new AttackMove(Moves.PLUCK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) + new AttackMove(Moves.PLUCK, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) .attr(StealEatBerryAttr), - new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4) + new StatusMove(Moves.TAILWIND, PokemonType.FLYING, -1, 15, -1, 0, 4) .windMove() .attr(AddArenaTagAttr, ArenaTagType.TAILWIND, 4, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4) + new StatusMove(Moves.ACUPRESSURE, PokemonType.NORMAL, -1, 30, -1, 0, 4) .attr(AcupressureStatStageChangeAttr) .target(MoveTarget.USER_OR_NEAR_ALLY), - new AttackMove(Moves.METAL_BURST, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) + new AttackMove(Moves.METAL_BURST, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .redirectCounter() .makesContact(false) .target(MoveTarget.ATTACKER), - new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) + new AttackMove(Moves.U_TURN, PokemonType.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) + new AttackMove(Moves.CLOSE_COMBAT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) + new AttackMove(Moves.PAYBACK, PokemonType.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === globalScene.currentBattle.turn) || globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.BALL ? 2 : 1), - new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) + new AttackMove(Moves.ASSURANCE, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), - new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) + new StatusMove(Moves.EMBARGO, PokemonType.DARK, 100, 15, -1, 0, 4) .reflectable() .unimplemented(), - new AttackMove(Moves.FLING, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) + new AttackMove(Moves.FLING, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .makesContact(false) .unimplemented(), - new StatusMove(Moves.PSYCHO_SHIFT, Type.PSYCHIC, 100, 10, -1, 0, 4) + new StatusMove(Moves.PSYCHO_SHIFT, PokemonType.PSYCHIC, 100, 10, -1, 0, 4) .attr(PsychoShiftEffectAttr) .condition((user, target, move) => { let statusToApply = user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined; @@ -9723,156 +9354,156 @@ export function initMoves() { return !!statusToApply && target.canSetStatus(statusToApply, false, false, user); } ), - new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) + new AttackMove(Moves.TRUMP_CARD, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) .makesContact() .attr(LessPPMorePowerAttr), - new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4) + new StatusMove(Moves.HEAL_BLOCK, PokemonType.PSYCHIC, 100, 15, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.WRING_OUT, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120) .makesContact(), - new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.POWER_TRICK, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.POWER_TRICK, true), - new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) + new StatusMove(Moves.GASTRO_ACID, PokemonType.POISON, 100, 10, -1, 0, 4) .attr(SuppressAbilitiesAttr) .reflectable(), - new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) + new StatusMove(Moves.LUCKY_CHANT, PokemonType.NORMAL, -1, 30, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ME_FIRST, Type.NORMAL, -1, 20, -1, 0, 4) + new StatusMove(Moves.ME_FIRST, PokemonType.NORMAL, -1, 20, -1, 0, 4) .ignoresSubstitute() .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new SelfStatusMove(Moves.COPYCAT, Type.NORMAL, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.COPYCAT, PokemonType.NORMAL, -1, 20, -1, 0, 4) .attr(CopyMoveAttr, false, invalidCopycatMoves), - new StatusMove(Moves.POWER_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) + new StatusMove(Moves.POWER_SWAP, PokemonType.PSYCHIC, -1, 10, 100, 0, 4) .attr(SwapStatStagesAttr, [ Stat.ATK, Stat.SPATK ]) .ignoresSubstitute(), - new StatusMove(Moves.GUARD_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) + new StatusMove(Moves.GUARD_SWAP, PokemonType.PSYCHIC, -1, 10, 100, 0, 4) .attr(SwapStatStagesAttr, [ Stat.DEF, Stat.SPDEF ]) .ignoresSubstitute(), - new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.PUNISHMENT, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .makesContact(true) .attr(PunishmentPowerAttr), - new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) + new AttackMove(Moves.LAST_RESORT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) .attr(LastResortAttr), - new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) + new StatusMove(Moves.WORRY_SEED, PokemonType.GRASS, 100, 10, -1, 0, 4) .attr(AbilityChangeAttr, Abilities.INSOMNIA) .reflectable(), - new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) + new AttackMove(Moves.SUCKER_PUNCH, PokemonType.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? - new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4) + new StatusMove(Moves.TOXIC_SPIKES, PokemonType.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) .target(MoveTarget.ENEMY_SIDE) .reflectable(), - new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) + new StatusMove(Moves.HEART_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(SwapStatStagesAttr, BATTLE_STATS) .ignoresSubstitute(), - new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.AQUA_RING, PokemonType.WATER, -1, 20, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), - new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.MAGNET_RISE, PokemonType.ELECTRIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, true, true, 5) .condition((user, target, move) => !globalScene.arena.getTag(ArenaTagType.GRAVITY) && [ BattlerTagType.FLOATING, BattlerTagType.IGNORE_FLYING, BattlerTagType.INGRAIN ].every((tag) => !user.getTag(tag))), - new AttackMove(Moves.FLARE_BLITZ, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) + new AttackMove(Moves.FLARE_BLITZ, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) .attr(RecoilAttr, false, 0.33) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .recklessMove(), - new AttackMove(Moves.FORCE_PALM, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, 30, 0, 4) + new AttackMove(Moves.FORCE_PALM, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.AURA_SPHERE, Type.FIGHTING, MoveCategory.SPECIAL, 80, -1, 20, -1, 0, 4) + new AttackMove(Moves.AURA_SPHERE, PokemonType.FIGHTING, MoveCategory.SPECIAL, 80, -1, 20, -1, 0, 4) .pulseMove() .ballBombMove(), - new SelfStatusMove(Moves.ROCK_POLISH, Type.ROCK, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.ROCK_POLISH, PokemonType.ROCK, -1, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), - new AttackMove(Moves.POISON_JAB, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 20, 30, 0, 4) + new AttackMove(Moves.POISON_JAB, PokemonType.POISON, MoveCategory.PHYSICAL, 80, 100, 20, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.DARK_PULSE, Type.DARK, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 4) + new AttackMove(Moves.DARK_PULSE, PokemonType.DARK, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 4) .attr(FlinchAttr) .pulseMove(), - new AttackMove(Moves.NIGHT_SLASH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) + new AttackMove(Moves.NIGHT_SLASH, PokemonType.DARK, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) .attr(HighCritAttr) .slicingMove(), - new AttackMove(Moves.AQUA_TAIL, Type.WATER, MoveCategory.PHYSICAL, 90, 90, 10, -1, 0, 4), - new AttackMove(Moves.SEED_BOMB, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) + new AttackMove(Moves.AQUA_TAIL, PokemonType.WATER, MoveCategory.PHYSICAL, 90, 90, 10, -1, 0, 4), + new AttackMove(Moves.SEED_BOMB, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.AIR_SLASH, Type.FLYING, MoveCategory.SPECIAL, 75, 95, 15, 30, 0, 4) + new AttackMove(Moves.AIR_SLASH, PokemonType.FLYING, MoveCategory.SPECIAL, 75, 95, 15, 30, 0, 4) .attr(FlinchAttr) .slicingMove(), - new AttackMove(Moves.X_SCISSOR, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) + new AttackMove(Moves.X_SCISSOR, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) .slicingMove(), - new AttackMove(Moves.BUG_BUZZ, Type.BUG, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.BUG_BUZZ, PokemonType.BUG, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .soundBased(), - new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) + new AttackMove(Moves.DRAGON_PULSE, PokemonType.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) .pulseMove(), - new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) + new AttackMove(Moves.DRAGON_RUSH, PokemonType.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), - new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) + new AttackMove(Moves.POWER_GEM, PokemonType.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), + new AttackMove(Moves.DRAIN_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) .attr(HitHealAttr) .punchingMove() .triageMove(), - new AttackMove(Moves.VACUUM_WAVE, Type.FIGHTING, MoveCategory.SPECIAL, 40, 100, 30, -1, 1, 4), - new AttackMove(Moves.FOCUS_BLAST, Type.FIGHTING, MoveCategory.SPECIAL, 120, 70, 5, 10, 0, 4) + new AttackMove(Moves.VACUUM_WAVE, PokemonType.FIGHTING, MoveCategory.SPECIAL, 40, 100, 30, -1, 1, 4), + new AttackMove(Moves.FOCUS_BLAST, PokemonType.FIGHTING, MoveCategory.SPECIAL, 120, 70, 5, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.ENERGY_BALL, Type.GRASS, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.ENERGY_BALL, PokemonType.GRASS, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.BRAVE_BIRD, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) + new AttackMove(Moves.BRAVE_BIRD, PokemonType.FLYING, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.EARTH_POWER, Type.GROUND, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.EARTH_POWER, PokemonType.GROUND, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new StatusMove(Moves.SWITCHEROO, Type.DARK, 100, 10, -1, 0, 4) + new StatusMove(Moves.SWITCHEROO, PokemonType.DARK, 100, 10, -1, 0, 4) .unimplemented(), - new AttackMove(Moves.GIGA_IMPACT, Type.NORMAL, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.GIGA_IMPACT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr), - new SelfStatusMove(Moves.NASTY_PLOT, Type.DARK, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.NASTY_PLOT, PokemonType.DARK, -1, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], 2, true), - new AttackMove(Moves.BULLET_PUNCH, Type.STEEL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) + new AttackMove(Moves.BULLET_PUNCH, PokemonType.STEEL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) .punchingMove(), - new AttackMove(Moves.AVALANCHE, Type.ICE, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 4) + new AttackMove(Moves.AVALANCHE, PokemonType.ICE, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 4) .attr(TurnDamagedDoublePowerAttr), - new AttackMove(Moves.ICE_SHARD, Type.ICE, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) + new AttackMove(Moves.ICE_SHARD, PokemonType.ICE, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) .makesContact(false), - new AttackMove(Moves.SHADOW_CLAW, Type.GHOST, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) + new AttackMove(Moves.SHADOW_CLAW, PokemonType.GHOST, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) .attr(HighCritAttr), - new AttackMove(Moves.THUNDER_FANG, Type.ELECTRIC, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.THUNDER_FANG, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .bitingMove(), - new AttackMove(Moves.ICE_FANG, Type.ICE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.ICE_FANG, PokemonType.ICE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.FREEZE) .bitingMove(), - new AttackMove(Moves.FIRE_FANG, Type.FIRE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.FIRE_FANG, PokemonType.FIRE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .bitingMove(), - new AttackMove(Moves.SHADOW_SNEAK, Type.GHOST, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4), - new AttackMove(Moves.MUD_BOMB, Type.GROUND, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) + new AttackMove(Moves.SHADOW_SNEAK, PokemonType.GHOST, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4), + new AttackMove(Moves.MUD_BOMB, PokemonType.GROUND, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .ballBombMove(), - new AttackMove(Moves.PSYCHO_CUT, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) + new AttackMove(Moves.PSYCHO_CUT, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(HighCritAttr) .slicingMove() .makesContact(false), - new AttackMove(Moves.ZEN_HEADBUTT, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 90, 15, 20, 0, 4) + new AttackMove(Moves.ZEN_HEADBUTT, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 80, 90, 15, 20, 0, 4) .attr(FlinchAttr), - new AttackMove(Moves.MIRROR_SHOT, Type.STEEL, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) + new AttackMove(Moves.MIRROR_SHOT, PokemonType.STEEL, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.FLASH_CANNON, Type.STEEL, MoveCategory.SPECIAL, 80, 100, 10, 10, 0, 4) + new AttackMove(Moves.FLASH_CANNON, PokemonType.STEEL, MoveCategory.SPECIAL, 80, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.ROCK_CLIMB, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, 20, 0, 4) + new AttackMove(Moves.ROCK_CLIMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, 20, 0, 4) .attr(ConfuseAttr), - new StatusMove(Moves.DEFOG, Type.FLYING, -1, 15, -1, 0, 4) + new StatusMove(Moves.DEFOG, PokemonType.FLYING, -1, 15, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.EVA ], -1) .attr(ClearWeatherAttr, WeatherType.FOG) .attr(ClearTerrainAttr) @@ -9880,129 +9511,129 @@ export function initMoves() { .attr(RemoveArenaTrapAttr, true) .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false) .reflectable(), - new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4) + new StatusMove(Moves.TRICK_ROOM, PokemonType.PSYCHIC, -1, 5, -1, -7, 4) .attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.DRACO_METEOR, Type.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) + new AttackMove(Moves.DRACO_METEOR, PokemonType.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.DISCHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.DISCHARGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.LAVA_PLUME, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.LAVA_PLUME, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.LEAF_STORM, Type.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) + new AttackMove(Moves.LEAF_STORM, PokemonType.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.POWER_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4), - new AttackMove(Moves.ROCK_WRECKER, Type.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.POWER_WHIP, PokemonType.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4), + new AttackMove(Moves.ROCK_WRECKER, PokemonType.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.CROSS_POISON, Type.POISON, MoveCategory.PHYSICAL, 70, 100, 20, 10, 0, 4) + new AttackMove(Moves.CROSS_POISON, PokemonType.POISON, MoveCategory.PHYSICAL, 70, 100, 20, 10, 0, 4) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.POISON) .slicingMove(), - new AttackMove(Moves.GUNK_SHOT, Type.POISON, MoveCategory.PHYSICAL, 120, 80, 5, 30, 0, 4) + new AttackMove(Moves.GUNK_SHOT, PokemonType.POISON, MoveCategory.PHYSICAL, 120, 80, 5, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.IRON_HEAD, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.IRON_HEAD, PokemonType.STEEL, MoveCategory.PHYSICAL, 80, 100, 15, 30, 0, 4) .attr(FlinchAttr), - new AttackMove(Moves.MAGNET_BOMB, Type.STEEL, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 4) + new AttackMove(Moves.MAGNET_BOMB, PokemonType.STEEL, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 4) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.STONE_EDGE, Type.ROCK, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 4) + new AttackMove(Moves.STONE_EDGE, PokemonType.ROCK, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 4) .attr(HighCritAttr) .makesContact(false), - new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4) + new StatusMove(Moves.CAPTIVATE, PokemonType.NORMAL, 100, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) .condition((user, target, move) => target.isOppositeGender(user)) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4) + new StatusMove(Moves.STEALTH_ROCK, PokemonType.ROCK, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK) .target(MoveTarget.ENEMY_SIDE) .reflectable(), - new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) + new AttackMove(Moves.GRASS_KNOT, PokemonType.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) .attr(WeightPowerAttr) .makesContact(), - new AttackMove(Moves.CHATTER, Type.FLYING, MoveCategory.SPECIAL, 65, 100, 20, 100, 0, 4) + new AttackMove(Moves.CHATTER, PokemonType.FLYING, MoveCategory.SPECIAL, 65, 100, 20, 100, 0, 4) .attr(ConfuseAttr) .soundBased(), - new AttackMove(Moves.JUDGMENT, Type.NORMAL, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 4) + new AttackMove(Moves.JUDGMENT, PokemonType.NORMAL, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 4) .attr(FormChangeItemTypeAttr), - new AttackMove(Moves.BUG_BITE, Type.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) + new AttackMove(Moves.BUG_BITE, PokemonType.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) .attr(StealEatBerryAttr), - new AttackMove(Moves.CHARGE_BEAM, Type.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4) + new AttackMove(Moves.CHARGE_BEAM, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), - new AttackMove(Moves.WOOD_HAMMER, Type.GRASS, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) + new AttackMove(Moves.WOOD_HAMMER, PokemonType.GRASS, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.AQUA_JET, Type.WATER, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 4), - new AttackMove(Moves.ATTACK_ORDER, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 4) + new AttackMove(Moves.AQUA_JET, PokemonType.WATER, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 4), + new AttackMove(Moves.ATTACK_ORDER, PokemonType.BUG, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 4) .attr(HighCritAttr) .makesContact(false), - new SelfStatusMove(Moves.DEFEND_ORDER, Type.BUG, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.DEFEND_ORDER, PokemonType.BUG, -1, 10, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), - new SelfStatusMove(Moves.HEAL_ORDER, Type.BUG, -1, 5, -1, 0, 4) + new SelfStatusMove(Moves.HEAL_ORDER, PokemonType.BUG, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HEAD_SMASH, Type.ROCK, MoveCategory.PHYSICAL, 150, 80, 5, -1, 0, 4) + new AttackMove(Moves.HEAD_SMASH, PokemonType.ROCK, MoveCategory.PHYSICAL, 150, 80, 5, -1, 0, 4) .attr(RecoilAttr, false, 0.5) .recklessMove(), - new AttackMove(Moves.DOUBLE_HIT, Type.NORMAL, MoveCategory.PHYSICAL, 35, 90, 10, -1, 0, 4) + new AttackMove(Moves.DOUBLE_HIT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 35, 90, 10, -1, 0, 4) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.ROAR_OF_TIME, Type.DRAGON, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.ROAR_OF_TIME, PokemonType.DRAGON, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr), - new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) + new AttackMove(Moves.SPACIAL_REND, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) .attr(HighCritAttr), - new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.LUNAR_DANCE, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore") .danceMove() .triageMove() .condition(failIfLastInPartyCondition), - new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.CRUSH_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120), - new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) + new AttackMove(Moves.MAGMA_STORM, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) .attr(TrapAttr, BattlerTagType.MAGMA_STORM), - new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 + new StatusMove(Moves.DARK_VOID, PokemonType.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 .attr(StatusEffectAttr, StatusEffect.SLEEP) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) + new AttackMove(Moves.SEED_FLARE, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) + new AttackMove(Moves.OMINOUS_WIND, PokemonType.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .windMove(), - new ChargingAttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) + new ChargingAttackMove(Moves.SHADOW_FORCE, PokemonType.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect(), - new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) + new SelfStatusMove(Moves.HONE_CLAWS, PokemonType.DARK, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.ACC ], 1, true), - new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5) + new StatusMove(Moves.WIDE_GUARD, PokemonType.ROCK, -1, 10, -1, 3, 5) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true) .condition(failIfLastCondition), - new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.GUARD_SPLIT, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(AverageStatsAttr, [ Stat.DEF, Stat.SPDEF ], "moveTriggers:sharedGuard"), - new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.POWER_SPLIT, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(AverageStatsAttr, [ Stat.ATK, Stat.SPATK ], "moveTriggers:sharedPower"), - new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.WONDER_ROOM, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) .unimplemented(), - new AttackMove(Moves.PSYSHOCK, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.PSYSHOCK, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(DefDefAttr), - new AttackMove(Moves.VENOSHOCK, Type.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) + new AttackMove(Moves.VENOSHOCK, PokemonType.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1), - new SelfStatusMove(Moves.AUTOTOMIZE, Type.STEEL, -1, 15, -1, 0, 5) + new SelfStatusMove(Moves.AUTOTOMIZE, PokemonType.STEEL, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true) .attr(AddBattlerTagAttr, BattlerTagType.AUTOTOMIZED, true), - new SelfStatusMove(Moves.RAGE_POWDER, Type.BUG, -1, 20, -1, 2, 5) + new SelfStatusMove(Moves.RAGE_POWDER, PokemonType.BUG, -1, 20, -1, 2, 5) .powderMove() .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), - new StatusMove(Moves.TELEKINESIS, Type.PSYCHIC, -1, 15, -1, 0, 5) + new StatusMove(Moves.TELEKINESIS, PokemonType.PSYCHIC, -1, 15, -1, 0, 5) .condition(failOnGravityCondition) .condition((_user, target, _move) => ![ Species.DIGLETT, Species.DUGTRIO, Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, Species.SANDYGAST, Species.PALOSSAND, Species.WIGLETT, Species.WUGTRIO ].includes(target.species.speciesId)) .condition((_user, target, _move) => !(target.species.speciesId === Species.GENGAR && target.getFormKey() === "mega")) @@ -10010,125 +9641,125 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.TELEKINESIS, false, true, 3) .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3) .reflectable(), - new StatusMove(Moves.MAGIC_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.MAGIC_ROOM, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) .unimplemented(), - new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) + new AttackMove(Moves.SMACK_DOWN, PokemonType.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .attr(HitsTagAttr, BattlerTagType.FLYING) .makesContact(false), - new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) + new AttackMove(Moves.STORM_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(CritOnlyAttr), - new AttackMove(Moves.FLAME_BURST, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 15, -1, 0, 5) + new AttackMove(Moves.FLAME_BURST, PokemonType.FIRE, MoveCategory.SPECIAL, 70, 100, 15, -1, 0, 5) .attr(FlameBurstAttr), - new AttackMove(Moves.SLUDGE_WAVE, Type.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) + new AttackMove(Moves.SLUDGE_WAVE, PokemonType.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) .attr(StatusEffectAttr, StatusEffect.POISON) .target(MoveTarget.ALL_NEAR_OTHERS), - new SelfStatusMove(Moves.QUIVER_DANCE, Type.BUG, -1, 20, -1, 0, 5) + new SelfStatusMove(Moves.QUIVER_DANCE, PokemonType.BUG, -1, 20, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.HEAVY_SLAM, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED), - new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) + new AttackMove(Moves.SYNCHRONOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) .target(MoveTarget.ALL_NEAR_OTHERS) .condition(unknownTypeCondition) .attr(hitsSameTypeAttr), - new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.ELECTRO_BALL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) .attr(ElectroBallPowerAttr) .ballBombMove(), - new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5) - .attr(ChangeTypeAttr, Type.WATER) + new StatusMove(Moves.SOAK, PokemonType.WATER, 100, 20, -1, 0, 5) + .attr(ChangeTypeAttr, PokemonType.WATER) .reflectable(), - new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) + new AttackMove(Moves.FLAME_CHARGE, PokemonType.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5) + new SelfStatusMove(Moves.COIL, PokemonType.POISON, -1, 20, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.ACC ], 1, true), - new AttackMove(Moves.LOW_SWEEP, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 20, 100, 0, 5) + new AttackMove(Moves.LOW_SWEEP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.ACID_SPRAY, Type.POISON, MoveCategory.SPECIAL, 40, 100, 20, 100, 0, 5) + new AttackMove(Moves.ACID_SPRAY, PokemonType.POISON, MoveCategory.SPECIAL, 40, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) .ballBombMove(), - new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) + new AttackMove(Moves.FOUL_PLAY, PokemonType.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) .attr(TargetAtkUserAtkAttr), - new StatusMove(Moves.SIMPLE_BEAM, Type.NORMAL, 100, 15, -1, 0, 5) + new StatusMove(Moves.SIMPLE_BEAM, PokemonType.NORMAL, 100, 15, -1, 0, 5) .attr(AbilityChangeAttr, Abilities.SIMPLE) .reflectable(), - new StatusMove(Moves.ENTRAINMENT, Type.NORMAL, 100, 15, -1, 0, 5) + new StatusMove(Moves.ENTRAINMENT, PokemonType.NORMAL, 100, 15, -1, 0, 5) .attr(AbilityGiveAttr) .reflectable(), - new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.AFTER_YOU, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() .target(MoveTarget.NEAR_OTHER) .condition(failIfSingleBattle) .condition((user, target, move) => !target.turnData.acted) .attr(AfterYouAttr), - new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) + new AttackMove(Moves.ROUND, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .attr(CueNextRoundAttr) .attr(RoundPowerAttr) .soundBased(), - new AttackMove(Moves.ECHOED_VOICE, Type.NORMAL, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 5) + new AttackMove(Moves.ECHOED_VOICE, PokemonType.NORMAL, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 5) .attr(ConsecutiveUseMultiBasePowerAttr, 5, false) .soundBased(), - new AttackMove(Moves.CHIP_AWAY, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5) + new AttackMove(Moves.CHIP_AWAY, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5) .attr(IgnoreOpponentStatStagesAttr), - new AttackMove(Moves.CLEAR_SMOG, Type.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5) + new AttackMove(Moves.CLEAR_SMOG, PokemonType.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5) .attr(ResetStatsAttr, false), - new AttackMove(Moves.STORED_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5) + new AttackMove(Moves.STORED_POWER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5) .attr(PositiveStatStagePowerAttr), - new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5) + new StatusMove(Moves.QUICK_GUARD, PokemonType.FIGHTING, -1, 15, -1, 3, 5) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true) .condition(failIfLastCondition), - new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5) + new SelfStatusMove(Moves.ALLY_SWITCH, PokemonType.PSYCHIC, -1, 15, -1, 2, 5) .ignoresProtect() .unimplemented(), - new AttackMove(Moves.SCALD, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 5) + new AttackMove(Moves.SCALD, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 5) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new SelfStatusMove(Moves.SHELL_SMASH, Type.NORMAL, -1, 15, -1, 0, 5) + new SelfStatusMove(Moves.SHELL_SMASH, PokemonType.NORMAL, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, true) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.HEAL_PULSE, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(HealAttr, 0.5, false, false) .pulseMove() .triageMove() .reflectable(), - new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) + new AttackMove(Moves.HEX, PokemonType.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr( MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE) ? 2 : 1), - new ChargingAttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) + new ChargingAttackMove(Moves.SKY_DROP, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .chargeText(i18next.t("moveTriggers:tookTargetIntoSky", { pokemonName: "{USER}", targetName: "{TARGET}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .condition(failOnGravityCondition) .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE)) .partial(), // Should immobilize the target, Flying types should take no damage. cf https://bulbapedia.bulbagarden.net/wiki/Sky_Drop_(move) and https://www.smogon.com/dex/sv/moves/sky-drop/ - new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) + new SelfStatusMove(Moves.SHIFT_GEAR, PokemonType.STEEL, -1, 10, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), - new AttackMove(Moves.CIRCLE_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) + new AttackMove(Moves.CIRCLE_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .hidesTarget(), - new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) + new AttackMove(Moves.INCINERATE, PokemonType.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(RemoveHeldItemAttr, true), - new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) + new StatusMove(Moves.QUASH, PokemonType.DARK, 100, 15, -1, 0, 5) .condition(failIfSingleBattle) .condition((user, target, move) => !target.turnData.acted) .attr(ForceLastAttr), - new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) + new AttackMove(Moves.ACROBATICS, PokemonType.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.isTransferable).reduce((v, m) => v + m.stackCount, 0))), - new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.REFLECT_TYPE, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresSubstitute() .attr(CopyTypeAttr), - new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) + new AttackMove(Moves.RETALIATE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => { const turn = globalScene.currentBattle.turn; const lastPlayerFaint = globalScene.currentBattle.playerFaintsHistory[globalScene.currentBattle.playerFaintsHistory.length - 1]; @@ -10138,16 +9769,16 @@ export function initMoves() { (lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer()) ) ? 2 : 1; }), - new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) + new AttackMove(Moves.FINAL_GAMBIT, PokemonType.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) .attr(UserHpDamageAttr) .attr(SacrificialAttrOnHit), - new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.BESTOW, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() .unimplemented(), - new AttackMove(Moves.INFERNO, Type.FIRE, MoveCategory.SPECIAL, 100, 50, 5, 100, 0, 5) + new AttackMove(Moves.INFERNO, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 50, 5, 100, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.WATER_PLEDGE, Type.WATER, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.WATER_PLEDGE, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -10155,7 +9786,7 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.FIRE_PLEDGE, true) .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.GRASS_PLEDGE) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.FIRE_PLEDGE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.FIRE_PLEDGE, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -10163,7 +9794,7 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.GRASS_PLEDGE) .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.WATER_PLEDGE, true) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.GRASS_PLEDGE, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -10171,300 +9802,300 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.WATER_PLEDGE) .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.FIRE_PLEDGE) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) + new AttackMove(Moves.VOLT_SWITCH, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.STRUGGLE_BUG, Type.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5) + new AttackMove(Moves.STRUGGLE_BUG, PokemonType.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BULLDOZE, Type.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) + new AttackMove(Moves.BULLDOZE, PokemonType.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) + new AttackMove(Moves.FROST_BREATH, PokemonType.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) .attr(CritOnlyAttr), - new AttackMove(Moves.DRAGON_TAIL, Type.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) + new AttackMove(Moves.DRAGON_TAIL, PokemonType.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .hidesTarget(), - new SelfStatusMove(Moves.WORK_UP, Type.NORMAL, -1, 30, -1, 0, 5) + new SelfStatusMove(Moves.WORK_UP, PokemonType.NORMAL, -1, 30, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, true), - new AttackMove(Moves.ELECTROWEB, Type.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) + new AttackMove(Moves.ELECTROWEB, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.WILD_CHARGE, Type.ELECTRIC, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) + new AttackMove(Moves.WILD_CHARGE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.DRILL_RUN, Type.GROUND, MoveCategory.PHYSICAL, 80, 95, 10, -1, 0, 5) + new AttackMove(Moves.DRILL_RUN, PokemonType.GROUND, MoveCategory.PHYSICAL, 80, 95, 10, -1, 0, 5) .attr(HighCritAttr), - new AttackMove(Moves.DUAL_CHOP, Type.DRAGON, MoveCategory.PHYSICAL, 40, 90, 15, -1, 0, 5) + new AttackMove(Moves.DUAL_CHOP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 40, 90, 15, -1, 0, 5) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.HEART_STAMP, Type.PSYCHIC, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 5) + new AttackMove(Moves.HEART_STAMP, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 5) .attr(FlinchAttr), - new AttackMove(Moves.HORN_LEECH, Type.GRASS, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 5) + new AttackMove(Moves.HORN_LEECH, PokemonType.GRASS, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 5) .attr(HitHealAttr) .triageMove(), - new AttackMove(Moves.SACRED_SWORD, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) + new AttackMove(Moves.SACRED_SWORD, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) .attr(IgnoreOpponentStatStagesAttr) .slicingMove(), - new AttackMove(Moves.RAZOR_SHELL, Type.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5) + new AttackMove(Moves.RAZOR_SHELL, PokemonType.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .slicingMove(), - new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.HEAT_CRASH, PokemonType.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED), - new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) + new AttackMove(Moves.LEAF_TORNADO, PokemonType.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) + new AttackMove(Moves.STEAMROLLER, PokemonType.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new SelfStatusMove(Moves.COTTON_GUARD, Type.GRASS, -1, 10, -1, 0, 5) + new SelfStatusMove(Moves.COTTON_GUARD, PokemonType.GRASS, -1, 10, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF ], 3, true), - new AttackMove(Moves.NIGHT_DAZE, Type.DARK, MoveCategory.SPECIAL, 85, 95, 10, 40, 0, 5) + new AttackMove(Moves.NIGHT_DAZE, PokemonType.DARK, MoveCategory.SPECIAL, 85, 95, 10, 40, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.PSYSTRIKE, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 5) + new AttackMove(Moves.PSYSTRIKE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 5) .attr(DefDefAttr), - new AttackMove(Moves.TAIL_SLAP, Type.NORMAL, MoveCategory.PHYSICAL, 25, 85, 10, -1, 0, 5) + new AttackMove(Moves.TAIL_SLAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 25, 85, 10, -1, 0, 5) .attr(MultiHitAttr), - new AttackMove(Moves.HURRICANE, Type.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5) + new AttackMove(Moves.HURRICANE, PokemonType.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5) .attr(ThunderAccuracyAttr) .attr(ConfuseAttr) .attr(HitsTagAttr, BattlerTagType.FLYING) .windMove(), - new AttackMove(Moves.HEAD_CHARGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5) + new AttackMove(Moves.HEAD_CHARGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.GEAR_GRIND, Type.STEEL, MoveCategory.PHYSICAL, 50, 85, 15, -1, 0, 5) + new AttackMove(Moves.GEAR_GRIND, PokemonType.STEEL, MoveCategory.PHYSICAL, 50, 85, 15, -1, 0, 5) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.SEARING_SHOT, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, 30, 0, 5) + new AttackMove(Moves.SEARING_SHOT, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 100, 5, 30, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN) .ballBombMove() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.TECHNO_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 5) + new AttackMove(Moves.TECHNO_BLAST, PokemonType.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 5) .attr(TechnoBlastTypeAttr), - new AttackMove(Moves.RELIC_SONG, Type.NORMAL, MoveCategory.SPECIAL, 75, 100, 10, 10, 0, 5) + new AttackMove(Moves.RELIC_SONG, PokemonType.NORMAL, MoveCategory.SPECIAL, 75, 100, 10, 10, 0, 5) .attr(StatusEffectAttr, StatusEffect.SLEEP) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SECRET_SWORD, Type.FIGHTING, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 5) + new AttackMove(Moves.SECRET_SWORD, PokemonType.FIGHTING, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 5) .attr(DefDefAttr) .slicingMove(), - new AttackMove(Moves.GLACIATE, Type.ICE, MoveCategory.SPECIAL, 65, 95, 10, 100, 0, 5) + new AttackMove(Moves.GLACIATE, PokemonType.ICE, MoveCategory.SPECIAL, 65, 95, 10, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BOLT_STRIKE, Type.ELECTRIC, MoveCategory.PHYSICAL, 130, 85, 5, 20, 0, 5) + new AttackMove(Moves.BOLT_STRIKE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 130, 85, 5, 20, 0, 5) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.BLUE_FLARE, Type.FIRE, MoveCategory.SPECIAL, 130, 85, 5, 20, 0, 5) + new AttackMove(Moves.BLUE_FLARE, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 85, 5, 20, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.FIERY_DANCE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5) + new AttackMove(Moves.FIERY_DANCE, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .danceMove(), - new ChargingAttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) + new ChargingAttackMove(Moves.FREEZE_SHOCK, PokemonType.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingLight", { pokemonName: "{USER}" })) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), - new ChargingAttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) + new ChargingAttackMove(Moves.ICE_BURN, PokemonType.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingAir", { pokemonName: "{USER}" })) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) + new AttackMove(Moves.SNARL, PokemonType.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.ICICLE_CRASH, Type.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5) + new AttackMove(Moves.ICICLE_CRASH, PokemonType.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5) .attr(FlinchAttr) .makesContact(false), - new AttackMove(Moves.V_CREATE, Type.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5) + new AttackMove(Moves.V_CREATE, PokemonType.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF, Stat.SPD ], -1, true), - new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) + new AttackMove(Moves.FUSION_FLARE, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(LastMoveDoublePowerAttr, Moves.FUSION_BOLT), - new AttackMove(Moves.FUSION_BOLT, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) + new AttackMove(Moves.FUSION_BOLT, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) .attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE) .makesContact(false), - new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) + new AttackMove(Moves.FLYING_PRESS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) .attr(AlwaysHitMinimizeAttr) .attr(FlyingTypeMultiplierAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .condition(failOnGravityCondition), - new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) + new StatusMove(Moves.MAT_BLOCK, PokemonType.FIGHTING, -1, 10, -1, 0, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true) .condition(new FirstMoveCondition()) .condition(failIfLastCondition), - new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) + new AttackMove(Moves.BELCH, PokemonType.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) .condition((user, target, move) => user.battleData.berriesEaten.length > 0), - new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6) + new StatusMove(Moves.ROTOTILLER, PokemonType.GROUND, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) .condition((user, target, move) => { // If any fielded pokémon is grass-type and grounded. - return [ ...globalScene.getEnemyParty(), ...globalScene.getPlayerParty() ].some((poke) => poke.isOfType(Type.GRASS) && poke.isGrounded()); + return [ ...globalScene.getEnemyParty(), ...globalScene.getPlayerParty() ].some((poke) => poke.isOfType(PokemonType.GRASS) && poke.isGrounded()); }) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded() }), - new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(PokemonType.GRASS) && target.isGrounded() }), + new StatusMove(Moves.STICKY_WEB, PokemonType.BUG, -1, 20, -1, 0, 6) .attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB) .target(MoveTarget.ENEMY_SIDE) .reflectable(), - new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) + new AttackMove(Moves.FELL_STINGER, PokemonType.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ), - new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new ChargingAttackMove(Moves.PHANTOM_FORCE, PokemonType.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect(), - new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GHOST) + new StatusMove(Moves.TRICK_OR_TREAT, PokemonType.GHOST, 100, 20, -1, 0, 6) + .attr(AddTypeAttr, PokemonType.GHOST) .reflectable(), - new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) + new StatusMove(Moves.NOBLE_ROAR, PokemonType.NORMAL, 100, 30, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) .soundBased() .reflectable(), - new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6) + new StatusMove(Moves.ION_DELUGE, PokemonType.ELECTRIC, -1, 25, -1, 1, 6) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.PARABOLIC_CHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 65, 100, 20, -1, 0, 6) + new AttackMove(Moves.PARABOLIC_CHARGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 65, 100, 20, -1, 0, 6) .attr(HitHealAttr) .target(MoveTarget.ALL_NEAR_OTHERS) .triageMove(), - new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GRASS) + new StatusMove(Moves.FORESTS_CURSE, PokemonType.GRASS, 100, 20, -1, 0, 6) + .attr(AddTypeAttr, PokemonType.GRASS) .reflectable(), - new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) + new AttackMove(Moves.PETAL_BLIZZARD, PokemonType.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) .windMove() .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FREEZE_DRY, Type.ICE, MoveCategory.SPECIAL, 70, 100, 20, 10, 0, 6) + new AttackMove(Moves.FREEZE_DRY, PokemonType.ICE, MoveCategory.SPECIAL, 70, 100, 20, 10, 0, 6) .attr(StatusEffectAttr, StatusEffect.FREEZE) .attr(FreezeDryAttr), - new AttackMove(Moves.DISARMING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6) + new AttackMove(Moves.DISARMING_VOICE, PokemonType.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) + new StatusMove(Moves.PARTING_SHOT, PokemonType.DARK, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY }) .attr(ForceSwitchOutAttr, true) .soundBased() .reflectable(), - new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) + new StatusMove(Moves.TOPSY_TURVY, PokemonType.DARK, -1, 20, -1, 0, 6) .attr(InvertStatsAttr) .reflectable(), - new AttackMove(Moves.DRAINING_KISS, Type.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) + new AttackMove(Moves.DRAINING_KISS, PokemonType.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .makesContact() .triageMove(), - new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6) + new StatusMove(Moves.CRAFTY_SHIELD, PokemonType.FAIRY, -1, 10, -1, 3, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true) .condition(failIfLastCondition), - new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.FLOWER_SHIELD, PokemonType.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, { condition: (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag) }), - new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, { condition: (user, target, move) => target.getTypes().includes(PokemonType.GRASS) && !target.getTag(SemiInvulnerableTag) }), + new StatusMove(Moves.GRASSY_TERRAIN, PokemonType.GRASS, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.GRASSY) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.MISTY_TERRAIN, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.MISTY_TERRAIN, PokemonType.FAIRY, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.MISTY) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.ELECTRIFY, Type.ELECTRIC, -1, 20, -1, 0, 6) + new StatusMove(Moves.ELECTRIFY, PokemonType.ELECTRIC, -1, 20, -1, 0, 6) .attr(AddBattlerTagAttr, BattlerTagType.ELECTRIFIED, false, true), - new AttackMove(Moves.PLAY_ROUGH, Type.FAIRY, MoveCategory.PHYSICAL, 90, 90, 10, 10, 0, 6) + new AttackMove(Moves.PLAY_ROUGH, PokemonType.FAIRY, MoveCategory.PHYSICAL, 90, 90, 10, 10, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.FAIRY_WIND, Type.FAIRY, MoveCategory.SPECIAL, 40, 100, 30, -1, 0, 6) + new AttackMove(Moves.FAIRY_WIND, PokemonType.FAIRY, MoveCategory.SPECIAL, 40, 100, 30, -1, 0, 6) .windMove(), - new AttackMove(Moves.MOONBLAST, Type.FAIRY, MoveCategory.SPECIAL, 95, 100, 15, 30, 0, 6) + new AttackMove(Moves.MOONBLAST, PokemonType.FAIRY, MoveCategory.SPECIAL, 95, 100, 15, 30, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.BOOMBURST, Type.NORMAL, MoveCategory.SPECIAL, 140, 100, 10, -1, 0, 6) + new AttackMove(Moves.BOOMBURST, PokemonType.NORMAL, MoveCategory.SPECIAL, 140, 100, 10, -1, 0, 6) .soundBased() .target(MoveTarget.ALL_NEAR_OTHERS), - new StatusMove(Moves.FAIRY_LOCK, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.FAIRY_LOCK, PokemonType.FAIRY, -1, 10, -1, 0, 6) .ignoresSubstitute() .ignoresProtect() .target(MoveTarget.BOTH_SIDES) .attr(AddArenaTagAttr, ArenaTagType.FAIRY_LOCK, 2, true), - new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6) + new SelfStatusMove(Moves.KINGS_SHIELD, PokemonType.STEEL, -1, 10, -1, 4, 6) .attr(ProtectAttr, BattlerTagType.KINGS_SHIELD) .condition(failIfLastCondition), - new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6) + new StatusMove(Moves.PLAY_NICE, PokemonType.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .ignoresSubstitute() .reflectable(), - new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6) + new StatusMove(Moves.CONFIDE, PokemonType.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .soundBased() .reflectable(), - new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) + new AttackMove(Moves.DIAMOND_STORM, PokemonType.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true }) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.STEAM_ERUPTION, Type.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6) + new AttackMove(Moves.STEAM_ERUPTION, PokemonType.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.HYPERSPACE_HOLE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, -1, 5, -1, 0, 6) + new AttackMove(Moves.HYPERSPACE_HOLE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, -1, 5, -1, 0, 6) .ignoresProtect() .ignoresSubstitute(), - new AttackMove(Moves.WATER_SHURIKEN, Type.WATER, MoveCategory.SPECIAL, 15, 100, 20, -1, 1, 6) + new AttackMove(Moves.WATER_SHURIKEN, PokemonType.WATER, MoveCategory.SPECIAL, 15, 100, 20, -1, 1, 6) .attr(MultiHitAttr) .attr(WaterShurikenPowerAttr) .attr(WaterShurikenMultiHitTypeAttr), - new AttackMove(Moves.MYSTICAL_FIRE, Type.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6) + new AttackMove(Moves.MYSTICAL_FIRE, PokemonType.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new SelfStatusMove(Moves.SPIKY_SHIELD, Type.GRASS, -1, 10, -1, 4, 6) + new SelfStatusMove(Moves.SPIKY_SHIELD, PokemonType.GRASS, -1, 10, -1, 4, 6) .attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD) .condition(failIfLastCondition), - new StatusMove(Moves.AROMATIC_MIST, Type.FAIRY, -1, 20, -1, 0, 6) + new StatusMove(Moves.AROMATIC_MIST, PokemonType.FAIRY, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1) .ignoresSubstitute() .condition(failIfSingleBattle) .target(MoveTarget.NEAR_ALLY), - new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) + new StatusMove(Moves.EERIE_IMPULSE, PokemonType.ELECTRIC, 100, 15, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) .reflectable(), - new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) + new StatusMove(Moves.VENOM_DRENCH, PokemonType.POISON, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC }) .target(MoveTarget.ALL_NEAR_ENEMIES) .reflectable(), - new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) + new StatusMove(Moves.POWDER, PokemonType.BUG, 100, 20, -1, 1, 6) .attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true) .ignoresSubstitute() .powderMove() .reflectable(), - new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) + new ChargingSelfStatusMove(Moves.GEOMANCY, PokemonType.FAIRY, -1, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), - new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) + new StatusMove(Moves.MAGNETIC_FLUX, PokemonType.ELECTRIC, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS ].find(a => p.hasAbility(a, false)))), - new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation + new StatusMove(Moves.HAPPY_HOUR, PokemonType.NORMAL, -1, 30, -1, 0, 6) // No animation .attr(AddArenaTagAttr, ArenaTagType.HAPPY_HOUR, null, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ELECTRIC_TERRAIN, Type.ELECTRIC, -1, 10, -1, 0, 6) + new StatusMove(Moves.ELECTRIC_TERRAIN, PokemonType.ELECTRIC, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.ELECTRIC) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.DAZZLING_GLEAM, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) + new AttackMove(Moves.DAZZLING_GLEAM, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6) + new SelfStatusMove(Moves.CELEBRATE, PokemonType.NORMAL, -1, 40, -1, 0, 6) .attr(CelebrateAttr), - new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6) + new StatusMove(Moves.HOLD_HANDS, PokemonType.NORMAL, -1, 40, -1, 0, 6) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), - new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6) + new StatusMove(Moves.BABY_DOLL_EYES, PokemonType.FAIRY, 100, 30, -1, 1, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .reflectable(), - new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) + new AttackMove(Moves.NUZZLE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) + new AttackMove(Moves.HOLD_BACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) .attr(SurviveDamageAttr), - new AttackMove(Moves.INFESTATION, Type.BUG, MoveCategory.SPECIAL, 20, 100, 20, -1, 0, 6) + new AttackMove(Moves.INFESTATION, PokemonType.BUG, MoveCategory.SPECIAL, 20, 100, 20, -1, 0, 6) .makesContact() .attr(TrapAttr, BattlerTagType.INFESTATION), - new AttackMove(Moves.POWER_UP_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6) + new AttackMove(Moves.POWER_UP_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .punchingMove(), - new AttackMove(Moves.OBLIVION_WING, Type.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) + new AttackMove(Moves.OBLIVION_WING, PokemonType.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .triageMove(), - new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.THOUSAND_ARROWS, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING) @@ -10473,372 +10104,372 @@ export function initMoves() { .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.THOUSAND_WAVES, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LANDS_WRATH, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.LANDS_WRATH, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LIGHT_OF_RUIN, Type.FAIRY, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 6) + new AttackMove(Moves.LIGHT_OF_RUIN, PokemonType.FAIRY, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 6) .attr(RecoilAttr, false, 0.5) .recklessMove(), - new AttackMove(Moves.ORIGIN_PULSE, Type.WATER, MoveCategory.SPECIAL, 110, 85, 10, -1, 0, 6) + new AttackMove(Moves.ORIGIN_PULSE, PokemonType.WATER, MoveCategory.SPECIAL, 110, 85, 10, -1, 0, 6) .pulseMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PRECIPICE_BLADES, Type.GROUND, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 6) + new AttackMove(Moves.PRECIPICE_BLADES, PokemonType.GROUND, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 6) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_ASCENT, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6) + new AttackMove(Moves.DRAGON_ASCENT, PokemonType.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.HYPERSPACE_FURY, Type.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6) + new AttackMove(Moves.HYPERSPACE_FURY, PokemonType.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true) .ignoresSubstitute() .makesContact(false) .ignoresProtect(), /* Unused */ - new AttackMove(Moves.BREAKNECK_BLITZ__PHYSICAL, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BREAKNECK_BLITZ__PHYSICAL, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.BREAKNECK_BLITZ__SPECIAL, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BREAKNECK_BLITZ__SPECIAL, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.ALL_OUT_PUMMELING__PHYSICAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.ALL_OUT_PUMMELING__PHYSICAL, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.ALL_OUT_PUMMELING__SPECIAL, Type.FIGHTING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.ALL_OUT_PUMMELING__SPECIAL, PokemonType.FIGHTING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__PHYSICAL, Type.FLYING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__PHYSICAL, PokemonType.FLYING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__SPECIAL, Type.FLYING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__SPECIAL, PokemonType.FLYING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.ACID_DOWNPOUR__PHYSICAL, Type.POISON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.ACID_DOWNPOUR__PHYSICAL, PokemonType.POISON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.ACID_DOWNPOUR__SPECIAL, Type.POISON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.ACID_DOWNPOUR__SPECIAL, PokemonType.POISON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.TECTONIC_RAGE__PHYSICAL, Type.GROUND, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.TECTONIC_RAGE__PHYSICAL, PokemonType.GROUND, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.TECTONIC_RAGE__SPECIAL, Type.GROUND, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.TECTONIC_RAGE__SPECIAL, PokemonType.GROUND, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.CONTINENTAL_CRUSH__PHYSICAL, Type.ROCK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.CONTINENTAL_CRUSH__PHYSICAL, PokemonType.ROCK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.CONTINENTAL_CRUSH__SPECIAL, Type.ROCK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.CONTINENTAL_CRUSH__SPECIAL, PokemonType.ROCK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SAVAGE_SPIN_OUT__PHYSICAL, Type.BUG, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SAVAGE_SPIN_OUT__PHYSICAL, PokemonType.BUG, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SAVAGE_SPIN_OUT__SPECIAL, Type.BUG, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SAVAGE_SPIN_OUT__SPECIAL, PokemonType.BUG, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__PHYSICAL, Type.GHOST, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__PHYSICAL, PokemonType.GHOST, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__SPECIAL, Type.GHOST, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__SPECIAL, PokemonType.GHOST, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.CORKSCREW_CRASH__PHYSICAL, Type.STEEL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.CORKSCREW_CRASH__PHYSICAL, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.CORKSCREW_CRASH__SPECIAL, Type.STEEL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.CORKSCREW_CRASH__SPECIAL, PokemonType.STEEL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.INFERNO_OVERDRIVE__PHYSICAL, Type.FIRE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.INFERNO_OVERDRIVE__PHYSICAL, PokemonType.FIRE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.INFERNO_OVERDRIVE__SPECIAL, Type.FIRE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.INFERNO_OVERDRIVE__SPECIAL, PokemonType.FIRE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.HYDRO_VORTEX__PHYSICAL, Type.WATER, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.HYDRO_VORTEX__PHYSICAL, PokemonType.WATER, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.HYDRO_VORTEX__SPECIAL, Type.WATER, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.HYDRO_VORTEX__SPECIAL, PokemonType.WATER, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.BLOOM_DOOM__PHYSICAL, Type.GRASS, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BLOOM_DOOM__PHYSICAL, PokemonType.GRASS, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.BLOOM_DOOM__SPECIAL, Type.GRASS, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BLOOM_DOOM__SPECIAL, PokemonType.GRASS, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.GIGAVOLT_HAVOC__PHYSICAL, Type.ELECTRIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.GIGAVOLT_HAVOC__PHYSICAL, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.GIGAVOLT_HAVOC__SPECIAL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.GIGAVOLT_HAVOC__SPECIAL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SHATTERED_PSYCHE__PHYSICAL, Type.PSYCHIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SHATTERED_PSYCHE__PHYSICAL, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SHATTERED_PSYCHE__SPECIAL, Type.PSYCHIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SHATTERED_PSYCHE__SPECIAL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SUBZERO_SLAMMER__PHYSICAL, Type.ICE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SUBZERO_SLAMMER__PHYSICAL, PokemonType.ICE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SUBZERO_SLAMMER__SPECIAL, Type.ICE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.SUBZERO_SLAMMER__SPECIAL, PokemonType.ICE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.DEVASTATING_DRAKE__PHYSICAL, Type.DRAGON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.DEVASTATING_DRAKE__PHYSICAL, PokemonType.DRAGON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.DEVASTATING_DRAKE__SPECIAL, Type.DRAGON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.DEVASTATING_DRAKE__SPECIAL, PokemonType.DRAGON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.BLACK_HOLE_ECLIPSE__PHYSICAL, Type.DARK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BLACK_HOLE_ECLIPSE__PHYSICAL, PokemonType.DARK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.BLACK_HOLE_ECLIPSE__SPECIAL, Type.DARK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.BLACK_HOLE_ECLIPSE__SPECIAL, PokemonType.DARK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.TWINKLE_TACKLE__PHYSICAL, Type.FAIRY, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.TWINKLE_TACKLE__PHYSICAL, PokemonType.FAIRY, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.TWINKLE_TACKLE__SPECIAL, Type.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.TWINKLE_TACKLE__SPECIAL, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.CATASTROPIKA, Type.ELECTRIC, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) + new AttackMove(Moves.CATASTROPIKA, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) .unimplemented(), /* End Unused */ - new SelfStatusMove(Moves.SHORE_UP, Type.GROUND, -1, 5, -1, 0, 7) + new SelfStatusMove(Moves.SHORE_UP, PokemonType.GROUND, -1, 5, -1, 0, 7) .attr(SandHealAttr) .triageMove(), - new AttackMove(Moves.FIRST_IMPRESSION, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7) + new AttackMove(Moves.FIRST_IMPRESSION, PokemonType.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7) .condition(new FirstMoveCondition()), - new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7) + new SelfStatusMove(Moves.BANEFUL_BUNKER, PokemonType.POISON, -1, 10, -1, 4, 7) .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER) .condition(failIfLastCondition), - new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) + new AttackMove(Moves.SPIRIT_SHACKLE, PokemonType.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false), - new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) + new AttackMove(Moves.DARKEST_LARIAT, PokemonType.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .attr(IgnoreOpponentStatStagesAttr), - new AttackMove(Moves.SPARKLING_ARIA, Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7) + new AttackMove(Moves.SPARKLING_ARIA, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7) .attr(HealStatusEffectAttr, false, StatusEffect.BURN) .soundBased() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.ICE_HAMMER, Type.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7) + new AttackMove(Moves.ICE_HAMMER, PokemonType.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true) .punchingMove(), - new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) + new StatusMove(Moves.FLORAL_HEALING, PokemonType.FAIRY, -1, 10, -1, 0, 7) .attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => globalScene.arena.terrain?.terrainType === TerrainType.GRASSY) .triageMove() .reflectable(), - new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), - new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7) + new AttackMove(Moves.HIGH_HORSEPOWER, PokemonType.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), + new StatusMove(Moves.STRENGTH_SAP, PokemonType.GRASS, 100, 10, -1, 0, 7) .attr(HitHealAttr, null, Stat.ATK) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .condition((user, target, move) => target.getStatStage(Stat.ATK) > -6) .triageMove() .reflectable(), - new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) + new ChargingAttackMove(Moves.SOLAR_BLADE, PokemonType.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) .attr(AntiSunlightPowerDecreaseAttr) .slicingMove(), - new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) + new AttackMove(Moves.LEAFAGE, PokemonType.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) .makesContact(false), - new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7) + new StatusMove(Moves.SPOTLIGHT, PokemonType.NORMAL, -1, 15, -1, 3, 7) .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false) .condition(failIfSingleBattle) .reflectable(), - new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7) + new StatusMove(Moves.TOXIC_THREAD, PokemonType.POISON, 100, 20, -1, 0, 7) .attr(StatusEffectAttr, StatusEffect.POISON) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .reflectable(), - new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) + new SelfStatusMove(Moves.LASER_FOCUS, PokemonType.NORMAL, -1, 30, -1, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false), - new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7) + new StatusMove(Moves.GEAR_UP, PokemonType.STEEL, -1, 20, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS ].find(a => p.hasAbility(a, false)))), - new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.THROAT_CHOP, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.THROAT_CHOPPED), - new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) + new AttackMove(Moves.POLLEN_PUFF, PokemonType.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .attr(StatusCategoryOnAllyAttr) .attr(HealOnAllyAttr, 0.5, true, false) .ballBombMove(), - new AttackMove(Moves.ANCHOR_SHOT, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) + new AttackMove(Moves.ANCHOR_SHOT, PokemonType.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true), - new StatusMove(Moves.PSYCHIC_TERRAIN, Type.PSYCHIC, -1, 10, -1, 0, 7) + new StatusMove(Moves.PSYCHIC_TERRAIN, PokemonType.PSYCHIC, -1, 10, -1, 0, 7) .attr(TerrainChangeAttr, TerrainType.PSYCHIC) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.LUNGE, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.LUNGE, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.FIRE_LASH, Type.FIRE, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.FIRE_LASH, PokemonType.FIRE, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.POWER_TRIP, Type.DARK, MoveCategory.PHYSICAL, 20, 100, 10, -1, 0, 7) + new AttackMove(Moves.POWER_TRIP, PokemonType.DARK, MoveCategory.PHYSICAL, 20, 100, 10, -1, 0, 7) .attr(PositiveStatStagePowerAttr), - new AttackMove(Moves.BURN_UP, Type.FIRE, MoveCategory.SPECIAL, 130, 100, 5, -1, 0, 7) + new AttackMove(Moves.BURN_UP, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 100, 5, -1, 0, 7) .condition((user) => { const userTypes = user.getTypes(true); - return userTypes.includes(Type.FIRE); + return userTypes.includes(PokemonType.FIRE); }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(AddBattlerTagAttr, BattlerTagType.BURNED_UP, true, false) - .attr(RemoveTypeAttr, Type.FIRE, (user) => { + .attr(RemoveTypeAttr, PokemonType.FIRE, (user) => { globalScene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", { pokemonName: getPokemonNameWithAffix(user) })); }), - new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7) + new StatusMove(Moves.SPEED_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 7) .attr(SwapStatAttr, Stat.SPD) .ignoresSubstitute(), - new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), - new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7) + new AttackMove(Moves.SMART_STRIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), + new StatusMove(Moves.PURIFY, PokemonType.POISON, -1, 20, -1, 0, 7) .condition( (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? .attr(HealAttr, 0.5) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .triageMove() .reflectable(), - new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) + new AttackMove(Moves.REVELATION_DANCE, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() .attr(MatchUserTypeAttr), - new AttackMove(Moves.CORE_ENFORCER, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7) + new AttackMove(Moves.CORE_ENFORCER, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(SuppressAbilitiesIfActedAttr), - new AttackMove(Moves.TROP_KICK, Type.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7) + new AttackMove(Moves.TROP_KICK, PokemonType.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) + new StatusMove(Moves.INSTRUCT, PokemonType.PSYCHIC, -1, 15, -1, 0, 7) .ignoresSubstitute() .attr(RepeatMoveAttr) // incorrect interactions with Gigaton Hammer, Blood Moon & Torment // Also has incorrect interactions with Dancer due to the latter // erroneously adding copied moves to move history. .edgeCase(), - new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) + new AttackMove(Moves.BEAK_BLAST, PokemonType.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) .attr(BeakBlastHeaderAttr) .ballBombMove() .makesContact(false), - new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) + new AttackMove(Moves.CLANGING_SCALES, PokemonType.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_HAMMER, Type.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), - new AttackMove(Moves.BRUTAL_SWING, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 7) + new AttackMove(Moves.DRAGON_HAMMER, PokemonType.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), + new AttackMove(Moves.BRUTAL_SWING, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 7) .target(MoveTarget.ALL_NEAR_OTHERS), - new StatusMove(Moves.AURORA_VEIL, Type.ICE, -1, 20, -1, 0, 7) + new StatusMove(Moves.AURORA_VEIL, PokemonType.ICE, -1, 20, -1, 0, 7) .condition((user, target, move) => (globalScene.arena.weather?.weatherType === WeatherType.HAIL || globalScene.arena.weather?.weatherType === WeatherType.SNOW) && !globalScene.arena.weather?.isEffectSuppressed()) .attr(AddArenaTagAttr, ArenaTagType.AURORA_VEIL, 5, true) .target(MoveTarget.USER_SIDE), /* Unused */ - new AttackMove(Moves.SINISTER_ARROW_RAID, Type.GHOST, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + new AttackMove(Moves.SINISTER_ARROW_RAID, PokemonType.GHOST, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) .unimplemented() .makesContact(false) .edgeCase(), // I assume it's because the user needs spirit shackle and decidueye - new AttackMove(Moves.MALICIOUS_MOONSAULT, Type.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + new AttackMove(Moves.MALICIOUS_MOONSAULT, PokemonType.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) .unimplemented() .attr(AlwaysHitMinimizeAttr) .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .edgeCase(), // I assume it's because it needs darkest lariat and incineroar - new AttackMove(Moves.OCEANIC_OPERETTA, Type.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) + new AttackMove(Moves.OCEANIC_OPERETTA, PokemonType.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) .unimplemented() .edgeCase(), // I assume it's because it needs sparkling aria and primarina - new AttackMove(Moves.GUARDIAN_OF_ALOLA, Type.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + new AttackMove(Moves.GUARDIAN_OF_ALOLA, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.SOUL_STEALING_7_STAR_STRIKE, Type.GHOST, MoveCategory.PHYSICAL, 195, -1, 1, -1, 0, 7) + new AttackMove(Moves.SOUL_STEALING_7_STAR_STRIKE, PokemonType.GHOST, MoveCategory.PHYSICAL, 195, -1, 1, -1, 0, 7) .unimplemented(), - new AttackMove(Moves.STOKED_SPARKSURFER, Type.ELECTRIC, MoveCategory.SPECIAL, 175, -1, 1, 100, 0, 7) + new AttackMove(Moves.STOKED_SPARKSURFER, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 175, -1, 1, 100, 0, 7) .unimplemented() .edgeCase(), // I assume it's because it needs thunderbolt and Alola Raichu - new AttackMove(Moves.PULVERIZING_PANCAKE, Type.NORMAL, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) + new AttackMove(Moves.PULVERIZING_PANCAKE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) .unimplemented() .edgeCase(), // I assume it's because it needs giga impact and snorlax - new SelfStatusMove(Moves.EXTREME_EVOBOOST, Type.NORMAL, -1, 1, -1, 0, 7) + new SelfStatusMove(Moves.EXTREME_EVOBOOST, PokemonType.NORMAL, -1, 1, -1, 0, 7) .unimplemented() .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), - new AttackMove(Moves.GENESIS_SUPERNOVA, Type.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) + new AttackMove(Moves.GENESIS_SUPERNOVA, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) .unimplemented() .attr(TerrainChangeAttr, TerrainType.PSYCHIC), /* End Unused */ - new AttackMove(Moves.SHELL_TRAP, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) + new AttackMove(Moves.SHELL_TRAP, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) .attr(AddBattlerTagHeaderAttr, BattlerTagType.SHELL_TRAP) .target(MoveTarget.ALL_NEAR_ENEMIES) // Fails if the user was not hit by a physical attack during the turn .condition((user, target, move) => user.getTag(ShellTrapTag)?.activated === true), - new AttackMove(Moves.FLEUR_CANNON, Type.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7) + new AttackMove(Moves.FLEUR_CANNON, PokemonType.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.PSYCHIC_FANGS, Type.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) + new AttackMove(Moves.PSYCHIC_FANGS, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .bitingMove() .attr(RemoveScreensAttr), - new AttackMove(Moves.STOMPING_TANTRUM, Type.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7) + new AttackMove(Moves.STOMPING_TANTRUM, PokemonType.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7) .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), - new AttackMove(Moves.SHADOW_BONE, Type.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) + new AttackMove(Moves.SHADOW_BONE, PokemonType.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .makesContact(false), - new AttackMove(Moves.ACCELEROCK, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 7), - new AttackMove(Moves.LIQUIDATION, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) + new AttackMove(Moves.ACCELEROCK, PokemonType.ROCK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 7), + new AttackMove(Moves.LIQUIDATION, PokemonType.WATER, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) + new AttackMove(Moves.PRISMATIC_LASER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) .attr(RechargeAttr), - new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) + new AttackMove(Moves.SPECTRAL_THIEF, PokemonType.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) .attr(SpectralThiefAttr) .ignoresSubstitute(), - new AttackMove(Moves.SUNSTEEL_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) + new AttackMove(Moves.SUNSTEEL_STRIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), - new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) + new AttackMove(Moves.MOONGEIST_BEAM, PokemonType.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), - new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7) + new StatusMove(Moves.TEARFUL_LOOK, PokemonType.NORMAL, -1, 20, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) .reflectable(), - new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) + new AttackMove(Moves.ZING_ZAP, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) .attr(FlinchAttr), - new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) + new AttackMove(Moves.NATURES_MADNESS, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.MULTI_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 7) + new AttackMove(Moves.MULTI_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 7) .attr(FormChangeItemTypeAttr), /* Unused */ - new AttackMove(Moves.TEN_MILLION_VOLT_THUNDERBOLT, Type.ELECTRIC, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) + new AttackMove(Moves.TEN_MILLION_VOLT_THUNDERBOLT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) .unimplemented() .edgeCase(), // I assume it's because it needs thunderbolt and pikachu in a cap /* End Unused */ - new AttackMove(Moves.MIND_BLOWN, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 7) + new AttackMove(Moves.MIND_BLOWN, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 7) .condition(failIfDampCondition) .attr(HalfSacrificialAttr) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.PLASMA_FISTS, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 15, -1, 0, 7) + new AttackMove(Moves.PLASMA_FISTS, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE, 1) .punchingMove(), - new AttackMove(Moves.PHOTON_GEYSER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) + new AttackMove(Moves.PHOTON_GEYSER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .attr(PhotonGeyserCategoryAttr) .ignoresAbilities(), /* Unused */ - new AttackMove(Moves.LIGHT_THAT_BURNS_THE_SKY, Type.PSYCHIC, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) + new AttackMove(Moves.LIGHT_THAT_BURNS_THE_SKY, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) .unimplemented() .attr(PhotonGeyserCategoryAttr) .ignoresAbilities(), - new AttackMove(Moves.SEARING_SUNRAZE_SMASH, Type.STEEL, MoveCategory.PHYSICAL, 200, -1, 1, -1, 0, 7) + new AttackMove(Moves.SEARING_SUNRAZE_SMASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 200, -1, 1, -1, 0, 7) .unimplemented() .ignoresAbilities(), - new AttackMove(Moves.MENACING_MOONRAZE_MAELSTROM, Type.GHOST, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) + new AttackMove(Moves.MENACING_MOONRAZE_MAELSTROM, PokemonType.GHOST, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) .unimplemented() .ignoresAbilities(), - new AttackMove(Moves.LETS_SNUGGLE_FOREVER, Type.FAIRY, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) + new AttackMove(Moves.LETS_SNUGGLE_FOREVER, PokemonType.FAIRY, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) .unimplemented() .edgeCase(), // I assume it needs play rough and mimikyu - new AttackMove(Moves.SPLINTERED_STORMSHARDS, Type.ROCK, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) + new AttackMove(Moves.SPLINTERED_STORMSHARDS, PokemonType.ROCK, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) .unimplemented() .attr(ClearTerrainAttr) .makesContact(false), - new AttackMove(Moves.CLANGOROUS_SOULBLAZE, Type.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) + new AttackMove(Moves.CLANGOROUS_SOULBLAZE, PokemonType.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) .unimplemented() .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES) .edgeCase(), // I assume it needs clanging scales and Kommo-O /* End Unused */ - new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) // LGPE Implementation + new AttackMove(Moves.ZIPPY_ZAP, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) // LGPE Implementation .attr(CritOnlyAttr), - new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) + new AttackMove(Moves.SPLISHY_SPLASH, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.FLOATY_FALL, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, 30, 0, 7) + new AttackMove(Moves.FLOATY_FALL, PokemonType.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, 30, 0, 7) .attr(FlinchAttr), - new AttackMove(Moves.PIKA_PAPOW, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) + new AttackMove(Moves.PIKA_PAPOW, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), - new AttackMove(Moves.BOUNCY_BUBBLE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) + new AttackMove(Moves.BOUNCY_BUBBLE, PokemonType.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) .attr(HitHealAttr, 1) .triageMove(), - new AttackMove(Moves.BUZZY_BUZZ, Type.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) + new AttackMove(Moves.BUZZY_BUZZ, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.SIZZLY_SLIDE, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 7) + new AttackMove(Moves.SIZZLY_SLIDE, PokemonType.FIRE, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 7) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.GLITZY_GLOW, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) + new AttackMove(Moves.GLITZY_GLOW, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, false, true), - new AttackMove(Moves.BADDY_BAD, Type.DARK, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) + new AttackMove(Moves.BADDY_BAD, PokemonType.DARK, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, false, true), - new AttackMove(Moves.SAPPY_SEED, Type.GRASS, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) + new AttackMove(Moves.SAPPY_SEED, PokemonType.GRASS, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) .attr(LeechSeedAttr) .makesContact(false), - new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) + new AttackMove(Moves.FREEZY_FROST, PokemonType.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) .attr(ResetStatsAttr, true), - new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) + new AttackMove(Moves.SPARKLY_SWIRL, PokemonType.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) .attr(PartyStatusCureAttr, null, Abilities.NONE), - new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) + new AttackMove(Moves.VEEVEE_VOLLEY, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), - new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) + new AttackMove(Moves.DOUBLE_IRON_BASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) .attr(MultiHitAttr, MultiHitType._2) .attr(FlinchAttr) .punchingMove(), /* Unused */ - new SelfStatusMove(Moves.MAX_GUARD, Type.NORMAL, -1, 10, -1, 4, 8) + new SelfStatusMove(Moves.MAX_GUARD, PokemonType.NORMAL, -1, 10, -1, 4, 8) .unimplemented() .attr(ProtectAttr) .condition(failIfLastCondition), /* End Unused */ - new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.DYNAMAX_CANNON, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, target, move) => { // Move is only stronger against overleveled foes. if (target.level > globalScene.getMaxExpLevel()) { @@ -10851,13 +10482,13 @@ export function initMoves() { }) .attr(DiscourageFrequentUseAttr), - new AttackMove(Moves.SNIPE_SHOT, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) + new AttackMove(Moves.SNIPE_SHOT, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) .attr(HighCritAttr) .attr(BypassRedirectAttr), - new AttackMove(Moves.JAW_LOCK, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.JAW_LOCK, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(JawLockAttr) .bitingMove(), - new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.STUFF_CHEEKS, PokemonType.NORMAL, -1, 10, -1, 0, 8) .attr(EatBerryAttr) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true) .condition((user) => { @@ -10865,326 +10496,326 @@ export function initMoves() { return userBerries.length > 0; }) .edgeCase(), // Stuff Cheeks should not be selectable when the user does not have a berry, see wiki - new SelfStatusMove(Moves.NO_RETREAT, Type.FIGHTING, -1, 5, -1, 0, 8) + new SelfStatusMove(Moves.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 !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat - new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) + new StatusMove(Moves.TAR_SHOT, PokemonType.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false) .reflectable(), - new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) - .attr(ChangeTypeAttr, Type.PSYCHIC) + new StatusMove(Moves.MAGIC_POWDER, PokemonType.PSYCHIC, 100, 20, -1, 0, 8) + .attr(ChangeTypeAttr, PokemonType.PSYCHIC) .powderMove() .reflectable(), - new AttackMove(Moves.DRAGON_DARTS, Type.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) + new AttackMove(Moves.DRAGON_DARTS, PokemonType.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false) .partial(), // smart targetting is unimplemented - new StatusMove(Moves.TEATIME, Type.NORMAL, -1, 10, -1, 0, 8) + new StatusMove(Moves.TEATIME, PokemonType.NORMAL, -1, 10, -1, 0, 8) .attr(EatBerryAttr) .target(MoveTarget.ALL), - new StatusMove(Moves.OCTOLOCK, Type.FIGHTING, 100, 15, -1, 0, 8) + new StatusMove(Moves.OCTOLOCK, PokemonType.FIGHTING, 100, 15, -1, 0, 8) .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.OCTOLOCK, false, true, 1), - new AttackMove(Moves.BOLT_BEAK, Type.ELECTRIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) + new AttackMove(Moves.BOLT_BEAK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr), - new AttackMove(Moves.FISHIOUS_REND, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) + new AttackMove(Moves.FISHIOUS_REND, PokemonType.WATER, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr) .bitingMove(), - new StatusMove(Moves.COURT_CHANGE, Type.NORMAL, 100, 10, -1, 0, 8) + new StatusMove(Moves.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 ]), /* Unused */ - new AttackMove(Moves.MAX_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_FLARE, PokemonType.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_FLUTTERBY, Type.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_FLUTTERBY, PokemonType.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_LIGHTNING, Type.ELECTRIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_LIGHTNING, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_STRIKE, Type.NORMAL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_STRIKE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_KNUCKLE, Type.FIGHTING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_KNUCKLE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_PHANTASM, Type.GHOST, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_PHANTASM, PokemonType.GHOST, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_HAILSTORM, Type.ICE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_HAILSTORM, PokemonType.ICE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_OOZE, Type.POISON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_OOZE, PokemonType.POISON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_GEYSER, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_GEYSER, PokemonType.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_AIRSTREAM, Type.FLYING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_AIRSTREAM, PokemonType.FLYING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_STARFALL, Type.FAIRY, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_STARFALL, PokemonType.FAIRY, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_WYRMWIND, Type.DRAGON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_WYRMWIND, PokemonType.DRAGON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_MINDSTORM, Type.PSYCHIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_MINDSTORM, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_ROCKFALL, Type.ROCK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_ROCKFALL, PokemonType.ROCK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_QUAKE, Type.GROUND, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_QUAKE, PokemonType.GROUND, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_DARKNESS, Type.DARK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_DARKNESS, PokemonType.DARK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_OVERGROWTH, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_OVERGROWTH, PokemonType.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new AttackMove(Moves.MAX_STEELSPIKE, Type.STEEL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.MAX_STEELSPIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) .unimplemented(), /* End Unused */ - new SelfStatusMove(Moves.CLANGOROUS_SOUL, Type.DRAGON, 100, 5, -1, 0, 8) + new SelfStatusMove(Moves.CLANGOROUS_SOUL, PokemonType.DRAGON, 100, 5, -1, 0, 8) .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, 3) .soundBased() .danceMove(), - new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.BODY_PRESS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(DefAtkAttr), - new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8) + new StatusMove(Moves.DECORATE, PokemonType.FAIRY, -1, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 2) .ignoresProtect(), - new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.DRUM_BEATING, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), - new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8) + new AttackMove(Moves.SNAP_TRAP, PokemonType.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.SNAP_TRAP), - new AttackMove(Moves.PYRO_BALL, Type.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) + new AttackMove(Moves.PYRO_BALL, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .ballBombMove() .makesContact(false), - new AttackMove(Moves.BEHEMOTH_BLADE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.BEHEMOTH_BLADE, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8) .slicingMove(), - new AttackMove(Moves.BEHEMOTH_BASH, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8), - new AttackMove(Moves.AURA_WHEEL, Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8) + new AttackMove(Moves.BEHEMOTH_BASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8), + new AttackMove(Moves.AURA_WHEEL, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .makesContact(false) .attr(AuraWheelTypeAttr), - new AttackMove(Moves.BREAKING_SWIPE, Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8) + new AttackMove(Moves.BREAKING_SWIPE, PokemonType.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.BRANCH_POKE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 8), - new AttackMove(Moves.OVERDRIVE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.BRANCH_POKE, PokemonType.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 8), + new AttackMove(Moves.OVERDRIVE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.APPLE_ACID, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.APPLE_ACID, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.GRAV_APPLE, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.GRAV_APPLE, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTag(ArenaTagType.GRAVITY) ? 1.5 : 1) .makesContact(false), - new AttackMove(Moves.SPIRIT_BREAK, Type.FAIRY, MoveCategory.PHYSICAL, 75, 100, 15, 100, 0, 8) + new AttackMove(Moves.SPIRIT_BREAK, PokemonType.FAIRY, MoveCategory.PHYSICAL, 75, 100, 15, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.STRANGE_STEAM, Type.FAIRY, MoveCategory.SPECIAL, 90, 95, 10, 20, 0, 8) + new AttackMove(Moves.STRANGE_STEAM, PokemonType.FAIRY, MoveCategory.SPECIAL, 90, 95, 10, 20, 0, 8) .attr(ConfuseAttr), - new StatusMove(Moves.LIFE_DEW, Type.WATER, -1, 10, -1, 0, 8) + new StatusMove(Moves.LIFE_DEW, PokemonType.WATER, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .target(MoveTarget.USER_AND_ALLIES) .ignoresProtect(), - new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8) + new SelfStatusMove(Moves.OBSTRUCT, PokemonType.DARK, 100, 10, -1, 4, 8) .attr(ProtectAttr, BattlerTagType.OBSTRUCT) .condition(failIfLastCondition), - new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8), - new AttackMove(Moves.METEOR_ASSAULT, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8) + new AttackMove(Moves.FALSE_SURRENDER, PokemonType.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8), + new AttackMove(Moves.METEOR_ASSAULT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8) .attr(RechargeAttr) .makesContact(false), - new AttackMove(Moves.ETERNABEAM, Type.DRAGON, MoveCategory.SPECIAL, 160, 90, 5, -1, 0, 8) + new AttackMove(Moves.ETERNABEAM, PokemonType.DRAGON, MoveCategory.SPECIAL, 160, 90, 5, -1, 0, 8) .attr(RechargeAttr), - new AttackMove(Moves.STEEL_BEAM, Type.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8) + new AttackMove(Moves.STEEL_BEAM, PokemonType.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8) .attr(HalfSacrificialAttr), - new AttackMove(Moves.EXPANDING_FORCE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.EXPANDING_FORCE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? 1.5 : 1) .attr(VariableTargetAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER), - new AttackMove(Moves.STEEL_ROLLER, Type.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) + new AttackMove(Moves.STEEL_ROLLER, PokemonType.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) .attr(ClearTerrainAttr) .condition((user, target, move) => !!globalScene.arena.terrain), - new AttackMove(Moves.SCALE_SHOT, Type.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) + new AttackMove(Moves.SCALE_SHOT, PokemonType.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true, { lastHitOnly: true }) .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { lastHitOnly: true }) .attr(MultiHitAttr) .makesContact(false), - new ChargingAttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 8) + new ChargingAttackMove(Moves.METEOR_BEAM, PokemonType.ROCK, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 8) .chargeText(i18next.t("moveTriggers:isOverflowingWithSpacePower", { pokemonName: "{USER}" })) .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), - new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) + new AttackMove(Moves.SHELL_SIDE_ARM, PokemonType.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) .attr(ShellSideArmCategoryAttr) .attr(StatusEffectAttr, StatusEffect.POISON) .partial(), // Physical version of the move does not make contact - new AttackMove(Moves.MISTY_EXPLOSION, Type.FAIRY, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.MISTY_EXPLOSION, PokemonType.FAIRY, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) .attr(SacrificialAttr) .target(MoveTarget.ALL_NEAR_OTHERS) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.MISTY && user.isGrounded() ? 1.5 : 1) .condition(failIfDampCondition) .makesContact(false), - new AttackMove(Moves.GRASSY_GLIDE, Type.GRASS, MoveCategory.PHYSICAL, 55, 100, 20, -1, 0, 8) + new AttackMove(Moves.GRASSY_GLIDE, PokemonType.GRASS, MoveCategory.PHYSICAL, 55, 100, 20, -1, 0, 8) .attr(IncrementMovePriorityAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && user.isGrounded()), - new AttackMove(Moves.RISING_VOLTAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 8) + new AttackMove(Moves.RISING_VOLTAGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.ELECTRIC && target.isGrounded() ? 2 : 1), - new AttackMove(Moves.TERRAIN_PULSE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 8) + new AttackMove(Moves.TERRAIN_PULSE, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 8) .attr(TerrainPulseTypeAttr) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() !== TerrainType.NONE && user.isGrounded() ? 2 : 1) .pulseMove(), - new AttackMove(Moves.SKITTER_SMACK, Type.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.SKITTER_SMACK, PokemonType.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.BURNING_JEALOUSY, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8) + new AttackMove(Moves.BURNING_JEALOUSY, PokemonType.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8) .attr(StatusIfBoostedAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) + new AttackMove(Moves.LASH_OUT, PokemonType.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, _target, _move) => user.turnData.statStagesDecreased ? 2 : 1), - new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) + new AttackMove(Moves.POLTERGEIST, PokemonType.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) .condition(failIfNoTargetHeldItemsCondition) .attr(PreMoveMessageAttr, attackedByItemMessageFunc) .makesContact(false), - new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8) + new StatusMove(Moves.CORROSIVE_GAS, PokemonType.POISON, 100, 40, -1, 0, 8) .target(MoveTarget.ALL_NEAR_OTHERS) .reflectable() .unimplemented(), - new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8) + new StatusMove(Moves.COACHING, PokemonType.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1) .target(MoveTarget.NEAR_ALLY) .condition(failIfSingleBattle), - new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) + new AttackMove(Moves.FLIP_TURN, PokemonType.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.TRIPLE_AXEL, Type.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8) + new AttackMove(Moves.TRIPLE_AXEL, PokemonType.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._3) .attr(MultiHitPowerIncrementAttr, 3) .checkAllHits(), - new AttackMove(Moves.DUAL_WINGBEAT, Type.FLYING, MoveCategory.PHYSICAL, 40, 90, 10, -1, 0, 8) + new AttackMove(Moves.DUAL_WINGBEAT, PokemonType.FLYING, MoveCategory.PHYSICAL, 40, 90, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.SCORCHING_SANDS, Type.GROUND, MoveCategory.SPECIAL, 70, 100, 10, 30, 0, 8) + new AttackMove(Moves.SCORCHING_SANDS, PokemonType.GROUND, MoveCategory.SPECIAL, 70, 100, 10, 30, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.JUNGLE_HEALING, Type.GRASS, -1, 10, -1, 0, 8) + new StatusMove(Moves.JUNGLE_HEALING, PokemonType.GRASS, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .target(MoveTarget.USER_AND_ALLIES), - new AttackMove(Moves.WICKED_BLOW, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) + new AttackMove(Moves.WICKED_BLOW, PokemonType.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(CritOnlyAttr) .punchingMove(), - new AttackMove(Moves.SURGING_STRIKES, Type.WATER, MoveCategory.PHYSICAL, 25, 100, 5, -1, 0, 8) + new AttackMove(Moves.SURGING_STRIKES, PokemonType.WATER, MoveCategory.PHYSICAL, 25, 100, 5, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._3) .attr(CritOnlyAttr) .punchingMove(), - new AttackMove(Moves.THUNDER_CAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, -1, 0, 8) + new AttackMove(Moves.THUNDER_CAGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.THUNDER_CAGE), - new AttackMove(Moves.DRAGON_ENERGY, Type.DRAGON, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 8) + new AttackMove(Moves.DRAGON_ENERGY, PokemonType.DRAGON, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 8) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.FREEZING_GLARE, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 8) + new AttackMove(Moves.FREEZING_GLARE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 8) .attr(StatusEffectAttr, StatusEffect.FREEZE), - new AttackMove(Moves.FIERY_WRATH, Type.DARK, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) + new AttackMove(Moves.FIERY_WRATH, PokemonType.DARK, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) .attr(FlinchAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.THUNDEROUS_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8) + new AttackMove(Moves.THUNDEROUS_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.GLACIAL_LANCE, Type.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.GLACIAL_LANCE, PokemonType.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .makesContact(false), - new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.ASTRAL_BARRAGE, PokemonType.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8) + new AttackMove(Moves.EERIE_SPELL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8) .attr(AttackReducePpMoveAttr, 3) .soundBased(), - new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) + new AttackMove(Moves.DIRE_CLAW, PokemonType.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) .attr(MultiStatusEffectAttr, [ StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP ]), - new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.PSYSHIELD_BASH, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.POWER_SHIFT, PokemonType.NORMAL, -1, 10, -1, 0, 8) .target(MoveTarget.USER) .attr(ShiftStatAttr, Stat.ATK, Stat.DEF), - new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) + new AttackMove(Moves.STONE_AXE, PokemonType.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) .attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK) .slicingMove(), - new AttackMove(Moves.SPRINGTIDE_STORM, Type.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8) + new AttackMove(Moves.SPRINGTIDE_STORM, PokemonType.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.MYSTICAL_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.MYSTICAL_POWER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), - new AttackMove(Moves.RAGING_FURY, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + new AttackMove(Moves.RAGING_FURY, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) .makesContact(false) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new AttackMove(Moves.WAVE_CRASH, Type.WATER, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + new AttackMove(Moves.WAVE_CRASH, PokemonType.WATER, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) + new AttackMove(Moves.CHLOROBLAST, PokemonType.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) .attr(RecoilAttr, true, 0.5), - new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) + new AttackMove(Moves.MOUNTAIN_GALE, PokemonType.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) .makesContact(false) .attr(FlinchAttr), - new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.VICTORY_DANCE, PokemonType.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.HEADLONG_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.HEADLONG_RUSH, PokemonType.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true) .punchingMove(), - new AttackMove(Moves.BARB_BARRAGE, Type.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) + new AttackMove(Moves.BARB_BARRAGE, PokemonType.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) .makesContact(false) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.ESPER_WING, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.ESPER_WING, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) .attr(HighCritAttr) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new AttackMove(Moves.BITTER_MALICE, Type.GHOST, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 8) + new AttackMove(Moves.BITTER_MALICE, PokemonType.GHOST, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new SelfStatusMove(Moves.SHELTER, Type.STEEL, -1, 10, 100, 0, 8) + new SelfStatusMove(Moves.SHELTER, PokemonType.STEEL, -1, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) + new AttackMove(Moves.TRIPLE_ARROWS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) .makesContact(false) .attr(HighCritAttr) .attr(StatStageChangeAttr, [ Stat.DEF ], -1, false, { effectChanceOverride: 50 }) .attr(FlinchAttr), - new AttackMove(Moves.INFERNAL_PARADE, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8) + new AttackMove(Moves.INFERNAL_PARADE, PokemonType.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8) .attr(StatusEffectAttr, StatusEffect.BURN) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status ? 2 : 1), - new AttackMove(Moves.CEASELESS_EDGE, Type.DARK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) + new AttackMove(Moves.CEASELESS_EDGE, PokemonType.DARK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) .attr(AddArenaTrapTagHitAttr, ArenaTagType.SPIKES) .slicingMove(), - new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) + new AttackMove(Moves.BLEAKWIND_STORM, PokemonType.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) .attr(StormAccuracyAttr) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.WILDBOLT_STORM, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) + new AttackMove(Moves.WILDBOLT_STORM, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SANDSEAR_STORM, Type.GROUND, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) + new AttackMove(Moves.SANDSEAR_STORM, PokemonType.GROUND, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.LUNAR_BLESSING, Type.PSYCHIC, -1, 5, -1, 0, 8) + new StatusMove(Moves.LUNAR_BLESSING, PokemonType.PSYCHIC, -1, 5, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .target(MoveTarget.USER_AND_ALLIES) .triageMove(), - new SelfStatusMove(Moves.TAKE_HEART, Type.PSYCHIC, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.TAKE_HEART, PokemonType.PSYCHIC, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true) .attr(HealStatusEffectAttr, true, [ StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP ]), /* Unused - new AttackMove(Moves.G_MAX_WILDFIRE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_WILDFIRE, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_BEFUDDLE, Type.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -11259,7 +10890,7 @@ export function initMoves() { new AttackMove(Moves.G_MAX_FOAM_BURST, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), - new AttackMove(Moves.G_MAX_CENTIFERNO, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_CENTIFERNO, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_VINE_LASH, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -11271,7 +10902,7 @@ export function initMoves() { new AttackMove(Moves.G_MAX_DRUM_SOLO, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), - new AttackMove(Moves.G_MAX_FIREBALL, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_FIREBALL, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_HYDROSNIPE, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -11284,56 +10915,56 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), End Unused */ - new AttackMove(Moves.TERA_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) + new AttackMove(Moves.TERA_BLAST, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized && user.isOfType(Type.STELLAR) }), - new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized && user.isOfType(PokemonType.STELLAR) }), + new SelfStatusMove(Moves.SILK_TRAP, PokemonType.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), - new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9) + new AttackMove(Moves.AXE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .attr(ConfuseAttr) .recklessMove(), - new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + new AttackMove(Moves.LAST_RESPECTS, PokemonType.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 100)) .makesContact(false), - new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.LUMINA_CRASH, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(Moves.ORDER_UP, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.ORDER_UP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) .attr(OrderUpStatBoostAttr) .makesContact(false), - new AttackMove(Moves.JET_PUNCH, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) + new AttackMove(Moves.JET_PUNCH, PokemonType.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) .punchingMove(), - new StatusMove(Moves.SPICY_EXTRACT, Type.GRASS, -1, 15, -1, 0, 9) + new StatusMove(Moves.SPICY_EXTRACT, PokemonType.GRASS, -1, 15, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -2), - new AttackMove(Moves.SPIN_OUT, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.SPIN_OUT, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], -2, true), - new AttackMove(Moves.POPULATION_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9) + new AttackMove(Moves.POPULATION_BOMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._10) .slicingMove() .checkAllHits(), - new AttackMove(Moves.ICE_SPINNER, Type.ICE, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) + new AttackMove(Moves.ICE_SPINNER, PokemonType.ICE, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(ClearTerrainAttr), - new AttackMove(Moves.GLAIVE_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.GLAIVE_RUSH, PokemonType.DRAGON, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true) .attr(AddBattlerTagAttr, BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true) .condition((user, target, move) => { return !(target.getTag(BattlerTagType.PROTECTED)?.tagType === "PROTECTED" || globalScene.arena.getTag(ArenaTagType.MAT_BLOCK)?.tagType === "MAT_BLOCK"); }), - new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) + new StatusMove(Moves.REVIVAL_BLESSING, PokemonType.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) .target(MoveTarget.USER), - new AttackMove(Moves.SALT_CURE, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, 100, 0, 9) + new AttackMove(Moves.SALT_CURE, PokemonType.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, 100, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.SALT_CURED) .makesContact(false), - new AttackMove(Moves.TRIPLE_DIVE, Type.WATER, MoveCategory.PHYSICAL, 30, 95, 10, -1, 0, 9) + new AttackMove(Moves.TRIPLE_DIVE, PokemonType.WATER, MoveCategory.PHYSICAL, 30, 95, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._3), - new AttackMove(Moves.MORTAL_SPIN, Type.POISON, MoveCategory.PHYSICAL, 30, 100, 15, 100, 0, 9) + new AttackMove(Moves.MORTAL_SPIN, PokemonType.POISON, MoveCategory.PHYSICAL, 30, 100, 15, 100, 0, 9) .attr(LapseBattlerTagAttr, [ BattlerTagType.BIND, BattlerTagType.WRAP, @@ -11350,176 +10981,176 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.POISON) .attr(RemoveArenaTrapAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.DOODLE, Type.NORMAL, 100, 10, -1, 0, 9) + new StatusMove(Moves.DOODLE, PokemonType.NORMAL, 100, 10, -1, 0, 9) .attr(AbilityCopyAttr, true), - new SelfStatusMove(Moves.FILLET_AWAY, Type.NORMAL, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.FILLET_AWAY, PokemonType.NORMAL, -1, 10, -1, 0, 9) .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, 2), - new AttackMove(Moves.KOWTOW_CLEAVE, Type.DARK, MoveCategory.PHYSICAL, 85, -1, 10, -1, 0, 9) + new AttackMove(Moves.KOWTOW_CLEAVE, PokemonType.DARK, MoveCategory.PHYSICAL, 85, -1, 10, -1, 0, 9) .slicingMove(), - new AttackMove(Moves.FLOWER_TRICK, Type.GRASS, MoveCategory.PHYSICAL, 70, -1, 10, 100, 0, 9) + new AttackMove(Moves.FLOWER_TRICK, PokemonType.GRASS, MoveCategory.PHYSICAL, 70, -1, 10, 100, 0, 9) .attr(CritOnlyAttr) .makesContact(false), - new AttackMove(Moves.TORCH_SONG, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.TORCH_SONG, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .soundBased(), - new AttackMove(Moves.AQUA_STEP, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.AQUA_STEP, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.RAGING_BULL, Type.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) + new AttackMove(Moves.RAGING_BULL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) .attr(RagingBullTypeAttr) .attr(RemoveScreensAttr), - new AttackMove(Moves.MAKE_IT_RAIN, Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.MAKE_IT_RAIN, PokemonType.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(MoneyAttr) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1, true, { firstTargetOnly: true }) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) + new AttackMove(Moves.PSYBLADE, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) .slicingMove(), - new AttackMove(Moves.HYDRO_STEAM, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) + new AttackMove(Moves.HYDRO_STEAM, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) .attr(IgnoreWeatherTypeDebuffAttr, WeatherType.SUNNY) .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 1.5 : 1), // TODO: is this bang correct? - new AttackMove(Moves.RUINATION, Type.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) + new AttackMove(Moves.RUINATION, PokemonType.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.COLLISION_COURSE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.COLLISION_COURSE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1), - new AttackMove(Moves.ELECTRO_DRIFT, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.ELECTRO_DRIFT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1) .makesContact(), - new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.SHED_TAIL, PokemonType.NORMAL, -1, 10, -1, 0, 9) .attr(AddSubstituteAttr, 0.5, true) .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL) .condition(failIfLastInPartyCondition), - new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.CHILLY_RECEPTION, PokemonType.ICE, -1, 10, -1, 0, 9) .attr(PreMoveMessageAttr, (user, move) => i18next.t("moveTriggers:chillyReception", { pokemonName: getPokemonNameWithAffix(user) })) .attr(ChillyReceptionAttr, true), - new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.TIDY_UP, PokemonType.NORMAL, -1, 10, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true) .attr(RemoveArenaTrapAttr, true) .attr(RemoveAllSubstitutesAttr), - new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9) + new StatusMove(Moves.SNOWSCAPE, PokemonType.ICE, -1, 10, -1, 0, 9) .attr(WeatherChangeAttr, WeatherType.SNOW) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.POUNCE, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.POUNCE, PokemonType.BUG, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.TRAILBLAZE, Type.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.TRAILBLAZE, PokemonType.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new AttackMove(Moves.CHILLING_WATER, Type.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.CHILLING_WATER, PokemonType.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.HYPER_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.HYPER_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .ignoresProtect(), - new AttackMove(Moves.TWIN_BEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9) + new AttackMove(Moves.TWIN_BEAM, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.RAGE_FIST, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + new AttackMove(Moves.RAGE_FIST, PokemonType.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) .edgeCase() // Counter incorrectly increases on confusion self-hits .attr(RageFistPowerAttr) .punchingMove(), - new AttackMove(Moves.ARMOR_CANNON, Type.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.ARMOR_CANNON, PokemonType.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.BITTER_BLADE, Type.FIRE, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) + new AttackMove(Moves.BITTER_BLADE, PokemonType.FIRE, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) .attr(HitHealAttr) .slicingMove() .triageMove(), - new AttackMove(Moves.DOUBLE_SHOCK, Type.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.DOUBLE_SHOCK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) .condition((user) => { const userTypes = user.getTypes(true); - return userTypes.includes(Type.ELECTRIC); + return userTypes.includes(PokemonType.ELECTRIC); }) .attr(AddBattlerTagAttr, BattlerTagType.DOUBLE_SHOCKED, true, false) - .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { + .attr(RemoveTypeAttr, PokemonType.ELECTRIC, (user) => { globalScene.queueMessage(i18next.t("moveTriggers:usedUpAllElectricity", { pokemonName: getPokemonNameWithAffix(user) })); }), - new AttackMove(Moves.GIGATON_HAMMER, Type.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) + new AttackMove(Moves.GIGATON_HAMMER, PokemonType.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) .makesContact(false) .condition((user, target, move) => { const turnMove = user.getLastXMoves(1); return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; }), // TODO Add Instruct/Encore interaction - new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) + new AttackMove(Moves.COMEUPPANCE, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .redirectCounter() .target(MoveTarget.ATTACKER), - new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) + new AttackMove(Moves.AQUA_CUTTER, PokemonType.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) .attr(HighCritAttr) .slicingMove() .makesContact(false), - new AttackMove(Moves.BLAZING_TORQUE, Type.FIRE, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 9) + new AttackMove(Moves.BLAZING_TORQUE, PokemonType.FIRE, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.BURN) .makesContact(false), - new AttackMove(Moves.WICKED_TORQUE, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, 10, 0, 9) + new AttackMove(Moves.WICKED_TORQUE, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 10, 10, 0, 9) .attr(StatusEffectAttr, StatusEffect.SLEEP) .makesContact(false), - new AttackMove(Moves.NOXIOUS_TORQUE, Type.POISON, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.NOXIOUS_TORQUE, PokemonType.POISON, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.COMBAT_TORQUE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.COMBAT_TORQUE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), - new AttackMove(Moves.MAGICAL_TORQUE, Type.FAIRY, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.MAGICAL_TORQUE, PokemonType.FAIRY, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(ConfuseAttr) .makesContact(false), - new AttackMove(Moves.BLOOD_MOON, Type.NORMAL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 9) + new AttackMove(Moves.BLOOD_MOON, PokemonType.NORMAL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 9) .condition((user, target, move) => { const turnMove = user.getLastXMoves(1); return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; }), // TODO Add Instruct/Encore interaction - new AttackMove(Moves.MATCHA_GOTCHA, Type.GRASS, MoveCategory.SPECIAL, 80, 90, 15, 20, 0, 9) + new AttackMove(Moves.MATCHA_GOTCHA, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 90, 15, 20, 0, 9) .attr(HitHealAttr) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_ENEMIES) .triageMove(), - new AttackMove(Moves.SYRUP_BOMB, Type.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9) + new AttackMove(Moves.SYRUP_BOMB, PokemonType.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.SYRUP_BOMB, false, false, 3) .ballBombMove(), - new AttackMove(Moves.IVY_CUDGEL, Type.GRASS, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 9) + new AttackMove(Moves.IVY_CUDGEL, PokemonType.GRASS, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 9) .attr(IvyCudgelTypeAttr) .attr(HighCritAttr) .makesContact(false), - new ChargingAttackMove(Moves.ELECTRO_SHOT, Type.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) + new ChargingAttackMove(Moves.ELECTRO_SHOT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) .chargeText(i18next.t("moveTriggers:absorbedElectricity", { pokemonName: "{USER}" })) .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.RAIN, WeatherType.HEAVY_RAIN ]), - new AttackMove(Moves.TERA_STARSTORM, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.TERA_STARSTORM, PokemonType.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraStarstormTypeAttr) .attr(VariableTargetAttr, (user, target, move) => user.hasSpecies(Species.TERAPAGOS) && user.isTerastallized ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ - new AttackMove(Moves.FICKLE_BEAM, Type.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) + new AttackMove(Moves.FICKLE_BEAM, PokemonType.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) .attr(DoublePowerChanceAttr), - new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9) + new SelfStatusMove(Moves.BURNING_BULWARK, PokemonType.FIRE, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK) .condition(failIfLastCondition), - new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) + new AttackMove(Moves.THUNDERCLAP, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? - new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) + new AttackMove(Moves.MIGHTY_CLEAVE, PokemonType.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) .slicingMove() .ignoresProtect(), - new AttackMove(Moves.TACHYON_CUTTER, Type.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) + new AttackMove(Moves.TACHYON_CUTTER, PokemonType.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._2) .slicingMove(), - new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) + new AttackMove(Moves.HARD_PRESS, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) .attr(OpponentHighHpPowerAttr, 100), - new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9) + new StatusMove(Moves.DRAGON_CHEER, PokemonType.DRAGON, -1, 15, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.DRAGON_CHEER, false, true) .target(MoveTarget.NEAR_ALLY), - new AttackMove(Moves.ALLURING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) + new AttackMove(Moves.ALLURING_VOICE, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) .attr(AddBattlerTagIfBoostedAttr, BattlerTagType.CONFUSED) .soundBased(), - new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) + new AttackMove(Moves.TEMPER_FLARE, PokemonType.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), - new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) + new AttackMove(Moves.SUPERCELL_SLAM, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .recklessMove(), - new AttackMove(Moves.PSYCHIC_NOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9) + new AttackMove(Moves.PSYCHIC_NOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9) .soundBased() .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, false, 2), - new AttackMove(Moves.UPPER_HAND, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9) + new AttackMove(Moves.UPPER_HAND, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9) .attr(FlinchAttr) .condition(new UpperHandCondition()), - new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) + new AttackMove(Moves.MALIGNANT_CHAIN, PokemonType.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); allMoves.map(m => { 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 209cc7a7ec5..9a95cf305be 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -41,7 +41,7 @@ import { HeldItemRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type { AttackTypeBoosterModifierType, ModifierTypeOption } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import type { @@ -56,7 +56,7 @@ import { } from "#app/modifier/modifier"; import i18next from "i18next"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -205,8 +205,8 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = CombinationPokemonRequirement.Some( // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1), - new TypeRequirement(Type.BUG, false, 1) + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), + new TypeRequirement(PokemonType.BUG, false, 1) ) ) .withMaxAllowedEncounters(1) @@ -280,7 +280,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const requiredItems = [ generateModifierType(modifierTypes.QUICK_CLAW), generateModifierType(modifierTypes.GRIP_CLAW), - generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.BUG ]), + generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.BUG ]), ]; const requiredItemString = requiredItems.map(m => m?.name ?? "unknown").join("/"); @@ -328,7 +328,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = ) .withOption(MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.BUG, false, 1)) // Must have 1 Bug type on team + .withPrimaryPokemonRequirement(new TypeRequirement(PokemonType.BUG, false, 1)) // Must have 1 Bug type on team .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, @@ -339,7 +339,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const encounter = globalScene.currentBattle.mysteryEncounter!; // Player gets different rewards depending on the number of bug types they have - const numBugTypes = globalScene.getPlayerParty().filter(p => p.isOfType(Type.BUG, true)).length; + const numBugTypes = globalScene.getPlayerParty().filter(p => p.isOfType(PokemonType.BUG, true)).length; const numBugTypesText = i18next.t(`${namespace}:numBugTypes`, { count: numBugTypes }); encounter.setDialogueToken("numBugTypes", numBugTypesText); @@ -419,7 +419,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = CombinationPokemonRequirement.Some( // Meets one or both of the below reqs new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1) + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1) ) ) .withDialogue({ @@ -445,7 +445,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const validItems = pokemon.getHeldItems().filter(item => { return (item instanceof BypassSpeedChanceModifier || item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG)) && + (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG)) && item.isTransferable; }); @@ -471,7 +471,7 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const hasValidItem = pokemon.getHeldItems().some(item => { return item instanceof BypassSpeedChanceModifier || item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG); + (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG); }); if (!hasValidItem) { return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index e660b0b873c..c9fc7975a3f 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -15,7 +15,7 @@ import { TrainerType } from "#enums/trainer-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#enums/abilities"; import { applyAbilityOverrideToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { randSeedInt, randSeedShuffle } from "#app/utils"; @@ -31,7 +31,7 @@ import { BerryType } from "#enums/berry-type"; import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { EncounterAnim } from "#enums/encounter-anims"; @@ -354,13 +354,13 @@ export const ClowningAroundEncounter: MysteryEncounter = priorityTypes = randSeedShuffle(priorityTypes); } - const newTypes = [ Type.UNKNOWN ]; - let secondType: Type | null = null; + const newTypes = [ PokemonType.UNKNOWN ]; + let secondType: PokemonType | null = null; while (secondType === null || secondType === newTypes[0] || originalTypes.includes(secondType)) { if (priorityTypes.length > 0) { secondType = priorityTypes.pop() ?? null; } else { - secondType = randSeedInt(18) as Type; + secondType = randSeedInt(18) as PokemonType; } } newTypes.push(secondType); diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 3b6ab8b0c05..6e55566fe8a 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -1,4 +1,4 @@ -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -166,10 +166,10 @@ export const DarkDealEncounter: MysteryEncounter = // Start encounter with random legendary (7-10 starter strength) that has level additive // If this is a mono-type challenge, always ensure the required type is filtered for - let bossTypes: Type[] = encounter.misc.removedTypes; + let bossTypes: PokemonType[] = encounter.misc.removedTypes; const singleTypeChallenges = globalScene.gameMode.challenges.filter(c => c.value && c.id === Challenges.SINGLE_TYPE); if (globalScene.gameMode.isChallenge && singleTypeChallenges.length > 0) { - bossTypes = singleTypeChallenges.map(c => (c.value - 1) as Type); + bossTypes = singleTypeChallenges.map(c => (c.value - 1) as PokemonType); } const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 8bb5c68eec0..0e5d6ff87bc 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,4 +1,4 @@ -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index c52540584b3..1f425dc9ea9 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -11,7 +11,7 @@ import { AbilityRequirement, CombinationPokemonRequirement, TypeRequirement } fr import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Gender } from "#app/data/gender"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BattlerIndex } from "#app/battle"; import type Pokemon from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon"; @@ -188,7 +188,7 @@ export const FieryFalloutEncounter: MysteryEncounter = async () => { // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof const encounter = globalScene.currentBattle.mysteryEncounter!; - const nonFireTypes = globalScene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(Type.FIRE)); + const nonFireTypes = globalScene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(PokemonType.FIRE)); for (const pkm of nonFireTypes) { const percentage = DAMAGE_PERCENTAGE / 100; @@ -221,7 +221,7 @@ export const FieryFalloutEncounter: MysteryEncounter = .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement( CombinationPokemonRequirement.Some( - new TypeRequirement(Type.FIRE, true, 1), + new TypeRequirement(PokemonType.FIRE, true, 1), new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true) ) ) // Will set option3PrimaryName dialogue token automatically @@ -266,7 +266,7 @@ function giveLeadPokemonAttackTypeBoostItem() { // Generate type booster held item, default to Charcoal if item fails to generate let boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER) as AttackTypeBoosterModifierType; if (!boosterModifierType) { - boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FIRE ]) as AttackTypeBoosterModifierType; + boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.FIRE ]) as AttackTypeBoosterModifierType; } applyModifierTypeToPlayerPokemon(leadPokemon, boosterModifierType); diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index 16015c80fc8..57e6fec91bb 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -15,7 +15,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { Biome } from "#enums/biome"; import { getBiomeKey } from "#app/field/arena"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type"; import { TrainerSlot } from "#app/data/trainer-config"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -30,7 +30,7 @@ const namespace = "mysteryEncounters/teleportingHijinks"; const MONEY_COST_MULTIPLIER = 1.75; const BIOME_CANDIDATES = [ Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO ]; -const MACHINE_INTERFACING_TYPES = [ Type.ELECTRIC, Type.STEEL ]; +const MACHINE_INTERFACING_TYPES = [ PokemonType.ELECTRIC, PokemonType.STEEL ]; /** * Teleporting Hijinks encounter. @@ -149,8 +149,8 @@ export const TeleportingHijinksEncounter: MysteryEncounter = }], }; - const magnet = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.STEEL ])!; - const metalCoat = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.ELECTRIC ])!; + const magnet = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.STEEL ])!; + const metalCoat = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.ELECTRIC ])!; setEncounterRewards({ guaranteedModifierTypeOptions: [ magnet, metalCoat ], fillRemaining: true }); await transitionMysteryEncounterIntroVisuals(true, true); await initBattleWithEnemyConfig(config); 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 a4e80c158bb..802296bfd98 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 @@ -24,7 +24,7 @@ import { EggTier } from "#enums/egg-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { modifierTypes } from "#app/modifier/modifier-type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getPokeballTintColor } from "#app/data/pokeball"; import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; @@ -386,7 +386,7 @@ function getPartyConfig(): EnemyPartyConfig { nature: Nature.ADAMANT, moveSet: [ Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH ], ivs: [ 31, 31, 31, 31, 31, 31 ], - tera: Type.STEEL, + tera: PokemonType.STEEL, } ] }; diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index 7d3f6f4c5bc..c1a74f67c49 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -13,7 +13,7 @@ import { Abilities } from "#enums/abilities"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { Nature } from "#enums/nature"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BerryType } from "#enums/berry-type"; import { Stat } from "#enums/stat"; import { SpeciesFormChangeAbilityTrigger } from "#app/data/pokemon-forms"; @@ -303,12 +303,12 @@ function getVictoriaTrainerConfig(): EnemyPartyConfig { moveSet: [ Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP ], modifierConfigs: [ { - modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.PSYCHIC ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.PSYCHIC ]) as PokemonHeldItemModifierType, stackCount: 1, isTransferable: false }, { - modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FAIRY ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ PokemonType.FAIRY ]) as PokemonHeldItemModifierType, stackCount: 1, isTransferable: false } diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index 6e6381888f1..6c0219688da 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -17,7 +17,7 @@ import PokemonData from "#app/system/pokemon-data"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import type { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; -import { SelfStatusMove } from "#app/data/move"; +import { SelfStatusMove } from "#app/data/moves/move"; import { PokeballType } from "#enums/pokeball"; import { BattlerTagType } from "#enums/battler-tag-type"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 454d179c003..4f9338ac5cc 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -1,4 +1,4 @@ -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import { globalScene } from "#app/global-scene"; @@ -528,10 +528,10 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new // Randomize the second type of the pokemon // If the pokemon does not normally have a second type, it will gain 1 - const newTypes = [ Type.UNKNOWN ]; - let newType = randSeedInt(18) as Type; + const newTypes = [ PokemonType.UNKNOWN ]; + let newType = randSeedInt(18) as PokemonType; while (newType === newTypes[0]) { - newType = randSeedInt(18) as Type; + newType = randSeedInt(18) as PokemonType; } newTypes.push(newType); if (!newPokemon.customPokemonData) { diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index d0078b3686e..ce9d4839c49 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -3,7 +3,7 @@ import type { Moves } from "#app/enums/moves"; import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { globalScene } from "#app/global-scene"; -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import type { CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; import { CanLearnMoveRequirement } from "./requirements/can-learn-move-requirement"; @@ -254,7 +254,7 @@ export class MysteryEncounterOptionBuilder implements Partial pokemon?.getTypes().includes(ty)); if (includedTypes.length > 0) { - return [ "type", Type[includedTypes[0]] ]; + return [ "type", PokemonType[includedTypes[0]] ]; } return [ "type", "" ]; } @@ -878,12 +878,12 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { } export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRequirement { - requiredHeldItemTypes: Type[]; + requiredHeldItemTypes: PokemonType[]; minNumberOfPokemon: number; invertQuery: boolean; requireTransferable: boolean; - constructor(heldItemTypes: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { + constructor(heldItemTypes: PokemonType | PokemonType[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 1f740763148..a6ca236f735 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 { Variant } from "#app/data/variant"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Type } from "#app/enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getNatureName } from "#app/data/nature"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -101,7 +101,7 @@ export interface EnemyPokemonConfig { modifierConfigs?: HeldModifierConfig[]; tags?: BattlerTagType[]; dataSource?: PokemonData; - tera?: Type; + tera?: PokemonType; aiType?: AiType; } @@ -334,7 +334,7 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): } // Set tera - if (config.tera && config.tera !== Type.UNKNOWN) { + if (config.tera && config.tera !== PokemonType.UNKNOWN) { enemyPokemon.teraType = config.tera; if (battle.trainer) { battle.trainer.config.setInstantTera(e); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index be7d11d6cf1..3871b919e62 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -13,7 +13,7 @@ import { Mode } from "#app/ui/ui"; import type { PartyOption } from "#app/ui/party-ui-handler"; import { PartyUiMode } from "#app/ui/party-ui-handler"; import { Species } from "#enums/species"; -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; @@ -209,7 +209,7 @@ export function getHighestStatTotalPlayerPokemon(isAllowed: boolean = false, isF * @param allowMythical * @returns */ -export function getRandomSpeciesByStarterCost(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species { +export function getRandomSpeciesByStarterCost(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: PokemonType[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species { let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 46dfbfecae2..1192f7f17c1 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -1,7 +1,8 @@ import { PokemonFormChangeItemModifier } from "../modifier/modifier"; import type Pokemon from "../field/pokemon"; import { StatusEffect } from "#enums/status-effect"; -import { MoveCategory, allMoves } from "./move"; +import { allMoves } from "./moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; import type { Constructor, nil } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index c9d49f29440..796678a200c 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -14,7 +14,7 @@ import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate } from "#app/data/exp"; import type { EvolutionLevel } from "#app/data/balance/pokemon-evolutions"; import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type { Stat } from "#enums/stat"; @@ -164,8 +164,8 @@ export abstract class PokemonSpeciesForm { public speciesId: Species; protected _formIndex: number; protected _generation: number; - readonly type1: Type; - readonly type2: Type | null; + readonly type1: PokemonType; + readonly type2: PokemonType | null; readonly height: number; readonly weight: number; readonly ability1: Abilities; @@ -179,7 +179,7 @@ export abstract class PokemonSpeciesForm { readonly genderDiffs: boolean; readonly isStarterSelectable: boolean; - constructor(type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + constructor(type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean, isStarterSelectable: boolean ) { @@ -662,7 +662,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali readonly forms: PokemonForm[]; constructor(id: Species, generation: number, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, - type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, catchRate: number, baseFriendship: number, baseExp: number, growthRate: GrowthRate, malePercent: number | null, genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[] @@ -1072,7 +1072,7 @@ export class PokemonForm extends PokemonSpeciesForm { // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; - constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, + constructor(formName: string, formKey: string, type1: PokemonType, type2: PokemonType | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false, isUnobtainable: boolean = false @@ -1114,1777 +1114,1777 @@ export const allSpecies: PokemonSpecies[] = []; export function initSpecies() { allSpecies.push( - new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.IVYSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 1, 13, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), - ), - new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", Type.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHARIZARD, 1, false, false, false, "Flame Pokémon", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.FIRE, Type.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.FIRE, Type.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 84, 93, 139, 100, 100, 45, 50, 267), - ), - new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", Type.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", Type.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 83, 135, 115, 110, 68, 45, 50, 265), - ), - new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), - ), - new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.POISON, 1.4, 40.5, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198), - ), - new PokemonSpecies(Species.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.8, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.1, 30, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FLYING, 2.2, 50.5, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240), - ), - new PokemonSpecies(Species.RATTATA, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.3, 3.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.RATICATE, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.7, 18.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FEAROW, 1, false, false, false, "Beak Pokémon", Type.NORMAL, Type.FLYING, 1.2, 38, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.EKANS, 1, false, false, false, "Snake Pokémon", Type.POISON, null, 2, 6.9, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", Type.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), - new PokemonForm("Partner", "partner", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), - new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 999.9, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form - ), - new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SANDSLASH, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 1, 29.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.4, 7, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.8, 20, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", Type.POISON, Type.GROUND, 1.3, 60, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.5, 9, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.9, 19.5, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.NIDOKING, 1, false, false, false, "Drill Pokémon", Type.POISON, Type.GROUND, 1.4, 62, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 0.6, 7.5, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CLEFABLE, 1, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 1.3, 40, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.VULPIX, 1, false, false, false, "Fox Pokémon", Type.FIRE, null, 0.6, 9.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.NINETALES, 1, false, false, false, "Fox Pokémon", Type.FIRE, null, 1.1, 19.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.5, 5.5, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 1, 12, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.ZUBAT, 1, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 0.8, 7.5, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.GOLBAT, 1, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 1.6, 55, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ODDISH, 1, false, false, false, "Weed Pokémon", Type.GRASS, Type.POISON, 0.5, 5.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLOOM, 1, false, false, false, "Weed Pokémon", Type.GRASS, Type.POISON, 0.8, 8.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.VILEPLUME, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 1.2, 18.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.PARAS, 1, false, false, false, "Mushroom Pokémon", Type.BUG, Type.GRASS, 0.3, 5.4, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PARASECT, 1, false, false, false, "Mushroom Pokémon", Type.BUG, Type.GRASS, 1, 29.5, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VENONAT, 1, false, false, false, "Insect Pokémon", Type.BUG, Type.POISON, 1, 30, Abilities.COMPOUND_EYES, Abilities.TINTED_LENS, Abilities.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.5, 12.5, Abilities.SHIELD_DUST, Abilities.TINTED_LENS, Abilities.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DIGLETT, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.2, 0.8, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 999.9, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian - ), - new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", Type.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 1.7, 76.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", Type.FIGHTING, null, 0.5, 28, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", Type.FIGHTING, null, 1, 32, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GROWLITHE, 1, false, false, false, "Puppy Pokémon", Type.FIRE, null, 0.7, 19, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.ARCANINE, 1, false, false, false, "Legendary Pokémon", Type.FIRE, null, 1.9, 155, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.POLIWAG, 1, false, false, false, "Tadpole Pokémon", Type.WATER, null, 0.6, 12.4, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", Type.WATER, null, 1, 20, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", Type.WATER, Type.FIGHTING, 1.3, 54, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ABRA, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 0.9, 19.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.KADABRA, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 1.3, 56.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), - new PokemonSpecies(Species.ALAKAZAM, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, GrowthRate.MEDIUM_SLOW, 75, true, true, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, null, 1.2, 48, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true), - ), - new PokemonSpecies(Species.MACHOP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 0.8, 19.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), - ), - new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 0.9, 45.5, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 1.6, 55, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GEODUDE, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 0.4, 20, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAVELER, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 1, 105, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", Type.ROCK, Type.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PONYTA, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1, 30, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1.7, 95, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", Type.WATER, Type.PSYCHIC, 1.2, 36, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", Type.WATER, Type.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.PSYCHIC, 2, 120, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172), - ), - new PokemonSpecies(Species.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 6, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.MAGNETON, 1, false, false, false, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 1, 60, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", Type.NORMAL, Type.FLYING, 0.8, 15, Abilities.KEEN_EYE, Abilities.INNER_FOCUS, Abilities.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DODUO, 1, false, false, false, "Twin Bird Pokémon", Type.NORMAL, Type.FLYING, 1.4, 39.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.DODRIO, 1, false, false, false, "Triple Bird Pokémon", Type.NORMAL, Type.FLYING, 1.8, 85.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SEEL, 1, false, false, false, "Sea Lion Pokémon", Type.WATER, null, 1.1, 90, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", Type.WATER, Type.ICE, 1.7, 120, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GRIMER, 1, false, false, false, "Sludge Pokémon", Type.POISON, null, 0.9, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUK, 1, false, false, false, "Sludge Pokémon", Type.POISON, null, 1.2, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHELLDER, 1, false, false, false, "Bivalve Pokémon", Type.WATER, null, 0.3, 4, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", Type.WATER, Type.ICE, 1.5, 132.5, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GASTLY, 1, false, false, false, "Gas Pokémon", Type.GHOST, Type.POISON, 1.3, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HAUNTER, 1, false, false, false, "Gas Pokémon", Type.GHOST, Type.POISON, 1.6, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, Type.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 999.9, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), - ), - new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", Type.ROCK, Type.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HYPNO, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1.6, 75.6, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", Type.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 70, 70, 60, 50, 166), - ), - new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", Type.GRASS, Type.PSYCHIC, 0.4, 2.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", Type.GRASS, Type.PSYCHIC, 2, 120, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CUBONE, 1, false, false, false, "Lonely Pokémon", Type.GROUND, null, 0.4, 6.5, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", Type.GROUND, null, 1, 45, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HITMONLEE, 1, false, false, false, "Kicking Pokémon", Type.FIGHTING, null, 1.5, 49.8, Abilities.LIMBER, Abilities.RECKLESS, Abilities.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.HITMONCHAN, 1, false, false, false, "Punching Pokémon", Type.FIGHTING, null, 1.4, 50.2, Abilities.KEEN_EYE, Abilities.IRON_FIST, Abilities.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.LICKITUNG, 1, false, false, false, "Licking Pokémon", Type.NORMAL, null, 1.2, 65.5, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KOFFING, 1, false, false, false, "Poison Gas Pokémon", Type.POISON, null, 0.6, 1, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WEEZING, 1, false, false, false, "Poison Gas Pokémon", Type.POISON, null, 1.2, 9.5, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RHYHORN, 1, false, false, false, "Spikes Pokémon", Type.GROUND, Type.ROCK, 1, 115, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.RHYDON, 1, false, false, false, "Drill Pokémon", Type.GROUND, Type.ROCK, 1.9, 120, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.CHANSEY, 1, false, false, false, "Egg Pokémon", Type.NORMAL, null, 1.1, 34.6, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.TANGELA, 1, false, false, false, "Vine Pokémon", Type.GRASS, null, 1, 35, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KANGASKHAN, 1, false, false, false, "Parent Pokémon", Type.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, null, 2.2, 100, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172), - ), - new PokemonSpecies(Species.HORSEA, 1, false, false, false, "Dragon Pokémon", Type.WATER, null, 0.4, 8, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SEADRA, 1, false, false, false, "Dragon Pokémon", Type.WATER, null, 1.2, 25, Abilities.POISON_POINT, Abilities.SNIPER, Abilities.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", Type.WATER, null, 0.6, 15, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SEAKING, 1, false, false, false, "Goldfish Pokémon", Type.WATER, null, 1.3, 39, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.STARYU, 1, false, false, false, "Star Shape Pokémon", Type.WATER, null, 0.8, 34.5, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.STARMIE, 1, false, false, false, "Mysterious Pokémon", Type.WATER, Type.PSYCHIC, 1.1, 80, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MR_MIME, 1, false, false, false, "Barrier Pokémon", Type.PSYCHIC, Type.FAIRY, 1.3, 54.5, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCYTHER, 1, false, false, false, "Mantis Pokémon", Type.BUG, Type.FLYING, 1.5, 56, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.JYNX, 1, false, false, false, "Human Shape Pokémon", Type.ICE, Type.PSYCHIC, 1.4, 40.6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", Type.ELECTRIC, null, 1.1, 30, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGMAR, 1, false, false, false, "Spitfire Pokémon", Type.FIRE, null, 1.3, 44.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", Type.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.FLYING, 1.7, 59, Abilities.AERILATE, Abilities.AERILATE, Abilities.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175), - ), - new PokemonSpecies(Species.TAUROS, 1, false, false, false, "Wild Bull Pokémon", Type.NORMAL, null, 1.4, 88.4, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.MAGIKARP, 1, false, false, false, "Fish Pokémon", Type.WATER, null, 0.9, 10, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GYARADOS, 1, false, false, false, "Atrocious Pokémon", Type.WATER, Type.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.WATER, Type.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.DARK, 6.5, 305, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true), - ), - new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 85, 85, 105, 130, 60, 45, 50, 187), - ), - new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), - new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form - ), - new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.FLAREON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 0.9, 25, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PORYGON, 1, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.8, 36.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.OMANYTE, 1, false, false, false, "Spiral Pokémon", Type.ROCK, Type.WATER, 0.4, 7.5, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.OMASTAR, 1, false, false, false, "Spiral Pokémon", Type.ROCK, Type.WATER, 1, 35, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.KABUTO, 1, false, false, false, "Shellfish Pokémon", Type.ROCK, Type.WATER, 0.5, 11.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", Type.ROCK, Type.WATER, 1.3, 40.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AERODACTYL, 1, false, false, false, "Fossil Pokémon", Type.ROCK, Type.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.FLYING, 2.1, 79, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180), - ), - new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), - ), - new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", Type.ICE, Type.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", Type.ELECTRIC, Type.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MOLTRES, 1, true, false, false, "Flame Pokémon", Type.FIRE, Type.FLYING, 2, 60, Abilities.PRESSURE, Abilities.NONE, Abilities.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DRATINI, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 1.8, 3.3, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 4, 16.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGONITE, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 2.2, 210, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.MEWTWO, 1, false, true, false, "Genetic Pokémon", Type.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.PSYCHIC, Type.FIGHTING, 2.3, 127, Abilities.STEADFAST, Abilities.NONE, Abilities.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.PSYCHIC, null, 1.5, 33, Abilities.INSOMNIA, Abilities.NONE, Abilities.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340), - ), - new PokemonSpecies(Species.MEW, 1, false, false, true, "New Species Pokémon", Type.PSYCHIC, null, 0.4, 4, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.CHIKORITA, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 0.9, 6.4, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BAYLEEF, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 1.2, 15.8, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", Type.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", Type.FIRE, null, 0.5, 7.9, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUILAVA, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 0.9, 19, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 0.6, 9.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 1.1, 25, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SENTRET, 2, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.8, 6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FURRET, 2, false, false, false, "Long Body Pokémon", Type.NORMAL, null, 1.8, 32.5, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HOOTHOOT, 2, false, false, false, "Owl Pokémon", Type.NORMAL, Type.FLYING, 0.7, 21.2, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOCTOWL, 2, false, false, false, "Owl Pokémon", Type.NORMAL, Type.FLYING, 1.6, 40.8, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LEDYBA, 2, false, false, false, "Five Star Pokémon", Type.BUG, Type.FLYING, 1, 10.8, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.LEDIAN, 2, false, false, false, "Five Star Pokémon", Type.BUG, Type.FLYING, 1.4, 35.6, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.SPINARAK, 2, false, false, false, "String Spit Pokémon", Type.BUG, Type.POISON, 0.5, 8.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ARIADOS, 2, false, false, false, "Long Leg Pokémon", Type.BUG, Type.POISON, 1.1, 33.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.CROBAT, 2, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 1.8, 75, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHINCHOU, 2, false, false, false, "Angler Pokémon", Type.WATER, Type.ELECTRIC, 0.5, 12, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LANTURN, 2, false, false, false, "Light Pokémon", Type.WATER, Type.ELECTRIC, 1.2, 22.5, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", Type.ELECTRIC, null, 0.3, 2, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - new PokemonForm("Spiky-Eared", "spiky", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - ), - new PokemonSpecies(Species.CLEFFA, 2, false, false, false, "Star Shape Pokémon", Type.FAIRY, null, 0.3, 3, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.3, 1, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", Type.FAIRY, null, 0.3, 1.5, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.TOGETIC, 2, false, false, false, "Happiness Pokémon", Type.FAIRY, Type.FLYING, 0.6, 3.2, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.NATU, 2, false, false, false, "Tiny Bird Pokémon", Type.PSYCHIC, Type.FLYING, 0.2, 2, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.XATU, 2, false, false, false, "Mystic Pokémon", Type.PSYCHIC, Type.FLYING, 1.5, 15, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.MAREEP, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.6, 7.8, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLAAFFY, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.8, 13.3, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, Type.DRAGON, 1.4, 61.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255), - ), - new PokemonSpecies(Species.BELLOSSOM, 2, false, false, false, "Flower Pokémon", Type.GRASS, null, 0.4, 5.8, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", Type.WATER, Type.FAIRY, 0.4, 8.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", Type.WATER, Type.FAIRY, 0.8, 28.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", Type.ROCK, null, 1.2, 38, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.POLITOED, 2, false, false, false, "Frog Pokémon", Type.WATER, null, 1.1, 33.9, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.4, 0.5, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.6, 1, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AIPOM, 2, false, false, false, "Long Tail Pokémon", Type.NORMAL, null, 0.8, 11.5, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.SUNKERN, 2, false, false, false, "Seed Pokémon", Type.GRASS, null, 0.3, 1.8, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SUNFLORA, 2, false, false, false, "Sun Pokémon", Type.GRASS, null, 0.8, 8.5, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.YANMA, 2, false, false, false, "Clear Wing Pokémon", Type.BUG, Type.FLYING, 1.2, 38, Abilities.SPEED_BOOST, Abilities.COMPOUND_EYES, Abilities.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WOOPER, 2, false, false, false, "Water Fish Pokémon", Type.WATER, Type.GROUND, 0.4, 8.5, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", Type.WATER, Type.GROUND, 1.4, 75, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ESPEON, 2, false, false, false, "Sun Pokémon", Type.PSYCHIC, null, 0.9, 26.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.UMBREON, 2, false, false, false, "Moonlight Pokémon", Type.DARK, null, 1, 27, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.MURKROW, 2, false, false, false, "Darkness Pokémon", Type.DARK, Type.FLYING, 0.5, 2.1, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SLOWKING, 2, false, false, false, "Royal Pokémon", Type.WATER, Type.PSYCHIC, 2, 79.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MISDREAVUS, 2, false, false, false, "Screech Pokémon", Type.GHOST, null, 0.7, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.UNOWN, 2, false, false, false, "Symbol Pokémon", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("A", "a", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("B", "b", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("C", "c", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("D", "d", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("E", "e", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("F", "f", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("G", "g", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("H", "h", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("I", "i", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("J", "j", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("K", "k", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("L", "l", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("M", "m", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("N", "n", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("O", "o", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("P", "p", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Q", "q", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("R", "r", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("S", "s", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("T", "t", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("U", "u", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("V", "v", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("W", "w", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("X", "x", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Y", "y", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Z", "z", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("!", "exclamation", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("?", "question", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - ), - new PokemonSpecies(Species.WOBBUFFET, 2, false, false, false, "Patient Pokémon", Type.PSYCHIC, null, 1.3, 28.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 41.5, Abilities.INNER_FOCUS, Abilities.EARLY_BIRD, Abilities.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.PINECO, 2, false, false, false, "Bagworm Pokémon", Type.BUG, null, 0.6, 7.2, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", Type.BUG, Type.STEEL, 1.2, 125.8, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", Type.NORMAL, null, 1.5, 14, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", Type.GROUND, Type.FLYING, 1.1, 64.8, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STEELIX, 2, false, false, false, "Iron Snake Pokémon", Type.STEEL, Type.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.STEEL, Type.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.GROUND, 10.5, 740, Abilities.SAND_FORCE, Abilities.SAND_FORCE, Abilities.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true), - ), - new PokemonSpecies(Species.SNUBBULL, 2, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 0.6, 7.8, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GRANBULL, 2, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 1.4, 48.7, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.QWILFISH, 2, false, false, false, "Balloon Pokémon", Type.WATER, Type.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCIZOR, 2, false, false, false, "Pincer Pokémon", Type.BUG, Type.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.STEEL, 2, 125, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true), - ), - new PokemonSpecies(Species.SHUCKLE, 2, false, false, false, "Mold Pokémon", Type.BUG, Type.ROCK, 0.6, 20.5, Abilities.STURDY, Abilities.GLUTTONY, Abilities.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HERACROSS, 2, false, false, false, "Single Horn Pokémon", Type.BUG, Type.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.FIGHTING, 1.7, 62.5, Abilities.SKILL_LINK, Abilities.SKILL_LINK, Abilities.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true), - ), - new PokemonSpecies(Species.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 0.9, 28, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", Type.NORMAL, null, 0.6, 8.8, Abilities.PICKUP, Abilities.QUICK_FEET, Abilities.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.URSARING, 2, false, false, false, "Hibernator Pokémon", Type.NORMAL, null, 1.8, 125.8, Abilities.GUTS, Abilities.QUICK_FEET, Abilities.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SLUGMA, 2, false, false, false, "Lava Pokémon", Type.FIRE, null, 0.7, 35, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MAGCARGO, 2, false, false, false, "Lava Pokémon", Type.FIRE, Type.ROCK, 0.8, 55, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWINUB, 2, false, false, false, "Pig Pokémon", Type.ICE, Type.GROUND, 0.4, 6.5, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PILOSWINE, 2, false, false, false, "Swine Pokémon", Type.ICE, Type.GROUND, 1.1, 55.8, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.CORSOLA, 2, false, false, false, "Coral Pokémon", Type.WATER, Type.ROCK, 0.6, 5, Abilities.HUSTLE, Abilities.NATURAL_CURE, Abilities.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.REMORAID, 2, false, false, false, "Jet Pokémon", Type.WATER, null, 0.6, 12, Abilities.HUSTLE, Abilities.SNIPER, Abilities.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.OCTILLERY, 2, false, false, false, "Jet Pokémon", Type.WATER, null, 0.9, 28.5, Abilities.SUCTION_CUPS, Abilities.SNIPER, Abilities.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.DELIBIRD, 2, false, false, false, "Delivery Pokémon", Type.ICE, Type.FLYING, 0.9, 16, Abilities.VITAL_SPIRIT, Abilities.HUSTLE, Abilities.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.MANTINE, 2, false, false, false, "Kite Pokémon", Type.WATER, Type.FLYING, 2.1, 220, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", Type.STEEL, Type.FLYING, 1.7, 50.5, Abilities.KEEN_EYE, Abilities.STURDY, Abilities.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HOUNDOUR, 2, false, false, false, "Dark Pokémon", Type.DARK, Type.FIRE, 0.6, 10.8, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HOUNDOOM, 2, false, false, false, "Dark Pokémon", Type.DARK, Type.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.DARK, Type.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, Type.FIRE, 1.9, 49.5, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true), - ), - new PokemonSpecies(Species.KINGDRA, 2, false, false, false, "Dragon Pokémon", Type.WATER, Type.DRAGON, 1.8, 152, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PHANPY, 2, false, false, false, "Long Nose Pokémon", Type.GROUND, null, 0.5, 33.5, Abilities.PICKUP, Abilities.NONE, Abilities.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DONPHAN, 2, false, false, false, "Armor Pokémon", Type.GROUND, null, 1.1, 120, Abilities.STURDY, Abilities.NONE, Abilities.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.PORYGON2, 2, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.6, 32.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.STANTLER, 2, false, false, false, "Big Horn Pokémon", Type.NORMAL, null, 1.4, 71.2, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SMEARGLE, 2, false, false, false, "Painter Pokémon", Type.NORMAL, null, 1.2, 58, Abilities.OWN_TEMPO, Abilities.TECHNICIAN, Abilities.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TYROGUE, 2, false, false, false, "Scuffle Pokémon", Type.FIGHTING, null, 0.7, 21, Abilities.GUTS, Abilities.STEADFAST, Abilities.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.HITMONTOP, 2, false, false, false, "Handstand Pokémon", Type.FIGHTING, null, 1.4, 48, Abilities.INTIMIDATE, Abilities.TECHNICIAN, Abilities.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", Type.ICE, Type.PSYCHIC, 0.4, 6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ELEKID, 2, false, false, false, "Electric Pokémon", Type.ELECTRIC, null, 0.6, 23.5, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGBY, 2, false, false, false, "Live Coal Pokémon", Type.FIRE, null, 0.7, 21.4, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MILTANK, 2, false, false, false, "Milk Cow Pokémon", Type.NORMAL, null, 1.2, 75.5, Abilities.THICK_FAT, Abilities.SCRAPPY, Abilities.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", Type.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.RAIKOU, 2, true, false, false, "Thunder Pokémon", Type.ELECTRIC, null, 1.9, 178, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ENTEI, 2, true, false, false, "Volcano Pokémon", Type.FIRE, null, 2.1, 198, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SUICUNE, 2, true, false, false, "Aurora Pokémon", Type.WATER, null, 2, 187, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", Type.ROCK, Type.GROUND, 0.6, 72, Abilities.GUTS, Abilities.NONE, Abilities.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", Type.ROCK, Type.GROUND, 1.2, 152, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TYRANITAR, 2, false, false, false, "Armor Pokémon", Type.ROCK, Type.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.DARK, 2.5, 255, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300), - ), - new PokemonSpecies(Species.LUGIA, 2, false, true, false, "Diving Pokémon", Type.PSYCHIC, Type.FLYING, 5.2, 216, Abilities.PRESSURE, Abilities.NONE, Abilities.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.HO_OH, 2, false, true, false, "Rainbow Pokémon", Type.FIRE, Type.FLYING, 3.8, 199, Abilities.PRESSURE, Abilities.NONE, Abilities.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CELEBI, 2, false, false, true, "Time Travel Pokémon", Type.PSYCHIC, Type.GRASS, 0.6, 5, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", Type.GRASS, null, 0.5, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", Type.GRASS, null, 0.9, 21.6, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SCEPTILE, 3, false, false, false, "Forest Pokémon", Type.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.DRAGON, 1.9, 55.2, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265), - ), - new PokemonSpecies(Species.TORCHIC, 3, false, false, false, "Chick Pokémon", Type.FIRE, null, 0.4, 2.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 19.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true), - ), - new PokemonSpecies(Species.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, null, 0.4, 7.6, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 0.7, 28, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.GROUND, 1.9, 102, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268), - ), - new PokemonSpecies(Species.POOCHYENA, 3, false, false, false, "Bite Pokémon", Type.DARK, null, 0.5, 13.6, Abilities.RUN_AWAY, Abilities.QUICK_FEET, Abilities.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIGHTYENA, 3, false, false, false, "Bite Pokémon", Type.DARK, null, 1, 37, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", Type.NORMAL, null, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LINOONE, 3, false, false, false, "Rushing Pokémon", Type.NORMAL, null, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WURMPLE, 3, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 3.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SILCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CASCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 11.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.LOTAD, 3, false, false, false, "Water Weed Pokémon", Type.WATER, Type.GRASS, 0.5, 2.6, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LOMBRE, 3, false, false, false, "Jolly Pokémon", Type.WATER, Type.GRASS, 1.2, 32.5, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LUDICOLO, 3, false, false, false, "Carefree Pokémon", Type.WATER, Type.GRASS, 1.5, 55, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SEEDOT, 3, false, false, false, "Acorn Pokémon", Type.GRASS, null, 0.5, 4, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.NUZLEAF, 3, false, false, false, "Wily Pokémon", Type.GRASS, Type.DARK, 1, 28, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SHIFTRY, 3, false, false, false, "Wicked Pokémon", Type.GRASS, Type.DARK, 1.3, 59.6, Abilities.CHLOROPHYLL, Abilities.WIND_RIDER, Abilities.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.3, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SWELLOW, 3, false, false, false, "Swallow Pokémon", Type.NORMAL, Type.FLYING, 0.7, 19.8, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WINGULL, 3, false, false, false, "Seagull Pokémon", Type.WATER, Type.FLYING, 0.6, 9.5, Abilities.KEEN_EYE, Abilities.HYDRATION, Abilities.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PELIPPER, 3, false, false, false, "Water Bird Pokémon", Type.WATER, Type.FLYING, 1.2, 28, Abilities.KEEN_EYE, Abilities.DRIZZLE, Abilities.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RALTS, 3, false, false, false, "Feeling Pokémon", Type.PSYCHIC, Type.FAIRY, 0.4, 6.6, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KIRLIA, 3, false, false, false, "Emotion Pokémon", Type.PSYCHIC, Type.FAIRY, 0.8, 20.2, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.PIXILATE, Abilities.PIXILATE, Abilities.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259), - ), - new PokemonSpecies(Species.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", Type.BUG, Type.WATER, 0.5, 1.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", Type.BUG, Type.FLYING, 0.8, 3.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, null, 0.4, 4.5, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", Type.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", Type.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", Type.BUG, Type.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", Type.BUG, Type.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", Type.BUG, Type.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), - new PokemonSpecies(Species.WHISMUR, 3, false, false, false, "Whisper Pokémon", Type.NORMAL, null, 0.6, 16.3, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LOUDRED, 3, false, false, false, "Big Voice Pokémon", Type.NORMAL, null, 1, 40.5, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", Type.NORMAL, null, 1.5, 84, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MAKUHITA, 3, false, false, false, "Guts Pokémon", Type.FIGHTING, null, 1, 86.4, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(Species.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", Type.FIGHTING, null, 2.3, 253.8, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(Species.AZURILL, 3, false, false, false, "Polka Dot Pokémon", Type.NORMAL, Type.FAIRY, 0.2, 2, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.NOSEPASS, 3, false, false, false, "Compass Pokémon", Type.ROCK, null, 1, 97, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKITTY, 3, false, false, false, "Kitten Pokémon", Type.NORMAL, null, 0.6, 11, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.DELCATTY, 3, false, false, false, "Prim Pokémon", Type.NORMAL, null, 1.1, 32.6, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.SABLEYE, 3, false, false, false, "Darkness Pokémon", Type.DARK, Type.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DARK, Type.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, Type.GHOST, 0.5, 161, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133), - ), - new PokemonSpecies(Species.MAWILE, 3, false, false, false, "Deceiver Pokémon", Type.STEEL, Type.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.FAIRY, 1, 23.5, Abilities.HUGE_POWER, Abilities.HUGE_POWER, Abilities.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133), - ), - new PokemonSpecies(Species.ARON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.4, 60, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LAIRON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.9, 120, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.AGGRON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, null, 2.2, 395, Abilities.FILTER, Abilities.FILTER, Abilities.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265), - ), - new PokemonSpecies(Species.MEDITITE, 3, false, false, false, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 0.6, 11.2, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.MEDICHAM, 3, false, false, false, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true), - ), - new PokemonSpecies(Species.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.6, 15.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.MANECTRIC, 3, false, false, false, "Discharge Pokémon", Type.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, null, 1.8, 44, Abilities.INTIMIDATE, Abilities.INTIMIDATE, Abilities.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166), - ), - new PokemonSpecies(Species.PLUSLE, 3, false, false, false, "Cheering Pokémon", Type.ELECTRIC, null, 0.4, 4.2, Abilities.PLUS, Abilities.NONE, Abilities.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MINUN, 3, false, false, false, "Cheering Pokémon", Type.ELECTRIC, null, 0.4, 4.2, Abilities.MINUS, Abilities.NONE, Abilities.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VOLBEAT, 3, false, false, false, "Firefly Pokémon", Type.BUG, null, 0.7, 17.7, Abilities.ILLUMINATE, Abilities.SWARM, Abilities.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), - new PokemonSpecies(Species.ILLUMISE, 3, false, false, false, "Firefly Pokémon", Type.BUG, null, 0.6, 17.7, Abilities.OBLIVIOUS, Abilities.TINTED_LENS, Abilities.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), - new PokemonSpecies(Species.ROSELIA, 3, false, false, false, "Thorn Pokémon", Type.GRASS, Type.POISON, 0.3, 2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.GULPIN, 3, false, false, false, "Stomach Pokémon", Type.POISON, null, 0.4, 10.3, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(Species.SWALOT, 3, false, false, false, "Poison Bag Pokémon", Type.POISON, null, 1.7, 80, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(Species.CARVANHA, 3, false, false, false, "Savage Pokémon", Type.WATER, Type.DARK, 0.8, 20.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SHARPEDO, 3, false, false, false, "Brutal Pokémon", Type.WATER, Type.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.DARK, 2.5, 130.3, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161), - ), - new PokemonSpecies(Species.WAILMER, 3, false, false, false, "Ball Whale Pokémon", Type.WATER, null, 2, 130, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.WAILORD, 3, false, false, false, "Float Whale Pokémon", Type.WATER, null, 14.5, 398, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.NUMEL, 3, false, false, false, "Numb Pokémon", Type.FIRE, Type.GROUND, 0.7, 24, Abilities.OBLIVIOUS, Abilities.SIMPLE, Abilities.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CAMERUPT, 3, false, false, false, "Eruption Pokémon", Type.FIRE, Type.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.FIRE, Type.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIRE, Type.GROUND, 2.5, 320.5, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161), - ), - new PokemonSpecies(Species.TORKOAL, 3, false, false, false, "Coal Pokémon", Type.FIRE, null, 0.5, 80.4, Abilities.WHITE_SMOKE, Abilities.DROUGHT, Abilities.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SPOINK, 3, false, false, false, "Bounce Pokémon", Type.PSYCHIC, null, 0.7, 30.6, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", Type.PSYCHIC, null, 0.9, 71.5, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.SPINDA, 3, false, false, false, "Spot Panda Pokémon", Type.NORMAL, null, 1.1, 5, Abilities.OWN_TEMPO, Abilities.TANGLED_FEET, Abilities.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", Type.GROUND, null, 0.7, 15, Abilities.HYPER_CUTTER, Abilities.ARENA_TRAP, Abilities.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VIBRAVA, 3, false, false, false, "Vibration Pokémon", Type.GROUND, Type.DRAGON, 1.1, 15.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLYGON, 3, false, false, false, "Mystic Pokémon", Type.GROUND, Type.DRAGON, 2, 82, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CACNEA, 3, false, false, false, "Cactus Pokémon", Type.GRASS, null, 0.4, 51.3, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", Type.GRASS, Type.DARK, 1.3, 77.4, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", Type.NORMAL, Type.FLYING, 0.4, 1.2, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.ALTARIA, 3, false, false, false, "Humming Pokémon", Type.DRAGON, Type.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FAIRY, 1.5, 20.6, Abilities.PIXILATE, Abilities.NONE, Abilities.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172), - ), - new PokemonSpecies(Species.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", Type.NORMAL, null, 1.3, 40.3, Abilities.IMMUNITY, Abilities.NONE, Abilities.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", Type.POISON, null, 2.7, 52.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.LUNATONE, 3, false, false, false, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1, 168, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.SOLROCK, 3, false, false, false, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1.2, 154, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.BARBOACH, 3, false, false, false, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.4, 1.9, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WHISCASH, 3, false, false, false, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.9, 23.6, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CORPHISH, 3, false, false, false, "Ruffian Pokémon", Type.WATER, null, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", Type.WATER, Type.DARK, 1.1, 32.8, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BALTOY, 3, false, false, false, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 0.5, 21.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 1.5, 108, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.LILEEP, 3, false, false, false, "Sea Lily Pokémon", Type.ROCK, Type.GRASS, 1, 23.8, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.CRADILY, 3, false, false, false, "Barnacle Pokémon", Type.ROCK, Type.GRASS, 1.5, 60.4, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", Type.ROCK, Type.BUG, 0.7, 12.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.ARMALDO, 3, false, false, false, "Plate Pokémon", Type.ROCK, Type.BUG, 1.5, 68.2, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.FEEBAS, 3, false, false, false, "Fish Pokémon", Type.WATER, null, 0.6, 7.4, Abilities.SWIFT_SWIM, Abilities.OBLIVIOUS, Abilities.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.MILOTIC, 3, false, false, false, "Tender Pokémon", Type.WATER, null, 6.2, 162, Abilities.MARVEL_SCALE, Abilities.COMPETITIVE, Abilities.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.CASTFORM, 3, false, false, false, "Weather Pokémon", Type.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal Form", "", Type.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, false, null, true), - new PokemonForm("Sunny Form", "sunny", Type.FIRE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Rainy Form", "rainy", Type.WATER, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Snowy Form", "snowy", Type.ICE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - ), - new PokemonSpecies(Species.KECLEON, 3, false, false, false, "Color Swap Pokémon", Type.NORMAL, null, 1, 22, Abilities.COLOR_CHANGE, Abilities.NONE, Abilities.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SHUPPET, 3, false, false, false, "Puppet Pokémon", Type.GHOST, null, 0.6, 2.3, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.BANETTE, 3, false, false, false, "Marionette Pokémon", Type.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, null, 1.2, 13, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159), - ), - new PokemonSpecies(Species.DUSKULL, 3, false, false, false, "Requiem Pokémon", Type.GHOST, null, 0.8, 15, Abilities.LEVITATE, Abilities.NONE, Abilities.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", Type.GHOST, null, 1.6, 30.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TROPIUS, 3, false, false, false, "Fruit Pokémon", Type.GRASS, Type.FLYING, 2, 100, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", Type.PSYCHIC, null, 0.6, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ABSOL, 3, false, false, false, "Disaster Pokémon", Type.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, null, 1.2, 49, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163), - ), - new PokemonSpecies(Species.WYNAUT, 3, false, false, false, "Bright Pokémon", Type.PSYCHIC, null, 0.6, 14, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", Type.ICE, null, 0.7, 16.8, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GLALIE, 3, false, false, false, "Face Pokémon", Type.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ICE, null, 2.1, 350.2, Abilities.REFRIGERATE, Abilities.REFRIGERATE, Abilities.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168), - ), - new PokemonSpecies(Species.SPHEAL, 3, false, false, false, "Clap Pokémon", Type.ICE, Type.WATER, 0.8, 39.5, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SEALEO, 3, false, false, false, "Ball Roll Pokémon", Type.ICE, Type.WATER, 1.1, 87.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WALREIN, 3, false, false, false, "Ice Break Pokémon", Type.ICE, Type.WATER, 1.4, 150.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", Type.WATER, null, 0.4, 52.5, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", Type.WATER, null, 1.7, 27, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.GOREBYSS, 3, false, false, false, "South Sea Pokémon", Type.WATER, null, 1.8, 22.6, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.RELICANTH, 3, false, false, false, "Longevity Pokémon", Type.WATER, Type.ROCK, 1, 23.4, Abilities.SWIFT_SWIM, Abilities.ROCK_HEAD, Abilities.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), - new PokemonSpecies(Species.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", Type.WATER, null, 0.6, 8.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.BAGON, 3, false, false, false, "Rock Head Pokémon", Type.DRAGON, null, 0.6, 42.1, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SHELGON, 3, false, false, false, "Endurance Pokémon", Type.DRAGON, null, 1.1, 110.5, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SALAMENCE, 3, false, false, false, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FLYING, 1.8, 112.6, Abilities.AERILATE, Abilities.NONE, Abilities.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300), - ), - new PokemonSpecies(Species.BELDUM, 3, false, false, false, "Iron Ball Pokémon", Type.STEEL, Type.PSYCHIC, 0.6, 95.2, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax - new PokemonSpecies(Species.METANG, 3, false, false, false, "Iron Claw Pokémon", Type.STEEL, Type.PSYCHIC, 1.2, 202.5, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax - new PokemonSpecies(Species.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 10, 35, 300, GrowthRate.SLOW, null, false, true, //Custom Catchrate, matching Baxcalibur - new PokemonForm("Normal", "", Type.STEEL, Type.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 3, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.PSYCHIC, 2.5, 942.9, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300), - ), - new PokemonSpecies(Species.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", Type.ROCK, null, 1.7, 230, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGICE, 3, true, false, false, "Iceberg Pokémon", Type.ICE, null, 1.8, 175, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGISTEEL, 3, true, false, false, "Iron Pokémon", Type.STEEL, null, 1.9, 205, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LATIAS, 3, true, false, false, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.PSYCHIC, 1.8, 52, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300), - ), - new PokemonSpecies(Species.LATIOS, 3, true, false, false, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.PSYCHIC, 2.3, 70, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300), - ), - new PokemonSpecies(Species.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", Type.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", Type.WATER, null, 9.8, 430, Abilities.PRIMORDIAL_SEA, Abilities.NONE, Abilities.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335), - ), - new PokemonSpecies(Species.GROUDON, 3, false, true, false, "Continent Pokémon", Type.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", Type.GROUND, Type.FIRE, 5, 999.7, Abilities.DESOLATE_LAND, Abilities.NONE, Abilities.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335), - ), - new PokemonSpecies(Species.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", Type.DRAGON, Type.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FLYING, 10.8, 392, Abilities.DELTA_STREAM, Abilities.NONE, Abilities.NONE, 780, 105, 180, 100, 180, 100, 115, 45, 0, 340), - ), - new PokemonSpecies(Species.JIRACHI, 3, false, false, true, "Wish Pokémon", Type.STEEL, Type.PSYCHIC, 0.3, 1.1, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal Forme", "normal", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, false, "", true), - new PokemonForm("Attack Forme", "attack", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), - new PokemonForm("Defense Forme", "defense", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), - new PokemonForm("Speed Forme", "speed", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300), - ), - new PokemonSpecies(Species.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", Type.GRASS, null, 0.4, 10.2, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.GROTLE, 4, false, false, false, "Grove Pokémon", Type.GRASS, null, 1.1, 97, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", Type.GRASS, Type.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", Type.FIRE, null, 0.5, 6.2, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MONFERNO, 4, false, false, false, "Playful Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 22, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", Type.FIRE, Type.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.4, 5.2, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PRINPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.8, 23, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", Type.WATER, Type.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.STARLY, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STARAVIA, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15.5, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", Type.NORMAL, Type.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", Type.NORMAL, null, 0.5, 20, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.BIBAREL, 4, false, false, false, "Beaver Pokémon", Type.NORMAL, Type.WATER, 1, 31.5, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.KRICKETOT, 4, false, false, false, "Cricket Pokémon", Type.BUG, null, 0.3, 2.2, Abilities.SHED_SKIN, Abilities.NONE, Abilities.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", Type.BUG, null, 1, 25.5, Abilities.SWARM, Abilities.NONE, Abilities.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SHINX, 4, false, false, false, "Flash Pokémon", Type.ELECTRIC, null, 0.5, 9.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.LUXIO, 4, false, false, false, "Spark Pokémon", Type.ELECTRIC, null, 0.9, 30.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", Type.ELECTRIC, null, 1.4, 42, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BUDEW, 4, false, false, false, "Bud Pokémon", Type.GRASS, Type.POISON, 0.2, 1.2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ROSERADE, 4, false, false, false, "Bouquet Pokémon", Type.GRASS, Type.POISON, 0.9, 14.5, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", Type.ROCK, null, 0.9, 31.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", Type.ROCK, null, 1.6, 102.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.SHIELDON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 0.5, 57, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.BASTIODON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 1.3, 149.5, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.BURMY, 4, false, false, false, "Bagworm Pokémon", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Plant Cloak", "plant", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Trash Cloak", "trash", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - ), - new PokemonSpecies(Species.WORMADAM, 4, false, false, false, "Bagworm Pokémon", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Plant Cloak", "plant", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", Type.BUG, Type.GROUND, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, false, null, true), - new PokemonForm("Trash Cloak", "trash", Type.BUG, Type.STEEL, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true), - ), - new PokemonSpecies(Species.MOTHIM, 4, false, false, false, "Moth Pokémon", Type.BUG, Type.FLYING, 0.9, 23.3, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", Type.BUG, Type.FLYING, 0.3, 5.5, Abilities.HONEY_GATHER, Abilities.NONE, Abilities.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", Type.BUG, Type.FLYING, 1.2, 38.5, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", Type.ELECTRIC, null, 0.4, 3.9, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", Type.WATER, null, 0.7, 29.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", Type.WATER, null, 1.1, 33.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CHERUBI, 4, false, false, false, "Cherry Pokémon", Type.GRASS, null, 0.4, 3.3, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHERRIM, 4, false, false, false, "Blossom Pokémon", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Overcast Form", "overcast", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, false, null, true), - new PokemonForm("Sunshine Form", "sunshine", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), - ), - new PokemonSpecies(Species.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - new PokemonForm("West Sea", "west", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - ), - new PokemonSpecies(Species.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - new PokemonForm("West Sea", "west", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - ), - new PokemonSpecies(Species.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", Type.NORMAL, null, 1.2, 20.3, Abilities.TECHNICIAN, Abilities.PICKUP, Abilities.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.DRIFLOON, 4, false, false, false, "Balloon Pokémon", Type.GHOST, Type.FLYING, 0.4, 1.2, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", Type.GHOST, Type.FLYING, 1.2, 15, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BUNEARY, 4, false, false, false, "Rabbit Pokémon", Type.NORMAL, null, 0.4, 5.5, Abilities.RUN_AWAY, Abilities.KLUTZ, Abilities.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", Type.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FIGHTING, 1.3, 28.3, Abilities.SCRAPPY, Abilities.SCRAPPY, Abilities.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168), - ), - new PokemonSpecies(Species.MISMAGIUS, 4, false, false, false, "Magical Pokémon", Type.GHOST, null, 0.9, 4.4, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", Type.DARK, Type.FLYING, 0.9, 27.3, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLAMEOW, 4, false, false, false, "Catty Pokémon", Type.NORMAL, null, 0.5, 3.9, Abilities.LIMBER, Abilities.OWN_TEMPO, Abilities.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", Type.NORMAL, null, 1, 43.8, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CHINGLING, 4, false, false, false, "Bell Pokémon", Type.PSYCHIC, null, 0.2, 0.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.STUNKY, 4, false, false, false, "Skunk Pokémon", Type.POISON, Type.DARK, 0.4, 19.2, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKUNTANK, 4, false, false, false, "Skunk Pokémon", Type.POISON, Type.DARK, 1, 38, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BRONZOR, 4, false, false, false, "Bronze Pokémon", Type.STEEL, Type.PSYCHIC, 0.5, 60.5, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", Type.STEEL, Type.PSYCHIC, 1.3, 187, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.BONSLY, 4, false, false, false, "Bonsai Pokémon", Type.ROCK, null, 0.5, 15, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIME_JR, 4, false, false, false, "Mime Pokémon", Type.PSYCHIC, Type.FAIRY, 0.6, 13, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HAPPINY, 4, false, false, false, "Playhouse Pokémon", Type.NORMAL, null, 0.6, 24.4, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.CHATOT, 4, false, false, false, "Music Note Pokémon", Type.NORMAL, Type.FLYING, 0.5, 1.9, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", Type.GHOST, Type.DARK, 1, 108, Abilities.PRESSURE, Abilities.NONE, Abilities.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GIBLE, 4, false, false, false, "Land Shark Pokémon", Type.DRAGON, Type.GROUND, 0.7, 20.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GABITE, 4, false, false, false, "Cave Pokémon", Type.DRAGON, Type.GROUND, 1.4, 56, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GARCHOMP, 4, false, false, false, "Mach Pokémon", Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true), - ), - new PokemonSpecies(Species.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", Type.NORMAL, null, 0.6, 105, Abilities.PICKUP, Abilities.THICK_FAT, Abilities.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(Species.RIOLU, 4, false, false, false, "Emanation Pokémon", Type.FIGHTING, null, 0.7, 20.2, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LUCARIO, 4, false, false, false, "Aura Pokémon", Type.FIGHTING, Type.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIGHTING, Type.STEEL, 1.3, 57.5, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184), - ), - new PokemonSpecies(Species.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", Type.GROUND, null, 0.8, 49.5, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", Type.GROUND, null, 2, 300, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.SKORUPI, 4, false, false, false, "Scorpion Pokémon", Type.POISON, Type.BUG, 0.8, 12, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", Type.POISON, Type.DARK, 1.3, 61.5, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 0.7, 23, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 1.3, 44.4, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", Type.GRASS, null, 1.4, 27, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FINNEON, 4, false, false, false, "Wing Fish Pokémon", Type.WATER, null, 0.4, 7, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.LUMINEON, 4, false, false, false, "Neon Pokémon", Type.WATER, null, 1.2, 24, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.MANTYKE, 4, false, false, false, "Kite Pokémon", Type.WATER, Type.FLYING, 1, 65, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SNOVER, 4, false, false, false, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 1, 50.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.GRASS, Type.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.ICE, 2.7, 185, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true), - ), - new PokemonSpecies(Species.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 1.1, 34, Abilities.PRESSURE, Abilities.NONE, Abilities.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", Type.ELECTRIC, Type.STEEL, 1.2, 180, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.LICKILICKY, 4, false, false, false, "Licking Pokémon", Type.NORMAL, null, 1.7, 140, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RHYPERIOR, 4, false, false, false, "Drill Pokémon", Type.GROUND, Type.ROCK, 2.4, 282.8, Abilities.LIGHTNING_ROD, Abilities.SOLID_ROCK, Abilities.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.TANGROWTH, 4, false, false, false, "Vine Pokémon", Type.GRASS, null, 2, 128.6, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", Type.ELECTRIC, null, 1.8, 138.6, Abilities.MOTOR_DRIVE, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGMORTAR, 4, false, false, false, "Blast Pokémon", Type.FIRE, null, 1.6, 68, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", Type.FAIRY, Type.FLYING, 1.5, 38, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", Type.BUG, Type.FLYING, 1.9, 51.5, Abilities.SPEED_BOOST, Abilities.TINTED_LENS, Abilities.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LEAFEON, 4, false, false, false, "Verdant Pokémon", Type.GRASS, null, 1, 25.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", Type.ICE, null, 0.8, 25.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", Type.GROUND, Type.FLYING, 2, 42.5, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", Type.ICE, Type.GROUND, 2.5, 291, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.9, 34, Abilities.ADAPTABILITY, Abilities.DOWNLOAD, Abilities.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.GALLADE, 4, false, false, false, "Blade Pokémon", Type.PSYCHIC, Type.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, Type.FIGHTING, 1.6, 56.4, Abilities.SHARPNESS, Abilities.SHARPNESS, Abilities.SHARPNESS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), - ), - new PokemonSpecies(Species.PROBOPASS, 4, false, false, false, "Compass Pokémon", Type.ROCK, Type.STEEL, 1.4, 340, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", Type.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", Type.ICE, Type.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), - new PokemonForm("Heat", "heat", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Wash", "wash", Type.ELECTRIC, Type.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Frost", "frost", Type.ELECTRIC, Type.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Fan", "fan", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Mow", "mow", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - ), - new PokemonSpecies(Species.UXIE, 4, true, false, false, "Knowledge Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MESPRIT, 4, true, false, false, "Emotion Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.AZELF, 4, true, false, false, "Willpower Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DIALGA, 4, false, true, false, "Temporal Pokémon", Type.STEEL, Type.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.STEEL, Type.DRAGON, 7, 848.7, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340), - ), - new PokemonSpecies(Species.PALKIA, 4, false, true, false, "Spatial Pokémon", Type.WATER, Type.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.WATER, Type.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.WATER, Type.DRAGON, 6.3, 659, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), - ), - new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), - ), - new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", Type.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", Type.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false, true, - new PokemonForm("Land Forme", "land", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, false, null, true), - new PokemonForm("Sky Forme", "sky", Type.GRASS, Type.FLYING, 0.4, 5.2, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 300), - ), - new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "normal", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), - new PokemonForm("Fighting", "fighting", Type.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Flying", "flying", Type.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Poison", "poison", Type.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ground", "ground", Type.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Rock", "rock", Type.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Bug", "bug", Type.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ghost", "ghost", Type.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Steel", "steel", Type.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Fire", "fire", Type.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Water", "water", Type.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Grass", "grass", Type.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Electric", "electric", Type.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Psychic", "psychic", Type.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ice", "ice", Type.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), - ), - new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TEPIG, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, null, 0.5, 9.9, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1, 55.5, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", Type.WATER, null, 0.5, 5.9, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DEWOTT, 5, false, false, false, "Discipline Pokémon", Type.WATER, null, 0.8, 24.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", Type.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PATRAT, 5, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.5, 11.6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WATCHOG, 5, false, false, false, "Lookout Pokémon", Type.NORMAL, null, 1.1, 27, Abilities.ILLUMINATE, Abilities.KEEN_EYE, Abilities.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LILLIPUP, 5, false, false, false, "Puppy Pokémon", Type.NORMAL, null, 0.4, 4.1, Abilities.VITAL_SPIRIT, Abilities.PICKUP, Abilities.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", Type.NORMAL, null, 0.9, 14.7, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", Type.NORMAL, null, 1.2, 61, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PURRLOIN, 5, false, false, false, "Devious Pokémon", Type.DARK, null, 0.4, 10.1, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LIEPARD, 5, false, false, false, "Cruel Pokémon", Type.DARK, null, 1.1, 37.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", Type.GRASS, null, 0.6, 10.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", Type.GRASS, null, 1.1, 30.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PANSEAR, 5, false, false, false, "High Temp Pokémon", Type.FIRE, null, 0.6, 11, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMISEAR, 5, false, false, false, "Ember Pokémon", Type.FIRE, null, 1, 28, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PANPOUR, 5, false, false, false, "Spray Pokémon", Type.WATER, null, 0.6, 13.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", Type.WATER, null, 1, 29, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.MUNNA, 5, false, false, false, "Dream Eater Pokémon", Type.PSYCHIC, null, 0.6, 23.3, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", Type.PSYCHIC, null, 1.1, 60.5, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.1, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.UNFEZANT, 5, false, false, false, "Proud Pokémon", Type.NORMAL, Type.FLYING, 1.2, 29, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BLITZLE, 5, false, false, false, "Electrified Pokémon", Type.ELECTRIC, null, 0.8, 29.8, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", Type.ELECTRIC, null, 1.6, 79.5, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", Type.ROCK, null, 0.4, 18, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.BOLDORE, 5, false, false, false, "Ore Pokémon", Type.ROCK, null, 0.9, 102, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GIGALITH, 5, false, false, false, "Compressed Pokémon", Type.ROCK, null, 1.7, 260, Abilities.STURDY, Abilities.SAND_STREAM, Abilities.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WOOBAT, 5, false, false, false, "Bat Pokémon", Type.PSYCHIC, Type.FLYING, 0.4, 2.1, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWOOBAT, 5, false, false, false, "Courting Pokémon", Type.PSYCHIC, Type.FLYING, 0.9, 10.5, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRILBUR, 5, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.3, 8.5, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", Type.GROUND, Type.STEEL, 0.7, 40.4, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AUDINO, 5, false, false, false, "Hearing Pokémon", Type.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FAIRY, 1.5, 32, Abilities.REGENERATOR, Abilities.REGENERATOR, Abilities.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390), //Custom Ability, base form Hidden Ability - ), - new PokemonSpecies(Species.TIMBURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 0.6, 12.5, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.GURDURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 1.2, 40, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.CONKELDURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 1.4, 87, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", Type.WATER, null, 0.5, 4.5, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PALPITOAD, 5, false, false, false, "Vibration Pokémon", Type.WATER, Type.GROUND, 0.8, 17, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", Type.WATER, Type.GROUND, 1.5, 62, Abilities.SWIFT_SWIM, Abilities.POISON_TOUCH, Abilities.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.THROH, 5, false, false, false, "Judo Pokémon", Type.FIGHTING, null, 1.3, 55.5, Abilities.GUTS, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SAWK, 5, false, false, false, "Karate Pokémon", Type.FIGHTING, null, 1.4, 51, Abilities.STURDY, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SEWADDLE, 5, false, false, false, "Sewing Pokémon", Type.BUG, Type.GRASS, 0.3, 2.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", Type.BUG, Type.GRASS, 0.5, 7.3, Abilities.LEAF_GUARD, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", Type.BUG, Type.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VENIPEDE, 5, false, false, false, "Centipede Pokémon", Type.BUG, Type.POISON, 0.4, 5.3, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", Type.BUG, Type.POISON, 1.2, 58.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", Type.BUG, Type.POISON, 2.5, 200.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", Type.GRASS, Type.FAIRY, 0.3, 0.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", Type.GRASS, Type.FAIRY, 0.7, 6.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PETILIL, 5, false, false, false, "Bulb Pokémon", Type.GRASS, null, 0.5, 6.6, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.LILLIGANT, 5, false, false, false, "Flowering Pokémon", Type.GRASS, null, 1.1, 16.3, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.BASCULIN, 5, false, false, false, "Hostile Pokémon", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Red-Striped Form", "red-striped", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - new PokemonForm("Blue-Striped Form", "blue-striped", Type.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - new PokemonForm("White-Striped Form", "white-striped", Type.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - ), - new PokemonSpecies(Species.SANDILE, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 0.7, 15.2, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 1, 33.4, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", Type.GROUND, Type.DARK, 1.5, 96.3, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", Type.FIRE, null, 0.6, 37.5, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DARMANITAN, 5, false, false, false, "Blazing Pokémon", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", Type.FIRE, Type.PSYCHIC, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189), - ), - new PokemonSpecies(Species.MARACTUS, 5, false, false, false, "Cactus Pokémon", Type.GRASS, null, 1, 28, Abilities.WATER_ABSORB, Abilities.CHLOROPHYLL, Abilities.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", Type.BUG, Type.ROCK, 0.3, 14.5, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", Type.BUG, Type.ROCK, 1.4, 200, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCRAGGY, 5, false, false, false, "Shedding Pokémon", Type.DARK, Type.FIGHTING, 0.6, 11.8, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", Type.DARK, Type.FIGHTING, 1.1, 30, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", Type.PSYCHIC, Type.FLYING, 1.4, 14, Abilities.WONDER_SKIN, Abilities.MAGIC_GUARD, Abilities.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.YAMASK, 5, false, false, false, "Spirit Pokémon", Type.GHOST, null, 0.5, 1.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", Type.GHOST, null, 1.7, 76.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 0.7, 16.5, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 1.2, 81, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.WIMP_OUT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", Type.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, Type.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), - ), - new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", Type.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", Type.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", Type.NORMAL, null, 0.4, 5.8, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CINCCINO, 5, false, false, false, "Scarf Pokémon", Type.NORMAL, null, 0.5, 7.5, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GOTHITA, 5, false, false, false, "Fixation Pokémon", Type.PSYCHIC, null, 0.4, 5.8, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", Type.PSYCHIC, null, 0.7, 18, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", Type.PSYCHIC, null, 1.5, 44, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.SOLOSIS, 5, false, false, false, "Cell Pokémon", Type.PSYCHIC, null, 0.3, 1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DUOSION, 5, false, false, false, "Mitosis Pokémon", Type.PSYCHIC, null, 0.6, 8, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", Type.PSYCHIC, null, 1, 20.1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", Type.WATER, Type.FLYING, 0.5, 5.5, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWANNA, 5, false, false, false, "White Bird Pokémon", Type.WATER, Type.FLYING, 1.3, 24.2, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", Type.ICE, null, 0.4, 5.7, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", Type.ICE, null, 1.1, 41, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", Type.ICE, null, 1.3, 57.5, Abilities.ICE_BODY, Abilities.SNOW_WARNING, Abilities.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DEERLING, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - ), - new PokemonSpecies(Species.SAWSBUCK, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - ), - new PokemonSpecies(Species.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", Type.ELECTRIC, Type.FLYING, 0.4, 5, Abilities.STATIC, Abilities.NONE, Abilities.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KARRABLAST, 5, false, false, false, "Clamping Pokémon", Type.BUG, null, 0.5, 5.9, Abilities.SWARM, Abilities.SHED_SKIN, Abilities.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", Type.BUG, Type.STEEL, 1, 33, Abilities.SWARM, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FOONGUS, 5, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.2, 1, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.6, 10.5, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FRILLISH, 5, false, false, false, "Floating Pokémon", Type.WATER, Type.GHOST, 1.2, 33, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.JELLICENT, 5, false, false, false, "Floating Pokémon", Type.WATER, Type.GHOST, 2.2, 135, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", Type.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", Type.BUG, Type.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", Type.BUG, Type.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", Type.GRASS, Type.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.KLINKLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 81, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.TYNAMO, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 0.2, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 1.2, 22, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ELGYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 0.5, 9, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 1, 34.5, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LITWICK, 5, false, false, false, "Candle Pokémon", Type.GHOST, Type.FIRE, 0.3, 3.1, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LAMPENT, 5, false, false, false, "Lamp Pokémon", Type.GHOST, Type.FIRE, 0.6, 13, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CHANDELURE, 5, false, false, false, "Luring Pokémon", Type.GHOST, Type.FIRE, 1, 34.3, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AXEW, 5, false, false, false, "Tusk Pokémon", Type.DRAGON, null, 0.6, 18, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", Type.DRAGON, null, 1, 36, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", Type.DRAGON, null, 1.8, 105.5, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CUBCHOO, 5, false, false, false, "Chill Pokémon", Type.ICE, null, 0.5, 8.5, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEARTIC, 5, false, false, false, "Freezing Pokémon", Type.ICE, null, 2.6, 260, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", Type.ICE, null, 1.1, 148, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.SHELMET, 5, false, false, false, "Snail Pokémon", Type.BUG, null, 0.4, 7.7, Abilities.HYDRATION, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", Type.BUG, null, 0.8, 25.3, Abilities.HYDRATION, Abilities.STICKY_HOLD, Abilities.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.STUNFISK, 5, false, false, false, "Trap Pokémon", Type.GROUND, Type.ELECTRIC, 0.7, 11, Abilities.STATIC, Abilities.LIMBER, Abilities.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", Type.FIGHTING, null, 0.9, 20, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", Type.FIGHTING, null, 1.4, 35.5, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DRUDDIGON, 5, false, false, false, "Cave Pokémon", Type.DRAGON, null, 1.6, 139, Abilities.ROUGH_SKIN, Abilities.SHEER_FORCE, Abilities.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLETT, 5, false, false, false, "Automaton Pokémon", Type.GROUND, Type.GHOST, 1, 92, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.GOLURK, 5, false, false, false, "Automaton Pokémon", Type.GROUND, Type.GHOST, 2.8, 330, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", Type.DARK, Type.STEEL, 0.5, 10.2, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BISHARP, 5, false, false, false, "Sword Blade Pokémon", Type.DARK, Type.STEEL, 1.6, 70, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", Type.NORMAL, null, 1.6, 94.6, Abilities.RECKLESS, Abilities.SAP_SIPPER, Abilities.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RUFFLET, 5, false, false, false, "Eaglet Pokémon", Type.NORMAL, Type.FLYING, 0.5, 10.5, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.BRAVIARY, 5, false, false, false, "Valiant Pokémon", Type.NORMAL, Type.FLYING, 1.5, 41, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.VULLABY, 5, false, false, false, "Diapered Pokémon", Type.DARK, Type.FLYING, 0.5, 9, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", Type.DARK, Type.FLYING, 1.2, 39.5, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HEATMOR, 5, false, false, false, "Anteater Pokémon", Type.FIRE, null, 1.4, 58, Abilities.GLUTTONY, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DURANT, 5, false, false, false, "Iron Ant Pokémon", Type.BUG, Type.STEEL, 0.3, 33, Abilities.SWARM, Abilities.HUSTLE, Abilities.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEINO, 5, false, false, false, "Irate Pokémon", Type.DARK, Type.DRAGON, 0.8, 17.3, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", Type.DARK, Type.DRAGON, 1.4, 50, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HYDREIGON, 5, false, false, false, "Brutal Pokémon", Type.DARK, Type.DRAGON, 1.8, 160, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LARVESTA, 5, false, false, false, "Torch Pokémon", Type.BUG, Type.FIRE, 1.1, 28.8, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VOLCARONA, 5, false, false, false, "Sun Pokémon", Type.BUG, Type.FIRE, 1.6, 46, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.COBALION, 5, true, false, false, "Iron Will Pokémon", Type.STEEL, Type.FIGHTING, 2.1, 250, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TERRAKION, 5, true, false, false, "Cavern Pokémon", Type.ROCK, Type.FIGHTING, 1.9, 260, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.VIRIZION, 5, true, false, false, "Grassland Pokémon", Type.GRASS, Type.FIGHTING, 2, 200, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TORNADUS, 5, true, false, false, "Cyclone Pokémon", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.FLYING, null, 1.4, 63, Abilities.REGENERATOR, Abilities.NONE, Abilities.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), - ), - new PokemonSpecies(Species.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.ELECTRIC, Type.FLYING, 3, 61, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), - ), - new PokemonSpecies(Species.RESHIRAM, 5, false, true, false, "Vast White Pokémon", Type.DRAGON, Type.FIRE, 3.2, 330, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZEKROM, 5, false, true, false, "Deep Black Pokémon", Type.DRAGON, Type.ELECTRIC, 2.9, 345, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LANDORUS, 5, true, false, false, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.GROUND, Type.FLYING, 1.3, 68, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), - ), - new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), - new PokemonForm("Black", "black", Type.DRAGON, Type.ICE, 3.3, 325, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), - new PokemonForm("White", "white", Type.DRAGON, Type.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350), - ), - new PokemonSpecies(Species.KELDEO, 5, false, false, true, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, - new PokemonForm("Ordinary Form", "ordinary", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), - new PokemonForm("Resolute", "resolute", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), - ), - new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, false, null, true), - new PokemonForm("Pirouette Forme", "pirouette", Type.NORMAL, Type.FIGHTING, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 300, false, null, true), - ), - new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), - new PokemonForm("Shock Drive", "shock", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Burn Drive", "burn", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Chill Drive", "chill", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Douse Drive", "douse", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - ), - new PokemonSpecies(Species.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", Type.GRASS, null, 0.4, 9, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, null, 0.7, 29, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FENNEKIN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 0.4, 9.4, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), - ), - new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), - ), - new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), - new PokemonForm("Ash", "ash", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), - ), - new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, Type.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.7, Abilities.BIG_PECKS, Abilities.NONE, Abilities.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLETCHINDER, 6, false, false, false, "Ember Pokémon", Type.FIRE, Type.FLYING, 0.7, 16, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TALONFLAME, 6, false, false, false, "Scorching Pokémon", Type.FIRE, Type.FLYING, 1.2, 24.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - ), - new PokemonSpecies(Species.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.SHED_SKIN, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - ), - new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("River Pattern", "river", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - ), - new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", Type.FIRE, Type.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), - new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", Type.FIRE, Type.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), - new PokemonSpecies(Species.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - ), - new PokemonSpecies(Species.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - ), - new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - ), - new PokemonSpecies(Species.SKIDDO, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 0.9, 31, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOGOAT, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 1.7, 91, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANCHAM, 6, false, false, false, "Playful Pokémon", Type.FIGHTING, null, 0.6, 8, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANGORO, 6, false, false, false, "Daunting Pokémon", Type.FIGHTING, Type.DARK, 2.1, 136, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FURFROU, 6, false, false, false, "Poodle Pokémon", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Natural Form", "", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Heart Trim", "heart", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Star Trim", "star", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Diamond Trim", "diamond", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Debutante Trim", "debutante", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Matron Trim", "matron", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Dandy Trim", "dandy", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("La Reine Trim", "la-reine", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Kabuki Trim", "kabuki", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Pharaoh Trim", "pharaoh", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - ), - new PokemonSpecies(Species.ESPURR, 6, false, false, false, "Restraint Pokémon", Type.PSYCHIC, null, 0.3, 3.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), - new PokemonForm("Female", "female", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), - ), - new PokemonSpecies(Species.HONEDGE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 2, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DOUBLADE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 4.5, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Shield Forme", "shield", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), - new PokemonForm("Blade Forme", "blade", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), - ), - new PokemonSpecies(Species.SPRITZEE, 6, false, false, false, "Perfume Pokémon", Type.FAIRY, null, 0.2, 0.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", Type.FAIRY, null, 0.8, 15.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", Type.FAIRY, null, 0.4, 3.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLURPUFF, 6, false, false, false, "Meringue Pokémon", Type.FAIRY, null, 0.8, 5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.INKAY, 6, false, false, false, "Revolving Pokémon", Type.DARK, Type.PSYCHIC, 0.4, 3.5, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MALAMAR, 6, false, false, false, "Overturning Pokémon", Type.DARK, Type.PSYCHIC, 1.5, 47, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BINACLE, 6, false, false, false, "Two-Handed Pokémon", Type.ROCK, Type.WATER, 0.5, 31, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BARBARACLE, 6, false, false, false, "Collective Pokémon", Type.ROCK, Type.WATER, 1.3, 96, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", Type.POISON, Type.WATER, 0.5, 7.3, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", Type.POISON, Type.DRAGON, 1.8, 81.5, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", Type.WATER, null, 0.5, 8.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", Type.WATER, null, 1.3, 35.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HELIOPTILE, 6, false, false, false, "Generator Pokémon", Type.ELECTRIC, Type.NORMAL, 0.5, 6, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HELIOLISK, 6, false, false, false, "Generator Pokémon", Type.ELECTRIC, Type.NORMAL, 1, 21, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", Type.ROCK, Type.DRAGON, 0.8, 26, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.TYRANTRUM, 6, false, false, false, "Despot Pokémon", Type.ROCK, Type.DRAGON, 2.5, 270, Abilities.STRONG_JAW, Abilities.NONE, Abilities.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AMAURA, 6, false, false, false, "Tundra Pokémon", Type.ROCK, Type.ICE, 1.3, 25.2, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AURORUS, 6, false, false, false, "Tundra Pokémon", Type.ROCK, Type.ICE, 2.7, 225, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SYLVEON, 6, false, false, false, "Intertwining Pokémon", Type.FAIRY, null, 1, 23.5, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", Type.FIGHTING, Type.FLYING, 0.8, 21.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEDENNE, 6, false, false, false, "Antenna Pokémon", Type.ELECTRIC, Type.FAIRY, 0.2, 2.2, Abilities.CHEEK_POUCH, Abilities.PICKUP, Abilities.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CARBINK, 6, false, false, false, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.3, 5.7, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", Type.DRAGON, null, 0.3, 2.8, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", Type.DRAGON, null, 0.8, 17.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GOODRA, 6, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 2, 150.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KLEFKI, 6, false, false, false, "Key Ring Pokémon", Type.STEEL, Type.FAIRY, 0.2, 3, Abilities.PRANKSTER, Abilities.NONE, Abilities.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.PHANTUMP, 6, false, false, false, "Stump Pokémon", Type.GHOST, Type.GRASS, 0.4, 7, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", Type.GHOST, Type.GRASS, 1.5, 71, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), - new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.3, 3.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, "", true), - new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 0.5, 7.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, "", true), - new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 0.8, 15, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true), - ), - new PokemonSpecies(Species.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, false, null, true), - new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.7, 9.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 55, 85, 122, 58, 75, 99, 60, 50, 173, false, "", true), - new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 1.1, 14, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 75, 95, 122, 58, 75, 69, 60, 50, 173, false, "", true), - new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 1.7, 39, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true), - ), - new PokemonSpecies(Species.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", Type.ICE, null, 1, 99.5, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AVALUGG, 6, false, false, false, "Iceberg Pokémon", Type.ICE, null, 2, 505, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 0.5, 8, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 1.5, 85, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.XERNEAS, 6, false, true, false, "Life Pokémon", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Neutral Mode", "neutral", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), - new PokemonForm("Active Mode", "active", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) - ), - new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, null, true), - new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme Power Construct", "10-pc", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, "10", true), - new PokemonForm("Complete Forme (50% PC)", "complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354), - new PokemonForm("Complete Forme (10% PC)", "10-complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete"), - ), - new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.FAIRY, 1.1, 27.8, Abilities.MAGIC_BOUNCE, Abilities.NONE, Abilities.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), - ), - new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hoopa Confined", "", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, false, null, true), - new PokemonForm("Hoopa Unbound", "unbound", Type.PSYCHIC, Type.DARK, 6.5, 490, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340), - ), - new PokemonSpecies(Species.VOLCANION, 6, false, false, true, "Steam Pokémon", Type.FIRE, Type.WATER, 1.7, 195, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ROWLET, 7, false, false, false, "Grass Quill Pokémon", Type.GRASS, Type.FLYING, 0.3, 1.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", Type.GRASS, Type.FLYING, 0.7, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", Type.GRASS, Type.GHOST, 1.6, 36.6, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LITTEN, 7, false, false, false, "Fire Cat Pokémon", Type.FIRE, null, 0.4, 4.3, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", Type.FIRE, null, 0.7, 25, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INCINEROAR, 7, false, false, false, "Heel Pokémon", Type.FIRE, Type.DARK, 1.8, 83, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", Type.WATER, null, 0.4, 7.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BRIONNE, 7, false, false, false, "Pop Star Pokémon", Type.WATER, null, 0.6, 17.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PRIMARINA, 7, false, false, false, "Soloist Pokémon", Type.WATER, Type.FAIRY, 1.8, 44, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.2, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", Type.NORMAL, Type.FLYING, 0.6, 14.8, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", Type.NORMAL, Type.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.YUNGOOS, 7, false, false, false, "Loitering Pokémon", Type.NORMAL, null, 0.4, 6, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", Type.NORMAL, null, 0.7, 14.2, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GRUBBIN, 7, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 4.4, Abilities.SWARM, Abilities.NONE, Abilities.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHARJABUG, 7, false, false, false, "Battery Pokémon", Type.BUG, Type.ELECTRIC, 0.5, 10.5, Abilities.BATTERY, Abilities.NONE, Abilities.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", Type.BUG, Type.ELECTRIC, 1.5, 45, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", Type.FIGHTING, null, 0.6, 7, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", Type.FIGHTING, Type.ICE, 1.7, 180, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ORICORIO, 7, false, false, false, "Dancing Pokémon", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, - new PokemonForm("Baile Style", "baile", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), - new PokemonForm("Pom-Pom Style", "pompom", Type.ELECTRIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Pau Style", "pau", Type.PSYCHIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Sensu Style", "sensu", Type.GHOST, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - ), - new PokemonSpecies(Species.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.1, 0.2, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.2, 0.5, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), - new PokemonForm("Own Tempo", "own-tempo", Type.ROCK, null, 0.5, 9.2, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), - ), - new PokemonSpecies(Species.LYCANROC, 7, false, false, false, "Wolf Pokémon", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Midday Form", "midday", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), - new PokemonForm("Midnight Form", "midnight", Type.ROCK, null, 1.1, 25, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.NO_GUARD, 487, 85, 115, 75, 55, 75, 82, 90, 50, 170, false, null, true), - new PokemonForm("Dusk Form", "dusk", Type.ROCK, null, 0.8, 25, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true), - ), - new PokemonSpecies(Species.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, - new PokemonForm("Solo Form", "", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), - new PokemonForm("School", "school", Type.WATER, null, 8.2, 78.6, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217), - ), - new PokemonSpecies(Species.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.4, 8, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.7, 14.5, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUDBRAY, 7, false, false, false, "Donkey Pokémon", Type.GROUND, null, 1, 110, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", Type.GROUND, null, 2.5, 920, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", Type.WATER, Type.BUG, 0.3, 4, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", Type.WATER, Type.BUG, 1.8, 82, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", Type.GRASS, null, 0.3, 1.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", Type.GRASS, null, 0.9, 18.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MORELULL, 7, false, false, false, "Illuminating Pokémon", Type.GRASS, Type.FAIRY, 0.2, 1.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", Type.GRASS, Type.FAIRY, 1, 11.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", Type.POISON, Type.FIRE, 0.6, 4.8, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", Type.POISON, Type.FIRE, 1.2, 22.2, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.STUFFUL, 7, false, false, false, "Flailing Pokémon", Type.NORMAL, Type.FIGHTING, 0.5, 6.8, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", Type.NORMAL, Type.FIGHTING, 2.1, 135, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 0.3, 3.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.STEENEE, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 0.7, 8.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TSAREENA, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 1.2, 21.4, Abilities.LEAF_GUARD, Abilities.QUEENLY_MAJESTY, Abilities.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.COMFEY, 7, false, false, false, "Posy Picker Pokémon", Type.FAIRY, null, 0.1, 0.3, Abilities.FLOWER_VEIL, Abilities.TRIAGE, Abilities.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.ORANGURU, 7, false, false, false, "Sage Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 76, Abilities.INNER_FOCUS, Abilities.TELEPATHY, Abilities.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", Type.FIGHTING, null, 2, 82.8, Abilities.RECEIVER, Abilities.NONE, Abilities.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", Type.BUG, Type.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", Type.BUG, Type.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(Species.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", Type.GHOST, Type.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", Type.GHOST, Type.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", Type.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SILVALLY, 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, - new PokemonForm("Type: Normal", "normal", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, "", true), - new PokemonForm("Type: Fighting", "fighting", Type.FIGHTING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Flying", "flying", Type.FLYING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Poison", "poison", Type.POISON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ground", "ground", Type.GROUND, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Rock", "rock", Type.ROCK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Bug", "bug", Type.BUG, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ghost", "ghost", Type.GHOST, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Steel", "steel", Type.STEEL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fire", "fire", Type.FIRE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Water", "water", Type.WATER, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Grass", "grass", Type.GRASS, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Electric", "electric", Type.ELECTRIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Psychic", "psychic", Type.PSYCHIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ice", "ice", Type.ICE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dragon", "dragon", Type.DRAGON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dark", "dark", Type.DARK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fairy", "fairy", Type.FAIRY, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - ), - new PokemonSpecies(Species.MINIOR, 7, false, false, false, "Meteor Pokémon", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, - new PokemonForm("Red Meteor Form", "red-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Orange Meteor Form", "orange-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Yellow Meteor Form", "yellow-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Green Meteor Form", "green-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Blue Meteor Form", "blue-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Indigo Meteor Form", "indigo-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Violet Meteor Form", "violet-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Red Core Form", "red", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Orange Core Form", "orange", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Yellow Core Form", "yellow", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Green Core Form", "green", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Blue Core Form", "blue", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Indigo Core Form", "indigo", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Violet Core Form", "violet", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - ), - new PokemonSpecies(Species.KOMALA, 7, false, false, false, "Drowsing Pokémon", Type.NORMAL, null, 0.4, 19.9, Abilities.COMATOSE, Abilities.NONE, Abilities.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", Type.FIRE, Type.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), - new PokemonForm("Busted Form", "busted", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), - ), - new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", Type.WATER, Type.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRAMPA, 7, false, false, false, "Placid Pokémon", Type.NORMAL, Type.DRAGON, 3, 185, Abilities.BERSERK, Abilities.SAP_SIPPER, Abilities.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", Type.GHOST, Type.GRASS, 3.9, 210, Abilities.STEELWORKER, Abilities.NONE, Abilities.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.JANGMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, null, 0.6, 29.7, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, Type.FIGHTING, 1.2, 47, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KOMMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, Type.FIGHTING, 1.6, 78.2, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", Type.ELECTRIC, Type.FAIRY, 1.8, 20.5, Abilities.ELECTRIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", Type.PSYCHIC, Type.FAIRY, 1.2, 18.6, Abilities.PSYCHIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", Type.GRASS, Type.FAIRY, 1.9, 45.5, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", Type.WATER, Type.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", Type.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", Type.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", Type.PSYCHIC, Type.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", Type.PSYCHIC, Type.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", Type.ROCK, Type.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", Type.BUG, Type.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", Type.BUG, Type.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.XURKITREE, 7, true, false, false, "Glowing Pokémon", Type.ELECTRIC, null, 3.8, 100, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CELESTEELA, 7, true, false, false, "Launch Pokémon", Type.STEEL, Type.FLYING, 9.2, 999.9, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", Type.GRASS, Type.STEEL, 0.3, 0.1, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", Type.DARK, Type.DRAGON, 5.5, 888, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NECROZMA, 7, false, true, false, "Prism Pokémon", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, false, null, true), - new PokemonForm("Dusk Mane", "dusk-mane", Type.PSYCHIC, Type.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 340), - new PokemonForm("Dawn Wings", "dawn-wings", Type.PSYCHIC, Type.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 340), - new PokemonForm("Ultra", "ultra", Type.PSYCHIC, Type.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 377), - ), - new PokemonSpecies(Species.MAGEARNA, 7, false, false, true, "Artificial Pokémon", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - new PokemonForm("Original", "original", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) - ), - new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.STAKATAKA, 7, true, false, false, "Rampart Pokémon", Type.ROCK, Type.STEEL, 5.5, 820, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", Type.FIRE, Type.GHOST, 1.8, 13, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", Type.ELECTRIC, null, 1.5, 44.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), - ), - new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", Type.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", Type.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), - ), - new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), - ), - new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), - ), - new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", Type.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", Type.FLYING, null, 0.2, 1.8, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", Type.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), - ), - new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), - ), - new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", Type.GRASS, null, 0.4, 2.2, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", Type.GRASS, null, 0.5, 2.5, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WOOLOO, 8, false, false, false, "Sheep Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.FLUFFY, Abilities.RUN_AWAY, Abilities.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUBWOOL, 8, false, false, false, "Sheep Pokémon", Type.NORMAL, null, 1.3, 43, Abilities.FLUFFY, Abilities.STEADFAST, Abilities.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", Type.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), - ), - new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", Type.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", Type.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ROLYCOLY, 8, false, false, false, "Coal Pokémon", Type.ROCK, null, 0.3, 12, Abilities.STEAM_ENGINE, Abilities.HEATPROOF, Abilities.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), - ), - new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", Type.GRASS, Type.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), - ), - new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), - ), - new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), - ), - new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), - new PokemonForm("Gulping Form", "gulping", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - new PokemonForm("Gorging Form", "gorging", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - ), - new PokemonSpecies(Species.ARROKUDA, 8, false, false, false, "Rush Pokémon", Type.WATER, null, 0.5, 1, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", Type.WATER, null, 1.3, 30, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TOXEL, 8, false, false, false, "Baby Pokémon", Type.ELECTRIC, Type.POISON, 0.4, 11, Abilities.RATTLED, Abilities.STATIC, Abilities.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Amped Form", "amped", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), - new PokemonForm("Low-Key Form", "lowkey", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 999.9, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), - ), - new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), - ), - new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", Type.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true), - ), - new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), - ), - new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 999.9, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), - ), - new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", Type.DARK, Type.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", Type.DARK, Type.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, - new PokemonForm("Normal", "", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 999.9, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), - ), - new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", Type.DARK, Type.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", Type.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CURSOLA, 8, false, false, false, "Coral Pokémon", Type.GHOST, null, 1, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", Type.FIGHTING, null, 0.8, 117, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MR_RIME, 8, false, false, false, "Comedian Pokémon", Type.ICE, Type.PSYCHIC, 1.5, 58.2, Abilities.TANGLED_FEET, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", Type.GROUND, Type.GHOST, 1.6, 66.6, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MILCERY, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.2, 0.3, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ALCREMIE, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Vanilla Cream", "vanilla-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), - new PokemonForm("Ruby Cream", "ruby-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Matcha Cream", "matcha-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Mint Cream", "mint-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Lemon Cream", "lemon-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Salted Cream", "salted-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 999.9, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), - ), - new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", Type.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", Type.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SNOM, 8, false, false, false, "Worm Pokémon", Type.ICE, Type.BUG, 0.3, 3.8, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", Type.ICE, Type.BUG, 1.3, 42, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", Type.ROCK, null, 2.5, 520, Abilities.POWER_SPOT, Abilities.NONE, Abilities.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EISCUE, 8, false, false, false, "Penguin Pokémon", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Ice Face", "", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, false, null, true), - new PokemonForm("No Ice", "no-ice", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), - ), - new PokemonSpecies(Species.INDEEDEE, 8, false, false, false, "Emotion Pokémon", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), - new PokemonForm("Female", "female", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), - ), - new PokemonSpecies(Species.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Full Belly Mode", "full-belly", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, "", true), - new PokemonForm("Hangry Mode", "hangry", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153), - ), - new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), - ), - new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DRACOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.DRAGON, 2.3, 215, Abilities.WATER_ABSORB, Abilities.STRONG_JAW, Abilities.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), - ), - new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", Type.DRAGON, Type.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", Type.DRAGON, Type.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", Type.DRAGON, Type.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.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", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FAIRY, Type.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 360), - ), - new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.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", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FIGHTING, Type.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360), - ), - new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), - new PokemonForm("E-Max", "eternamax", Type.POISON, Type.DRAGON, 100, 999.9, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), - ), - new PokemonSpecies(Species.KUBFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, null, 0.6, 12, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Single Strike Style", "single-strike", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), - new PokemonForm("Rapid Strike Style", "rapid-strike", Type.FIGHTING, Type.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - ), - new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - new PokemonForm("Dada", "dada", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(Species.REGIELEKI, 8, true, false, false, "Electron Pokémon", Type.ELECTRIC, null, 1.2, 145, Abilities.TRANSISTOR, Abilities.NONE, Abilities.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", Type.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", Type.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", Type.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), - new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), - new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340), - ), - new PokemonSpecies(Species.WYRDEER, 8, false, false, false, "Big Horn Pokémon", Type.NORMAL, Type.PSYCHIC, 1.8, 95.1, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 135, 50, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", Type.BUG, Type.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.URSALUNA, 8, false, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.4, 290, Abilities.GUTS, Abilities.BULLETPROOF, Abilities.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, "", true), - new PokemonForm("Female", "female", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265, false, null, true), - ), - new PokemonSpecies(Species.SNEASLER, 8, false, false, false, "Free Climb Pokémon", Type.FIGHTING, Type.POISON, 1.3, 43, Abilities.PRESSURE, Abilities.UNBURDEN, Abilities.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 135, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", Type.DARK, Type.POISON, 2.5, 60.5, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 135, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.OVERCOAT, Abilities.NONE, Abilities.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), - ), - new PokemonSpecies(Species.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", Type.GRASS, null, 0.4, 4.1, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", Type.GRASS, null, 0.9, 12.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", Type.GRASS, Type.DARK, 1.5, 31.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", Type.FIRE, null, 0.4, 9.8, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", Type.FIRE, null, 1, 30.7, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", Type.FIRE, Type.GHOST, 1.6, 326.5, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAXLY, 9, false, false, false, "Duckling Pokémon", Type.WATER, null, 0.5, 6.1, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAXWELL, 9, false, false, false, "Practicing Pokémon", Type.WATER, null, 1.2, 21.5, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", Type.WATER, Type.FIGHTING, 1.8, 61.9, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LECHONK, 9, false, false, false, "Hog Pokémon", Type.NORMAL, null, 0.5, 10.2, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", Type.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), - new PokemonForm("Female", "female", Type.NORMAL, null, 1, 120, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true), - ), - new PokemonSpecies(Species.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", Type.BUG, null, 0.3, 4, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SPIDOPS, 9, false, false, false, "Trap Pokémon", Type.BUG, null, 1, 16.5, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", Type.BUG, null, 0.2, 1, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LOKIX, 9, false, false, false, "Grasshopper Pokémon", Type.BUG, Type.DARK, 1, 17.5, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMI, 9, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.3, 2.5, Abilities.STATIC, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMO, 9, false, false, false, "Mouse Pokémon", Type.ELECTRIC, Type.FIGHTING, 0.4, 6.5, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMOT, 9, false, false, false, "Hands-On Pokémon", Type.ELECTRIC, Type.FIGHTING, 0.9, 41, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TANDEMAUS, 9, false, false, false, "Couple Pokémon", Type.NORMAL, null, 0.3, 1.8, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.MAUSHOLD, 9, false, false, false, "Family Pokémon", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, - new PokemonForm("Family of Four", "four", Type.NORMAL, null, 0.3, 2.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - new PokemonForm("Family of Three", "three", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - ), - new PokemonSpecies(Species.FIDOUGH, 9, false, false, false, "Puppy Pokémon", Type.FAIRY, null, 0.3, 10.9, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DACHSBUN, 9, false, false, false, "Dog Pokémon", Type.FAIRY, null, 0.5, 14.9, Abilities.WELL_BAKED_BODY, Abilities.NONE, Abilities.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SMOLIV, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 0.3, 6.5, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DOLLIV, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 0.6, 11.9, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ARBOLIVA, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 1.4, 48.2, Abilities.SEED_SOWER, Abilities.NONE, Abilities.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, - new PokemonForm("Green Plumage", "green-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Blue Plumage", "blue-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Yellow Plumage", "yellow-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("White Plumage", "white-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - ), - new PokemonSpecies(Species.NACLI, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.4, 16, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.6, 105, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 2.3, 240, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CHARCADET, 9, false, false, false, "Fire Child Pokémon", Type.FIRE, null, 0.6, 10.5, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 85, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", Type.FIRE, Type.GHOST, 1.6, 62, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TADBULB, 9, false, false, false, "EleTadpole Pokémon", Type.ELECTRIC, null, 0.3, 0.4, Abilities.OWN_TEMPO, Abilities.STATIC, Abilities.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", Type.ELECTRIC, null, 1.2, 113, Abilities.ELECTROMORPHOSIS, Abilities.STATIC, Abilities.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", Type.ELECTRIC, Type.FLYING, 0.4, 3.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", Type.ELECTRIC, Type.FLYING, 1.4, 38.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MASCHIFF, 9, false, false, false, "Rascal Pokémon", Type.DARK, null, 0.5, 16, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", Type.DARK, null, 1.1, 61, Abilities.INTIMIDATE, Abilities.GUARD_DOG, Abilities.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", Type.POISON, Type.NORMAL, 0.2, 0.7, Abilities.UNBURDEN, Abilities.PICKPOCKET, Abilities.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", Type.POISON, Type.NORMAL, 0.7, 27.2, Abilities.UNBURDEN, Abilities.POISON_TOUCH, Abilities.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", Type.GRASS, Type.GHOST, 0.6, 0.6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", Type.GRASS, Type.GHOST, 1.2, 6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", Type.GROUND, Type.GRASS, 0.9, 33, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", Type.GROUND, Type.GRASS, 1.9, 58, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KLAWF, 9, false, false, false, "Ambush Pokémon", Type.ROCK, null, 1.3, 79, Abilities.ANGER_SHELL, Abilities.SHELL_ARMOR, Abilities.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", Type.GRASS, null, 0.3, 3, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", Type.GRASS, Type.FIRE, 0.9, 15, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RELLOR, 9, false, false, false, "Rolling Pokémon", Type.BUG, null, 0.2, 1, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.RABSCA, 9, false, false, false, "Rolling Pokémon", Type.BUG, Type.PSYCHIC, 0.3, 3.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.FLITTLE, 9, false, false, false, "Frill Pokémon", Type.PSYCHIC, null, 0.2, 1.5, Abilities.ANTICIPATION, Abilities.FRISK, Abilities.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", Type.PSYCHIC, null, 1.9, 90, Abilities.OPPORTUNIST, Abilities.FRISK, Abilities.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", Type.FAIRY, Type.STEEL, 0.4, 8.9, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TINKATUFF, 9, false, false, false, "Hammer Pokémon", Type.FAIRY, Type.STEEL, 0.7, 59.1, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TINKATON, 9, false, false, false, "Hammer Pokémon", Type.FAIRY, Type.STEEL, 0.7, 112.8, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", Type.WATER, null, 1.2, 1.8, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", Type.WATER, null, 1.2, 5.4, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", Type.FLYING, Type.DARK, 1.5, 42.9, Abilities.BIG_PECKS, Abilities.KEEN_EYE, Abilities.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FINIZEN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.WATER_VEIL, Abilities.NONE, Abilities.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PALAFIN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Zero Form", "zero", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), - new PokemonForm("Hero Form", "hero", Type.WATER, null, 1.8, 97.4, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), - ), - new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", Type.STEEL, Type.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", Type.STEEL, Type.DARK, 1.8, 240, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", Type.STEEL, Type.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Navi Starmobile", "navi-starmobile", Type.STEEL, Type.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", Type.STEEL, Type.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Caph Starmobile", "caph-starmobile", Type.STEEL, Type.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - ), - new PokemonSpecies(Species.CYCLIZAR, 9, false, false, false, "Mount Pokémon", Type.DRAGON, Type.NORMAL, 1.6, 63, Abilities.SHED_SKIN, Abilities.NONE, Abilities.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", Type.STEEL, null, 2.5, 310, Abilities.EARTH_EATER, Abilities.NONE, Abilities.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GLIMMET, 9, false, false, false, "Ore Pokémon", Type.ROCK, Type.POISON, 0.7, 8, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLIMMORA, 9, false, false, false, "Ore Pokémon", Type.ROCK, Type.POISON, 1.5, 45, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", Type.GHOST, null, 0.6, 35, Abilities.PICKUP, Abilities.NONE, Abilities.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", Type.GHOST, null, 2, 15, Abilities.SAND_RUSH, Abilities.NONE, Abilities.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", Type.FLYING, Type.FIGHTING, 1.6, 37, Abilities.SCRAPPY, Abilities.TANGLED_FEET, Abilities.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", Type.ICE, null, 1.2, 45, Abilities.THICK_FAT, Abilities.SNOW_CLOAK, Abilities.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CETITAN, 9, false, false, false, "Terra Whale Pokémon", Type.ICE, null, 4.5, 700, Abilities.THICK_FAT, Abilities.SLUSH_RUSH, Abilities.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VELUZA, 9, false, false, false, "Jettison Pokémon", Type.WATER, Type.PSYCHIC, 2.5, 90, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", Type.WATER, null, 12, 220, Abilities.UNAWARE, Abilities.OBLIVIOUS, Abilities.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, - new PokemonForm("Curly Form", "curly", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Droopy Form", "droopy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Stretchy Form", "stretchy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - ), - new PokemonSpecies(Species.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", Type.FIGHTING, Type.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", Type.POISON, Type.GROUND, 1.8, 223, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 3.2, 160, Abilities.CUD_CHEW, Abilities.ARMOR_TAIL, Abilities.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", Type.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Two-Segment Form", "two-segment", Type.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, false, ""), - new PokemonForm("Three-Segment Form", "three-segment", Type.NORMAL, null, 4.5, 47.4, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182), - ), - new PokemonSpecies(Species.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", Type.DARK, Type.STEEL, 2, 120, Abilities.DEFIANT, Abilities.SUPREME_OVERLORD, Abilities.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", Type.GROUND, Type.FIGHTING, 2.2, 320, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", Type.FAIRY, Type.PSYCHIC, 1.2, 8, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.DARK, 1.2, 21, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", Type.GHOST, Type.FAIRY, 1.4, 4, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", Type.BUG, Type.FIGHTING, 3.2, 92, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", Type.ELECTRIC, Type.GROUND, 2.3, 60, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", Type.GROUND, Type.STEEL, 0.9, 240, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", Type.ICE, Type.WATER, 0.6, 11, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", Type.FIGHTING, Type.ELECTRIC, 1.8, 380.7, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", Type.DARK, Type.FLYING, 1.3, 111, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", Type.FIRE, Type.POISON, 1.2, 36, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", Type.ROCK, Type.ELECTRIC, 1.6, 303, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", Type.DRAGON, Type.ICE, 0.5, 17, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", Type.DRAGON, Type.ICE, 0.8, 30, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", Type.DRAGON, Type.ICE, 2.1, 210, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, - new PokemonForm("Chest Form", "chest", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), - new PokemonForm("Roaming Form", "roaming", Type.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), - ), - new PokemonSpecies(Species.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", Type.STEEL, Type.GHOST, 1.2, 30, Abilities.GOOD_AS_GOLD, Abilities.NONE, Abilities.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.GRASS, 1.5, 74.2, Abilities.TABLETS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.ICE, 1.9, 152.2, Abilities.SWORD_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TING_LU, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.GROUND, 2.7, 699.7, Abilities.VESSEL_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CHI_YU, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.FIRE, 0.4, 4.9, Abilities.BEADS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", Type.DRAGON, Type.DARK, 2, 380, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", Type.FAIRY, Type.FIGHTING, 1.4, 35, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.KORAIDON, 9, false, true, false, "Paradox Pokémon", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Apex Build", "apex-build", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(Species.MIRAIDON, 9, false, true, false, "Paradox Pokémon", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Ultimate Mode", "ultimate-mode", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", Type.WATER, Type.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.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(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.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(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, - new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), - new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), - ), - new PokemonSpecies(Species.SINISTCHA, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, - new PokemonForm("Unremarkable Form", "unremarkable", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), - new PokemonForm("Masterpiece Form", "masterpiece", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), - ), - new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, - new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), - new PokemonForm("Wellspring Mask", "wellspring-mask", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask", "hearthflame-mask", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask", "cornerstone-mask", Type.GRASS, Type.ROCK, 1.2, 39.8, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Teal Mask Terastallized", "teal-mask-tera", Type.GRASS, null, 1.2, 39.8, Abilities.EMBODY_ASPECT_TEAL, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Wellspring Mask Terastallized", "wellspring-mask-tera", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.EMBODY_ASPECT_WELLSPRING, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask Terastallized", "hearthflame-mask-tera", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.EMBODY_ASPECT_HEARTHFLAME, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask Terastallized", "cornerstone-mask-tera", Type.GRASS, Type.ROCK, 1.2, 39.8, Abilities.EMBODY_ASPECT_CORNERSTONE, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - ), - new PokemonSpecies(Species.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 2, 60, Abilities.STAMINA, Abilities.STURDY, Abilities.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", Type.GRASS, Type.DRAGON, 1.8, 93, Abilities.SUPERSWEET_SYRUP, Abilities.REGENERATOR, Abilities.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", Type.FIRE, Type.DRAGON, 3.5, 590, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", Type.ELECTRIC, Type.DRAGON, 5.2, 480, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", Type.ROCK, Type.PSYCHIC, 1.5, 162.5, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 156, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TERAPAGOS, 9, false, true, false, "Tera Pokémon", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Normal Form", "", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), - new PokemonForm("Terastal Form", "terastal", Type.NORMAL, null, 0.3, 16, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), - new PokemonForm("Stellar Form", "stellar", Type.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140), - ), - new PokemonSpecies(Species.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", Type.POISON, Type.GHOST, 0.3, 0.3, Abilities.POISON_PUPPETEER, Abilities.NONE, Abilities.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", Type.DARK, Type.NORMAL, 0.3, 3.8, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", Type.DARK, Type.NORMAL, 0.7, 25.5, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", Type.ELECTRIC, Type.PSYCHIC, 0.7, 21, Abilities.SURGE_SURFER, Abilities.NONE, Abilities.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", Type.ICE, Type.STEEL, 0.7, 40, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", Type.ICE, Type.STEEL, 1.2, 55, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", Type.ICE, null, 0.6, 9.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", Type.ICE, Type.FAIRY, 1.1, 19.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", Type.GROUND, Type.STEEL, 0.2, 1, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", Type.GROUND, Type.STEEL, 0.7, 66.6, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", Type.DARK, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", Type.DARK, null, 1.1, 33, Abilities.FUR_COAT, Abilities.TECHNICIAN, Abilities.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", Type.ROCK, Type.ELECTRIC, 0.4, 20.3, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", Type.ROCK, Type.ELECTRIC, 1, 110, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", Type.ROCK, Type.ELECTRIC, 1.7, 316, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", Type.POISON, Type.DARK, 0.7, 42, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", Type.POISON, Type.DARK, 1, 52, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", Type.GRASS, Type.DRAGON, 10.9, 415.6, Abilities.FRISK, Abilities.NONE, Abilities.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", Type.FIRE, Type.GHOST, 1, 34, Abilities.CURSED_BODY, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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(Species.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", Type.STEEL, null, 0.4, 7.5, Abilities.PICKUP, Abilities.TOUGH_CLAWS, Abilities.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, null, 0.8, 24, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, Type.FAIRY, 1.7, 80, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", Type.PSYCHIC, null, 1.2, 36, Abilities.GLUTTONY, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", Type.POISON, Type.PSYCHIC, 1.6, 70.5, Abilities.QUICK_DRAW, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", Type.FIGHTING, null, 0.8, 42, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", Type.POISON, Type.FAIRY, 3, 16, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", Type.ICE, Type.PSYCHIC, 1.4, 56.8, Abilities.VITAL_SPIRIT, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", Type.PSYCHIC, Type.FLYING, 1.7, 50.9, Abilities.COMPETITIVE, Abilities.NONE, Abilities.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", Type.FIGHTING, Type.FLYING, 1.6, 58.2, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", Type.DARK, Type.FLYING, 2, 66, Abilities.BERSERK, Abilities.NONE, Abilities.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", Type.POISON, Type.PSYCHIC, 1.8, 79.5, Abilities.CURIOUS_MEDICINE, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", Type.GHOST, null, 0.6, 0.5, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", Type.DARK, Type.NORMAL, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", Type.DARK, Type.NORMAL, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", Type.ICE, null, 0.7, 40, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", Type.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", Type.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", Type.ICE, Type.FIRE, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189), - ), - new PokemonSpecies(Species.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", Type.GROUND, Type.GHOST, 0.5, 1.5, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", Type.GROUND, Type.STEEL, 0.7, 20.5, Abilities.MIMICRY, Abilities.NONE, Abilities.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", Type.FIRE, Type.ROCK, 0.8, 22.7, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", Type.FIRE, Type.ROCK, 2, 168, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", Type.ELECTRIC, Type.GRASS, 0.5, 13, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", Type.ELECTRIC, Type.GRASS, 1.2, 81, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", Type.FIRE, Type.GHOST, 1.6, 69.8, Abilities.BLAZE, Abilities.NONE, Abilities.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", Type.DARK, Type.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", Type.FIGHTING, Type.POISON, 0.9, 27, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", Type.WATER, Type.DARK, 1.5, 58.2, Abilities.TORRENT, Abilities.NONE, Abilities.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 19.2, Abilities.CHLOROPHYLL, Abilities.HUSTLE, Abilities.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", Type.NORMAL, Type.GHOST, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", Type.NORMAL, Type.GHOST, 1.6, 83, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", Type.PSYCHIC, Type.FLYING, 1.7, 43.4, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", Type.STEEL, Type.DRAGON, 0.7, 68.5, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", Type.STEEL, Type.DRAGON, 1.7, 334.1, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", Type.ICE, Type.ROCK, 1.4, 262.4, Abilities.STRONG_JAW, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 37, Abilities.OVERGROW, Abilities.NONE, Abilities.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, - new PokemonForm("Combat Breed", "combat", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), - new PokemonForm("Blaze Breed", "blaze", Type.FIGHTING, Type.FIRE, 1.4, 85, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - new PokemonForm("Aqua Breed", "aqua", Type.FIGHTING, Type.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - ), - new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", Type.POISON, Type.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), + ), + new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", PokemonType.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHARIZARD, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.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, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), + new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.FIRE, PokemonType.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.FIRE, PokemonType.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 84, 93, 139, 100, 100, 45, 50, 267), + ), + new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", PokemonType.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", PokemonType.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 83, 135, 115, 110, 68, 45, 50, 265), + ), + new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), + ), + new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", PokemonType.BUG, PokemonType.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, PokemonType.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.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, Abilities.SWARM, Abilities.NONE, Abilities.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, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198), + ), + new PokemonSpecies(Species.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.8, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 30, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.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, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.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, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240), + ), + new PokemonSpecies(Species.RATTATA, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.3, 3.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.RATICATE, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.7, 18.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FEAROW, 1, false, false, false, "Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 38, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.EKANS, 1, false, false, false, "Snake Pokémon", PokemonType.POISON, null, 2, 6.9, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", PokemonType.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Smart Cosplay", "smart-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Tough Cosplay", "tough-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, null, 21, 999.9, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form + ), + new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SANDSLASH, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 1, 29.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.4, 7, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.8, 20, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.3, 60, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.5, 9, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.9, 19.5, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.NIDOKING, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.4, 62, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.5, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CLEFABLE, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.3, 40, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.VULPIX, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.6, 9.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.NINETALES, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1.1, 19.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.5, 5.5, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 1, 12, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.ZUBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 0.8, 7.5, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.GOLBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.6, 55, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ODDISH, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.5, 5.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLOOM, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.8, 8.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.VILEPLUME, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.2, 18.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.PARAS, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 5.4, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PARASECT, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 1, 29.5, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VENONAT, 1, false, false, false, "Insect Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 30, Abilities.COMPOUND_EYES, Abilities.TINTED_LENS, Abilities.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.5, 12.5, Abilities.SHIELD_DUST, Abilities.TINTED_LENS, Abilities.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DIGLETT, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.2, 0.8, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", PokemonType.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 33, 999.9, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian + ), + new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", PokemonType.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 1.7, 76.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 0.5, 28, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 1, 32, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GROWLITHE, 1, false, false, false, "Puppy Pokémon", PokemonType.FIRE, null, 0.7, 19, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.ARCANINE, 1, false, false, false, "Legendary Pokémon", PokemonType.FIRE, null, 1.9, 155, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.POLIWAG, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.6, 12.4, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 1, 20, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.3, 54, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 0.9, 19.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.KADABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.3, 56.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), + new PokemonSpecies(Species.ALAKAZAM, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.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, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.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, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true), + ), + new PokemonSpecies(Species.MACHOP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 0.8, 19.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), + ), + new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 0.9, 45.5, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 1.6, 55, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GEODUDE, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.4, 20, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAVELER, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1, 105, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PONYTA, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1, 30, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1.7, 95, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.2, 36, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.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, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.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, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172), + ), + new PokemonSpecies(Species.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 6, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.MAGNETON, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1, 60, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.8, 15, Abilities.KEEN_EYE, Abilities.INNER_FOCUS, Abilities.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DODUO, 1, false, false, false, "Twin Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.4, 39.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.DODRIO, 1, false, false, false, "Triple Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.8, 85.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SEEL, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 1.1, 90, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, PokemonType.ICE, 1.7, 120, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GRIMER, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 0.9, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUK, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 1.2, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHELLDER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.3, 4, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, PokemonType.ICE, 1.5, 132.5, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GASTLY, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.3, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HAUNTER, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.6, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, PokemonType.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GHOST, PokemonType.POISON, 20, 999.9, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), + ), + new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", PokemonType.ROCK, PokemonType.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HYPNO, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1.6, 75.6, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", PokemonType.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 70, 70, 60, 50, 166), + ), + new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 0.4, 2.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 2, 120, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CUBONE, 1, false, false, false, "Lonely Pokémon", PokemonType.GROUND, null, 0.4, 6.5, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", PokemonType.GROUND, null, 1, 45, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HITMONLEE, 1, false, false, false, "Kicking Pokémon", PokemonType.FIGHTING, null, 1.5, 49.8, Abilities.LIMBER, Abilities.RECKLESS, Abilities.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.HITMONCHAN, 1, false, false, false, "Punching Pokémon", PokemonType.FIGHTING, null, 1.4, 50.2, Abilities.KEEN_EYE, Abilities.IRON_FIST, Abilities.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.LICKITUNG, 1, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.2, 65.5, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KOFFING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 0.6, 1, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WEEZING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 1.2, 9.5, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RHYHORN, 1, false, false, false, "Spikes Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1, 115, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.RHYDON, 1, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1.9, 120, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.CHANSEY, 1, false, false, false, "Egg Pokémon", PokemonType.NORMAL, null, 1.1, 34.6, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.TANGELA, 1, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 1, 35, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KANGASKHAN, 1, false, false, false, "Parent Pokémon", PokemonType.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.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, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.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, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172), + ), + new PokemonSpecies(Species.HORSEA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 0.4, 8, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SEADRA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 1.2, 25, Abilities.POISON_POINT, Abilities.SNIPER, Abilities.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 0.6, 15, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SEAKING, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 1.3, 39, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.STARYU, 1, false, false, false, "Star Shape Pokémon", PokemonType.WATER, null, 0.8, 34.5, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.STARMIE, 1, false, false, false, "Mysterious Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.1, 80, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MR_MIME, 1, false, false, false, "Barrier Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.3, 54.5, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCYTHER, 1, false, false, false, "Mantis Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.5, 56, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.JYNX, 1, false, false, false, "Human Shape Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 40.6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 1.1, 30, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGMAR, 1, false, false, false, "Spitfire Pokémon", PokemonType.FIRE, null, 1.3, 44.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.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, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.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, Abilities.AERILATE, Abilities.AERILATE, Abilities.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175), + ), + new PokemonSpecies(Species.TAUROS, 1, false, false, false, "Wild Bull Pokémon", PokemonType.NORMAL, null, 1.4, 88.4, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.MAGIKARP, 1, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.9, 10, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GYARADOS, 1, false, false, false, "Atrocious Pokémon", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.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, Abilities.INTIMIDATE, Abilities.NONE, Abilities.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, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true), + ), + new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 85, 85, 105, 130, 60, 45, 50, 187), + ), + new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", PokemonType.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), + new PokemonForm("Partner", "partner", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form + ), + new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", PokemonType.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.FLAREON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 0.9, 25, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PORYGON, 1, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.8, 36.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.OMANYTE, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.4, 7.5, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.OMASTAR, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 1, 35, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.KABUTO, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 11.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 40.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AERODACTYL, 1, false, false, false, "Fossil Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.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, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.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, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180), + ), + new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), + ), + new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", PokemonType.ICE, PokemonType.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MOLTRES, 1, true, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 2, 60, Abilities.PRESSURE, Abilities.NONE, Abilities.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DRATINI, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 1.8, 3.3, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 4, 16.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGONITE, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 2.2, 210, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.MEWTWO, 1, false, true, false, "Genetic Pokémon", PokemonType.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.STEADFAST, Abilities.NONE, Abilities.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.PSYCHIC, null, 1.5, 33, Abilities.INSOMNIA, Abilities.NONE, Abilities.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340), + ), + new PokemonSpecies(Species.MEW, 1, false, false, true, "New Species Pokémon", PokemonType.PSYCHIC, null, 0.4, 4, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.CHIKORITA, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 0.9, 6.4, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BAYLEEF, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 1.2, 15.8, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", PokemonType.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", PokemonType.FIRE, null, 0.5, 7.9, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUILAVA, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 0.9, 19, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 0.6, 9.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 1.1, 25, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SENTRET, 2, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.8, 6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FURRET, 2, false, false, false, "Long Body Pokémon", PokemonType.NORMAL, null, 1.8, 32.5, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HOOTHOOT, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 21.2, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOCTOWL, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.6, 40.8, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LEDYBA, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 10.8, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.LEDIAN, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.4, 35.6, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.SPINARAK, 2, false, false, false, "String Spit Pokémon", PokemonType.BUG, PokemonType.POISON, 0.5, 8.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ARIADOS, 2, false, false, false, "Long Leg Pokémon", PokemonType.BUG, PokemonType.POISON, 1.1, 33.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.CROBAT, 2, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.8, 75, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHINCHOU, 2, false, false, false, "Angler Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 0.5, 12, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LANTURN, 2, false, false, false, "Light Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 1.2, 22.5, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2, Abilities.STATIC, Abilities.NONE, Abilities.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, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.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, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), + ), + new PokemonSpecies(Species.CLEFFA, 2, false, false, false, "Star Shape Pokémon", PokemonType.FAIRY, null, 0.3, 3, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.3, 1, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", PokemonType.FAIRY, null, 0.3, 1.5, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.TOGETIC, 2, false, false, false, "Happiness Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 0.6, 3.2, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.NATU, 2, false, false, false, "Tiny Bird Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.2, 2, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.XATU, 2, false, false, false, "Mystic Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.5, 15, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.MAREEP, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.6, 7.8, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLAAFFY, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.8, 13.3, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", PokemonType.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.STATIC, Abilities.NONE, Abilities.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, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255), + ), + new PokemonSpecies(Species.BELLOSSOM, 2, false, false, false, "Flower Pokémon", PokemonType.GRASS, null, 0.4, 5.8, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.4, 8.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.8, 28.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", PokemonType.ROCK, null, 1.2, 38, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.POLITOED, 2, false, false, false, "Frog Pokémon", PokemonType.WATER, null, 1.1, 33.9, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.4, 0.5, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.6, 1, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AIPOM, 2, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 0.8, 11.5, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.SUNKERN, 2, false, false, false, "Seed Pokémon", PokemonType.GRASS, null, 0.3, 1.8, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SUNFLORA, 2, false, false, false, "Sun Pokémon", PokemonType.GRASS, null, 0.8, 8.5, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.YANMA, 2, false, false, false, "Clear Wing Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38, Abilities.SPEED_BOOST, Abilities.COMPOUND_EYES, Abilities.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WOOPER, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 8.5, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.4, 75, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ESPEON, 2, false, false, false, "Sun Pokémon", PokemonType.PSYCHIC, null, 0.9, 26.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.UMBREON, 2, false, false, false, "Moonlight Pokémon", PokemonType.DARK, null, 1, 27, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.MURKROW, 2, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 2.1, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SLOWKING, 2, false, false, false, "Royal Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2, 79.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MISDREAVUS, 2, false, false, false, "Screech Pokémon", PokemonType.GHOST, null, 0.7, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.UNOWN, 2, false, false, false, "Symbol Pokémon", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("B", "b", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("C", "c", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("D", "d", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("E", "e", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("F", "f", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("G", "g", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("H", "h", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("I", "i", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("J", "j", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("K", "k", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("L", "l", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("M", "m", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("N", "n", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("O", "o", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("P", "p", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Q", "q", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("R", "r", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("S", "s", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("T", "t", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("U", "u", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("V", "v", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("W", "w", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("X", "x", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Y", "y", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Z", "z", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("!", "exclamation", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("?", "question", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + ), + new PokemonSpecies(Species.WOBBUFFET, 2, false, false, false, "Patient Pokémon", PokemonType.PSYCHIC, null, 1.3, 28.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 41.5, Abilities.INNER_FOCUS, Abilities.EARLY_BIRD, Abilities.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.PINECO, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.6, 7.2, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.2, 125.8, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 1.5, 14, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.1, 64.8, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STEELIX, 2, false, false, false, "Iron Snake Pokémon", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.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, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.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, Abilities.SAND_FORCE, Abilities.SAND_FORCE, Abilities.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true), + ), + new PokemonSpecies(Species.SNUBBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.8, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GRANBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.4, 48.7, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.QWILFISH, 2, false, false, false, "Balloon Pokémon", PokemonType.WATER, PokemonType.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCIZOR, 2, false, false, false, "Pincer Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.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, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.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, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true), + ), + new PokemonSpecies(Species.SHUCKLE, 2, false, false, false, "Mold Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.6, 20.5, Abilities.STURDY, Abilities.GLUTTONY, Abilities.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HERACROSS, 2, false, false, false, "Single Horn Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.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, Abilities.SWARM, Abilities.GUTS, Abilities.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, Abilities.SKILL_LINK, Abilities.SKILL_LINK, Abilities.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true), + ), + new PokemonSpecies(Species.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 0.9, 28, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", PokemonType.NORMAL, null, 0.6, 8.8, Abilities.PICKUP, Abilities.QUICK_FEET, Abilities.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.URSARING, 2, false, false, false, "Hibernator Pokémon", PokemonType.NORMAL, null, 1.8, 125.8, Abilities.GUTS, Abilities.QUICK_FEET, Abilities.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SLUGMA, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, null, 0.7, 35, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MAGCARGO, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 55, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWINUB, 2, false, false, false, "Pig Pokémon", PokemonType.ICE, PokemonType.GROUND, 0.4, 6.5, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PILOSWINE, 2, false, false, false, "Swine Pokémon", PokemonType.ICE, PokemonType.GROUND, 1.1, 55.8, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.CORSOLA, 2, false, false, false, "Coral Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.6, 5, Abilities.HUSTLE, Abilities.NATURAL_CURE, Abilities.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.REMORAID, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.6, 12, Abilities.HUSTLE, Abilities.SNIPER, Abilities.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.OCTILLERY, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.9, 28.5, Abilities.SUCTION_CUPS, Abilities.SNIPER, Abilities.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.DELIBIRD, 2, false, false, false, "Delivery Pokémon", PokemonType.ICE, PokemonType.FLYING, 0.9, 16, Abilities.VITAL_SPIRIT, Abilities.HUSTLE, Abilities.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.MANTINE, 2, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 2.1, 220, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", PokemonType.STEEL, PokemonType.FLYING, 1.7, 50.5, Abilities.KEEN_EYE, Abilities.STURDY, Abilities.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HOUNDOUR, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.6, 10.8, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HOUNDOOM, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.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, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.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, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true), + ), + new PokemonSpecies(Species.KINGDRA, 2, false, false, false, "Dragon Pokémon", PokemonType.WATER, PokemonType.DRAGON, 1.8, 152, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PHANPY, 2, false, false, false, "Long Nose Pokémon", PokemonType.GROUND, null, 0.5, 33.5, Abilities.PICKUP, Abilities.NONE, Abilities.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DONPHAN, 2, false, false, false, "Armor Pokémon", PokemonType.GROUND, null, 1.1, 120, Abilities.STURDY, Abilities.NONE, Abilities.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.PORYGON2, 2, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.6, 32.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.STANTLER, 2, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, null, 1.4, 71.2, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SMEARGLE, 2, false, false, false, "Painter Pokémon", PokemonType.NORMAL, null, 1.2, 58, Abilities.OWN_TEMPO, Abilities.TECHNICIAN, Abilities.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TYROGUE, 2, false, false, false, "Scuffle Pokémon", PokemonType.FIGHTING, null, 0.7, 21, Abilities.GUTS, Abilities.STEADFAST, Abilities.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.HITMONTOP, 2, false, false, false, "Handstand Pokémon", PokemonType.FIGHTING, null, 1.4, 48, Abilities.INTIMIDATE, Abilities.TECHNICIAN, Abilities.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 0.4, 6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ELEKID, 2, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 0.6, 23.5, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGBY, 2, false, false, false, "Live Coal Pokémon", PokemonType.FIRE, null, 0.7, 21.4, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MILTANK, 2, false, false, false, "Milk Cow Pokémon", PokemonType.NORMAL, null, 1.2, 75.5, Abilities.THICK_FAT, Abilities.SCRAPPY, Abilities.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", PokemonType.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.RAIKOU, 2, true, false, false, "Thunder Pokémon", PokemonType.ELECTRIC, null, 1.9, 178, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ENTEI, 2, true, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 2.1, 198, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SUICUNE, 2, true, false, false, "Aurora Pokémon", PokemonType.WATER, null, 2, 187, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.6, 72, Abilities.GUTS, Abilities.NONE, Abilities.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.2, 152, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TYRANITAR, 2, false, false, false, "Armor Pokémon", PokemonType.ROCK, PokemonType.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.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, Abilities.SAND_STREAM, Abilities.NONE, Abilities.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, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300), + ), + new PokemonSpecies(Species.LUGIA, 2, false, true, false, "Diving Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 5.2, 216, Abilities.PRESSURE, Abilities.NONE, Abilities.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.HO_OH, 2, false, true, false, "Rainbow Pokémon", PokemonType.FIRE, PokemonType.FLYING, 3.8, 199, Abilities.PRESSURE, Abilities.NONE, Abilities.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CELEBI, 2, false, false, true, "Time Travel Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 0.6, 5, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.5, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.9, 21.6, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SCEPTILE, 3, false, false, false, "Forest Pokémon", PokemonType.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.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, Abilities.OVERGROW, Abilities.NONE, Abilities.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, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265), + ), + new PokemonSpecies(Species.TORCHIC, 3, false, false, false, "Chick Pokémon", PokemonType.FIRE, null, 0.4, 2.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 19.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.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, Abilities.BLAZE, Abilities.NONE, Abilities.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, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true), + ), + new PokemonSpecies(Species.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, null, 0.4, 7.6, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.7, 28, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268), + ), + new PokemonSpecies(Species.POOCHYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 0.5, 13.6, Abilities.RUN_AWAY, Abilities.QUICK_FEET, Abilities.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIGHTYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 1, 37, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", PokemonType.NORMAL, null, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LINOONE, 3, false, false, false, "Rushing Pokémon", PokemonType.NORMAL, null, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WURMPLE, 3, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 3.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SILCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CASCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 11.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.LOTAD, 3, false, false, false, "Water Weed Pokémon", PokemonType.WATER, PokemonType.GRASS, 0.5, 2.6, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LOMBRE, 3, false, false, false, "Jolly Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.2, 32.5, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LUDICOLO, 3, false, false, false, "Carefree Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.5, 55, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SEEDOT, 3, false, false, false, "Acorn Pokémon", PokemonType.GRASS, null, 0.5, 4, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.NUZLEAF, 3, false, false, false, "Wily Pokémon", PokemonType.GRASS, PokemonType.DARK, 1, 28, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SHIFTRY, 3, false, false, false, "Wicked Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 59.6, Abilities.CHLOROPHYLL, Abilities.WIND_RIDER, Abilities.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.3, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SWELLOW, 3, false, false, false, "Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 19.8, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WINGULL, 3, false, false, false, "Seagull Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.6, 9.5, Abilities.KEEN_EYE, Abilities.HYDRATION, Abilities.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PELIPPER, 3, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.2, 28, Abilities.KEEN_EYE, Abilities.DRIZZLE, Abilities.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RALTS, 3, false, false, false, "Feeling Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.4, 6.6, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KIRLIA, 3, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.8, 20.2, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.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, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.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, Abilities.PIXILATE, Abilities.PIXILATE, Abilities.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259), + ), + new PokemonSpecies(Species.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 1.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 3.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, null, 0.4, 4.5, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", PokemonType.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", PokemonType.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", PokemonType.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", PokemonType.BUG, PokemonType.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", PokemonType.BUG, PokemonType.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), + new PokemonSpecies(Species.WHISMUR, 3, false, false, false, "Whisper Pokémon", PokemonType.NORMAL, null, 0.6, 16.3, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LOUDRED, 3, false, false, false, "Big Voice Pokémon", PokemonType.NORMAL, null, 1, 40.5, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", PokemonType.NORMAL, null, 1.5, 84, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MAKUHITA, 3, false, false, false, "Guts Pokémon", PokemonType.FIGHTING, null, 1, 86.4, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(Species.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", PokemonType.FIGHTING, null, 2.3, 253.8, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(Species.AZURILL, 3, false, false, false, "Polka Dot Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.2, 2, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.NOSEPASS, 3, false, false, false, "Compass Pokémon", PokemonType.ROCK, null, 1, 97, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKITTY, 3, false, false, false, "Kitten Pokémon", PokemonType.NORMAL, null, 0.6, 11, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.DELCATTY, 3, false, false, false, "Prim Pokémon", PokemonType.NORMAL, null, 1.1, 32.6, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.SABLEYE, 3, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.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, Abilities.KEEN_EYE, Abilities.STALL, Abilities.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, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133), + ), + new PokemonSpecies(Species.MAWILE, 3, false, false, false, "Deceiver Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.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, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.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, Abilities.HUGE_POWER, Abilities.HUGE_POWER, Abilities.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133), + ), + new PokemonSpecies(Species.ARON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.4, 60, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LAIRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.9, 120, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.AGGRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.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, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.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, Abilities.FILTER, Abilities.FILTER, Abilities.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265), + ), + new PokemonSpecies(Species.MEDITITE, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 0.6, 11.2, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.MEDICHAM, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.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, Abilities.PURE_POWER, Abilities.NONE, Abilities.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, Abilities.PURE_POWER, Abilities.NONE, Abilities.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true), + ), + new PokemonSpecies(Species.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.6, 15.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.MANECTRIC, 3, false, false, false, "Discharge Pokémon", PokemonType.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.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, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.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, Abilities.INTIMIDATE, Abilities.INTIMIDATE, Abilities.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166), + ), + new PokemonSpecies(Species.PLUSLE, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, Abilities.PLUS, Abilities.NONE, Abilities.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MINUN, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, Abilities.MINUS, Abilities.NONE, Abilities.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VOLBEAT, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.7, 17.7, Abilities.ILLUMINATE, Abilities.SWARM, Abilities.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), + new PokemonSpecies(Species.ILLUMISE, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.6, 17.7, Abilities.OBLIVIOUS, Abilities.TINTED_LENS, Abilities.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), + new PokemonSpecies(Species.ROSELIA, 3, false, false, false, "Thorn Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.3, 2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.GULPIN, 3, false, false, false, "Stomach Pokémon", PokemonType.POISON, null, 0.4, 10.3, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(Species.SWALOT, 3, false, false, false, "Poison Bag Pokémon", PokemonType.POISON, null, 1.7, 80, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(Species.CARVANHA, 3, false, false, false, "Savage Pokémon", PokemonType.WATER, PokemonType.DARK, 0.8, 20.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SHARPEDO, 3, false, false, false, "Brutal Pokémon", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.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, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.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, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161), + ), + new PokemonSpecies(Species.WAILMER, 3, false, false, false, "Ball Whale Pokémon", PokemonType.WATER, null, 2, 130, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.WAILORD, 3, false, false, false, "Float Whale Pokémon", PokemonType.WATER, null, 14.5, 398, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.NUMEL, 3, false, false, false, "Numb Pokémon", PokemonType.FIRE, PokemonType.GROUND, 0.7, 24, Abilities.OBLIVIOUS, Abilities.SIMPLE, Abilities.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CAMERUPT, 3, false, false, false, "Eruption Pokémon", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.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, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.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, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161), + ), + new PokemonSpecies(Species.TORKOAL, 3, false, false, false, "Coal Pokémon", PokemonType.FIRE, null, 0.5, 80.4, Abilities.WHITE_SMOKE, Abilities.DROUGHT, Abilities.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SPOINK, 3, false, false, false, "Bounce Pokémon", PokemonType.PSYCHIC, null, 0.7, 30.6, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.9, 71.5, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.SPINDA, 3, false, false, false, "Spot Panda Pokémon", PokemonType.NORMAL, null, 1.1, 5, Abilities.OWN_TEMPO, Abilities.TANGLED_FEET, Abilities.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", PokemonType.GROUND, null, 0.7, 15, Abilities.HYPER_CUTTER, Abilities.ARENA_TRAP, Abilities.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VIBRAVA, 3, false, false, false, "Vibration Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 1.1, 15.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLYGON, 3, false, false, false, "Mystic Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 2, 82, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CACNEA, 3, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 0.4, 51.3, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 77.4, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.4, 1.2, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.ALTARIA, 3, false, false, false, "Humming Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.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, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.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, Abilities.PIXILATE, Abilities.NONE, Abilities.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172), + ), + new PokemonSpecies(Species.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", PokemonType.NORMAL, null, 1.3, 40.3, Abilities.IMMUNITY, Abilities.NONE, Abilities.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", PokemonType.POISON, null, 2.7, 52.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.LUNATONE, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1, 168, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.SOLROCK, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.2, 154, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.BARBOACH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 1.9, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WHISCASH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 23.6, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CORPHISH, 3, false, false, false, "Ruffian Pokémon", PokemonType.WATER, null, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", PokemonType.WATER, PokemonType.DARK, 1.1, 32.8, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BALTOY, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 0.5, 21.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 1.5, 108, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.LILEEP, 3, false, false, false, "Sea Lily Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1, 23.8, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.CRADILY, 3, false, false, false, "Barnacle Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1.5, 60.4, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", PokemonType.ROCK, PokemonType.BUG, 0.7, 12.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.ARMALDO, 3, false, false, false, "Plate Pokémon", PokemonType.ROCK, PokemonType.BUG, 1.5, 68.2, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.FEEBAS, 3, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.6, 7.4, Abilities.SWIFT_SWIM, Abilities.OBLIVIOUS, Abilities.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.MILOTIC, 3, false, false, false, "Tender Pokémon", PokemonType.WATER, null, 6.2, 162, Abilities.MARVEL_SCALE, Abilities.COMPETITIVE, Abilities.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.CASTFORM, 3, false, false, false, "Weather Pokémon", PokemonType.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.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, Abilities.FORECAST, Abilities.NONE, Abilities.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, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Rainy Form", "rainy", PokemonType.WATER, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Snowy Form", "snowy", PokemonType.ICE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + ), + new PokemonSpecies(Species.KECLEON, 3, false, false, false, "Color Swap Pokémon", PokemonType.NORMAL, null, 1, 22, Abilities.COLOR_CHANGE, Abilities.NONE, Abilities.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SHUPPET, 3, false, false, false, "Puppet Pokémon", PokemonType.GHOST, null, 0.6, 2.3, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.BANETTE, 3, false, false, false, "Marionette Pokémon", PokemonType.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.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, Abilities.INSOMNIA, Abilities.FRISK, Abilities.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, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159), + ), + new PokemonSpecies(Species.DUSKULL, 3, false, false, false, "Requiem Pokémon", PokemonType.GHOST, null, 0.8, 15, Abilities.LEVITATE, Abilities.NONE, Abilities.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", PokemonType.GHOST, null, 1.6, 30.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TROPIUS, 3, false, false, false, "Fruit Pokémon", PokemonType.GRASS, PokemonType.FLYING, 2, 100, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", PokemonType.PSYCHIC, null, 0.6, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ABSOL, 3, false, false, false, "Disaster Pokémon", PokemonType.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.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, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.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, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163), + ), + new PokemonSpecies(Species.WYNAUT, 3, false, false, false, "Bright Pokémon", PokemonType.PSYCHIC, null, 0.6, 14, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", PokemonType.ICE, null, 0.7, 16.8, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GLALIE, 3, false, false, false, "Face Pokémon", PokemonType.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.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, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.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, Abilities.REFRIGERATE, Abilities.REFRIGERATE, Abilities.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168), + ), + new PokemonSpecies(Species.SPHEAL, 3, false, false, false, "Clap Pokémon", PokemonType.ICE, PokemonType.WATER, 0.8, 39.5, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SEALEO, 3, false, false, false, "Ball Roll Pokémon", PokemonType.ICE, PokemonType.WATER, 1.1, 87.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WALREIN, 3, false, false, false, "Ice Break Pokémon", PokemonType.ICE, PokemonType.WATER, 1.4, 150.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.4, 52.5, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", PokemonType.WATER, null, 1.7, 27, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.GOREBYSS, 3, false, false, false, "South Sea Pokémon", PokemonType.WATER, null, 1.8, 22.6, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.RELICANTH, 3, false, false, false, "Longevity Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 23.4, Abilities.SWIFT_SWIM, Abilities.ROCK_HEAD, Abilities.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), + new PokemonSpecies(Species.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", PokemonType.WATER, null, 0.6, 8.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.BAGON, 3, false, false, false, "Rock Head Pokémon", PokemonType.DRAGON, null, 0.6, 42.1, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SHELGON, 3, false, false, false, "Endurance Pokémon", PokemonType.DRAGON, null, 1.1, 110.5, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SALAMENCE, 3, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.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, Abilities.INTIMIDATE, Abilities.NONE, Abilities.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, Abilities.AERILATE, Abilities.NONE, Abilities.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300), + ), + new PokemonSpecies(Species.BELDUM, 3, false, false, false, "Iron Ball Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.6, 95.2, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax + new PokemonSpecies(Species.METANG, 3, false, false, false, "Iron Claw Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.2, 202.5, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax + new PokemonSpecies(Species.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.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, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.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, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300), + ), + new PokemonSpecies(Species.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", PokemonType.ROCK, null, 1.7, 230, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGICE, 3, true, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 1.8, 175, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGISTEEL, 3, true, false, false, "Iron Pokémon", PokemonType.STEEL, null, 1.9, 205, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LATIAS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300), + ), + new PokemonSpecies(Species.LATIOS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300), + ), + new PokemonSpecies(Species.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", PokemonType.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.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, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), + new PokemonForm("Primal", "primal", PokemonType.WATER, null, 9.8, 430, Abilities.PRIMORDIAL_SEA, Abilities.NONE, Abilities.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335), + ), + new PokemonSpecies(Species.GROUDON, 3, false, true, false, "Continent Pokémon", PokemonType.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.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, Abilities.DROUGHT, Abilities.NONE, Abilities.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, Abilities.DESOLATE_LAND, Abilities.NONE, Abilities.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335), + ), + new PokemonSpecies(Species.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 10.8, 392, Abilities.DELTA_STREAM, Abilities.NONE, Abilities.NONE, 780, 105, 180, 100, 180, 100, 115, 45, 0, 340), + ), + new PokemonSpecies(Species.JIRACHI, 3, false, false, true, "Wish Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.3, 1.1, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), + new PokemonForm("Defense Forme", "defense", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), + new PokemonForm("Speed Forme", "speed", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300), + ), + new PokemonSpecies(Species.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", PokemonType.GRASS, null, 0.4, 10.2, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.GROTLE, 4, false, false, false, "Grove Pokémon", PokemonType.GRASS, null, 1.1, 97, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", PokemonType.GRASS, PokemonType.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", PokemonType.FIRE, null, 0.5, 6.2, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MONFERNO, 4, false, false, false, "Playful Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 22, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.4, 5.2, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PRINPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.8, 23, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", PokemonType.WATER, PokemonType.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.STARLY, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STARAVIA, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15.5, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", PokemonType.NORMAL, null, 0.5, 20, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.BIBAREL, 4, false, false, false, "Beaver Pokémon", PokemonType.NORMAL, PokemonType.WATER, 1, 31.5, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.KRICKETOT, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 0.3, 2.2, Abilities.SHED_SKIN, Abilities.NONE, Abilities.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 1, 25.5, Abilities.SWARM, Abilities.NONE, Abilities.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SHINX, 4, false, false, false, "Flash Pokémon", PokemonType.ELECTRIC, null, 0.5, 9.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.LUXIO, 4, false, false, false, "Spark Pokémon", PokemonType.ELECTRIC, null, 0.9, 30.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", PokemonType.ELECTRIC, null, 1.4, 42, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BUDEW, 4, false, false, false, "Bud Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1.2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ROSERADE, 4, false, false, false, "Bouquet Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.9, 14.5, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 0.9, 31.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 1.6, 102.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.SHIELDON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 0.5, 57, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.BASTIODON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.3, 149.5, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.BURMY, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + ), + new PokemonSpecies(Species.WORMADAM, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.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, Abilities.ANTICIPATION, Abilities.NONE, Abilities.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, Abilities.ANTICIPATION, Abilities.NONE, Abilities.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, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true), + ), + new PokemonSpecies(Species.MOTHIM, 4, false, false, false, "Moth Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.9, 23.3, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.3, 5.5, Abilities.HONEY_GATHER, Abilities.NONE, Abilities.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38.5, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", PokemonType.ELECTRIC, null, 0.4, 3.9, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 0.7, 29.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 1.1, 33.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CHERUBI, 4, false, false, false, "Cherry Pokémon", PokemonType.GRASS, null, 0.4, 3.3, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHERRIM, 4, false, false, false, "Blossom Pokémon", PokemonType.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.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, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.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, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), + ), + new PokemonSpecies(Species.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.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, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.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, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), + ), + new PokemonSpecies(Species.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.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, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.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, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), + ), + new PokemonSpecies(Species.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 1.2, 20.3, Abilities.TECHNICIAN, Abilities.PICKUP, Abilities.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.DRIFLOON, 4, false, false, false, "Balloon Pokémon", PokemonType.GHOST, PokemonType.FLYING, 0.4, 1.2, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", PokemonType.GHOST, PokemonType.FLYING, 1.2, 15, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BUNEARY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 0.4, 5.5, Abilities.RUN_AWAY, Abilities.KLUTZ, Abilities.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.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, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.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, Abilities.SCRAPPY, Abilities.SCRAPPY, Abilities.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168), + ), + new PokemonSpecies(Species.MISMAGIUS, 4, false, false, false, "Magical Pokémon", PokemonType.GHOST, null, 0.9, 4.4, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.9, 27.3, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLAMEOW, 4, false, false, false, "Catty Pokémon", PokemonType.NORMAL, null, 0.5, 3.9, Abilities.LIMBER, Abilities.OWN_TEMPO, Abilities.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", PokemonType.NORMAL, null, 1, 43.8, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CHINGLING, 4, false, false, false, "Bell Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.STUNKY, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 0.4, 19.2, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKUNTANK, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 38, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BRONZOR, 4, false, false, false, "Bronze Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.5, 60.5, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.3, 187, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.BONSLY, 4, false, false, false, "Bonsai Pokémon", PokemonType.ROCK, null, 0.5, 15, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIME_JR, 4, false, false, false, "Mime Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.6, 13, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HAPPINY, 4, false, false, false, "Playhouse Pokémon", PokemonType.NORMAL, null, 0.6, 24.4, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.CHATOT, 4, false, false, false, "Music Note Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 1.9, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", PokemonType.GHOST, PokemonType.DARK, 1, 108, Abilities.PRESSURE, Abilities.NONE, Abilities.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GIBLE, 4, false, false, false, "Land Shark Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 0.7, 20.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GABITE, 4, false, false, false, "Cave Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.4, 56, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GARCHOMP, 4, false, false, false, "Mach Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.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, Abilities.SAND_VEIL, Abilities.NONE, Abilities.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, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true), + ), + new PokemonSpecies(Species.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", PokemonType.NORMAL, null, 0.6, 105, Abilities.PICKUP, Abilities.THICK_FAT, Abilities.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(Species.RIOLU, 4, false, false, false, "Emanation Pokémon", PokemonType.FIGHTING, null, 0.7, 20.2, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LUCARIO, 4, false, false, false, "Aura Pokémon", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.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, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.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, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184), + ), + new PokemonSpecies(Species.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", PokemonType.GROUND, null, 0.8, 49.5, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", PokemonType.GROUND, null, 2, 300, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.SKORUPI, 4, false, false, false, "Scorpion Pokémon", PokemonType.POISON, PokemonType.BUG, 0.8, 12, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", PokemonType.POISON, PokemonType.DARK, 1.3, 61.5, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 0.7, 23, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.3, 44.4, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", PokemonType.GRASS, null, 1.4, 27, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FINNEON, 4, false, false, false, "Wing Fish Pokémon", PokemonType.WATER, null, 0.4, 7, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.LUMINEON, 4, false, false, false, "Neon Pokémon", PokemonType.WATER, null, 1.2, 24, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.MANTYKE, 4, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 1, 65, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SNOVER, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 1, 50.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.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, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.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, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true), + ), + new PokemonSpecies(Species.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 1.1, 34, Abilities.PRESSURE, Abilities.NONE, Abilities.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1.2, 180, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.LICKILICKY, 4, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.7, 140, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RHYPERIOR, 4, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 2.4, 282.8, Abilities.LIGHTNING_ROD, Abilities.SOLID_ROCK, Abilities.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.TANGROWTH, 4, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 2, 128.6, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.8, 138.6, Abilities.MOTOR_DRIVE, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGMORTAR, 4, false, false, false, "Blast Pokémon", PokemonType.FIRE, null, 1.6, 68, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.5, 38, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.9, 51.5, Abilities.SPEED_BOOST, Abilities.TINTED_LENS, Abilities.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LEAFEON, 4, false, false, false, "Verdant Pokémon", PokemonType.GRASS, null, 1, 25.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.8, 25.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 2, 42.5, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", PokemonType.ICE, PokemonType.GROUND, 2.5, 291, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.9, 34, Abilities.ADAPTABILITY, Abilities.DOWNLOAD, Abilities.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.GALLADE, 4, false, false, false, "Blade Pokémon", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.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, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.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, Abilities.SHARPNESS, Abilities.SHARPNESS, Abilities.SHARPNESS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), + ), + new PokemonSpecies(Species.PROBOPASS, 4, false, false, false, "Compass Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.4, 340, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", PokemonType.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", PokemonType.ICE, PokemonType.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + ), + new PokemonSpecies(Species.UXIE, 4, true, false, false, "Knowledge Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MESPRIT, 4, true, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.AZELF, 4, true, false, false, "Willpower Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DIALGA, 4, false, true, false, "Temporal Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340), + ), + new PokemonSpecies(Species.PALKIA, 4, false, true, false, "Spatial Pokémon", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), + ), + new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", PokemonType.FIRE, PokemonType.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", PokemonType.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), + ), + new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", PokemonType.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", PokemonType.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", PokemonType.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", PokemonType.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", PokemonType.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.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, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.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, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 300), + ), + new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", PokemonType.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.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, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), + new PokemonForm("Fighting", "fighting", PokemonType.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Flying", "flying", PokemonType.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Poison", "poison", PokemonType.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ground", "ground", PokemonType.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Rock", "rock", PokemonType.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Bug", "bug", PokemonType.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ghost", "ghost", PokemonType.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Steel", "steel", PokemonType.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fire", "fire", PokemonType.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Water", "water", PokemonType.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Grass", "grass", PokemonType.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Electric", "electric", PokemonType.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Psychic", "psychic", PokemonType.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ice", "ice", PokemonType.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dragon", "dragon", PokemonType.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dark", "dark", PokemonType.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fairy", "fairy", PokemonType.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", PokemonType.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), + ), + new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", PokemonType.PSYCHIC, PokemonType.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", PokemonType.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TEPIG, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, null, 0.5, 9.9, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1, 55.5, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", PokemonType.WATER, null, 0.5, 5.9, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DEWOTT, 5, false, false, false, "Discipline Pokémon", PokemonType.WATER, null, 0.8, 24.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", PokemonType.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PATRAT, 5, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.5, 11.6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WATCHOG, 5, false, false, false, "Lookout Pokémon", PokemonType.NORMAL, null, 1.1, 27, Abilities.ILLUMINATE, Abilities.KEEN_EYE, Abilities.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LILLIPUP, 5, false, false, false, "Puppy Pokémon", PokemonType.NORMAL, null, 0.4, 4.1, Abilities.VITAL_SPIRIT, Abilities.PICKUP, Abilities.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", PokemonType.NORMAL, null, 0.9, 14.7, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", PokemonType.NORMAL, null, 1.2, 61, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PURRLOIN, 5, false, false, false, "Devious Pokémon", PokemonType.DARK, null, 0.4, 10.1, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LIEPARD, 5, false, false, false, "Cruel Pokémon", PokemonType.DARK, null, 1.1, 37.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", PokemonType.GRASS, null, 0.6, 10.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", PokemonType.GRASS, null, 1.1, 30.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PANSEAR, 5, false, false, false, "High Temp Pokémon", PokemonType.FIRE, null, 0.6, 11, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMISEAR, 5, false, false, false, "Ember Pokémon", PokemonType.FIRE, null, 1, 28, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PANPOUR, 5, false, false, false, "Spray Pokémon", PokemonType.WATER, null, 0.6, 13.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", PokemonType.WATER, null, 1, 29, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.MUNNA, 5, false, false, false, "Dream Eater Pokémon", PokemonType.PSYCHIC, null, 0.6, 23.3, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", PokemonType.PSYCHIC, null, 1.1, 60.5, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.1, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.UNFEZANT, 5, false, false, false, "Proud Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 29, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BLITZLE, 5, false, false, false, "Electrified Pokémon", PokemonType.ELECTRIC, null, 0.8, 29.8, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.6, 79.5, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", PokemonType.ROCK, null, 0.4, 18, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.BOLDORE, 5, false, false, false, "Ore Pokémon", PokemonType.ROCK, null, 0.9, 102, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GIGALITH, 5, false, false, false, "Compressed Pokémon", PokemonType.ROCK, null, 1.7, 260, Abilities.STURDY, Abilities.SAND_STREAM, Abilities.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WOOBAT, 5, false, false, false, "Bat Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.4, 2.1, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWOOBAT, 5, false, false, false, "Courting Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.9, 10.5, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRILBUR, 5, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.3, 8.5, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 40.4, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AUDINO, 5, false, false, false, "Hearing Pokémon", PokemonType.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.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, Abilities.HEALER, Abilities.REGENERATOR, Abilities.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, Abilities.REGENERATOR, Abilities.REGENERATOR, Abilities.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390), //Custom Ability, base form Hidden Ability + ), + new PokemonSpecies(Species.TIMBURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 0.6, 12.5, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.GURDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.2, 40, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.CONKELDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.4, 87, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.5, 4.5, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PALPITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.8, 17, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 62, Abilities.SWIFT_SWIM, Abilities.POISON_TOUCH, Abilities.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.THROH, 5, false, false, false, "Judo Pokémon", PokemonType.FIGHTING, null, 1.3, 55.5, Abilities.GUTS, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SAWK, 5, false, false, false, "Karate Pokémon", PokemonType.FIGHTING, null, 1.4, 51, Abilities.STURDY, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SEWADDLE, 5, false, false, false, "Sewing Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 2.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 7.3, Abilities.LEAF_GUARD, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", PokemonType.BUG, PokemonType.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VENIPEDE, 5, false, false, false, "Centipede Pokémon", PokemonType.BUG, PokemonType.POISON, 0.4, 5.3, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 58.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", PokemonType.BUG, PokemonType.POISON, 2.5, 200.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.3, 0.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.7, 6.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PETILIL, 5, false, false, false, "Bulb Pokémon", PokemonType.GRASS, null, 0.5, 6.6, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.LILLIGANT, 5, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 1.1, 16.3, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.BASCULIN, 5, false, false, false, "Hostile Pokémon", PokemonType.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Red-Striped Form", "red-striped", PokemonType.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("Blue-Striped Form", "blue-striped", PokemonType.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("White-Striped Form", "white-striped", PokemonType.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + ), + new PokemonSpecies(Species.SANDILE, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 0.7, 15.2, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 1, 33.4, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", PokemonType.GROUND, PokemonType.DARK, 1.5, 96.3, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", PokemonType.FIRE, null, 0.6, 37.5, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DARMANITAN, 5, false, false, false, "Blazing Pokémon", PokemonType.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.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, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.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, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189), + ), + new PokemonSpecies(Species.MARACTUS, 5, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 1, 28, Abilities.WATER_ABSORB, Abilities.CHLOROPHYLL, Abilities.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.3, 14.5, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.4, 200, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCRAGGY, 5, false, false, false, "Shedding Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 0.6, 11.8, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 1.1, 30, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.4, 14, Abilities.WONDER_SKIN, Abilities.MAGIC_GUARD, Abilities.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.YAMASK, 5, false, false, false, "Spirit Pokémon", PokemonType.GHOST, null, 0.5, 1.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", PokemonType.GHOST, null, 1.7, 76.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.7, 16.5, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 1.2, 81, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.WIMP_OUT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", PokemonType.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), + ), + new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", PokemonType.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", PokemonType.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", PokemonType.NORMAL, null, 0.4, 5.8, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CINCCINO, 5, false, false, false, "Scarf Pokémon", PokemonType.NORMAL, null, 0.5, 7.5, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GOTHITA, 5, false, false, false, "Fixation Pokémon", PokemonType.PSYCHIC, null, 0.4, 5.8, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.7, 18, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", PokemonType.PSYCHIC, null, 1.5, 44, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.SOLOSIS, 5, false, false, false, "Cell Pokémon", PokemonType.PSYCHIC, null, 0.3, 1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DUOSION, 5, false, false, false, "Mitosis Pokémon", PokemonType.PSYCHIC, null, 0.6, 8, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", PokemonType.PSYCHIC, null, 1, 20.1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.5, 5.5, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWANNA, 5, false, false, false, "White Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.3, 24.2, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.4, 5.7, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", PokemonType.ICE, null, 1.1, 41, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", PokemonType.ICE, null, 1.3, 57.5, Abilities.ICE_BODY, Abilities.SNOW_WARNING, Abilities.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DEERLING, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + ), + new PokemonSpecies(Species.SAWSBUCK, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.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, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + ), + new PokemonSpecies(Species.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 5, Abilities.STATIC, Abilities.NONE, Abilities.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KARRABLAST, 5, false, false, false, "Clamping Pokémon", PokemonType.BUG, null, 0.5, 5.9, Abilities.SWARM, Abilities.SHED_SKIN, Abilities.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", PokemonType.BUG, PokemonType.STEEL, 1, 33, Abilities.SWARM, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FOONGUS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.6, 10.5, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FRILLISH, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 1.2, 33, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.JELLICENT, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 2.2, 135, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", PokemonType.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", PokemonType.GRASS, PokemonType.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.KLINKLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 81, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.TYNAMO, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 0.2, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 1.2, 22, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ELGYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 0.5, 9, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 1, 34.5, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LITWICK, 5, false, false, false, "Candle Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.3, 3.1, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LAMPENT, 5, false, false, false, "Lamp Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.6, 13, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CHANDELURE, 5, false, false, false, "Luring Pokémon", PokemonType.GHOST, PokemonType.FIRE, 1, 34.3, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AXEW, 5, false, false, false, "Tusk Pokémon", PokemonType.DRAGON, null, 0.6, 18, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1, 36, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1.8, 105.5, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CUBCHOO, 5, false, false, false, "Chill Pokémon", PokemonType.ICE, null, 0.5, 8.5, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEARTIC, 5, false, false, false, "Freezing Pokémon", PokemonType.ICE, null, 2.6, 260, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", PokemonType.ICE, null, 1.1, 148, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.SHELMET, 5, false, false, false, "Snail Pokémon", PokemonType.BUG, null, 0.4, 7.7, Abilities.HYDRATION, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", PokemonType.BUG, null, 0.8, 25.3, Abilities.HYDRATION, Abilities.STICKY_HOLD, Abilities.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.STUNFISK, 5, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.ELECTRIC, 0.7, 11, Abilities.STATIC, Abilities.LIMBER, Abilities.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 0.9, 20, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 1.4, 35.5, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DRUDDIGON, 5, false, false, false, "Cave Pokémon", PokemonType.DRAGON, null, 1.6, 139, Abilities.ROUGH_SKIN, Abilities.SHEER_FORCE, Abilities.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLETT, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1, 92, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.GOLURK, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 2.8, 330, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 0.5, 10.2, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BISHARP, 5, false, false, false, "Sword Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 1.6, 70, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", PokemonType.NORMAL, null, 1.6, 94.6, Abilities.RECKLESS, Abilities.SAP_SIPPER, Abilities.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RUFFLET, 5, false, false, false, "Eaglet Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 10.5, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.BRAVIARY, 5, false, false, false, "Valiant Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 41, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.VULLABY, 5, false, false, false, "Diapered Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 9, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.2, 39.5, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HEATMOR, 5, false, false, false, "Anteater Pokémon", PokemonType.FIRE, null, 1.4, 58, Abilities.GLUTTONY, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DURANT, 5, false, false, false, "Iron Ant Pokémon", PokemonType.BUG, PokemonType.STEEL, 0.3, 33, Abilities.SWARM, Abilities.HUSTLE, Abilities.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEINO, 5, false, false, false, "Irate Pokémon", PokemonType.DARK, PokemonType.DRAGON, 0.8, 17.3, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.4, 50, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HYDREIGON, 5, false, false, false, "Brutal Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.8, 160, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LARVESTA, 5, false, false, false, "Torch Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.1, 28.8, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VOLCARONA, 5, false, false, false, "Sun Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.6, 46, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.COBALION, 5, true, false, false, "Iron Will Pokémon", PokemonType.STEEL, PokemonType.FIGHTING, 2.1, 250, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TERRAKION, 5, true, false, false, "Cavern Pokémon", PokemonType.ROCK, PokemonType.FIGHTING, 1.9, 260, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.VIRIZION, 5, true, false, false, "Grassland Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 2, 200, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TORNADUS, 5, true, false, false, "Cyclone Pokémon", PokemonType.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.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, Abilities.PRANKSTER, Abilities.NONE, Abilities.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, Abilities.REGENERATOR, Abilities.NONE, Abilities.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), + ), + new PokemonSpecies(Species.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.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, Abilities.PRANKSTER, Abilities.NONE, Abilities.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, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), + ), + new PokemonSpecies(Species.RESHIRAM, 5, false, true, false, "Vast White Pokémon", PokemonType.DRAGON, PokemonType.FIRE, 3.2, 330, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZEKROM, 5, false, true, false, "Deep Black Pokémon", PokemonType.DRAGON, PokemonType.ELECTRIC, 2.9, 345, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LANDORUS, 5, true, false, false, "Abundance Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.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, Abilities.SAND_FORCE, Abilities.NONE, Abilities.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, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), + ), + new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", PokemonType.DRAGON, PokemonType.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.PRESSURE, Abilities.NONE, Abilities.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, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), + new PokemonForm("White", "white", PokemonType.DRAGON, PokemonType.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350), + ), + new PokemonSpecies(Species.KELDEO, 5, false, false, true, "Colt Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.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, Abilities.JUSTIFIED, Abilities.NONE, Abilities.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, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), + ), + new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.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, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.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, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 300, false, null, true), + ), + new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.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, Abilities.DOWNLOAD, Abilities.NONE, Abilities.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, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Burn Drive", "burn", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Chill Drive", "chill", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Douse Drive", "douse", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + ), + new PokemonSpecies(Species.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", PokemonType.GRASS, null, 0.4, 9, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, null, 0.7, 29, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FENNEKIN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.4, 9.4, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), + ), + new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), + ), + new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.TORRENT, Abilities.NONE, Abilities.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, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.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, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), + ), + new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, PokemonType.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.7, Abilities.BIG_PECKS, Abilities.NONE, Abilities.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLETCHINDER, 6, false, false, false, "Ember Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.7, 16, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TALONFLAME, 6, false, false, false, "Scorching Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.2, 24.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + ), + new PokemonSpecies(Species.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.SHED_SKIN, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.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, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + ), + new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.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, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + ), + new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), + new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), + new PokemonSpecies(Species.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + ), + new PokemonSpecies(Species.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + ), + new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + ), + new PokemonSpecies(Species.SKIDDO, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 0.9, 31, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOGOAT, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 1.7, 91, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANCHAM, 6, false, false, false, "Playful Pokémon", PokemonType.FIGHTING, null, 0.6, 8, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANGORO, 6, false, false, false, "Daunting Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 2.1, 136, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FURFROU, 6, false, false, false, "Poodle Pokémon", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.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, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + ), + new PokemonSpecies(Species.ESPURR, 6, false, false, false, "Restraint Pokémon", PokemonType.PSYCHIC, null, 0.3, 3.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", PokemonType.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.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, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), + new PokemonForm("Female", "female", PokemonType.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), + ), + new PokemonSpecies(Species.HONEDGE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 2, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DOUBLADE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 4.5, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.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, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.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, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), + ), + new PokemonSpecies(Species.SPRITZEE, 6, false, false, false, "Perfume Pokémon", PokemonType.FAIRY, null, 0.2, 0.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", PokemonType.FAIRY, null, 0.8, 15.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", PokemonType.FAIRY, null, 0.4, 3.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLURPUFF, 6, false, false, false, "Meringue Pokémon", PokemonType.FAIRY, null, 0.8, 5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.INKAY, 6, false, false, false, "Revolving Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 0.4, 3.5, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MALAMAR, 6, false, false, false, "Overturning Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 1.5, 47, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BINACLE, 6, false, false, false, "Two-Handed Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 31, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BARBARACLE, 6, false, false, false, "Collective Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 96, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.WATER, 0.5, 7.3, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.DRAGON, 1.8, 81.5, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", PokemonType.WATER, null, 0.5, 8.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", PokemonType.WATER, null, 1.3, 35.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HELIOPTILE, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 0.5, 6, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HELIOLISK, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 1, 21, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 0.8, 26, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.TYRANTRUM, 6, false, false, false, "Despot Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 2.5, 270, Abilities.STRONG_JAW, Abilities.NONE, Abilities.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AMAURA, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 1.3, 25.2, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AURORUS, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 2.7, 225, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SYLVEON, 6, false, false, false, "Intertwining Pokémon", PokemonType.FAIRY, null, 1, 23.5, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 0.8, 21.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEDENNE, 6, false, false, false, "Antenna Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 0.2, 2.2, Abilities.CHEEK_POUCH, Abilities.PICKUP, Abilities.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CARBINK, 6, false, false, false, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.3, 5.7, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.3, 2.8, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.8, 17.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GOODRA, 6, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 2, 150.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KLEFKI, 6, false, false, false, "Key Ring Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.2, 3, Abilities.PRANKSTER, Abilities.NONE, Abilities.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.PHANTUMP, 6, false, false, false, "Stump Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 7, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", PokemonType.GHOST, PokemonType.GRASS, 1.5, 71, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true), + ), + new PokemonSpecies(Species.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.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, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true), + ), + new PokemonSpecies(Species.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", PokemonType.ICE, null, 1, 99.5, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AVALUGG, 6, false, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 2, 505, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 0.5, 8, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 1.5, 85, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.XERNEAS, 6, false, true, false, "Life Pokémon", PokemonType.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.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, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), + new PokemonForm("Active Mode", "active", PokemonType.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) + ), + new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", PokemonType.DARK, PokemonType.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.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, Abilities.AURA_BREAK, Abilities.NONE, Abilities.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, Abilities.AURA_BREAK, Abilities.NONE, Abilities.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, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.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, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.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, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.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, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete"), + ), + new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.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, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.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, Abilities.MAGIC_BOUNCE, Abilities.NONE, Abilities.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), + ), + new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.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, Abilities.MAGICIAN, Abilities.NONE, Abilities.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, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340), + ), + new PokemonSpecies(Species.VOLCANION, 6, false, false, true, "Steam Pokémon", PokemonType.FIRE, PokemonType.WATER, 1.7, 195, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ROWLET, 7, false, false, false, "Grass Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.3, 1.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.7, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.6, 36.6, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LITTEN, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.4, 4.3, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.7, 25, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INCINEROAR, 7, false, false, false, "Heel Pokémon", PokemonType.FIRE, PokemonType.DARK, 1.8, 83, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 0.4, 7.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BRIONNE, 7, false, false, false, "Pop Star Pokémon", PokemonType.WATER, null, 0.6, 17.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PRIMARINA, 7, false, false, false, "Soloist Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.8, 44, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.2, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 14.8, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.YUNGOOS, 7, false, false, false, "Loitering Pokémon", PokemonType.NORMAL, null, 0.4, 6, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", PokemonType.NORMAL, null, 0.7, 14.2, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GRUBBIN, 7, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 4.4, Abilities.SWARM, Abilities.NONE, Abilities.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHARJABUG, 7, false, false, false, "Battery Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.5, 10.5, Abilities.BATTERY, Abilities.NONE, Abilities.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 1.5, 45, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", PokemonType.FIGHTING, null, 0.6, 7, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", PokemonType.FIGHTING, PokemonType.ICE, 1.7, 180, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ORICORIO, 7, false, false, false, "Dancing Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.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, Abilities.DANCER, Abilities.NONE, Abilities.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, Abilities.DANCER, Abilities.NONE, Abilities.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, Abilities.DANCER, Abilities.NONE, Abilities.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, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + ), + new PokemonSpecies(Species.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.1, 0.2, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.2, 0.5, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", PokemonType.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.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, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.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, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), + ), + new PokemonSpecies(Species.LYCANROC, 7, false, false, false, "Wolf Pokémon", PokemonType.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.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, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), + new PokemonForm("Midnight Form", "midnight", PokemonType.ROCK, null, 1.1, 25, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.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, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true), + ), + new PokemonSpecies(Species.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", PokemonType.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.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, Abilities.SCHOOLING, Abilities.NONE, Abilities.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, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217), + ), + new PokemonSpecies(Species.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.4, 8, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.7, 14.5, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUDBRAY, 7, false, false, false, "Donkey Pokémon", PokemonType.GROUND, null, 1, 110, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", PokemonType.GROUND, null, 2.5, 920, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 0.3, 4, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 1.8, 82, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", PokemonType.GRASS, null, 0.3, 1.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", PokemonType.GRASS, null, 0.9, 18.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MORELULL, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.2, 1.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1, 11.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 0.6, 4.8, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 1.2, 22.2, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.STUFFUL, 7, false, false, false, "Flailing Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 0.5, 6.8, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 2.1, 135, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.3, 3.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.STEENEE, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.7, 8.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TSAREENA, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 1.2, 21.4, Abilities.LEAF_GUARD, Abilities.QUEENLY_MAJESTY, Abilities.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.COMFEY, 7, false, false, false, "Posy Picker Pokémon", PokemonType.FAIRY, null, 0.1, 0.3, Abilities.FLOWER_VEIL, Abilities.TRIAGE, Abilities.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.ORANGURU, 7, false, false, false, "Sage Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 76, Abilities.INNER_FOCUS, Abilities.TELEPATHY, Abilities.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", PokemonType.FIGHTING, null, 2, 82.8, Abilities.RECEIVER, Abilities.NONE, Abilities.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", PokemonType.BUG, PokemonType.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(Species.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", PokemonType.GHOST, PokemonType.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", PokemonType.GHOST, PokemonType.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", PokemonType.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SILVALLY, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.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, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.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, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Flying", "flying", PokemonType.FLYING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Poison", "poison", PokemonType.POISON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ground", "ground", PokemonType.GROUND, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Rock", "rock", PokemonType.ROCK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Bug", "bug", PokemonType.BUG, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ghost", "ghost", PokemonType.GHOST, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Steel", "steel", PokemonType.STEEL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fire", "fire", PokemonType.FIRE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Water", "water", PokemonType.WATER, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Grass", "grass", PokemonType.GRASS, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Electric", "electric", PokemonType.ELECTRIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Psychic", "psychic", PokemonType.PSYCHIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ice", "ice", PokemonType.ICE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dragon", "dragon", PokemonType.DRAGON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dark", "dark", PokemonType.DARK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fairy", "fairy", PokemonType.FAIRY, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + ), + new PokemonSpecies(Species.MINIOR, 7, false, false, false, "Meteor Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Orange Meteor Form", "orange-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Yellow Meteor Form", "yellow-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Green Meteor Form", "green-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Blue Meteor Form", "blue-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Indigo Meteor Form", "indigo-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Violet Meteor Form", "violet-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Red Core Form", "red", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.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, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + ), + new PokemonSpecies(Species.KOMALA, 7, false, false, false, "Drowsing Pokémon", PokemonType.NORMAL, null, 0.4, 19.9, Abilities.COMATOSE, Abilities.NONE, Abilities.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.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, Abilities.DISGUISE, Abilities.NONE, Abilities.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, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), + ), + new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRAMPA, 7, false, false, false, "Placid Pokémon", PokemonType.NORMAL, PokemonType.DRAGON, 3, 185, Abilities.BERSERK, Abilities.SAP_SIPPER, Abilities.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", PokemonType.GHOST, PokemonType.GRASS, 3.9, 210, Abilities.STEELWORKER, Abilities.NONE, Abilities.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.JANGMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, null, 0.6, 29.7, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.2, 47, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KOMMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.6, 78.2, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 1.8, 20.5, Abilities.ELECTRIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.2, 18.6, Abilities.PSYCHIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1.9, 45.5, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.XURKITREE, 7, true, false, false, "Glowing Pokémon", PokemonType.ELECTRIC, null, 3.8, 100, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CELESTEELA, 7, true, false, false, "Launch Pokémon", PokemonType.STEEL, PokemonType.FLYING, 9.2, 999.9, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.3, 0.1, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", PokemonType.DARK, PokemonType.DRAGON, 5.5, 888, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NECROZMA, 7, false, true, false, "Prism Pokémon", PokemonType.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, false, null, true), + new PokemonForm("Dusk Mane", "dusk-mane", PokemonType.PSYCHIC, PokemonType.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 340), + new PokemonForm("Dawn Wings", "dawn-wings", PokemonType.PSYCHIC, PokemonType.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 340), + new PokemonForm("Ultra", "ultra", PokemonType.PSYCHIC, PokemonType.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 377), + ), + new PokemonSpecies(Species.MAGEARNA, 7, false, false, true, "Artificial Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.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, Abilities.SOUL_HEART, Abilities.NONE, Abilities.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, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), + ), + new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.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, Abilities.TECHNICIAN, Abilities.NONE, Abilities.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, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) + ), + new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.STAKATAKA, 7, true, false, false, "Rampart Pokémon", PokemonType.ROCK, PokemonType.STEEL, 5.5, 820, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.8, 13, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", PokemonType.ELECTRIC, null, 1.5, 44.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), + ), + new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", PokemonType.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", PokemonType.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), + ), + new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), + ), + new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), + ), + new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", PokemonType.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", PokemonType.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", PokemonType.FLYING, null, 0.2, 1.8, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), + ), + new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), + ), + new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 0.4, 2.2, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", PokemonType.GRASS, null, 0.5, 2.5, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WOOLOO, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 0.6, 6, Abilities.FLUFFY, Abilities.RUN_AWAY, Abilities.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUBWOOL, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 1.3, 43, Abilities.FLUFFY, Abilities.STEADFAST, Abilities.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", PokemonType.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), + ), + new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", PokemonType.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", PokemonType.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ROLYCOLY, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, null, 0.3, 12, Abilities.STEAM_ENGINE, Abilities.HEATPROOF, Abilities.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), + ), + new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), + ), + new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), + ), + new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), + ), + new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.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, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), + new PokemonForm("Gorging Form", "gorging", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), + ), + new PokemonSpecies(Species.ARROKUDA, 8, false, false, false, "Rush Pokémon", PokemonType.WATER, null, 0.5, 1, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", PokemonType.WATER, null, 1.3, 30, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TOXEL, 8, false, false, false, "Baby Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 0.4, 11, Abilities.RATTLED, Abilities.STATIC, Abilities.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Amped Form", "amped", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), + new PokemonForm("Low-Key Form", "lowkey", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, PokemonType.POISON, 24, 999.9, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), + ), + new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), + ), + new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", PokemonType.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", PokemonType.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.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, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.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, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true), + ), + new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.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, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.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, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), + ), + new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", PokemonType.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", PokemonType.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.PSYCHIC, PokemonType.FAIRY, 26, 999.9, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), + ), + new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.DARK, PokemonType.FAIRY, 32, 999.9, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), + ), + new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", PokemonType.DARK, PokemonType.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", PokemonType.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CURSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 1, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 117, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MR_RIME, 8, false, false, false, "Comedian Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.5, 58.2, Abilities.TANGLED_FEET, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1.6, 66.6, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MILCERY, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.2, 0.3, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ALCREMIE, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.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, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Caramel Swirl", "caramel-swirl", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Rainbow Swirl", "rainbow-swirl", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FAIRY, null, 30, 999.9, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), + ), + new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", PokemonType.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", PokemonType.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SNOM, 8, false, false, false, "Worm Pokémon", PokemonType.ICE, PokemonType.BUG, 0.3, 3.8, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", PokemonType.ICE, PokemonType.BUG, 1.3, 42, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", PokemonType.ROCK, null, 2.5, 520, Abilities.POWER_SPOT, Abilities.NONE, Abilities.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EISCUE, 8, false, false, false, "Penguin Pokémon", PokemonType.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.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, Abilities.ICE_FACE, Abilities.NONE, Abilities.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, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), + ), + new PokemonSpecies(Species.INDEEDEE, 8, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.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, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.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, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), + ), + new PokemonSpecies(Species.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.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, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.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, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153), + ), + new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), + ), + new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DRACOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.DRAGON, 2.3, 215, Abilities.WATER_ABSORB, Abilities.STRONG_JAW, Abilities.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.DRAGON, 43, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), + ), + new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", PokemonType.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.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, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FAIRY, PokemonType.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 360), + ), + new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", PokemonType.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.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, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360), + ), + new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), + new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), + ), + new PokemonSpecies(Species.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Single Strike Style", "single-strike", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), + new PokemonForm("Rapid Strike Style", "rapid-strike", PokemonType.FIGHTING, PokemonType.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + ), + new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.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, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), + ), + new PokemonSpecies(Species.REGIELEKI, 8, true, false, false, "Electron Pokémon", PokemonType.ELECTRIC, null, 1.2, 145, Abilities.TRANSISTOR, Abilities.NONE, Abilities.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", PokemonType.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", PokemonType.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", PokemonType.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.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, Abilities.UNNERVE, Abilities.NONE, Abilities.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, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), + new PokemonForm("Shadow", "shadow", PokemonType.PSYCHIC, PokemonType.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340), + ), + new PokemonSpecies(Species.WYRDEER, 8, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.8, 95.1, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 135, 50, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.URSALUNA, 8, false, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.4, 290, Abilities.GUTS, Abilities.BULLETPROOF, Abilities.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, "", true), + new PokemonForm("Female", "female", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265, false, null, true), + ), + new PokemonSpecies(Species.SNEASLER, 8, false, false, false, "Free Climb Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 1.3, 43, Abilities.PRESSURE, Abilities.UNBURDEN, Abilities.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 135, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", PokemonType.DARK, PokemonType.POISON, 2.5, 60.5, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 135, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.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, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.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, Abilities.OVERCOAT, Abilities.NONE, Abilities.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), + ), + new PokemonSpecies(Species.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.4, 4.1, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.9, 12.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.5, 31.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 0.4, 9.8, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 1, 30.7, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 326.5, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAXLY, 9, false, false, false, "Duckling Pokémon", PokemonType.WATER, null, 0.5, 6.1, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAXWELL, 9, false, false, false, "Practicing Pokémon", PokemonType.WATER, null, 1.2, 21.5, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.8, 61.9, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LECHONK, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 0.5, 10.2, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.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, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), + new PokemonForm("Female", "female", PokemonType.NORMAL, null, 1, 120, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true), + ), + new PokemonSpecies(Species.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", PokemonType.BUG, null, 0.3, 4, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SPIDOPS, 9, false, false, false, "Trap Pokémon", PokemonType.BUG, null, 1, 16.5, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, null, 0.2, 1, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LOKIX, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, PokemonType.DARK, 1, 17.5, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMI, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2.5, Abilities.STATIC, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMO, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.4, 6.5, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMOT, 9, false, false, false, "Hands-On Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.9, 41, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TANDEMAUS, 9, false, false, false, "Couple Pokémon", PokemonType.NORMAL, null, 0.3, 1.8, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.MAUSHOLD, 9, false, false, false, "Family Pokémon", PokemonType.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.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, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + new PokemonForm("Family of Three", "three", PokemonType.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + ), + new PokemonSpecies(Species.FIDOUGH, 9, false, false, false, "Puppy Pokémon", PokemonType.FAIRY, null, 0.3, 10.9, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DACHSBUN, 9, false, false, false, "Dog Pokémon", PokemonType.FAIRY, null, 0.5, 14.9, Abilities.WELL_BAKED_BODY, Abilities.NONE, Abilities.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SMOLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.3, 6.5, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DOLLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.6, 11.9, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ARBOLIVA, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 1.4, 48.2, Abilities.SEED_SOWER, Abilities.NONE, Abilities.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.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, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.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, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.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, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.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, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + ), + new PokemonSpecies(Species.NACLI, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.4, 16, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.6, 105, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 2.3, 240, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CHARCADET, 9, false, false, false, "Fire Child Pokémon", PokemonType.FIRE, null, 0.6, 10.5, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 85, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 62, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TADBULB, 9, false, false, false, "EleTadpole Pokémon", PokemonType.ELECTRIC, null, 0.3, 0.4, Abilities.OWN_TEMPO, Abilities.STATIC, Abilities.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", PokemonType.ELECTRIC, null, 1.2, 113, Abilities.ELECTROMORPHOSIS, Abilities.STATIC, Abilities.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 3.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.4, 38.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MASCHIFF, 9, false, false, false, "Rascal Pokémon", PokemonType.DARK, null, 0.5, 16, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", PokemonType.DARK, null, 1.1, 61, Abilities.INTIMIDATE, Abilities.GUARD_DOG, Abilities.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.2, 0.7, Abilities.UNBURDEN, Abilities.PICKPOCKET, Abilities.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.7, 27.2, Abilities.UNBURDEN, Abilities.POISON_TOUCH, Abilities.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.6, 0.6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.2, 6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 0.9, 33, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 1.9, 58, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KLAWF, 9, false, false, false, "Ambush Pokémon", PokemonType.ROCK, null, 1.3, 79, Abilities.ANGER_SHELL, Abilities.SHELL_ARMOR, Abilities.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, null, 0.3, 3, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, PokemonType.FIRE, 0.9, 15, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RELLOR, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, null, 0.2, 1, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.RABSCA, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.3, 3.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.FLITTLE, 9, false, false, false, "Frill Pokémon", PokemonType.PSYCHIC, null, 0.2, 1.5, Abilities.ANTICIPATION, Abilities.FRISK, Abilities.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", PokemonType.PSYCHIC, null, 1.9, 90, Abilities.OPPORTUNIST, Abilities.FRISK, Abilities.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.4, 8.9, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TINKATUFF, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 59.1, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TINKATON, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 112.8, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 1.8, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 5.4, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", PokemonType.FLYING, PokemonType.DARK, 1.5, 42.9, Abilities.BIG_PECKS, Abilities.KEEN_EYE, Abilities.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FINIZEN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, Abilities.WATER_VEIL, Abilities.NONE, Abilities.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PALAFIN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.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, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.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, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), + ), + new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.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, Abilities.OVERCOAT, Abilities.NONE, Abilities.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, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + ), + new PokemonSpecies(Species.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, Abilities.SHED_SKIN, Abilities.NONE, Abilities.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, Abilities.EARTH_EATER, Abilities.NONE, Abilities.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GLIMMET, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 0.7, 8, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLIMMORA, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.5, 45, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 0.6, 35, Abilities.PICKUP, Abilities.NONE, Abilities.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 2, 15, Abilities.SAND_RUSH, Abilities.NONE, Abilities.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", PokemonType.FLYING, PokemonType.FIGHTING, 1.6, 37, Abilities.SCRAPPY, Abilities.TANGLED_FEET, Abilities.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 1.2, 45, Abilities.THICK_FAT, Abilities.SNOW_CLOAK, Abilities.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CETITAN, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 4.5, 700, Abilities.THICK_FAT, Abilities.SLUSH_RUSH, Abilities.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VELUZA, 9, false, false, false, "Jettison Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2.5, 90, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", PokemonType.WATER, null, 12, 220, Abilities.UNAWARE, Abilities.OBLIVIOUS, Abilities.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.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, Abilities.COMMANDER, Abilities.NONE, Abilities.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, Abilities.COMMANDER, Abilities.NONE, Abilities.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, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + ), + new PokemonSpecies(Species.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.8, 223, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 3.2, 160, Abilities.CUD_CHEW, Abilities.ARMOR_TAIL, Abilities.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.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, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.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, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182), + ), + new PokemonSpecies(Species.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 2, 120, Abilities.DEFIANT, Abilities.SUPREME_OVERLORD, Abilities.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.FIGHTING, 2.2, 320, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.PSYCHIC, 1.2, 8, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.2, 21, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 1.4, 4, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 3.2, 92, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.GROUND, 2.3, 60, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.9, 240, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", PokemonType.ICE, PokemonType.WATER, 0.6, 11, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.ELECTRIC, 1.8, 380.7, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.3, 111, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.POISON, 1.2, 36, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.6, 303, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.5, 17, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.8, 30, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", PokemonType.DRAGON, PokemonType.ICE, 2.1, 210, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", PokemonType.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.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, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), + new PokemonForm("Roaming Form", "roaming", PokemonType.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), + ), + new PokemonSpecies(Species.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.2, 30, Abilities.GOOD_AS_GOLD, Abilities.NONE, Abilities.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.5, 74.2, Abilities.TABLETS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.ICE, 1.9, 152.2, Abilities.SWORD_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TING_LU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GROUND, 2.7, 699.7, Abilities.VESSEL_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CHI_YU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.4, 4.9, Abilities.BEADS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", PokemonType.DRAGON, PokemonType.DARK, 2, 380, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.FIGHTING, 1.4, 35, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.KORAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.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, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + ), + new PokemonSpecies(Species.MIRAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.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, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + ), + new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", PokemonType.WATER, PokemonType.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.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(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.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(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.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, Abilities.HOSPITALITY, Abilities.NONE, Abilities.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, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), + ), + new PokemonSpecies(Species.SINISTCHA, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.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, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), + new PokemonForm("Masterpiece Form", "masterpiece", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), + ), + new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", PokemonType.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.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, Abilities.DEFIANT, Abilities.NONE, Abilities.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, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.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, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.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, Abilities.STURDY, Abilities.NONE, Abilities.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, Abilities.EMBODY_ASPECT_TEAL, Abilities.NONE, Abilities.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, Abilities.EMBODY_ASPECT_WELLSPRING, Abilities.NONE, Abilities.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, Abilities.EMBODY_ASPECT_HEARTHFLAME, Abilities.NONE, Abilities.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, Abilities.EMBODY_ASPECT_CORNERSTONE, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + ), + new PokemonSpecies(Species.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 2, 60, Abilities.STAMINA, Abilities.STURDY, Abilities.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 1.8, 93, Abilities.SUPERSWEET_SYRUP, Abilities.REGENERATOR, Abilities.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 3.5, 590, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 5.2, 480, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.5, 162.5, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 156, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TERAPAGOS, 9, false, true, false, "Tera Pokémon", PokemonType.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.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, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.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, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), + new PokemonForm("Stellar Form", "stellar", PokemonType.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140), + ), + new PokemonSpecies(Species.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", PokemonType.POISON, PokemonType.GHOST, 0.3, 0.3, Abilities.POISON_PUPPETEER, Abilities.NONE, Abilities.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.3, 3.8, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.7, 25.5, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.PSYCHIC, 0.7, 21, Abilities.SURGE_SURFER, Abilities.NONE, Abilities.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 0.7, 40, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 1.2, 55, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, null, 0.6, 9.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, PokemonType.FAIRY, 1.1, 19.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.2, 1, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 66.6, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", PokemonType.DARK, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", PokemonType.DARK, null, 1.1, 33, Abilities.FUR_COAT, Abilities.TECHNICIAN, Abilities.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 0.4, 20.3, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1, 110, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.7, 316, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 0.7, 42, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 52, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 10.9, 415.6, Abilities.FRISK, Abilities.NONE, Abilities.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1, 34, Abilities.CURSED_BODY, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.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(Species.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", PokemonType.STEEL, null, 0.4, 7.5, Abilities.PICKUP, Abilities.TOUGH_CLAWS, Abilities.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, null, 0.8, 24, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.7, 80, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", PokemonType.PSYCHIC, null, 1.2, 36, Abilities.GLUTTONY, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.6, 70.5, Abilities.QUICK_DRAW, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 42, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, PokemonType.FAIRY, 3, 16, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 56.8, Abilities.VITAL_SPIRIT, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 50.9, Abilities.COMPETITIVE, Abilities.NONE, Abilities.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 1.6, 58.2, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", PokemonType.DARK, PokemonType.FLYING, 2, 66, Abilities.BERSERK, Abilities.NONE, Abilities.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.8, 79.5, Abilities.CURIOUS_MEDICINE, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 0.6, 0.5, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", PokemonType.ICE, null, 0.7, 40, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", PokemonType.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.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, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.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, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189), + ), + new PokemonSpecies(Species.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", PokemonType.GROUND, PokemonType.GHOST, 0.5, 1.5, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 20.5, Abilities.MIMICRY, Abilities.NONE, Abilities.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 22.7, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", PokemonType.FIRE, PokemonType.ROCK, 2, 168, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 0.5, 13, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 1.2, 81, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 69.8, Abilities.BLAZE, Abilities.NONE, Abilities.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", PokemonType.DARK, PokemonType.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 0.9, 27, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 58.2, Abilities.TORRENT, Abilities.NONE, Abilities.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 19.2, Abilities.CHLOROPHYLL, Abilities.HUSTLE, Abilities.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 1.6, 83, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 43.4, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 0.7, 68.5, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.7, 334.1, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", PokemonType.ICE, PokemonType.ROCK, 1.4, 262.4, Abilities.STRONG_JAW, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 37, Abilities.OVERGROW, Abilities.NONE, Abilities.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", PokemonType.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.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, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.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, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.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, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), + ), + new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.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/terrain.ts b/src/data/terrain.ts index 1ffe0adc8bf..c727ef724c9 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -1,7 +1,7 @@ import type Pokemon from "../field/pokemon"; -import type Move from "./move"; -import { Type } from "#enums/type"; -import { ProtectAttr } from "./move"; +import type Move from "./moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { ProtectAttr } from "./moves/move"; import type { BattlerIndex } from "#app/battle"; import i18next from "i18next"; @@ -30,20 +30,20 @@ export class Terrain { return true; } - getAttackTypeMultiplier(attackType: Type): number { + getAttackTypeMultiplier(attackType: PokemonType): number { switch (this.terrainType) { case TerrainType.ELECTRIC: - if (attackType === Type.ELECTRIC) { + if (attackType === PokemonType.ELECTRIC) { return 1.3; } break; case TerrainType.GRASSY: - if (attackType === Type.GRASS) { + if (attackType === PokemonType.GRASS) { return 1.3; } break; case TerrainType.PSYCHIC: - if (attackType === Type.PSYCHIC) { + if (attackType === PokemonType.PSYCHIC) { return 1.3; } break; diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 21b04c182e6..2b912bda603 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -11,7 +11,7 @@ import type { PokemonSpeciesFilter } from "#app/data/pokemon-species"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { tmSpecies } from "#app/data/balance/tms"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { doubleBattleDialogue } from "#app/data/dialogue"; import type { PersistentModifier } from "#app/modifier/modifier"; import { TrainerVariant } from "#app/field/trainer"; @@ -254,7 +254,7 @@ export class TrainerConfig { public partyMemberFuncs: PartyMemberFuncs = {}; public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; - public specialtyType: Type; + public specialtyType: PokemonType; public hasVoucher: boolean = false; public trainerAI: TrainerAI; @@ -586,7 +586,7 @@ export class TrainerConfig { return this; } - setSpecialtyType(specialtyType: Type): TrainerConfig { + setSpecialtyType(specialtyType: PokemonType): TrainerConfig { this.specialtyType = specialtyType; return this; } @@ -604,7 +604,7 @@ export class TrainerConfig { */ setRandomTeraModifiers(count: () => number, slot?: number): TrainerConfig { this.genAIFuncs.push((party: EnemyPokemon[]) => { - const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === Type.BUG; // Better to check one time than 6 + const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === PokemonType.BUG; // Better to check one time than 6 const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length) : -1; // If we have a tera slot defined, wrap it to party size. @@ -789,7 +789,7 @@ export class TrainerConfig { * @param specialtyType The specialty Type of the admin, if they have one * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[], specialtyType?: Type): TrainerConfig { + initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[], specialtyType?: PokemonType): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -851,11 +851,11 @@ export class TrainerConfig { /** * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param {Type} specialtyType The specialty type for the evil team Leader. + * @param {PokemonType} specialtyType The specialty type for the evil team Leader. * @param boolean Whether or not this is the rematch fight * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, specialtyType?: Type): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, specialtyType?: PokemonType): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -891,12 +891,12 @@ export class TrainerConfig { * Initializes the trainer configuration for a Gym Leader. * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). - * @param {Type} specialtyType The specialty type for the Gym Leader. + * @param {PokemonType} specialtyType The specialty type for the Gym Leader. * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType: Type, ignoreMinTeraWave: boolean = false, teraSlot?: number): TrainerConfig { + initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType: PokemonType, ignoreMinTeraWave: boolean = false, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -945,11 +945,11 @@ export class TrainerConfig { * Initializes the trainer configuration for an Elite Four member. * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). - * @param specialtyType {Type} The specialty type for the Elite Four member. + * @param specialtyType {PokemonType} The specialty type for the Elite Four member. * @param teraSlot Optional, sets the party member in this slot to Terastallize. * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType?: Type, teraSlot?: number): TrainerConfig { + initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType?: PokemonType, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -1149,7 +1149,7 @@ export class TrainerConfig { * @returns true if specialtyType is defined and not Type.UNKNOWN */ hasSpecialtyType(): boolean { - return !Utils.isNullOrUndefined(this.specialtyType) && this.specialtyType !== Type.UNKNOWN; + return !Utils.isNullOrUndefined(this.specialtyType) && this.specialtyType !== PokemonType.UNKNOWN; } /** @@ -1418,7 +1418,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) .setSpeciesPools([ Species.SMEARGLE ]), [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) + [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(PokemonType.FLYING) || s.isOfType(PokemonType.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ], @@ -1426,10 +1426,10 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP ], [TrainerPoolTier.SUPER_RARE]: [ Species.GALAR_DARUMAKA, Species.TEDDIURSA ] }), - [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), + [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(PokemonType.GRASS) || s.isOfType(PokemonType.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), - [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.FIGHTING) + [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.POISON)), + [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(PokemonType.FIGHTING) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], @@ -1468,8 +1468,8 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK) - .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)), - [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyType(Type.WATER) + .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(PokemonType.FIRE)), + [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyType(PokemonType.WATER) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], @@ -1477,7 +1477,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] }), - [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), + [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(PokemonType.ELECTRIC).setSpeciesFilter(s => s.isOfType(PokemonType.ELECTRIC)), [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) @@ -1487,7 +1487,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER ], [TrainerPoolTier.SUPER_RARE]: [ Species.MAGBY, Species.LARVITAR ] }), - [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)), + [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.JANITOR]: new TrainerConfig(++t).setMoneyMultiplier(1.1).setEncounterBgm(TrainerType.CLERK), @@ -1496,7 +1496,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.MUSICIAN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC) .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG) - .setSpeciesFilter(s => s.isOfType(Type.GHOST)), + .setSpeciesFilter(s => s.isOfType(PokemonType.GHOST)), [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK) .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG) @@ -1507,7 +1507,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [], [TrainerPoolTier.ULTRA_RARE]: [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU ] }), - [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)), + [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN) .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME), @@ -1536,8 +1536,8 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"), [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH), - [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)), - [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(Type.WATER) || s.isOfType(Type.FIGHTING)), + [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(PokemonType.DARK)), + [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(PokemonType.WATER) || s.isOfType(PokemonType.FIGHTING)), [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ], @@ -1547,7 +1547,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ] }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), + [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(PokemonType.ICE) || s.isOfType(PokemonType.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") .setSpeciesPools({ @@ -1556,20 +1556,20 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyType(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), + [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyType(PokemonType.WATER).setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER)) .setEncounterBgm(TrainerType.TWINS), - [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)), + [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(PokemonType.DRAGON)), [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ], [TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ], [TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ] }), - [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)), + [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(PokemonType.ROCK) || s.isOfType(PokemonType.STEEL)), [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) .setSpeciesPools( [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] @@ -1662,148 +1662,148 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.MANKEY, Species.PAWNIARD, Species.CHARCADET, Species.FLITTLE, Species.VAROOM, Species.ORTHWORM ], [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.GIMMIGHOUL ] }), - [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ], Type.DARK).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ], PokemonType.DARK).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Segin Starmobile p.moveset = [ new PokemonMove(Moves.WICKED_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ], Type.FIRE).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ], PokemonType.FIRE).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 2; // Schedar Starmobile p.moveset = [ new PokemonMove(Moves.BLAZING_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ], Type.POISON).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ], PokemonType.POISON).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 3; // Navi Starmobile p.moveset = [ new PokemonMove(Moves.NOXIOUS_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ], Type.FAIRY).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ], PokemonType.FAIRY).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 4; // Ruchbah Starmobile p.moveset = [ new PokemonMove(Moves.MAGICAL_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ], Type.FIGHTING).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ], PokemonType.FIGHTING).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 5; // Caph Starmobile p.moveset = [ new PokemonMove(Moves.COMBAT_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, Type.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, Type.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, Type.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, Type.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, Type.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, Type.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, Type.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, Type.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, Type.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, Type.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, Type.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, Type.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, Type.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, Type.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, Type.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, Type.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, Type.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, Type.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, Type.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"), - [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"), - [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, Type.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, Type.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, Type.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, Type.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, Type.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, Type.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, Type.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, Type.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, Type.GRASS).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, Type.FIRE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, Type.POISON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, Type.BUG).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, Type.ELECTRIC).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, Type.GROUND).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, Type.FLYING).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, Type.ICE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, Type.DRAGON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, Type.BUG).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, Type.ROCK).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, Type.FIGHTING).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, Type.GRASS).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, Type.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, Type.FAIRY).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, Type.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, Type.ICE).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, Type.GRASS).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, Type.WATER).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, Type.FIRE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, Type.GHOST).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, Type.ROCK).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, Type.ICE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, PokemonType.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, PokemonType.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, PokemonType.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, PokemonType.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, PokemonType.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, PokemonType.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, PokemonType.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, PokemonType.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, PokemonType.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, PokemonType.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, PokemonType.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, PokemonType.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, PokemonType.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, PokemonType.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, PokemonType.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, PokemonType.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, PokemonType.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, PokemonType.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, PokemonType.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, PokemonType.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, PokemonType.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, PokemonType.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, PokemonType.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"), + [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, PokemonType.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"), + [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, PokemonType.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, PokemonType.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, PokemonType.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, PokemonType.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, PokemonType.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, PokemonType.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, PokemonType.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, PokemonType.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, PokemonType.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, PokemonType.GRASS).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, PokemonType.FIRE).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, PokemonType.WATER).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, PokemonType.NORMAL).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, PokemonType.NORMAL).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, PokemonType.POISON).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, PokemonType.BUG).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, PokemonType.ELECTRIC).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, PokemonType.GROUND).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, PokemonType.FLYING).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, PokemonType.ICE).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, PokemonType.WATER).setMixedBattleBgm("battle_unova_gym"), + [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, PokemonType.BUG).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, PokemonType.ROCK).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, PokemonType.GRASS).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, PokemonType.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, PokemonType.FAIRY).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, PokemonType.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, PokemonType.ICE).setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, PokemonType.GRASS).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, PokemonType.WATER).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, PokemonType.FIRE).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, PokemonType.GHOST).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, PokemonType.FAIRY).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, PokemonType.FAIRY).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, PokemonType.ROCK).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, PokemonType.ICE).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, PokemonType.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, PokemonType.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), + [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, PokemonType.BUG, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, PokemonType.GRASS, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, PokemonType.ELECTRIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, PokemonType.WATER, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, PokemonType.NORMAL, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, PokemonType.GHOST, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, PokemonType.PSYCHIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, PokemonType.ICE, true, -1).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, Type.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, Type.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, Type.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, Type.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, Type.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, Type.DARK).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, Type.GHOST).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, Type.ICE).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE, 3).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, Type.DARK).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, Type.PSYCHIC).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, Type.FIRE).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, Type.WATER).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, Type.STEEL).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, Type.DRAGON).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, Type.FIGHTING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, Type.STEEL).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, Type.ROCK).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, Type.GHOST).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, Type.FLYING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, Type.DARK).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, Type.WATER).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.FLYING, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY, 5).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, PokemonType.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, PokemonType.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, PokemonType.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, PokemonType.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, PokemonType.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, PokemonType.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, PokemonType.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), + [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, PokemonType.DARK).setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, PokemonType.GHOST).setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, PokemonType.ICE).setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, PokemonType.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, PokemonType.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, PokemonType.FIRE, 3).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, PokemonType.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, PokemonType.GHOST).setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, PokemonType.FIGHTING).setMixedBattleBgm("battle_unova_elite"), + [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, PokemonType.DARK).setMixedBattleBgm("battle_unova_elite"), + [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, PokemonType.PSYCHIC).setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, PokemonType.FIRE).setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, PokemonType.WATER).setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, PokemonType.STEEL).setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, PokemonType.DRAGON).setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, PokemonType.FIGHTING).setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, PokemonType.STEEL).setMixedBattleBgm("battle_alola_elite"), + [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, PokemonType.ROCK).setMixedBattleBgm("battle_alola_elite"), + [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, PokemonType.GHOST).setMixedBattleBgm("battle_alola_elite"), + [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, PokemonType.FLYING).setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, PokemonType.DARK).setMixedBattleBgm("battle_galar_elite"), + [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, PokemonType.WATER).setMixedBattleBgm("battle_galar_elite"), + [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, PokemonType.FIGHTING).setMixedBattleBgm("battle_galar_elite"), + [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, PokemonType.GHOST).setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, PokemonType.DRAGON).setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, PokemonType.GROUND, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, PokemonType.STEEL, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, PokemonType.FLYING, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, PokemonType.DRAGON, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, PokemonType.FIRE, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, PokemonType.STEEL, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, PokemonType.FAIRY, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, PokemonType.DRAGON, 5).setMixedBattleBgm("battle_bb_elite"), [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ])) @@ -1858,7 +1858,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { - p.teraType = Type.DRAGON; + p.teraType = PokemonType.DRAGON; p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { @@ -1946,7 +1946,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.speciesId === Species.KROOKODILE ? Type.DARK : p.species.type1; + p.teraType = p.species.speciesId === Species.KROOKODILE ? PokemonType.DARK : p.species.type1; })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.VOLCARONA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1962,7 +1962,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { - p.teraType = Type.DRAGON; + p.teraType = PokemonType.DRAGON; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // G-Max Lapras @@ -2085,7 +2085,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = Type.PSYCHIC; + p.teraType = PokemonType.PSYCHIC; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_DARMANITAN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2120,7 +2120,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KINGAMBIT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Supreme Overlord - p.teraType = Type.FLYING; + p.teraType = PokemonType.FLYING; })) .setInstantTera(5), // Tera Flying Kingambit [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_nemona") diff --git a/src/data/type.ts b/src/data/type.ts index 498394bf90e..c57fd3b94a3 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -1,266 +1,266 @@ -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; export type TypeDamageMultiplier = 0 | 0.125 | 0.25 | 0.5 | 1 | 2 | 4 | 8; -export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDamageMultiplier { - if (attackType === Type.UNKNOWN || defType === Type.UNKNOWN) { +export function getTypeDamageMultiplier(attackType: PokemonType, defType: PokemonType): TypeDamageMultiplier { + if (attackType === PokemonType.UNKNOWN || defType === PokemonType.UNKNOWN) { return 1; } switch (defType) { - case Type.NORMAL: + case PokemonType.NORMAL: switch (attackType) { - case Type.FIGHTING: + case PokemonType.FIGHTING: return 2; - case Type.GHOST: + case PokemonType.GHOST: return 0; default: return 1; } - case Type.FIGHTING: + case PokemonType.FIGHTING: switch (attackType) { - case Type.FLYING: - case Type.PSYCHIC: - case Type.FAIRY: + case PokemonType.FLYING: + case PokemonType.PSYCHIC: + case PokemonType.FAIRY: return 2; - case Type.ROCK: - case Type.BUG: - case Type.DARK: + case PokemonType.ROCK: + case PokemonType.BUG: + case PokemonType.DARK: return 0.5; default: return 1; } - case Type.FLYING: + case PokemonType.FLYING: switch (attackType) { - case Type.ROCK: - case Type.ELECTRIC: - case Type.ICE: + case PokemonType.ROCK: + case PokemonType.ELECTRIC: + case PokemonType.ICE: return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.GRASS: return 0.5; - case Type.GROUND: + case PokemonType.GROUND: return 0; default: return 1; } - case Type.POISON: + case PokemonType.POISON: switch (attackType) { - case Type.GROUND: - case Type.PSYCHIC: + case PokemonType.GROUND: + case PokemonType.PSYCHIC: return 2; - case Type.FIGHTING: - case Type.POISON: - case Type.BUG: - case Type.GRASS: - case Type.FAIRY: + case PokemonType.FIGHTING: + case PokemonType.POISON: + case PokemonType.BUG: + case PokemonType.GRASS: + case PokemonType.FAIRY: return 0.5; default: return 1; } - case Type.GROUND: + case PokemonType.GROUND: switch (attackType) { - case Type.WATER: - case Type.GRASS: - case Type.ICE: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ICE: return 2; - case Type.POISON: - case Type.ROCK: + case PokemonType.POISON: + case PokemonType.ROCK: return 0.5; - case Type.ELECTRIC: + case PokemonType.ELECTRIC: return 0; default: return 1; } - case Type.ROCK: + case PokemonType.ROCK: switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.STEEL: - case Type.WATER: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.STEEL: + case PokemonType.WATER: + case PokemonType.GRASS: return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.FIRE: + case PokemonType.NORMAL: + case PokemonType.FLYING: + case PokemonType.POISON: + case PokemonType.FIRE: return 0.5; default: return 1; } - case Type.BUG: + case PokemonType.BUG: switch (attackType) { - case Type.FLYING: - case Type.ROCK: - case Type.FIRE: + case PokemonType.FLYING: + case PokemonType.ROCK: + case PokemonType.FIRE: return 2; - case Type.FIGHTING: - case Type.GROUND: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.GRASS: return 0.5; default: return 1; } - case Type.GHOST: + case PokemonType.GHOST: switch (attackType) { - case Type.GHOST: - case Type.DARK: + case PokemonType.GHOST: + case PokemonType.DARK: return 2; - case Type.POISON: - case Type.BUG: + case PokemonType.POISON: + case PokemonType.BUG: return 0.5; - case Type.NORMAL: - case Type.FIGHTING: + case PokemonType.NORMAL: + case PokemonType.FIGHTING: return 0; default: return 1; } - case Type.STEEL: + case PokemonType.STEEL: switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.FIRE: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.FIRE: return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.ROCK: - case Type.BUG: - case Type.STEEL: - case Type.GRASS: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: + case PokemonType.NORMAL: + case PokemonType.FLYING: + case PokemonType.ROCK: + case PokemonType.BUG: + case PokemonType.STEEL: + case PokemonType.GRASS: + case PokemonType.PSYCHIC: + case PokemonType.ICE: + case PokemonType.DRAGON: + case PokemonType.FAIRY: return 0.5; - case Type.POISON: + case PokemonType.POISON: return 0; default: return 1; } - case Type.FIRE: + case PokemonType.FIRE: switch (attackType) { - case Type.GROUND: - case Type.ROCK: - case Type.WATER: + case PokemonType.GROUND: + case PokemonType.ROCK: + case PokemonType.WATER: return 2; - case Type.BUG: - case Type.STEEL: - case Type.FIRE: - case Type.GRASS: - case Type.ICE: - case Type.FAIRY: + case PokemonType.BUG: + case PokemonType.STEEL: + case PokemonType.FIRE: + case PokemonType.GRASS: + case PokemonType.ICE: + case PokemonType.FAIRY: return 0.5; default: return 1; } - case Type.WATER: + case PokemonType.WATER: switch (attackType) { - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 2; - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.ICE: + case PokemonType.STEEL: + case PokemonType.FIRE: + case PokemonType.WATER: + case PokemonType.ICE: return 0.5; default: return 1; } - case Type.GRASS: + case PokemonType.GRASS: switch (attackType) { - case Type.FLYING: - case Type.POISON: - case Type.BUG: - case Type.FIRE: - case Type.ICE: + case PokemonType.FLYING: + case PokemonType.POISON: + case PokemonType.BUG: + case PokemonType.FIRE: + case PokemonType.ICE: return 2; - case Type.GROUND: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.GROUND: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.ELECTRIC: + case PokemonType.ELECTRIC: switch (attackType) { - case Type.GROUND: + case PokemonType.GROUND: return 2; - case Type.FLYING: - case Type.STEEL: - case Type.ELECTRIC: + case PokemonType.FLYING: + case PokemonType.STEEL: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.PSYCHIC: + case PokemonType.PSYCHIC: switch (attackType) { - case Type.BUG: - case Type.GHOST: - case Type.DARK: + case PokemonType.BUG: + case PokemonType.GHOST: + case PokemonType.DARK: return 2; - case Type.FIGHTING: - case Type.PSYCHIC: + case PokemonType.FIGHTING: + case PokemonType.PSYCHIC: return 0.5; default: return 1; } - case Type.ICE: + case PokemonType.ICE: switch (attackType) { - case Type.FIGHTING: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: + case PokemonType.FIGHTING: + case PokemonType.ROCK: + case PokemonType.STEEL: + case PokemonType.FIRE: return 2; - case Type.ICE: + case PokemonType.ICE: return 0.5; default: return 1; } - case Type.DRAGON: + case PokemonType.DRAGON: switch (attackType) { - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: + case PokemonType.ICE: + case PokemonType.DRAGON: + case PokemonType.FAIRY: return 2; - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.FIRE: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.DARK: + case PokemonType.DARK: switch (attackType) { - case Type.FIGHTING: - case Type.BUG: - case Type.FAIRY: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.FAIRY: return 2; - case Type.GHOST: - case Type.DARK: + case PokemonType.GHOST: + case PokemonType.DARK: return 0.5; - case Type.PSYCHIC: + case PokemonType.PSYCHIC: return 0; default: return 1; } - case Type.FAIRY: + case PokemonType.FAIRY: switch (attackType) { - case Type.POISON: - case Type.STEEL: + case PokemonType.POISON: + case PokemonType.STEEL: return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.DARK: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.DARK: return 0.5; - case Type.DRAGON: + case PokemonType.DRAGON: return 0; default: return 1; } - case Type.STELLAR: + case PokemonType.STELLAR: return 1; } @@ -313,45 +313,45 @@ export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, s } } -export function getTypeRgb(type: Type): [ number, number, number ] { +export function getTypeRgb(type: PokemonType): [ number, number, number ] { switch (type) { - case Type.NORMAL: + case PokemonType.NORMAL: return [ 168, 168, 120 ]; - case Type.FIGHTING: + case PokemonType.FIGHTING: return [ 192, 48, 40 ]; - case Type.FLYING: + case PokemonType.FLYING: return [ 168, 144, 240 ]; - case Type.POISON: + case PokemonType.POISON: return [ 160, 64, 160 ]; - case Type.GROUND: + case PokemonType.GROUND: return [ 224, 192, 104 ]; - case Type.ROCK: + case PokemonType.ROCK: return [ 184, 160, 56 ]; - case Type.BUG: + case PokemonType.BUG: return [ 168, 184, 32 ]; - case Type.GHOST: + case PokemonType.GHOST: return [ 112, 88, 152 ]; - case Type.STEEL: + case PokemonType.STEEL: return [ 184, 184, 208 ]; - case Type.FIRE: + case PokemonType.FIRE: return [ 240, 128, 48 ]; - case Type.WATER: + case PokemonType.WATER: return [ 104, 144, 240 ]; - case Type.GRASS: + case PokemonType.GRASS: return [ 120, 200, 80 ]; - case Type.ELECTRIC: + case PokemonType.ELECTRIC: return [ 248, 208, 48 ]; - case Type.PSYCHIC: + case PokemonType.PSYCHIC: return [ 248, 88, 136 ]; - case Type.ICE: + case PokemonType.ICE: return [ 152, 216, 216 ]; - case Type.DRAGON: + case PokemonType.DRAGON: return [ 112, 56, 248 ]; - case Type.DARK: + case PokemonType.DARK: return [ 112, 88, 72 ]; - case Type.FAIRY: + case PokemonType.FAIRY: return [ 232, 136, 200 ]; - case Type.STELLAR: + case PokemonType.STELLAR: return [ 255, 255, 255 ]; default: return [ 0, 0, 0 ]; diff --git a/src/data/weather.ts b/src/data/weather.ts index 587d46f0772..2b7333de7dd 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -2,9 +2,9 @@ import { Biome } from "#enums/biome"; import { WeatherType } from "#enums/weather-type"; import { getPokemonNameWithAffix } from "../messages"; import type Pokemon from "../field/pokemon"; -import { Type } from "#enums/type"; -import type Move from "./move"; -import { AttackMove } from "./move"; +import { PokemonType } from "#enums/pokemon-type"; +import type Move from "./moves/move"; +import { AttackMove } from "./moves/move"; import * as Utils from "../utils"; import { SuppressWeatherEffectAbAttr } from "./ability"; import { TerrainType, getTerrainName } from "./terrain"; @@ -53,34 +53,34 @@ export class Weather { return false; } - isTypeDamageImmune(type: Type): boolean { + isTypeDamageImmune(type: PokemonType): boolean { switch (this.weatherType) { case WeatherType.SANDSTORM: - return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; + return type === PokemonType.GROUND || type === PokemonType.ROCK || type === PokemonType.STEEL; case WeatherType.HAIL: - return type === Type.ICE; + return type === PokemonType.ICE; } return false; } - getAttackTypeMultiplier(attackType: Type): number { + getAttackTypeMultiplier(attackType: PokemonType): number { switch (this.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - if (attackType === Type.FIRE) { + if (attackType === PokemonType.FIRE) { return 1.5; } - if (attackType === Type.WATER) { + if (attackType === PokemonType.WATER) { return 0.5; } break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - if (attackType === Type.FIRE) { + if (attackType === PokemonType.FIRE) { return 0.5; } - if (attackType === Type.WATER) { + if (attackType === PokemonType.WATER) { return 1.5; } break; @@ -94,9 +94,9 @@ export class Weather { switch (this.weatherType) { case WeatherType.HARSH_SUN: - return move instanceof AttackMove && moveType === Type.WATER; + return move instanceof AttackMove && moveType === PokemonType.WATER; case WeatherType.HEAVY_RAIN: - return move instanceof AttackMove && moveType === Type.FIRE; + return move instanceof AttackMove && moveType === PokemonType.FIRE; } return false; diff --git a/src/enums/MoveCategory.ts b/src/enums/MoveCategory.ts new file mode 100644 index 00000000000..0408655e6db --- /dev/null +++ b/src/enums/MoveCategory.ts @@ -0,0 +1,5 @@ +export enum MoveCategory { + PHYSICAL, + SPECIAL, + STATUS +} diff --git a/src/enums/MoveEffectTrigger.ts b/src/enums/MoveEffectTrigger.ts new file mode 100644 index 00000000000..1e7753d94fa --- /dev/null +++ b/src/enums/MoveEffectTrigger.ts @@ -0,0 +1,7 @@ +export enum MoveEffectTrigger { + PRE_APPLY, + POST_APPLY, + HIT, + /** Triggers one time after all target effects have applied */ + POST_TARGET +} diff --git a/src/enums/MoveFlags.ts b/src/enums/MoveFlags.ts new file mode 100644 index 00000000000..0fc85fddec6 --- /dev/null +++ b/src/enums/MoveFlags.ts @@ -0,0 +1,46 @@ +export enum MoveFlags { + NONE = 0, + MAKES_CONTACT = 1 << 0, + IGNORE_PROTECT = 1 << 1, + /** + * Sound-based moves have the following effects: + * - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves. + * - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns. + * - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves. + * - Sound-based moves used by a Pokemon with {@linkcode Abilities.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 Moves.SUBSTITUTE Substitute}. + * + * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move + */ + SOUND_BASED = 1 << 2, + HIDE_USER = 1 << 3, + HIDE_TARGET = 1 << 4, + BITING_MOVE = 1 << 5, + PULSE_MOVE = 1 << 6, + PUNCHING_MOVE = 1 << 7, + SLICING_MOVE = 1 << 8, + /** + * Indicates a move should be affected by {@linkcode Abilities.RECKLESS} + * @see {@linkcode Move.recklessMove()} + */ + RECKLESS_MOVE = 1 << 9, + /** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */ + BALLBOMB_MOVE = 1 << 10, + /** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */ + POWDER_MOVE = 1 << 11, + /** Indicates a move should trigger {@linkcode Abilities.DANCER} */ + DANCE_MOVE = 1 << 12, + /** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */ + WIND_MOVE = 1 << 13, + /** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */ + TRIAGE_MOVE = 1 << 14, + IGNORE_ABILITIES = 1 << 15, + /** Enables all hits of a multi-hit move to be accuracy checked individually */ + CHECK_ALL_HITS = 1 << 16, + /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ + IGNORE_SUBSTITUTE = 1 << 17, + /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ + REDIRECT_COUNTER = 1 << 18, + /** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */ + REFLECTABLE = 1 << 19 +} diff --git a/src/enums/MoveTarget.ts b/src/enums/MoveTarget.ts new file mode 100644 index 00000000000..615628cf4e8 --- /dev/null +++ b/src/enums/MoveTarget.ts @@ -0,0 +1,29 @@ +export enum MoveTarget { + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_the_user Moves that target the User} */ + USER, + OTHER, + ALL_OTHERS, + NEAR_OTHER, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_Pok%C3%A9mon Moves that target all adjacent Pokemon} */ + ALL_NEAR_OTHERS, + NEAR_ENEMY, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_foes Moves that target all adjacent foes} */ + ALL_NEAR_ENEMIES, + RANDOM_NEAR_ENEMY, + ALL_ENEMIES, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Counterattacks Counterattacks} */ + ATTACKER, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_one_adjacent_ally Moves that target one adjacent ally} */ + NEAR_ALLY, + ALLY, + USER_OR_NEAR_ALLY, + USER_AND_ALLIES, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_Pok%C3%A9mon Moves that target all Pokemon} */ + ALL, + USER_SIDE, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Entry_hazard-creating_moves Entry hazard-creating moves} */ + ENEMY_SIDE, + BOTH_SIDES, + PARTY, + CURSE +} diff --git a/src/enums/MultiHitType.ts b/src/enums/MultiHitType.ts new file mode 100644 index 00000000000..27e8214112e --- /dev/null +++ b/src/enums/MultiHitType.ts @@ -0,0 +1,7 @@ +export enum MultiHitType { + _2, + _2_TO_5, + _3, + _10, + BEAT_UP +} diff --git a/src/enums/type.ts b/src/enums/pokemon-type.ts similarity index 88% rename from src/enums/type.ts rename to src/enums/pokemon-type.ts index a04849c2ca3..eca02bae275 100644 --- a/src/enums/type.ts +++ b/src/enums/pokemon-type.ts @@ -1,4 +1,4 @@ -export enum Type { +export enum PokemonType { UNKNOWN = -1, NORMAL = 0, FIGHTING, diff --git a/src/events/battle-scene.ts b/src/events/battle-scene.ts index 548666c96de..4ed0e60cdc7 100644 --- a/src/events/battle-scene.ts +++ b/src/events/battle-scene.ts @@ -1,4 +1,4 @@ -import type Move from "../data/move"; +import type Move from "../data/moves/move"; import type { BerryModifier } from "../modifier/modifier"; /** Alias for all {@linkcode BattleScene} events */ diff --git a/src/field/arena.ts b/src/field/arena.ts index 08ba3542fc2..aedb0c1c5f8 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -7,8 +7,8 @@ import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, getLegendaryWeatherContinuesMessage, Weather } from "#app/data/weather"; import { CommonAnim } from "#app/data/battle-anims"; -import type { Type } from "#enums/type"; -import type Move from "#app/data/move"; +import type { PokemonType } from "#enums/pokemon-type"; +import type Move from "#app/data/moves/move"; import type { ArenaTag } from "#app/data/arena-tag"; import { ArenaTagSide, ArenaTrapTag, getArenaTag } from "#app/data/arena-tag"; import type { BattlerIndex } from "#app/battle"; @@ -372,7 +372,7 @@ export class Arena { return this.terrain?.terrainType ?? TerrainType.NONE; } - getAttackTypeMultiplier(attackType: Type, grounded: boolean): number { + getAttackTypeMultiplier(attackType: PokemonType, grounded: boolean): number { let weatherMultiplier = 1; if (this.weather && !this.weather.isEffectSuppressed()) { weatherMultiplier = this.weather.getAttackTypeMultiplier(attackType); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index d8e22898d42..bc0490372bc 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -6,7 +6,7 @@ import type { Variant, VariantSet } from "#app/data/variant"; import { variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; -import type Move from "#app/data/move"; +import type Move from "#app/data/moves/move"; import { HighCritAttr, StatChangeBeforeDmgCalcAttr, @@ -15,7 +15,6 @@ import { FixedDamageAttr, VariableAtkAttr, allMoves, - MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, @@ -36,11 +35,12 @@ import { SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, - MoveTarget, CombinedPledgeStabBoostAttr, VariableMoveTypeChartAttr, HpSplitAttr -} from "#app/data/move"; +} from "#app/data/moves/move"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; import { default as PokemonSpecies, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; @@ -49,7 +49,7 @@ import { isNullOrUndefined, randSeedInt, type nil } from "#app/utils"; import * as Utils from "#app/utils"; import type { TypeDamageMultiplier } from "#app/data/type"; import { getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; @@ -163,9 +163,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public pokerus: boolean; public switchOutStatus: boolean; public evoCounter: number; - public teraType: Type; + public teraType: PokemonType; public isTerastallized: boolean; - public stellarTypesBoosted: Type[]; + public stellarTypesBoosted: PokemonType[]; public fusionSpecies: PokemonSpecies | null; public fusionFormIndex: number; @@ -175,7 +175,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionGender: Gender; public fusionLuck: number; public fusionCustomPokemonData: CustomPokemonData | null; - public fusionTeraType: Type; + public fusionTeraType: PokemonType; private summonDataPrimer: PokemonSummonData | null; @@ -974,7 +974,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const critBoostTag = source.getTag(CritBoostTag); if (critBoostTag) { if (critBoostTag instanceof DragonCheerTag) { - critStage.value += critBoostTag.typesOnAdd.includes(Type.DRAGON) ? 2 : 1; + critStage.value += critBoostTag.typesOnAdd.includes(PokemonType.DRAGON) ? 2 : 1; } else { critStage.value += 2; } @@ -1025,14 +1025,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case Stat.DEF: - if (this.isOfType(Type.ICE) && globalScene.arena.weather?.weatherType === WeatherType.SNOW) { + if (this.isOfType(PokemonType.ICE) && globalScene.arena.weather?.weatherType === WeatherType.SNOW) { ret *= 1.5; } break; case Stat.SPATK: break; case Stat.SPDEF: - if (this.isOfType(Type.ROCK) && globalScene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + if (this.isOfType(PokemonType.ROCK) && globalScene.arena.weather?.weatherType === WeatherType.SANDSTORM) { ret *= 1.5; } break; @@ -1308,14 +1308,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param includeTeraType - `true` to include tera-formed type; Default: `false` * @param forDefend - `true` if the pokemon is defending from an attack; Default: `false` * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` - * @returns array of {@linkcode Type} + * @returns array of {@linkcode PokemonType} */ - public getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride: boolean = false): Type[] { - const types: Type[] = []; + public getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride: boolean = false): PokemonType[] { + const types: PokemonType[] = []; if (includeTeraType && this.isTerastallized) { const teraType = this.getTeraType(); - if (this.isTerastallized && !(forDefend && teraType === Type.STELLAR)) { // Stellar tera uses its original types defensively + if (this.isTerastallized && !(forDefend && teraType === PokemonType.STELLAR)) { // Stellar tera uses its original types defensively types.push(teraType); if (forDefend) { return types; @@ -1332,17 +1332,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const customTypes = this.customPokemonData.types?.length > 0; // First type, checking for "permanently changed" types from ME - const firstType = (customTypes && this.customPokemonData.types[0] !== Type.UNKNOWN) ? this.customPokemonData.types[0] : speciesForm.type1; + const firstType = (customTypes && this.customPokemonData.types[0] !== PokemonType.UNKNOWN) ? this.customPokemonData.types[0] : speciesForm.type1; types.push(firstType); // Second type - let secondType: Type = Type.UNKNOWN; + let secondType: PokemonType = PokemonType.UNKNOWN; if (fusionSpeciesForm) { // Check if the fusion Pokemon also has permanent changes from ME when determining the fusion types - const fusionType1 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 0 && this.fusionCustomPokemonData.types[0] !== Type.UNKNOWN) + const fusionType1 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 0 && this.fusionCustomPokemonData.types[0] !== PokemonType.UNKNOWN) ? this.fusionCustomPokemonData.types[0] : fusionSpeciesForm.type1; - const fusionType2 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 1 && this.fusionCustomPokemonData.types[1] !== Type.UNKNOWN) + const fusionType2 = (this.fusionCustomPokemonData?.types && this.fusionCustomPokemonData.types.length > 1 && this.fusionCustomPokemonData.types[1] !== PokemonType.UNKNOWN) ? this.fusionCustomPokemonData.types[1] : fusionSpeciesForm.type2; // Assign second type if the fusion can provide one @@ -1353,17 +1353,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } - if (secondType === Type.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type - secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) - ? this.customPokemonData.types[1] : (speciesForm.type2 ?? Type.UNKNOWN); + if (secondType === PokemonType.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type + secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== PokemonType.UNKNOWN) + ? this.customPokemonData.types[1] : (speciesForm.type2 ?? PokemonType.UNKNOWN); } } else { // If not a fusion, just get the second type from the species, checking for permanent changes from ME - secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) - ? this.customPokemonData.types[1] : (speciesForm.type2 ?? Type.UNKNOWN); + secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== PokemonType.UNKNOWN) + ? this.customPokemonData.types[1] : (speciesForm.type2 ?? PokemonType.UNKNOWN); } - if (secondType !== Type.UNKNOWN) { + if (secondType !== PokemonType.UNKNOWN) { types.push(secondType); } } @@ -1371,12 +1371,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // become UNKNOWN if no types are present if (!types.length) { - types.push(Type.UNKNOWN); + types.push(PokemonType.UNKNOWN); } // remove UNKNOWN if other types are present - if (types.length > 1 && types.includes(Type.UNKNOWN)) { - const index = types.indexOf(Type.UNKNOWN); + if (types.length > 1 && types.includes(PokemonType.UNKNOWN)) { + const index = types.indexOf(PokemonType.UNKNOWN); if (index !== -1) { types.splice(index, 1); } @@ -1397,13 +1397,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Checks if the pokemon's typing includes the specified type - * @param type - {@linkcode Type} to check + * @param type - {@linkcode PokemonType} to check * @param includeTeraType - `true` to include tera-formed type; Default: `true` * @param forDefend - `true` if the pokemon is defending from an attack; Default: `false` * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` * @returns `true` if the Pokemon's type matches */ - public isOfType(type: Type, includeTeraType: boolean = true, forDefend: boolean = false, ignoreOverride: boolean = false): boolean { + public isOfType(type: PokemonType, includeTeraType: boolean = true, forDefend: boolean = false, ignoreOverride: boolean = false): boolean { return this.getTypes(includeTeraType, forDefend, ignoreOverride).some((t) => t === type); } @@ -1641,35 +1641,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * @returns the pokemon's current tera {@linkcode Type} + * @returns the pokemon's current tera {@linkcode PokemonType} */ - getTeraType(): Type { + getTeraType(): PokemonType { if (this.hasSpecies(Species.TERAPAGOS)) { - return Type.STELLAR; + return PokemonType.STELLAR; } else if (this.hasSpecies(Species.OGERPON)) { const ogerponForm = this.species.speciesId === Species.OGERPON ? this.formIndex : this.fusionFormIndex; switch (ogerponForm) { case 0: case 4: - return Type.GRASS; + return PokemonType.GRASS; case 1: case 5: - return Type.WATER; + return PokemonType.WATER; case 2: case 6: - return Type.FIRE; + return PokemonType.FIRE; case 3: case 7: - return Type.ROCK; + return PokemonType.ROCK; } } else if (this.hasSpecies(Species.SHEDINJA)) { - return Type.BUG; + return PokemonType.BUG; } return this.teraType; } public isGrounded(): boolean { - return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.FLOATING) && !this.getTag(SemiInvulnerableTag)); + return !!this.getTag(GroundedTag) || (!this.isOfType(PokemonType.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.FLOATING) && !this.getTag(SemiInvulnerableTag)); } /** @@ -1686,7 +1686,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - if (this.isOfType(Type.GHOST)) { + if (this.isOfType(PokemonType.GHOST)) { return false; } @@ -1711,9 +1711,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * type-changing move and ability attributes have applied. * @param move - {@linkcode Move} The move being used. * @param simulated - If `true`, prevents showing abilities applied in this calculation. - * @returns The {@linkcode Type} of the move after attributes are applied + * @returns The {@linkcode PokemonType} of the move after attributes are applied */ - public getMoveType(move: Move, simulated: boolean = true): Type { + public getMoveType(move: Move, simulated: boolean = true): PokemonType { const moveTypeHolder = new Utils.NumberHolder(move.type); applyMoveAttrs(VariableMoveTypeAttr, this, null, move, moveTypeHolder); @@ -1721,10 +1721,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.arena.applyTags(ArenaTagType.ION_DELUGE, simulated, moveTypeHolder); if (this.getTag(BattlerTagType.ELECTRIFIED)) { - moveTypeHolder.value = Type.ELECTRIC; + moveTypeHolder.value = PokemonType.ELECTRIC; } - return moveTypeHolder.value as Type; + return moveTypeHolder.value as PokemonType; } @@ -1758,7 +1758,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { typeMultiplier.value = 0; } - if (this.getTag(TarShotTag) && (this.getMoveType(move) === Type.FIRE)) { + if (this.getTag(TarShotTag) && (this.getMoveType(move) === PokemonType.FIRE)) { typeMultiplier.value *= 2; } @@ -1798,15 +1798,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Calculates the move's type effectiveness multiplier based on the target's type/s. - * @param moveType {@linkcode Type} the type of the move being used + * @param moveType {@linkcode PokemonType} the type of the move being used * @param source {@linkcode Pokemon} the Pokemon using the move * @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks) * @param simulated tag to only apply the strong winds effect message when the move is used * @param move (optional) the move whose type effectiveness is to be checked. Used for applying {@linkcode VariableMoveTypeChartAttr} * @returns a multiplier for the type effectiveness */ - getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true, move?: Move): TypeDamageMultiplier { - if (moveType === Type.STELLAR) { + getAttackTypeEffectiveness(moveType: PokemonType, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true, move?: Move): TypeDamageMultiplier { + if (moveType === PokemonType.STELLAR) { return this.isTerastallized ? 2 : 1; } const types = this.getTypes(true, true); @@ -1814,8 +1814,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Handle flying v ground type immunity without removing flying type so effective types are still effective // Related to https://github.com/pagefaultgames/pokerogue/issues/524 - if (moveType === Type.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) { - const flyingIndex = types.indexOf(Type.FLYING); + if (moveType === PokemonType.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) { + const flyingIndex = types.indexOf(PokemonType.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); } @@ -1848,10 +1848,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return multiplier.value; }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; - const typeMultiplierAgainstFlying = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, Type.FLYING)); + const typeMultiplierAgainstFlying = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, PokemonType.FLYING)); applyChallenges(globalScene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, typeMultiplierAgainstFlying); // Handle strong winds lowering effectiveness of types super effective against pure flying - if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed() && this.isOfType(Type.FLYING) && typeMultiplierAgainstFlying.value === 2) { + if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed() && this.isOfType(PokemonType.FLYING) && typeMultiplierAgainstFlying.value === 2) { multiplier /= 2; if (!simulated) { globalScene.queueMessage(i18next.t("weather:strongWindsEffectMessage")); @@ -2846,7 +2846,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const matchesSourceType = sourceTypes.includes(moveType); /** A damage multiplier for when the attack is of the attacker's type and/or Tera type. */ const stabMultiplier = new Utils.NumberHolder(1); - if (matchesSourceType && moveType !== Type.STELLAR) { + if (matchesSourceType && moveType !== PokemonType.STELLAR) { stabMultiplier.value += 0.5; } @@ -2856,11 +2856,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); - if (source.isTerastallized && sourceTeraType === moveType && moveType !== Type.STELLAR) { + if (source.isTerastallized && sourceTeraType === moveType && moveType !== PokemonType.STELLAR) { stabMultiplier.value += 0.5; } - if (source.isTerastallized && source.getTeraType() === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (source.isTerastallized && source.getTeraType() === PokemonType.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { if (matchesSourceType) { stabMultiplier.value += 0.5; } else { @@ -2906,7 +2906,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); /** Halves damage if this Pokemon is grounded in Misty Terrain against a Dragon-type attack */ - const mistyTerrainMultiplier = (globalScene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) + const mistyTerrainMultiplier = (globalScene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === PokemonType.DRAGON) ? 0.5 : 1; @@ -3707,7 +3707,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity const poisonImmunity = types.map(defType => { // Check if the Pokemon is not immune to Poison/Toxic - if (defType !== Type.POISON && defType !== Type.STEEL) { + if (defType !== PokemonType.POISON && defType !== PokemonType.STEEL) { return false; } @@ -3723,14 +3723,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; }); - if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { + if (this.isOfType(PokemonType.POISON) || this.isOfType(PokemonType.STEEL)) { if (poisonImmunity.includes(true)) { return false; } } break; case StatusEffect.PARALYSIS: - if (this.isOfType(Type.ELECTRIC)) { + if (this.isOfType(PokemonType.ELECTRIC)) { return false; } break; @@ -3740,12 +3740,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case StatusEffect.FREEZE: - if (this.isOfType(Type.ICE) || (!ignoreField && (globalScene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather.weatherType)))) { + if (this.isOfType(PokemonType.ICE) || (!ignoreField && (globalScene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather.weatherType)))) { return false; } break; case StatusEffect.BURN: - if (this.isOfType(Type.FIRE)) { + if (this.isOfType(PokemonType.FIRE)) { return false; } break; @@ -5402,8 +5402,8 @@ export class PokemonSummonData { public stats: number[] = [ 0, 0, 0, 0, 0, 0 ]; public moveset: (PokemonMove | null)[]; // If not initialized this value will not be populated from save data. - public types: Type[] = []; - public addedType: Type | null = null; + public types: PokemonType[] = []; + public addedType: PokemonType | null = null; } export class PokemonBattleData { diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 183b38c49e5..02bd849f66c 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -10,7 +10,7 @@ import { initBiomes } from "#app/data/balance/biomes"; import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; -import { initMoves } from "#app/data/move"; +import { initMoves } from "#app/data/moves/move"; import { initAbilities } from "#app/data/ability"; import { initAchievements } from "#app/system/achv"; import { initTrainerTypeDialogue } from "#app/data/dialogue"; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index ae8b9a45c0d..6cb8051518d 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2,12 +2,12 @@ import { globalScene } from "#app/global-scene"; import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms"; import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; -import { allMoves, AttackMove } from "#app/data/move"; +import { allMoves, AttackMove } from "#app/data/moves/move"; import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectDescriptor } from "#app/data/status-effect"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -277,10 +277,10 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { export class TerastallizeModifierType extends PokemonModifierType { - private teraType: Type; + private teraType: PokemonType; - constructor(teraType: Type) { - super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + constructor(teraType: PokemonType) { + super("", `${PokemonType[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), (pokemon: PlayerPokemon) => { if ([ pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length > 0) { return PartyUiHandler.NoEffectMessage; @@ -293,11 +293,11 @@ export class TerastallizeModifierType extends PokemonModifierType { } get name(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`) }); } getDescription(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`) }); } getPregenArgs(): any[] { @@ -581,10 +581,10 @@ enum AttackTypeBoosterItem { } export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - public moveType: Type; + public moveType: PokemonType; public boostPercent: number; - constructor(moveType: Type, boostPercent: number) { + constructor(moveType: PokemonType, boostPercent: number) { super("", `${AttackTypeBoosterItem[moveType]?.toLowerCase()}`, (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); @@ -598,7 +598,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i getDescription(): string { // TODO: Need getTypeName? - return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`) }); + return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`) }); } getPregenArgs(): any[] { @@ -841,7 +841,7 @@ export class TmModifierType extends PokemonModifierType { public moveId: Moves; constructor(moveId: Moves) { - super("", `tm_${Type[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), + super("", `tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.getMoveset().filter(m => m?.moveId === moveId).length) { return PartyUiHandler.NoEffectMessage; @@ -955,8 +955,8 @@ export class FusePokemonModifierType extends PokemonModifierType { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { - return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in PokemonType)) { + return new AttackTypeBoosterModifierType(pregenArgs[0] as PokemonType, 20); } const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); @@ -964,7 +964,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { return null; } - const attackMoveTypeWeights = new Map(); + const attackMoveTypeWeights = new Map(); let totalWeight = 0; for (const t of attackMoveTypes) { if (attackMoveTypeWeights.has(t)) { @@ -983,7 +983,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { return null; } - let type: Type; + let type: PokemonType; const randInt = randSeedInt(totalWeight); let weight = 0; @@ -1366,7 +1366,7 @@ export type GeneratorModifierOverride = { } | { name: keyof Pick; - type?: Type; + type?: PokemonType; } | { name: keyof Pick; @@ -1473,25 +1473,25 @@ export const modifierTypes = { }), TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { - return new TerastallizeModifierType(pregenArgs[0] as Type); + if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in PokemonType)) { + return new TerastallizeModifierType(pregenArgs[0] as PokemonType); } if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { return null; } - const teraTypes: Type[] = []; + const teraTypes: PokemonType[] = []; party.forEach(p => { if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { teraTypes.push(p.teraType); } }); - let excludedType = Type.UNKNOWN; + let excludedType = PokemonType.UNKNOWN; if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { excludedType = teraTypes[0]; } - let shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + let shardType = randSeedInt(64) ? randSeedInt(18) as PokemonType : PokemonType.STELLAR; while (shardType === excludedType) { - shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + shardType = randSeedInt(64) ? randSeedInt(18) as PokemonType : PokemonType.STELLAR; } return new TerastallizeModifierType(shardType); }), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index f6a69fcca2d..1f8d1eb0322 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1,7 +1,7 @@ import { FusionSpeciesFormEvolution, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { getBerryEffectFunc, getBerryPredicate } from "#app/data/berry"; import { getLevelTotalExp } from "#app/data/exp"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; import { type FormChangeItem, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; @@ -25,7 +25,7 @@ import type { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; import { type DoubleBattleChanceBoosterModifierType, type EvolutionItemModifierType, type FormChangeItemModifierType, type ModifierOverride, type ModifierType, type PokemonBaseStatTotalModifierType, type PokemonExpBoosterModifierType, type PokemonFriendshipBoosterModifierType, type PokemonMoveAccuracyBoosterModifierType, type PokemonMultiHitModifierType, type TerastallizeModifierType, type TmModifierType, getModifierType, ModifierPoolType, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType } from "./modifier-type"; import { Color, ShadowColor } from "#enums/color"; @@ -1373,10 +1373,10 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { * Applies Specific Type item boosts (e.g., Magnet) */ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { - public moveType: Type; + public moveType: PokemonType; private boostMultiplier: number; - constructor(type: ModifierType, pokemonId: number, moveType: Type, boostPercent: number, stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, moveType: PokemonType, boostPercent: number, stackCount?: number) { super(type, pokemonId, stackCount); this.moveType = moveType; @@ -1403,22 +1403,22 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { /** * Checks if {@linkcode AttackTypeBoosterModifier} should be applied * @param pokemon the {@linkcode Pokemon} that holds the held item - * @param moveType the {@linkcode Type} of the move being used + * @param moveType the {@linkcode PokemonType} of the move being used * @param movePower the {@linkcode NumberHolder} that holds the power of the move * @returns `true` if boosts should be applied to the move. */ - override shouldApply(pokemon?: Pokemon, moveType?: Type, movePower?: NumberHolder): boolean { + override shouldApply(pokemon?: Pokemon, moveType?: PokemonType, movePower?: NumberHolder): boolean { return super.shouldApply(pokemon, moveType, movePower) && typeof moveType === "number" && movePower instanceof NumberHolder; } /** * Applies {@linkcode AttackTypeBoosterModifier} * @param pokemon {@linkcode Pokemon} that holds the held item - * @param moveType {@linkcode Type} of the move being used + * @param moveType {@linkcode PokemonType} of the move being used * @param movePower {@linkcode NumberHolder} that holds the power of the move * @returns `true` if boosts have been applied to the move. */ - override apply(_pokemon: Pokemon, moveType: Type, movePower: NumberHolder): boolean { + override apply(_pokemon: Pokemon, moveType: PokemonType, movePower: NumberHolder): boolean { if (moveType === this.moveType && movePower.value >= 1) { (movePower as NumberHolder).value = Math.floor((movePower as NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); return true; @@ -1958,9 +1958,9 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { export class TerrastalizeModifier extends ConsumablePokemonModifier { public override type: TerastallizeModifierType; - public teraType: Type; + public teraType: PokemonType; - constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type) { + constructor(type: TerastallizeModifierType, pokemonId: number, teraType: PokemonType) { super(type, pokemonId); this.teraType = teraType; diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 411022a84b4..5f4466d942c 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -3,8 +3,8 @@ import type { TurnCommand } from "#app/battle"; import { BattleType } from "#app/battle"; import type { EncoreTag } from "#app/data/battler-tags"; import { TrappedTag } from "#app/data/battler-tags"; -import type { MoveTargetSet } from "#app/data/move"; -import { getMoveTargets } from "#app/data/move"; +import type { MoveTargetSet } from "#app/data/moves/move"; +import { getMoveTargets } from "#app/data/moves/move"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Abilities } from "#app/enums/abilities"; import { BattlerTagType } from "#app/enums/battler-tag-type"; diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index f354bc8031e..a6b9a482ba0 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -5,7 +5,7 @@ import { applyPostFaintAbAttrs, applyPostKnockOutAbAttrs, applyPostVictoryAbAttr import type { DestinyBondTag, GrudgeTag } from "#app/data/battler-tags"; import { BattlerTagLapseType } from "#app/data/battler-tags"; import { battleSpecDialogue } from "#app/data/dialogue"; -import { allMoves, PostVictoryStatStageChangeAttr } from "#app/data/move"; +import { allMoves, PostVictoryStatStageChangeAttr } from "#app/data/moves/move"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { BattleSpec } from "#app/enums/battle-spec"; import { StatusEffect } from "#app/enums/status-effect"; diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index c1f3042dbbe..5d3c4078fa1 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -import type Move from "#app/data/move"; -import { allMoves } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves } from "#app/data/moves/move"; import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; import { Moves } from "#enums/moves"; import { getPokemonNameWithAffix } from "#app/messages"; diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts index 588fc402357..871d6188237 100644 --- a/src/phases/move-anim-test-phase.ts +++ b/src/phases/move-anim-test-phase.ts @@ -1,6 +1,6 @@ import { globalScene } from "#app/global-scene"; import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims"; -import { allMoves, SelfStatusMove } from "#app/data/move"; +import { allMoves, SelfStatusMove } from "#app/data/moves/move"; import { Moves } from "#app/enums/moves"; import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index 6eccdd20254..3989221504d 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; import { MoveChargeAnim } from "#app/data/battle-anims"; -import { applyMoveChargeAttrs, MoveEffectAttr, InstantChargeAttr } from "#app/data/move"; +import { applyMoveChargeAttrs, MoveEffectAttr, InstantChargeAttr } from "#app/data/moves/move"; import type { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index f878cb40e2e..c382c6aa4c4 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -25,7 +25,7 @@ import { SubstituteTag, } from "#app/data/battler-tags"; import type { - MoveAttr } from "#app/data/move"; + MoveAttr } from "#app/data/moves/move"; import { applyFilteredMoveAttrs, applyMoveAttrs, @@ -35,20 +35,20 @@ import { getMoveTargets, HitsTagAttr, MissEffectAttr, - MoveCategory, MoveEffectAttr, - MoveEffectTrigger, - MoveFlags, - MoveTarget, MultiHitAttr, NoEffectAttr, OneHitKOAttr, OverrideMoveEffectAttr, ToxicAccuracyAttr, VariableTargetAttr, -} from "#app/data/move"; +} from "#app/data/moves/move"; +import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { HitResult, MoveResult } from "#app/field/pokemon"; @@ -671,7 +671,7 @@ export class MoveEffectPhase extends PokemonPhase { if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { return true; } - if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON))) { + if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(PokemonType.POISON))) { return true; } // TODO: Fix lock on / mind reader check. diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index 5b89548b663..c320df462d1 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -1,4 +1,4 @@ -import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move"; +import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/moves/move"; import type { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 3804ea78a3c..7e454d654d0 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -23,13 +23,13 @@ import { DelayedAttackAttr, frenzyMissFunc, HealStatusEffectAttr, - MoveFlags, PreMoveMessageAttr, PreUseInterruptAttr, -} from "#app/data/move"; +} from "#app/data/moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getTerrainBlockMessage, getWeatherBlockMessage } from "#app/data/weather"; import { MoveUsedEvent } from "#app/events/battle-scene"; import type { PokemonMove } from "#app/field/pokemon"; @@ -469,7 +469,7 @@ export class MovePhase extends BattlePhase { // TODO: don't hardcode this interaction. // Handle interaction between the rage powder center-of-attention tag and moves used by grass types/overcoat-havers (which are immune to RP's redirect) - if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(Type.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { + if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { redirectTarget.value = p.getBattlerIndex(); redirectedByAbility = false; } diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts index a30ef9000a5..a1e38e3f9d2 100644 --- a/src/phases/select-target-phase.ts +++ b/src/phases/select-target-phase.ts @@ -5,7 +5,7 @@ import { Mode } from "#app/ui/ui"; import { CommandPhase } from "./command-phase"; import { PokemonPhase } from "./pokemon-phase"; import i18next from "#app/plugins/i18n"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; export class SelectTargetPhase extends PokemonPhase { constructor(fieldIndex: number) { diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index dad0f6f11ad..f8350fb7d4c 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -1,6 +1,6 @@ import { globalScene } from "#app/global-scene"; import { applyPreSwitchOutAbAttrs, PostDamageForceSwitchAbAttr, PreSwitchOutAbAttr } from "#app/data/ability"; -import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; import { getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { TrainerSlot } from "#app/data/trainer-config"; diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index 462a4e1882e..5411861011e 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -3,7 +3,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import i18next from "i18next"; import { globalScene } from "#app/global-scene"; -import { Type } from "#app/enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { achvs } from "#app/system/achv"; import { SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; @@ -20,7 +20,7 @@ export class TeraPhase extends BattlePhase { start() { super.start(); - globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.getTeraType()]}`) })); + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${PokemonType[this.pokemon.getTeraType()]}`) })); new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { this.end(); }); @@ -39,7 +39,7 @@ export class TeraPhase extends BattlePhase { if (this.pokemon.isPlayer()) { globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.pokemon.getTeraType() === Type.STELLAR) { + if (this.pokemon.getTeraType() === PokemonType.STELLAR) { globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); } } diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index c6d145e1a4c..0d924e9f48b 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -1,5 +1,5 @@ import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr } from "#app/data/ability"; -import { allMoves, MoveHeaderAttr } from "#app/data/move"; +import { allMoves, MoveHeaderAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import type Pokemon from "#app/field/pokemon"; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index aefc583a98a..4f6cb0aed93 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -30,7 +30,7 @@ import { Nature } from "#enums/nature"; import { GameStats } from "#app/system/game-stats"; import { Tutorial } from "#app/tutorial"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { TrainerVariant } from "#app/field/trainer"; import type { Variant } from "#app/data/variant"; import { setSettingGamepad, SettingGamepad, settingGamepadDefaults } from "#app/system/settings/settings-gamepad"; @@ -56,7 +56,7 @@ import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; -import type { Type } from "#enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -231,7 +231,7 @@ export interface StarterAttributes { shiny?: boolean; favorite?: boolean; nickname?: string; - tera?: Type; + tera?: PokemonType; } export interface StarterPreferences { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 20507860e4e..7531d74e404 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -13,7 +13,7 @@ import type { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; -import type { Type } from "#app/enums/type"; +import type { PokemonType } from "#enums/pokemon-type"; export default class PokemonData { public id: number; @@ -46,9 +46,9 @@ export default class PokemonData { public pokerus: boolean; public usedTMs: Moves[]; public evoCounter: number; - public teraType: Type; + public teraType: PokemonType; public isTerastallized: boolean; - public stellarTypesBoosted: Type[]; + public stellarTypesBoosted: PokemonType[]; public fusionSpecies: Species; public fusionFormIndex: number; @@ -57,7 +57,7 @@ export default class PokemonData { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: number; - public fusionTeraType: Type; + public fusionTeraType: PokemonType; public boss: boolean; public bossSegments?: number; @@ -108,7 +108,7 @@ export default class PokemonData { this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; - this.teraType = source.teraType as Type; + this.teraType = source.teraType as PokemonType; this.isTerastallized = source.isTerastallized || false; this.stellarTypesBoosted = source.stellarTypesBoosted || []; @@ -120,7 +120,7 @@ export default class PokemonData { this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); - this.fusionTeraType = (source.fusionTeraType ?? 0) as Type; + this.fusionTeraType = (source.fusionTeraType ?? 0) as PokemonType; this.usedTMs = source.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(source.customPokemonData); diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index c716705452c..c26f853382e 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -2,7 +2,7 @@ import type { default as Pokemon } from "../field/pokemon"; import { addTextObject, TextStyle } from "./text"; import * as Utils from "../utils"; import { globalScene } from "#app/global-scene"; -import type Move from "#app/data/move"; +import type Move from "#app/data/moves/move"; import type { BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; import { BattleSceneEventType } from "../events/battle-scene"; import { BerryType } from "#enums/berry-type"; diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index ab7f76daf0b..b866ec229d1 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -6,7 +6,7 @@ import { getGenderSymbol, getGenderColor, Gender } from "../data/gender"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getTypeRgb } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getVariantTint } from "#app/data/variant"; import { Stat } from "#enums/stat"; import BattleFlyout from "./battle-flyout"; @@ -25,7 +25,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private bossSegments: number; private offset: boolean; private lastName: string | null; - private lastTeraType: Type; + private lastTeraType: PokemonType; private lastStatus: StatusEffect; private lastHp: number; private lastMaxHp: number; @@ -84,7 +84,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.boss = false; this.offset = false; this.lastName = null; - this.lastTeraType = Type.UNKNOWN; + this.lastTeraType = PokemonType.UNKNOWN; this.lastStatus = StatusEffect.NONE; this.lastHp = -1; this.lastMaxHp = -1; @@ -327,7 +327,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setVisible(pokemon.isTerastallized); this.teraIcon.on("pointerover", () => { if (pokemon.isTerastallized) { - globalScene.ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) })); + globalScene.ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.lastTeraType]}`) })); } }); this.teraIcon.on("pointerout", () => globalScene.ui.hideTooltip()); @@ -410,14 +410,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const types = pokemon.getTypes(true); this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); - this.type1Icon.setFrame(Type[types[0]].toLowerCase()); + this.type1Icon.setFrame(PokemonType[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); if (types.length > 1) { - this.type2Icon.setFrame(Type[types[1]].toLowerCase()); + this.type2Icon.setFrame(PokemonType[types[1]].toLowerCase()); } if (types.length > 2) { - this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + this.type3Icon.setFrame(PokemonType[types[2]].toLowerCase()); } if (this.player) { @@ -542,11 +542,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } - const teraType = pokemon.isTerastallized ? pokemon.getTeraType() : Type.UNKNOWN; + const teraType = pokemon.isTerastallized ? pokemon.getTeraType() : PokemonType.UNKNOWN; const teraTypeUpdated = this.lastTeraType !== teraType; if (teraTypeUpdated) { - this.teraIcon.setVisible(teraType !== Type.UNKNOWN); + this.teraIcon.setVisible(teraType !== PokemonType.UNKNOWN); this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); this.teraIcon.setTintFill(Phaser.Display.Color.GetColor(...getTypeRgb(teraType))); this.lastTeraType = teraType; @@ -575,14 +575,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const types = pokemon.getTypes(true); this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); - this.type1Icon.setFrame(Type[types[0]].toLowerCase()); + this.type1Icon.setFrame(PokemonType[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); if (types.length > 1) { - this.type2Icon.setFrame(Type[types[1]].toLowerCase()); + this.type2Icon.setFrame(PokemonType[types[1]].toLowerCase()); } if (types.length > 2) { - this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + this.type3Icon.setFrame(PokemonType[types[2]].toLowerCase()); } const updateHpFrame = () => { diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 20cffbbe30a..0dd3602d205 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -8,7 +8,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { CommandPhase } from "#app/phases/command-phase"; import { globalScene } from "#app/global-scene"; import { TerastallizeAccessModifier } from "#app/modifier/modifier"; -import { Type } from "#app/enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getTypeRgb } from "#app/data/type"; import { Species } from "#enums/species"; @@ -51,7 +51,7 @@ export default class CommandUiHandler extends UiHandler { this.teraButton.setName("terrastallize-button"); this.teraButton.setScale(1.3); this.teraButton.setFrame("fire"); - this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(Type.FIRE), isTerastallized: false }); + this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(PokemonType.FIRE), isTerastallized: false }); this.commandsContainer.add(this.teraButton); for (let c = 0; c < commands.length; c++) { @@ -78,7 +78,7 @@ export default class CommandUiHandler extends UiHandler { if (this.canTera()) { this.teraButton.setVisible(true); - this.teraButton.setFrame(Type[globalScene.getField()[this.fieldIndex].getTeraType()].toLowerCase()); + this.teraButton.setFrame(PokemonType[globalScene.getField()[this.fieldIndex].getTeraType()].toLowerCase()); } else { this.teraButton.setVisible(false); if (this.cursor === Command.TERA) { diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 8e8b197117c..2b1eaa8221e 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -2,12 +2,12 @@ import type { InfoToggle } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import { addTextObject, TextStyle } from "./text"; import { getTypeDamageMultiplierColor } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Command } from "./command-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import i18next from "i18next"; import { Button } from "#enums/buttons"; import type { PokemonMove } from "#app/field/pokemon"; @@ -241,7 +241,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { const pokemonMove = moveset[cursor]!; // TODO: is the bang correct? const moveType = pokemon.getMoveType(pokemonMove.getMove()); const textureKey = Utils.getLocalizedSpriteKey("types"); - this.typeIcon.setTexture(textureKey, Type[moveType].toLowerCase()).setScale(0.8); + this.typeIcon.setTexture(textureKey, PokemonType[moveType].toLowerCase()).setScale(0.8); const moveCategory = pokemonMove.getMove().category; this.moveCategoryIcon.setTexture("categories", MoveCategory[moveCategory].toLowerCase()).setScale(1.0); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 76d02c191bb..7942a160a85 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -9,7 +9,7 @@ import { LockModifierTiersModifier, PokemonHeldItemModifier, HealShopCostModifie import { handleTutorial, Tutorial } from "../tutorial"; import { Button } from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; -import { allMoves } from "../data/move"; +import { allMoves } from "../data/moves/move"; import * as Utils from "./../utils"; import Overrides from "#app/overrides"; import i18next from "i18next"; diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 5b3b30b14dd..1b49c2dd3c3 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -3,9 +3,9 @@ import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject } from "./text"; import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; -import type Move from "../data/move"; -import { MoveCategory } from "../data/move"; -import { Type } from "#enums/type"; +import type Move from "../data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; +import { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; export interface MoveInfoOverlaySettings { @@ -153,7 +153,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem this.pow.setText(move.power >= 0 ? move.power.toString() : "---"); this.acc.setText(move.accuracy >= 0 ? move.accuracy.toString() : "---"); this.pp.setText(move.pp >= 0 ? move.pp.toString() : "---"); - this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), Type[move.type].toLowerCase()); + this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), PokemonType[move.type].toLowerCase()); this.cat.setFrame(MoveCategory[move.category].toLowerCase()); this.desc.setText(move?.effect || ""); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 0af94053ceb..19b2b78e22f 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -7,7 +7,7 @@ import MessageUiHandler from "#app/ui/message-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "#app/modifier/modifier"; -import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; import { StatusEffect } from "#enums/status-effect"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index eee900d411e..6b6c2c89933 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -9,7 +9,7 @@ import { allAbilities } from "#app/data/ability"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { getNatureName } from "#app/data/nature"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; @@ -19,7 +19,7 @@ import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; import type { DexEntry, StarterAttributes } from "#app/system/game-data"; import { AbilityAttr, DexAttr } from "#app/system/game-data"; @@ -2376,16 +2376,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.updateInstructions(); } - setTypeIcons(type1: Type | null, type2: Type | null): void { + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { if (type1 !== null) { this.type1Icon.setVisible(true); - this.type1Icon.setFrame(Type[type1].toLowerCase()); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); } else { this.type1Icon.setVisible(false); } if (type2 !== null) { this.type2Icon.setVisible(true); - this.type2Icon.setFrame(Type[type2].toLowerCase()); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); } else { this.type2Icon.setVisible(false); } diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index 3920c866486..a0a430018ff 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -7,7 +7,7 @@ import { isNullOrUndefined } from "#app/utils"; import { Mode } from "./ui"; import { FilterTextRow } from "./filter-text"; import { allAbilities } from "#app/data/ability"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { allSpecies } from "#app/data/pokemon-species"; import i18next from "i18next"; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 83739ba26a8..85bc0ee40f6 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -10,7 +10,7 @@ import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { catchableSpecies } from "#app/data/balance/biomes"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; import MessageUiHandler from "#app/ui/message-ui-handler"; @@ -35,7 +35,7 @@ import { FilterText, FilterTextRow } from "./filter-text"; import { allAbilities } from "#app/data/ability"; import type { PassiveAbilities } from "#app/data/balance/passives"; import { starterPassiveAbilities } from "#app/data/balance/passives"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { speciesTmMoves } from "#app/data/balance/tms"; import { pokemonStarters } from "#app/data/balance/pokemon-evolutions"; import { Biome } from "#enums/biome"; @@ -287,7 +287,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter - const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeKeys = Object.keys(PokemonType).filter(v => isNaN(Number(v))); const typeOptions: DropDownOption[] = []; typeKeys.forEach((type, index) => { if (index === 0 || index === 19) { @@ -2032,16 +2032,16 @@ export default class PokedexUiHandler extends MessageUiHandler { } - setTypeIcons(type1: Type | null, type2: Type | null): void { + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { if (type1 !== null) { this.type1Icon.setVisible(true); - this.type1Icon.setFrame(Type[type1].toLowerCase()); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); } else { this.type1Icon.setVisible(false); } if (type2 !== null) { this.type2Icon.setVisible(true); - this.type2Icon.setFrame(Type[type2].toLowerCase()); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); } else { this.type2Icon.setVisible(false); } diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index a9b8e260b34..eb0e0ed909b 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -1,10 +1,10 @@ import PokemonInfoContainer from "#app/ui/pokemon-info-container"; import { Gender } from "#app/data/gender"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; import { TextStyle, addTextObject } from "#app/ui/text"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Species } from "#enums/species"; import { getEggTierForSpecies } from "#app/data/egg"; import { starterColors } from "#app/battle-scene"; @@ -167,7 +167,7 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); - this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonEggMoveBgs[em].setFrame(PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); if (!(eggMove && hatchInfo.starterDataEntryBeforeUpdate.eggMoves & Math.pow(2, em)) && eggMoveUnlocked) { diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index eda5ac3f580..7e2932fecf9 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -3,7 +3,7 @@ import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { globalScene } from "#app/global-scene"; import { Gender, getGenderColor, getGenderSymbol } from "../data/gender"; import { getNatureName } from "../data/nature"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import type Pokemon from "../field/pokemon"; import i18next from "i18next"; import type { DexEntry, StarterDataEntry } from "../system/game-data"; @@ -342,7 +342,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { for (let m = 0; m < 4; m++) { const move = m < pokemon.moveset.length && pokemon.moveset[m] ? pokemon.moveset[m]!.getMove() : null; - this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMovesContainers[m].setVisible(!!move); } diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index f1fe9ac8194..3b4a0e3d335 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -15,7 +15,7 @@ import { Challenges } from "#enums/challenges"; import { getLuckString, getLuckTextTint } from "../modifier/modifier-type"; import RoundRectangle from "phaser3-rex-plugins/plugins/roundrectangle"; import { getTypeRgb } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { TypeColor, TypeShadow } from "#app/enums/color"; import { getNatureStatMultiplier, getNatureName } from "../data/nature"; import { getVariantTint } from "#app/data/variant"; @@ -569,7 +569,7 @@ export default class RunInfoUiHandler extends UiHandler { rules.push(i18next.t(`runHistory:challengeMonoGen${this.runInfo.challenges[i].value}`)); break; case Challenges.SINGLE_TYPE: - const typeRule = Type[this.runInfo.challenges[i].value - 1]; + const typeRule = PokemonType[this.runInfo.challenges[i].value - 1]; const typeTextColor = `[color=${TypeColor[typeRule]}]`; const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; const typeText = typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; @@ -726,7 +726,7 @@ export default class RunInfoUiHandler extends UiHandler { moveContainer.add(moveLabel); movesetContainer.add(moveContainer); const move = pokemonMoveset[m]?.getMove(); - pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); pokemonMoveLabels[m].setText(move ? move.name : "-"); } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 34a29411de4..c2ed625f7e8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -13,7 +13,7 @@ import { allAbilities } from "#app/data/ability"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { getNatureName } from "#app/data/nature"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; @@ -21,7 +21,7 @@ import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balan import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; import type { DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences } from "#app/system/game-data"; import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; @@ -71,7 +71,7 @@ export interface Starter { moveset?: StarterMoveset; pokerus: boolean; nickname?: string; - teraType?: Type; + teraType?: PokemonType; } interface LanguageSetting { @@ -216,7 +216,7 @@ interface SpeciesDetails { abilityIndex?: number, natureIndex?: number, forSeen?: boolean, // default = false - teraType?: Type, + teraType?: PokemonType, } export default class StarterSelectUiHandler extends MessageUiHandler { @@ -300,7 +300,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private dexAttrCursor: bigint = 0n; private abilityCursor: number = -1; private natureCursor: number = -1; - private teraCursor: Type = Type.UNKNOWN; + private teraCursor: PokemonType = PokemonType.UNKNOWN; private filterBarCursor: number = 0; private starterMoveset: StarterMoveset | null; private scrollCursor: number; @@ -313,7 +313,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterAttr: bigint[] = []; private starterAbilityIndexes: number[] = []; private starterNatures: Nature[] = []; - private starterTeras: Type[] = []; + private starterTeras: PokemonType[] = []; private starterMovesets: StarterMoveset[] = []; private speciesStarterDexEntry: DexEntry | null; private speciesStarterMoves: Moves[]; @@ -406,7 +406,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter - const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeKeys = Object.keys(PokemonType).filter(v => isNaN(Number(v))); const typeOptions: DropDownOption[] = []; typeKeys.forEach((type, index) => { if (index === 0 || index === 19) { @@ -2334,7 +2334,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return [ isDupe, removeIndex ]; } - addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, teraType: Type, randomSelection: boolean = false) { + addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, teraType: PokemonType, randomSelection: boolean = false) { const props = globalScene.gameData.getSpeciesDexAttrProps(species, dexAttr); this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); @@ -2928,7 +2928,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; this.abilityCursor = species ? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? globalScene.gameData.getSpeciesDefaultNature(species) : 0; - this.teraCursor = species ? species.type1 : Type.UNKNOWN; + this.teraCursor = species ? species.type1 : PokemonType.UNKNOWN; if (!species && globalScene.ui.getTooltip().visible) { globalScene.ui.hideTooltip(); @@ -3199,7 +3199,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; - this.teraCursor = Type.UNKNOWN; + this.teraCursor = PokemonType.UNKNOWN; // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) @@ -3483,7 +3483,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); - this.teraIcon.setFrame(Type[this.teraCursor].toLowerCase()); + this.teraIcon.setFrame(PokemonType[this.teraCursor].toLowerCase()); this.teraIcon.setVisible(!this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); } else { this.pokemonAbilityText.setText(""); @@ -3510,7 +3510,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let m = 0; m < 4; m++) { const move = m < this.starterMoveset.length ? allMoves[this.starterMoveset[m]] : null; - this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMoveContainers[m].setVisible(!!move); } @@ -3520,7 +3520,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em); - this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonEggMoveBgs[em].setFrame(PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } @@ -3534,16 +3534,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateInstructions(); } - setTypeIcons(type1: Type | null, type2: Type | null): void { + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { if (type1 !== null) { this.type1Icon.setVisible(true); - this.type1Icon.setFrame(Type[type1].toLowerCase()); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); } else { this.type1Icon.setVisible(false); } if (type2 !== null) { this.type2Icon.setVisible(true); - this.type2Icon.setFrame(Type[type2].toLowerCase()); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); } else { this.type2Icon.setVisible(false); } @@ -3766,7 +3766,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { abilityIndex: thisObj.starterAbilityIndexes[i], passive: !(globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), nature: thisObj.starterNatures[i] as Nature, - teraType: thisObj.starterTeras[i] as Type, + teraType: thisObj.starterTeras[i] as PokemonType, moveset: thisObj.starterMovesets[i], pokerus: thisObj.pokerusSpecies.includes(starterSpecies), nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 31dee6bb46c..465f1e2c8ec 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -7,10 +7,10 @@ import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { argbFromRgba } from "@material/material-color-utilities"; import { getTypeRgb } from "#app/data/type"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#app/ui/text"; -import type Move from "#app/data/move"; -import { MoveCategory } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { getPokeballAtlasKey } from "#app/data/pokeball"; import { getGenderColor, getGenderSymbol } from "#app/data/gender"; import { getLevelRelExp, getLevelTotalExp } from "#app/data/exp"; @@ -765,10 +765,10 @@ export default class SummaryUiHandler extends UiHandler { typeLabel.setOrigin(0, 0); profileContainer.add(typeLabel); - const getTypeIcon = (index: number, type: Type, tera: boolean = false) => { + const getTypeIcon = (index: number, type: PokemonType, tera: boolean = false) => { const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera - ? globalScene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) + ? globalScene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), PokemonType[type].toLowerCase()) : globalScene.add.sprite(xCoord, 42, "type_tera"); if (tera) { typeIcon.setScale(0.5); @@ -799,7 +799,7 @@ export default class SummaryUiHandler extends UiHandler { if (globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(this.pokemon)) { const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); teraIcon.setName("terrastallize-icon"); - teraIcon.setFrame(Type[this.pokemon.getTeraType()].toLowerCase()); + teraIcon.setFrame(PokemonType[this.pokemon.getTeraType()].toLowerCase()); profileContainer.add(teraIcon); } @@ -1010,7 +1010,7 @@ export default class SummaryUiHandler extends UiHandler { if (this.newMove && this.pokemon) { const spriteKey = Utils.getLocalizedSpriteKey("types"); const moveType = this.pokemon.getMoveType(this.newMove); - const newMoveTypeIcon = globalScene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + const newMoveTypeIcon = globalScene.add.sprite(0, 0, spriteKey, PokemonType[moveType].toLowerCase()); newMoveTypeIcon.setOrigin(0, 1); this.extraMoveRowContainer.add(newMoveTypeIcon); } @@ -1035,7 +1035,7 @@ export default class SummaryUiHandler extends UiHandler { if (move && this.pokemon) { const spriteKey = Utils.getLocalizedSpriteKey("types"); const moveType = this.pokemon.getMoveType(move.getMove()); - const typeIcon = globalScene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + const typeIcon = globalScene.add.sprite(0, 0, spriteKey, PokemonType[moveType].toLowerCase()); typeIcon.setOrigin(0, 1); moveRowContainer.add(typeIcon); } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 681c5ff40c0..1f2e4955081 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "../battle"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { getMoveTargets } from "../data/move"; +import { getMoveTargets } from "../data/moves/move"; import { Button } from "#enums/buttons"; import type { Moves } from "#enums/moves"; import type Pokemon from "#app/field/pokemon"; diff --git a/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts index 230835a887e..017bb2cea06 100644 --- a/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/abilities/battery.test.ts b/test/abilities/battery.test.ts index b82ffaeea7b..7ce37f472f0 100644 --- a/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; diff --git a/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts index 38d25fa3800..b2ba9ceedd9 100644 --- a/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -1,4 +1,5 @@ -import { allMoves, MultiHitAttr, MultiHitType } from "#app/data/move"; +import { allMoves, MultiHitAttr } from "#app/data/moves/move"; +import { MultiHitType } from "#enums/MultiHitType"; import { Status } from "#app/data/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts index 986bd8e7925..8cb7b0233c2 100644 --- a/test/abilities/friend_guard.test.ts +++ b/test/abilities/friend_guard.test.ts @@ -6,7 +6,8 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; import { allAbilities } from "#app/data/ability"; -import { allMoves, MoveCategory } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; describe("Moves - Friend Guard", () => { let phaserGame: Phaser.Game; diff --git a/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts index f0230be3b31..9ba57c296d9 100644 --- a/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -import { Type } from "#enums/type"; +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; @@ -54,7 +54,7 @@ describe("Abilities - Galvanize", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.EFFECTIVE); expect(move.calculateBattlePower).toHaveReturnedWith(48); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); @@ -77,7 +77,7 @@ describe("Abilities - Galvanize", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); @@ -96,7 +96,7 @@ describe("Abilities - Galvanize", () => { game.move.select(Moves.REVELATION_DANCE); await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); @@ -122,7 +122,7 @@ describe("Abilities - Galvanize", () => { const enemyStartingHp = enemyPokemon.hp; await game.phaseInterceptor.to("MoveEffectPhase"); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); } diff --git a/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts index c92bc5cbbd3..669e73961e3 100644 --- a/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; diff --git a/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts index c614bbe4474..35fa816b88b 100644 --- a/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -1,5 +1,5 @@ import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Stat } from "#enums/stat"; diff --git a/test/abilities/libero.test.ts b/test/abilities/libero.test.ts index 46093019daa..d36422ade4a 100644 --- a/test/abilities/libero.test.ts +++ b/test/abilities/libero.test.ts @@ -1,5 +1,5 @@ -import { allMoves } from "#app/data/move"; -import { Type } from "#enums/type"; +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { Weather } from "#app/data/weather"; import type { PlayerPokemon } from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; @@ -74,8 +74,8 @@ describe("Abilities - Libero", () => { await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.LIBERO)).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].type]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -110,8 +110,8 @@ describe("Abilities - Libero", () => { expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.FIRE]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; expect(leadPokemonType).toBe(moveType); }, ); @@ -132,8 +132,8 @@ describe("Abilities - Libero", () => { expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.ICE]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; expect(leadPokemonType).toBe(moveType); }, ); @@ -341,7 +341,7 @@ describe("Abilities - Libero", () => { function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); expect(pokemon.getTypes()).toHaveLength(1); - const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].type]; + const pokemonType = PokemonType[pokemon.getTypes()[0]], + moveType = PokemonType[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts index 9bb7b55bc72..398d0d530e1 100644 --- a/test/abilities/magic_bounce.test.ts +++ b/test/abilities/magic_bounce.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities } from "#app/data/ability"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Stat } from "#app/enums/stat"; diff --git a/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts index 75990c89707..63f8bb5b15e 100644 --- a/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,12 +38,12 @@ describe("Abilities - Mimicry", () => { const [ playerPokemon1, playerPokemon2 ] = game.scene.getPlayerParty(); game.move.select(Moves.SPLASH); await game.toNextTurn(); - expect(playerPokemon1.getTypes().includes(Type.FAIRY)).toBe(true); + expect(playerPokemon1.getTypes().includes(PokemonType.FAIRY)).toBe(true); game.doSwitchPokemon(1); await game.toNextTurn(); - expect(playerPokemon2.getTypes().includes(Type.FAIRY)).toBe(true); + expect(playerPokemon2.getTypes().includes(PokemonType.FAIRY)).toBe(true); }); it("Pokemon should revert back to its original, root type once terrain ends", async () => { @@ -57,7 +57,7 @@ describe("Abilities - Mimicry", () => { game.move.select(Moves.TRANSFORM); await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); await game.toNextTurn(); - expect(playerPokemon?.getTypes().includes(Type.PSYCHIC)).toBe(true); + expect(playerPokemon?.getTypes().includes(PokemonType.PSYCHIC)).toBe(true); if (game.scene.arena.terrain) { game.scene.arena.terrain.turnsLeft = 1; @@ -66,7 +66,7 @@ describe("Abilities - Mimicry", () => { game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.SPLASH); await game.toNextTurn(); - expect(playerPokemon?.getTypes().includes(Type.ELECTRIC)).toBe(true); + expect(playerPokemon?.getTypes().includes(PokemonType.ELECTRIC)).toBe(true); }); it("If the Pokemon is under the effect of a type-adding move and an equivalent terrain activates, the move's effect disappears", async () => { @@ -79,13 +79,13 @@ describe("Abilities - Mimicry", () => { await game.forceEnemyMove(Moves.FORESTS_CURSE); await game.toNextTurn(); - expect(playerPokemon?.summonData.addedType).toBe(Type.GRASS); + expect(playerPokemon?.summonData.addedType).toBe(PokemonType.GRASS); game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.GRASSY_TERRAIN); await game.phaseInterceptor.to("TurnEndPhase"); expect(playerPokemon?.summonData.addedType).toBeNull(); - expect(playerPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + expect(playerPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); }); }); diff --git a/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts index d22c5615df2..55dc39bfbbd 100644 --- a/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -1,4 +1,4 @@ -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; @@ -265,11 +265,11 @@ describe("Abilities - Parental Bond", () => { expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.hp).toBeGreaterThan(0); - expect(leadPokemon.isOfType(Type.FIRE)).toBe(true); + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(true); await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.isOfType(Type.FIRE)).toBe(false); + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(false); } ); diff --git a/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts index dbc3799d48d..d4035da33d9 100644 --- a/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; diff --git a/test/abilities/protean.test.ts b/test/abilities/protean.test.ts index a20fa61d75f..6c200f757e9 100644 --- a/test/abilities/protean.test.ts +++ b/test/abilities/protean.test.ts @@ -1,5 +1,5 @@ -import { allMoves } from "#app/data/move"; -import { Type } from "#enums/type"; +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { Weather } from "#app/data/weather"; import type { PlayerPokemon } from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; @@ -74,8 +74,8 @@ describe("Abilities - Protean", () => { await game.phaseInterceptor.to(TurnEndPhase); expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.PROTEAN)).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].type]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; expect(leadPokemonType).not.toBe(moveType); await game.toNextTurn(); @@ -110,8 +110,8 @@ describe("Abilities - Protean", () => { expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.FIRE]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; expect(leadPokemonType).toBe(moveType); }, ); @@ -132,8 +132,8 @@ describe("Abilities - Protean", () => { expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.ICE]; + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; expect(leadPokemonType).toBe(moveType); }, ); @@ -341,7 +341,7 @@ describe("Abilities - Protean", () => { function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); expect(pokemon.getTypes()).toHaveLength(1); - const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].type]; + const pokemonType = PokemonType[pokemon.getTypes()[0]], + moveType = PokemonType[allMoves[move].type]; expect(pokemonType).toBe(moveType); } diff --git a/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts index 836219fcbcb..8294d2e1d69 100644 --- a/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -9,7 +9,7 @@ import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { allMoves, RandomMoveAttr } from "#app/data/move"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { diff --git a/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts index cb21121743b..7444347401c 100644 --- a/test/abilities/serene_grace.test.ts +++ b/test/abilities/serene_grace.test.ts @@ -4,9 +4,9 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { FlinchAttr } from "#app/data/move"; +import { FlinchAttr } from "#app/data/moves/move"; describe("Abilities - Serene Grace", () => { let phaserGame: Phaser.Game; diff --git a/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts index a65334cbfa0..1f9a101f409 100644 --- a/test/abilities/sheer_force.test.ts +++ b/test/abilities/sheer_force.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -7,7 +7,7 @@ import { Stat } from "#enums/stat"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { allMoves, FlinchAttr } from "#app/data/move"; +import { allMoves, FlinchAttr } from "#app/data/moves/move"; describe("Abilities - Sheer Force", () => { let phaserGame: Phaser.Game; @@ -106,7 +106,7 @@ describe("Abilities - Sheer Force", () => { await game.move.forceHit(); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon?.getTypes()[0]).toBe(Type.WATER); + expect(enemyPokemon?.getTypes()[0]).toBe(PokemonType.WATER); expect(headbuttMove.calculateBattlePower).toHaveLastReturnedWith(headbuttMove.power * SHEER_FORCE_MULT); expect(headbuttFlinchAttr.getMoveChance).toHaveLastReturnedWith(0); }); diff --git a/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts index e1f6a04c0fa..beda5d34e8e 100644 --- a/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -1,5 +1,5 @@ import { allAbilities } from "#app/data/ability"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts index 6de17bc3c7a..18e0823a7cb 100644 --- a/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -6,7 +6,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Abilities - Supreme Overlord", () => { let phaserGame: Phaser.Game; diff --git a/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts index 67cf83870b3..a2134a96f4d 100644 --- a/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { PostItemLostAbAttr } from "#app/data/ability"; -import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; +import { allMoves, StealHeldItemChanceAttr } from "#app/data/moves/move"; import type Pokemon from "#app/field/pokemon"; import type { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; import { Abilities } from "#enums/abilities"; diff --git a/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts index 5aff05d4c20..a37885834c4 100644 --- a/test/abilities/wimp_out.test.ts +++ b/test/abilities/wimp_out.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import GameManager from "#test/testUtils/gameManager"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; diff --git a/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts index 4f6e45d8fe0..d6c49ed4abe 100644 --- a/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -1,5 +1,5 @@ import { allAbilities } from "#app/data/ability"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts index 75197a4341c..4bacf51f094 100644 --- a/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts index f493242a9d8..a9a955efdfe 100644 --- a/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts index 8b4ffff3a64..1b98b791aec 100644 --- a/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; diff --git a/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts index 2685a9149ae..edc3025111d 100644 --- a/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { StatusEffect } from "#app/enums/status-effect"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; diff --git a/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts index 0a954b624c0..111a53a0c9b 100644 --- a/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import type { EnemyPersistentModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; diff --git a/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts index ce44824e772..9d23a34a45e 100644 --- a/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Challenges } from "#enums/challenges"; @@ -221,7 +221,7 @@ describe("Inverse Battle", () => { await game.phaseInterceptor.to("TurnEndPhase"); - expect(player.getTypes()[0]).toBe(Type.DRAGON); + expect(player.getTypes()[0]).toBe(PokemonType.DRAGON); }); it("Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => { diff --git a/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts index 4bf7e584ed3..7e27cf9a826 100644 --- a/test/battlerTags/substitute.test.ts +++ b/test/battlerTags/substitute.test.ts @@ -7,7 +7,7 @@ import { BattlerTagLapseType, BindTag, SubstituteTag } from "#app/data/battler-t import { Moves } from "#app/enums/moves"; import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; import * as messages from "#app/messages"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; describe("BattlerTag - SubstituteTag", () => { diff --git a/test/enemy_command.test.ts b/test/enemy_command.test.ts index b8e0c38b9e8..2d6a65e3edd 100644 --- a/test/enemy_command.test.ts +++ b/test/enemy_command.test.ts @@ -1,5 +1,6 @@ import type BattleScene from "#app/battle-scene"; -import { allMoves, MoveCategory } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; diff --git a/test/field/pokemon.test.ts b/test/field/pokemon.test.ts index b327fe0c137..0ea1e08c31d 100644 --- a/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -4,7 +4,7 @@ import GameManager from "#test/testUtils/gameManager"; import { PokeballType } from "#enums/pokeball"; import type BattleScene from "#app/battle-scene"; import { Moves } from "#app/enums/moves"; -import { Type } from "#app/enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; describe("Spec - Pokemon", () => { @@ -94,39 +94,39 @@ describe("Spec - Pokemon", () => { const pokemon = scene.getPlayerParty()[0]; let types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); - pokemon.customPokemonData.types = [ Type.UNKNOWN, Type.NORMAL ]; + pokemon.customPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); - pokemon.customPokemonData.types = [ Type.NORMAL, Type.UNKNOWN ]; + pokemon.customPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.NORMAL); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.NORMAL); + expect(types[1]).toBe(PokemonType.FIRE); if (!pokemon.fusionCustomPokemonData) { pokemon.fusionCustomPokemonData = new CustomPokemonData(); } pokemon.customPokemonData.types = []; - pokemon.fusionCustomPokemonData.types = [ Type.UNKNOWN, Type.NORMAL ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.NORMAL); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.NORMAL); - pokemon.fusionCustomPokemonData.types = [ Type.NORMAL, Type.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.NORMAL); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.NORMAL); - pokemon.customPokemonData.types = [ Type.NORMAL, Type.UNKNOWN ]; - pokemon.fusionCustomPokemonData.types = [ Type.UNKNOWN, Type.NORMAL ]; + pokemon.customPokemonData.types = [ PokemonType.NORMAL, PokemonType.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.NORMAL ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.NORMAL); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.NORMAL); + expect(types[1]).toBe(PokemonType.FIRE); }); it("Fusing two mons with same single type", async () => { @@ -135,7 +135,7 @@ describe("Spec - Pokemon", () => { const pokemon = scene.getPlayerParty()[0]; const types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); + expect(types[0]).toBe(PokemonType.PSYCHIC); expect(types.length).toBe(1); }); @@ -146,8 +146,8 @@ describe("Spec - Pokemon", () => { const pokemon = scene.getPlayerParty()[0]; const types = pokemon.getTypes(); - expect(types[0]).toBe(Type.FIRE); - expect(types[1]).toBe(Type.DARK); + expect(types[0]).toBe(PokemonType.FIRE); + expect(types[1]).toBe(PokemonType.DARK); }); it("Fusing mons with two and one types", async () => { @@ -157,8 +157,8 @@ describe("Spec - Pokemon", () => { const pokemon = scene.getPlayerParty()[0]; const types = pokemon.getTypes(); - expect(types[0]).toBe(Type.FIRE); - expect(types[1]).toBe(Type.GROUND); + expect(types[0]).toBe(PokemonType.FIRE); + expect(types[1]).toBe(PokemonType.GROUND); }); it("Fusing two mons with two types", async () => { @@ -168,20 +168,20 @@ describe("Spec - Pokemon", () => { const pokemon = scene.getPlayerParty()[0]; let types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); // Natu Psychic/Grass - pokemon.customPokemonData.types = [ Type.UNKNOWN, Type.GRASS ]; + pokemon.customPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); // Natu Grass/Flying - pokemon.customPokemonData.types = [ Type.GRASS, Type.UNKNOWN ]; + pokemon.customPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.GRASS); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.GRASS); + expect(types[1]).toBe(PokemonType.FIRE); if (!pokemon.fusionCustomPokemonData) { pokemon.fusionCustomPokemonData = new CustomPokemonData(); @@ -189,24 +189,24 @@ describe("Spec - Pokemon", () => { pokemon.customPokemonData.types = []; // Houndour Dark/Grass - pokemon.fusionCustomPokemonData.types = [ Type.UNKNOWN, Type.GRASS ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.GRASS); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.GRASS); // Houndour Grass/Fire - pokemon.fusionCustomPokemonData.types = [ Type.GRASS, Type.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.PSYCHIC); - expect(types[1]).toBe(Type.FIRE); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); // Natu Grass/Flying // Houndour Dark/Grass - pokemon.customPokemonData.types = [ Type.GRASS, Type.UNKNOWN ]; - pokemon.fusionCustomPokemonData.types = [ Type.UNKNOWN, Type.GRASS ]; + pokemon.customPokemonData.types = [ PokemonType.GRASS, PokemonType.UNKNOWN ]; + pokemon.fusionCustomPokemonData.types = [ PokemonType.UNKNOWN, PokemonType.GRASS ]; types = pokemon.getTypes(); - expect(types[0]).toBe(Type.GRASS); - expect(types[1]).toBe(Type.DARK); + expect(types[0]).toBe(PokemonType.GRASS); + expect(types[1]).toBe(PokemonType.DARK); }); }); }); diff --git a/test/moves/astonish.test.ts b/test/moves/astonish.test.ts index 87af0db737b..f6e447ec7c5 100644 --- a/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts index 21b46c4be79..eb77cdc3a44 100644 --- a/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import type Move from "#app/data/move"; -import { allMoves, CritOnlyAttr } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; diff --git a/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts index bfa9af600a2..acdce23db92 100644 --- a/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; import { Moves } from "#enums/moves"; diff --git a/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts index 8995e2d00bb..b329170cc42 100644 --- a/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TerrainType } from "#app/data/terrain"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BattlerIndex } from "#app/battle"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; @@ -44,6 +44,6 @@ describe("Moves - Camouflage", () => { await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.getTerrainType()).toBe(TerrainType.PSYCHIC); const pokemonType = playerPokemon.getTypes()[0]; - expect(pokemonType).toBe(Type.PSYCHIC); + expect(pokemonType).toBe(PokemonType.PSYCHIC); }); }); diff --git a/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts index 22cf310bc80..2d929221e0b 100644 --- a/test/moves/ceaseless_edge.test.ts +++ b/test/moves/ceaseless_edge.test.ts @@ -1,5 +1,5 @@ import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; diff --git a/test/moves/copycat.test.ts b/test/moves/copycat.test.ts index 9b111c7b342..f682aeb7b5e 100644 --- a/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves, RandomMoveAttr } from "#app/data/move"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; import { Stat } from "#app/enums/stat"; import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; diff --git a/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts index 9ae37ef5b9b..a64065178ce 100644 --- a/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -1,6 +1,6 @@ import type { ArenaTrapTag } from "#app/data/arena-tag"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; diff --git a/test/moves/diamond_storm.test.ts b/test/moves/diamond_storm.test.ts index 7a30f73a113..3c81f8221ba 100644 --- a/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/dig.test.ts b/test/moves/dig.test.ts index 53104f13b20..d9cf4845a67 100644 --- a/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts index 44bedeaa03a..0c5b0d69675 100644 --- a/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; @@ -84,8 +84,8 @@ describe("Moves - Dragon Cheer", () => { await game.toNextTurn(); // Change Magikarp's type to Dragon - vi.spyOn(magikarp, "getTypes").mockReturnValue([ Type.DRAGON ]); - expect(magikarp.getTypes()).toEqual([ Type.DRAGON ]); + vi.spyOn(magikarp, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); + expect(magikarp.getTypes()).toEqual([ PokemonType.DRAGON ]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); diff --git a/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts index 0a5202825f5..6540bc2f327 100644 --- a/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Species } from "#app/enums/species"; import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; @@ -53,7 +53,7 @@ describe("Moves - Dragon Rage", () => { it("ignores weaknesses", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ Type.DRAGON ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -63,7 +63,7 @@ describe("Moves - Dragon Rage", () => { it("ignores resistances", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ Type.STEEL ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ PokemonType.STEEL ]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -83,7 +83,7 @@ describe("Moves - Dragon Rage", () => { it("ignores stab", async () => { game.override.disableCrits(); - vi.spyOn(partyPokemon, "getTypes").mockReturnValue([ Type.DRAGON ]); + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([ PokemonType.DRAGON ]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts index 8415251c24c..545ad9fe8eb 100644 --- a/test/moves/dragon_tail.test.ts +++ b/test/moves/dragon_tail.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Status } from "#app/data/status-effect"; import { Challenges } from "#enums/challenges"; import { StatusEffect } from "#enums/status-effect"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -237,7 +237,7 @@ describe("Moves - Dragon Tail", () => { .startingLevel(100) .enemyLevel(1); // Mono-Water challenge, Eevee is ineligible - game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.WATER + 1, 0); + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.WATER + 1, 0); await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); diff --git a/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts index 0deb12b2737..63e88808218 100644 --- a/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; diff --git a/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts index d9974fd1980..31c8ee715c6 100644 --- a/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -1,7 +1,7 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { TrainerSlot } from "#app/data/trainer-config"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; @@ -11,7 +11,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, - expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { + expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: PokemonType): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); game.override.enemyAbility(targetAbility); @@ -83,7 +83,7 @@ describe("Moves - Type Effectiveness", () => { ); it("Electric-type attacks are super-effective against Tera-Water Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, Type.WATER) + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, PokemonType.WATER) ); it("Powder moves have no effect on Grass-type Pokemon", @@ -91,7 +91,7 @@ describe("Moves - Type Effectiveness", () => { ); it("Powder moves have no effect on Tera-Grass Pokemon", - () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.GRASS) + () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.GRASS) ); it("Prankster-boosted status moves have no effect on Dark-type Pokemon", @@ -104,7 +104,7 @@ describe("Moves - Type Effectiveness", () => { it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", () => { game.override.ability(Abilities.PRANKSTER); - testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.DARK); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.DARK); } ); }); diff --git a/test/moves/electrify.test.ts b/test/moves/electrify.test.ts index f7d78a2f4d0..7f6221f4036 100644 --- a/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -45,7 +45,7 @@ describe("Moves - Electrify", () => { await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); }); @@ -63,7 +63,7 @@ describe("Moves - Electrify", () => { await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); }); }); diff --git a/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts index fdcba624e22..c7cd616a95e 100644 --- a/test/moves/fell_stinger.test.ts +++ b/test/moves/fell_stinger.test.ts @@ -7,7 +7,7 @@ import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#app/enums/status-effect"; import { WeatherType } from "#app/enums/weather-type"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Fell Stinger", () => { diff --git a/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts index d6f79c40533..f51cb8a085e 100644 --- a/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -1,6 +1,6 @@ import { Stat } from "#enums/stat"; import { SemiInvulnerableTag } from "#app/data/battler-tags"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Biome } from "#app/enums/biome"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; @@ -56,7 +56,7 @@ describe("Moves - Flower Shield", () => { await game.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); const field = game.scene.getField(true); - const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS)); + const grassPokemons = field.filter(p => p.getTypes().includes(PokemonType.GRASS)); const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon)); grassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(0)); diff --git a/test/moves/fly.test.ts b/test/moves/fly.test.ts index b0abf96e128..2471372f97c 100644 --- a/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -8,7 +8,7 @@ import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Fly", () => { let phaserGame: Phaser.Game; diff --git a/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts index c9977190c9d..f275db8d2bb 100644 --- a/test/moves/forests_curse.test.ts +++ b/test/moves/forests_curse.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,10 +38,10 @@ describe("Moves - Forest's Curse", () => { const enemyPokemon = game.scene.getEnemyPokemon(); game.move.select(Moves.TRICK_OR_TREAT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon!.summonData.addedType).toBe(Type.GHOST); + expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GHOST); game.move.select(Moves.FORESTS_CURSE); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon?.summonData.addedType).toBe(Type.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 f07105882c2..62375393563 100644 --- a/test/moves/freeze_dry.test.ts +++ b/test/moves/freeze_dry.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Challenges } from "#enums/challenges"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; @@ -121,7 +121,7 @@ describe("Moves - Freeze-Dry", () => { await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - enemy.teraType = Type.WATER; + enemy.teraType = PokemonType.WATER; enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -137,7 +137,7 @@ describe("Moves - Freeze-Dry", () => { await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - enemy.teraType = Type.FIRE; + enemy.teraType = PokemonType.FIRE; enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); diff --git a/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts index 26c7d06961f..fe7fee10ad1 100644 --- a/test/moves/freezy_frost.test.ts +++ b/test/moves/freezy_frost.test.ts @@ -5,7 +5,7 @@ import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { CommandPhase } from "#app/phases/command-phase"; describe("Moves - Freezy Frost", () => { diff --git a/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts index 340020c85b7..aa2b0cb1bc3 100644 --- a/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -1,6 +1,6 @@ import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; diff --git a/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts index 557d003e541..278cea86c83 100644 --- a/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; diff --git a/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts index 29a386207ad..32c9190e06e 100644 --- a/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts index 5869655948c..f03d54426d6 100644 --- a/test/moves/hyper_beam.test.ts +++ b/test/moves/hyper_beam.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Moves } from "#app/enums/moves"; diff --git a/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts index 3fe5c56dd3e..7ba507b66b9 100644 --- a/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts index 54e4bc5a0bc..272c6bc71b7 100644 --- a/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -3,7 +3,7 @@ import { BattlerIndex } from "#app/battle"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import GameManager from "#test/testUtils/gameManager"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts index 1f9e4f9b97f..2a4a1568136 100644 --- a/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import type Move from "#app/data/move"; -import { allMoves, CritOnlyAttr } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; diff --git a/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts index 6ecbea435b6..c3e2e6e9f51 100644 --- a/test/moves/magic_coat.test.ts +++ b/test/moves/magic_coat.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Stat } from "#app/enums/stat"; diff --git a/test/moves/metronome.test.ts b/test/moves/metronome.test.ts index 85c027b62e3..a1253334f0f 100644 --- a/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -1,5 +1,5 @@ import { RechargingTag, SemiInvulnerableTag } from "#app/data/battler-tags"; -import { allMoves, RandomMoveAttr } from "#app/data/move"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts index 15a5787be41..5b36129fe2a 100644 --- a/test/moves/moongeist_beam.test.ts +++ b/test/moves/moongeist_beam.test.ts @@ -1,4 +1,4 @@ -import { allMoves, RandomMoveAttr } from "#app/data/move"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts index 5a2ec90f60b..276b5fd999a 100644 --- a/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -50,7 +50,7 @@ describe("Moves - Plasma Fists", () => { await game.phaseInterceptor.to("BerryPhase", false); field.forEach(p => { - expect(p.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(p.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(p.hp).toBeLessThan(p.getMaxHp()); }); }); @@ -71,7 +71,7 @@ describe("Moves - Plasma Fists", () => { await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.FAIRY); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.FAIRY); expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); }); @@ -92,7 +92,7 @@ describe("Moves - Plasma Fists", () => { await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); }); }); diff --git a/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts index 24fff05a25d..62606489d0b 100644 --- a/test/moves/pledge_moves.test.ts +++ b/test/moves/pledge_moves.test.ts @@ -1,8 +1,8 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities } from "#app/data/ability"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves, FlinchAttr } from "#app/data/move"; -import { Type } from "#enums/type"; +import { allMoves, FlinchAttr } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Stat } from "#enums/stat"; import { toDmgValue } from "#app/utils"; @@ -57,7 +57,7 @@ describe("Moves - Pledge Moves", () => { await game.phaseInterceptor.to("MoveEndPhase", false); expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(Type.FIRE); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); } ); @@ -81,11 +81,11 @@ describe("Moves - Pledge Moves", () => { await game.phaseInterceptor.to("MoveEndPhase"); expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(Type.FIRE); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); await game.phaseInterceptor.to("BerryPhase", false); expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.FIRE); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); } @@ -137,7 +137,7 @@ describe("Moves - Pledge Moves", () => { for (let i = 0; i < 2; i++) { await game.phaseInterceptor.to("MoveEndPhase"); } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.FIRE); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); expect(grassPledge.calculateBattlePower).toHaveLastReturnedWith(150); const baseDmg = baseDmgMock.mock.results[baseDmgMock.mock.results.length - 1].value; @@ -174,7 +174,7 @@ describe("Moves - Pledge Moves", () => { for (let i = 0; i < 2; i++) { await game.phaseInterceptor.to("MoveEndPhase"); } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.WATER); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER); expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150); expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); @@ -214,7 +214,7 @@ describe("Moves - Pledge Moves", () => { await game.phaseInterceptor.to("MoveEndPhase"); } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.GRASS); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.GRASS); expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150); expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); diff --git a/test/moves/powder.test.ts b/test/moves/powder.test.ts index 24162825230..b43772bd703 100644 --- a/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { MoveResult, PokemonMove } from "#app/field/pokemon"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { StatusEffect } from "#enums/status-effect"; import { BattlerIndex } from "#app/battle"; @@ -163,7 +163,7 @@ describe("Moves - Powder", () => { await game.phaseInterceptor.to(BerryPhase, false); expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(enemyPokemon.summonData?.types).not.toBe(Type.FIRE); + expect(enemyPokemon.summonData?.types).not.toBe(PokemonType.FIRE); }); it( diff --git a/test/moves/protect.test.ts b/test/moves/protect.test.ts index d502e997483..7f5484ab7c9 100644 --- a/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -5,7 +5,7 @@ import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import { BattlerIndex } from "#app/battle"; import { MoveResult } from "#app/field/pokemon"; diff --git a/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts index 4d17cf990f7..15c8794a469 100644 --- a/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/test/moves/reflect.test.ts b/test/moves/reflect.test.ts index a0376aa24b4..4f818afb071 100644 --- a/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -1,7 +1,7 @@ import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import type Move from "#app/data/move"; -import { allMoves, CritOnlyAttr } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import type Pokemon from "#app/field/pokemon"; diff --git a/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts index 575f4b88f86..aa61f00a083 100644 --- a/test/moves/reflect_type.test.ts +++ b/test/moves/reflect_type.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -47,13 +47,13 @@ describe("Moves - Reflect Type", () => { game.move.select(Moves.FORESTS_CURSE); await game.forceEnemyMove(Moves.SPLASH); await game.toNextTurn(); - expect(enemyPokemon?.getTypes().includes(Type.UNKNOWN)).toBe(true); - expect(enemyPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + expect(enemyPokemon?.getTypes().includes(PokemonType.UNKNOWN)).toBe(true); + expect(enemyPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); game.move.select(Moves.REFLECT_TYPE); await game.forceEnemyMove(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); - expect(playerPokemon?.getTypes()[0]).toBe(Type.NORMAL); - expect(playerPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + expect(playerPokemon?.getTypes()[0]).toBe(PokemonType.NORMAL); + expect(playerPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); }); }); diff --git a/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts index f28047bb90e..48e945f596a 100644 --- a/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -1,4 +1,4 @@ -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Challenges } from "#app/enums/challenges"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -48,7 +48,7 @@ describe("Moves - Relic Song", () => { }); it("doesn't swap Meloetta's form during a mono-type challenge", async () => { - game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.PSYCHIC + 1, 0); + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.PSYCHIC + 1, 0); await game.challengeMode.startBattle([ Species.MELOETTA ]); const meloetta = game.scene.getPlayerPokemon()!; diff --git a/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts index 32d5379f05e..33bba2af211 100644 --- a/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -3,7 +3,7 @@ import Phaser from "phaser"; import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Retaliate", () => { let phaserGame: Phaser.Game; diff --git a/test/moves/rollout.test.ts b/test/moves/rollout.test.ts index c58ab3e6a18..08c18267a75 100644 --- a/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/test/moves/roost.test.ts b/test/moves/roost.test.ts index b9424747f5e..470313a27fb 100644 --- a/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; @@ -59,7 +59,7 @@ describe("Moves - Roost", () => { // Should only be normal type, and NOT flying type let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); @@ -68,7 +68,7 @@ describe("Moves - Roost", () => { // Lose HP, still normal type playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); } @@ -86,8 +86,8 @@ describe("Moves - Roost", () => { // Should only be normal type, and NOT flying type let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeFalsy(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeFalsy(); expect(playerPokemon.isGrounded()).toBeTruthy(); await game.phaseInterceptor.to(TurnEndPhase); @@ -95,8 +95,8 @@ describe("Moves - Roost", () => { // Should have lost HP and is now back to being pure flying playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeFalsy(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeFalsy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); } @@ -114,7 +114,7 @@ describe("Moves - Roost", () => { // Should only be pure fighting type and grounded let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); @@ -123,8 +123,8 @@ describe("Moves - Roost", () => { // Should have lost HP and is now back to being fighting/flying playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FIGHTING).toBeTruthy(); - expect(playerPokemonTypes[1] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); } @@ -143,7 +143,7 @@ describe("Moves - Roost", () => { // Should only be pure eletric type and grounded let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); @@ -152,8 +152,8 @@ describe("Moves - Roost", () => { // Should have lost HP and is now back to being electric/flying playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBe(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.ELECTRIC).toBeTruthy(); - expect(playerPokemonTypes[1] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); } @@ -171,7 +171,7 @@ describe("Moves - Roost", () => { // Should only be pure flying type after burn up let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); await game.phaseInterceptor.to(TurnEndPhase); @@ -182,7 +182,7 @@ describe("Moves - Roost", () => { // Should only be typeless type after roost and is grounded playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === Type.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); @@ -191,7 +191,7 @@ describe("Moves - Roost", () => { // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); @@ -211,7 +211,7 @@ describe("Moves - Roost", () => { // Should only be pure flying type after burn up let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); await game.phaseInterceptor.to(TurnEndPhase); @@ -222,7 +222,7 @@ describe("Moves - Roost", () => { // Should only be typeless type after roost and is grounded playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === Type.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); @@ -231,7 +231,7 @@ describe("Moves - Roost", () => { // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again playerPokemonTypes = playerPokemon.getTypes(); expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); @@ -248,7 +248,7 @@ describe("Moves - Roost", () => { await game.phaseInterceptor.to(MoveEffectPhase); let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FIRE).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FIRE).toBeTruthy(); expect(playerPokemonTypes.length === 1).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeTruthy(); @@ -256,9 +256,9 @@ describe("Moves - Roost", () => { // Should be fire/flying/ghost playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes.filter(type => type === Type.FLYING)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === Type.FIRE)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === Type.GHOST)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.FLYING)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.FIRE)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.GHOST)).toHaveLength(1); expect(playerPokemonTypes.length === 3).toBeTruthy(); expect(playerPokemon.isGrounded()).toBeFalsy(); diff --git a/test/moves/round.test.ts b/test/moves/round.test.ts index 5d26e242aff..01efa098f5a 100644 --- a/test/moves/round.test.ts +++ b/test/moves/round.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts index 76954ba2413..118b37795a1 100644 --- a/test/moves/scale_shot.test.ts +++ b/test/moves/scale_shot.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; diff --git a/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts index f155633d545..26fec5fabc3 100644 --- a/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; diff --git a/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts index 3a658d53a83..c23bb316ba0 100644 --- a/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move"; +import { allMoves, ShellSideArmCategoryAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts index aa94d0cab1b..2e9d9ed69d6 100644 --- a/test/moves/shell_trap.test.ts +++ b/test/moves/shell_trap.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; diff --git a/test/moves/sketch.test.ts b/test/moves/sketch.test.ts index e736893b0aa..0b63598ba9b 100644 --- a/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -7,7 +7,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#app/enums/status-effect"; import { BattlerIndex } from "#app/battle"; -import { allMoves, RandomMoveAttr } from "#app/data/move"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; describe("Moves - Sketch", () => { let phaserGame: Phaser.Game; diff --git a/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts index 7f18cebff6d..c3025db57d0 100644 --- a/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#enums/battler-tag-type"; import { WeatherType } from "#enums/weather-type"; import { MoveResult } from "#app/field/pokemon"; diff --git a/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts index 53851cb77d3..f865c00271f 100644 --- a/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { StatusEffect } from "#app/enums/status-effect"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; diff --git a/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts index 883f280da08..d7524586d66 100644 --- a/test/moves/spectral_thief.test.ts +++ b/test/moves/spectral_thief.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerIndex } from "#app/battle"; import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; diff --git a/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts index 125b17891ed..59dca04fe26 100644 --- a/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -1,6 +1,6 @@ import { Stat } from "#enums/stat"; import { StockpilingTag } from "#app/data/battler-tags"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import type { TurnMove } from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; diff --git a/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts index 2aed941fd92..e83b67e9d9c 100644 --- a/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import type { DamageCalculationResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; diff --git a/test/moves/substitute.test.ts b/test/moves/substitute.test.ts index 5acbb6c0a44..ce5fbdd99d8 100644 --- a/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; -import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; +import { allMoves, StealHeldItemChanceAttr } from "#app/data/moves/move"; import { MoveResult } from "#app/field/pokemon"; import type { CommandPhase } from "#app/phases/command-phase"; import GameManager from "#test/testUtils/gameManager"; diff --git a/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts index 1a259206e48..e5adfe6112d 100644 --- a/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; @@ -87,7 +87,7 @@ describe("Moves - Tar Shot", () => { await game.classicMode.startBattle([ Species.PIKACHU ]); const enemy = game.scene.getEnemyPokemon()!; - enemy.teraType = Type.GRASS; + enemy.teraType = PokemonType.GRASS; enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -121,7 +121,7 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); - enemy.teraType = Type.GRASS; + enemy.teraType = PokemonType.GRASS; enemy.isTerastallized = true; game.move.select(Moves.FIRE_PUNCH); diff --git a/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts index 441c70fff34..f24f972b44c 100644 --- a/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -1,5 +1,5 @@ import { BattlerTagType } from "#enums/battler-tag-type"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts index 22231ec6e46..772b14d9f36 100644 --- a/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { Stat } from "#enums/stat"; -import { allMoves, TeraMoveCategoryAttr } from "#app/data/move"; -import { Type } from "#enums/type"; +import { allMoves, TeraMoveCategoryAttr } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; @@ -50,7 +50,7 @@ describe("Moves - Tera Blast", () => { vi.spyOn(enemyPokemon, "apply"); const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = Type.FIGHTING; + playerPokemon.teraType = PokemonType.FIGHTING; playerPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); @@ -64,7 +64,7 @@ describe("Moves - Tera Blast", () => { await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = Type.STELLAR; + playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); @@ -78,7 +78,7 @@ describe("Moves - Tera Blast", () => { await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = Type.STELLAR; + playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -178,7 +178,7 @@ describe("Moves - Tera Blast", () => { await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.teraType = Type.STELLAR; + playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); diff --git a/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts index 219a64b4ecc..9e2a06c7f0f 100644 --- a/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -44,7 +44,7 @@ describe("Moves - Tera Starstorm", () => { game.move.select(Moves.TERA_STARSTORM); await game.phaseInterceptor.to("TurnEndPhase"); - expect(terapagos.getMoveType).toHaveReturnedWith(Type.STELLAR); + expect(terapagos.getMoveType).toHaveReturnedWith(PokemonType.STELLAR); }); it("targets both opponents in a double battle when used by Terapagos in its Stellar Form", async () => { @@ -95,7 +95,7 @@ describe("Moves - Tera Starstorm", () => { // Fusion and terastallized expect(fusionedMon.isFusion()).toBe(true); // Move effects should be applied - expect(fusionedMon.getMoveType).toHaveReturnedWith(Type.STELLAR); + expect(fusionedMon.getMoveType).toHaveReturnedWith(PokemonType.STELLAR); expect(game.scene.getEnemyField().every(pokemon => pokemon.isFullHp())).toBe(false); }); }); diff --git a/test/moves/toxic.test.ts b/test/moves/toxic.test.ts index 8e66fefe6ff..4fea079638a 100644 --- a/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -5,7 +5,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Toxic", () => { let phaserGame: Phaser.Game; diff --git a/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts index 2efd1b76d1a..927d625fbb8 100644 --- a/test/moves/trick_or_treat.test.ts +++ b/test/moves/trick_or_treat.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,10 +38,10 @@ describe("Moves - Trick Or Treat", () => { const enemyPokemon = game.scene.getEnemyPokemon(); game.move.select(Moves.FORESTS_CURSE); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon!.summonData.addedType).toBe(Type.GRASS); + expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GRASS); game.move.select(Moves.TRICK_OR_TREAT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon?.summonData.addedType).toBe(Type.GHOST); + expect(enemyPokemon?.summonData.addedType).toBe(PokemonType.GHOST); }); }); diff --git a/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts index 9aa08d7b670..11926b4066d 100644 --- a/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -1,4 +1,4 @@ -import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/move"; +import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts index 8637b6ec02c..7bf99f0ff21 100644 --- a/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -1,6 +1,6 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Challenges } from "#enums/challenges"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -86,7 +86,7 @@ describe("Moves - Whirlwind", () => { it("should not force a switch to a challenge-ineligible Pokemon", async () => { // Mono-Water challenge, Eevee is ineligible - game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.WATER + 1, 0); + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.WATER + 1, 0); await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); diff --git a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index 799e26ea271..2f690a1d990 100644 --- a/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -29,7 +29,7 @@ import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; @@ -350,15 +350,15 @@ describe("Clowning Around - Mystery Encounter", () => { const thirdTypesAfter = scene.getPlayerParty()[2].getTypes(); expect(leadTypesAfter.length).toBe(2); - expect(leadTypesAfter[0]).toBe(Type.WATER); - expect([ Type.WATER, Type.ICE ].includes(leadTypesAfter[1])).toBeFalsy(); + expect(leadTypesAfter[0]).toBe(PokemonType.WATER); + expect([ PokemonType.WATER, PokemonType.ICE ].includes(leadTypesAfter[1])).toBeFalsy(); expect(secondaryTypesAfter.length).toBe(2); - expect(secondaryTypesAfter[0]).toBe(Type.GHOST); - expect([ Type.GHOST, Type.POISON ].includes(secondaryTypesAfter[1])).toBeFalsy(); - expect([ Type.GRASS, Type.ELECTRIC ].includes(secondaryTypesAfter[1])).toBeTruthy(); + expect(secondaryTypesAfter[0]).toBe(PokemonType.GHOST); + expect([ PokemonType.GHOST, PokemonType.POISON ].includes(secondaryTypesAfter[1])).toBeFalsy(); + expect([ PokemonType.GRASS, PokemonType.ELECTRIC ].includes(secondaryTypesAfter[1])).toBeTruthy(); expect(thirdTypesAfter.length).toBe(2); - expect(thirdTypesAfter[0]).toBe(Type.PSYCHIC); - expect(secondaryTypesAfter[1]).not.toBe(Type.PSYCHIC); + expect(thirdTypesAfter[0]).toBe(PokemonType.PSYCHIC); + expect(secondaryTypesAfter[1]).not.toBe(PokemonType.PSYCHIC); }); it("should leave encounter without battle", async () => { diff --git a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 96fac78d872..a49cadb5549 100644 --- a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -13,7 +13,7 @@ import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRu import { Moves } from "#enums/moves"; import type BattleScene from "#app/battle-scene"; import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Status } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -211,8 +211,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); - const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(Type.FIRE)); - const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(Type.FIRE)); + const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(PokemonType.FIRE)); + const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(PokemonType.FIRE)); expect(scene.currentBattle.mysteryEncounter?.dialogueTokens["burnedPokemon"]).toBe(i18next.t("pokemon:gengar")); burnablePokemon.forEach((pkm) => { expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2)); diff --git a/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts index 6b467b9fa81..25981b444a4 100644 --- a/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -4,7 +4,7 @@ import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterCost, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MessagePhase } from "#app/phases/message-phase"; import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; @@ -231,7 +231,7 @@ describe("Mystery Encounter Utils", () => { it("gets species of specified types", () => { // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos - const result = getRandomSpeciesByStarterCost(9, undefined, [ Type.GROUND ]); + const result = getRandomSpeciesByStarterCost(9, undefined, [ PokemonType.GROUND ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); }); diff --git a/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts index 10287cd2046..92b956d6531 100644 --- a/test/phases/form-change-phase.test.ts +++ b/test/phases/form-change-phase.test.ts @@ -4,7 +4,7 @@ import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { Type } from "#enums/type"; +import { PokemonType } from "#enums/pokemon-type"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -40,7 +40,7 @@ describe("Form Change Phase", () => { // Before the form change: Should be Hero form const zacian = game.scene.getPlayerParty()[0]; expect(zacian.getFormKey()).toBe("hero-of-many-battles"); - expect(zacian.getTypes()).toStrictEqual([ Type.FAIRY ]); + expect(zacian.getTypes()).toStrictEqual([ PokemonType.FAIRY ]); expect(zacian.calculateBaseStats()).toStrictEqual([ 92, 120, 115, 80, 115, 138 ]); // Give Zacian a Rusted Sword @@ -54,7 +54,7 @@ describe("Form Change Phase", () => { // After the form change: Should be Crowned form expect(game.phaseInterceptor.log.includes("FormChangePhase")).toBe(true); expect(zacian.getFormKey()).toBe("crowned"); - expect(zacian.getTypes()).toStrictEqual([ Type.FAIRY, Type.STEEL ]); + expect(zacian.getTypes()).toStrictEqual([ PokemonType.FAIRY, PokemonType.STEEL ]); expect(zacian.calculateBaseStats()).toStrictEqual([ 92, 150, 115, 80, 115, 148 ]); }); }); diff --git a/test/testUtils/gameManager.ts b/test/testUtils/gameManager.ts index 436c97a6967..d245a74d11e 100644 --- a/test/testUtils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -1,7 +1,7 @@ import { updateUserInfo } from "#app/account"; import { BattlerIndex } from "#app/battle"; import BattleScene from "#app/battle-scene"; -import { getMoveTargets } from "#app/data/move"; +import { getMoveTargets } from "#app/data/moves/move"; import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import Trainer from "#app/field/trainer"; import { GameModes, getGameMode } from "#app/game-mode"; diff --git a/test/vitest.setup.ts b/test/vitest.setup.ts index bc7db8ea591..5dc5a69ce73 100644 --- a/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -5,7 +5,7 @@ import { initAbilities } from "#app/data/ability"; import { initBiomes } from "#app/data/balance/biomes"; import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { initMoves } from "#app/data/move"; +import { initMoves } from "#app/data/moves/move"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; From c977bc86c1b6bfa33ca2efc78eeb0b266ca83d95 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 7 Mar 2025 17:20:08 -0800 Subject: [PATCH 157/171] [Misc] Add some pre-defined imports to `overrides.ts` (#5492) --- src/overrides.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/overrides.ts b/src/overrides.ts index d15370259fc..dc04f72049a 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,22 +1,33 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/consistent-type-imports */ import { type PokeballCounts } from "#app/battle-scene"; +import { EvolutionItem } from "#app/data/balance/pokemon-evolutions"; import { Gender } from "#app/data/gender"; +import { FormChangeItem } from "#app/data/pokemon-forms"; import { Variant } from "#app/data/variant"; import { type ModifierOverride } from "#app/modifier/modifier-type"; import { Unlockables } from "#app/system/unlockables"; import { Abilities } from "#enums/abilities"; +import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; import { EggTier } from "#enums/egg-type"; import { Moves } from "#enums/moves"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PokeballType } from "#enums/pokeball"; +import { PokemonType } from "#enums/pokemon-type"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import { TimeOfDay } from "#enums/time-of-day"; import { VariantTier } from "#enums/variant-tier"; import { WeatherType } from "#enums/weather-type"; +/** + * This comment block exists to prevent IDEs from automatically removing unused imports + * {@linkcode BerryType}, {@linkcode EvolutionItem}, {@linkcode FormChangeItem} + * {@linkcode Stat}, {@linkcode PokemonType} + */ /** * Overrides that are using when testing different in game situations * From 74553608244d626cd92c11a8d6ea86a3f14a08a6 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 8 Mar 2025 21:31:36 -0600 Subject: [PATCH 158/171] [Misc] Add Wlowscha and SirzBenjie to credits (#5498) --- CREDITS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.md b/CREDITS.md index 099d410417e..6d884c8fd60 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -364,11 +364,13 @@ In addition to the lists below, please check [the PokéRogue wiki](https://wiki. - Opaquer - OrangeRed - Sam aka Flashfyre (initial developer, started PokéRogue) +- SirzBenjie - sirzento - SN34KZ - Swain aka torranx - Temp aka Tempo-anon - Walker +- Wlowscha (aka Curbio) - Xavion ## Bug/Issue Managers From 408b66f9135004e128d7d737904facc30529c771 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:13:25 -0500 Subject: [PATCH 159/171] [Misc][Refactor][GitHub] Ditch eslint for biome, and add a formatter (#5495) Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- .dependency-cruiser.cjs | 210 +- .github/workflows/{eslint.yml => quality.yml} | 9 +- README.md | 13 +- biome.jsonc | 106 + create-test-boilerplate.js | 9 +- dependency-graph.js | 2 +- eslint.config.js | 109 +- index.css | 190 +- lefthook.yml | 8 +- package-lock.json | 14189 ++++++++-------- package.json | 135 +- src/account.ts | 29 +- src/battle-scene.ts | 1335 +- src/battle.ts | 539 +- src/configs/inputs/cfg_keyboard_qwerty.ts | 9 +- src/configs/inputs/configHandler.ts | 9 +- src/configs/inputs/pad_dualshock.ts | 8 +- src/configs/inputs/pad_generic.ts | 15 +- src/configs/inputs/pad_procon.ts | 6 +- src/configs/inputs/pad_unlicensedSNES.ts | 10 +- src/configs/inputs/pad_xbox360.ts | 8 +- src/data/ability.ts | 102 +- src/data/arena-tag.ts | 523 +- src/data/balance/biomes.ts | 10 +- src/data/balance/egg-moves.ts | 4 +- src/data/balance/pokemon-evolutions.ts | 6 +- src/data/battle-anims.ts | 1489 +- src/data/battler-tags.ts | 1027 +- src/data/berry.ts | 44 +- src/data/challenge.ts | 459 +- src/data/daily-run.ts | 77 +- src/data/dialogue.ts | 3053 +--- src/data/egg-hatch-data.ts | 44 +- src/data/egg.ts | 166 +- src/data/exp.ts | 72 +- src/data/gender.ts | 6 +- .../encounters/a-trainers-test-encounter.ts | 320 +- .../encounters/absolute-avarice-encounter.ts | 724 +- .../an-offer-you-cant-refuse-encounter.ts | 286 +- .../encounters/berries-abound-encounter.ts | 457 +- .../encounters/bug-type-superfan-encounter.ts | 622 +- .../encounters/clowning-around-encounter.ts | 712 +- .../encounters/dancing-lessons-encounter.ts | 477 +- .../encounters/dark-deal-encounter.ts | 254 +- .../encounters/delibirdy-encounter.ts | 569 +- .../department-store-sale-encounter.ts | 285 +- .../encounters/field-trip-encounter.ts | 352 +- .../encounters/fiery-fallout-encounter.ts | 424 +- .../encounters/fight-or-flight-encounter.ts | 287 +- .../encounters/fun-and-games-encounter.ts | 237 +- .../global-trade-system-encounter.ts | 874 +- .../encounters/lost-at-sea-encounter.ts | 18 +- .../mysterious-challengers-encounter.ts | 374 +- .../encounters/mysterious-chest-encounter.ts | 354 +- .../encounters/part-timer-encounter.ts | 278 +- .../encounters/safari-zone-encounter.ts | 255 +- .../shady-vitamin-dealer-encounter.ts | 405 +- .../slumbering-snorlax-encounter.ts | 280 +- .../teleporting-hijinks-encounter.ts | 297 +- .../the-expert-pokemon-breeder-encounter.ts | 780 +- .../the-pokemon-salesman-encounter.ts | 262 +- .../encounters/the-strong-stuff-encounter.ts | 356 +- .../the-winstrate-challenge-encounter.ts | 403 +- .../encounters/training-session-encounter.ts | 625 +- .../encounters/trash-to-treasure-encounter.ts | 307 +- .../encounters/uncommon-breed-encounter.ts | 406 +- .../encounters/weird-dream-encounter.ts | 591 +- .../mystery-encounter-dialogue.ts | 1 - .../mystery-encounter-option.ts | 108 +- .../mystery-encounter-requirements.ts | 600 +- .../mystery-encounters/mystery-encounter.ts | 253 +- .../mystery-encounters/mystery-encounters.ts | 126 +- .../can-learn-move-requirement.ts | 25 +- .../requirements/requirement-groups.ts | 21 +- .../utils/encounter-dialogue-utils.ts | 15 +- .../utils/encounter-phase-utils.ts | 498 +- .../utils/encounter-pokemon-utils.ts | 399 +- .../encounter-transformation-sequence.ts | 134 +- src/data/nature.ts | 16 +- src/data/pokeball.ts | 41 +- src/data/pokemon-forms.ts | 150 +- src/data/pokemon-species.ts | 560 +- src/data/splash-messages.ts | 26 +- src/data/status-effect.ts | 48 +- src/data/terrain.ts | 20 +- src/data/trainer-config.ts | 6591 +++++-- src/data/trainer-names.ts | 2730 ++- src/data/type.ts | 50 +- src/data/weather.ts | 74 +- src/debug.js | 4 +- src/enums/stat.ts | 6 +- src/events/arena.ts | 16 +- src/events/battle-scene.ts | 16 +- src/events/egg.ts | 4 +- src/field/anims.ts | 51 +- src/field/arena.ts | 326 +- src/field/damage-number-handler.ts | 62 +- src/field/mystery-encounter-intro.ts | 66 +- src/field/pokemon-sprite-sparkle-handler.ts | 24 +- src/field/pokemon.ts | 4338 +++-- src/field/trainer.ts | 364 +- src/game-mode.ts | 120 +- src/inputs-controller.ts | 388 +- src/interfaces/locales.ts | 108 +- src/loading-scene.ts | 46 +- src/main.ts | 68 +- src/messages.ts | 12 +- src/modifier/modifier-tier.ts | 2 +- src/modifier/modifier-type.ts | 2444 ++- src/modifier/modifier.ts | 788 +- src/phases/add-enemy-buff-modifier-phase.ts | 21 +- src/phases/attempt-capture-phase.ts | 211 +- src/phases/attempt-run-phase.ts | 28 +- src/phases/battle-end-phase.ts | 11 +- src/phases/battle-phase.ts | 6 +- src/phases/berry-phase.ts | 14 +- src/phases/check-status-effect-phase.ts | 6 +- src/phases/check-switch-phase.ts | 45 +- src/phases/command-phase.ts | 296 +- src/phases/common-anim-phase.ts | 7 +- src/phases/damage-anim-phase.ts | 18 +- src/phases/egg-hatch-phase.ts | 99 +- src/phases/egg-lapse-phase.ts | 65 +- src/phases/egg-summary-phase.ts | 2 - src/phases/encounter-phase.ts | 287 +- src/phases/end-card-phase.ts | 34 +- src/phases/end-evolution-phase.ts | 5 - src/phases/enemy-command-phase.ts | 46 +- src/phases/evolution-phase.ts | 307 +- src/phases/exp-phase.ts | 27 +- src/phases/faint-phase.ts | 90 +- src/phases/field-phase.ts | 4 +- src/phases/form-change-phase.ts | 41 +- src/phases/game-over-modifier-reward-phase.ts | 8 +- src/phases/game-over-phase.ts | 128 +- src/phases/hide-party-exp-bar-phase.ts | 4 - src/phases/learn-move-phase.ts | 111 +- src/phases/level-cap-phase.ts | 14 +- src/phases/level-up-phase.ts | 23 +- src/phases/load-move-anim-phase.ts | 2 +- src/phases/login-phase.ts | 41 +- src/phases/message-phase.ts | 36 +- src/phases/modifier-reward-phase.ts | 10 +- src/phases/money-reward-phase.ts | 4 +- src/phases/move-anim-phase.ts | 2 +- src/phases/move-anim-test-phase.ts | 28 +- src/phases/move-charge-phase.ts | 16 +- src/phases/move-effect-phase.ts | 258 +- src/phases/move-end-phase.ts | 4 - src/phases/move-phase.ts | 140 +- src/phases/mystery-encounter-phases.ts | 121 +- src/phases/new-biome-encounter-phase.ts | 4 +- src/phases/next-encounter-phase.ts | 15 +- src/phases/obtain-status-effect-phase.ts | 20 +- src/phases/party-heal-phase.ts | 2 +- src/phases/party-member-pokemon-phase.ts | 4 +- src/phases/pokemon-anim-phase.ts | 77 +- src/phases/pokemon-heal-phase.ts | 23 +- src/phases/pokemon-phase.ts | 5 +- src/phases/pokemon-transform-phase.ts | 13 +- src/phases/post-game-over-phase.ts | 18 +- src/phases/post-summon-phase.ts | 13 +- src/phases/post-turn-status-effect-phase.ts | 14 +- src/phases/quiet-form-change-phase.ts | 55 +- src/phases/reload-session-phase.ts | 16 +- src/phases/return-phase.ts | 2 +- src/phases/revival-blessing-phase.ts | 10 +- src/phases/ribbon-modifier-reward-phase.ts | 21 +- src/phases/scan-ivs-phase.ts | 43 +- src/phases/select-biome-phase.ts | 26 +- src/phases/select-gender-phase.ts | 8 +- src/phases/select-modifier-phase.ts | 292 +- src/phases/select-starter-phase.ts | 24 +- src/phases/select-target-phase.ts | 8 +- src/phases/show-ability-phase.ts | 3 +- src/phases/show-party-exp-bar-phase.ts | 12 +- src/phases/show-trainer-phase.ts | 2 +- src/phases/stat-stage-change-phase.ts | 178 +- src/phases/summon-missing-phase.ts | 6 +- src/phases/summon-phase.ts | 77 +- src/phases/switch-biome-phase.ts | 10 +- src/phases/switch-phase.ts | 53 +- src/phases/switch-summon-phase.ts | 121 +- src/phases/tera-phase.ts | 8 +- src/phases/title-phase.ts | 273 +- src/phases/toggle-double-position-phase.ts | 21 +- src/phases/trainer-message-test-phase.ts | 22 +- src/phases/trainer-victory-phase.ts | 97 +- src/phases/turn-end-phase.ts | 20 +- src/phases/turn-init-phase.ts | 12 +- src/phases/turn-start-phase.ts | 89 +- src/phases/unlock-phase.ts | 17 +- src/phases/victory-phase.ts | 39 +- src/phases/weather-effect-phase.ts | 32 +- src/pipelines/field-sprite.ts | 38 +- src/pipelines/invert.ts | 6 +- src/pipelines/sprite.ts | 139 +- src/plugins/api/api-base.ts | 4 +- src/plugins/api/pokerogue-account-api.ts | 17 +- src/plugins/api/pokerogue-admin-api.ts | 49 +- src/plugins/api/pokerogue-api.ts | 6 +- src/plugins/api/pokerogue-savedata-api.ts | 2 +- .../api/pokerogue-session-savedata-api.ts | 3 +- src/plugins/cache-busted-loader-plugin.ts | 2 +- src/plugins/i18n.ts | 71 +- src/plugins/vite/vite-minify-json-plugin.ts | 8 +- src/scene-base.ts | 29 +- src/system/achv.ts | 757 +- src/system/arena-data.ts | 14 +- src/system/egg-data.ts | 28 +- src/system/game-data.ts | 831 +- src/system/game-speed.ts | 36 +- src/system/modifier-data.ts | 14 +- src/system/pokemon-data.ts | 65 +- src/system/session-history.ts | 4 +- src/system/settings/settings-gamepad.ts | 105 +- src/system/settings/settings-keyboard.ts | 142 +- src/system/settings/settings.ts | 345 +- src/system/trainer-data.ts | 8 +- src/system/unlockables.ts | 2 +- .../version_migration/version_converter.ts | 17 +- .../version_migration/versions/v1_0_4.ts | 82 +- .../version_migration/versions/v1_7_0.ts | 17 +- src/system/voucher.ts | 40 +- src/timed-event-manager.ts | 257 +- src/touch-controls.ts | 33 +- src/tutorial.ts | 74 +- src/ui-inputs.ts | 140 +- src/ui/ability-bar.ts | 15 +- src/ui/abstact-option-select-ui-handler.ts | 72 +- src/ui/achv-bar.ts | 47 +- src/ui/achvs-ui-handler.ts | 71 +- src/ui/admin-ui-handler.ts | 210 +- src/ui/arena-flyout.ts | 124 +- src/ui/autocomplete-ui-handler.ts | 11 +- src/ui/awaitable-ui-handler.ts | 11 +- src/ui/ball-ui-handler.ts | 17 +- src/ui/base-stats-overlay.ts | 25 +- src/ui/battle-flyout.ts | 60 +- src/ui/battle-info.ts | 221 +- src/ui/battle-message-ui-handler.ts | 61 +- src/ui/bgm-bar.ts | 23 +- src/ui/candy-bar.ts | 19 +- src/ui/challenges-select-ui-handler.ts | 118 +- src/ui/char-sprite.ts | 14 +- src/ui/command-ui-handler.ts | 50 +- src/ui/confirm-ui-handler.ts | 57 +- src/ui/daily-run-scoreboard.ts | 125 +- src/ui/dropdown.ts | 174 +- src/ui/egg-gacha-ui-handler.ts | 177 +- src/ui/egg-hatch-scene-handler.ts | 4 +- src/ui/egg-list-ui-handler.ts | 16 +- src/ui/egg-summary-ui-handler.ts | 40 +- src/ui/evolution-scene-handler.ts | 4 +- src/ui/fight-ui-handler.ts | 41 +- src/ui/filter-bar.ts | 39 +- src/ui/filter-text.ts | 44 +- src/ui/form-modal-ui-handler.ts | 33 +- src/ui/game-stats-ui-handler.ts | 109 +- src/ui/hatched-pokemon-container.ts | 4 +- src/ui/loading-modal-ui-handler.ts | 4 +- src/ui/login-form-ui-handler.ts | 58 +- src/ui/menu-ui-handler.ts | 385 +- src/ui/message-ui-handler.ts | 42 +- src/ui/modal-ui-handler.ts | 39 +- src/ui/modifier-select-ui-handler.ts | 230 +- src/ui/move-info-overlay.ts | 86 +- src/ui/mystery-encounter-ui-handler.ts | 185 +- src/ui/party-exp-bar.ts | 16 +- src/ui/party-ui-handler.ts | 675 +- src/ui/pokeball-tray.ts | 36 +- src/ui/pokedex-info-overlay.ts | 57 +- src/ui/pokedex-mon-container.ts | 27 +- src/ui/pokedex-page-ui-handler.ts | 918 +- src/ui/pokedex-scan-ui-handler.ts | 39 +- src/ui/pokedex-ui-handler.ts | 653 +- src/ui/pokemon-hatch-info-container.ts | 22 +- src/ui/pokemon-icon-anim-handler.ts | 12 +- src/ui/pokemon-info-container.ts | 139 +- src/ui/registration-form-ui-handler.ts | 55 +- src/ui/rename-form-ui-handler.ts | 14 +- src/ui/run-history-ui-handler.ts | 82 +- src/ui/run-info-ui-handler.ts | 390 +- src/ui/save-slot-select-ui-handler.ts | 120 +- src/ui/saving-icon-handler.ts | 4 +- src/ui/scroll-bar.ts | 19 +- src/ui/scrollable-grid-handler.ts | 9 +- src/ui/session-reload-modal-ui-handler.ts | 18 +- .../settings/abstract-binding-ui-handler.ts | 117 +- .../abstract-control-settings-ui-handler.ts | 117 +- .../settings/abstract-settings-ui-handler.ts | 122 +- src/ui/settings/gamepad-binding-ui-handler.ts | 23 +- .../settings/keyboard-binding-ui-handler.ts | 3 - .../settings/move-touch-controls-handler.ts | 77 +- src/ui/settings/navigationMenu.ts | 17 +- src/ui/settings/settings-audio-ui-handler.ts | 2 +- .../settings/settings-display-ui-handler.ts | 2 +- .../settings/settings-gamepad-ui-handler.ts | 55 +- .../settings/settings-keyboard-ui-handler.ts | 78 +- src/ui/settings/shiny_icons.json | 78 +- src/ui/starter-container.ts | 16 +- src/ui/starter-select-ui-handler.ts | 1747 +- src/ui/stats-container.ts | 89 +- src/ui/summary-ui-handler.ts | 293 +- src/ui/target-select-ui-handler.ts | 36 +- src/ui/test-dialogue-ui-handler.ts | 67 +- src/ui/text.ts | 106 +- src/ui/time-of-day-widget.ts | 69 +- src/ui/title-ui-handler.ts | 38 +- src/ui/ui-handler.ts | 6 +- src/ui/ui-theme.ts | 125 +- src/ui/ui.ts | 101 +- src/ui/unavailable-modal-ui-handler.ts | 28 +- src/utils.test.ts | 1 - src/utils.ts | 142 +- test/abilities/ability_duplication.test.ts | 10 +- test/abilities/ability_timing.test.ts | 16 +- test/abilities/analytic.test.ts | 18 +- test/abilities/arena_trap.test.ts | 14 +- test/abilities/aroma_veil.test.ts | 8 +- test/abilities/aura_break.test.ts | 10 +- test/abilities/battery.test.ts | 8 +- test/abilities/battle_bond.test.ts | 12 +- test/abilities/beast_boost.test.ts | 24 +- test/abilities/commander.test.ts | 50 +- test/abilities/competitive.test.ts | 11 +- test/abilities/contrary.test.ts | 18 +- test/abilities/corrosion.test.ts | 4 +- test/abilities/costar.test.ts | 74 +- test/abilities/dancer.test.ts | 28 +- test/abilities/defiant.test.ts | 11 +- test/abilities/desolate-land.test.ts | 27 +- test/abilities/disguise.test.ts | 29 +- test/abilities/dry_skin.test.ts | 8 +- test/abilities/early_bird.test.ts | 8 +- test/abilities/flash_fire.test.ts | 33 +- test/abilities/flower_gift.test.ts | 24 +- test/abilities/forecast.test.ts | 202 +- test/abilities/friend_guard.test.ts | 20 +- test/abilities/galvanize.test.ts | 7 +- test/abilities/good_as_gold.test.ts | 38 +- test/abilities/gorilla_tactics.test.ts | 12 +- test/abilities/gulp_missile.test.ts | 58 +- test/abilities/heatproof.test.ts | 10 +- test/abilities/honey_gather.test.ts | 8 +- test/abilities/hustle.test.ts | 10 +- test/abilities/hyper_cutter.test.ts | 8 +- test/abilities/ice_face.test.ts | 50 +- test/abilities/illuminate.test.ts | 6 +- test/abilities/imposter.test.ts | 12 +- test/abilities/infiltrator.test.ts | 28 +- test/abilities/intimidate.test.ts | 24 +- test/abilities/intrepid_sword.test.ts | 7 +- test/abilities/libero.test.ts | 392 +- test/abilities/magic_bounce.test.ts | 159 +- test/abilities/magic_guard.test.ts | 377 +- test/abilities/mimicry.test.ts | 17 +- test/abilities/mirror_armor.test.ts | 52 +- test/abilities/moody.test.ts | 75 +- test/abilities/moxie.test.ts | 40 +- test/abilities/mummy.test.ts | 6 +- test/abilities/mycelium_might.test.ts | 24 +- test/abilities/neutralizing_gas.test.ts | 45 +- test/abilities/no_guard.test.ts | 12 +- test/abilities/parental_bond.test.ts | 523 +- test/abilities/pastel_veil.test.ts | 6 +- test/abilities/perish_body.test.ts | 22 +- test/abilities/power_construct.test.ts | 95 +- test/abilities/power_spot.test.ts | 8 +- test/abilities/protean.test.ts | 392 +- test/abilities/protosynthesis.test.ts | 13 +- test/abilities/quick_draw.test.ts | 41 +- test/abilities/sand_spit.test.ts | 13 +- test/abilities/sand_veil.test.ts | 58 +- test/abilities/sap_sipper.test.ts | 21 +- test/abilities/schooling.test.ts | 50 +- test/abilities/screen_cleaner.test.ts | 14 +- test/abilities/seed_sower.test.ts | 13 +- test/abilities/serene_grace.test.ts | 8 +- test/abilities/sheer_force.test.ts | 41 +- test/abilities/shield_dust.test.ts | 35 +- test/abilities/shields_down.test.ts | 220 +- test/abilities/simple.test.ts | 6 +- test/abilities/speed_boost.test.ts | 134 +- test/abilities/stakeout.test.ts | 18 +- test/abilities/stall.test.ts | 22 +- test/abilities/steely_spirit.test.ts | 18 +- test/abilities/sturdy.test.ts | 78 +- test/abilities/supreme_overlord.test.ts | 68 +- test/abilities/sweet_veil.test.ts | 14 +- test/abilities/synchronize.test.ts | 10 +- test/abilities/tera_shell.test.ts | 165 +- test/abilities/trace.test.ts | 6 +- test/abilities/unburden.test.ts | 87 +- test/abilities/unseen_fist.test.ts | 74 +- test/abilities/volt_absorb.test.ts | 8 +- test/abilities/wandering_spirit.test.ts | 8 +- test/abilities/wimp_out.test.ts | 307 +- test/abilities/wind_power.test.ts | 10 +- test/abilities/wind_rider.test.ts | 24 +- test/abilities/wonder_skin.test.ts | 10 +- test/abilities/zen_mode.test.ts | 13 +- test/abilities/zero_to_hero.test.ts | 9 +- test/account.test.ts | 12 +- test/achievements/achievement.test.ts | 52 +- test/arena/arena_gravity.test.ts | 27 +- test/arena/grassy_terrain.test.ts | 6 +- test/arena/weather_fog.test.ts | 10 +- test/arena/weather_hail.test.ts | 12 +- test/arena/weather_sandstorm.test.ts | 10 +- test/arena/weather_strong_winds.test.ts | 12 +- test/battle/ability_swap.test.ts | 8 +- test/battle/battle-order.test.ts | 51 +- test/battle/battle.test.ts | 115 +- test/battle/damage_calculation.test.ts | 44 +- test/battle/double_battle.test.ts | 11 +- test/battle/inverse_battle.test.ts | 97 +- test/battle/special_battle.test.ts | 105 +- test/battlerTags/octolock.test.ts | 4 +- test/battlerTags/stockpiling.test.ts | 29 +- test/battlerTags/substitute.test.ts | 243 +- test/boss-pokemon.test.ts | 34 +- test/daily_mode.test.ts | 18 +- test/data/splash_messages.test.ts | 6 +- test/data/status_effect.test.ts | 12 +- test/eggs/egg.test.ts | 166 +- test/eggs/manaphy-egg.test.ts | 31 +- test/endless_boss.test.ts | 16 +- test/enemy_command.test.ts | 90 +- test/escape-calculations.test.ts | 109 +- test/evolution.test.ts | 26 +- test/field/pokemon.test.ts | 34 +- test/final_boss.test.ts | 15 +- test/game-mode.test.ts | 4 +- test/imports.test.ts | 1 - test/inputs/inputs.test.ts | 16 +- test/internals.test.ts | 4 +- test/items/dire_hit.test.ts | 33 +- .../double_battle_chance_booster.test.ts | 45 +- test/items/eviolite.test.ts | 45 +- test/items/exp_booster.test.ts | 2 +- test/items/grip_claw.test.ts | 16 +- test/items/leek.test.ts | 39 +- test/items/leftovers.test.ts | 7 +- test/items/light_ball.test.ts | 82 +- test/items/lock_capsule.test.ts | 9 +- test/items/metal_powder.test.ts | 82 +- test/items/multi_lens.test.ts | 62 +- test/items/quick_powder.test.ts | 82 +- test/items/scope_lens.test.ts | 7 +- test/items/temp_stat_stage_booster.test.ts | 71 +- test/items/thick_club.test.ts | 108 +- test/items/toxic_orb.test.ts | 10 +- test/misc.test.ts | 22 +- test/moves/after_you.test.ts | 7 +- test/moves/alluring_voice.test.ts | 8 +- test/moves/aromatherapy.test.ts | 14 +- test/moves/assist.test.ts | 34 +- test/moves/astonish.test.ts | 38 +- test/moves/aurora_veil.test.ts | 65 +- test/moves/autotomize.test.ts | 121 +- test/moves/baddy_bad.test.ts | 4 +- test/moves/baneful_bunker.test.ts | 80 +- test/moves/baton_pass.test.ts | 34 +- test/moves/beak_blast.test.ts | 124 +- test/moves/beat_up.test.ts | 68 +- test/moves/belly_drum.test.ts | 93 +- test/moves/burning_jealousy.test.ts | 29 +- test/moves/camouflage.test.ts | 6 +- test/moves/ceaseless_edge.test.ts | 115 +- test/moves/chilly_reception.test.ts | 28 +- test/moves/chloroblast.test.ts | 4 +- test/moves/clangorous_soul.test.ts | 135 +- test/moves/copycat.test.ts | 10 +- test/moves/crafty_shield.test.ts | 97 +- test/moves/defog.test.ts | 10 +- test/moves/destiny_bond.test.ts | 38 +- test/moves/diamond_storm.test.ts | 4 +- test/moves/dig.test.ts | 14 +- test/moves/disable.test.ts | 48 +- test/moves/dive.test.ts | 18 +- test/moves/doodle.test.ts | 11 +- test/moves/double_team.test.ts | 8 +- test/moves/dragon_cheer.test.ts | 20 +- test/moves/dragon_rage.test.ts | 8 +- test/moves/dragon_tail.test.ts | 81 +- test/moves/dynamax_cannon.test.ts | 38 +- test/moves/effectiveness.test.ts | 90 +- test/moves/electrify.test.ts | 8 +- test/moves/electro_shot.test.ts | 12 +- test/moves/encore.test.ts | 22 +- test/moves/endure.test.ts | 8 +- test/moves/entrainment.test.ts | 6 +- test/moves/fairy_lock.test.ts | 16 +- test/moves/fake_out.test.ts | 14 +- test/moves/fell_stinger.test.ts | 53 +- test/moves/fillet_away.test.ts | 111 +- test/moves/fissure.test.ts | 2 +- test/moves/flame_burst.test.ts | 32 +- test/moves/flower_shield.test.ts | 14 +- test/moves/fly.test.ts | 16 +- test/moves/focus_punch.test.ts | 121 +- test/moves/follow_me.test.ts | 123 +- test/moves/foresight.test.ts | 4 +- test/moves/forests_curse.test.ts | 4 +- test/moves/freeze_dry.test.ts | 86 +- test/moves/freezy_frost.test.ts | 104 +- test/moves/fusion_bolt.test.ts | 8 +- test/moves/fusion_flare.test.ts | 8 +- test/moves/fusion_flare_bolt.test.ts | 95 +- test/moves/future_sight.test.ts | 4 +- test/moves/gastro_acid.test.ts | 5 +- test/moves/geomancy.test.ts | 18 +- test/moves/gigaton_hammer.test.ts | 10 +- test/moves/glaive_rush.test.ts | 30 +- test/moves/growth.test.ts | 8 +- test/moves/grudge.test.ts | 20 +- test/moves/guard_split.test.ts | 12 +- test/moves/guard_swap.test.ts | 6 +- test/moves/hard_press.test.ts | 16 +- test/moves/haze.test.ts | 4 +- test/moves/heal_bell.test.ts | 14 +- test/moves/heal_block.test.ts | 39 +- test/moves/heart_swap.test.ts | 6 +- test/moves/hyper_beam.test.ts | 43 +- test/moves/imprison.test.ts | 17 +- test/moves/instruct.test.ts | 268 +- test/moves/jaw_lock.test.ts | 162 +- test/moves/lash_out.test.ts | 8 +- test/moves/last_respects.test.ts | 76 +- test/moves/light_screen.test.ts | 47 +- test/moves/lucky_chant.test.ts | 94 +- test/moves/lunar_blessing.test.ts | 11 +- test/moves/lunar_dance.test.ts | 10 +- test/moves/magic_coat.test.ts | 115 +- test/moves/magnet_rise.test.ts | 4 +- test/moves/make_it_rain.test.ts | 11 +- test/moves/mat_block.test.ts | 82 +- test/moves/metal_burst.test.ts | 14 +- test/moves/metronome.test.ts | 8 +- test/moves/miracle_eye.test.ts | 4 +- test/moves/mirror_move.test.ts | 22 +- test/moves/mist.test.ts | 4 +- test/moves/moongeist_beam.test.ts | 10 +- test/moves/multi_target.test.ts | 21 +- test/moves/nightmare.test.ts | 7 +- test/moves/obstruct.test.ts | 5 +- test/moves/octolock.test.ts | 16 +- test/moves/order_up.test.ts | 37 +- test/moves/parting_shot.test.ts | 104 +- test/moves/plasma_fists.test.ts | 23 +- test/moves/pledge_moves.test.ts | 424 +- test/moves/powder.test.ts | 405 +- test/moves/power_shift.test.ts | 4 +- test/moves/power_split.test.ts | 12 +- test/moves/power_swap.test.ts | 6 +- test/moves/power_trick.test.ts | 14 +- test/moves/protect.test.ts | 112 +- test/moves/psycho_shift.test.ts | 4 +- test/moves/purify.test.ts | 56 +- test/moves/quash.test.ts | 18 +- test/moves/quick_guard.test.ts | 99 +- test/moves/rage_fist.test.ts | 56 +- test/moves/rage_powder.test.ts | 65 +- test/moves/reflect.test.ts | 55 +- test/moves/reflect_type.test.ts | 12 +- test/moves/relic_song.test.ts | 12 +- test/moves/retaliate.test.ts | 6 +- test/moves/revival_blessing.test.ts | 20 +- test/moves/role_play.test.ts | 6 +- test/moves/rollout.test.ts | 8 +- test/moves/roost.test.ts | 354 +- test/moves/round.test.ts | 17 +- test/moves/safeguard.test.ts | 33 +- test/moves/scale_shot.test.ts | 8 +- test/moves/secret_power.test.ts | 58 +- test/moves/shed_tail.test.ts | 6 +- test/moves/shell_side_arm.test.ts | 14 +- test/moves/shell_trap.test.ts | 160 +- test/moves/simple_beam.test.ts | 4 +- test/moves/sketch.test.ts | 20 +- test/moves/skill_swap.test.ts | 6 +- test/moves/sleep_talk.test.ts | 14 +- test/moves/solar_beam.test.ts | 10 +- test/moves/sparkly_swirl.test.ts | 18 +- test/moves/spectral_thief.test.ts | 36 +- test/moves/speed_swap.test.ts | 6 +- test/moves/spikes.test.ts | 10 +- test/moves/spit_up.test.ts | 30 +- test/moves/spotlight.test.ts | 55 +- test/moves/steamroller.test.ts | 10 +- test/moves/stockpile.test.ts | 19 +- test/moves/substitute.test.ts | 667 +- test/moves/swallow.test.ts | 32 +- test/moves/syrup_bomb.test.ts | 88 +- test/moves/tackle.test.ts | 14 +- test/moves/tail_whip.test.ts | 10 +- test/moves/tailwind.test.ts | 9 +- test/moves/tar_shot.test.ts | 18 +- test/moves/taunt.test.ts | 6 +- test/moves/telekinesis.test.ts | 25 +- test/moves/tera_blast.test.ts | 381 +- test/moves/tera_starstorm.test.ts | 10 +- test/moves/thousand_arrows.test.ts | 84 +- test/moves/throat_chop.test.ts | 6 +- test/moves/thunder_wave.test.ts | 3 +- test/moves/tidy_up.test.ts | 26 +- test/moves/torment.test.ts | 6 +- test/moves/toxic.test.ts | 22 +- test/moves/toxic_spikes.test.ts | 22 +- test/moves/transform.test.ts | 17 +- test/moves/trick_or_treat.test.ts | 4 +- test/moves/triple_arrows.test.ts | 6 +- test/moves/u_turn.test.ts | 17 +- test/moves/upper_hand.test.ts | 20 +- test/moves/whirlwind.test.ts | 34 +- test/moves/wide_guard.test.ts | 99 +- test/moves/will_o_wisp.test.ts | 6 +- .../mystery-encounter/encounter-test-utils.ts | 107 +- .../a-trainers-test-encounter.test.ts | 26 +- .../absolute-avarice-encounter.test.ts | 49 +- ...an-offer-you-cant-refuse-encounter.test.ts | 41 +- .../berries-abound-encounter.test.ts | 26 +- .../bug-type-superfan-encounter.test.ts | 104 +- .../clowning-around-encounter.test.ts | 54 +- .../dancing-lessons-encounter.test.ts | 26 +- .../encounters/delibirdy-encounter.test.ts | 29 +- .../department-store-sale-encounter.test.ts | 40 +- .../encounters/field-trip-encounter.test.ts | 106 +- .../fiery-fallout-encounter.test.ts | 65 +- .../fight-or-flight-encounter.test.ts | 26 +- .../fun-and-games-encounter.test.ts | 41 +- .../global-trade-system-encounter.test.ts | 14 +- .../encounters/lost-at-sea-encounter.test.ts | 37 +- .../mysterious-challengers-encounter.test.ts | 91 +- .../encounters/part-timer-encounter.test.ts | 39 +- .../encounters/safari-zone.test.ts | 24 +- .../teleporting-hijinks-encounter.test.ts | 52 +- .../the-expert-breeder-encounter.test.ts | 70 +- .../the-pokemon-salesman-encounter.test.ts | 18 +- .../the-strong-stuff-encounter.test.ts | 52 +- .../the-winstrate-challenge-encounter.test.ts | 98 +- .../trash-to-treasure-encounter.test.ts | 48 +- .../uncommon-breed-encounter.test.ts | 30 +- .../encounters/weird-dream-encounter.test.ts | 55 +- .../mystery-encounter-utils.test.ts | 49 +- .../mystery-encounter.test.ts | 6 +- test/phases/form-change-phase.test.ts | 14 +- test/phases/frenzy-move-reset.test.ts | 28 +- test/phases/game-over-phase.test.ts | 6 +- test/phases/learn-move-phase.test.ts | 65 +- test/phases/mystery-encounter-phase.test.ts | 113 +- test/phases/select-modifier-phase.test.ts | 129 +- .../plugins/api/pokerogue-account-api.test.ts | 14 +- test/plugins/api/pokerogue-admin-api.test.ts | 28 +- .../pokerogue-session-savedata-api.test.ts | 12 +- .../api/pokerogue-system-savedata-api.test.ts | 8 +- test/reload.test.ts | 11 +- test/settingMenu/helpers/inGameManip.ts | 4 +- test/settingMenu/helpers/menuManip.ts | 8 +- test/settingMenu/rebinding_setting.test.ts | 267 +- test/sprites/pokemonSprite.test.ts | 29 +- test/sprites/spritesUtils.ts | 6 +- test/system/game_data.test.ts | 24 +- test/testUtils/TextInterceptor.ts | 18 +- test/testUtils/errorInterceptor.ts | 5 +- test/testUtils/gameManager.ts | 171 +- test/testUtils/gameManagerUtils.ts | 38 +- test/testUtils/gameWrapper.ts | 53 +- test/testUtils/helpers/challengeModeHelper.ts | 27 +- test/testUtils/helpers/classicModeHelper.ts | 27 +- test/testUtils/helpers/dailyModeHelper.ts | 27 +- test/testUtils/helpers/moveHelper.ts | 25 +- test/testUtils/helpers/overridesHelper.ts | 16 +- test/testUtils/helpers/reloadHelper.ts | 34 +- test/testUtils/helpers/settingsHelper.ts | 6 +- test/testUtils/inputsHandler.ts | 30 +- test/testUtils/mocks/mockClock.ts | 1 - test/testUtils/mocks/mockConsoleLog.ts | 44 +- test/testUtils/mocks/mockFetch.ts | 13 +- test/testUtils/mocks/mockLoader.ts | 22 +- test/testUtils/mocks/mockLocalStorage.ts | 4 +- test/testUtils/mocks/mockTextureManager.ts | 16 +- test/testUtils/mocks/mockVideoGameObject.ts | 2 - .../mocks/mocksContainer/mockContainer.ts | 53 +- .../mocks/mocksContainer/mockGraphics.ts | 28 +- .../mocks/mocksContainer/mockImage.ts | 1 - .../mocks/mocksContainer/mockNineslice.ts | 3 +- .../mocks/mocksContainer/mockPolygon.ts | 4 +- .../mocks/mocksContainer/mockRectangle.ts | 21 +- .../mocks/mocksContainer/mockSprite.ts | 16 +- .../mocks/mocksContainer/mockText.ts | 53 +- .../mocks/mocksContainer/mockTexture.ts | 5 +- test/testUtils/phaseInterceptor.ts | 172 +- test/ui/battle_info.test.ts | 11 +- test/ui/starter-select.test.ts | 73 +- test/ui/transfer-item.test.ts | 22 +- test/ui/type-hints.test.ts | 12 +- test/vitest.setup.ts | 8 +- tsconfig.json | 58 +- vite.config.ts | 70 +- 701 files changed, 55737 insertions(+), 38672 deletions(-) rename .github/workflows/{eslint.yml => quality.yml} (88%) create mode 100644 biome.jsonc diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index 8c6dff55c8c..b7de80a70de 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -2,92 +2,86 @@ module.exports = { forbidden: [ { - name: 'no-circular-at-runtime', - severity: 'warn', + name: "no-circular-at-runtime", + severity: "warn", comment: - 'This dependency is part of a circular relationship. You might want to revise ' + - 'your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ', + "This dependency is part of a circular relationship. You might want to revise " + + "your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ", from: {}, to: { circular: true, viaOnly: { - dependencyTypesNot: [ - 'type-only' - ] - } - } + dependencyTypesNot: ["type-only"], + }, + }, }, { - name: 'no-orphans', + name: "no-orphans", comment: "This is an orphan module - it's likely not used (anymore?). Either use it or " + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + "add an exception for it in your dependency-cruiser configuration. By default " + "this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " + "files (.d.ts), tsconfig.json and some of the babel and webpack configs.", - severity: 'warn', + severity: "warn", from: { orphan: true, pathNot: [ - '(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files - '[.]d[.]ts$', // TypeScript declaration files - '(^|/)tsconfig[.]json$', // TypeScript config - '(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs - ] + "(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$", // dot files + "[.]d[.]ts$", // TypeScript declaration files + "(^|/)tsconfig[.]json$", // TypeScript config + "(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$", // other configs + ], }, to: {}, }, { - name: 'no-deprecated-core', + name: "no-deprecated-core", comment: - 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + + "A module depends on a node core module that has been deprecated. Find an alternative - these are " + "bound to exist - node doesn't deprecate lightly.", - severity: 'warn', + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'core' - ], + dependencyTypes: ["core"], path: [ - '^v8/tools/codemap$', - '^v8/tools/consarray$', - '^v8/tools/csvparser$', - '^v8/tools/logreader$', - '^v8/tools/profile_view$', - '^v8/tools/profile$', - '^v8/tools/SourceMap$', - '^v8/tools/splaytree$', - '^v8/tools/tickprocessor-driver$', - '^v8/tools/tickprocessor$', - '^node-inspect/lib/_inspect$', - '^node-inspect/lib/internal/inspect_client$', - '^node-inspect/lib/internal/inspect_repl$', - '^async_hooks$', - '^punycode$', - '^domain$', - '^constants$', - '^sys$', - '^_linklist$', - '^_stream_wrap$' + "^v8/tools/codemap$", + "^v8/tools/consarray$", + "^v8/tools/csvparser$", + "^v8/tools/logreader$", + "^v8/tools/profile_view$", + "^v8/tools/profile$", + "^v8/tools/SourceMap$", + "^v8/tools/splaytree$", + "^v8/tools/tickprocessor-driver$", + "^v8/tools/tickprocessor$", + "^node-inspect/lib/_inspect$", + "^node-inspect/lib/internal/inspect_client$", + "^node-inspect/lib/internal/inspect_repl$", + "^async_hooks$", + "^punycode$", + "^domain$", + "^constants$", + "^sys$", + "^_linklist$", + "^_stream_wrap$", ], - } + }, }, { - name: 'not-to-deprecated', + name: "not-to-deprecated", comment: - 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + - 'version of that module, or find an alternative. Deprecated modules are a security risk.', - severity: 'warn', + "This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later " + + "version of that module, or find an alternative. Deprecated modules are a security risk.", + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'deprecated' - ] - } + dependencyTypes: ["deprecated"], + }, }, { - name: 'no-non-package-json', - severity: 'error', + name: "no-non-package-json", + severity: "error", comment: "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + @@ -95,87 +89,75 @@ module.exports = { "in your package.json.", from: {}, to: { - dependencyTypes: [ - 'npm-no-pkg', - 'npm-unknown' - ] - } + dependencyTypes: ["npm-no-pkg", "npm-unknown"], + }, }, { - name: 'not-to-unresolvable', + name: "not-to-unresolvable", comment: "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + - 'module: add it to your package.json. In all other cases you likely already know what to do.', - severity: 'error', + "module: add it to your package.json. In all other cases you likely already know what to do.", + severity: "error", from: {}, to: { - couldNotResolve: true - } + couldNotResolve: true, + }, }, { - name: 'no-duplicate-dep-types', + name: "no-duplicate-dep-types", comment: "Likely this module depends on an external ('npm') package that occurs more than once " + "in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " + "maintenance problems later on.", - severity: 'warn', + severity: "warn", from: {}, to: { moreThanOneDependencyType: true, - // as it's pretty common to have a type import be a type only import + // as it's pretty common to have a type import be a type only import // _and_ (e.g.) a devDependency - don't consider type-only dependency // types for this rule - dependencyTypesNot: ["type-only"] - } + dependencyTypesNot: ["type-only"], + }, }, /* rules you might want to tweak for your specific situation: */ { - name: 'not-to-spec', + name: "not-to-spec", comment: - 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + + "This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. " + "If there's something in a spec that's of use to other modules, it doesn't have that single " + - 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', - severity: 'error', + "responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.", + severity: "error", from: {}, to: { - path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$' - } + path: "[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$", + }, }, { - name: 'not-to-dev-dep', - severity: 'error', + name: "not-to-dev-dep", + severity: "error", comment: "This module depends on an npm package from the 'devDependencies' section of your " + - 'package.json. It looks like something that ships to production, though. To prevent problems ' + + "package.json. It looks like something that ships to production, though. To prevent problems " + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + - 'section of your package.json. If this module is development only - add it to the ' + - 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', + "section of your package.json. If this module is development only - add it to the " + + "from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration", from: { - path: '^(src)', - pathNot: [ - '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', - './test' - ] + path: "^(src)", + pathNot: ["[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$", "./test"], }, to: { - dependencyTypes: [ - 'npm-dev', - ], + dependencyTypes: ["npm-dev"], // type only dependencies are not a problem as they don't end up in the // production code or are ignored by the runtime. - dependencyTypesNot: [ - 'type-only' - ], - pathNot: [ - 'node_modules/@types/' - ] - } + dependencyTypesNot: ["type-only"], + pathNot: ["node_modules/@types/"], + }, }, { - name: 'optional-deps-used', - severity: 'info', + name: "optional-deps-used", + severity: "info", comment: "This module depends on an npm package that is declared as an optional dependency " + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + @@ -183,33 +165,28 @@ module.exports = { "dependency-cruiser configuration.", from: {}, to: { - dependencyTypes: [ - 'npm-optional' - ] - } + dependencyTypes: ["npm-optional"], + }, }, { - name: 'peer-deps-used', + name: "peer-deps-used", comment: "This module depends on an npm package that is declared as a peer dependency " + "in your package.json. This makes sense if your package is e.g. a plugin, but in " + "other cases - maybe not so much. If the use of a peer dependency is intentional " + "add an exception to your dependency-cruiser configuration.", - severity: 'warn', + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'npm-peer' - ] - } - } + dependencyTypes: ["npm-peer"], + }, + }, ], options: { - /* Which modules not to follow further when encountered */ doNotFollow: { /* path: an array of regular expressions in strings to match against */ - path: ['node_modules'] + path: ["node_modules"], }, /* Which modules to exclude */ @@ -271,7 +248,7 @@ module.exports = { defaults to './tsconfig.json'. */ tsConfig: { - fileName: 'tsconfig.json' + fileName: "tsconfig.json", }, /* Webpack configuration to use to get resolve options from. @@ -345,7 +322,7 @@ module.exports = { collapses everything in node_modules to one folder deep so you see the external modules, but their innards. */ - collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)', + collapsePattern: "node_modules/(?:@[^/]+/[^/]+|[^/]+)", /* Options to tweak the appearance of your graph.See https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions @@ -367,7 +344,8 @@ module.exports = { dependency graph reporter (`archi`) you probably want to tweak this collapsePattern to your situation. */ - collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)', + collapsePattern: + "^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)", /* Options to tweak the appearance of your graph. If you don't specify a theme for 'archi' dependency-cruiser will use the one specified in the @@ -375,10 +353,10 @@ module.exports = { */ // theme: { }, }, - "text": { - "highlightFocused": true + text: { + highlightFocused: true, }, - } - } + }, + }, }; // generated: dependency-cruiser@16.3.3 on 2024-06-13T23:26:36.169Z diff --git a/.github/workflows/eslint.yml b/.github/workflows/quality.yml similarity index 88% rename from .github/workflows/eslint.yml rename to .github/workflows/quality.yml index d863c96a643..7e33a77a73a 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/quality.yml @@ -1,4 +1,4 @@ -name: ESLint +name: Biome Code Quality on: # Trigger the workflow on push or pull request, @@ -28,10 +28,13 @@ jobs: - name: Set up Node.js # Step to set up Node.js environment uses: actions/setup-node@v4 # Use the setup-node action version 4 with: - node-version: 20 # Specify Node.js version 20 + node-version-file: '.nvmrc' - name: Install Node.js dependencies # Step to install Node.js dependencies run: npm ci # Use 'npm ci' to install dependencies - + - name: eslint # Step to run linters run: npm run eslint-ci + + - name: Lint with Biome # Step to run linters + run: npm run biome-ci \ No newline at end of file diff --git a/README.md b/README.md index 607a42e5125..5bb3ecfd26f 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,30 @@ PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! # Contributing + ## 🛠️ Development + If you have the motivation and experience with Typescript/Javascript (or are willing to learn) please feel free to fork the repository and make pull requests with contributions. If you don't know what to work on but want to help, reference the below **To-Do** section or the **#feature-vote** channel in the discord. ### 💻 Environment Setup + #### Prerequisites + - node: 20.13.1 - npm: [how to install](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) #### Running Locally + 1. Clone the repo and in the root directory run `npm install` - *if you run into any errors, reach out in the **#dev-corner** channel in discord* 2. Run `npm run start:dev` to locally run the project in `localhost:8000` #### Linting -We're using ESLint as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run eslint` script. To view the complete rules, check out the [eslint.config.js](./eslint.config.js) file. + +We're using Biome as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run biome` script. To view the complete rules, check out the [biome.jsonc](./biome.jsonc) file. ### 📚 Documentation + You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html). For information on enemy AI, check out the [enemy-ai.md](./docs/enemy-ai.md) file. For detailed guidelines on documenting your code, refer to the [comments.md](./docs/comments.md) file. @@ -27,16 +34,20 @@ For detailed guidelines on documenting your code, refer to the [comments.md](./d ### ❔ FAQ **How do I test a new _______?** + - In the `src/overrides.ts` file there are overrides for most values you'll need to change for testing **How do I retrieve the translations?** + - The translations were moved to the [dedicated translation repository](https://github.com/pagefaultgames/pokerogue-locales) and are now applied as a submodule in this project. - The command to retrieve the translations is `git submodule update --init --recursive`. If you still struggle to get it working, please reach out to #dev-corner channel in Discord. ## 🪧 To Do + Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us! # 📝 Credits +> > If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue). Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md). diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 00000000000..3ec4552d359 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,106 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": true, + "defaultBranch": "beta" + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "indentStyle": "space", + "ignore": ["src/enums/*", "src/data/balance/*"], + "lineWidth": 120 + }, + "files": { + "ignoreUnknown": true, + // Adding folders to the ignore list is GREAT for performance because it prevents biome from descending into them + // and having to verify whether each individual file is ignored + "ignore": [ + "**/*.d.ts", + "dist/*", + "build/*", + "coverage/*", + "public/*", + ".github/*", + "node_modules/*", + ".vscode/*", + "*.css", // TODO? + "*.html", // TODO? + "src/overrides.ts", + // TODO: these files are too big and complex, ignore them until their respective refactors + "src/data/moves/move.ts", + "src/data/ability.ts", + "src/field/pokemon.ts", + + // this file is just too big: + "src/data/balance/tms.ts" + ] + }, + "organizeImports": { "enabled": false }, + "linter": { + "ignore": [ + "src/phases/move-effect-phase.ts" // TODO: unignore after move-effect-phase refactor + ], + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUndeclaredVariables": "off", + "noUnusedVariables": "error", + "noSwitchDeclarations": "warn", // TODO: refactor and make this an error + "noVoidTypeReturn": "warn" // TODO: Refactor and make this an error + }, + "style": { + "noVar": "error", + "useEnumInitializers": "off", + "useBlockStatements": "error", + "useConst": "error", + "useImportType": "error", + "noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions + "noParameterAssign": "off", + "useExponentiationOperator": "off", + "useDefaultParameterLast": "off", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable + "useSingleVarDeclarator": "off", + "useNodejsImportProtocol": "off", + "useTemplate": "off" // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation + }, + "suspicious": { + "noDoubleEquals": "error", + "noExplicitAny": "off", + "noAssignInExpressions": "off", + "noPrototypeBuiltins": "off", + "noFallthroughSwitchClause": "off", + "noImplicitAnyLet": "info", // TODO: Refactor and make this an error + "noRedeclare": "off", // TODO: Refactor and make this an error + "noGlobalIsNan": "off", + "noAsyncPromiseExecutor": "warn" // TODO: Refactor and make this an error + }, + "complexity": { + "noExcessiveCognitiveComplexity": "warn", + "useLiteralKeys": "off", + "noForEach": "off", // Foreach vs for of is not that simple. + "noUselessSwitchCase": "off", // Explicit > Implicit + "noUselessConstructor": "warn", // TODO: Refactor and make this an error + "noBannedTypes": "warn" // TODO: Refactor and make this an error + } + } + }, + "javascript": { + "formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" } + }, + "overrides": [ + { + "include": ["test/**/*.test.ts"], + "javascript": { "globals": [] }, + "linter": { + "rules": { + "performance": { + "noDelete": "off" + } + } + } + } + ] +} diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 1ea61e0dc48..d47b7c4afeb 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -1,5 +1,5 @@ /** - * This script creates a test boilerplate file in the appropriate + * This script creates a test boilerplate file in the appropriate * directory based on the type selected. * @example npm run create-test */ @@ -31,7 +31,8 @@ async function promptTestType() { if (typeAnswer.selectedOption === "EXIT") { console.log("Exiting..."); return process.exit(); - } else if (!typeChoices.includes(typeAnswer.selectedOption)) { + } + if (!typeChoices.includes(typeAnswer.selectedOption)) { console.error(`Please provide a valid type (${typeChoices.join(", ")})!`); return await promptTestType(); } @@ -74,11 +75,11 @@ async function runInteractive() { const fileName = fileNameAnswer.userInput .replace(/-+/g, "_") // Convert kebab-case (dashes) to underscores .replace(/([a-z])([A-Z])/g, "$1_$2") // Convert camelCase to snake_case - .replace(/\s+/g, '_') // Replace spaces with underscores + .replace(/\s+/g, "_") // Replace spaces with underscores .toLowerCase(); // Ensure all lowercase // Format the description for the test case - const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); + const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, char => char.toUpperCase()); // Determine the directory based on the type let dir; let description; diff --git a/dependency-graph.js b/dependency-graph.js index 627aa3dcf13..dff960d8781 100644 --- a/dependency-graph.js +++ b/dependency-graph.js @@ -10,4 +10,4 @@ for await (const chunk of process.stdin) { const file = Buffer.concat(inputFile).toString("utf-8"); const svg = graphviz.dot(file, "svg"); -process.stdout.write(svg); \ No newline at end of file +process.stdout.write(svg); diff --git a/eslint.config.js b/eslint.config.js index e79395e1900..a97e3902411 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,70 +1,43 @@ -import tseslint from '@typescript-eslint/eslint-plugin'; -import stylisticTs from '@stylistic/eslint-plugin-ts'; -import parser from '@typescript-eslint/parser'; -import importX from 'eslint-plugin-import-x'; +import tseslint from "@typescript-eslint/eslint-plugin"; +import stylisticTs from "@stylistic/eslint-plugin-ts"; +import parser from "@typescript-eslint/parser"; +import importX from "eslint-plugin-import-x"; -export default [ - { - name: "eslint-config", - files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], - ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], - languageOptions: { - parser: parser - }, - plugins: { - "import-x": importX, - '@stylistic/ts': stylisticTs, - '@typescript-eslint': tseslint - }, - rules: { - "eqeqeq": ["error", "always"], // Enforces the use of `===` and `!==` instead of `==` and `!=` - "indent": ["error", 2, { "SwitchCase": 1 }], // Enforces a 2-space indentation, enforces indentation of `case ...:` statements - "quotes": ["error", "double"], // Enforces the use of double quotes for strings - "no-var": "error", // Disallows the use of `var`, enforcing `let` or `const` instead - "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned - "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) - "@typescript-eslint/no-unused-vars": [ "error", { - "args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used. - "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the others. - }], - "eol-last": ["error", "always"], // Enforces at least one newline at the end of files - "@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax - "semi": "off", // Disables the general semi rule for TypeScript files - "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax - "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors - "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@stylistic/ts/brace-style": ["error", "1tbs"], // Enforces the following brace style: https://eslint.style/rules/js/brace-style#_1tbs - "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines - "skipBlankLines": false, // Enforces the rule even on blank lines - "ignoreComments": false // Enforces the rule on lines containing comments - }], - "space-before-blocks": ["error", "always"], // Enforces a space before blocks - "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords - "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after commas - "import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json - "array-bracket-spacing": ["error", "always", { "objectsInArrays": false, "arraysInArrays": false }], // Enforces consistent spacing inside array brackets - "object-curly-spacing": ["error", "always", { "arraysInObjects": false, "objectsInObjects": false }], // Enforces consistent spacing inside braces of object literals, destructuring assignments, and import/export specifiers - "computed-property-spacing": ["error", "never" ], // Enforces consistent spacing inside computed property brackets - "space-infix-ops": ["error", { "int32Hint": false }], // Enforces spacing around infix operators - "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines - "@typescript-eslint/consistent-type-imports": "error", // Enforces type-only imports wherever possible - } +export default [ + { + name: "eslint-config", + files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], + ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], + languageOptions: { + parser: parser, }, - { - name: "eslint-tests", - files: ["test/**/**.test.ts"], - languageOptions: { - parser: parser, - parserOptions: { - "project": ["./tsconfig.json"] - } - }, - plugins: { - "@typescript-eslint": tseslint - }, - rules: { - "@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/ - "@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/ - } - } -] + plugins: { + "import-x": importX, + "@stylistic/ts": stylisticTs, + "@typescript-eslint": tseslint, + }, + rules: { + "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned + "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) + "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax + "import-x/extensions": ["error", "never", { json: "always" }], // Enforces no extension for imports unless json + }, + }, + { + name: "eslint-tests", + files: ["test/**/**.test.ts"], + languageOptions: { + parser: parser, + parserOptions: { + project: ["./tsconfig.json"], + }, + }, + plugins: { + "@typescript-eslint": tseslint, + }, + rules: { + "@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/ + "@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/ + }, + }, +]; diff --git a/index.css b/index.css index 9226f968e3e..49e570bdccc 100644 --- a/index.css +++ b/index.css @@ -11,7 +11,7 @@ html { body { margin: 0; - display:flex; + display: flex; flex-direction: column; align-items: center; background: #484050; @@ -49,16 +49,17 @@ body { @media (pointer: coarse) { /* hasTouchscreen() && !isTouchControlsEnabled */ - body:has(> #touchControls[class=visible]) #app { + body:has(> #touchControls[class="visible"]) #app { align-items: start; } - body:has(> #touchControls[class=visible]) #app > div:first-child { + body:has(> #touchControls[class="visible"]) #app > div:first-child { transform-origin: top !important; } } -#layout:fullscreen #dpad, #layout:fullscreen { +#layout:fullscreen #dpad, +#layout:fullscreen { bottom: 6rem; } @@ -76,7 +77,6 @@ input { display: none !important; } - input:-internal-autofill-selected { -webkit-background-clip: text; background-clip: text; @@ -91,18 +91,33 @@ input:-internal-autofill-selected { --controls-padding: 1rem; - --controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding)); - --controls-size-with-wide-padding: calc(var(--controls-size) *1.2 + var(--controls-padding)); + --controls-size-with-padding: calc( + var(--controls-size) + + var(--controls-padding) + ); + --controls-size-with-wide-padding: calc( + var(--controls-size) * + 1.2 + + var(--controls-padding) + ); --control-group-extra-size: calc(var(--controls-size) * 0.8); --control-group-extra-wide-size: calc(var(--controls-size) * 1.2); - --control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); - --control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); + --control-group-extra-2-offset: calc( + var(--controls-size-with-padding) + + (var(--controls-size) - var(--control-group-extra-size)) / + 2 + ); + --control-group-extra-1-offset: calc( + var(--controls-padding) + + (var(--controls-size) - var(--control-group-extra-size)) / + 2 + ); --small-control-size: calc(var(--controls-size) / 3); --rect-control-size: calc(var(--controls-size) * 0.74); - font-family: 'emerald'; + font-family: "emerald"; font-size: var(--controls-size); text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size); color: var(--color-light); @@ -146,32 +161,69 @@ input:-internal-autofill-selected { /* Hide buttons on specific UIs */ /* Show #apadPreviousTab and #apadNextTab only in settings, except in touch configuration panel */ -#touchControls:not([data-ui-mode^='SETTINGS']) #apadPreviousTab, -#touchControls:not([data-ui-mode^='SETTINGS']) #apadNextTab, +#touchControls:not([data-ui-mode^="SETTINGS"]) #apadPreviousTab, +#touchControls:not([data-ui-mode^="SETTINGS"]) #apadNextTab, #touchControls:is(.config-mode) #apadPreviousTab, #touchControls:is(.config-mode) #apadNextTab { display: none; } /* Show #apadInfo only in battle */ -#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apadInfo { +#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not( + [data-ui-mode="BALL"] + ):not([data-ui-mode="TARGET_SELECT"]) + #apadInfo { display: none; } /* Show #apadStats only in battle and shop */ -#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats { +#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not( + [data-ui-mode="BALL"] + ):not([data-ui-mode="TARGET_SELECT"]):not([data-ui-mode="MODIFIER_SELECT"]) + #apadStats { display: none; } /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleTera { - display: none; +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"] + ) + #apadOpenFilters, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleForm, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode="STARTER_SELECT"]) + #apadCycleNature, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleAbility, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX_PAGE"] + ) + #apadCycleGender, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"] + ) + #apadCycleTera { + display: none; } /* Configuration toolbar */ @@ -217,16 +269,18 @@ input:-internal-autofill-selected { font-size: var(--small-control-size); border-radius: 8px; padding: 2px 8px; - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } #configToolbar .button:active { - opacity: var(--touch-control-opacity) + opacity: var(--touch-control-opacity); } #configToolbar .orientation-label { font-size: var(--small-control-size); - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } /* dpad */ @@ -270,7 +324,8 @@ input:-internal-autofill-selected { .apad-small > .apad-label { font-size: var(--small-control-size); - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } .apad-rectangle { @@ -320,7 +375,8 @@ input:-internal-autofill-selected { /* Layout */ -#layout:fullscreen #dpad, #layout:fullscreen #apad { +#layout:fullscreen #dpad, +#layout:fullscreen #apad { bottom: 6rem; } @@ -353,55 +409,55 @@ a { /* Firefox old*/ @-moz-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } @-webkit-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } /* IE */ @-ms-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } /* Opera and prob css3 final iteration */ @keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } .blink-image { - -moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */ - -webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */ - -ms-animation: blink normal 4s infinite ease-in-out; /* IE */ - animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */ + -moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */ + -webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */ + -ms-animation: blink normal 4s infinite ease-in-out; /* IE */ + animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */ } diff --git a/lefthook.yml b/lefthook.yml index 06eb0446ee5..4eff2ad1f8e 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,9 +1,9 @@ pre-commit: parallel: true commands: - eslint: + biome-lint: glob: "*.{js,jsx,ts,tsx}" - run: npx eslint --fix {staged_files} + run: npx @biomejs/biome check --write --reporter=summary {staged_files} --no-errors-on-unmatched stage_fixed: true skip: - merge @@ -11,9 +11,9 @@ pre-commit: pre-push: commands: - eslint: + biome-lint: glob: "*.{js,ts,jsx,tsx}" - run: npx eslint --fix {push_files} + run: npx @biomejs/biome check --write --reporter=summary {push_files} --no-errors-on-unmatched post-merge: commands: diff --git a/package-lock.json b/package-lock.json index b1c7564a2ee..87e2e150c65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7014 +1,7179 @@ { - "name": "pokemon-rogue-battle", - "version": "1.7.7", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "pokemon-rogue-battle", - "version": "1.7.7", - "hasInstallScript": true, - "dependencies": { - "@material/material-color-utilities": "^0.2.7", - "crypto-js": "^4.2.0", - "i18next": "^23.11.1", - "i18next-browser-languagedetector": "^7.2.1", - "i18next-http-backend": "^2.6.1", - "i18next-korean-postposition-processor": "^1.0.0", - "json-stable-stringify": "^1.1.0", - "jszip": "^3.10.1", - "phaser": "^3.70.0", - "phaser3-rex-plugins": "^1.1.84" - }, - "devDependencies": { - "@eslint/js": "^9.3.0", - "@hpcc-js/wasm": "^2.18.0", - "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", - "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.1.9", - "dependency-cruiser": "^16.3.10", - "eslint": "^9.7.0", - "eslint-plugin-import-x": "^4.2.1", - "inquirer": "^11.0.2", - "jsdom": "^24.0.0", - "lefthook": "^1.6.12", - "msw": "^2.4.9", - "phaser3spectorjs": "^0.0.8", - "typedoc": "^0.26.4", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.14", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.9", - "vitest-canvas-mock": "^0.3.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", - "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", - "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", - "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@hpcc-js/wasm": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", - "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", - "dev": true, - "dependencies": { - "yargs": "17.7.2" - }, - "bin": { - "dot-wasm": "bin/dot-wasm.js" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", - "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/confirm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", - "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/editor": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", - "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/expand": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", - "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", - "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", - "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/number": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", - "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/password": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", - "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/prompts": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", - "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^3.0.1", - "@inquirer/confirm": "^4.0.1", - "@inquirer/editor": "^3.0.1", - "@inquirer/expand": "^3.0.1", - "@inquirer/input": "^3.0.1", - "@inquirer/number": "^2.0.1", - "@inquirer/password": "^3.0.1", - "@inquirer/rawlist": "^3.0.1", - "@inquirer/search": "^2.0.1", - "@inquirer/select": "^3.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/rawlist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", - "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/search": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", - "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/select": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", - "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@material/material-color-utilities": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", - "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", - "license": "Apache-2.0" - }, - "node_modules/@mswjs/interceptors": { - "version": "0.35.8", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz", - "integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.0.tgz", - "integrity": "sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.4" - } - }, - "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.6.0-beta.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.0-beta.0.tgz", - "integrity": "sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.56.10", - "acorn": "^8.12.0", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.6.0-beta.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.0-beta.0.tgz", - "integrity": "sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stylistic/eslint-plugin-js": "2.6.0-beta.0", - "@types/eslint": "^8.56.10", - "@typescript-eslint/utils": "^8.0.0-alpha.34" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "8.56.11", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", - "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/jsdom": { - "version": "21.1.7", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", - "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.58.tgz", - "integrity": "sha512-5G9oIj8jvosj8RTa0VDFXvRmUg1U6FxXJu7ZEfyJYMvFkdMJoY5YnzFvgAvHbYsXOj+YgXZu81fNOTRWQzwk5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/type-utils": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.58.tgz", - "integrity": "sha512-/RpgxIejBui6WXJgV9ukwzxmvbZt5TlfHUGGLB/BsNLj+NRZEbXVtWT9rKuxVOqsGb1Dn9c5gxvBI/XzyuIsMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.58.tgz", - "integrity": "sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.58.tgz", - "integrity": "sha512-spW/I/UAY6HM0lKj+/333Zb9arOvUoi8+H0cVNYHELPhOti9re9NjyyJFhck84PNiwi8WmpkEf3GXe7/h+Cquw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.58.tgz", - "integrity": "sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.58.tgz", - "integrity": "sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.58.tgz", - "integrity": "sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.58.tgz", - "integrity": "sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/coverage-istanbul": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.9.tgz", - "integrity": "sha512-vdYE4FkC/y2lxcN3Dcj54Bw+ericmDwiex0B8LV5F/YNYEYP1mgVwhPnHwWGAXu38qizkjOuyczKbFTALfzFKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@istanbuljs/schema": "^0.1.3", - "debug": "^4.3.7", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.3", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magicast": "^0.3.5", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.1.9" - } - }, - "node_modules/@vitest/expect": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.9", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.9", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-jsx-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", - "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn-loose": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", - "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dependency-cruiser": { - "version": "16.3.10", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz", - "integrity": "sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "8.12.1", - "acorn-jsx": "5.3.2", - "acorn-jsx-walk": "2.0.0", - "acorn-loose": "8.4.0", - "acorn-walk": "8.3.3", - "ajv": "8.17.1", - "commander": "12.1.0", - "enhanced-resolve": "5.17.1", - "ignore": "5.3.1", - "interpret": "^3.1.1", - "is-installed-globally": "1.0.0", - "json5": "2.2.3", - "memoize": "10.0.0", - "picocolors": "1.0.1", - "picomatch": "4.0.2", - "prompts": "2.4.2", - "rechoir": "^0.8.0", - "safe-regex": "2.1.1", - "semver": "^7.6.3", - "teamcity-service-messages": "0.1.14", - "tsconfig-paths-webpack-plugin": "4.1.0", - "watskeburt": "4.1.0" - }, - "bin": { - "depcruise": "bin/dependency-cruise.mjs", - "depcruise-baseline": "bin/depcruise-baseline.mjs", - "depcruise-fmt": "bin/depcruise-fmt.mjs", - "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", - "dependency-cruise": "bin/dependency-cruise.mjs", - "dependency-cruiser": "bin/dependency-cruise.mjs" - }, - "engines": { - "node": "^18.17||>=20" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.830", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", - "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", - "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.7.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import-x": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz", - "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.1.0", - "debug": "^4.3.4", - "doctrine": "^3.0.0", - "eslint-import-resolver-node": "^0.3.9", - "get-tsconfig": "^4.7.3", - "is-glob": "^4.0.3", - "minimatch": "^9.0.3", - "semver": "^7.6.3", - "stable-hash": "^0.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", - "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/i18next": { - "version": "23.12.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", - "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", - "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz", - "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==", - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, - "node_modules/i18next-korean-postposition-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/i18next-korean-postposition-processor/-/i18next-korean-postposition-processor-1.0.0.tgz", - "integrity": "sha512-ruNXjI9awsFK6Ie+F9gYaMW8ciLMuCkeRjH9QkSv2Wb8xI0mnm773v3M9eua8dtvAXudIUk4p6Ho7hNkEASXDg==", - "license": "MIT", - "peerDependencies": { - "i18next": ">=8.4.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.0.2.tgz", - "integrity": "sha512-pnbn3nL+JFrTw/pLhzyE/IQ3+gA3n5JxTAZQDjB6qu4gbjOaiTnpZbxT6HY2DDCT7bzDjTTsd3snRP+B6N//Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/prompts": "^6.0.1", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "ansi-escapes": "^4.3.2", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", - "rxjs": "^7.8.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", - "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", - "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.10", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.17.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lefthook": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.4.tgz", - "integrity": "sha512-lVv3nKH9l3KMDS3bySROvWJSw1+AsBHUO7xaA0rg1IEBZrj3+ePmM+a8elX+GU3Go1OzsZEYjo5AOOeLoZ7FQg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "lefthook": "bin/index.js" - }, - "optionalDependencies": { - "lefthook-darwin-arm64": "1.7.4", - "lefthook-darwin-x64": "1.7.4", - "lefthook-freebsd-arm64": "1.7.4", - "lefthook-freebsd-x64": "1.7.4", - "lefthook-linux-arm64": "1.7.4", - "lefthook-linux-x64": "1.7.4", - "lefthook-windows-arm64": "1.7.4", - "lefthook-windows-x64": "1.7.4" - } - }, - "node_modules/lefthook-darwin-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.4.tgz", - "integrity": "sha512-6XpenaP0W7ZYA3lhHey/C1U+KmYz6eCq2cGswQsrTX+xdtHdWW3NbbOKngxATRTF8+CtF6m9UB2afP7qqkCghQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook-darwin-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.4.tgz", - "integrity": "sha512-lpQXbPMHiaWE7+9fV+spjuMKiZ3J/+oI6hY1/l48MO3LmSpIv6DNy0VHho1fZVQnHdBU4bDh5c1G0r1f5T0irg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook-freebsd-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.4.tgz", - "integrity": "sha512-wv+JZgkD1/wi4X5aKKNodvxNcFcYmvL7uyzKkbtd/LgX5ssh9r5pO9J/71ULGtEuTXH4kqORRtez7u/ygqMEew==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook-freebsd-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.4.tgz", - "integrity": "sha512-xoYR0Ay8pbyY9W9mI+iI9VDkkCVYSXhMf9XyOChSlu2XmjKiqi23hjCXvSOpvHQ7jphGvAVpE3Byijr6Xjuihw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook-linux-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.4.tgz", - "integrity": "sha512-WvXWzSM/e08n2f5lcC8j+pUMS0RzZftJK4zuBQ36TstSYXfBjWiw+FMnKCVZk6Q8Zc0icyF8sTmKQAyKCgX+UA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook-linux-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.4.tgz", - "integrity": "sha512-eR5NxGzqPJm3wDTm4HStwGxOZ8Omb0ooodyuQdEOxtYidLrd4U18N14huwCEFd3BAOrjIWYV8plH+ReTZE56eg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook-windows-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.4.tgz", - "integrity": "sha512-C+MdHH+0ylermetMHwfHsYYNI5HI6QEOx7N4Iw4Ea6c3Yuj3eG3LsAzrhsup7KLSSBmDgIHOCJUx/Mfh2z+ATw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/lefthook-windows-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", - "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "node_modules/memoize": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", - "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/memoize?sponsor=1" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/msw": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", - "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.35.8", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.3.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.8.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/@inquirer/confirm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", - "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/msw/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", - "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", - "dev": true - }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/phaser": { - "version": "3.80.1", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", - "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1" - } - }, - "node_modules/phaser3-rex-plugins": { - "version": "1.80.5", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.5.tgz", - "integrity": "sha512-hdL3Cm6dK72w6phQdGnEiqqntlwT8SvjU0yit7DkdqiPy/Io1g3KnsRFqndtY+Hu69zaMEuckpIVeQK6yVwx4A==", - "dependencies": { - "eventemitter3": "^3.1.2", - "i18next": "^22.5.1", - "i18next-http-backend": "^2.5.2", - "js-yaml": "^4.1.0", - "mustache": "^4.2.0", - "papaparse": "^5.4.1", - "webfontloader": "^1.6.28" - } - }, - "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "license": "MIT" - }, - "node_modules/phaser3-rex-plugins/node_modules/i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.6" - } - }, - "node_modules/phaser3spectorjs": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", - "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, - "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.0.tgz", - "integrity": "sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==", - "dev": true, - "dependencies": { - "@shikijs/core": "1.12.0", - "@types/hast": "^3.0.4" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/teamcity-service-messages": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", - "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfck": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", - "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedoc": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", - "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "shiki": "^1.9.1", - "yaml": "^2.4.5" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.58.tgz", - "integrity": "sha512-0mvrodNhExpkWns+5RaZP8YqsAfPyjmPVVM1p+kaJkvApMH58/VFcQ0iSQuun0bFRNCMvW0ZUdulS9AsHqVXkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.0.0-alpha.58", - "@typescript-eslint/parser": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/vite": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", - "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.9", - "@vitest/mocker": "2.1.9", - "@vitest/pretty-format": "^2.1.9", - "@vitest/runner": "2.1.9", - "@vitest/snapshot": "2.1.9", - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "debug": "^4.3.7", - "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.9", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.9", - "@vitest/ui": "2.1.9", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest-canvas-mock": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", - "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-canvas-mock": "~2.5.2" - }, - "peerDependencies": { - "vitest": "*" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/watskeburt": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", - "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", - "dev": true, - "bin": { - "watskeburt": "dist/run-cli.js" - }, - "engines": { - "node": "^18||>=20" - } - }, - "node_modules/webfontloader": { - "version": "1.6.28", - "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } + "name": "pokemon-rogue-battle", + "version": "1.7.7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pokemon-rogue-battle", + "version": "1.7.7", + "hasInstallScript": true, + "dependencies": { + "@material/material-color-utilities": "^0.2.7", + "crypto-js": "^4.2.0", + "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", + "i18next-http-backend": "^2.6.1", + "i18next-korean-postposition-processor": "^1.0.0", + "json-stable-stringify": "^1.1.0", + "jszip": "^3.10.1", + "phaser": "^3.70.0", + "phaser3-rex-plugins": "^1.1.84" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.3.0", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.12.13", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.1.9", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", + "inquirer": "^11.0.2", + "jsdom": "^24.0.0", + "lefthook": "^1.6.12", + "msw": "^2.4.9", + "phaser3spectorjs": "^0.0.8", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.4.14", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.1.9", + "vitest-canvas-mock": "^0.3.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", + "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hpcc-js/wasm": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", + "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", + "dev": true, + "dependencies": { + "yargs": "17.7.2" + }, + "bin": { + "dot-wasm": "bin/dot-wasm.js" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^3.0.1", + "@inquirer/confirm": "^4.0.1", + "@inquirer/editor": "^3.0.1", + "@inquirer/expand": "^3.0.1", + "@inquirer/input": "^3.0.1", + "@inquirer/number": "^2.0.1", + "@inquirer/password": "^3.0.1", + "@inquirer/rawlist": "^3.0.1", + "@inquirer/search": "^2.0.1", + "@inquirer/select": "^3.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@material/material-color-utilities": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", + "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", + "license": "Apache-2.0" + }, + "node_modules/@mswjs/interceptors": { + "version": "0.35.8", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz", + "integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.0.tgz", + "integrity": "sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.4" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.0-beta.0.tgz", + "integrity": "sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.56.10", + "acorn": "^8.12.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.0-beta.0.tgz", + "integrity": "sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin-js": "2.6.0-beta.0", + "@types/eslint": "^8.56.10", + "@typescript-eslint/utils": "^8.0.0-alpha.34" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.11", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", + "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.58.tgz", + "integrity": "sha512-5G9oIj8jvosj8RTa0VDFXvRmUg1U6FxXJu7ZEfyJYMvFkdMJoY5YnzFvgAvHbYsXOj+YgXZu81fNOTRWQzwk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/type-utils": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.58.tgz", + "integrity": "sha512-/RpgxIejBui6WXJgV9ukwzxmvbZt5TlfHUGGLB/BsNLj+NRZEbXVtWT9rKuxVOqsGb1Dn9c5gxvBI/XzyuIsMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.58.tgz", + "integrity": "sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-spW/I/UAY6HM0lKj+/333Zb9arOvUoi8+H0cVNYHELPhOti9re9NjyyJFhck84PNiwi8WmpkEf3GXe7/h+Cquw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.58.tgz", + "integrity": "sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.58.tgz", + "integrity": "sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.58.tgz", + "integrity": "sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/coverage-istanbul": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.9.tgz", + "integrity": "sha512-vdYE4FkC/y2lxcN3Dcj54Bw+ericmDwiex0B8LV5F/YNYEYP1mgVwhPnHwWGAXu38qizkjOuyczKbFTALfzFKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@istanbuljs/schema": "^0.1.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-instrument": "^6.0.3", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magicast": "^0.3.5", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.1.9" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-jsx-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn-loose": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", + "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dependency-cruiser": { + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz", + "integrity": "sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "8.12.1", + "acorn-jsx": "5.3.2", + "acorn-jsx-walk": "2.0.0", + "acorn-loose": "8.4.0", + "acorn-walk": "8.3.3", + "ajv": "8.17.1", + "commander": "12.1.0", + "enhanced-resolve": "5.17.1", + "ignore": "5.3.1", + "interpret": "^3.1.1", + "is-installed-globally": "1.0.0", + "json5": "2.2.3", + "memoize": "10.0.0", + "picocolors": "1.0.1", + "picomatch": "4.0.2", + "prompts": "2.4.2", + "rechoir": "^0.8.0", + "safe-regex": "2.1.1", + "semver": "^7.6.3", + "teamcity-service-messages": "0.1.14", + "tsconfig-paths-webpack-plugin": "4.1.0", + "watskeburt": "4.1.0" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" + }, + "engines": { + "node": "^18.17||>=20" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", + "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", + "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.17.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.7.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz", + "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.1.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.7.3", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3", + "semver": "^7.6.3", + "stable-hash": "^0.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", + "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/i18next": { + "version": "23.12.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", + "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", + "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz", + "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==", + "license": "MIT", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, + "node_modules/i18next-korean-postposition-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/i18next-korean-postposition-processor/-/i18next-korean-postposition-processor-1.0.0.tgz", + "integrity": "sha512-ruNXjI9awsFK6Ie+F9gYaMW8ciLMuCkeRjH9QkSv2Wb8xI0mnm773v3M9eua8dtvAXudIUk4p6Ho7hNkEASXDg==", + "license": "MIT", + "peerDependencies": { + "i18next": ">=8.4.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.0.2.tgz", + "integrity": "sha512-pnbn3nL+JFrTw/pLhzyE/IQ3+gA3n5JxTAZQDjB6qu4gbjOaiTnpZbxT6HY2DDCT7bzDjTTsd3snRP+B6N//Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/prompts": "^6.0.1", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", + "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.10", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.17.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lefthook": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.4.tgz", + "integrity": "sha512-lVv3nKH9l3KMDS3bySROvWJSw1+AsBHUO7xaA0rg1IEBZrj3+ePmM+a8elX+GU3Go1OzsZEYjo5AOOeLoZ7FQg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "lefthook": "bin/index.js" + }, + "optionalDependencies": { + "lefthook-darwin-arm64": "1.7.4", + "lefthook-darwin-x64": "1.7.4", + "lefthook-freebsd-arm64": "1.7.4", + "lefthook-freebsd-x64": "1.7.4", + "lefthook-linux-arm64": "1.7.4", + "lefthook-linux-x64": "1.7.4", + "lefthook-windows-arm64": "1.7.4", + "lefthook-windows-x64": "1.7.4" + } + }, + "node_modules/lefthook-darwin-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.4.tgz", + "integrity": "sha512-6XpenaP0W7ZYA3lhHey/C1U+KmYz6eCq2cGswQsrTX+xdtHdWW3NbbOKngxATRTF8+CtF6m9UB2afP7qqkCghQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-darwin-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.4.tgz", + "integrity": "sha512-lpQXbPMHiaWE7+9fV+spjuMKiZ3J/+oI6hY1/l48MO3LmSpIv6DNy0VHho1fZVQnHdBU4bDh5c1G0r1f5T0irg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-freebsd-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.4.tgz", + "integrity": "sha512-wv+JZgkD1/wi4X5aKKNodvxNcFcYmvL7uyzKkbtd/LgX5ssh9r5pO9J/71ULGtEuTXH4kqORRtez7u/ygqMEew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-freebsd-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.4.tgz", + "integrity": "sha512-xoYR0Ay8pbyY9W9mI+iI9VDkkCVYSXhMf9XyOChSlu2XmjKiqi23hjCXvSOpvHQ7jphGvAVpE3Byijr6Xjuihw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-linux-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.4.tgz", + "integrity": "sha512-WvXWzSM/e08n2f5lcC8j+pUMS0RzZftJK4zuBQ36TstSYXfBjWiw+FMnKCVZk6Q8Zc0icyF8sTmKQAyKCgX+UA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-linux-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.4.tgz", + "integrity": "sha512-eR5NxGzqPJm3wDTm4HStwGxOZ8Omb0ooodyuQdEOxtYidLrd4U18N14huwCEFd3BAOrjIWYV8plH+ReTZE56eg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-windows-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.4.tgz", + "integrity": "sha512-C+MdHH+0ylermetMHwfHsYYNI5HI6QEOx7N4Iw4Ea6c3Yuj3eG3LsAzrhsup7KLSSBmDgIHOCJUx/Mfh2z+ATw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/lefthook-windows-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", + "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/memoize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", + "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", + "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", + "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.35.8", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.3.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", + "dev": true + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/phaser": { + "version": "3.80.1", + "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", + "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1" + } + }, + "node_modules/phaser3-rex-plugins": { + "version": "1.80.5", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.5.tgz", + "integrity": "sha512-hdL3Cm6dK72w6phQdGnEiqqntlwT8SvjU0yit7DkdqiPy/Io1g3KnsRFqndtY+Hu69zaMEuckpIVeQK6yVwx4A==", + "dependencies": { + "eventemitter3": "^3.1.2", + "i18next": "^22.5.1", + "i18next-http-backend": "^2.5.2", + "js-yaml": "^4.1.0", + "mustache": "^4.2.0", + "papaparse": "^5.4.1", + "webfontloader": "^1.6.28" + } + }, + "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "license": "MIT" + }, + "node_modules/phaser3-rex-plugins/node_modules/i18next": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", + "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/phaser3spectorjs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", + "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.0.tgz", + "integrity": "sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.12.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/teamcity-service-messages": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", + "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", + "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.58.tgz", + "integrity": "sha512-0mvrodNhExpkWns+5RaZP8YqsAfPyjmPVVM1p+kaJkvApMH58/VFcQ0iSQuun0bFRNCMvW0ZUdulS9AsHqVXkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.0.0-alpha.58", + "@typescript-eslint/parser": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-canvas-mock": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", + "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-canvas-mock": "~2.5.2" + }, + "peerDependencies": { + "vitest": "*" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watskeburt": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", + "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", + "dev": true, + "bin": { + "watskeburt": "dist/run-cli.js" + }, + "engines": { + "node": "^18||>=20" + } + }, + "node_modules/webfontloader": { + "version": "1.6.28", + "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/package.json b/package.json index 4175ce899e6..ce9e8b4a07b 100644 --- a/package.json +++ b/package.json @@ -1,68 +1,71 @@ { - "name": "pokemon-rogue-battle", - "private": true, - "version": "1.7.7", - "type": "module", - "scripts": { - "start": "vite", - "start:dev": "vite --mode development", - "build": "vite build", - "build:beta": "vite build --mode beta", - "preview": "vite preview", - "test": "vitest run --project pre && vitest run --project main", - "test:cov": "vitest run --project pre && vitest run --project main --coverage", - "test:watch": "vitest run --project pre && vitest watch --project main --coverage", - "test:silent": "vitest run --project pre && vitest run --project main --silent", - "typecheck": "tsc --noEmit", - "eslint": "eslint --fix .", - "eslint-ci": "eslint .", - "docs": "typedoc", - "depcruise": "depcruise src", - "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg", - "create-test": "node ./create-test-boilerplate.js", - "postinstall": "npx lefthook install && npx lefthook run post-merge", - "update-version:patch": "npm version patch --force --no-git-tag-version", - "update-version:minor": "npm version minor --force --no-git-tag-version", - "update-locales:remote": "git submodule update --progress --init --recursive --force --remote" - }, - "devDependencies": { - "@eslint/js": "^9.3.0", - "@hpcc-js/wasm": "^2.18.0", - "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", - "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.1.9", - "dependency-cruiser": "^16.3.10", - "eslint": "^9.7.0", - "eslint-plugin-import-x": "^4.2.1", - "inquirer": "^11.0.2", - "jsdom": "^24.0.0", - "lefthook": "^1.6.12", - "msw": "^2.4.9", - "phaser3spectorjs": "^0.0.8", - "typedoc": "^0.26.4", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.14", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.9", - "vitest-canvas-mock": "^0.3.3" - }, - "dependencies": { - "@material/material-color-utilities": "^0.2.7", - "crypto-js": "^4.2.0", - "i18next": "^23.11.1", - "i18next-browser-languagedetector": "^7.2.1", - "i18next-http-backend": "^2.6.1", - "i18next-korean-postposition-processor": "^1.0.0", - "json-stable-stringify": "^1.1.0", - "jszip": "^3.10.1", - "phaser": "^3.70.0", - "phaser3-rex-plugins": "^1.1.84" - }, - "engines": { - "node": ">=20.0.0" - } + "name": "pokemon-rogue-battle", + "private": true, + "version": "1.7.7", + "type": "module", + "scripts": { + "start": "vite", + "start:dev": "vite --mode development", + "build": "vite build", + "build:beta": "vite build --mode beta", + "preview": "vite preview", + "test": "vitest run --project pre && vitest run --project main", + "test:cov": "vitest run --project pre && vitest run --project main --coverage", + "test:watch": "vitest run --project pre && vitest watch --project main --coverage", + "test:silent": "vitest run --project pre && vitest run --project main --silent", + "typecheck": "tsc --noEmit", + "eslint": "eslint --fix .", + "eslint-ci": "eslint .", + "biome": "biome check --write --changed --no-errors-on-unmatched", + "biome-ci": "biome ci --diagnostic-level=error --reporter=github --changed --no-errors-on-unmatched", + "docs": "typedoc", + "depcruise": "depcruise src", + "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg", + "create-test": "node ./create-test-boilerplate.js", + "postinstall": "npx lefthook install && npx lefthook run post-merge", + "update-version:patch": "npm version patch --force --no-git-tag-version", + "update-version:minor": "npm version minor --force --no-git-tag-version", + "update-locales:remote": "git submodule update --progress --init --recursive --force --remote" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.3.0", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.12.13", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.1.9", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", + "inquirer": "^11.0.2", + "jsdom": "^24.0.0", + "lefthook": "^1.6.12", + "msw": "^2.4.9", + "phaser3spectorjs": "^0.0.8", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.4.14", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.1.9", + "vitest-canvas-mock": "^0.3.3" + }, + "dependencies": { + "@material/material-color-utilities": "^0.2.7", + "crypto-js": "^4.2.0", + "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", + "i18next-http-backend": "^2.6.1", + "i18next-korean-postposition-processor": "^1.0.0", + "json-stable-stringify": "^1.1.0", + "jszip": "^3.10.1", + "phaser": "^3.70.0", + "phaser3-rex-plugins": "^1.1.84" + }, + "engines": { + "node": ">=20.0.0" + } } diff --git a/src/account.ts b/src/account.ts index 4c86595a5e6..96ce32714bb 100644 --- a/src/account.ts +++ b/src/account.ts @@ -8,13 +8,25 @@ export let loggedInUser: UserInfo | null = null; export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { - loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false }; + loggedInUser = { + username: "Guest", + lastSessionSlot: -1, + discordId: "", + googleId: "", + hasAdminRole: false, + }; } export function updateUserInfo(): Promise<[boolean, number]> { return new Promise<[boolean, number]>(resolve => { if (bypassLogin) { - loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false }; + loggedInUser = { + username: "Guest", + lastSessionSlot: -1, + discordId: "", + googleId: "", + hasAdminRole: false, + }; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { @@ -24,7 +36,7 @@ export function updateUserInfo(): Promise<[boolean, number]> { } loggedInUser.lastSessionSlot = lastSessionSlot; // Migrate old data from before the username was appended - [ "data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4" ].map(d => { + ["data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4"].map(d => { const lsItem = localStorage.getItem(d); if (lsItem && !!loggedInUser?.username) { const lsUserItem = localStorage.getItem(`${d}_${loggedInUser.username}`); @@ -35,16 +47,15 @@ export function updateUserInfo(): Promise<[boolean, number]> { localStorage.removeItem(d); } }); - return resolve([ true, 200 ]); + return resolve([true, 200]); } - pokerogueApi.account.getInfo().then(([ accountInfo, status ]) => { + pokerogueApi.account.getInfo().then(([accountInfo, status]) => { if (!accountInfo) { - resolve([ false, status ]); + resolve([false, status]); return; - } else { - loggedInUser = accountInfo; - resolve([ true, 200 ]); } + loggedInUser = accountInfo; + resolve([true, 200]); }); }); } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 208c3368038..1712cf9236f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -8,11 +8,7 @@ import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import type { Constructor } from "#app/utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; -import type { - Modifier, - ModifierPredicate, - TurnHeldItemTransferModifier, -} from "./modifier/modifier"; +import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; import { ConsumableModifier, ConsumablePokemonModifier, @@ -93,10 +89,7 @@ import type UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "#app/ui/ui-theme"; import type PokemonData from "#app/system/pokemon-data"; import { Nature } from "#enums/nature"; -import type { - SpeciesFormChange, - SpeciesFormChangeTrigger, -} from "#app/data/pokemon-forms"; +import type { SpeciesFormChange, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms"; import { FormChangeItem, pokemonFormChanges, @@ -181,10 +174,8 @@ export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; const DEBUG_RNG = false; const OPP_IVS_OVERRIDE_VALIDATED: number[] = ( - Array.isArray(Overrides.OPP_IVS_OVERRIDE) - ? Overrides.OPP_IVS_OVERRIDE - : new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) -).map((iv) => (isNaN(iv) || iv === null || iv > 31 ? -1 : iv)); + Array.isArray(Overrides.OPP_IVS_OVERRIDE) ? Overrides.OPP_IVS_OVERRIDE : new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) +).map(iv => (Number.isNaN(iv) || iv === null || iv > 31 ? -1 : iv)); export const startingWave = Overrides.STARTING_WAVE_OVERRIDE || 1; @@ -199,10 +190,7 @@ export interface PokeballCounts { [pb: string]: number; } -export type AnySound = - | Phaser.Sound.WebAudioSound - | Phaser.Sound.HTML5AudioSound - | Phaser.Sound.NoAudioSound; +export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound; export interface InfoToggle { toggleInfo(force?: boolean): void; @@ -216,55 +204,54 @@ export default class BattleScene extends SceneBase { public sessionPlayTime: number | null = null; public lastSavePlayTime: number | null = null; - public masterVolume: number = 0.5; - public bgmVolume: number = 1; - public fieldVolume: number = 1; - public seVolume: number = 1; - public uiVolume: number = 1; - public gameSpeed: number = 1; - public damageNumbersMode: number = 0; - public reroll: boolean = false; + public masterVolume = 0.5; + public bgmVolume = 1; + public fieldVolume = 1; + public seVolume = 1; + public uiVolume = 1; + public gameSpeed = 1; + public damageNumbersMode = 0; + public reroll = false; public shopCursorTarget: number = ShopCursorTarget.REWARDS; - public commandCursorMemory: boolean = false; - public dexForDevs: boolean = false; - public showMovesetFlyout: boolean = true; - public showArenaFlyout: boolean = true; - public showTimeOfDayWidget: boolean = true; + public commandCursorMemory = false; + public dexForDevs = false; + public showMovesetFlyout = true; + public showArenaFlyout = true; + public showTimeOfDayWidget = true; public timeOfDayAnimation: EaseType = EaseType.NONE; - public showLevelUpStats: boolean = true; - public enableTutorials: boolean = - import.meta.env.VITE_BYPASS_TUTORIAL === "1"; - public enableMoveInfo: boolean = true; - public enableRetries: boolean = false; - public hideIvs: boolean = false; + public showLevelUpStats = true; + public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; + public enableMoveInfo = true; + public enableRetries = false; + public hideIvs = false; /** * Determines the condition for a notification should be shown for Candy Upgrades * - 0 = 'Off' * - 1 = 'Passives Only' * - 2 = 'On' */ - public candyUpgradeNotification: number = 0; + public candyUpgradeNotification = 0; /** * Determines what type of notification is used for Candy Upgrades * - 0 = 'Icon' * - 1 = 'Animation' */ - public candyUpgradeDisplay: number = 0; + public candyUpgradeDisplay = 0; public moneyFormat: MoneyFormat = MoneyFormat.NORMAL; public uiTheme: UiTheme = UiTheme.DEFAULT; - public windowType: number = 0; - public experimentalSprites: boolean = false; + public windowType = 0; + public experimentalSprites = false; public musicPreference: number = MusicPreference.ALLGENS; - public moveAnimations: boolean = true; + public moveAnimations = true; public expGainsSpeed: ExpGainsSpeed = ExpGainsSpeed.DEFAULT; - public skipSeenDialogues: boolean = false; + public skipSeenDialogues = false; /** * Determines if the egg hatching animation should be skipped * - 0 = Never (never skip animation) * - 1 = Ask (ask to skip animation when hatching 2 or more eggs) * - 2 = Always (automatically skip animation when hatching 2 or more eggs) */ - public eggSkipPreference: number = 0; + public eggSkipPreference = 0; /** * Defines the experience gain display mode. @@ -279,11 +266,11 @@ export default class BattleScene extends SceneBase { * @default 0 - Uses the default normal experience gain display. */ public expParty: ExpNotification = 0; - public hpBarSpeed: number = 0; - public fusionPaletteSwaps: boolean = true; - public enableTouchControls: boolean = false; - public enableVibration: boolean = false; - public showBgmBar: boolean = true; + public hpBarSpeed = 0; + public fusionPaletteSwaps = true; + public enableTouchControls = false; + public enableVibration = false; + public showBgmBar = true; /** * Determines the selected battle style. @@ -297,9 +284,9 @@ export default class BattleScene extends SceneBase { * - true: No hints * - false: Show hints for moves */ - public typeHints: boolean = false; + public typeHints = false; - public disableMenu: boolean = false; + public disableMenu = false; public gameData: GameData; public sessionSlotId: number; @@ -342,8 +329,7 @@ export default class BattleScene extends SceneBase { public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; /** Session save data that pertains to Mystery Encounters */ - public mysteryEncounterSaveData: MysteryEncounterSaveData = - new MysteryEncounterSaveData(); + public mysteryEncounterSaveData: MysteryEncounterSaveData = new MysteryEncounterSaveData(); /** If the previous wave was a MysteryEncounter, tracks the object with this variable. Mostly used for visual object cleanup */ public lastMysteryEncounter?: MysteryEncounter; /** Combined Biome and Wave count text */ @@ -358,8 +344,8 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; - private shopOverlayShown: boolean = false; - private shopOverlayOpacity: number = 0.8; + private shopOverlayShown = false; + private shopOverlayOpacity = 0.8; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; @@ -382,9 +368,9 @@ export default class BattleScene extends SceneBase { private bgmCache: Set = new Set(); private playTimeTimer: Phaser.Time.TimerEvent; - public rngCounter: number = 0; - public rngSeedOverride: string = ""; - public rngOffset: number = 0; + public rngCounter = 0; + public rngSeedOverride = ""; + public rngOffset = 0; public inputMethod: string; private infoToggles: InfoToggle[] = []; @@ -435,30 +421,23 @@ export default class BattleScene extends SceneBase { /** * Load the variant assets for the given sprite and stores them in {@linkcode variantColorCache} */ - public async loadPokemonVariantAssets( - spriteKey: string, - fileRoot: string, - variant?: Variant, - ): Promise { - const useExpSprite = - this.experimentalSprites && this.hasExpSprite(spriteKey); + public async loadPokemonVariantAssets(spriteKey: string, fileRoot: string, variant?: Variant): Promise { + const useExpSprite = this.experimentalSprites && this.hasExpSprite(spriteKey); if (useExpSprite) { fileRoot = `exp/${fileRoot}`; } let variantConfig = variantData; - fileRoot - .split("/") - .map((p) => (variantConfig ? (variantConfig = variantConfig[p]) : null)); + fileRoot.split("/").map(p => (variantConfig ? (variantConfig = variantConfig[p]) : null)); const variantSet = variantConfig as VariantSet; - return new Promise((resolve) => { + return new Promise(resolve => { if (variantSet && variant !== undefined && variantSet[variant] === 1) { if (variantColorCache.hasOwnProperty(spriteKey)) { return resolve(); } this.cachedFetch(`./images/pokemon/variant/${fileRoot}.json`) - .then((res) => res.json()) - .then((c) => { + .then(res => res.json()) + .then(c => { variantColorCache[spriteKey] = c; resolve(); }); @@ -471,20 +450,10 @@ export default class BattleScene extends SceneBase { async preload() { if (DEBUG_RNG) { const originalRealInRange = Phaser.Math.RND.realInRange; - Phaser.Math.RND.realInRange = function ( - min: number, - max: number, - ): number { - const ret = originalRealInRange.apply(this, [ min, max ]); - const args = [ - "RNG", - ++this.rngCounter, - ret / (max - min), - `min: ${min} / max: ${max}`, - ]; - args.push( - `seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`, - ); + Phaser.Math.RND.realInRange = function (min: number, max: number): number { + const ret = originalRealInRange.apply(this, [min, max]); + const args = ["RNG", ++this.rngCounter, ret / (max - min), `min: ${min} / max: ${max}`]; + args.push(`seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`); if (this.rngOffset) { args.push(`offset: ${this.rngOffset}`); } @@ -511,16 +480,10 @@ export default class BattleScene extends SceneBase { this.load.setBaseURL(); this.spritePipeline = new SpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( - "Sprite", - this.spritePipeline, - ); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("Sprite", this.spritePipeline); this.fieldSpritePipeline = new FieldSpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( - "FieldSprite", - this.fieldSpritePipeline, - ); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); this.launchBattle(); } @@ -535,12 +498,12 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); this.arenaBgTransition.setName("sprite-arena-bg-transition"); - [ this.arenaBgTransition, this.arenaBg ].forEach((a) => { + for (const a of [this.arenaBgTransition, this.arenaBg]) { a.setPipeline(this.fieldSpritePipeline); a.setScale(6); a.setOrigin(0); a.setSize(320, 240); - }); + } const field = this.add.container(0, 0); field.setName("field"); @@ -587,25 +550,13 @@ export default class BattleScene extends SceneBase { const overlayWidth = this.game.canvas.width / 6; const overlayHeight = this.game.canvas.height / 6 - 48; - this.fieldOverlay = this.add.rectangle( - 0, - overlayHeight * -1 - 48, - overlayWidth, - overlayHeight, - 0x424242, - ); + this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); this.fieldOverlay.setName("rect-field-overlay"); this.fieldOverlay.setOrigin(0, 0); this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); - this.shopOverlay = this.add.rectangle( - 0, - overlayHeight * -1 - 48, - overlayWidth, - overlayHeight, - 0x070707, - ); + this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); this.shopOverlay.setName("rect-shop-overlay"); this.shopOverlay.setOrigin(0, 0); this.shopOverlay.setAlpha(0); @@ -666,34 +617,17 @@ export default class BattleScene extends SceneBase { 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.game.canvas.width / 6 - 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.game.canvas.width / 6 - 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.game.canvas.width / 6 - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); this.luckText.setName("text-luck"); this.luckText.setOrigin(1, 0.5); this.luckText.setVisible(false); @@ -713,10 +647,7 @@ export default class BattleScene extends SceneBase { this.arenaFlyout = new ArenaFlyout(); this.fieldUI.add(this.arenaFlyout); - this.fieldUI.moveBelow( - this.arenaFlyout, - this.fieldOverlay, - ); + this.fieldUI.moveBelow(this.arenaFlyout, this.fieldOverlay); this.updateUIPositions(); @@ -750,17 +681,12 @@ export default class BattleScene extends SceneBase { this.arenaPlayerTransition.setVisible(false); this.arenaNextEnemy.setVisible(false); - [ - this.arenaPlayer, - this.arenaPlayerTransition, - this.arenaEnemy, - this.arenaNextEnemy, - ].forEach((a) => { + for (const a of [this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy]) { if (a instanceof Phaser.GameObjects.Sprite) { a.setOrigin(0, 0); } field.add(a); - }); + } const trainer = this.addFieldSprite( 0, @@ -803,21 +729,14 @@ export default class BattleScene extends SceneBase { ui.setup(); - const defaultMoves = [ - Moves.TACKLE, - Moves.TAIL_WHIP, - Moves.FOCUS_ENERGY, - Moves.STRUGGLE, - ]; + const defaultMoves = [Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE]; Promise.all([ Promise.all(loadPokemonAssets), initCommonAnims().then(() => loadCommonAnimAssets(true)), - Promise.all( - [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map( - (m) => initMoveAnim(m), - ), - ).then(() => loadMoveAnimAssets(defaultMoves, true)), + Promise.all([Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE].map(m => initMoveAnim(m))).then( + () => loadMoveAnimAssets(defaultMoves, true), + ), this.initStarterColors(), ]).then(() => { this.pushPhase(new LoginPhase()); @@ -865,8 +784,8 @@ export default class BattleScene extends SceneBase { return; } this.cachedFetch("./exp-sprites.json") - .then((res) => res.json()) - .then((keys) => { + .then(res => res.json()) + .then(keys => { if (Array.isArray(keys)) { expSpriteKeys.push(...keys); } @@ -875,11 +794,15 @@ export default class BattleScene extends SceneBase { } async initVariantData(): Promise { - Object.keys(variantData).forEach((key) => delete variantData[key]); + for (const key of Object.keys(variantData)) { + delete variantData[key]; + } await this.cachedFetch("./images/pokemon/variant/_masterlist.json") - .then((res) => res.json()) - .then((v) => { - Object.keys(v).forEach((k) => (variantData[k] = v[k])); + .then(res => res.json()) + .then(v => { + for (const k of Object.keys(v)) { + variantData[k] = v[k]; + } if (this.experimentalSprites) { const expVariantData = variantData["exp"]; const traverseVariantData = (keys: string[]) => { @@ -889,11 +812,8 @@ export default class BattleScene extends SceneBase { if (i < keys.length - 1) { variantTree = variantTree[k]; expTree = expTree[k]; - } else if ( - variantTree.hasOwnProperty(k) && - expTree.hasOwnProperty(k) - ) { - if ([ "back", "female" ].includes(k)) { + } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { + if (["back", "female"].includes(k)) { traverseVariantData(keys.concat(k)); } else { variantTree[k] = expTree[k]; @@ -901,9 +821,9 @@ export default class BattleScene extends SceneBase { } }); }; - Object.keys(expVariantData).forEach((ek) => - traverseVariantData([ ek ]), - ); + for (const ek of Object.keys(expVariantData)) { + traverseVariantData([ek]); + } } Promise.resolve(); }); @@ -921,40 +841,18 @@ export default class BattleScene extends SceneBase { } initStarterColors(): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { if (starterColors) { return resolve(); } this.cachedFetch("./starter-colors.json") - .then((res) => res.json()) - .then((sc) => { + .then(res => res.json()) + .then(sc => { starterColors = {}; - Object.keys(sc).forEach((key) => { + for (const key of Object.keys(sc)) { starterColors[key] = sc[key]; - }); - - /*const loadPokemonAssets: Promise[] = []; - - for (let s of Object.keys(speciesStarters)) { - const species = getPokemonSpecies(parseInt(s)); - loadPokemonAssets.push(species.loadAssets(this, false, 0, false)); - } - - Promise.all(loadPokemonAssets).then(() => { - const starterCandyColors = {}; - const rgbaToHexFunc = (r, g, b) => [r, g, b].map(x => x.toString(16).padStart(2, '0')).join(''); - - for (let s of Object.keys(speciesStarters)) { - const species = getPokemonSpecies(parseInt(s)); - - starterCandyColors[species.speciesId] = species.generateCandyColors(this).map(c => rgbaToHexFunc(c[0], c[1], c[2])); - } - - console.log(JSON.stringify(starterCandyColors)); - - resolve(); - });*/ + } resolve(); }); @@ -962,10 +860,7 @@ export default class BattleScene extends SceneBase { } hasExpSprite(key: string): boolean { - const keyMatch = - /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec( - key, - ); + const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); if (!keyMatch) { return false; } @@ -998,7 +893,7 @@ export default class BattleScene extends SceneBase { * that are {@linkcode Pokemon.isAllowedInBattle | allowed in battle}. */ public getPokemonAllowedInBattle(): PlayerPokemon[] { - return this.getPlayerParty().filter((p) => p.isAllowedInBattle()); + return this.getPlayerParty().filter(p => p.isAllowedInBattle()); } /** @@ -1008,12 +903,8 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getPlayerPokemon( - includeSwitching: boolean = true, - ): PlayerPokemon | undefined { - return this.getPlayerField().find( - (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), - ); + public getPlayerPokemon(includeSwitching = true): PlayerPokemon | undefined { + return this.getPlayerField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); } /** @@ -1023,10 +914,7 @@ export default class BattleScene extends SceneBase { */ public getPlayerField(): PlayerPokemon[] { const party = this.getPlayerParty(); - return party.slice( - 0, - Math.min(party.length, this.currentBattle?.double ? 2 : 1), - ); + return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); } public getEnemyParty(): EnemyPokemon[] { @@ -1040,12 +928,8 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getEnemyPokemon( - includeSwitching: boolean = true, - ): EnemyPokemon | undefined { - return this.getEnemyField().find( - (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), - ); + public getEnemyPokemon(includeSwitching = true): EnemyPokemon | undefined { + return this.getEnemyField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); } /** @@ -1055,10 +939,7 @@ export default class BattleScene extends SceneBase { */ public getEnemyField(): EnemyPokemon[] { const party = this.getEnemyParty(); - return party.slice( - 0, - Math.min(party.length, this.currentBattle?.double ? 2 : 1), - ); + return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); } /** @@ -1067,13 +948,13 @@ export default class BattleScene extends SceneBase { * @param activeOnly Whether to consider only active pokemon * @returns array of {@linkcode Pokemon} */ - public getField(activeOnly: boolean = false): Pokemon[] { + public getField(activeOnly = false): Pokemon[] { const ret = new Array(4).fill(null); const playerField = this.getPlayerField(); const enemyField = this.getEnemyField(); ret.splice(0, playerField.length, ...playerField); ret.splice(2, enemyField.length, ...enemyField); - return activeOnly ? ret.filter((p) => p?.isActive()) : ret; + return activeOnly ? ret.filter(p => p?.isActive()) : ret; } /** @@ -1090,16 +971,13 @@ export default class BattleScene extends SceneBase { let targetingMovePhase: MovePhase; do { targetingMovePhase = this.findPhase( - (mp) => + mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === removedPokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer(), ) as MovePhase; - if ( - targetingMovePhase && - targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex() - ) { + if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); } } while (targetingMovePhase); @@ -1121,20 +999,13 @@ export default class BattleScene extends SceneBase { } // return the stored info toggles; used by ui-inputs - getInfoToggles(activeOnly: boolean = false): InfoToggle[] { - return activeOnly - ? this.infoToggles.filter((t) => t?.isActive()) - : this.infoToggles; + getInfoToggles(activeOnly = false): InfoToggle[] { + return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; } getPokemonById(pokemonId: number): Pokemon | null { - const findInParty = (party: Pokemon[]) => - party.find((p) => p.id === pokemonId); - return ( - (findInParty(this.getPlayerParty()) || - findInParty(this.getEnemyParty())) ?? - null - ); + const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); + return (findInParty(this.getPlayerParty()) || findInParty(this.getEnemyParty())) ?? null; } addPlayerPokemon( @@ -1173,8 +1044,8 @@ export default class BattleScene extends SceneBase { species: PokemonSpecies, level: number, trainerSlot: TrainerSlot, - boss: boolean = false, - shinyLock: boolean = false, + boss = false, + shinyLock = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void, ): EnemyPokemon { @@ -1184,22 +1055,10 @@ export default class BattleScene extends SceneBase { if (Overrides.OPP_SPECIES_OVERRIDE) { species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); // The fact that a Pokemon is a boss or not can change based on its Species and level - boss = - this.getEncounterBossSegments( - this.currentBattle.waveIndex, - level, - species, - ) > 1; + boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1; } - const pokemon = new EnemyPokemon( - species, - level, - trainerSlot, - boss, - shinyLock, - dataSource, - ); + const pokemon = new EnemyPokemon(species, level, trainerSlot, boss, shinyLock, dataSource); if (Overrides.OPP_FUSION_OVERRIDE) { pokemon.generateFusionSpecies(); } @@ -1237,10 +1096,7 @@ export default class BattleScene extends SceneBase { * @param pokemon * @param destroy Default true. If true, will destroy the {@linkcode PlayerPokemon} after removing */ - removePokemonFromPlayerParty( - pokemon: PlayerPokemon, - destroy: boolean = true, - ) { + removePokemonFromPlayerParty(pokemon: PlayerPokemon, destroy = true) { if (!pokemon) { return; } @@ -1258,9 +1114,9 @@ export default class BattleScene extends SceneBase { pokemon: Pokemon, x: number, y: number, - originX: number = 0.5, - originY: number = 0.5, - ignoreOverride: boolean = false, + originX = 0.5, + originY = 0.5, + ignoreOverride = false, ): Phaser.GameObjects.Container { const container = this.add.container(x, y); container.setName(`${pokemon.name}-icon`); @@ -1270,9 +1126,7 @@ export default class BattleScene extends SceneBase { icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist if (icon.frame.name !== pokemon.getIconId(true)) { - console.log( - `${pokemon.name}'s variant icon does not exist. Replacing with default.`, - ); + console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`); const temp = pokemon.shiny; pokemon.shiny = false; icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride)); @@ -1284,11 +1138,7 @@ export default class BattleScene extends SceneBase { container.add(icon); if (pokemon.isFusion()) { - const fusionIcon = this.add.sprite( - 0, - 0, - pokemon.getFusionIconAtlasKey(ignoreOverride), - ); + const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1297,11 +1147,9 @@ export default class BattleScene extends SceneBase { const originalHeight = icon.height; const originalFrame = icon.frame; - const iconHeight = ( - icon.frame.cutHeight <= fusionIcon.frame.cutHeight - ? Math.ceil - : Math.floor - )((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); + const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)( + (icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4, + ); // Inefficient, but for some reason didn't work with only the unique properties as part of the name const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; @@ -1324,8 +1172,7 @@ export default class BattleScene extends SceneBase { const originalFusionFrame = fusionIcon.frame; const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight; - const fusionIconHeight = - fusionIcon.frame.cutHeight - icon.frame.cutHeight; + const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight; // Inefficient, but for some reason didn't work with only the unique properties as part of the name const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; @@ -1382,15 +1229,11 @@ export default class BattleScene extends SceneBase { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randBattleSeedInt(range: number, min: number = 0): number { + randBattleSeedInt(range: number, min = 0): number { return this.currentBattle?.randSeedInt(range, min); } - reset( - clearScene: boolean = false, - clearData: boolean = false, - reloadI18n: boolean = false, - ): void { + reset(clearScene = false, clearData = false, reloadI18n = false): void { if (clearData) { this.gameData = new GameData(); } @@ -1406,8 +1249,8 @@ export default class BattleScene extends SceneBase { this.pokeballCounts = Object.fromEntries( Utils.getEnumValues(PokeballType) - .filter((p) => p <= PokeballType.MASTER_BALL) - .map((t) => [ t, 0 ]), + .filter(p => p <= PokeballType.MASTER_BALL) + .map(t => [t, 0]), ); this.pokeballCounts[PokeballType.POKEBALL] += 5; if (Overrides.POKEBALL_OVERRIDE.active) { @@ -1429,10 +1272,7 @@ export default class BattleScene extends SceneBase { // If this is a ME, clear any residual visual sprites before reloading if (this.currentBattle?.mysteryEncounter?.introVisuals) { - this.field.remove( - this.currentBattle.mysteryEncounter?.introVisuals, - true, - ); + this.field.remove(this.currentBattle.mysteryEncounter?.introVisuals, true); } //@ts-ignore - allowing `null` for currentBattle causes a lot of trouble @@ -1453,7 +1293,7 @@ export default class BattleScene extends SceneBase { this.updateScoreText(); this.scoreText.setVisible(false); - [ this.luckLabelText, this.luckText ].map((t) => t.setVisible(false)); + [this.luckLabelText, this.luckText].map(t => t.setVisible(false)); this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); @@ -1462,16 +1302,13 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition.setPosition(0, 0); this.arenaPlayer.setPosition(300, 0); this.arenaPlayerTransition.setPosition(0, 0); - [ this.arenaEnemy, this.arenaNextEnemy ].forEach((a) => - a.setPosition(-280, 0), - ); + this.arenaEnemy.setPosition(-280, 0); + this.arenaNextEnemy.setPosition(-280, 0); this.arenaNextEnemy.setVisible(false); this.arena.init(); - this.trainer.setTexture( - `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, - ); + this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); this.trainer.setPosition(406, 186); this.trainer.setVisible(true); @@ -1485,15 +1322,14 @@ export default class BattleScene extends SceneBase { ...allMoves, ...allAbilities, ...Utils.getEnumValues(ModifierPoolType) - .map((mpt) => getModifierPoolForType(mpt)) - .map((mp) => + .map(mpt => getModifierPoolForType(mpt)) + .flatMap(mp => Object.values(mp) .flat() - .map((mt) => mt.modifierType) - .filter((mt) => "localize" in mt) - .map((lpb) => lpb as unknown as Localizable), - ) - .flat(), + .map(mt => mt.modifierType) + .filter(mt => "localize" in mt) + .map(lpb => lpb as unknown as Localizable), + ), ]; for (const item of localizable) { item.localize(); @@ -1506,7 +1342,7 @@ export default class BattleScene extends SceneBase { this.fadeOutBgm(250, false); this.tweens.add({ - targets: [ this.uiContainer ], + targets: [this.uiContainer], alpha: 0, duration: 250, ease: "Sine.easeInOut", @@ -1525,13 +1361,11 @@ export default class BattleScene extends SceneBase { } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.NumberHolder( - newWaveIndex % 10 === 0 ? 32 : 8, - ); + const doubleChance = new Utils.NumberHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach((p) => - applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance), - ); + for (const p of playerField) { + applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance); + } return Math.max(doubleChance.value, 1); } @@ -1543,8 +1377,7 @@ export default class BattleScene extends SceneBase { mysteryEncounterType?: MysteryEncounterType, ): Battle | null { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; - const newWaveIndex = - waveIndex || (this.currentBattle?.waveIndex || _startingWave - 1) + 1; + const newWaveIndex = waveIndex || (this.currentBattle?.waveIndex || _startingWave - 1) + 1; let newDouble: boolean | undefined; let newBattleType: BattleType; let newTrainer: Trainer | undefined; @@ -1555,10 +1388,7 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); - if ( - this.gameMode.isFixedBattle(newWaveIndex) && - trainerData === undefined - ) { + if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; newBattleType = battleConfig.battleType; @@ -1573,9 +1403,7 @@ export default class BattleScene extends SceneBase { if (!this.gameMode.hasTrainers) { newBattleType = BattleType.WILD; } else if (battleType === undefined) { - newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) - ? BattleType.TRAINER - : BattleType.WILD; + newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; } else { newBattleType = battleType; } @@ -1586,13 +1414,11 @@ export default class BattleScene extends SceneBase { if (trainerConfigs[trainerType].doubleOnly) { doubleTrainer = true; } else if (trainerConfigs[trainerType].hasDouble) { - doubleTrainer = !Utils.randSeedInt( - this.getDoubleBattleChance(newWaveIndex, playerField), - ); + doubleTrainer = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance if ( trainerConfigs[trainerType].trainerTypeDouble && - ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType) + ![TrainerType.TATE, TrainerType.LIZA].includes(trainerType) ) { doubleTrainer = false; } @@ -1602,34 +1428,22 @@ export default class BattleScene extends SceneBase { : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; - newTrainer = - trainerData !== undefined - ? trainerData.toTrainer() - : new Trainer(trainerType, variant); + newTrainer = trainerData !== undefined ? trainerData.toTrainer() : new Trainer(trainerType, variant); this.field.add(newTrainer); } // Check for mystery encounter // Can only occur in place of a standard (non-boss) wild battle, waves 10-180 - if ( - this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || - newBattleType === BattleType.MYSTERY_ENCOUNTER - ) { + if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { newBattleType = BattleType.MYSTERY_ENCOUNTER; // Reset to base spawn weight - this.mysteryEncounterSaveData.encounterSpawnChance = - BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; + this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; } } if (double === undefined && newWaveIndex > 1) { - if ( - newBattleType === BattleType.WILD && - !this.gameMode.isWaveFinal(newWaveIndex) - ) { - newDouble = !Utils.randSeedInt( - this.getDoubleBattleChance(newWaveIndex, playerField), - ); + if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { + newDouble = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); } else if (newBattleType === BattleType.TRAINER) { newDouble = newTrainer?.variant === TrainerVariant.DOUBLE; } @@ -1667,10 +1481,7 @@ export default class BattleScene extends SceneBase { * Override battles into single only if not fighting with trainers. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 | GitHub Issue #1948} */ - if ( - newBattleType !== BattleType.TRAINER && - doubleOverrideForWave === "single" - ) { + if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") { newDouble = false; } } @@ -1688,21 +1499,15 @@ export default class BattleScene extends SceneBase { } if (lastBattle?.double && !newDouble) { - this.tryRemovePhase((p) => p instanceof SwitchPhase); - this.getPlayerField().forEach((p) => - p.lapseTag(BattlerTagType.COMMANDED), - ); + this.tryRemovePhase(p => p instanceof SwitchPhase); + for (const p of this.getPlayerField()) { + p.lapseTag(BattlerTagType.COMMANDED); + } } this.executeWithSeedOffset( () => { - this.currentBattle = new Battle( - this.gameMode, - newWaveIndex, - newBattleType, - newTrainer, - newDouble, - ); + this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); }, newWaveIndex << 3, this.waveSeed, @@ -1718,23 +1523,18 @@ export default class BattleScene extends SceneBase { if (!waveIndex && lastBattle) { const isWaveIndexMultipleOfTen = !(lastBattle.waveIndex % 10); - const isEndlessOrDaily = - this.gameMode.hasShortBiomes || this.gameMode.isDaily; - const isEndlessFifthWave = - this.gameMode.hasShortBiomes && lastBattle.waveIndex % 5 === 0; - const isWaveIndexMultipleOfFiftyMinusOne = - lastBattle.waveIndex % 50 === 49; + const isEndlessOrDaily = this.gameMode.hasShortBiomes || this.gameMode.isDaily; + const isEndlessFifthWave = this.gameMode.hasShortBiomes && lastBattle.waveIndex % 5 === 0; + const isWaveIndexMultipleOfFiftyMinusOne = lastBattle.waveIndex % 50 === 49; const isNewBiome = - isWaveIndexMultipleOfTen || - isEndlessFifthWave || - (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); + isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); const resetArenaState = isNewBiome || - [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes( - this.currentBattle.battleType, - ) || + [BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; - this.getEnemyParty().forEach((enemyPokemon) => enemyPokemon.destroy()); + for (const enemyPokemon of this.getEnemyParty()) { + enemyPokemon.destroy(); + } this.trySpreadPokerus(); if (!isNewBiome && newWaveIndex % 10 === 5) { this.arena.updatePoolsForTimeOfDay(); @@ -1742,9 +1542,9 @@ export default class BattleScene extends SceneBase { if (resetArenaState) { this.arena.resetArenaEffects(); - playerField.forEach((pokemon) => - pokemon.lapseTag(BattlerTagType.COMMANDED), - ); + for (const pokemon of playerField) { + pokemon.lapseTag(BattlerTagType.COMMANDED); + } playerField.forEach((pokemon, p) => { if (pokemon.isOnField()) { @@ -1758,9 +1558,7 @@ export default class BattleScene extends SceneBase { applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); if ( pokemon.hasSpecies(Species.TERAPAGOS) || - (this.gameMode.isClassic && - this.currentBattle.waveIndex > 180 && - this.currentBattle.waveIndex <= 190) + (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190) ) { this.arena.playerTerasUsed = 0; } @@ -1772,10 +1570,7 @@ export default class BattleScene extends SceneBase { } for (const pokemon of this.getPlayerParty()) { - this.triggerPokemonFormChange( - pokemon, - SpeciesFormChangeTimeOfDayTrigger, - ); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); } if (!this.gameMode.hasRandomBiomes && !isNewBiome) { @@ -1806,18 +1601,14 @@ export default class BattleScene extends SceneBase { } updateFieldScale(): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { const fieldScale = Math.floor( Math.pow( 1 / this.getField(true) - .map((p) => p.getSpriteScale()) - .reduce( - (highestScale: number, scale: number) => - (highestScale = Math.max(scale, highestScale)), - 0, - ), + .map(p => p.getSpriteScale()) + .reduce((highestScale: number, scale: number) => (highestScale = Math.max(scale, highestScale)), 0), 0.7, ) * 40, ) / 40; @@ -1825,8 +1616,8 @@ export default class BattleScene extends SceneBase { }); } - setFieldScale(scale: number, instant: boolean = false): Promise { - return new Promise((resolve) => { + setFieldScale(scale: number, instant = false): Promise { + return new Promise(resolve => { scale *= 6; if (this.field.scale === scale) { return resolve(); @@ -1842,32 +1633,27 @@ export default class BattleScene extends SceneBase { scale: scale, x: (defaultWidth - scaledWidth) / 2, y: defaultHeight - scaledHeight, - duration: !instant - ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) - : 0, + duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, ease: "Sine.easeInOut", onComplete: () => resolve(), }); }); } - getSpeciesFormIndex( - species: PokemonSpecies, - gender?: Gender, - nature?: Nature, - ignoreArena?: boolean, - ): number { + getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): number { if (!species.forms?.length) { return 0; } - const isEggPhase: boolean = [ "EggLapsePhase", "EggHatchPhase" ].includes( + const isEggPhase: boolean = ["EggLapsePhase", "EggHatchPhase"].includes( this.getCurrentPhase()?.constructor.name ?? "", ); - if ( // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. + if ( + // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. !isEggPhase && - this.currentBattle?.battleType === BattleType.TRAINER && !isNullOrUndefined(this.currentBattle.trainer) && + this.currentBattle?.battleType === BattleType.TRAINER && + !isNullOrUndefined(this.currentBattle.trainer) && this.currentBattle.trainer.config.hasSpecialtyType() ) { if (species.speciesId === Species.WORMADAM) { @@ -1879,7 +1665,8 @@ export default class BattleScene extends SceneBase { case PokemonType.GRASS: return 0; // Plant Cloak } - } else if (species.speciesId === Species.ROTOM) { + } + if (species.speciesId === Species.ROTOM) { switch (this.currentBattle.trainer.config.specialtyType) { case PokemonType.FLYING: return 4; // Fan Rotom @@ -1894,7 +1681,8 @@ export default class BattleScene extends SceneBase { case PokemonType.ICE: return 3; // Frost Rotom } - } else if (species.speciesId === Species.ORICORIO) { + } + if (species.speciesId === Species.ORICORIO) { switch (this.currentBattle.trainer.config.specialtyType) { case PokemonType.GHOST: return 3; // Sensu Style @@ -1905,14 +1693,17 @@ export default class BattleScene extends SceneBase { case PokemonType.PSYCHIC: return 2; // Pa'u Style } - } else if (species.speciesId === Species.PALDEA_TAUROS) { + } + if (species.speciesId === Species.PALDEA_TAUROS) { switch (this.currentBattle.trainer.config.specialtyType) { case PokemonType.FIRE: return 1; // Blaze Breed case PokemonType.WATER: return 2; // Aqua Breed } - } else if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { // Would probably never happen, but might as well + } + if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { + // Would probably never happen, but might as well return this.currentBattle.trainer.config.specialtyType; } } @@ -1941,10 +1732,7 @@ export default class BattleScene extends SceneBase { case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); case Species.PIKACHU: - if ( - this.currentBattle?.battleType === BattleType.TRAINER && - this.currentBattle?.waveIndex < 30 - ) { + if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) { return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30 } return Utils.randSeedInt(8); @@ -1960,10 +1748,7 @@ export default class BattleScene extends SceneBase { case Species.FROAKIE: case Species.FROGADIER: case Species.GRENINJA: - if ( - this.currentBattle?.battleType === BattleType.TRAINER && - !isEggPhase - ) { + if (this.currentBattle?.battleType === BattleType.TRAINER && !isEggPhase) { return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier } return Utils.randSeedInt(2); @@ -1980,7 +1765,7 @@ export default class BattleScene extends SceneBase { case Species.BASCULEGION: case Species.OINKOLOGNE: return gender === Gender.FEMALE ? 1 : 0; - case Species.TOXTRICITY: + case Species.TOXTRICITY: { const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, @@ -1999,13 +1784,13 @@ export default class BattleScene extends SceneBase { return 1; } return 0; + } case Species.GIMMIGHOUL: // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs if (this.gameMode.hasMysteryEncounters && !isEggPhase) { return 1; // Wandering form - } else { - return Utils.randSeedInt(species.forms.length); } + return Utils.randSeedInt(species.forms.length); } if (ignoreArena) { @@ -2046,15 +1831,11 @@ export default class BattleScene extends SceneBase { return ret; } - getEncounterBossSegments( - waveIndex: number, - level: number, - species?: PokemonSpecies, - forceBoss: boolean = false, - ): number { + getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss = false): number { if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) { return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE; - } else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { + } + if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { // The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss return 0; } @@ -2064,26 +1845,21 @@ export default class BattleScene extends SceneBase { } let isBoss: boolean | undefined; - if ( - forceBoss || - (species && - (species.subLegendary || species.legendary || species.mythical)) - ) { + if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) { isBoss = true; } else { this.executeWithSeedOffset(() => { isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && - Utils.randSeedInt(100) < - Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); + Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); }, waveIndex << 2); } if (!isBoss) { return 0; } - let ret: number = 2; + let ret = 2; if (level >= 100) { ret++; @@ -2130,12 +1906,13 @@ export default class BattleScene extends SceneBase { resetSeed(waveIndex?: number): void { const wave = waveIndex || this.currentBattle?.waveIndex || 0; this.waveSeed = Utils.shiftCharCodes(this.seed, wave); - Phaser.Math.RND.sow([ this.waveSeed ]); + Phaser.Math.RND.sow([this.waveSeed]); console.log("Wave Seed:", this.waveSeed, wave); this.rngCounter = 0; } executeWithSeedOffset( + // biome-ignore lint/complexity/noBannedTypes: Refactor to not use Function func: Function, offset: number, seedOverride?: string, @@ -2147,9 +1924,7 @@ export default class BattleScene extends SceneBase { const tempRngOffset = this.rngOffset; const tempRngSeedOverride = this.rngSeedOverride; const state = Phaser.Math.RND.state(); - Phaser.Math.RND.sow([ - Utils.shiftCharCodes(seedOverride || this.seed, offset), - ]); + Phaser.Math.RND.sow([Utils.shiftCharCodes(seedOverride || this.seed, offset)]); this.rngCounter = 0; this.rngOffset = offset; this.rngSeedOverride = seedOverride || ""; @@ -2165,7 +1940,7 @@ export default class BattleScene extends SceneBase { y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, - terrainColorRatio: number = 0, + terrainColorRatio = 0, ): Phaser.GameObjects.Sprite { const ret = this.add.sprite(x, y, texture, frame); ret.setPipeline(this.fieldSpritePipeline); @@ -2182,8 +1957,8 @@ export default class BattleScene extends SceneBase { y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, - hasShadow: boolean = false, - ignoreOverride: boolean = false, + hasShadow = false, + ignoreOverride = false, ): Phaser.GameObjects.Sprite { const ret = this.addFieldSprite(x, y, texture, frame); this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); @@ -2193,11 +1968,11 @@ export default class BattleScene extends SceneBase { initPokemonSprite( sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, - hasShadow: boolean = false, - ignoreOverride: boolean = false, + hasShadow = false, + ignoreOverride = false, ): Phaser.GameObjects.Sprite { sprite.setPipeline(this.spritePipeline, { - tone: [ 0.0, 0.0, 0.0, 0.0 ], + tone: [0.0, 0.0, 0.0, 0.0], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, @@ -2215,7 +1990,7 @@ export default class BattleScene extends SceneBase { } showFieldOverlay(duration: number): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0.5, @@ -2227,7 +2002,7 @@ export default class BattleScene extends SceneBase { } hideFieldOverlay(duration: number): Promise { - return new Promise((resolve) => { + return new Promise(resolve => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0, @@ -2248,7 +2023,7 @@ export default class BattleScene extends SceneBase { showShopOverlay(duration: number): Promise { this.shopOverlayShown = true; - return new Promise((resolve) => { + return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, alpha: this.shopOverlayOpacity, @@ -2261,7 +2036,7 @@ export default class BattleScene extends SceneBase { hideShopOverlay(duration: number): Promise { this.shopOverlayShown = false; - return new Promise((resolve) => { + return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, alpha: 0, @@ -2284,22 +2059,18 @@ export default class BattleScene extends SceneBase { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); - this.biomeWaveText.setText( - biomeString + " - " + this.currentBattle.waveIndex.toString(), - ); + this.biomeWaveText.setText(biomeString + " - " + this.currentBattle.waveIndex.toString()); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); this.biomeWaveText.setVisible(true); } - updateMoneyText(forceVisible: boolean = true): void { + updateMoneyText(forceVisible = true): void { if (this.money === undefined) { return; } const formattedMoney = Utils.formatMoney(this.moneyFormat, this.money); - this.moneyText.setText( - i18next.t("battleScene:moneyOwned", { formattedMoney }), - ); + this.moneyText.setText(i18next.t("battleScene:moneyOwned", { formattedMoney })); this.fieldUI.moveAbove(this.moneyText, this.luckText); if (forceVisible) { this.moneyText.setVisible(true); @@ -2318,8 +2089,7 @@ export default class BattleScene extends SceneBase { scale: this.moneyText.scale + deltaScale, loop: 0, yoyo: true, - onComplete: (_) => - this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), + onComplete: _ => this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), }); } @@ -2333,8 +2103,10 @@ export default class BattleScene extends SceneBase { * @param duration The time for this label to fade in, if it is not already visible. */ updateAndShowText(duration: number): void { - const labels = [ this.luckLabelText, this.luckText ]; - labels.forEach((t) => t.setAlpha(0)); + const labels = [this.luckLabelText, this.luckText]; + for (const label of labels) { + label.setAlpha(0); + } const luckValue = getPartyLuckValue(this.getPlayerParty()); this.luckText.setText(getLuckString(luckValue)); if (luckValue < 14) { @@ -2342,15 +2114,15 @@ export default 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.game.canvas.width / 6 - 2 - (this.luckText.displayWidth + 2)); this.tweens.add({ targets: labels, duration: duration, alpha: 1, onComplete: () => { - labels.forEach((t) => t.setVisible(true)); + for (const label of labels) { + label.setVisible(true); + } }, }); } @@ -2359,23 +2131,22 @@ export default class BattleScene extends SceneBase { if (this.reroll) { return; } - const labels = [ this.luckLabelText, this.luckText ]; + const labels = [this.luckLabelText, this.luckText]; this.tweens.add({ targets: labels, duration: duration, alpha: 0, onComplete: () => { - labels.forEach((l) => l.setVisible(false)); + for (const label of labels) { + label.setVisible(false); + } }, }); } updateUIPositions(): void { - const enemyModifierCount = this.enemyModifiers.filter((m) => - m.isIconVisible(), - ).length; - const biomeWaveTextHeight = - this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; + 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) + (enemyModifierCount ? (enemyModifierCount <= 12 ? 15 : 24) : 0) + @@ -2383,11 +2154,10 @@ export default class BattleScene extends SceneBase { ); this.moneyText.setY(this.biomeWaveText.y + 10); this.scoreText.setY(this.moneyText.y + 10); - [ this.luckLabelText, this.luckText ].map((l) => + [this.luckLabelText, this.luckText].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10), ); - const offsetY = - (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; + 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); @@ -2406,16 +2176,9 @@ export default class BattleScene extends SceneBase { let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * - ((enemy.ivs.reduce((iv: number, total: number) => (total += iv), 0) / - 93) * - 0.2 + - 0.8); - this.findModifiers( - (m) => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, - false, - ).map( - (m) => - (scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()), + ((enemy.ivs.reduce((iv: number, total: number) => (total += iv), 0) / 93) * 0.2 + 0.8); + this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map( + m => (scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()), ); if (enemy.isBoss()) { scoreIncrease *= Math.sqrt(enemy.bossSegments); @@ -2423,17 +2186,16 @@ export default class BattleScene extends SceneBase { this.currentBattle.battleScore += Math.ceil(scoreIncrease); } - getMaxExpLevel(ignoreLevelCap: boolean = false): number { + getMaxExpLevel(ignoreLevelCap = false): number { if (Overrides.LEVEL_CAP_OVERRIDE > 0) { return Overrides.LEVEL_CAP_OVERRIDE; - } else if (ignoreLevelCap || Overrides.LEVEL_CAP_OVERRIDE < 0) { + } + if (ignoreLevelCap || Overrides.LEVEL_CAP_OVERRIDE < 0) { return Number.MAX_SAFE_INTEGER; } const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(waveIndex); - const baseLevel = - (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * - 1.2; + const baseLevel = (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * 1.2; return Math.ceil(baseLevel / 2) * 2 + 2; } @@ -2445,54 +2207,39 @@ export default class BattleScene extends SceneBase { filterAllEvolutions?: boolean, ): PokemonSpecies { if (fromArenaPool) { - return this.arena.randomSpecies( - waveIndex, - level, - undefined, - getPartyLuckValue(this.party), - ); + return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party)); } const filteredSpecies = speciesFilter ? [ - ...new Set( - allSpecies - .filter((s) => s.isCatchable()) - .filter(speciesFilter) - .map((s) => { - if (!filterAllEvolutions) { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + ...new Set( + allSpecies + .filter(s => s.isCatchable()) + .filter(speciesFilter) + .map(s => { + if (!filterAllEvolutions) { + while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { + s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + } } - } - return s; - }), - ), - ] - : allSpecies.filter((s) => s.isCatchable()); + return s; + }), + ), + ] + : allSpecies.filter(s => s.isCatchable()); return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; } generateRandomBiome(waveIndex: number): Biome { const relWave = waveIndex % 250; - const biomes = Utils.getEnumValues(Biome).filter( - (b) => b !== Biome.TOWN && b !== Biome.END, - ); + const biomes = Utils.getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END); const maxDepth = biomeDepths[Biome.END][0] - 2; const depthWeights = new Array(maxDepth + 1) .fill(null) - .map( - (_, i: number) => - ((1 - - Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / - 0.75) * - 250, - ); + .map((_, i: number) => ((1 - Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / 0.75) * 250); const biomeThresholds: number[] = []; let totalWeight = 0; for (const biome of biomes) { - totalWeight += Math.ceil( - depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1], - ); + totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); biomeThresholds.push(totalWeight); } @@ -2508,7 +2255,7 @@ export default class BattleScene extends SceneBase { } isBgmPlaying(): boolean { - return this.bgm && this.bgm.isPlaying; + return this.bgm?.isPlaying ?? false; } playBgm(bgmName?: string, fadeOut?: boolean): void { @@ -2529,10 +2276,7 @@ export default class BattleScene extends SceneBase { this.bgmCache.add(bgmName); this.loadBgm(bgmName); let loopPoint = 0; - loopPoint = - bgmName === this.arena.bgm - ? this.arena.getBgmLoopPoint() - : this.getBgmLoopPoint(bgmName); + loopPoint = bgmName === this.arena.bgm ? this.arena.getBgmLoopPoint() : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { this.ui.bgmBar.setBgmToBgmBar(bgmName); @@ -2613,13 +2357,11 @@ export default class BattleScene extends SceneBase { } } - fadeOutBgm(duration: number = 500, destroy: boolean = true): boolean { + fadeOutBgm(duration = 500, destroy = true): boolean { if (!this.bgm) { return false; } - const bgm = this.sound - .getAllPlaying() - .find((bgm) => bgm.key === this.bgm.key); + const bgm = this.sound.getAllPlaying().find(bgm => bgm.key === this.bgm.key); if (bgm) { SoundFade.fadeOut(this, this.bgm, duration, destroy); return true; @@ -2634,11 +2376,7 @@ export default class BattleScene extends SceneBase { * @param destroy * @param delay */ - fadeAndSwitchBgm( - newBgmKey: string, - destroy: boolean = false, - delay: number = 2000, - ) { + fadeAndSwitchBgm(newBgmKey: string, destroy = false, delay = 2000) { this.fadeOutBgm(delay, destroy); this.time.delayedCall(delay, () => { this.playBgm(newBgmKey); @@ -2695,13 +2433,10 @@ export default class BattleScene extends SceneBase { this.bgmResumeTimer.destroy(); } if (resumeBgm) { - this.bgmResumeTimer = this.time.delayedCall( - pauseDuration || Utils.fixedInt(sound.totalDuration * 1000), - () => { - this.resumeBgm(); - this.bgmResumeTimer = null; - }, - ); + this.bgmResumeTimer = this.time.delayedCall(pauseDuration || Utils.fixedInt(sound.totalDuration * 1000), () => { + this.resumeBgm(); + this.bgmResumeTimer = null; + }); } return sound; } @@ -2952,7 +2687,7 @@ export default class BattleScene extends SceneBase { * */ pushConditionalPhase(phase: Phase, condition: () => boolean): void { - this.conditionalQueue.push([ condition, phase ]); + this.conditionalQueue.push([condition, phase]); } /** @@ -2960,7 +2695,7 @@ export default class BattleScene extends SceneBase { * @param phase {@linkcode Phase} the phase to add * @param defer boolean on which queue to add to, defaults to false, and adds to phaseQueue */ - pushPhase(phase: Phase, defer: boolean = false): void { + pushPhase(phase: Phase, defer = false): void { (!defer ? this.phaseQueue : this.nextCommandPhaseQueue).push(phase); } @@ -2972,11 +2707,7 @@ export default class BattleScene extends SceneBase { if (this.phaseQueuePrependSpliceIndex === -1) { this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice( - this.phaseQueuePrependSpliceIndex, - 0, - ...phases, - ); + this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); } } @@ -3049,10 +2780,7 @@ export default class BattleScene extends SceneBase { } if (this.currentPhase) { - console.log( - `%cStart Phase ${this.currentPhase.constructor.name}`, - "color:green;", - ); + console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;"); this.currentPhase.start(); } } @@ -3076,16 +2804,11 @@ export default class BattleScene extends SceneBase { * @param phaseFilter filter function to use to find the wanted phase * @returns the found phase or undefined if none found */ - findPhase